#include "camera.hpp" #include "memory.hpp" 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), .type = PKE_CAMERA_TYPE_ORTHOGONAL, .orientation = PKE_CAMERA_ORIENTATION_TARGET, .stale = PKE_CAMERA_STALE_ALL, }; PkeCamera *ActiveCamera = &NullCamera; const PkeHandleItemIndex_T 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 cameraHandle{Buckets_NewHandle(MAX_CAMERAS_PER_BUCKET, Camera_BucketContainer, moved)}; if (moved) { ActiveCamera = PkeCamera_Get(activeHandle); } auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex].cameras[cameraHandle.itemIndex]; cam.handle = cameraHandle; return cam; } PkeCamera *PkeCamera_Get(CameraHandle cameraHandle) { assert(cameraHandle != CameraHandle_MAX); return &Camera_BucketContainer.buckets[cameraHandle.bucketIndex].cameras[cameraHandle.itemIndex]; } void PkeCamera_Destroy(CameraHandle cameraHandle) { assert(cameraHandle != CameraHandle_MAX); auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex].cameras[cameraHandle.itemIndex]; 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.pkeHandle.bucketIndex + 1; } PkeCamera *PkeCamera_GetCameras(int64_t bucketIndex, int64_t &count) { if (Camera_BucketContainer.pkeHandle.bucketIndex == bucketIndex) { count = Camera_BucketContainer.pkeHandle.itemIndex; } 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); }