fix(physics): crash when deleting parts due to misusing simulationTicket iterator
This commit is contained in:
parent
df795482b5
commit
650ba0068a
3 changed files with 5 additions and 5 deletions
|
@ -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>());
|
||||
}
|
||||
|
||||
|
|
|
@ -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); }
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue