diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7e02a29813..53fdb0d79c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -685,6 +685,10 @@ Application::~Application() { // stop the glWidget frame timer so it doesn't call paintGL _glWidget->stopFrameTimer(); + // remove avatars from physics engine + DependencyManager::get()->clearOtherAvatars(); + _physicsEngine.deleteObjects(DependencyManager::get()->getObjectsToDelete()); + DependencyManager::destroy(); DependencyManager::destroy(); DependencyManager::destroy(); diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 0de9f06742..3c8aad3f5d 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -177,21 +177,26 @@ AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWe return avatar; } +// protected +void AvatarManager::removeAvatarMotionState(Avatar* avatar) { + AvatarMotionState* motionState= avatar->_motionState; + if (motionState) { + // clean up physics stuff + motionState->clearObjectBackPointer(); + avatar->_motionState = nullptr; + _avatarMotionStates.remove(motionState); + _motionStatesToAdd.remove(motionState); + _motionStatesToDelete.push_back(motionState); + } +} + // virtual void AvatarManager::removeAvatar(const QUuid& sessionUUID) { AvatarHash::iterator avatarIterator = _avatarHash.find(sessionUUID); if (avatarIterator != _avatarHash.end()) { Avatar* avatar = reinterpret_cast(avatarIterator.value().data()); if (avatar != _myAvatar && avatar->isInitialized()) { - AvatarMotionState* motionState= avatar->_motionState; - if (motionState) { - // clean up physics stuff - motionState->clearObjectBackPointer(); - avatar->_motionState = nullptr; - _avatarMotionStates.remove(motionState); - _motionStatesToAdd.remove(motionState); - _motionStatesToDelete.push_back(motionState); - } + removeAvatarMotionState(avatar); _avatarFades.push_back(avatarIterator.value()); _avatarHash.erase(avatarIterator); @@ -208,6 +213,7 @@ void AvatarManager::clearOtherAvatars() { // don't remove myAvatar or uninitialized avatars from the list ++avatarIterator; } else { + removeAvatarMotionState(avatar); _avatarFades.push_back(avatarIterator.value()); avatarIterator = _avatarHash.erase(avatarIterator); } @@ -260,9 +266,11 @@ VectorOfMotionStates& AvatarManager::getObjectsToChange() { } void AvatarManager::handleOutgoingChanges(VectorOfMotionStates& motionStates) { + // TODO: extract the MyAvatar results once we use a MotionState for it. } void AvatarManager::handleCollisionEvents(CollisionEvents& collisionEvents) { + // TODO: expose avatar collision events to JS } void AvatarManager::updateAvatarPhysicsShape(const QUuid& id) { diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 5f22d5c194..51eb3a8ec2 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -75,6 +75,7 @@ private: // virtual overrides virtual AvatarSharedPointer newSharedAvatar(); virtual AvatarSharedPointer addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer); + void removeAvatarMotionState(Avatar* avatar); virtual void removeAvatar(const QUuid& sessionUUID); QVector _avatarFades; diff --git a/interface/src/avatar/AvatarMotionState.cpp b/interface/src/avatar/AvatarMotionState.cpp index 2abf872762..622d9061a0 100644 --- a/interface/src/avatar/AvatarMotionState.cpp +++ b/interface/src/avatar/AvatarMotionState.cpp @@ -57,8 +57,10 @@ void AvatarMotionState::getWorldTransform(btTransform& worldTrans) const { } worldTrans.setOrigin(glmToBullet(getObjectPosition())); worldTrans.setRotation(glmToBullet(getObjectRotation())); - _body->setLinearVelocity(glmToBullet(getObjectLinearVelocity())); - _body->setAngularVelocity(glmToBullet(getObjectLinearVelocity())); + if (_body) { + _body->setLinearVelocity(glmToBullet(getObjectLinearVelocity())); + _body->setAngularVelocity(glmToBullet(getObjectLinearVelocity())); + } } // virtual diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 8c52c79ca0..e2f4ca51a0 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -41,6 +41,7 @@ SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent) : _headClipDistance(DEFAULT_NEAR_CLIP) { assert(_owningAvatar); + _enableShapes = true; } SkeletonModel::~SkeletonModel() {