diff options
| -rw-r--r-- | editor/editor.cpp | 28 | ||||
| -rw-r--r-- | src/components.hpp | 4 | ||||
| -rw-r--r-- | src/game.cpp | 10 | ||||
| -rw-r--r-- | src/level-types.hpp | 2 | ||||
| -rw-r--r-- | src/level.cpp | 64 | ||||
| -rw-r--r-- | src/level.hpp | 15 |
6 files changed, 56 insertions, 67 deletions
diff --git a/editor/editor.cpp b/editor/editor.cpp index 38e2828..057152f 100644 --- a/editor/editor.cpp +++ b/editor/editor.cpp @@ -1390,24 +1390,22 @@ void RecordImGuiLevels() { ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg }; - if (ImGui::BeginTable("PkeLevels", 3, tableFlags)) { + if (ImGui::BeginTable("pke_levels", 3, tableFlags)) { ImGui::TableSetupColumn("Name"); ImGui::TableSetupColumn("Handle"); ImGui::TableHeadersRow(); - pk_handle_bucket_index_T b, bb; - pk_handle_item_index_T i, ii; - PkeLevel *lvls; - bb = pke_level_get_bucket_count(); - for (b = 0; b < bb; ++b) { - lvls = pke_level_get_levels(b, &ii); - for (i = 0; i < ii; ++i) { - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - ImGui::Text("%s", lvls[i].name); - ImGui::TableSetColumnIndex(1); - ImGui::Text("0x%08X 0x%08X", b, i); - } - } + + auto level_iter_cb = [](void *user_data, void *arr_obj_data) { + (void)user_data; + pke_level *lvl = reinterpret_cast<pke_level*>(arr_obj_data); + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::Text("%s", lvl->name); + ImGui::TableSetColumnIndex(1); + ImGui::Text("0x%08X 0x%08X", lvl->levelHandle.b, lvl->levelHandle.i); + }; + pk_bkt_arr_iterate(pke_level_get_levels(), level_iter_cb, NULL); + ImGui::EndTable(); } ImGui::End(); 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 */ |
