diff options
Diffstat (limited to 'src/game.cpp')
| -rw-r--r-- | src/game.cpp | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/src/game.cpp b/src/game.cpp index 0784ce9..ab7d211 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -18,6 +18,7 @@ #include "plugins.hpp" #include "project.hpp" #include "scene.hpp" +#include "serialization.hpp" #include "static-ui.hpp" #include "thread-pool.hpp" #include "window.hpp" @@ -27,6 +28,7 @@ #include <BulletCollision/NarrowPhaseCollision/btRaycastCallback.h> #include <GLFW/glfw3.h> #include <cstring> +#include <fstream> #include <thread> const char *levelName = "demo-level"; @@ -71,10 +73,9 @@ void Game_RecordImGui() { void Game_Tick(double delta) { pk_mem_bucket_reset(pkeSettings.mem_bkt.game_transient); - if (pkeSettings.rt.nextLevel != LevelHandle_MAX) { + if (pkeSettings.rt.nextLevel != nullptr) { // TODO async this - pke_level *lvl = pke_level_get(pkeSettings.rt.activeLevel); - for (uint32_t i = 0; i < lvl->scene_instances.next; ++i) { + for (uint32_t i = 0; i < pkeSettings.rt.nextLevel->scene_instances.next; ++i) { // TODO can't instantiate a scene that hasn't been loaded yet /* struct pke_scene *scene = pke_scene_get_by_handle(lvl->scene_instances[i].scene_handle); @@ -83,17 +84,20 @@ void Game_Tick(double delta) { } */ } + pkeSettings.rt.previousLevel = pkeSettings.rt.activeLevel; pkeSettings.rt.activeLevel = pkeSettings.rt.nextLevel; - pkeSettings.rt.nextLevel = LevelHandle_MAX; + pkeSettings.rt.nextLevel = nullptr; + if (pkeSettings.rt.activeLevel->pke_cb_spinup.func != nullptr) { + pkeSettings.rt.activeLevel->pke_cb_spinup.func(); + } } - if (pkeSettings.rt.previousLevel != LevelHandle_MAX) { - pke_level_remove(pkeSettings.rt.previousLevel); - pkeSettings.rt.previousLevel = LevelHandle_MAX; + if (pkeSettings.rt.previousLevel != nullptr) { + pke_level_teardown(pkeSettings.rt.previousLevel); + pkeSettings.rt.previousLevel = nullptr; } /* - * ECS_Tick_Early() gets called first because it updates the public - * `EntitiesToBeRemoved` for all other ticks to use. + * ECS_Tick_Early() gets called first for GC */ ECS_Tick_Early(delta); @@ -109,6 +113,10 @@ void Game_Tick(double delta) { } } + if (pkeSettings.rt.activeLevel->pke_cb_tick.func != nullptr) { + pkeSettings.rt.activeLevel->pke_cb_tick.func(); + } + PkeCamera_Tick(delta); pke_audio_tick(delta); @@ -153,18 +161,28 @@ 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) { + if (!pkeSettings.args.levelName) { // TODO uuids pke_level *lvl = pke_level_create("faux-level", pk_uuid_zed, pk_uuid_zed); - pkeSettings.rt.nextLevel = lvl->levelHandle; + pkeSettings.rt.activeLevel = lvl; + } + + if (!pkeSettings.args.levelName && pkeSettings.args.sceneName) { scene_instance si{}; - pke_scene *scn = pke_scene_get_by_path(pkeSettings.args.sceneName); - if (scn == nullptr) { - fprintf(stdout, "[Game_Main] Did not find scene by name: '%s'\n", pkeSettings.args.sceneName); + pke_scene *scene; + std::ifstream f(pkeSettings.args.sceneName); + if (!f.is_open()) { + fprintf(stdout, "[Game_Main] Did not find scene by name specified in arg: '%s'\n", pkeSettings.args.sceneName); goto GAME_SHUTDOWN; } - si.scene_handle = scn->scene_handle; - pk_arr_append_t(&lvl->scene_instances, si); + srlztn_deserialize_helper *h = pke_deserialize_init(pkeSettings.rt.activeLevel, pkeSettings.mem_bkt.game_transient); + // 2025-09-09 JCB Scenes no longer contain anything so I'm not sure there's a reason to create one here. + // spit-balling here, maybe "scene" files should be assets and not much more. + scene = pke_scene_create(pkeSettings.args.sceneName); + pke_deserialize_scene_from_stream(f, h); + pke_deserialize_teardown(h); + si.scene_handle = scene->scene_handle; + pk_arr_append_t(&pkeSettings.rt.activeLevel->scene_instances, si); } GameTimePoint lastTimePoint = pkeSettings.steadyClock.now(); |
