59 lines
1.7 KiB
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"
|
|
);
|
|
} |