summaryrefslogtreecommitdiff
path: root/src/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.cpp')
-rw-r--r--src/game.cpp50
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();