summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editor/editor.cpp10
-rw-r--r--src/camera.cpp54
-rw-r--r--src/camera.hpp2
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);