summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-05-29 09:36:11 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-05-29 09:36:11 -0400
commita9bc23377bd9193cd3eb3ef2e91431d088d13d5d (patch)
tree9e809fa4bc5309fe19bfe2927433ec06b13f9cb4 /src
parent926f5b97073f157ef30ca9dcde2d0ed33a1262f6 (diff)
pke: level: BucketContainer -> pk_bkt_arr_t & name
Diffstat (limited to 'src')
-rw-r--r--src/components.hpp4
-rw-r--r--src/game.cpp10
-rw-r--r--src/level-types.hpp2
-rw-r--r--src/level.cpp64
-rw-r--r--src/level.hpp15
5 files changed, 43 insertions, 52 deletions
diff --git a/src/components.hpp b/src/components.hpp
index bf3d38a..7655863 100644
--- a/src/components.hpp
+++ b/src/components.hpp
@@ -17,13 +17,13 @@ struct EntityHandle : public pk_handle { };
struct GrBindsHandle : public pk_handle { };
struct InstanceHandle : public pk_handle { };
struct SceneHandle : public pk_bkt_arr_handle { };
-struct LevelHandle : public pk_handle { };
+struct LevelHandle : public pk_bkt_arr_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_bkt_arr_handle_MAX_constexpr };
-constexpr LevelHandle LevelHandle_MAX = LevelHandle{ pk_handle_MAX_constexpr };
+constexpr LevelHandle LevelHandle_MAX = LevelHandle{ pk_bkt_arr_handle_MAX_constexpr };
TypeSafeInt_constexpr(ENTITY_FLAGS, uint64_t, 0xFFFFFFFFFFFFFFFF);
TypeSafeInt_constexpr(COMPONENT_INSTANCE_FLAGS, uint64_t, 0xFFFFFFFFFFFFFFFF);
diff --git a/src/game.cpp b/src/game.cpp
index 24bd43d..08a392c 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -71,7 +71,7 @@ void Game_Tick(double delta) {
if (pkeSettings.rt.nextLevel != LevelHandle_MAX) {
// TODO async this
- PkeLevel *lvl = PkeLevel_Get(pkeSettings.rt.activeLevel);
+ pke_level *lvl = pke_level_get(pkeSettings.rt.activeLevel);
for (uint32_t i = 0; i < lvl->scene_instances.next; ++i) {
// TODO can't instantiate a scene that hasn't been loaded yet
/*
@@ -85,7 +85,7 @@ void Game_Tick(double delta) {
pkeSettings.rt.nextLevel = LevelHandle_MAX;
}
if (pkeSettings.rt.previousLevel != LevelHandle_MAX) {
- PkeLevel_Remove(pkeSettings.rt.previousLevel);
+ pke_level_remove(pkeSettings.rt.previousLevel);
pkeSettings.rt.previousLevel = LevelHandle_MAX;
}
@@ -123,7 +123,7 @@ void Game_Main(PKEWindowProperties windowProps, const char *executablePath) {
ECS_Init();
Physics_Init();
PkeCamera_Init();
- PkeLevel_Init();
+ pke_level_init();
pke_scene_master_init();
Game_Init();
CreateWindow(windowProps);
@@ -148,7 +148,7 @@ void Game_Main(PKEWindowProperties windowProps, const char *executablePath) {
// if we were passed only a scene name, create a faux level.
if (!pkeSettings.args.levelName && pkeSettings.args.sceneName) {
- PkeLevel *lvl = PkeLevel_Create("faux-level");
+ pke_level *lvl = pke_level_create("faux-level");
pkeSettings.rt.nextLevel = lvl->levelHandle;
scene_instance si{};
pke_scene *scn = pke_scene_get_by_path(pkeSettings.args.sceneName);
@@ -302,7 +302,7 @@ GAME_SHUTDOWN:
pke_ui_teardown();
PkeInput_Teardown();
pke_scene_master_teardown();
- PkeLevel_Teardown();
+ pke_level_teardown();
PkeCamera_Teardown();
Physics_Teardown();
ECS_Teardown();
diff --git a/src/level-types.hpp b/src/level-types.hpp
index 75bc6eb..ce0d060 100644
--- a/src/level-types.hpp
+++ b/src/level-types.hpp
@@ -15,7 +15,7 @@ struct scene_instance {
const uint8_t LEVEL_NAME_MAX_LEN = 16;
#define pke_level_name_printf_format "%16s"
-struct PkeLevel : public Entity_Base {
+struct pke_level : public Entity_Base {
char *file_path = nullptr;
struct pk_membucket *bkt = nullptr;
char name[LEVEL_NAME_MAX_LEN] = {'\0'};
diff --git a/src/level.cpp b/src/level.cpp
index 57faf80..d05009c 100644
--- a/src/level.cpp
+++ b/src/level.cpp
@@ -6,45 +6,46 @@
#include "pk.h"
struct level_mstr {
- BucketContainer<PkeLevel, LevelHandle> bc;
+ pk_bkt_arr_t<pke_level> bc;
} level_mstr;
-void PkeLevel_Init() {
- Buckets_Init(level_mstr.bc);
+void pke_level_init() {
+ new (&level_mstr.bc) pk_bkt_arr_t<pke_level>{};
}
-void PkeLevel_Teardown() {
- Buckets_Destroy(level_mstr.bc);
+void pke_level_teardown() {
+ pk_bkt_arr_teardown(&level_mstr.bc);
}
/*
-PkeLevel *PkeLevel_Get_Inner(LevelHandle handle) {
+pke_level *pke_level_Get_Inner(LevelHandle handle) {
if ( || handle.itemIndex >= level_mstr.bc.limits.itemIndex || (handle.bucketIndex == handle.bucketIndex) {
}
return &level_mstr.bc.buckets[handle.bucketIndex][handle.itemIndex];
}
*/
-PkeLevel *PkeLevel_Create(const char *levelName) {
+pke_level *pke_level_create(const char *levelName) {
NULL_CHAR_ARR(safe_name, LEVEL_NAME_MAX_LEN + 1);
size_t len = strlen(levelName);
size_t start = len <= (LEVEL_NAME_MAX_LEN - 1) ? 0 : len - (LEVEL_NAME_MAX_LEN - 1);
sprintf(safe_name, pke_level_name_printf_format, levelName + start);
- PkeLevel *lvl = PkeLevel_GetByName(levelName);
+ pke_level *lvl = pke_level_get_by_name(levelName);
if (lvl != nullptr) {
- fprintf(stderr, "[PkeLevel_Create] Failed to create new level: name already exists.");
+ fprintf(stderr, "[pke_level_Create] Failed to create new level: name already exists.");
return nullptr;
}
- LevelHandle level_handle = Buckets_NewHandle(level_mstr.bc);
+ LevelHandle level_handle { pk_bkt_arr_new_handle(&level_mstr.bc) };
if (level_handle == LevelHandle_MAX) {
- fprintf(stderr, "[PkeLevel_Create] Failed to create new level handle from BucketContainer");
+ fprintf(stderr, "[pke_level_Create] Failed to create new level handle from BucketContainer");
return nullptr;
}
lvl = &level_mstr.bc[level_handle];
+ new (lvl) pke_level{};
ECS_CreateEntity(lvl);
if (lvl->bkt == nullptr) {
@@ -54,45 +55,36 @@ PkeLevel *PkeLevel_Create(const char *levelName) {
return lvl;
}
-PkeLevel *PkeLevel_Get(LevelHandle handle) {
+pke_level *pke_level_get(LevelHandle handle) {
return &level_mstr.bc[handle];
}
-PkeLevel *PkeLevel_GetByName(const char *levelName) {
+pke_level *pke_level_get_by_name(const char *levelName) {
NULL_CHAR_ARR(safe_name, LEVEL_NAME_MAX_LEN + 1);
auto len = strlen(levelName);
auto start = len <= (LEVEL_NAME_MAX_LEN - 1) ? 0 : len - (LEVEL_NAME_MAX_LEN - 1);
sprintf(safe_name, pke_level_name_printf_format, levelName + start);
- pk_handle_bucket_index_T b;
- pk_handle_item_index_T i, ii;
- for (b = 0; b < level_mstr.bc.pkeHandle.bucketIndex; ++b) {
- ii = level_mstr.bc.pkeHandle.bucketIndex == b ? level_mstr.bc.pkeHandle.itemIndex : level_mstr.bc.limits.itemIndex;
- for (i = 0; i < ii; ++i) {
- if (memcmp(safe_name, level_mstr.bc.buckets[b][i].name, LEVEL_NAME_MAX_LEN) == 0) {
- return &level_mstr.bc.buckets[b][i];
- }
- }
- }
- return nullptr;
-}
+ using LevelFindFn = pk_tmpln_2<bool, const struct pke_level *, const struct pke_level *, const void *, const void *>;
+ LevelFindFn scene_find_cb{};
+ scene_find_cb.func = [&safe_name](const struct pke_level *user_obj_data, const struct pke_level *arr_obj_data) {
+ (void)user_obj_data;
+ return memcmp(safe_name, arr_obj_data->name, PK_MIN(strlen(safe_name), LEVEL_NAME_MAX_LEN)) == 0;
+ };
-pk_handle_bucket_index_T pke_level_get_bucket_count() {
- return level_mstr.bc.pkeHandle.bucketIndex + 1;
+ LevelHandle handle { pk_bkt_arr_find_first_handle(&level_mstr.bc, &LevelFindFn::invoke, &scene_find_cb, NULL) };
+ if (handle == LevelHandle_MAX) return nullptr;
+ return &level_mstr.bc[handle];
}
-struct PkeLevel *pke_level_get_levels(pk_handle_bucket_index_T bucket_index, pk_handle_item_index_T *item_count) {
- assert(bucket_index <= level_mstr.bc.pkeHandle.bucketIndex);
- assert(item_count != nullptr);
- *item_count = bucket_index == level_mstr.bc.pkeHandle.bucketIndex ? level_mstr.bc.pkeHandle.itemIndex : level_mstr.bc.limits.itemIndex;
- return level_mstr.bc.buckets[bucket_index];
+struct pk_bkt_arr *pke_level_get_levels() {
+ return &level_mstr.bc;
}
-void PkeLevel_Remove(LevelHandle handle) {
- PkeLevel *lvl = &level_mstr.bc[handle];
+void pke_level_remove(LevelHandle handle) {
+ pke_level *lvl = &level_mstr.bc[handle];
assert(lvl == nullptr && "Failed to find level to remove by requested LevelHandle");
- // TODO mark bucket slot as open
ECS_MarkForRemoval(lvl);
pk_bucket_reset(lvl->bkt);
- lvl->levelHandle = LevelHandle_MAX;
+ pk_bkt_arr_free_handle(&level_mstr.bc, handle);
}
diff --git a/src/level.hpp b/src/level.hpp
index 1a07914..622369a 100644
--- a/src/level.hpp
+++ b/src/level.hpp
@@ -3,13 +3,12 @@
#include "level-types.hpp"
-void PkeLevel_Init();
-void PkeLevel_Teardown();
-PkeLevel *PkeLevel_Create(const char *levelName);
-PkeLevel *PkeLevel_Get(LevelHandle handle);
-PkeLevel *PkeLevel_GetByName(const char *levelName);
-pk_handle_bucket_index_T pke_level_get_bucket_count();
-struct PkeLevel *pke_level_get_levels(pk_handle_bucket_index_T bucket_index, pk_handle_item_index_T *item_count);
-void PkeLevel_Remove(LevelHandle handle);
+void pke_level_init();
+void pke_level_teardown();
+pke_level *pke_level_create(const char *levelName);
+pke_level *pke_level_get(LevelHandle handle);
+pke_level *pke_level_get_by_name(const char *levelName);
+struct pk_bkt_arr *pke_level_get_levels();
+void pke_level_remove(LevelHandle handle);
#endif /* PKE_LEVEL_HPP */