summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-08-28 14:04:12 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-08-28 14:04:12 -0400
commitf7bd0793424ed8e024520a941cc4cfcf4eb84de2 (patch)
tree37519eced8f4f66973d88b822513c7841d29a9fe
parent3583af4e1c7979e8d309693d53fbe9184e067a50 (diff)
pke: use new pk_iter_t from pk.h
-rw-r--r--config.mk2
-rw-r--r--editor/editor.cpp119
-rw-r--r--src/asset-manager.cpp33
-rw-r--r--src/camera.cpp39
-rw-r--r--src/ecs.cpp149
-rw-r--r--src/entities.cpp23
-rw-r--r--src/project.cpp47
-rw-r--r--src/serialization.cpp39
-rw-r--r--src/static-ui.cpp13
-rw-r--r--src/window.cpp30
10 files changed, 282 insertions, 212 deletions
diff --git a/config.mk b/config.mk
index 3657a80..a2c56ce 100644
--- a/config.mk
+++ b/config.mk
@@ -31,6 +31,8 @@ LIBS = -lm `$(PKG_CONFIG) --libs $(USED_LIBS)` -lpthread
# flags
# -fsanitize=address \
+# -rdynamic is for pkfuncinstr
+# -finstrument-functions is for pkfuncinstr
SHARED_FLAGS = -D_DEFAULT_SOURCE \
-D_POSIX_C_SOURCE=200809L \
diff --git a/editor/editor.cpp b/editor/editor.cpp
index 2292066..ab8598c 100644
--- a/editor/editor.cpp
+++ b/editor/editor.cpp
@@ -545,19 +545,23 @@ struct AssetPickerSearchStruct {
AssetType type{PKE_ASSET_TYPE_ALL};
};
void RecordImGui_AssetPicker(AssetPickerSearchStruct &apss) {
+ bool b;
+ pk_bkt_arr *bkt_arr_assets;
+ pk_iter_t<Asset> iter_asset{};
if (shouldRebuildAssetList == true) {
if (assetEntries.next == 0) {
- auto asset_iter_fn = [](void *user_data, void *arr_obj_data) {
- (void)user_data;
+ bkt_arr_assets = AM_GetAssets();
+ b = pk_bkt_arr_iter_begin(bkt_arr_assets, &iter_asset);
+ while (b == true) {
assetLabel tmp{};
- const Asset &a = *reinterpret_cast<Asset*>(arr_obj_data);
+ const Asset &a = *iter_asset;
tmp.key[AssetKeyLength-1] = '\0';
tmp.handle = a.handle;
tmp.type = a.type;
strncpy(tmp.key, a.key, AssetKeyLength);
pk_arr_append_t(&assetEntries, tmp);
- };
- pk_bkt_arr_iterate(AM_GetAssets(), asset_iter_fn, NULL);
+ b = pk_bkt_arr_iter_increment(bkt_arr_assets, &iter_asset);
+ }
}
std::qsort(assetEntries.data, assetEntries.next, sizeof(assetLabel), assetLabelCmp);
}
@@ -741,6 +745,9 @@ void RecordImGuiEditorWrapper() {
}
void RecordImGuiEntityTypes() {
+ bool b;
+ pk_bkt_arr *bkt_arr_ent_types;
+ pk_iter_t<EntityType> iter_ent_type{};
if (!ImGui::Begin("EntityTypes")) {
ImGui::End();
return;
@@ -759,9 +766,10 @@ void RecordImGuiEntityTypes() {
ImGui::TableHeadersRow();
size_t counter = 0;
- auto et_iter_cb = [](void *user_data, void *arr_obj_data) {
- size_t &counter = *reinterpret_cast<size_t *>(user_data);
- const EntityType &et = *reinterpret_cast<EntityType*>(arr_obj_data);
+ bkt_arr_ent_types = EntityType_GetEntityTypes();
+ b = pk_bkt_arr_iter_begin(bkt_arr_ent_types, &iter_ent_type);
+ while (b == true) {
+ const EntityType &et = *iter_ent_type;
ImGui::PushID(counter++);
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
@@ -779,8 +787,8 @@ void RecordImGuiEntityTypes() {
ImGui::SameLine();
ImGui::Text("count: %u", et.details[0].grBinds->instanceCounter);
ImGui::PopID();
- };
- pk_bkt_arr_iterate(EntityType_GetEntityTypes(), et_iter_cb, &counter);
+ b = pk_bkt_arr_iter_increment(bkt_arr_ent_types, &iter_ent_type);
+ }
ImGui::EndTable();
}
ImGui::End();
@@ -983,7 +991,10 @@ void GenerateMTSDFGlyph(MSDFGlyphSettings *settings, const char *name) {
}
bool RecordImGui_GenerateMTSDFModal() {
+ bool b;
bool ret_value = false;
+ pk_bkt_arr *bkt_arr_assets;
+ pk_iter_t<Asset> iter_asset{};
static struct FontTypeMSDFSettings msdf_settings{};
if (ImGui::BeginPopupModal("MTSDFModal", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) {
@@ -992,18 +1003,20 @@ bool RecordImGui_GenerateMTSDFModal() {
ImGui::Text("Select font:");
ImGui::BeginDisabled(msdf_settings.minimum_scale <= 0.0 || msdf_settings.px_range <= 0.0);
- auto asset_iter_fn = [](void *user_data, void *arr_obj_data) {
- (void)user_data;
- const Asset &a = *reinterpret_cast<Asset*>(arr_obj_data);
+ bkt_arr_assets = AM_GetAssets();
+ b = pk_bkt_arr_iter_begin(bkt_arr_assets, &iter_asset);
+ while(b == true) {
+ const Asset &a = *iter_asset;
if (!PK_HAS_FLAG(a.type, PKE_ASSET_TYPE_FONT)) {
- return;
+ b = pk_bkt_arr_iter_increment(bkt_arr_assets, &iter_asset);
+ continue;
}
if (ImGui::Selectable(a.basePath)) {
GenerateMTSDF(&msdf_settings, &a);
ImGui::CloseCurrentPopup();
}
- };
- pk_bkt_arr_iterate(AM_GetAssets(), asset_iter_fn, NULL);
+ b = pk_bkt_arr_iter_increment(bkt_arr_assets, &iter_asset);
+ }
ImGui::EndDisabled();
ImGui::Separator();
if (ImGui::Button("Cancel")) {
@@ -1063,6 +1076,9 @@ bool RecordImGui_GenerateMTSDFGlyphModal() {
}
void RecordImGuiAssets() {
+ bool b;
+ pk_bkt_arr *bkt_arr_asset;
+ pk_iter_t<Asset> iter_asset;
if (!ImGui::Begin("AssetList")) {
ImGui::End();
return;
@@ -1083,9 +1099,10 @@ void RecordImGuiAssets() {
ImGui::TableHeadersRow();
size_t counter = 0;
- auto asset_iter_fn = [](void *user_data, void *arr_obj_data) {
- size_t &counter = *reinterpret_cast<size_t*>(user_data);
- const Asset &asset = *reinterpret_cast<Asset*>(arr_obj_data);
+ bkt_arr_asset = AM_GetAssets();
+ b = pk_bkt_arr_iter_begin(bkt_arr_asset, &iter_asset);
+ while(b == true) {
+ const Asset &asset = *iter_asset;
ImGui::PushID(counter++);
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
@@ -1103,16 +1120,17 @@ void RecordImGuiAssets() {
ImGui::TableSetColumnIndex(6);
ImGui::Text("%hhi", asset.referenceCount);
ImGui::PopID();
- };
- pk_bkt_arr_iterate(AM_GetAssets(), asset_iter_fn, &counter);
+ b = pk_bkt_arr_iter_increment(bkt_arr_asset, &iter_asset);
+ }
ImGui::EndTable();
}
ImGui::End();
}
void RecordImGuiCameras() {
- using CamIterFn = pk_tmpln_1<void, PkeCamera*, void*>;
- static CamIterFn cam_iter_cb{};
+ bool b;
+ pk_bkt_arr *bkt_arr_cams;
+ pk_iter_t<PkeCamera> iter_cam{};
CompInstance *active_inst = nullptr;
if (!ImGui::Begin("Cameras")) {
ImGui::End();
@@ -1154,13 +1172,10 @@ void RecordImGuiCameras() {
ImGui::TableHeadersRow();
size_t cam_counter = 0;
- cam_iter_cb.func = [&cam_counter, &active_inst](PkeCamera *cam_ptr) {
- const auto &cam = *cam_ptr;
- /* 2025-05-28 JCB delete me if you see me, i wasn't needed
- if (cam.camHandle.b == CameraHandle_MAX.b && cam.camHandle.i == CameraHandle_MAX.i) {
- return;
- }
- */
+ bkt_arr_cams = &PkeCamera_GetPkBktArr();
+ b = pk_bkt_arr_iter_begin(bkt_arr_cams, &iter_cam);
+ while (b == true) {
+ const auto &cam = *iter_cam;
ImGui::PushID(cam_counter);
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
@@ -1207,8 +1222,8 @@ void RecordImGuiCameras() {
}
ImGui::PopID();
cam_counter += 1;
- };
- pk_bkt_arr_iterate(&PkeCamera_GetPkBktArr(), &CamIterFn::invoke, &cam_iter_cb);
+ b = pk_bkt_arr_iter_increment(bkt_arr_cams, &iter_cam);
+ }
ImGui::EndTable();
}
@@ -1650,6 +1665,9 @@ void RecordImGuiModalCreateEntityType() {
}
void RecordImGuiLevels() {
+ bool b;
+ pk_bkt_arr *bkt_arr_levels;
+ pk_iter_t<pke_level> iter_level{};
if (!ImGui::Begin("Levels")) {
ImGui::End();
return;
@@ -1663,16 +1681,16 @@ void RecordImGuiLevels() {
ImGui::TableSetupColumn("Handle");
ImGui::TableHeadersRow();
- auto level_iter_cb = [](void *user_data, void *arr_obj_data) {
- (void)user_data;
- pke_level *lvl = reinterpret_cast<pke_level*>(arr_obj_data);
+ bkt_arr_levels = pke_level_get_levels();
+ b = pk_bkt_arr_iter_begin(bkt_arr_levels, &iter_level);
+ while (b == true) {
ImGui::TableNextRow();
ImGui::TableSetColumnIndex(0);
- ImGui::Text("%s", lvl->name);
+ ImGui::Text("%s", iter_level->name);
ImGui::TableSetColumnIndex(1);
- ImGui::Text("0x%08X 0x%08X", lvl->levelHandle.b, lvl->levelHandle.i);
- };
- pk_bkt_arr_iterate(pke_level_get_levels(), level_iter_cb, NULL);
+ ImGui::Text("0x%08X 0x%08X", iter_level->levelHandle.b, iter_level->levelHandle.i);
+ b = pk_bkt_arr_iter_increment(bkt_arr_levels, &iter_level);
+ }
ImGui::EndTable();
}
@@ -1947,6 +1965,10 @@ void RecordImGuiProjectBrowser() {
}
void RecordImGuiSceneBrowser() {
+ bool b;
+ EntityType *entType = NULL;
+ pk_bkt_arr *bkt_arr_instances;
+ pk_iter_t<CompInstance> iter_inst{};
NULL_CHAR_ARR(text, 128);
if (!ImGui::Begin("SceneBrowser", &pkeSettings.editorSettings.isShowingSceneEditor)) {
@@ -1954,24 +1976,23 @@ void RecordImGuiSceneBrowser() {
return;
}
- using InstIterFn = pk_tmpln_1<void, CompInstance*, void*>;
- InstIterFn inst_iter_cb{};
- inst_iter_cb.func = [&text](CompInstance *arr_obj_data) {
- // EntityType *entType = EntityType_FindByEntityHandle(arr_obj_data->entHandle);
- EntityType *entType = NULL;
- CompGrBinds *grBinds = ECS_GetGrBinds(arr_obj_data->grBindsHandle);
+ bkt_arr_instances = ECS_GetInstances();
+ b = pk_bkt_arr_iter_begin(bkt_arr_instances, &iter_inst);
+ while(b == true) {
+ entType = NULL;
+ CompGrBinds *grBinds = ECS_GetGrBinds(iter_inst->grBindsHandle);
if (grBinds != NULL) {
entType = static_cast<EntityType*>(ECS_GetEntity(grBinds->entHandle));
}
- sprintf(text, "%08x %08x", arr_obj_data->instanceHandle.b, arr_obj_data->instanceHandle.i);
+ sprintf(text, "%08x %08x", iter_inst->instanceHandle.b, iter_inst->instanceHandle.i);
if (ImGui::Button(text)) {
- selectedEntity = arr_obj_data;
+ selectedEntity = iter_inst;
}
ImGui::SameLine();
sprintf(text, "EntityType: %s", entType != nullptr ? entType->entityTypeCode.val : "(no type)");
ImGui::Text("%s", text);
- };
- pk_bkt_arr_iterate(ECS_GetInstances(), &InstIterFn::invoke, &inst_iter_cb);
+ b = pk_bkt_arr_iter_increment(bkt_arr_instances, &iter_inst);
+ }
ImGui::End();
}
diff --git a/src/asset-manager.cpp b/src/asset-manager.cpp
index 519698e..0ff1cf2 100644
--- a/src/asset-manager.cpp
+++ b/src/asset-manager.cpp
@@ -218,10 +218,12 @@ pk_bkt_arr *AM_GetAssets() {
}
void AM_DebugPrint() {
+ bool b;
+ pk_iter_t<Asset> iter_asset{};
fprintf(stdout, "Asset Manager printout:\n");
- auto asset_iter_fn = [](void *user_data, void *arr_obj_data) {
- (void)user_data;
- Asset &asset = *reinterpret_cast<Asset *>(arr_obj_data);
+ b = pk_bkt_arr_iter_begin(&asset_mstr.bc, &iter_asset);
+ while (b == true) {
+ Asset &asset = *iter_asset;
printf("-Asset: 0x%.08X 0x%.08X\n", asset.handle.b, asset.handle.i);
printf("\tkey: %.16s\n", asset.key);
if (asset.basePath != nullptr) {
@@ -234,28 +236,33 @@ void AM_DebugPrint() {
printf("\tfuture: %i\n", asset.future.valid());
printf("\treferenceCount: %i\n", asset.referenceCount);
printf("\tAssetLoadingState: %hhu\n", static_cast<AssetLoadingState_T>(asset.state));
- };
- pk_bkt_arr_iterate(&asset_mstr.bc, asset_iter_fn, NULL);
+ b = pk_bkt_arr_iter_increment(&asset_mstr.bc, &iter_asset);
+ }
}
void AM_GC() {
- auto asset_iter_fn = [](void *user_data, void *arr_obj_data) {
- (void)user_data;
- Asset &asset = *reinterpret_cast<Asset *>(arr_obj_data);
+ bool b;
+ pk_iter_t<Asset> iter_asset{};
+ b = pk_bkt_arr_iter_begin(&asset_mstr.bc, &iter_asset);
+ while (b == true) {
+ Asset &asset = *iter_asset;
if (PK_HAS_FLAG(asset.flags, PKE_ASSET_FLAGS_MEM_STATIC)) {
fprintf(stdout, "[AM_GC] Asset '%.16s' is static, skipping.\n", asset.key);
- return;
+ b = pk_bkt_arr_iter_increment(&asset_mstr.bc, &iter_asset);
+ continue;
}
switch (asset.state) {
case PKE_ASSET_LOADING_STATE_LOADING:
fprintf(stdout, "[AM_GC] Asset '%.16s' is still loading.\n", asset.key);
- break;
+ b = pk_bkt_arr_iter_increment(&asset_mstr.bc, &iter_asset);
+ continue;
default:
void(0);
}
if (asset.referenceCount > 0) {
fprintf(stdout, "[AM_GC] Asset '%.16s' still in use, count: %i\n", asset.key, asset.referenceCount);
- return;
+ b = pk_bkt_arr_iter_increment(&asset_mstr.bc, &iter_asset);
+ continue;
}
if (asset.ptr != nullptr && asset.ptr != CAFE_BABE(void)) {
pk_delete_base(asset.ptr, asset.size);
@@ -265,8 +272,8 @@ void AM_GC() {
asset.ptr = CAFE_BABE(void);
new (&asset.future) std::future<void>{};
asset.state = PKE_ASSET_LOADING_STATE_UNLOADED;
- };
- pk_bkt_arr_iterate(&asset_mstr.bc, asset_iter_fn, NULL);
+ b = pk_bkt_arr_iter_increment(&asset_mstr.bc, &iter_asset);
+ }
}
void AM_Teardown() {
diff --git a/src/camera.cpp b/src/camera.cpp
index 134e9f7..8635211 100644
--- a/src/camera.cpp
+++ b/src/camera.cpp
@@ -142,18 +142,20 @@ void PkeCamera_UntargetInstance(CameraHandle cameraHandle) {
}
void PkeCamera_SetPrimary(CameraHandle cameraHandle) {
+ bool b;
+ pk_iter_t<PkeCamera> iter_cam{};
assert(cameraHandle != CameraHandle_MAX);
- auto check_stale = [](void *user_data, void *cam_ptr) {
- CameraHandle handle = *reinterpret_cast<CameraHandle*>(user_data);
- auto &cam = *reinterpret_cast<PkeCamera*>(cam_ptr);
+
+ b = pk_bkt_arr_iter_begin(&cam_mstr.bktc_cameras, &iter_cam);
+ while (b == true) {
// TODO 2025-05-28 JCB
// There was some speculative scene filtering happening here.
// I removed it because it was comparing entity parents and I don't
// think that is accurate.
// Instead, should be a per-viewport or per-world check?
- cam.isPrimary = (cam.camHandle == handle);
- };
- pk_bkt_arr_iterate(&cam_mstr.bktc_cameras, check_stale, &cameraHandle);
+ iter_cam->isPrimary = iter_cam->camHandle == cameraHandle;
+ b = pk_bkt_arr_iter_increment(&cam_mstr.bktc_cameras, &iter_cam);
+ }
}
void PkeCamera_Destroy(CameraHandle cameraHandle) {
@@ -217,25 +219,22 @@ void PkeCamera_Tick(double delta) {
* See the camera serializer for more.
*/
(void)delta;
- auto check_stale = [](void *user_data, void *cam_ptr) {
- (void)user_data;
- auto &cam = *reinterpret_cast<PkeCamera*>(cam_ptr);
- /* 2025-05-28 JCB - if you see me, delete me, i wasn't needed
- if (cam.handle == EntityHandle_MAX || cam.phys.instHandle == InstanceHandle_MAX) {
- return;
- }
- */
- CompInstance *inst = ECS_GetInstance(cam.phys.instHandle);
+ bool b;
+ pk_iter_t<PkeCamera> iter_cam{};
+ b = pk_bkt_arr_iter_begin(&cam_mstr.bktc_cameras, &iter_cam);
+ while (b == true) {
+ CompInstance *inst = ECS_GetInstance(iter_cam->phys.instHandle);
assert(inst != nullptr);
if (inst->isNeedingUpdated == true) {
- cam.stale = cam.stale | PKE_CAMERA_STALE_POSROT;
+ iter_cam->stale = iter_cam->stale | PKE_CAMERA_STALE_POSROT;
inst->isNeedingUpdated = false;
}
- if (cam.phys.target_inst_uuid == pk_uuid_zed) {
- return;
+ if (iter_cam->phys.target_inst_uuid == pk_uuid_zed) {
+ b = pk_bkt_arr_iter_increment(&cam_mstr.bktc_cameras, &iter_cam);
+ continue;
}
- cam.stale = cam.stale | PKE_CAMERA_STALE_POSROT;
+ iter_cam->stale = iter_cam->stale | PKE_CAMERA_STALE_POSROT;
+ b = pk_bkt_arr_iter_increment(&cam_mstr.bktc_cameras, &iter_cam);
};
- pk_bkt_arr_iterate(&cam_mstr.bktc_cameras, check_stale, NULL);
}
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() {
diff --git a/src/entities.cpp b/src/entities.cpp
index 8b37cbc..8b39cea 100644
--- a/src/entities.cpp
+++ b/src/entities.cpp
@@ -1412,18 +1412,21 @@ pk_bkt_arr *EntityType_GetEntityTypes() {
}
void EntityType_Teardown() {
- auto et_iter_cb = [](void *user_data, void *arr_obj_data) {
- (void)user_data;
- EntityType &et = *reinterpret_cast<EntityType *>(arr_obj_data);
- if (et.modelAssetKey[0] == '\0') return;
+ bool b;
+ pk_iter_t<EntityType> iter_ent_type{};
+ b = pk_bkt_arr_iter_end(&et_mstr.bc, &iter_ent_type);
+ while (b == true) {
+ if (iter_ent_type->modelAssetKey[0] == '\0') {
+ b = pk_bkt_arr_iter_decrement(&et_mstr.bc, &iter_ent_type);
+ continue;
+ }
CompGrBinds *grBindsArr[EntityTypeDetails_MAX] = {nullptr};
- for (long k = 0; k < et.detailsCount; ++k) {
- const EntityTypeDetails &etd = et.details[k];
- grBindsArr[k] = etd.grBinds;
+ for (long k = 0; k < iter_ent_type->detailsCount; ++k) {
+ grBindsArr[k] = iter_ent_type->details[k].grBinds;
}
- EntityType_Unload(et, grBindsArr);
- };
- pk_bkt_arr_iterate(&et_mstr.bc, et_iter_cb, NULL);
+ EntityType_Unload(*iter_ent_type, grBindsArr);
+ b = pk_bkt_arr_iter_decrement(&et_mstr.bc, &iter_ent_type);
+ }
pk_bkt_arr_teardown(&et_mstr.bc);
pk_arr_reset(&EntityTypesToTeardown);
pk_mem_bucket_destroy(et_mstr.bkt);
diff --git a/src/project.cpp b/src/project.cpp
index 00c4c1f..463c2c9 100644
--- a/src/project.cpp
+++ b/src/project.cpp
@@ -393,6 +393,11 @@ void PkeProject_Load(const char *filePath) {
void PkeProject_Save(const char *filePath) {
bool failed = false;
+ bool b;
+ pk_iter_t<Asset> iter_asset{};
+ pk_iter_t<EntityType> iter_ent_type{};
+ pk_bkt_arr *bkt_arr_assets;
+ pk_bkt_arr *bkt_arr_ent_types;
const char *saveFilePath = filePath == nullptr ? PKE_PROJ_DEFAULT_FILENAME : filePath;
std::ostringstream stream{};
@@ -408,38 +413,44 @@ void PkeProject_Save(const char *filePath) {
f << PKE_PROJ_FILE_OBJ_END << std::endl;
*/
- using AssetLoopFn = pk_tmpln_1<void, Asset *, void *>;
- using ETLoopFn = pk_tmpln_1<void, EntityType *, void *>;
- AssetLoopFn asset_loop_cb{};
- ETLoopFn et_loop_cb{};
-
- asset_loop_cb.func = [&stream](Asset *arr_obj_data) {
- if (PK_HAS_FLAG(arr_obj_data->flags, PKE_ASSET_FLAGS_MEM_STATIC)) return;
+ bkt_arr_assets = AM_GetAssets();
+ b = pk_bkt_arr_iter_begin(bkt_arr_assets, &iter_asset);
+ while (b == true) {
+ if (PK_HAS_FLAG(iter_asset->flags, PKE_ASSET_FLAGS_MEM_STATIC)) {
+ b = pk_bkt_arr_iter_increment(bkt_arr_assets, &iter_asset);
+ continue;
+ }
// TODO 2025-05-30 JCB
// This should be a flag
bool isGlobalAsset = false;
for (long k = 0; k < embedded_shader_index_count; ++k) {
- if (strncmp(embedded_shaders[k].name, arr_obj_data->key, AssetKeyLength) == 0) {
+ if (strncmp(embedded_shaders[k].name, iter_asset->key, AssetKeyLength) == 0) {
isGlobalAsset = true;
break;
}
}
- if (isGlobalAsset) return;
+ if (isGlobalAsset) {
+ b = pk_bkt_arr_iter_increment(bkt_arr_assets, &iter_asset);
+ continue;
+ }
stream << PKE_PROJ_FILE_OBJ_ASSET << std::endl;
- Proj_SerializeAsset(stream, *arr_obj_data);
+ Proj_SerializeAsset(stream, *iter_asset);
stream << PKE_PROJ_FILE_OBJ_END << std::endl;
- };
- pk_bkt_arr_iterate(AM_GetAssets(), &AssetLoopFn::invoke, &asset_loop_cb);
+ b = pk_bkt_arr_iter_increment(bkt_arr_assets, &iter_asset);
+ }
- et_loop_cb.func = [&stream](EntityType *arr_obj_data) {
- if (arr_obj_data->modelAssetKey[0] == '\0') {
- return;
+ bkt_arr_ent_types = EntityType_GetEntityTypes();
+ b = pk_bkt_arr_iter_begin(bkt_arr_ent_types, &iter_ent_type);
+ while (b == true) {
+ if (iter_ent_type->modelAssetKey[0] == '\0') {
+ b = pk_bkt_arr_iter_increment(bkt_arr_ent_types, &iter_ent_type);
+ continue;
}
stream << PKE_PROJ_FILE_OBJ_ENTITY_TYPE << std::endl;
- Proj_SerializeEntityType(stream, *arr_obj_data);
+ Proj_SerializeEntityType(stream, *iter_ent_type);
stream << PKE_PROJ_FILE_OBJ_END << std::endl;
- };
- pk_bkt_arr_iterate(EntityType_GetEntityTypes(), &ETLoopFn::invoke, &et_loop_cb);
+ b = pk_bkt_arr_iter_increment(bkt_arr_ent_types, &iter_ent_type);
+ }
FontTypeIndex font_count;
FontType *fonts = FontType_GetFonts(font_count);
diff --git a/src/serialization.cpp b/src/serialization.cpp
index 0d8f2e1..96dd5b5 100644
--- a/src/serialization.cpp
+++ b/src/serialization.cpp
@@ -66,10 +66,10 @@ void pke_deserialize_project_from_stream(std::istream &i, srlztn_deserialize_hel
}
void pke_serialize_scene(srlztn_serialize_helper *h) {
- using CamIterFn = pk_tmpln_1<void, PkeCamera*, void*>;
- using InstIterFn = pk_tmpln_1<void, CompInstance*, void*>;
- CamIterFn cam_iter_cb{};
- InstIterFn inst_iter_cb{};
+ bool b;
+ pk_bkt_arr *bkt_arr_instance;
+ pk_iter_t<CompInstance> iter_instance{};
+ pk_iter_t<PkeCamera> iter_cam{};
pk_arr_t<pke_input_set> &sets = pke_input_get_input_sets();
for (uint32_t i = 0; i < sets.next; ++i) {
@@ -97,22 +97,27 @@ void pke_serialize_scene(srlztn_serialize_helper *h) {
pke_serialize_ui_box(h, ui_boxes[i]);
}
- inst_iter_cb.func = [&h](CompInstance *instance_ptr) {
- const auto &instance = *instance_ptr;
- if (PK_HAS_FLAG(instance.comp_instance_flags, COMPONENT_INSTANCE_FLAG_DO_NOT_SERIALIZE)) {
- return;
+ bkt_arr_instance = ECS_GetInstances();
+ b = pk_bkt_arr_iter_begin(bkt_arr_instance, &iter_instance);
+ while (b == true) {
+ if (PK_HAS_FLAG(iter_instance->comp_instance_flags, COMPONENT_INSTANCE_FLAG_DO_NOT_SERIALIZE)) {
+ b = pk_bkt_arr_iter_increment(bkt_arr_instance, &iter_instance);
+ continue;
}
- pke_serialize_instance(h, &instance);
- };
- pk_bkt_arr_iterate(ECS_GetInstances(), &InstIterFn::invoke, &inst_iter_cb);
+ pke_serialize_instance(h, iter_instance);
+ b = pk_bkt_arr_iter_increment(bkt_arr_instance, &iter_instance);
+ }
- cam_iter_cb.func = [&h](PkeCamera *cam_ptr) {
- if (cam_ptr->camHandle == CameraHandle_MAX) {
- return;
+ pk_bkt_arr &bkt_arr_cams = PkeCamera_GetPkBktArr();
+ b = pk_bkt_arr_iter_begin(&bkt_arr_cams, &iter_cam);
+ while (b == true) {
+ if (iter_cam->camHandle == CameraHandle_MAX) {
+ b = pk_bkt_arr_iter_increment(&bkt_arr_cams, &iter_cam);
+ continue;
}
- pke_serialize_camera(h, cam_ptr);
- };
- pk_bkt_arr_iterate(&PkeCamera_GetPkBktArr(), &CamIterFn::invoke, &cam_iter_cb);
+ pke_serialize_camera(h, iter_cam);
+ b = pk_bkt_arr_iter_increment(&bkt_arr_cams, &iter_cam);
+ }
}
void pke_deserialize_scene(srlztn_deserialize_helper *h) {
uint32_t i;
diff --git a/src/static-ui.cpp b/src/static-ui.cpp
index d8990a3..f80c000 100644
--- a/src/static-ui.cpp
+++ b/src/static-ui.cpp
@@ -967,14 +967,15 @@ const pke_ui_graphics_bindings &pke_ui_get_graphics_bindings() {
}
void pke_ui_get_graphics_bindings_texture(pk_arr *arr) {
+ bool b;
pk_arr_t<pke_ui_graphics_bindings_texture> &arr_t = *static_cast<pk_arr_t<pke_ui_graphics_bindings_texture>*>(arr);
assert(arr_t.stride == sizeof(pke_ui_graphics_bindings_texture));
assert(arr_t.alignment == alignof(pke_ui_graphics_bindings_texture));
- texture_binding_bkt_arr::FN_Iter iter_fn_tmpln;
- iter_fn_tmpln.func = [&arr_t](pke_ui_graphics_bindings_texture *arr_item) {
- pk_arr_append_t(&arr_t, *arr_item);
- };
-
- pk_bkt_arr_iterate(&pke_ui_master.bindings_texture, texture_binding_bkt_arr::FN_Iter::invoke, &iter_fn_tmpln);
+ pk_iter_t<pke_ui_graphics_bindings_texture> iter_gr{};
+ b = pk_bkt_arr_iter_begin(&pke_ui_master.bindings_texture, &iter_gr);
+ while (b == true) {
+ pk_arr_append_t<pke_ui_graphics_bindings_texture>(&arr_t, *iter_gr);
+ b = pk_bkt_arr_iter_increment(&pke_ui_master.bindings_texture, &iter_gr);
+ }
}
diff --git a/src/window.cpp b/src/window.cpp
index e0184d6..6655488 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -3419,6 +3419,7 @@ void pkvk_transition_image_layout(VkCommandBuffer command_buffer,
void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) {
uint32_t i, counter;
+ bool b;
vkResetCommandBuffer(commandBuffer, 0);
VkCommandBufferBeginInfo beginInfo;
@@ -3550,16 +3551,23 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) {
vkCmdSetViewport(commandBuffer, 0, 1, &viewport);
vkCmdSetScissor(commandBuffer, 0, 1, &scissor);
- using GrBindsIterFn = pk_tmpln_1<void, CompGrBinds*, void*>;
- GrBindsIterFn gr_binds_iter_cb{};
- gr_binds_iter_cb.func = [commandBuffer, imageIndex](CompGrBinds *binder) {
- VkDeviceSize offsets[1] = {0U};
- if (binder->grBindsHandle == GrBindsHandle_MAX)
- return;
- if (!binder->vkPipelineLayout)
- return;
+ pk_iter_t<CompGrBinds> gr_binds_iter{};
+ pk_bkt_arr *ecs_gr_binds_bkt_arr = ECS_GetGrBinds();
+ b = pk_bkt_arr_iter_begin(ecs_gr_binds_bkt_arr, &gr_binds_iter);
+ CompGrBinds *binder = nullptr;
+ while (b == true) {
+ binder = &*gr_binds_iter;
+ if (binder->grBindsHandle == GrBindsHandle_MAX) {
+ b = pk_bkt_arr_iter_increment(ecs_gr_binds_bkt_arr, &gr_binds_iter);
+ continue;
+ }
+ if (!binder->vkPipelineLayout) {
+ b = pk_bkt_arr_iter_increment(ecs_gr_binds_bkt_arr, &gr_binds_iter);
+ continue;
+ }
if (binder->instanceBD.bindingCount < 1) {
- return;
+ b = pk_bkt_arr_iter_increment(ecs_gr_binds_bkt_arr, &gr_binds_iter);
+ continue;
}
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, binder->graphicsPipeline);
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, binder->vkPipelineLayout, 0, 1, &binder->vkDescriptorSets[imageIndex], 0, {});
@@ -3584,8 +3592,8 @@ void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) {
vkCmdDrawIndexed(commandBuffer, binder->physIndxBD.bindingCount, binder->instanceCounter, 0, 0, 0);
}
- };
- pk_bkt_arr_iterate(ECS_GetGrBinds(), &GrBindsIterFn::invoke, &gr_binds_iter_cb);
+ b = pk_bkt_arr_iter_increment(ecs_gr_binds_bkt_arr, &gr_binds_iter);
+ }
if (pkeDebugHitbox.instanceBuffer != VK_NULL_HANDLE) {
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pkePipelines.pipelines.named.entity_wireframe);