Files
dusk/src/ecs/ecssystem.c

59 lines
1.7 KiB
C

/**
* Copyright (c) 2025 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "ecssystem.h"
#include "util/memory.h"
#include "assert/assert.h"
ecssystem_t ECS_SYSTEM;
void ecsSystemInit() {
memoryZero(&ECS_SYSTEM, sizeof(ecssystem_t));
// Fill ECS ids
for(uint32_t i = 0; i < ECS_ENTITY_COUNT_MAX; i++) {
ECS_SYSTEM.entities[i].id = i;
}
// Fill the available array.
for(uint32_t i = 0; i < ECS_ENTITY_COUNT_MAX; i++) {
ECS_SYSTEM.available[i] = &ECS_SYSTEM.entities[i];
}
ECS_SYSTEM.availableCount = ECS_ENTITY_COUNT_MAX;
// Reserve root entity
ECS_SYSTEM.root = ecsEntityAdd();
}
ecsid_t ecsEntityAdd() {
assertTrue(ECS_SYSTEM.availableCount > 0, "No available entities to create");
// Pop off the last available entity.
ecsentity_t *entity = ECS_SYSTEM.available[--ECS_SYSTEM.availableCount];
assertTrue((entity->flags & ECS_ENTITY_FLAG_USED) == 0, "Entity is used.");
assertTrue(entity->id >= 0, "Entity is invalid.");
assertTrue(entity->id < ECS_ENTITY_COUNT_MAX, "Entity ID out of bounds");
entity->flags |= ECS_ENTITY_FLAG_USED;
return entity->id;
}
void ecsEntityRemove(const ecsid_t id) {
assertTrue(id < ECS_ENTITY_COUNT_MAX, "Invalid entity ID");
ecsentity_t *entity = &ECS_SYSTEM.entities[id];
assertTrue(entity->id >= 0, "Entity is invalid.");
assertTrue((entity->flags & ECS_ENTITY_FLAG_USED) != 0, "Entity is not used.");
// Mark the entity as available.
ECS_SYSTEM.available[ECS_SYSTEM.availableCount++] = entity;
assertTrue(
ECS_SYSTEM.availableCount <= ECS_ENTITY_COUNT_MAX,
"Available count exceeded maximum limit"
);
}