ecs-test/ecs/entity_manager.odin

52 lines
1.7 KiB
Odin

#+private
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_init :: proc(entity_manager: ^EntityManager) {
queue.init(&entity_manager.available_entities)
for entity_id in 0..<ENTITY_MAX {
queue.push_back(&entity_manager.available_entities, cast(EntityID) entity_id)
}
}
entity_manager_create_entity :: proc(entity_manager: ^EntityManager) -> 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_delete :: proc(entity_manager: ^EntityManager) {
queue.destroy(&entity_manager.available_entities)
}