diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-03-21 20:54:14 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-03-21 21:40:21 -0400 |
| commit | 677a3cbec2f7908ee0897b97d508a6bd66a0a344 (patch) | |
| tree | fc88b21dd61dbb10dd8b5c8aef73702d15514f00 /src/scene.cpp | |
| parent | cae76dd98e301a4560bb46ecb59b5952dff04149 (diff) | |
pke: first-pass level is a collection of scenes
Diffstat (limited to 'src/scene.cpp')
| -rw-r--r-- | src/scene.cpp | 96 |
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); +} |
