54 lines
1.7 KiB
Odin
54 lines
1.7 KiB
Odin
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..<ENTITY_MAX {
|
|
queue.push_back(&entity_manager.available_entities, cast(EntityID)entity_id)
|
|
}
|
|
|
|
return entity_manager
|
|
}
|
|
|
|
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_destroy :: proc(entity_manager: ^EntityManager) {
|
|
queue.destroy(&entity_manager.available_entities)
|
|
}
|