About to break scene tree.
This commit is contained in:
59
src/ecs/ecssystem.c
Normal file
59
src/ecs/ecssystem.c
Normal file
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
* 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"
|
||||
);
|
||||
}
|
Reference in New Issue
Block a user