void AvatarManager::clearOtherAvatars() { _myAvatar->clearLookAtTargetAvatar(); // setup a vector of removed avatars outside the scope of the hash lock std::vector<AvatarSharedPointer> removedAvatars; { QWriteLocker locker(&_hashLock); removedAvatars.reserve(_avatarHash.size()); auto avatarIterator = _avatarHash.begin(); while (avatarIterator != _avatarHash.end()) { auto avatar = std::static_pointer_cast<Avatar>(avatarIterator.value()); if (avatar != _myAvatar) { removedAvatars.push_back(avatar); avatarIterator = _avatarHash.erase(avatarIterator); } else { ++avatarIterator; } } } for (auto& av : removedAvatars) { handleRemovedAvatar(av); } }
// virtual void AvatarManager::removeAvatar(const QUuid& sessionUUID) { QWriteLocker locker(&_hashLock); auto removedAvatar = _avatarHash.take(sessionUUID); if (removedAvatar) { handleRemovedAvatar(removedAvatar); } }
void AvatarManager::clearOtherAvatars() { // clear any avatars that came from an avatar-mixer QWriteLocker locker(&_hashLock); AvatarHash::iterator avatarIterator = _avatarHash.begin(); while (avatarIterator != _avatarHash.end()) { auto avatar = std::static_pointer_cast<Avatar>(avatarIterator.value()); if (avatar == _myAvatar || !avatar->isInitialized()) { // don't remove myAvatar or uninitialized avatars from the list ++avatarIterator; } else { auto removedAvatar = avatarIterator.value(); avatarIterator = _avatarHash.erase(avatarIterator); handleRemovedAvatar(removedAvatar); } } _myAvatar->clearLookAtTargetAvatar(); }