diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-29 09:17:01 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-29 09:17:01 -0400 |
| commit | 926f5b97073f157ef30ca9dcde2d0ed33a1262f6 (patch) | |
| tree | 0070b8b8f90f332a52266b3d7999deb8da9dd3e6 /src | |
| parent | dfd1776e1af9b8da86005a294e4b086fbe6e7f4e (diff) | |
pke: scene: BucketContainer > pk_bkt_arr_t
Diffstat (limited to 'src')
| -rw-r--r-- | src/components.hpp | 4 | ||||
| -rw-r--r-- | src/scene.cpp | 50 | ||||
| -rw-r--r-- | src/scene.hpp | 3 |
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); |
