diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-06 15:31:08 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-06 15:31:08 -0500 |
| commit | 04c97b83505e685d590c28c7605128716f3333ff (patch) | |
| tree | d1909a239caef10d48026a6f41242e386a200ad5 /src/camera.cpp | |
| parent | 8d27ab131e0829fb847c93529628e4751b356b5f (diff) | |
cameras can be rigstered
Diffstat (limited to 'src/camera.cpp')
| -rw-r--r-- | src/camera.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
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<CameraBucket, CameraHandle_T> Camera_BucketContainer{}; + +PkeCamera &PkeCamera_Register() { + bool moved = false; + CameraHandle activeHandle = ActiveCamera->handle; + CameraHandle_T cameraHandle_T{Buckets_NewHandle<CameraBucket>(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_T>(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_T>(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); +} + |
