summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-05-29 09:17:01 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-05-29 09:17:01 -0400
commit926f5b97073f157ef30ca9dcde2d0ed33a1262f6 (patch)
tree0070b8b8f90f332a52266b3d7999deb8da9dd3e6
parentdfd1776e1af9b8da86005a294e4b086fbe6e7f4e (diff)
pke: scene: BucketContainer > pk_bkt_arr_t
-rw-r--r--src/components.hpp4
-rw-r--r--src/scene.cpp50
-rw-r--r--src/scene.hpp3
3 files changed, 25 insertions, 32 deletions
diff --git a/src/components.hpp b/src/components.hpp
index eebe43b..bf3d38a 100644
--- a/src/components.hpp
+++ b/src/components.hpp
@@ -16,13 +16,13 @@ const uint32_t ECS_UNSET_VAL_32 = 0xFFFFFFFF;
struct EntityHandle : public pk_handle { };
struct GrBindsHandle : public pk_handle { };
struct InstanceHandle : public pk_handle { };
-struct SceneHandle : public pk_handle { };
+struct SceneHandle : public pk_bkt_arr_handle { };
struct LevelHandle : public pk_handle { };
constexpr EntityHandle EntityHandle_MAX = EntityHandle{ pk_handle_MAX_constexpr };
constexpr GrBindsHandle GrBindsHandle_MAX = GrBindsHandle{ pk_handle_MAX_constexpr };
constexpr InstanceHandle InstanceHandle_MAX = InstanceHandle{ pk_handle_MAX_constexpr };
-constexpr SceneHandle SceneHandle_MAX = SceneHandle{ pk_handle_MAX_constexpr };
+constexpr SceneHandle SceneHandle_MAX = SceneHandle{ pk_bkt_arr_handle_MAX_constexpr };
constexpr LevelHandle LevelHandle_MAX = LevelHandle{ pk_handle_MAX_constexpr };
TypeSafeInt_constexpr(ENTITY_FLAGS, uint64_t, 0xFFFFFFFFFFFFFFFF);
diff --git a/src/scene.cpp b/src/scene.cpp
index 7c38385..30ef53a 100644
--- a/src/scene.cpp
+++ b/src/scene.cpp
@@ -1,7 +1,7 @@
#include "scene.hpp"
-#include "bucketed-array.hpp"
#include "ecs.hpp"
+#include "pk.h"
#include "serialization.hpp"
#include "game-settings.hpp"
@@ -11,15 +11,15 @@
#include <filesystem>
struct pke_scene_master {
- BucketContainer<pke_scene, SceneHandle> bc;
+ pk_bkt_arr_t<pke_scene> bc;
} scene_mstr;
void pke_scene_master_init() {
- Buckets_Init(scene_mstr.bc);
+ new (&scene_mstr.bc) pk_bkt_arr_t<pke_scene>{};
}
void pke_scene_master_teardown() {
- Buckets_Destroy(scene_mstr.bc);
+ scene_mstr.bc.~pk_bkt_arr_t<pke_scene>();
}
pke_scene *pke_scene_create(const char *scene_name) {
@@ -32,12 +32,13 @@ pke_scene *pke_scene_create(const char *scene_name) {
fprintf(stderr, "[pke_scene_create] failed to create scene: pke_scene::name already in use.");
return nullptr;
}
- SceneHandle scene_handle = Buckets_NewHandle(scene_mstr.bc);
+ SceneHandle scene_handle{ pk_bkt_arr_new_handle(&scene_mstr.bc) };
if (scene_handle == SceneHandle_MAX) {
fprintf(stderr, "[pke_scene_create] failed to get new scene handle from BucketContainer.");
return nullptr;
}
- scene = &scene_mstr.bc.buckets[scene_handle.bucketIndex][scene_handle.itemIndex];
+ scene = &scene_mstr.bc[scene_handle];
+ new (scene) pke_scene{};
ECS_CreateEntity(scene);
scene->scene_handle = scene_handle;
@@ -49,7 +50,7 @@ pke_scene *pke_scene_create(const char *scene_name) {
}
struct pke_scene *pke_scene_get_by_handle(SceneHandle scene_handle) {
- return &scene_mstr.bc.buckets[scene_handle.bucketIndex][scene_handle.itemIndex];
+ return &scene_mstr.bc[scene_handle];
}
// TODO remove me? Need to decide if we always read from files or if we should have a serialized representation of a scene
@@ -70,34 +71,26 @@ struct pke_scene *pke_scene_get_by_name(const char *scene_name) {
assert(scene_name != nullptr);
NULL_CHAR_ARR(safe_name, SCENE_NAME_MAX_LEN + 1);
strncpy(safe_name, scene_name, SCENE_NAME_MAX_LEN + 1);
- pk_handle_bucket_index_T b;
- pk_handle_item_index_T i, ii;
- for (b = 0; b < scene_mstr.bc.pkeHandle.bucketIndex + 1; ++b) {
- ii = scene_mstr.bc.pkeHandle.bucketIndex == b ? scene_mstr.bc.pkeHandle.itemIndex : scene_mstr.bc.limits.itemIndex;
- for (i = 0; i < ii; ++i) {
- if (memcmp(safe_name, scene_mstr.bc.buckets[b][i].name, PK_MIN(strlen(safe_name), SCENE_NAME_MAX_LEN)) == 0) {
- return &scene_mstr.bc.buckets[b][i];
- }
- }
- }
- return nullptr;
-}
-pk_handle_bucket_index_T pke_scene_get_bucket_count() {
- return scene_mstr.bc.pkeHandle.bucketIndex + 1;
+ using SceneFindFn = pk_tmpln_2<bool, const struct pke_scene *, const struct pke_scene *, const void *, const void *>;
+ SceneFindFn scene_find_cb{};
+ scene_find_cb.func = [&safe_name](const struct pke_scene *user_obj_data, const struct pke_scene *arr_obj_data) {
+ (void)user_obj_data;
+ return memcmp(safe_name, arr_obj_data->name, PK_MIN(strlen(safe_name), SCENE_NAME_MAX_LEN)) == 0;
+ };
+
+ SceneHandle handle { pk_bkt_arr_find_first_handle(&scene_mstr.bc, &SceneFindFn::invoke, &scene_find_cb, NULL) };
+ if (handle == SceneHandle_MAX) return nullptr;
+ return &scene_mstr.bc[handle];
}
-struct pke_scene *pke_scene_get_scenes(pk_handle_bucket_index_T bucket_index, pk_handle_item_index_T *item_count) {
- assert(bucket_index <= scene_mstr.bc.pkeHandle.bucketIndex);
- assert(item_count != nullptr);
- *item_count = bucket_index == scene_mstr.bc.pkeHandle.bucketIndex ? scene_mstr.bc.pkeHandle.itemIndex : scene_mstr.bc.limits.itemIndex;
- return scene_mstr.bc.buckets[bucket_index];
+pk_bkt_arr *pke_scene_get_scenes() {
+ return &scene_mstr.bc;
}
void pke_scene_remove(SceneHandle handle) {
- pke_scene *scn = pke_scene_get_by_handle(handle);
+ pke_scene *scn = &scene_mstr.bc[handle];
assert(scn != nullptr && "[pke_scene_remove] Failed to find scene by requested SceneHandle");
- // TODO mark bucket slot as open
ECS_MarkForRemoval(scn);
for (long i = 0; i < scn->cameras.next; ++i) {
PkeCamera_Destroy(scn->cameras[i]);
@@ -109,6 +102,7 @@ void pke_scene_remove(SceneHandle handle) {
scn->name[0] = '\0';
scn->scene_handle = SceneHandle_MAX;
pk_arr_reset(&scn->cameras);
+ pk_bkt_arr_free_handle(&scene_mstr.bc, handle);
}
void pke_scene_register_camera(SceneHandle scene_handle, CameraHandle cameraHandle) {
diff --git a/src/scene.hpp b/src/scene.hpp
index b34f7f7..6e76987 100644
--- a/src/scene.hpp
+++ b/src/scene.hpp
@@ -12,8 +12,7 @@ struct pke_scene *pke_scene_create(const char *scene_name);
struct pke_scene *pke_scene_get_by_handle(SceneHandle scene_handle);
struct pke_scene *pke_scene_get_by_name(const char *scene_name);
struct pke_scene *pke_scene_get_by_path(const char *file_path);
-pk_handle_bucket_index_T pke_scene_get_bucket_count();
-struct pke_scene *pke_scene_get_scenes(pk_handle_bucket_index_T bucket_index, pk_handle_item_index_T *item_count);
+pk_bkt_arr *pke_scene_get_scenes();
void pke_scene_remove(SceneHandle handle);
void pke_scene_register_camera(SceneHandle scene_handle, CameraHandle cameraHandle);