diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2024-01-16 16:53:44 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2024-01-16 16:53:44 -0500 |
| commit | 44664650a1b0660be769946cd132ef53573bbc32 (patch) | |
| tree | 673056ec131183d7d1b0fdca5e7bdec337c21d32 /src/camera.cpp | |
| parent | 048ed03fd977331d87ed9db4bbada382a74015e4 (diff) | |
checkpoint - fix camera saving and allow camera attachment but not saved
Diffstat (limited to 'src/camera.cpp')
| -rw-r--r-- | src/camera.cpp | 54 |
1 files changed, 26 insertions, 28 deletions
diff --git a/src/camera.cpp b/src/camera.cpp index e66a6cf..d22f4e4 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -72,6 +72,11 @@ void PkeCamera_AttachToInstance(CameraHandle cameraHandle, CompInstance *inst) { assert(cameraHandle != CameraHandle_MAX); auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex]; + if (cam.phys.constraint != nullptr && cam.phys.constraint != CAFE_BABE(btTypedConstraint)) { + CompInstance *activeInst = reinterpret_cast<CompInstance *>(cam.phys.constraint->getRigidBodyB().getUserIndex()); + PkeCamera_DetachFromInstance(cameraHandle, activeInst); + } + btVector3 cameraOffset(0.f, -10.f, -10.f); btTransform trfm; @@ -106,21 +111,16 @@ void PkeCamera_DetachFromInstance(CameraHandle cameraHandle, CompInstance *inst) void PkeCamera_Destroy(CameraHandle cameraHandle) { assert(cameraHandle != CameraHandle_MAX); - auto &cam = Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex]; - - BtDynamicsWorld->removeRigidBody(cam.phys.inst->bt.rigidBody); - Pke_Delete<btRigidBody>(cam.phys.inst->bt.rigidBody, MemBkt_Bullet); - cam.phys.inst->bt.rigidBody = CAFE_BABE(btRigidBody); - - Pke_Delete<btDefaultMotionState>(cam.phys.inst->bt.motionState, MemBkt_Bullet); - cam.phys.inst->bt.motionState = CAFE_BABE(btDefaultMotionState); + auto *camPtr = &Camera_BucketContainer.buckets[cameraHandle.bucketIndex][cameraHandle.itemIndex]; + auto &cam = *camPtr; if (cam.phys.constraint != nullptr && cam.phys.constraint != CAFE_BABE(btTypedConstraint)) { + // reminder: this is not currently handled by ECS BtDynamicsWorld->removeConstraint(cam.phys.constraint); Pke_Delete<btTypedConstraint>(cam.phys.constraint, MemBkt_Bullet); } - ECS_MarkForRemoval(&cam); + ECS_MarkForRemoval(camPtr); cam.camHandle = CameraHandle_MAX; cam.pos = glm::vec3(0); cam.rot = glm::quat{}; @@ -154,7 +154,16 @@ void PkeCamera_Teardown() { } void PkeCamera_Tick(double delta) { - /* + /* 2024-01-16 - JCB - This seems excessive to loop through every camera and do this. + * I think this could be simplified, but it might be premature optimization. + * Why we're looping all: + * - To avoid any weird scenarios where the active camera is changed and + * 1 frame the camera is in the wrong position. + * - To prevent various 'saves' that save camera positions from saving bad positional data + * It might be possible to handle these two scenarios explicitly, or it + * could be that removing pos and rot from the camera would make this unnecessary? + * See the camera serializer for more. + */ for (PkeHandleBucketIndex_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; @@ -168,25 +177,14 @@ void PkeCamera_Tick(double delta) { cam.phys.constraint->getRigidBodyB().getMotionState()->getWorldTransform(trfm); BulletToGlm(trfm.getOrigin(), cam.target); } - cam.phys.inst->bt.motionState->getWorldTransform(trfm); - BulletToGlm(trfm.getOrigin(), cam.pos); - cam.stale = cam.stale | PKE_CAMERA_STALE_POSROT; - cam.phys.inst->isNeedingUpdated = false; + if (cam.phys.inst != nullptr && cam.phys.inst != CAFE_BABE(CompInstance)) { + cam.phys.inst->bt.motionState->getWorldTransform(trfm); + BulletToGlm(trfm.getOrigin(), cam.pos); + BulletToGlm(trfm.getRotation(), cam.rot); + cam.stale = cam.stale | PKE_CAMERA_STALE_POSROT; + cam.phys.inst->isNeedingUpdated = false; + } } } - */ - btTransform trfm; - if (ActiveCamera->phys.constraint != nullptr && ActiveCamera->phys.constraint != CAFE_BABE(btTypedConstraint)) { - ActiveCamera->phys.constraint->getRigidBodyB().getMotionState()->getWorldTransform(trfm); - BulletToGlm(trfm.getOrigin(), ActiveCamera->target); - ActiveCamera->stale = ActiveCamera->stale | PKE_CAMERA_STALE_ROT; - } - if (ActiveCamera->phys.inst != nullptr && ActiveCamera->phys.inst != CAFE_BABE(CompInstance)) { - ActiveCamera->phys.inst->bt.motionState->getWorldTransform(trfm); - BulletToGlm(trfm.getOrigin(), ActiveCamera->pos); - BulletToGlm(trfm.getRotation(), ActiveCamera->rot); - ActiveCamera->stale = ActiveCamera->stale | PKE_CAMERA_STALE_POSROT; - ActiveCamera->phys.inst->isNeedingUpdated = false; - } } |
