diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 48914908c6..03d7dd1c6c 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -68,7 +68,7 @@ void AvatarManager::registerMetaTypes(QScriptEngine* engine) { } AvatarManager::AvatarManager(QObject* parent) : - _avatarFades(), + _avatarsToFade(), _myAvatar(std::make_shared(std::make_shared())) { // register a meta type for the weak pointer we'll use for the owning avatar mixer for each avatar @@ -151,7 +151,7 @@ float AvatarManager::getAvatarSimulationRate(const QUuid& sessionID, const QStri void AvatarManager::updateOtherAvatars(float deltaTime) { // lock the hash for read to check the size QReadLocker lock(&_hashLock); - if (_avatarHash.size() < 2 && _avatarFades.isEmpty()) { + if (_avatarHash.size() < 2 && _avatarsToFade.isEmpty()) { return; } lock.unlock(); @@ -277,22 +277,22 @@ void AvatarManager::postUpdate(float deltaTime) { } void AvatarManager::simulateAvatarFades(float deltaTime) { - QVector::iterator fadingIterator = _avatarFades.begin(); + QVector::iterator fadingIterator = _avatarsToFade.begin(); const float SHRINK_RATE = 0.15f; const float MIN_FADE_SCALE = MIN_AVATAR_SCALE; render::ScenePointer scene = qApp->getMain3DScene(); render::Transaction transaction; - while (fadingIterator != _avatarFades.end()) { + while (fadingIterator != _avatarsToFade.end()) { auto avatar = std::static_pointer_cast(*fadingIterator); avatar->setTargetScale(avatar->getUniformScale() * SHRINK_RATE); avatar->animateScaleChanges(deltaTime); if (avatar->getTargetScale() <= MIN_FADE_SCALE) { avatar->removeFromScene(*fadingIterator, scene, transaction); - // only remove from _avatarFades if we're sure its motionState has been removed from PhysicsEngine + // only remove from _avatarsToFade if we're sure its motionState has been removed from PhysicsEngine if (_motionStatesToRemoveFromPhysics.empty()) { - fadingIterator = _avatarFades.erase(fadingIterator); + fadingIterator = _avatarsToFade.erase(fadingIterator); } else { ++fadingIterator; } @@ -306,26 +306,9 @@ void AvatarManager::simulateAvatarFades(float deltaTime) { } AvatarSharedPointer AvatarManager::newSharedAvatar() { - return std::make_shared(std::make_shared()); -} - -AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { - auto newAvatar = AvatarHashMap::addAvatar(sessionUUID, mixerWeakPointer); - auto rawRenderableAvatar = std::static_pointer_cast(newAvatar); - - rawRenderableAvatar->addToScene(rawRenderableAvatar); - - return newAvatar; -} - -// virtual -void AvatarManager::removeAvatar(const QUuid& sessionUUID, KillAvatarReason removalReason) { - QWriteLocker locker(&_hashLock); - - auto removedAvatar = _avatarHash.take(sessionUUID); - if (removedAvatar) { - handleRemovedAvatar(removedAvatar, removalReason); - } + std::shared_ptr avatar = std::make_shared(std::make_shared()); + avatar->addToScene(avatar); + return avatar; } void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason) { @@ -353,7 +336,7 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar DependencyManager::get()->removeFromIgnoreMuteSets(avatar->getSessionUUID()); DependencyManager::get()->avatarDisconnected(avatar->getSessionUUID()); } - _avatarFades.push_back(removedAvatar); + _avatarsToFade.push_back(removedAvatar); } void AvatarManager::clearOtherAvatars() { diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index b94f9e6a96..228fe7e92f 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -91,21 +91,27 @@ public slots: void setShouldShowReceiveStats(bool shouldShowReceiveStats) { _shouldShowReceiveStats = shouldShowReceiveStats; } void updateAvatarRenderStatus(bool shouldRenderAvatars); -private slots: - virtual void removeAvatar(const QUuid& sessionUUID, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; - private: explicit AvatarManager(QObject* parent = 0); explicit AvatarManager(const AvatarManager& other); void simulateAvatarFades(float deltaTime); - // virtual overrides - virtual AvatarSharedPointer newSharedAvatar() override; - virtual AvatarSharedPointer addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) override; - virtual void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; + AvatarSharedPointer newSharedAvatar() override; + void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; + + /* TODO: maintain these lists + QVector _avatarsToRemoveFromScene; + QVector _avatarsToAddToScene; + QVector _avatarsToRemoveFromPhysicsEngine; + QVector _avatarsToAddToPhysicsEngine; + */ + QVector _avatarsToFade; + + SetOfAvatarMotionStates _motionStatesThatMightUpdate; + VectorOfMotionStates _motionStatesToRemoveFromPhysics; + SetOfMotionStates _motionStatesToAddToPhysics; - QVector _avatarFades; std::shared_ptr _myAvatar; quint64 _lastSendAvatarDataTime = 0; // Controls MyAvatar send data rate. @@ -115,10 +121,6 @@ private: std::list> _collisionInjectors; - SetOfAvatarMotionStates _motionStatesThatMightUpdate; - SetOfMotionStates _motionStatesToAddToPhysics; - VectorOfMotionStates _motionStatesToRemoveFromPhysics; - RateCounter<> _myAvatarSendRate; int _numAvatarsUpdated { 0 }; int _numAvatarsNotUpdated { 0 };