diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-06-18 16:19:32 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-07-21 10:16:14 -0400 |
| commit | b5133e3ee3f75bdca0b4f5ade5e77f506cb4f0c1 (patch) | |
| tree | e0dcf3af58d7c06f906099b69bc44154714ba84e /src/ecs.cpp | |
| parent | 2ecda48bd1cc16b2e5e3e1ebb05098e191121aad (diff) | |
pke: chkpt: add pkev component
Diffstat (limited to 'src/ecs.cpp')
| -rw-r--r-- | src/ecs.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/ecs.cpp b/src/ecs.cpp index 5d409be..038a7f3 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -18,6 +18,7 @@ struct ECS { pk_bkt_arr_t<Entity_Base *> entityPtrs{}; pk_bkt_arr_t<CompGrBinds> grBinds{}; pk_bkt_arr_t<CompInstance> instances{}; + pk_bkt_arr_t<pke_component_event_manager> ev_mgrs{}; } bc; } ecs; @@ -62,6 +63,7 @@ void ECS_Init() { new (&ecs.bc.entityPtrs) pk_bkt_arr_t<Entity_Base*>{ pk_bkt_arr_handle_MAX_constexpr }; new (&ecs.bc.grBinds) pk_bkt_arr_t<CompGrBinds>{ pk_bkt_arr_handle_MAX_constexpr }; new (&ecs.bc.instances) pk_bkt_arr_t<CompInstance>{ pk_bkt_arr_handle_MAX_constexpr }; + new (&ecs.bc.ev_mgrs) pk_bkt_arr_t<pke_component_event_manager>{ pk_bkt_arr_handle_MAX_constexpr }; pk_arr_reserve(&entitiesMarkedForRemoval, 16); pk_arr_reserve(&EntitiesToBeRemoved, 16); pk_arr_reserve(&entitiesYetToBeRemoved, 16); @@ -181,8 +183,10 @@ void ECS_Tick(double delta) { using InstIterFn = pk_tmpln_1<void, CompInstance *, void *>; using GrBindsIterFn = pk_tmpln_1<void, CompGrBinds *, void *>; + using CompEvMgrIterFn = pk_tmpln_1<void, pke_component_event_manager *, void *>; InstIterFn inst_iter_cb{}; GrBindsIterFn grbinds_iter_cb{}; + CompEvMgrIterFn comp_ev_mgr_iter_cb{}; pk_arr_t<updateGrBindsAfter> updateGrBinds; updateGrBinds.bkt = pkeSettings.mem_bkt.game_transient; @@ -259,6 +263,18 @@ void ECS_Tick(double delta) { if (entityRemovalCount > 0 || updateGrBinds.next > 0) { pk_bkt_arr_iterate(&ecs.bc.grBinds, &GrBindsIterFn::invoke, &grbinds_iter_cb); } + + comp_ev_mgr_iter_cb.func = [](pke_component_event_manager *arr_obj_data) { + Entity_Base *ent = ecs.bc.entityPtrs[arr_obj_data->entity_handle]; + if (pk_arr_find_first_index(&entitiesYetToBeRemoved, ent, ecs_pk_arr_find_first_matching_pointer) != uint32_t(-1)) { + pk_ev_destroy_mgr(arr_obj_data->ev_mgr_id); + pk_bkt_arr_free_handle(&ecs.bc.ev_mgrs, arr_obj_data->pke_ev_mgr_handle); + } + }; + if (entityRemovalCount > 0) { + pk_bkt_arr_iterate(&ecs.bc.ev_mgrs, &CompEvMgrIterFn::invoke, &comp_ev_mgr_iter_cb); + } + } struct InstanceBufferCopyChunk { @@ -556,11 +572,61 @@ pk_bkt_arr *ECS_GetInstances() { return &ecs.bc.instances; } +pke_component_event_manager *ECS_CreateEvManager(Entity_Base *entity, pk_uuid uuid) { + assert(entity != nullptr && entity != CAFE_BABE(Entity_Base)); + + PkeEventMgrHandle ev_mgr_handle { pk_bkt_arr_new_handle(&ecs.bc.ev_mgrs) }; + auto *comp = &ecs.bc.ev_mgrs[ev_mgr_handle]; + new (comp) pke_component_event_manager{}; + comp->entity_handle = entity->handle; + comp->pke_ev_mgr_handle = ev_mgr_handle; + comp->uuid = uuid; + if (comp->uuid == pk_uuid_zed || comp->uuid == pk_uuid_max) { + comp->uuid = pk_uuid_new_v7(); + } + + comp->ev_mgr_id = pk_ev_create_mgr(); + + return comp; +} + +pke_component_event_manager *ECS_GetEvManager(PkeEventMgrHandle handle) { + if (handle == PkeEventMgrHandle_MAX) return nullptr; + + assert(pk_bkt_arr_handle_validate(&ecs.bc.ev_mgrs, handle) == PK_BKT_ARR_HANDLE_VALIDATION_VALID); + auto *ev_mgr = &ecs.bc.ev_mgrs[handle]; + + return ev_mgr; +} + +void ECS_GetEvManagers(Entity_Base *entity, pk_arr_t<pke_component_event_manager *> &arr) { + if (entity == nullptr) return; + + // 2025-05-29 JCB PERF + // There's gotta be a better way to do this than looping + // Let's leave it until it shows up in performance tests. + + using CompEvMgrIterFn = pk_tmpln_1<void, pke_component_event_manager *, void *>; + CompEvMgrIterFn inst_iter_cb{}; + + inst_iter_cb.func = [&entity, &arr](pke_component_event_manager *arr_obj_data) { + if (arr_obj_data->entity_handle == entity->handle) { + pk_arr_append_t<pke_component_event_manager*>(&arr, arr_obj_data); + } + }; + pk_bkt_arr_iterate(&ecs.bc.ev_mgrs, &CompEvMgrIterFn::invoke, &inst_iter_cb); +} + +pk_bkt_arr *ECS_GetEvManagers() { + return &ecs.bc.ev_mgrs; +} + void ECS_Teardown() { pk_arr_reset(&EntitiesWithExcessInstances); pk_arr_reset(&entitiesYetToBeRemoved); pk_arr_reset(&EntitiesToBeRemoved); pk_arr_reset(&entitiesMarkedForRemoval); + ecs.bc.ev_mgrs.~pk_bkt_arr_t<pke_component_event_manager>(); ecs.bc.instances.~pk_bkt_arr_t<CompInstance>(); ecs.bc.grBinds.~pk_bkt_arr_t<CompGrBinds>(); ecs.bc.entityPtrs.~pk_bkt_arr_t<Entity_Base*>(); |
