diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-28 17:40:45 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-28 17:40:45 -0400 |
| commit | dfd1776e1af9b8da86005a294e4b086fbe6e7f4e (patch) | |
| tree | 7271607e2a56343200df38341043584771350d1a /src/camera.cpp | |
| parent | 3a81898eed7eed7b220d280a8acc9c9cdceac7c0 (diff) | |
pke: camera: replace BucketContainer -> pk_bkt_arr
Diffstat (limited to 'src/camera.cpp')
| -rw-r--r-- | src/camera.cpp | 111 |
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); } |
