package ecs import "core:log" import "core:container/queue" EntityManager :: struct { available_entities: queue.Queue(EntityID), signatures: [ENTITY_MAX]Signature, living_entity_count: u32, } entity_manager_create :: proc() -> EntityManager { entity_manager := EntityManager{living_entity_count = 0} queue.init(&entity_manager.available_entities) for entity_id in 0.. EntityID { log.assertf(entity_manager.living_entity_count < ENTITY_MAX, "Too many entities created") entity_id := queue.pop_front(&entity_manager.available_entities) entity_manager.living_entity_count += 1 return entity_id } entity_manager_destroy_entity :: proc(entity_manager: ^EntityManager, entity_id: EntityID) { log.assertf(entity_id < ENTITY_MAX, "Entity ID out of range") signature_clear(&entity_manager.signatures[entity_id]) queue.push_back(&entity_manager.available_entities, entity_id) entity_manager.living_entity_count -= 1 } entity_manager_set_signature :: proc(entity_manager: ^EntityManager, entity_id: EntityID, signature: Signature) { log.assertf(entity_id < ENTITY_MAX, "Entity ID out of range") entity_manager.signatures[entity_id] = signature } entity_manager_get_signature :: proc(entity_manager: ^EntityManager, entity_id: EntityID) -> Signature { log.assertf(entity_id < ENTITY_MAX, "Entity ID out of range") return entity_manager.signatures[entity_id] } entity_manager_destroy :: proc(entity_manager: ^EntityManager) { queue.destroy(&entity_manager.available_entities) }