From 650ba0068a54f04384268e37204d70a4f2d57ace Mon Sep 17 00:00:00 2001 From: maelstrom Date: Mon, 7 Jul 2025 20:29:00 +0200 Subject: [PATCH] fix(physics): crash when deleting parts due to misusing simulationTicket iterator --- core/src/objects/part.cpp | 2 +- core/src/objects/part.h | 2 +- core/src/objects/service/workspace.cpp | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/objects/part.cpp b/core/src/objects/part.cpp index 07ae7ce..4633923 100644 --- a/core/src/objects/part.cpp +++ b/core/src/objects/part.cpp @@ -54,7 +54,7 @@ void Part::OnWorkspaceAdded(std::optional> oldWorkspa } void Part::OnWorkspaceRemoved(std::shared_ptr oldWorkspace) { - if (simulationTicket->get() != nullptr) + if (simulationTicket.has_value()) oldWorkspace->RemoveBody(shared()); } diff --git a/core/src/objects/part.h b/core/src/objects/part.h index f2c5558..bc3a622 100644 --- a/core/src/objects/part.h +++ b/core/src/objects/part.h @@ -109,7 +109,7 @@ public: DEF_SIGNAL SignalSource TouchEnded; rp::RigidBody* rigidBody = nullptr; - SimulationTicket simulationTicket; + std::optional simulationTicket; bool rigidBodyDirty = true; inline SurfaceType GetSurfaceFromFace(NormalId face) { return surfaceFromFace(face); } diff --git a/core/src/objects/service/workspace.cpp b/core/src/objects/service/workspace.cpp index 2636c39..38dba8e 100644 --- a/core/src/objects/service/workspace.cpp +++ b/core/src/objects/service/workspace.cpp @@ -165,9 +165,9 @@ void Workspace::PhysicsStep(float deltaTime) { if (item.action == QueueItem::QUEUEITEM_ADD) { simulatedBodies.push_back(item.part); item.part->simulationTicket = --simulatedBodies.end(); - } else if (item.part->simulationTicket->get() != nullptr) { - simulatedBodies.erase(item.part->simulationTicket); - item.part->simulationTicket = {}; + } else if (item.part->simulationTicket.has_value()) { + simulatedBodies.erase(item.part->simulationTicket.value()); + item.part->simulationTicket = std::nullopt; } } queueLock.unlock();