Initial commit

This commit is contained in:
Hugo Mårdbrink 2025-08-23 23:54:00 +02:00
commit ac0d491786
21 changed files with 1094 additions and 0 deletions

65
ecs/system_manager.odin Normal file
View file

@ -0,0 +1,65 @@
package ecs
import "base:intrinsics"
import "core:log"
SystemBase :: struct {
entities: map[EntityID]struct{}, // Treat as set
}
SystemManager :: struct {
signatures: map[typeid]Signature,
systems: map[typeid]^SystemBase
}
system_manager_create :: proc() -> SystemManager {
system_manager := SystemManager{
signatures = make(map[typeid]Signature, context.allocator),
systems = make(map[typeid]^SystemBase, context.allocator),
}
return system_manager
}
system_manager_register_system :: proc($T: typeid, system_manager: ^SystemManager) -> ^T {
log.assertf(T not_in system_manager.systems, "Registering system more than once")
log.assertf(intrinsics.type_has_field(T, "entities"), "Registering non system type")
system := new(T, context.allocator)
system.entities = make(map[EntityID]struct{})
system_manager.systems[T] = system
return system
}
system_manager_set_signature :: proc($T: typeid, system_manager: ^SystemManager, signature: Signature) {
log.assertf(T in system_manager.systems, "System used before registered")
system_manager.signatures[T] = signature
}
system_manager_destroy_entity :: proc(system_manager: ^SystemManager, entity_id: EntityID) {
for _, system in system_manager.systems {
delete_key(&system.entities, entity_id)
}
}
system_manager_change_entity_signature :: proc(system_manager: ^SystemManager, entity_id: EntityID, entity_signature: Signature) {
for type, system in system_manager.systems {
system_signature := system_manager.signatures[type]
if (entity_signature & system_signature) == system_signature {
system.entities[entity_id] = {}
} else {
delete_key(&system.entities, entity_id)
}
}
}
system_manager_destroy :: proc(system_manager: ^SystemManager) {
for _, system in system_manager.systems {
delete(system.entities)
free(system)
}
delete(system_manager.systems)
delete(system_manager.signatures)
}