From a45e4da75f84bef73d0bf2ea5c65ee9b7620b997 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Mon, 19 Dec 2016 15:22:42 -0800 Subject: [PATCH] Initialize AvatarMixerClientData with the proper node id (should not be zeros for everyone). Then, in interface, check identity packets for self and make sure they're handled. --- assignment-client/src/avatars/AvatarMixer.cpp | 8 ++++---- assignment-client/src/avatars/AvatarMixerClientData.h | 2 ++ libraries/avatars/src/AvatarHashMap.cpp | 7 +++++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index ca7f931067..70950dc8fc 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -502,9 +502,9 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes AvatarData::parseAvatarIdentityPacket(message->getMessage(), identity); if (avatar.processAvatarIdentity(identity)) { QMutexLocker nodeDataLocker(&nodeData->getMutex()); - nodeData->flagIdentityChange(); - nodeData->setReceivedIdentity(); - } + nodeData->flagIdentityChange(); + nodeData->setReceivedIdentity(); + } } } } @@ -600,7 +600,7 @@ void AvatarMixer::domainSettingsRequestComplete() { float domainMaximumScale = _domainMaximumScale; nodeList->linkedDataCreateCallback = [domainMinimumScale, domainMaximumScale] (Node* node) { - auto clientData = std::unique_ptr { new AvatarMixerClientData }; + auto clientData = std::unique_ptr { new AvatarMixerClientData(node->getUUID()) }; clientData->getAvatar().setDomainMinimumScale(domainMinimumScale); clientData->getAvatar().setDomainMaximumScale(domainMaximumScale); diff --git a/assignment-client/src/avatars/AvatarMixerClientData.h b/assignment-client/src/avatars/AvatarMixerClientData.h index 538da4aab0..16e886815f 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.h +++ b/assignment-client/src/avatars/AvatarMixerClientData.h @@ -34,6 +34,8 @@ const QString INBOUND_AVATAR_DATA_STATS_KEY = "inbound_av_data_kbps"; class AvatarMixerClientData : public NodeData { Q_OBJECT public: + AvatarMixerClientData(const QUuid& nodeID = QUuid()) : NodeData(nodeID) {} + virtual ~AvatarMixerClientData() {} using HRCTime = p_high_resolution_clock::time_point; int parseData(ReceivedMessage& message) override; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index ea9a4f42f8..24c701aeda 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -133,6 +133,13 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer // make sure this isn't for an ignored avatar auto nodeList = DependencyManager::get(); + static auto EMPTY = QUuid(); + if (identity.uuid == _avatarHash.value(EMPTY)->getSessionUUID()) { + // We add MyAvatar to _avatarHash with an empty UUID. Code relies on this. In order to correctly handle an + // identity packet for ourself (such as when we are assigned a sessionDisplayName by the mixer upon joining), + // we make things match here. + identity.uuid = EMPTY; + } if (!nodeList->isIgnoringNode(identity.uuid)) { // mesh URL for a UUID, find avatar in our list auto avatar = newOrExistingAvatar(identity.uuid, sendingNode);