Standardise and make ECS more robust
This commit is contained in:
parent
b9aaeb62c9
commit
2ba1022f79
13 changed files with 245 additions and 232 deletions
|
|
@ -1,10 +1,14 @@
|
|||
package ecs
|
||||
#+private
|
||||
package ecs
|
||||
|
||||
import "base:intrinsics"
|
||||
import "core:log"
|
||||
|
||||
@(private = "file")
|
||||
EntitySet :: map[EntityID]struct{}
|
||||
|
||||
SystemBase :: struct {
|
||||
entities: map[EntityID]struct{}, // Treat as set
|
||||
entities: EntitySet
|
||||
}
|
||||
|
||||
SystemManager :: struct {
|
||||
|
|
@ -12,29 +16,30 @@ SystemManager :: struct {
|
|||
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_base_init :: proc(system_base: ^SystemBase) {
|
||||
system_base.entities = make(EntitySet, context.allocator)
|
||||
}
|
||||
|
||||
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_manager_init :: proc(system_manager: ^SystemManager) {
|
||||
system_manager.signatures = make(map[typeid]Signature, context.allocator)
|
||||
system_manager.systems = make(map[typeid]^SystemBase, context.allocator)
|
||||
}
|
||||
|
||||
system := new(T, context.allocator)
|
||||
system.entities = make(map[EntityID]struct{})
|
||||
system_manager.systems[T] = system
|
||||
system_manager_register_system :: proc(system_manager: ^SystemManager, $System: typeid) -> ^System {
|
||||
log.assertf(System not_in system_manager.systems, "Registering system more than once")
|
||||
log.assertf(intrinsics.type_has_field(System, "entities"), "Registering non system type")
|
||||
|
||||
system := new(System, context.allocator)
|
||||
system_base_init(system)
|
||||
|
||||
system_manager.systems[System] = 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_set_signature :: proc(system_manager: ^SystemManager, $System: typeid, signature: Signature) {
|
||||
log.assertf(System in system_manager.systems, "System used before registered")
|
||||
system_manager.signatures[System] = signature
|
||||
}
|
||||
|
||||
system_manager_destroy_entity :: proc(system_manager: ^SystemManager, entity_id: EntityID) {
|
||||
|
|
@ -54,7 +59,7 @@ system_manager_change_entity_signature :: proc(system_manager: ^SystemManager, e
|
|||
}
|
||||
}
|
||||
|
||||
system_manager_destroy :: proc(system_manager: ^SystemManager) {
|
||||
system_manager_delete :: proc(system_manager: ^SystemManager) {
|
||||
for _, system in system_manager.systems {
|
||||
delete(system.entities)
|
||||
free(system)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue