fix(physics): crash when deleting parts due to misusing simulationTicket iterator

This commit is contained in:
maelstrom 2025-07-07 20:29:00 +02:00
parent df795482b5
commit 650ba0068a
3 changed files with 5 additions and 5 deletions

View file

@ -54,7 +54,7 @@ void Part::OnWorkspaceAdded(std::optional<std::shared_ptr<Workspace>> oldWorkspa
}
void Part::OnWorkspaceRemoved(std::shared_ptr<Workspace> oldWorkspace) {
if (simulationTicket->get() != nullptr)
if (simulationTicket.has_value())
oldWorkspace->RemoveBody(shared<Part>());
}

View file

@ -109,7 +109,7 @@ public:
DEF_SIGNAL SignalSource TouchEnded;
rp::RigidBody* rigidBody = nullptr;
SimulationTicket simulationTicket;
std::optional<SimulationTicket> simulationTicket;
bool rigidBodyDirty = true;
inline SurfaceType GetSurfaceFromFace(NormalId face) { return surfaceFromFace(face); }

View file

@ -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();