diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-30 17:21:38 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-30 17:21:38 -0400 |
| commit | 2a2b5c4dbfe278e282b3d8ae0352a11da50c872a (patch) | |
| tree | ad0f61c521d2fe0f79a55a72e36af39161b25067 | |
| parent | f1d22f3fde0cb7bf201168a11774793b4efc98f7 (diff) | |
pke: entities: BucketContainer>pk_bkt_arr_t
| -rw-r--r-- | editor/editor.cpp | 49 | ||||
| -rw-r--r-- | src/ecs.cpp | 4 | ||||
| -rw-r--r-- | src/ecs.hpp | 1 | ||||
| -rw-r--r-- | src/entities.cpp | 102 | ||||
| -rw-r--r-- | src/entities.hpp | 7 | ||||
| -rw-r--r-- | src/project.cpp | 23 | ||||
| -rw-r--r-- | tests/pke-test.cpp | 7 |
7 files changed, 93 insertions, 100 deletions
diff --git a/editor/editor.cpp b/editor/editor.cpp index 3de8d85..03049bc 100644 --- a/editor/editor.cpp +++ b/editor/editor.cpp @@ -733,37 +733,30 @@ void RecordImGuiEntityTypes() { ImGui::TableSetupColumn("Instances"); ImGui::TableHeadersRow(); - pk_handle_bucket_index_T cameraBucketCount = EntityType_GetBucketCount(); - for (pk_handle_bucket_index_T b = 0; b < cameraBucketCount; ++b) { - pk_handle_item_index_T count; - auto *entityTypes = EntityType_GetEntityTypes(b, count); - ImGui::PushID(b); - for (pk_handle_item_index_T i = 0; i < count; ++i) { - const auto &et = entityTypes[i]; - if (et.handle == EntityHandle_MAX) - continue; - ImGui::PushID(i); - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("0x%08X 0x%08X", et.handle.b, et.handle.i); - ImGui::TableSetColumnIndex(1); - ImGui::Text("%*.*s", 0, (int)AssetKeyLength, et.modelAssetKey); - ImGui::TableSetColumnIndex(2); - ImGui::Text("%s", et.entityTypeCode.val); - ImGui::TableSetColumnIndex(3); - ImGui::Text("count: %li", et.detailsCount); - ImGui::TableSetColumnIndex(4); - if (ImGui::Button("Add")) { - pk_arr_append_t(&entityInstancesToCreate, const_cast<EntityType *>(&et)); - } - ImGui::SameLine(); - ImGui::Text("count: %u", et.details[0].grBinds->instanceCounter); - ImGui::PopID(); + 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); + ImGui::PushID(counter++); + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("0x%08X 0x%08X", et.handle.b, et.handle.i); + ImGui::TableSetColumnIndex(1); + ImGui::Text("%*.*s", 0, (int)AssetKeyLength, et.modelAssetKey); + ImGui::TableSetColumnIndex(2); + ImGui::Text("%s", et.entityTypeCode.val); + ImGui::TableSetColumnIndex(3); + ImGui::Text("count: %li", et.detailsCount); + ImGui::TableSetColumnIndex(4); + if (ImGui::Button("Add")) { + pk_arr_append_t(&entityInstancesToCreate, const_cast<EntityType *>(&et)); } + ImGui::SameLine(); + ImGui::Text("count: %u", et.details[0].grBinds->instanceCounter); ImGui::PopID(); - } + }; + pk_bkt_arr_iterate(EntityType_GetEntityTypes(), et_iter_cb, &counter); ImGui::EndTable(); - } ImGui::End(); } diff --git a/src/ecs.cpp b/src/ecs.cpp index 137686b..6ff4d5c 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -114,6 +114,10 @@ void ECS_MarkForRemoval(Entity_Base *entity) { pk_arr_append_t(&entitiesMarkedForRemoval, entity); } +pk_bkt_arr *ECS_GetEntities() { + return &ecs.bc.entityPtrs; +}; + void ECS_Tick_Early(double delta) { // these reserves might happen 1 tick early, but that's fine (void)delta; diff --git a/src/ecs.hpp b/src/ecs.hpp index 91202c4..436429c 100644 --- a/src/ecs.hpp +++ b/src/ecs.hpp @@ -20,6 +20,7 @@ EntityHandle ECS_CreateEntity(Entity_Base *entity, Entity_Base *parentEnt = null Entity_Base *ECS_GetEntity(EntityHandle handle); Entity_Base *ECS_GetEntityByUUID(pk_uuid uuid); void ECS_MarkForRemoval(Entity_Base *entity); +pk_bkt_arr *ECS_GetEntities(); void ECS_HandleCollision(CompInstance *lhs, CompInstance *rhs); diff --git a/src/entities.cpp b/src/entities.cpp index 09e9398..eba48d5 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -1,7 +1,6 @@ #include "entities.hpp" -#include "bucketed-array.hpp" #include "ecs.hpp" #include "game-settings.hpp" #include "math-helpers.hpp" @@ -18,7 +17,10 @@ #include <filesystem> #include <vulkan/vulkan_core.h> -BucketContainer<EntityType> EntityType_BC{}; + +struct EntityTypeMaster { + pk_bkt_arr_t<EntityType> bc{}; +} et_mstr; struct EntToTeardown { EntityHandle handle = EntityHandle_MAX; @@ -28,13 +30,13 @@ struct EntToTeardown { pk_arr_t<EntToTeardown> EntityTypesToTeardown{}; void EntityType_Init() { - Buckets_Init(EntityType_BC); + new (&et_mstr.bc) pk_bkt_arr_t<EntityType>; pk_arr_reserve(&EntityTypesToTeardown, 16); } EntityType *EntityType_Create(pk_uuid uuid) { - EntityTypeHandle entTypeHandle{Buckets_NewHandle(EntityType_BC)}; - EntityType &entityType = EntityType_BC.buckets[entTypeHandle.bucketIndex][entTypeHandle.itemIndex]; + EntityTypeHandle entTypeHandle{pk_bkt_arr_new_handle(&et_mstr.bc)}; + EntityType &entityType = et_mstr.bc[entTypeHandle]; new (&entityType) EntityType{}; entityType.uuid = uuid; ECS_CreateEntity(&entityType); @@ -100,37 +102,37 @@ Entity_Base *EntityType_CreateGenericInstance(EntityType *et, Entity_Base *level } EntityType *EntityType_FindByTypeCode(const char *typeCode) { - for (pk_handle_bucket_index_T b = 0; b <= EntityType_BC.pkeHandle.bucketIndex; ++b) { - auto &bkt = EntityType_BC.buckets[b]; - long itemCount = EntityType_BC.pkeHandle.bucketIndex == b ? EntityType_BC.pkeHandle.itemIndex : EntityType_BC.limits.itemIndex; - for (pk_handle_item_index_T i = 0; i < itemCount; ++i) { - auto &entityType = bkt[i]; - if (entityType.handle == EntityHandle_MAX) continue; - if (strcmp(typeCode, entityType.entityTypeCode.val) == 0) { - return &entityType; - } + auto et_find_cb = [](void *user_data, const void *user_obj_data, const void *arr_obj_data) { + (void)user_data; + const char *typeCode = reinterpret_cast<const char *>(user_obj_data); + const EntityType &entityType = *reinterpret_cast<const EntityType *>(arr_obj_data); + if (entityType.handle == EntityHandle_MAX) { + return false; } + return strcmp(typeCode, entityType.entityTypeCode.val) == 0; + }; + EntityTypeHandle handle { pk_bkt_arr_find_first_handle(&et_mstr.bc, et_find_cb, NULL, typeCode) }; + if (handle == EntityTypeHandle_MAX) { + return nullptr; } - return nullptr; + return &et_mstr.bc[handle]; } EntityType *EntityType_FindByEntityHandle_Inner(EntityHandle handle) { - if (handle == EntityHandle_MAX) return nullptr; - // 2025-05-29 JCB these are wrong - if (handle.b> EntityType_BC.limits.bucketIndex) return nullptr; - if (handle.i> EntityType_BC.limits.itemIndex) return nullptr; - if (handle.b== EntityType_BC.pkeHandle.bucketIndex && handle.i>= EntityType_BC.pkeHandle.itemIndex) return nullptr; - for (pk_handle_bucket_index_T b = 0; b <= EntityType_BC.pkeHandle.bucketIndex; ++b) { - auto &bkt = EntityType_BC.buckets[b]; - long itemCount = EntityType_BC.pkeHandle.bucketIndex == b ? EntityType_BC.pkeHandle.itemIndex : EntityType_BC.limits.itemIndex; - for (pk_handle_item_index_T i = 0; i < itemCount; ++i) { - auto &entityType = bkt[i]; - if (entityType.handle == handle) { - return &entityType; - } - } + if (pk_bkt_arr_handle_validate(ECS_GetEntities(), handle) != PK_BKT_ARR_HANDLE_VALIDATION_VALID) { + return nullptr; } - return nullptr; + auto et_find_cb = [](void *user_data, const void *user_obj_data, const void *arr_obj_data) { + (void)user_data; + const EntityHandle &handle = *reinterpret_cast<const EntityHandle *>(user_obj_data); + const EntityType &entityType = *reinterpret_cast<const EntityType *>(arr_obj_data); + return entityType.handle == handle; + }; + EntityTypeHandle found_handle { pk_bkt_arr_find_first_handle(&et_mstr.bc, et_find_cb, NULL, &handle) }; + if (found_handle == EntityTypeHandle_MAX) { + return nullptr; + } + return &et_mstr.bc[found_handle]; } EntityType *EntityType_FindByEntityHandle(EntityHandle handle) { Entity_Base *base_entity; @@ -1398,35 +1400,23 @@ void EntityType_RolloverInstances(EntityType &et, CompGrBinds &grBinds) { vkFreeMemory(vkDevice, oldMemory, vkAllocator); } -pk_handle_bucket_index_T EntityType_GetBucketCount() { - return EntityType_BC.pkeHandle.bucketIndex + 1; -} - -EntityType *EntityType_GetEntityTypes(pk_handle_bucket_index_T bucketIndex, pk_handle_item_index_T &itemCount) { - assert(bucketIndex <= EntityType_BC.pkeHandle.bucketIndex); - if (bucketIndex == EntityType_BC.pkeHandle.bucketIndex) { - itemCount = EntityType_BC.pkeHandle.itemIndex; - } else { - itemCount = EntityType_BC.limits.itemIndex; - } - return EntityType_BC.buckets[bucketIndex]; +pk_bkt_arr *EntityType_GetEntityTypes() { + return &et_mstr.bc; } void EntityType_Teardown() { - for (pk_handle_bucket_index_T b = 0; b <= EntityType_BC.pkeHandle.bucketIndex; ++b) { - auto &bkt = EntityType_BC.buckets[b]; - long itemCount = EntityType_BC.pkeHandle.bucketIndex == b ? EntityType_BC.pkeHandle.itemIndex : EntityType_BC.limits.itemIndex; - for (pk_handle_item_index_T i = 0; i < itemCount; ++i) { - auto &et = bkt[i]; - if (et.modelAssetKey[0] == '\0') continue; - CompGrBinds *grBindsArr[EntityTypeDetails_MAX] = {nullptr}; - for (long k = 0; k < et.detailsCount; ++k) { - const EntityTypeDetails &etd = et.details[k]; - grBindsArr[k] = etd.grBinds; - } - EntityType_Unload(et, grBindsArr); + 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; + CompGrBinds *grBindsArr[EntityTypeDetails_MAX] = {nullptr}; + for (long k = 0; k < et.detailsCount; ++k) { + const EntityTypeDetails &etd = et.details[k]; + grBindsArr[k] = etd.grBinds; } - } - Buckets_Destroy(EntityType_BC); + EntityType_Unload(et, grBindsArr); + }; + pk_bkt_arr_iterate(&et_mstr.bc, et_iter_cb, NULL); + pk_bkt_arr_teardown(&et_mstr.bc); pk_arr_reset(&EntityTypesToTeardown); } diff --git a/src/entities.hpp b/src/entities.hpp index 8cecb63..7ce6757 100644 --- a/src/entities.hpp +++ b/src/entities.hpp @@ -37,8 +37,8 @@ struct EntityType : public Entity_Base { // PkeCallback serializeInstanceCallback; // TODO // PkeCallback deserializeInstanceCallback; // TODO }; -struct EntityTypeHandle : pk_handle {}; -constexpr EntityTypeHandle EntityTypeHandle_MAX = EntityTypeHandle{ pk_handle_MAX_constexpr }; +struct EntityTypeHandle : pk_bkt_arr_handle {}; +constexpr EntityTypeHandle EntityTypeHandle_MAX = EntityTypeHandle{ pk_bkt_arr_handle_MAX_constexpr }; void EntityType_Init(); EntityType *EntityType_FindByTypeCode(const char *typeCode); @@ -49,8 +49,7 @@ void EntityType_Load(EntityType &et); void EntityType_Tick(double delta); void EntityType_Tick_Late(double delta); void EntityType_RolloverInstances(EntityType &et, CompGrBinds &grBinds); -pk_handle_bucket_index_T EntityType_GetBucketCount(); -EntityType *EntityType_GetEntityTypes(pk_handle_bucket_index_T bucketIndex, pk_handle_item_index_T &itemCount); +pk_bkt_arr *EntityType_GetEntityTypes(); void EntityType_Teardown(); #endif /* PKE_ENTITIES_HPP */ diff --git a/src/project.cpp b/src/project.cpp index dcb84ae..cfb54f2 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -381,7 +381,10 @@ void PkeProject_Save(const char *filePath) { */ 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; // TODO 2025-05-30 JCB @@ -400,19 +403,15 @@ void PkeProject_Save(const char *filePath) { }; pk_bkt_arr_iterate(AM_GetAssets(), &AssetLoopFn::invoke, &asset_loop_cb); - const auto entBucketCount = EntityType_GetBucketCount(); - for (pk_handle_bucket_index_T b = 0; b < entBucketCount; ++b) { - pk_handle_item_index_T itemCount = 0; - auto *entities = EntityType_GetEntityTypes(b, itemCount); - for (pk_handle_item_index_T i = 0; i < itemCount; ++i) { - if (entities[i].modelAssetKey[0] == '\0') { - continue; - } - stream << PKE_PROJ_FILE_OBJ_ENTITY_TYPE << std::endl; - Proj_SerializeEntityType(stream, entities[i]); - stream << PKE_PROJ_FILE_OBJ_END << std::endl; + et_loop_cb.func = [&stream](EntityType *arr_obj_data) { + if (arr_obj_data->modelAssetKey[0] == '\0') { + return; } - } + stream << PKE_PROJ_FILE_OBJ_ENTITY_TYPE << std::endl; + Proj_SerializeEntityType(stream, *arr_obj_data); + stream << PKE_PROJ_FILE_OBJ_END << std::endl; + }; + pk_bkt_arr_iterate(EntityType_GetEntityTypes(), &ETLoopFn::invoke, &et_loop_cb); FontTypeIndex font_count; FontType *fonts = FontType_GetFonts(font_count); diff --git a/tests/pke-test.cpp b/tests/pke-test.cpp index 2e9eb9d..3f6b43b 100644 --- a/tests/pke-test.cpp +++ b/tests/pke-test.cpp @@ -6,6 +6,7 @@ #include "./pke-test-serialization.h" #include "./pke-test-static-ui.h" +#include "entities.hpp" #include "pk.h" #include "unistd.h" #include <stdio.h> @@ -35,6 +36,12 @@ int main(int argc, char *argv[]) double group_ms; pk_tmr func_tmr; + // global garbage data when dtor called on program exit + { + EntityType_Init(); + EntityType_Teardown(); + } + pke_test_get_group *group_fns[] = { pke_test_dummy_get_group, pke_test_static_ui_get_group, |
