diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-08-28 14:04:12 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-08-28 14:04:12 -0400 |
| commit | f7bd0793424ed8e024520a941cc4cfcf4eb84de2 (patch) | |
| tree | 37519eced8f4f66973d88b822513c7841d29a9fe /src/ecs.cpp | |
| parent | 3583af4e1c7979e8d309693d53fbe9184e067a50 (diff) | |
pke: use new pk_iter_t from pk.h
Diffstat (limited to 'src/ecs.cpp')
| -rw-r--r-- | src/ecs.cpp | 149 |
1 files changed, 81 insertions, 68 deletions
diff --git a/src/ecs.cpp b/src/ecs.cpp index 839c68e..cdf125b 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -129,6 +129,8 @@ pk_bkt_arr *ECS_GetEntities() { void ECS_Tick_Early(double delta) { // these reserves might happen 1 tick early, but that's fine (void)delta; + bool b; + pk_iter_t<Entity_Base> iter_ent{}; pk_arr_clear(&EntitiesToBeRemoved); bool shouldRun = entitiesMarkedForRemoval.next > 0 || EntitiesToBeRemoved.next > 0 || entitiesYetToBeRemoved.next > 0; pk_arr_reserve(&entitiesYetToBeRemoved, entitiesMarkedForRemoval.reserved); @@ -151,26 +153,25 @@ void ECS_Tick_Early(double delta) { // That may or may not have implications about this logic. // Might need to do several passes? - type_bkt_arr_entities::FN_Iter iter_tmpln; - iter_tmpln.func = [](Entity_Base **ent_ptr) { - Entity_Base *ent = *ent_ptr; + b = pk_bkt_arr_iter_begin(&ecs.bc.entityPtrs, &iter_ent); + while (b == true) { Entity_Base *parentEnt = nullptr; - if (ent->parentHandle != EntityHandle_MAX) { - parentEnt = ecs.bc.entityPtrs[ent->parentHandle]; + if (iter_ent->parentHandle != EntityHandle_MAX) { + parentEnt = ecs.bc.entityPtrs[iter_ent->parentHandle]; } - if (ent->isMarkedForRemoval) { - pk_arr_append_t(&entitiesYetToBeRemoved, ent); - ent->handle = EntityHandle_MAX; - ent->parentHandle = EntityHandle_MAX; - ent->isMarkedForRemoval = false; - } else if (pk_arr_find_first_index(&EntitiesToBeRemoved, ent, ecs_pk_arr_find_first_matching_pointer) != uint32_t(-1)) { - ent->isMarkedForRemoval = true; + if (iter_ent->isMarkedForRemoval) { + pk_arr_append_t<Entity_Base*>(&entitiesYetToBeRemoved, iter_ent); + iter_ent->handle = EntityHandle_MAX; + iter_ent->parentHandle = EntityHandle_MAX; + iter_ent->isMarkedForRemoval = false; + } else if (pk_arr_find_first_index(&EntitiesToBeRemoved, iter_ent, ecs_pk_arr_find_first_matching_pointer) != uint32_t(-1)) { + iter_ent->isMarkedForRemoval = true; } else if (parentEnt != nullptr && pk_arr_find_first_index(&EntitiesToBeRemoved, parentEnt, ecs_pk_arr_find_first_matching_pointer) != uint32_t(-1)) { - ent->isMarkedForRemoval = true; - pk_arr_append_t(&EntitiesToBeRemoved, ent); + iter_ent->isMarkedForRemoval = true; + pk_arr_append_t<Entity_Base*>(&EntitiesToBeRemoved, iter_ent); } - }; - pk_bkt_arr_iterate(&ecs.bc.entityPtrs, type_bkt_arr_entities::FN_Iter::invoke, &iter_tmpln); + b = pk_bkt_arr_iter_increment(&ecs.bc.entityPtrs, &iter_ent); + } } struct updateGrBindsAfter { @@ -185,6 +186,10 @@ bool ecs_pk_arr_find_by_gr_binds_handle(void *search_val, void *list_val) { return search_handle == list_ref.grBindsHandle; } void ECS_Tick(double delta) { + bool b; + pk_iter_t<CompInstance> iter_inst{}; + pk_iter_t<CompGrBinds> iter_grbinds{}; + pk_iter_t<pke_component_event> iter_comp_ev{}; int32_t physicsTickCount = Physics_Tick(delta); uint32_t entityRemovalCount = entitiesYetToBeRemoved.next; @@ -200,8 +205,9 @@ void ECS_Tick(double delta) { pk_arr_t<updateGrBindsAfter> updateGrBinds; updateGrBinds.bkt = pkeSettings.mem_bkt.game_transient; - inst_iter_cb.func = [entityRemovalCount, &updateGrBinds](CompInstance *arr_obj_data) { - CompInstance &inst = *arr_obj_data; + b = pk_bkt_arr_iter_begin(&ecs.bc.instances, &iter_inst); + while (b == true) { + CompInstance &inst = *iter_inst; auto activationState = inst.bt.rigidBody->getActivationState(); if (activationState == ISLAND_SLEEPING || activationState == DISABLE_SIMULATION || activationState == WANTS_DEACTIVATION) { // no-op @@ -235,7 +241,8 @@ void ECS_Tick(double delta) { pk_delete<btRigidBody>(inst.bt.rigidBody, MemBkt_Bullet); inst.bt.rigidBody = CAFE_BABE(btRigidBody); inst.bt.motionState = CAFE_BABE(btDefaultMotionState); - return; + b = pk_bkt_arr_iter_increment(&ecs.bc.instances, &iter_inst); + continue; } if (updateGrBinds.next > 0 && inst.instanceHandle != InstanceHandle_MAX) { uint32_t afterIndex = pk_arr_find_first_index(&updateGrBinds, &inst.grBindsHandle, ecs_pk_arr_find_by_gr_binds_handle); @@ -245,11 +252,12 @@ void ECS_Tick(double delta) { inst.isNeedingUpdated = true; } } - }; - pk_bkt_arr_iterate(&ecs.bc.instances, &InstIterFn::invoke, &inst_iter_cb); + b = pk_bkt_arr_iter_increment(&ecs.bc.instances, &iter_inst); + } - grbinds_iter_cb.func = [&updateGrBinds](CompGrBinds *arr_obj_data) { - CompGrBinds &grBinds = *arr_obj_data; + b = pk_bkt_arr_iter_begin(&ecs.bc.grBinds, &iter_grbinds); + while ((entityRemovalCount > 0 || updateGrBinds.next > 0) && b == true) { + CompGrBinds &grBinds = *iter_grbinds; uint32_t afterIndex = pk_arr_find_first_index(&updateGrBinds, &grBinds.grBindsHandle, ecs_pk_arr_find_by_gr_binds_handle); Entity_Base *ent = ecs.bc.entityPtrs[grBinds.entHandle]; if (pk_arr_find_first_index(&entitiesYetToBeRemoved, ent, ecs_pk_arr_find_first_matching_pointer) != uint32_t(-1)) { @@ -268,22 +276,18 @@ void ECS_Tick(double delta) { auto &after = updateGrBinds[afterIndex]; grBinds.instanceCounter -= after.count; } - }; - if (entityRemovalCount > 0 || updateGrBinds.next > 0) { - pk_bkt_arr_iterate(&ecs.bc.grBinds, &GrBindsIterFn::invoke, &grbinds_iter_cb); + b = pk_bkt_arr_iter_increment(&ecs.bc.grBinds, &iter_grbinds); } - comp_ev_mgr_iter_cb.func = [](pke_component_event *arr_obj_data) { - Entity_Base *ent = ecs.bc.entityPtrs[arr_obj_data->entity_handle]; + b = pk_bkt_arr_iter_begin(&ecs.bc.ev_mgrs, &iter_comp_ev); + while (entityRemovalCount > 0 && b == true) { + Entity_Base *ent = ecs.bc.entityPtrs[iter_comp_ev->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_event_handle); + pk_ev_destroy_mgr(iter_comp_ev->ev_mgr_id); + pk_bkt_arr_free_handle(&ecs.bc.ev_mgrs, iter_comp_ev->pke_event_handle); } - }; - if (entityRemovalCount > 0) { - pk_bkt_arr_iterate(&ecs.bc.ev_mgrs, &CompEvMgrIterFn::invoke, &comp_ev_mgr_iter_cb); + b = pk_bkt_arr_iter_increment(&ecs.bc.ev_mgrs, &iter_comp_ev); } - } struct InstanceBufferCopyChunk { @@ -298,6 +302,8 @@ struct InstanceBufferCopy { pk_arr_t<InstanceBufferCopyChunk> chunks; }; void ECS_Tick_Late(double delta) { + bool b; + pk_iter_t<CompInstance> iter_inst{}; // using a pointer here avoids calling the destructor when the object goes out of scope (void)delta; PKVK_TmpBufferDetails tmpBufferDetails{}; @@ -307,14 +313,21 @@ void ECS_Tick_Late(double delta) { using InstIterFn = pk_tmpln_1<void, CompInstance*, void*>; InstIterFn inst_iter_cb{}; - inst_iter_cb.func = [&bufferUpdates](CompInstance *arr_obj_data) { - CompInstance &inst = *arr_obj_data; - if (inst.isNeedingUpdated == false) - return; - if (inst.entHandle == EntityHandle_MAX) - return; - if (inst.grBindsHandle == GrBindsHandle_MAX) - return; + b = pk_bkt_arr_iter_begin(&ecs.bc.instances, &iter_inst); + while (b == true) { + CompInstance &inst = *iter_inst; + if (inst.isNeedingUpdated == false) { + b = pk_bkt_arr_iter_increment(&ecs.bc.instances, &iter_inst); + continue; + } + if (inst.entHandle == EntityHandle_MAX) { + b = pk_bkt_arr_iter_increment(&ecs.bc.instances, &iter_inst); + continue; + } + if (inst.grBindsHandle == GrBindsHandle_MAX) { + b = pk_bkt_arr_iter_increment(&ecs.bc.instances, &iter_inst); + continue; + } auto &grBinds = ecs.bc.grBinds[inst.grBindsHandle]; @@ -365,8 +378,8 @@ void ECS_Tick_Late(double delta) { pk_arr_append_t(&chunk->mats, glm::scale(glmMat_posRot, scale)); bfrUpdate->runningSize += sizeof(glm::mat4); inst.isNeedingUpdated = false; - }; - pk_bkt_arr_iterate(&ecs.bc.instances, &InstIterFn::invoke, &inst_iter_cb); + b = pk_bkt_arr_iter_increment(&ecs.bc.instances, &iter_inst); + } while (bufferUpdates.next > 0) { InstanceBufferCopy &ibc = bufferUpdates[bufferUpdates.next - 1]; @@ -469,21 +482,21 @@ CompGrBinds *ECS_GetGrBinds(GrBindsHandle grBindsHandle) { } void ECS_GetGrBinds(Entity_Base *entity, pk_arr_t<CompGrBinds *> &arr) { + bool b; + pk_iter_t<CompGrBinds> iter_grbinds{}; if (entity == nullptr) return; // 2025-05-29 JCB PERF // There's gotta be a better way to do this than looping ALL GrBinds... // Let's leave it until it shows up in performance tests. - using GrBindsIterFn = pk_tmpln_1<void, CompGrBinds *, void *>; - GrBindsIterFn gr_binds_iter_cb{}; - - gr_binds_iter_cb.func = [&entity, &arr](CompGrBinds *arr_obj_data) { - if (arr_obj_data->entHandle == entity->handle) { - pk_arr_append(&arr, &arr_obj_data); + b = pk_bkt_arr_iter_begin(&ecs.bc.grBinds, &iter_grbinds); + while (b == true) { + if (iter_grbinds->entHandle == entity->handle) { + pk_arr_append_t<CompGrBinds*>(&arr, iter_grbinds); } - }; - pk_bkt_arr_iterate(&ecs.bc.grBinds, &GrBindsIterFn::invoke, &gr_binds_iter_cb); + b = pk_bkt_arr_iter_increment(&ecs.bc.grBinds, &iter_grbinds); + } } pk_bkt_arr *ECS_GetGrBinds() { @@ -545,21 +558,21 @@ CompInstance *ECS_GetInstance(InstanceHandle instanceHandle ) { } void ECS_GetInstances(Entity_Base *entity, pk_arr_t<CompInstance *> &arr) { + bool b; + pk_iter_t<CompInstance> iter_inst{}; if (entity == nullptr) return; // 2025-05-29 JCB PERF // There's gotta be a better way to do this than looping ALL GrBinds... // Let's leave it until it shows up in performance tests. - using InstIterFn = pk_tmpln_1<void, CompInstance *, void *>; - InstIterFn inst_iter_cb{}; - - inst_iter_cb.func = [&entity, &arr](CompInstance *arr_obj_data) { - if (arr_obj_data->entHandle == entity->handle) { - pk_arr_append(&arr, &arr_obj_data); + b = pk_bkt_arr_iter_begin(&ecs.bc.instances, &iter_inst); + while (b == true) { + if (iter_inst->entHandle == entity->handle) { + pk_arr_append_t<CompInstance*>(&arr, iter_inst); } - }; - pk_bkt_arr_iterate(&ecs.bc.instances, &InstIterFn::invoke, &inst_iter_cb); + b = pk_bkt_arr_iter_increment(&ecs.bc.instances, &iter_inst); + } } void ECS_UpdateInstance(CompInstance *instance, const InstPos &instPos, bool overridePhysics) { @@ -609,21 +622,21 @@ pke_component_event *ECS_GetEv(PkeEventHandle handle) { } void ECS_GetEvs(Entity_Base *entity, pk_arr_t<pke_component_event *> &arr) { + bool b; + pk_iter_t<pke_component_event> iter_comp_ev{}; 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 *, void *>; - CompEvMgrIterFn inst_iter_cb{}; - - inst_iter_cb.func = [&entity, &arr](pke_component_event *arr_obj_data) { - if (arr_obj_data->entity_handle == entity->handle) { - pk_arr_append_t<pke_component_event*>(&arr, arr_obj_data); + b = pk_bkt_arr_iter_begin(&ecs.bc.ev_mgrs, &iter_comp_ev); + while(b == true) { + if (iter_comp_ev->entity_handle == entity->handle) { + pk_arr_append_t<pke_component_event*>(&arr, iter_comp_ev); } - }; - pk_bkt_arr_iterate(&ecs.bc.ev_mgrs, &CompEvMgrIterFn::invoke, &inst_iter_cb); + b = pk_bkt_arr_iter_increment(&ecs.bc.ev_mgrs, &iter_comp_ev); + } } pk_bkt_arr *ECS_GetEvs() { |
