summaryrefslogtreecommitdiff
path: root/src/camera.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-01-16 16:53:44 -0500
committerJonathan Bradley <jcb@pikum.xyz>2024-01-16 16:53:44 -0500
commit44664650a1b0660be769946cd132ef53573bbc32 (patch)
tree673056ec131183d7d1b0fdca5e7bdec337c21d32 /src/camera.cpp
parent048ed03fd977331d87ed9db4bbada382a74015e4 (diff)
checkpoint - fix camera saving and allow camera attachment but not saved
Diffstat (limited to 'src/camera.cpp')
-rw-r--r--src/camera.cpp54
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;
- }
}