summaryrefslogtreecommitdiff
path: root/src/camera.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-05-28 17:40:45 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-05-28 17:40:45 -0400
commitdfd1776e1af9b8da86005a294e4b086fbe6e7f4e (patch)
tree7271607e2a56343200df38341043584771350d1a /src/camera.cpp
parent3a81898eed7eed7b220d280a8acc9c9cdceac7c0 (diff)
pke: camera: replace BucketContainer -> pk_bkt_arr
Diffstat (limited to 'src/camera.cpp')
-rw-r--r--src/camera.cpp111
1 files changed, 52 insertions, 59 deletions
diff --git a/src/camera.cpp b/src/camera.cpp
index e734994..14f6694 100644
--- a/src/camera.cpp
+++ b/src/camera.cpp
@@ -6,14 +6,14 @@
#include "ecs.hpp"
#include "math-helpers.hpp"
#include "physics.hpp"
+#include "pk.h"
#include "vendor-glm-include.hpp"
PkeCamera NullCamera {};
CompInstance NullCameraInstance{};
PkeCamera *ActiveCamera = &NullCamera;
-const pk_handle_item_index_T MAX_CAMERAS_PER_BUCKET = 32;
-BucketContainer<PkeCamera, CameraHandle> Camera_BucketContainer{};
+pk_bkt_arr_t<PkeCamera> bktc_cameras{};
btSphereShape CameraShape{1.f};
@@ -46,10 +46,10 @@ PkeCamera &PkeCamera_Register_Inner(PkeCamera &cam, CompInstance &inst, const In
}
PkeCamera &PkeCamera_Register(pk_uuid uuid, const InstPos &instPos) {
- CameraHandle cameraHandle{Buckets_NewHandle(Camera_BucketContainer)};
+ CameraHandle cameraHandle{pk_bkt_arr_new_handle(&bktc_cameras)};
CompInstance *inst;
- auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex];
+ auto &cam = bktc_cameras[cameraHandle];
new (&cam) PkeCamera{};
cam.uuid = uuid;
@@ -62,26 +62,27 @@ PkeCamera &PkeCamera_Register(pk_uuid uuid, const InstPos &instPos) {
PkeCamera *PkeCamera_Get(CameraHandle cameraHandle) {
assert(cameraHandle != CameraHandle_MAX);
- return &Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex];
+ return &bktc_cameras[cameraHandle];
}
PkeCamera *PkeCamera_Get(EntityHandle handle) {
- assert(handle != EntityHandle_MAX);
- for (pk_handle_bucket_index_T b = 0; b <= Camera_BucketContainer.pkeHandle.bucketIndex; ++b) {
- auto &bkt = Camera_BucketContainer.buckets[b];
- long itemCount = Camera_BucketContainer.pkeHandle.bucketIndex == b ? Camera_BucketContainer.pkeHandle.itemIndex : Camera_BucketContainer.limits.itemIndex;
- for (pk_handle_item_index_T i = 0; i < itemCount; ++i) {
- auto &cam = bkt[i];
- if (cam.handle == handle)
- return &Camera_BucketContainer.buckets[cam.camHandle.bucketIndex][cam.camHandle.itemIndex];
- }
+ using CamFindFn = pk_tmpln_2<bool, const PkeCamera*, const PkeCamera*, const void*, const void*>;
+ CamFindFn cam_find_cb{};
+
+ cam_find_cb.func = [handle](const PkeCamera *user_obj_data, const PkeCamera *arr_obj_data) {
+ (void)user_obj_data;
+ return arr_obj_data->handle == handle;
+ };
+ pk_bkt_arr_handle cam_handle = pk_bkt_arr_find_first_handle(&bktc_cameras, &CamFindFn::invoke, &cam_find_cb, NULL);
+ if (cam_handle == CameraHandle_MAX) {
+ return nullptr;
}
- return nullptr;
+ return &bktc_cameras[cam_handle];
}
void PkeCamera_TargetInstance(CameraHandle cameraHandle, CompInstance *inst) {
assert(cameraHandle != CameraHandle_MAX);
- auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex];
+ auto &cam = bktc_cameras[cameraHandle];
CompInstance *selfInstance = ECS_GetInstance(cam.phys.instHandle);
if (cam.phys.constraint != nullptr && cam.phys.constraint != CAFE_BABE(btTypedConstraint)) {
@@ -131,7 +132,7 @@ void PkeCamera_TargetInstance(CameraHandle cameraHandle, CompInstance *inst) {
void PkeCamera_UntargetInstance(CameraHandle cameraHandle) {
assert(cameraHandle != CameraHandle_MAX);
- auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex];
+ auto &cam = bktc_cameras[cameraHandle];
BtDynamicsWorld->removeConstraint(cam.phys.constraint);
pk_delete<btTypedConstraint>(cam.phys.constraint, MemBkt_Bullet);
cam.phys.constraint = CAFE_BABE(btTypedConstraint);
@@ -140,23 +141,22 @@ void PkeCamera_UntargetInstance(CameraHandle cameraHandle) {
void PkeCamera_SetPrimary(CameraHandle cameraHandle) {
assert(cameraHandle != CameraHandle_MAX);
- auto &primaryCam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex];
- for (pk_handle_bucket_index_T b = 0; b <= Camera_BucketContainer.pkeHandle.bucketIndex; ++b) {
- auto &bkt = Camera_BucketContainer.buckets[b];
- long itemCount = Camera_BucketContainer.pkeHandle.bucketIndex == b ? Camera_BucketContainer.pkeHandle.itemIndex : Camera_BucketContainer.limits.itemIndex;
- for (pk_handle_item_index_T i = 0; i < itemCount; ++i) {
- auto *cam = &bkt[i];
- if (cam->parentHandle != primaryCam.parentHandle) {
- continue;
- }
- cam->isPrimary = cam->camHandle == cameraHandle;
- }
- }
+ auto check_stale = [](void *user_data, void *cam_ptr) {
+ CameraHandle handle = *reinterpret_cast<CameraHandle*>(user_data);
+ auto &cam = *reinterpret_cast<PkeCamera*>(cam_ptr);
+ // TODO 2025-05-28 JCB
+ // There was some speculative scene filtering happening here.
+ // I removed it because it was comparing entity parents and I don't
+ // think that is accurate.
+ // Instead, should be a per-viewport or per-world check?
+ cam.isPrimary = (cam.camHandle == handle);
+ };
+ pk_bkt_arr_iterate(&bktc_cameras, check_stale, &cameraHandle);
}
void PkeCamera_Destroy(CameraHandle cameraHandle) {
assert(cameraHandle != CameraHandle_MAX);
- auto *camPtr = &Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex];
+ auto *camPtr = &bktc_cameras[cameraHandle];
auto &cam = *camPtr;
if (cam.phys.constraint != nullptr && cam.phys.constraint != CAFE_BABE(btTypedConstraint)) {
@@ -175,21 +175,12 @@ void PkeCamera_Destroy(CameraHandle cameraHandle) {
cam.phys.constraint = CAFE_BABE(btTypedConstraint);
}
-int64_t PkeCamera_GetBucketCount() {
- return Camera_BucketContainer.pkeHandle.bucketIndex + 1;
-}
-
-PkeCamera *PkeCamera_GetCameras(pk_handle_bucket_index_T bucketIndex, pk_handle_item_index_T &count) {
- if (Camera_BucketContainer.pkeHandle.bucketIndex == bucketIndex) {
- count = Camera_BucketContainer.pkeHandle.itemIndex;
- } else {
- count = MAX_CAMERAS_PER_BUCKET;
- }
- return Camera_BucketContainer.buckets[bucketIndex];
+pk_bkt_arr &PkeCamera_GetPkBktArr() {
+ return bktc_cameras;
}
void PkeCamera_Init() {
- Buckets_Init(Camera_BucketContainer, MAX_CAMERAS_PER_BUCKET);
+ new (&bktc_cameras) pk_bkt_arr_t<PkeCamera>{};
NullCamera.type = PKE_CAMERA_TYPE_ORTHOGONAL;
NullCamera.view = PKE_CAMERA_VIEW_TARGET;
NullCamera.stale = PKE_CAMERA_STALE_ALL;
@@ -207,7 +198,7 @@ void PkeCamera_Teardown() {
pk_delete<btRigidBody>(NullCameraInstance.bt.rigidBody, MemBkt_Bullet);
NullCameraInstance.bt.motionState = CAFE_BABE(btDefaultMotionState);
NullCameraInstance.bt.rigidBody = CAFE_BABE(btRigidBody);
- Buckets_Destroy(Camera_BucketContainer);
+ bktc_cameras.~pk_bkt_arr_t<PkeCamera>();
}
void PkeCamera_Tick(double delta) {
@@ -222,23 +213,25 @@ void PkeCamera_Tick(double delta) {
* See the camera serializer for more.
*/
(void)delta;
- for (pk_handle_bucket_index_T b = 0; b <= Camera_BucketContainer.pkeHandle.bucketIndex; ++b) {
- auto &bkt = Camera_BucketContainer.buckets[b];
- long itemCount = Camera_BucketContainer.pkeHandle.bucketIndex == b ? Camera_BucketContainer.pkeHandle.itemIndex : Camera_BucketContainer.limits.itemIndex;
- for (pk_handle_item_index_T i = 0; i < itemCount; ++i) {
- auto &cam = bkt[i];
- if (cam.handle == EntityHandle_MAX || cam.phys.instHandle == InstanceHandle_MAX) {
- continue;
- }
- CompInstance *inst = ECS_GetInstance(cam.phys.instHandle);
- assert(inst != nullptr);
- if (inst->isNeedingUpdated == true) {
- cam.stale = cam.stale | PKE_CAMERA_STALE_POSROT;
- inst->isNeedingUpdated = false;
- }
- if (cam.phys.target_inst_uuid == pk_uuid_zed) continue;
+ auto check_stale = [](void *user_data, void *cam_ptr) {
+ (void)user_data;
+ auto &cam = *reinterpret_cast<PkeCamera*>(cam_ptr);
+ /* 2025-05-28 JCB - if you see me, delete me, i wasn't needed
+ if (cam.handle == EntityHandle_MAX || cam.phys.instHandle == InstanceHandle_MAX) {
+ return;
+ }
+ */
+ CompInstance *inst = ECS_GetInstance(cam.phys.instHandle);
+ assert(inst != nullptr);
+ if (inst->isNeedingUpdated == true) {
cam.stale = cam.stale | PKE_CAMERA_STALE_POSROT;
+ inst->isNeedingUpdated = false;
}
- }
+ if (cam.phys.target_inst_uuid == pk_uuid_zed) {
+ return;
+ }
+ cam.stale = cam.stale | PKE_CAMERA_STALE_POSROT;
+ };
+ pk_bkt_arr_iterate(&bktc_cameras, check_stale, NULL);
}