diff options
Diffstat (limited to 'src/entities.cpp')
| -rw-r--r-- | src/entities.cpp | 102 |
1 files changed, 46 insertions, 56 deletions
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); } |
