summaryrefslogtreecommitdiff
path: root/src/scene.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-03-21 20:54:14 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-03-21 21:40:21 -0400
commit677a3cbec2f7908ee0897b97d508a6bd66a0a344 (patch)
treefc88b21dd61dbb10dd8b5c8aef73702d15514f00 /src/scene.cpp
parentcae76dd98e301a4560bb46ecb59b5952dff04149 (diff)
pke: first-pass level is a collection of scenes
Diffstat (limited to 'src/scene.cpp')
-rw-r--r--src/scene.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/scene.cpp b/src/scene.cpp
new file mode 100644
index 0000000..0e5a22c
--- /dev/null
+++ b/src/scene.cpp
@@ -0,0 +1,96 @@
+
+#include "scene.hpp"
+#include "bucketed-array.hpp"
+#include "ecs.hpp"
+#include <cstring>
+
+struct pke_scene_master {
+ BucketContainer<pke_scene, SceneHandle> bc;
+} scene_mstr;
+
+void pke_scene_master_init() {
+ Buckets_Init(scene_mstr.bc);
+}
+
+void pke_scene_master_teardown() {
+ Buckets_Destroy(scene_mstr.bc);
+}
+
+pke_scene *pke_scene_create(const char *scene_name) {
+ struct pke_scene *scene = pke_scene_get_by_name(scene_name);
+ if (scene != nullptr) {
+ 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);
+ 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];
+ ECS_CreateEntity(scene);
+
+ scene->scene_handle = scene_handle;
+ size_t offset = (strlen(scene_name) > SCENE_NAME_MAX_LEN ? strlen(scene_name) - SCENE_NAME_MAX_LEN : 0);
+ for (int i = 0; i < SCENE_NAME_MAX_LEN; ++i) {
+ scene->name[i] = scene_name[i + offset];
+ }
+ return scene;
+}
+
+struct pke_scene *pke_scene_get_by_handle(SceneHandle scene_handle) {
+ return &scene_mstr.bc.buckets[scene_handle.bucketIndex][scene_handle.itemIndex];
+}
+
+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;
+}
+
+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];
+}
+
+void pke_scene_remove(SceneHandle handle) {
+ pke_scene *scn = pke_scene_get_by_handle(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]);
+ }
+ if (scn->file_path.reserved > 0) {
+ pk_delete<char>(scn->file_path.val, scn->file_path.reserved);
+ }
+ scn->file_path = {};
+ scn->name[0] = '\0';
+ scn->scene_handle = SceneHandle_MAX;
+ pk_arr_reset(&scn->cameras);
+}
+
+void pke_scene_register_camera(SceneHandle scene_handle, CameraHandle cameraHandle) {
+ assert(scene_handle != SceneHandle_MAX);
+ assert(cameraHandle != CameraHandle_MAX);
+ pke_scene *scene = pke_scene_get_by_handle(scene_handle);
+ assert(scene != nullptr && "Failed to find scene by requested SceneHandle");
+ pk_arr_append(&scene->cameras, &cameraHandle);
+}