From 04c97b83505e685d590c28c7605128716f3333ff Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Wed, 6 Dec 2023 15:31:08 -0500 Subject: cameras can be rigstered --- src/camera.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'src/camera.cpp') diff --git a/src/camera.cpp b/src/camera.cpp index d2c1b71..f5e1cfc 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -1,7 +1,11 @@ #include "camera.hpp" +#include "memory.hpp" + +TypeSafeInt_B(CameraHandle); PkeCamera NullCamera { + .handle = CameraHandle_MAX, .pos = glm::vec3(3.f, 3.f, 3.f), .rot = glm::quat(1.f, 0.f, 0.f, 0.f), .target = glm::vec3(0.f), @@ -11,3 +15,65 @@ PkeCamera NullCamera { }; PkeCamera *ActiveCamera = &NullCamera; +const long MAX_CAMERAS_PER_BUCKET = 32; +struct CameraBucket { + PkeCamera cameras[MAX_CAMERAS_PER_BUCKET]; +}; +BucketContainer Camera_BucketContainer{}; + +PkeCamera &PkeCamera_Register() { + bool moved = false; + CameraHandle activeHandle = ActiveCamera->handle; + CameraHandle_T cameraHandle_T{Buckets_NewHandle(MAX_CAMERAS_PER_BUCKET, Camera_BucketContainer, moved)}; + if (moved) { + ActiveCamera = PkeCamera_Get(activeHandle); + } + auto b = Buckets_GetBucketIndex(cameraHandle_T); + auto c = Buckets_GetItemIndex(cameraHandle_T); + auto &cam = Camera_BucketContainer.buckets[b].cameras[c]; + cam.handle = CameraHandle{cameraHandle_T}; + return cam; +} + +PkeCamera *PkeCamera_Get(CameraHandle cameraHandle) { + CameraHandle_T cameraHandle_T = static_cast(cameraHandle); + auto b = Buckets_GetBucketIndex(cameraHandle_T); + auto c = Buckets_GetItemIndex(cameraHandle_T); + return &Camera_BucketContainer.buckets[b].cameras[c]; +} + +void PkeCamera_Destroy(CameraHandle cameraHandle) { + CameraHandle_T cameraHandle_T = static_cast(cameraHandle); + auto b = Buckets_GetBucketIndex(cameraHandle_T); + auto c = Buckets_GetItemIndex(cameraHandle_T); + auto &cam = Camera_BucketContainer.buckets[b].cameras[c]; + cam.handle = CameraHandle_MAX; + cam.pos = glm::vec3(0); + cam.rot = glm::quat{}; + cam.target = glm::vec3(0); + cam.type = PkeCameraType_MAX; + cam.orientation = PkeCameraOrientation_MAX; + cam.stale = PkeCameraStaleFlags_MAX; +} + +int64_t PkeCamera_GetBucketCount() { + return Camera_BucketContainer.bucketCounter + 1; +} + +PkeCamera *PkeCamera_GetCameras(int64_t bucketIndex, int64_t &count) { + if (Camera_BucketContainer.bucketCounter == bucketIndex) { + count = Camera_BucketContainer.itemCounter >> 32; + } else { + count = MAX_CAMERAS_PER_BUCKET; + } + return Camera_BucketContainer.buckets[bucketIndex].cameras; +} + +void PkeCamera_Init() { + Buckets_Init(Camera_BucketContainer); +} + +void PkeCamera_Teardown() { + Buckets_Destroy(Camera_BucketContainer); +} + -- cgit v1.2.3