diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dbb30a4582..5120bf13e9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1233,6 +1233,9 @@ void Application::cleanupBeforeQuit() { } Application::~Application() { + _entityClipboard->eraseAllOctreeElements(); + _entityClipboard.reset(); + EntityTreePointer tree = getEntities()->getTree(); tree->setSimulation(nullptr); @@ -1242,7 +1245,7 @@ Application::~Application() { _physicsEngine->setCharacterController(nullptr); // remove avatars from physics engine - DependencyManager::get()->clearOtherAvatars(); + DependencyManager::get()->clearAllAvatars(); VectorOfMotionStates motionStates; DependencyManager::get()->getObjectsToRemoveFromPhysics(motionStates); _physicsEngine->removeObjects(motionStates); diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 9f3a0eb254..c1bf3b7f0b 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -250,6 +250,17 @@ void AvatarManager::clearOtherAvatars() { _myAvatar->clearLookAtTargetAvatar(); } +void AvatarManager::clearAllAvatars() { + clearOtherAvatars(); + + QWriteLocker (locker&_hashLock); + + _myAvatar->die(); + _myAvatar.reset(); + + _avatarHash.clear(); +} + void AvatarManager::setLocalLights(const QVector& localLights) { if (QThread::currentThread() != thread()) { QMetaObject::invokeMethod(this, "setLocalLights", Q_ARG(const QVector&, localLights)); diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 57fc1022ea..576a17f080 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -45,6 +45,7 @@ public: void updateOtherAvatars(float deltaTime); void clearOtherAvatars(); + void clearAllAvatar(); bool shouldShowReceiveStats() const { return _shouldShowReceiveStats; }