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 | |
| parent | 8d27ab131e0829fb847c93529628e4751b356b5f (diff) | |
cameras can be rigstered
| -rw-r--r-- | src/camera.cpp | 66 | ||||
| -rw-r--r-- | src/camera.hpp | 27 |
2 files changed, 87 insertions, 6 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); +} + diff --git a/src/camera.hpp b/src/camera.hpp index c699767..94923b7 100644 --- a/src/camera.hpp +++ b/src/camera.hpp @@ -1,3 +1,5 @@ +#ifndef PKE_CAMERA_HPP +#define PKE_CAMERA_HPP #include "macros.hpp" #include "vendor/glm_include.hpp" @@ -8,6 +10,8 @@ TypeSafeInt_Const_Expr(PkeCameraType, uint8_t, 0xFF); TypeSafeInt_Const_Expr(PkeCameraOrientation, uint8_t, 0xFF); TypeSafeInt_Const_Expr(PkeCameraStaleFlags, uint8_t, 0xFF); +TypeSafeInt_H(CameraHandle, uint64_t, UINT64_MAX); + const PkeCameraType PKE_CAMERA_TYPE_PERSPECTIVE = PkeCameraType{1 << 0}; const PkeCameraType PKE_CAMERA_TYPE_ORTHOGONAL = PkeCameraType{1 << 1}; @@ -20,14 +24,25 @@ const PkeCameraStaleFlags PKE_CAMERA_STALE_ORIENTATION = PkeCameraStaleFlags{1 < const PkeCameraStaleFlags PKE_CAMERA_STALE_ALL = PkeCameraStaleFlags{0xFF}; struct PkeCamera { - glm::vec3 pos; - glm::quat rot; - glm::vec3 target; - PkeCameraType type; - PkeCameraOrientation orientation; - PkeCameraStaleFlags stale; + CameraHandle handle = CameraHandle{0}; + glm::vec3 pos = glm::vec3(0); + glm::quat rot = glm::quat{}; + glm::vec3 target = glm::vec3(0); + PkeCameraType type = PkeCameraType_MAX; + PkeCameraOrientation orientation = PkeCameraOrientation_MAX; + PkeCameraStaleFlags stale = PkeCameraStaleFlags_MAX; }; extern PkeCamera NullCamera; extern PkeCamera *ActiveCamera; +void PkeCamera_Init(); +PkeCamera &PkeCamera_Register(); +PkeCamera *PkeCamera_Get(CameraHandle handle); +int64_t PkeCamera_GetBucketCount(); +PkeCamera *PkeCamera_GetCameras(int64_t bucketIndex, int64_t &count); +void PkeCamera_Destroy(CameraHandle handle); +void PkeCamera_Teardown(); + +void PkeCamera_Unregister(uint64_t id); +#endif /* PKE_CAMERA_HPP */ |
