From c0c1116c695f89903192aa8398830ddaa9e65e2e Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Sat, 27 Jun 2015 11:09:28 -0700 Subject: [PATCH] attempt some clean-ups in edge/unexpected situations --- libraries/entities/src/EntityItem.cpp | 10 +++++++++- libraries/physics/src/ObjectAction.cpp | 7 +++++++ libraries/physics/src/PhysicsEngine.cpp | 1 - 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index f6c185d124..dfb2d6c8ba 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -88,6 +88,13 @@ EntityItem::EntityItem(const EntityItemID& entityItemID, const EntityItemPropert } EntityItem::~EntityItem() { + // clear out any left-over actions + EntityTree* entityTree = _element ? _element->getTree() : nullptr; + EntitySimulation* simulation = entityTree ? entityTree->getSimulation() : nullptr; + if (simulation) { + clearActions(simulation); + } + // these pointers MUST be correct at delete, else we probably have a dangling backpointer // to this EntityItem in the corresponding data structure. assert(!_simulated); @@ -1450,7 +1457,8 @@ void EntityItem::setActionData(QByteArray actionData) { if (_objectActions.contains(actionID)) { EntityActionPointer action = _objectActions[actionID]; - // XXX make sure types match? + // TODO: make sure types match? there isn't currently a way to + // change the type of an existing action. action->deserialize(serializedAction); } else { auto actionFactory = DependencyManager::get(); diff --git a/libraries/physics/src/ObjectAction.cpp b/libraries/physics/src/ObjectAction.cpp index 0dc5eceaa5..ae29fe79d3 100644 --- a/libraries/physics/src/ObjectAction.cpp +++ b/libraries/physics/src/ObjectAction.cpp @@ -27,6 +27,13 @@ void ObjectAction::updateAction(btCollisionWorld* collisionWorld, btScalar delta if (!_active) { return; } + if (_ownerEntity.expired()) { + qDebug() << "warning -- action with no entity removing self from btCollisionWorld."; + btDynamicsWorld* dynamicsWorld = static_cast(collisionWorld); + dynamicsWorld->removeAction(this); + return; + } + updateActionWorker(deltaTimeStep); } diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index 94414ccb2f..24baa365ef 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -443,7 +443,6 @@ EntityActionPointer PhysicsEngine::getActionByID(const QUuid& actionID) const { return nullptr; } - void PhysicsEngine::addAction(EntityActionPointer action) { assert(action); const QUuid& actionID = action->getID();