summaryrefslogtreecommitdiff
path: root/src/ecs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ecs.cpp')
-rw-r--r--src/ecs.cpp149
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() {