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