You need to manually register components now, otherwise all components would be stored internally as 8 bytes instead of their actual size.

This commit is contained in:
2025-11-29 20:33:25 +01:00
parent 5da4917300
commit 4d92d64698

View File

@@ -37,7 +37,7 @@ Component_Storage :: struct {
}
Component_Registry :: map[typeid]Component_Storage
get_addr_of_component_for_entity_id_from_storage :: proc(storage: ^Component_Storage, entity_id: Entity_ID) -> rawptr {
@(private="file") get_addr_of_component_for_entity_id_from_storage :: proc(storage: ^Component_Storage, entity_id: Entity_ID) -> rawptr {
return rawptr(uintptr(storage.data) + uintptr((u32(entity_id) * storage.elem_size)))
}
@@ -68,31 +68,6 @@ create_world :: proc(name: string, max_entities: u32, systems: []System) -> (^Wo
world.component_registry = registry
// for c in components_to_register {
// log.infof("Registering component '%v' (size: %v).", c, size_of(c))
// if c in world.component_registry {
// log.warnf("Component '%v' already registered.", c)
// continue
// }
// // register_component(world, c)
// // id := typeid_of(type_of(c))
// // info: ^runtime.Type_Info
// // info = type_info_of(id)
// // fmt.printfln("Runtime info about component: %v", c)
// // world.component_registry[c] = Component_Storage {
// // data = make([]type_of(c), max_entities),
// // alive = make([]bool, max_entities)
// // }
// // for i in 0..<10 {
// // fmt.printfln("ADDR %v: %v", i, &world.component_registry[c].data[i])
// // }
// }
{ // Set up the world's queue of available entity-ids.
assert(u64(max_entities) <= u64(max(int)))
queue.init(&world.entity_id_queue, capacity = int(max_entities))
@@ -120,7 +95,7 @@ create_world :: proc(name: string, max_entities: u32, systems: []System) -> (^Wo
}
register_component :: proc(world: ^World, $A: typeid) -> bool {
log.infof("Registering component '%v' (size: %v).", typeid_of(A), size_of(A))
log.infof("Registering component '%v' (size: %v) in world '%v'.", typeid_of(A), size_of(A), world.name)
if A in world.component_registry {
log.warnf("Component '%v' already registered.", typeid_of(A))
return false
@@ -226,7 +201,7 @@ add_component :: proc(entity: Entity, world: ^World, component: $T, loc := #call
component_storage := &world.component_registry[T]
if component_storage == nil {
log.warnf("Failed to add component %v - component does not exist in the registry. Location: %v", typeid_of(T), loc)
log.warnf("Failed to add component %v - component does not exist in the world '%v's component-registry. Location: %v", typeid_of(T), world.name, loc)
return nil, false
}
@@ -251,7 +226,7 @@ has_component :: proc(t: typeid, entity: Entity, world: ^World, loc := #caller_l
component_storage := &world.component_registry[t]
if component_storage == nil {
log.warnf("Failed to get component %v - component does not exist in the registry. Location: %v", t, loc)
log.warnf("Failed to get component %v - component does not exist in the world '%v's component-registry. Location: %v", t, world.name, loc)
return false
}