Fix component pool entity removal

This commit is contained in:
Hugo Mårdbrink 2025-08-26 22:01:28 +02:00
parent 77c5c23cf5
commit 6d43f30c09
5 changed files with 48 additions and 18 deletions

View file

@ -5,6 +5,7 @@ import "core:log"
ComponentManager :: struct {
component_types: map[typeid]ComponentType,
component_pools: map[typeid]^ComponentPool(any),
destroy_procs: map[typeid]proc(pool: ^ComponentPool(any), entity_id: EntityID),
next_component_type: ComponentType,
}
@ -25,6 +26,15 @@ component_manager_register_component :: proc($T: typeid, component_manager: ^Com
component_pool := new(ComponentPool(T), context.allocator)
component_pool^ = component_pool_create(T)
component_manager.component_pools[T] = cast(^ComponentPool(any))component_pool
component_manager.destroy_procs[T] = proc(component_pool: ^ComponentPool(any), id: EntityID) {
typed_component_pool := cast(^ComponentPool(T))component_pool
if id in typed_component_pool.entity_to_index {
component_pool_remove_data(typed_component_pool, id)
}
}
component_manager.next_component_type += 1
}
@ -35,22 +45,22 @@ component_manager_get_component_type :: proc($T: typeid, component_manager: ^Com
component_manager_add_component :: proc($T: typeid, component_manager: ^ComponentManager, entity_id: EntityID, component: T) {
component_pool := cast(^ComponentPool(T))component_manager.component_pools[T]
component_pool_insert_data(T, component_pool, entity_id, component)
component_pool_insert_data(component_pool, entity_id, component)
}
component_manager_remove_component :: proc($T: typeid, component_manager: ^ComponentManager, entity_id: EntityID) {
component_pool := cast(^ComponentPool(T))component_manager.component_pools[T]
component_pool_remove_data(T, component_pool, entity_id)
component_pool_remove_data(component_pool, entity_id)
}
component_manager_get_component :: proc($T: typeid, component_manager: ^ComponentManager, entity_id: EntityID) -> ^T {
component_pool := cast(^ComponentPool(T))component_manager.component_pools[T]
return component_pool_get(T, component_pool, entity_id)
component_pool := cast(^ComponentPool(T)) component_manager.component_pools[T]
return component_pool_get(component_pool, entity_id)
}
component_manager_destroy_entity :: proc(component_manager: ^ComponentManager, entity_id: EntityID) {
for _, component_pool in component_manager.component_pools {
component_pool_destroy_entity(component_pool, entity_id)
for T, component_pool in component_manager.component_pools {
component_manager.destroy_procs[T](component_pool, entity_id)
}
}