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 | |
| parent | 048ed03fd977331d87ed9db4bbada382a74015e4 (diff) | |
checkpoint - fix camera saving and allow camera attachment but not saved
| -rw-r--r-- | editor/editor.cpp | 10 | ||||
| -rw-r--r-- | src/camera.cpp | 54 | ||||
| -rw-r--r-- | src/camera.hpp | 2 |
3 files changed, 36 insertions, 30 deletions
diff --git a/editor/editor.cpp b/editor/editor.cpp index f676e0c..882b5f5 100644 --- a/editor/editor.cpp +++ b/editor/editor.cpp @@ -1092,6 +1092,12 @@ void RecordImGui_CompInstPos(bool readonly, CompInstance *component) { ImGui::InputScalar("Phys - Rigid Body", ImGuiDataType_U64, &component->bt.rigidBody, nullptr, nullptr, "0x%016lX", ImGuiInputTextFlags_ReadOnly); ImGui::InputScalar("Phys - Motion State", ImGuiDataType_U64, &component->bt.motionState, nullptr, nullptr, "0x%016lX", ImGuiInputTextFlags_ReadOnly); + ImGui::BeginDisabled(ActiveCamera->handle == component->entHandle || ActiveCamera->phys.inst == nullptr || ActiveCamera->phys.inst == CAFE_BABE(CompInstance)); + if (ImGui::Button("Attach Active Camera")) { + PkeCamera_AttachToInstance(ActiveCamera->camHandle, component); + } + ImGui::EndDisabled(); + if (changed) { instPos.posRot.setOrigin(pos); eul = glm::radians(eul); @@ -1152,12 +1158,12 @@ void BuildDirRecursive(const std::filesystem::directory_entry &de, fsEntry *dirF auto &entry = dirFsEntry == nullptr ? fsEntries.Push() : dirFsEntry->children.Push(); auto fullPath = std::filesystem::absolute(de.path()); auto len = strlen(fullPath.c_str()); - // leaky + // TODO leaky entry.path = Pke_New<char>(len + 1); memset(entry.path, '\0', len + 1); memcpy(entry.path, fullPath.c_str(), len); len = strlen(fullPath.filename().c_str()); - // leaky + // TODO leaky entry.name = Pke_New<char>(len + 1); memset(entry.name, '\0', len + 1); memcpy(entry.name, fullPath.filename().c_str(), len); 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; - } } diff --git a/src/camera.hpp b/src/camera.hpp index 1adfbc7..ed21185 100644 --- a/src/camera.hpp +++ b/src/camera.hpp @@ -48,6 +48,8 @@ extern PkeCamera *ActiveCamera; void PkeCamera_Init(); PkeCamera &PkeCamera_Register(const InstPos &instPos); PkeCamera *PkeCamera_Get(CameraHandle handle); +void PkeCamera_AttachToInstance(CameraHandle cameraHandle, CompInstance *inst); +void PkeCamera_DetachFromInstance(CameraHandle cameraHandle, CompInstance *inst); int64_t PkeCamera_GetBucketCount(); PkeCamera *PkeCamera_GetCameras(int64_t bucketIndex, int64_t &count); void PkeCamera_Destroy(CameraHandle handle); |
