/** * 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" ); }