From e89b6c5d2c457be9b7c70a3140237a07aa4d1c04 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 20 Apr 2017 17:26:31 -0700 Subject: [PATCH 01/29] some initial debugging on tpose avatars --- interface/src/avatar/Avatar.cpp | 17 ++++++++++++----- libraries/avatars/src/AvatarData.cpp | 5 +++++ libraries/avatars/src/AvatarHashMap.cpp | 4 ++++ .../src/model-networking/ModelCache.h | 1 + .../networking/src/HTTPResourceRequest.cpp | 17 +++++++++++++---- libraries/networking/src/ReceivedMessage.cpp | 6 ++++-- libraries/networking/src/ReceivedMessage.h | 5 +++++ libraries/networking/src/ResourceCache.cpp | 5 +++-- libraries/networking/src/ResourceCache.h | 3 +++ libraries/networking/src/udt/PacketList.h | 2 ++ libraries/render-utils/src/Model.h | 1 + 11 files changed, 53 insertions(+), 13 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 5b996a3cdf..563de9434d 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -341,6 +341,8 @@ void Avatar::updateAvatarEntities() { void Avatar::simulate(float deltaTime, bool inView) { PROFILE_RANGE(simulation, "simulate"); + //qDebug() << __FUNCTION__ << "skeleton download attempts:" << _skeletonModel->getResourceDownloadAttempts(); + _simulationRate.increment(); if (inView) { _simulationInViewRate.increment(); @@ -1112,11 +1114,16 @@ void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { void Avatar::setModelURLFinished(bool success) { if (!success && _skeletonModelURL != AvatarData::defaultFullAvatarModelUrl()) { - qCWarning(interfaceapp) << "Using default after failing to load Avatar model: " << _skeletonModelURL; - // call _skeletonModel.setURL, but leave our copy of _skeletonModelURL alone. This is so that - // we don't redo this every time we receive an identity packet from the avatar with the bad url. - QMetaObject::invokeMethod(_skeletonModel.get(), "setURL", - Qt::QueuedConnection, Q_ARG(QUrl, AvatarData::defaultFullAvatarModelUrl())); + // FIXME -- + if (_skeletonModel->getResourceDownloadAttempts() > 4) { + qCWarning(interfaceapp) << "Using default after failing to load Avatar model: " << _skeletonModelURL; + // call _skeletonModel.setURL, but leave our copy of _skeletonModelURL alone. This is so that + // we don't redo this every time we receive an identity packet from the avatar with the bad url. + QMetaObject::invokeMethod(_skeletonModel.get(), "setURL", + Qt::QueuedConnection, Q_ARG(QUrl, AvatarData::defaultFullAvatarModelUrl())); + } else { + qCWarning(interfaceapp) << "Avatar model: " << _skeletonModelURL << "failed to load... attempts:" << _skeletonModel->getResourceDownloadAttempts(); + } } } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 9802630cf5..278ce53472 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1468,6 +1468,7 @@ QUrl AvatarData::cannonicalSkeletonModelURL(const QUrl& emptyURL) const { void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged) { if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) { + qDebug() << __FUNCTION__ << "about to call setSkeletonModelURL(identity.skeletonModelURL);... identity.skeletonModelURL:" << identity.skeletonModelURL; setSkeletonModelURL(identity.skeletonModelURL); identityChanged = true; if (_firstSkeletonCheck) { @@ -1514,6 +1515,10 @@ QByteArray AvatarData::identityByteArray() const { } void AvatarData::setSkeletonModelURL(const QUrl& skeletonModelURL) { + if (skeletonModelURL.isEmpty()) { + qDebug() << __FUNCTION__ << "caller called with empty URL."; + } + const QUrl& expanded = skeletonModelURL.isEmpty() ? AvatarData::defaultFullAvatarModelUrl() : skeletonModelURL; if (expanded == _skeletonModelURL) { return; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 0d341c684e..46a3a67976 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -126,6 +126,10 @@ AvatarSharedPointer AvatarHashMap::parseAvatarData(QSharedPointer message, SharedNodePointer sendingNode) { + qDebug() << __FUNCTION__ << "sendingNode:" << sendingNode << "message.failed():" << message->failed() + << "isComplete:" << message->isComplete() + << "messageNumber:" << message->getMessageNumber(); + AvatarData::Identity identity; AvatarData::parseAvatarIdentityPacket(message->getMessage(), identity); diff --git a/libraries/model-networking/src/model-networking/ModelCache.h b/libraries/model-networking/src/model-networking/ModelCache.h index 967897477d..67d57eab19 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.h +++ b/libraries/model-networking/src/model-networking/ModelCache.h @@ -112,6 +112,7 @@ public: void setResource(GeometryResource::Pointer resource); QUrl getURL() const { return (bool)_resource ? _resource->getURL() : QUrl(); } + int getResourceDownloadAttempts() { return _resource ? _resource->getDownloadAttempts() : 0; } private: void startWatching(); diff --git a/libraries/networking/src/HTTPResourceRequest.cpp b/libraries/networking/src/HTTPResourceRequest.cpp index 85da5de5b8..e43545f38e 100644 --- a/libraries/networking/src/HTTPResourceRequest.cpp +++ b/libraries/networking/src/HTTPResourceRequest.cpp @@ -75,10 +75,19 @@ void HTTPResourceRequest::onRequestFinished() { switch(_reply->error()) { case QNetworkReply::NoError: - _data = _reply->readAll(); - _loadedFromCache = _reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool(); - _result = Success; - break; + { + // For debugging, have a random chance of treating this like a failure + bool randFailure = false; // _url.toString().contains(".fst") ? (rand() % 100) > 10 : false; + + if (!randFailure) { + _data = _reply->readAll(); + _loadedFromCache = _reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool(); + _result = Success; + break; + } + // else fall through to timeout + qDebug() << "**** Randomly pretending to timeout instead of successfully download HTTP resource:" << _url << " ******************************"; + } case QNetworkReply::TimeoutError: _result = Timeout; diff --git a/libraries/networking/src/ReceivedMessage.cpp b/libraries/networking/src/ReceivedMessage.cpp index 02cb58fb2d..5c8239f227 100644 --- a/libraries/networking/src/ReceivedMessage.cpp +++ b/libraries/networking/src/ReceivedMessage.cpp @@ -27,7 +27,8 @@ ReceivedMessage::ReceivedMessage(const NLPacketList& packetList) _packetType(packetList.getType()), _packetVersion(packetList.getVersion()), _senderSockAddr(packetList.getSenderSockAddr()), - _isComplete(true) + _isComplete(true), + _messageNumber(packetList.getMessageNumber()) { } @@ -39,7 +40,8 @@ ReceivedMessage::ReceivedMessage(NLPacket& packet) _packetType(packet.getType()), _packetVersion(packet.getVersion()), _senderSockAddr(packet.getSenderSockAddr()), - _isComplete(packet.getPacketPosition() == NLPacket::ONLY) + _isComplete(packet.getPacketPosition() == NLPacket::ONLY), + _messageNumber(packet.getMessageNumber()) { } diff --git a/libraries/networking/src/ReceivedMessage.h b/libraries/networking/src/ReceivedMessage.h index 3acb7163e7..d154794719 100644 --- a/libraries/networking/src/ReceivedMessage.h +++ b/libraries/networking/src/ReceivedMessage.h @@ -50,6 +50,8 @@ public: qint64 getBytesLeftToRead() const { return _data.size() - _position; } + qint64 getMessageNumber() const { return _messageNumber; } + void seek(qint64 position) { _position = position; } qint64 peek(char* data, qint64 size); @@ -98,6 +100,9 @@ private: std::atomic _isComplete { true }; std::atomic _failed { false }; + + udt::Packet::MessageNumber _messageNumber { 0 }; + }; Q_DECLARE_METATYPE(ReceivedMessage*) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 4031ff8bf7..ed0d5fd20b 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -724,10 +724,11 @@ void Resource::handleReplyFinished() { } else { switch (result) { case ResourceRequest::Result::Timeout: { - qCDebug(networking) << "Timed out loading" << _url << "received" << _bytesReceived << "total" << _bytesTotal; + qCDebug(networking) << "Timed out loading" << _url << "received" << _bytesReceived << "total" << _bytesTotal << "attempt:" << _attempts << "of" << MAX_ATTEMPTS; // Fall through to other cases } case ResourceRequest::Result::ServerUnavailable: { + qCDebug(networking) << "Server Unavailable loading" << _url << "attempt:" << _attempts << "of" << MAX_ATTEMPTS; // retry with increasing delays const int BASE_DELAY_MS = 1000; if (_attempts++ < MAX_ATTEMPTS) { @@ -742,7 +743,7 @@ void Resource::handleReplyFinished() { // fall through to final failure } default: { - qCDebug(networking) << "Error loading " << _url; + qCDebug(networking) << "Error loading " << _url << "attempt:" << _attempts << "of" << MAX_ATTEMPTS; auto error = (result == ResourceRequest::Timeout) ? QNetworkReply::TimeoutError : QNetworkReply::UnknownNetworkError; emit failed(error); diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index 53ccd2c386..df21a296a6 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -395,6 +395,9 @@ public: const QUrl& getURL() const { return _url; } + int getDownloadAttempts() { return _attempts; } + + signals: /// Fired when the resource begins downloading. void loading(); diff --git a/libraries/networking/src/udt/PacketList.h b/libraries/networking/src/udt/PacketList.h index 5083d77ec9..09857c795e 100644 --- a/libraries/networking/src/udt/PacketList.h +++ b/libraries/networking/src/udt/PacketList.h @@ -43,6 +43,8 @@ public: size_t getDataSize() const; size_t getMessageSize() const; QByteArray getMessage() const; + udt::Packet::MessageNumber getMessageNumber() const { return _messageNumber; } + QByteArray getExtendedHeader() const { return _extendedHeader; } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 62e045a3c1..3e67f2a296 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -252,6 +252,7 @@ public: void renderDebugMeshBoxes(gpu::Batch& batch); + int getResourceDownloadAttempts() { return _renderWatcher.getResourceDownloadAttempts(); } public slots: void loadURLFinished(bool success); From 7f1a87ac4ff3019fc8cfabe1e0b0ff2f94f96c6b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 20 Apr 2017 17:31:20 -0700 Subject: [PATCH 02/29] remove random http failure --- .../networking/src/HTTPResourceRequest.cpp | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/libraries/networking/src/HTTPResourceRequest.cpp b/libraries/networking/src/HTTPResourceRequest.cpp index e43545f38e..3249f40b0e 100644 --- a/libraries/networking/src/HTTPResourceRequest.cpp +++ b/libraries/networking/src/HTTPResourceRequest.cpp @@ -72,22 +72,13 @@ void HTTPResourceRequest::onRequestFinished() { Q_ASSERT(_reply); cleanupTimer(); - + switch(_reply->error()) { case QNetworkReply::NoError: - { - // For debugging, have a random chance of treating this like a failure - bool randFailure = false; // _url.toString().contains(".fst") ? (rand() % 100) > 10 : false; - - if (!randFailure) { - _data = _reply->readAll(); - _loadedFromCache = _reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool(); - _result = Success; - break; - } - // else fall through to timeout - qDebug() << "**** Randomly pretending to timeout instead of successfully download HTTP resource:" << _url << " ******************************"; - } + _data = _reply->readAll(); + _loadedFromCache = _reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool(); + _result = Success; + break; case QNetworkReply::TimeoutError: _result = Timeout; From c19797935449f93bc367c4223cf1f0c17bf74034 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 20 Apr 2017 18:36:00 -0700 Subject: [PATCH 03/29] add more logging --- libraries/avatars/src/AvatarData.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 278ce53472..b95387a456 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1457,6 +1457,14 @@ void AvatarData::parseAvatarIdentityPacket(const QByteArray& data, Identity& ide QDataStream packetStream(data); packetStream >> identityOut.uuid >> identityOut.skeletonModelURL >> identityOut.attachmentData >> identityOut.displayName >> identityOut.sessionDisplayName >> identityOut.avatarEntityData; + + qDebug() << __FUNCTION__ + << "identityOut.uuid:" << identityOut.uuid + << "identityOut.skeletonModelURL:" << identityOut.skeletonModelURL + << "identityOut.displayName:" << identityOut.displayName + << "identityOut.sessionDisplayName:" << identityOut.sessionDisplayName + ; + } static const QUrl emptyURL(""); From 125b3d5f4e87dd9ffc7fa326cb4878d6aeca7ba1 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 21 Apr 2017 07:51:17 -0700 Subject: [PATCH 04/29] ignore old identity packets --- assignment-client/src/avatars/AvatarMixer.cpp | 5 +++-- libraries/avatars/src/AvatarData.cpp | 15 +++++++++++++-- libraries/avatars/src/AvatarData.h | 6 ++++-- libraries/avatars/src/AvatarHashMap.cpp | 5 +++-- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index f3da74ce5e..6e163e6d0b 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -404,10 +404,11 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes // parse the identity packet and update the change timestamp if appropriate AvatarData::Identity identity; - AvatarData::parseAvatarIdentityPacket(message->getMessage(), identity); + quint64 messageNumber; + AvatarData::parseAvatarIdentityPacket(message, identity, messageNumber); bool identityChanged = false; bool displayNameChanged = false; - avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged); + avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged, messageNumber); if (identityChanged) { QMutexLocker nodeDataLocker(&nodeData->getMutex()); nodeData->flagIdentityChange(); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index b95387a456..d06fdf502b 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1453,12 +1453,15 @@ QStringList AvatarData::getJointNames() const { return _jointNames; } -void AvatarData::parseAvatarIdentityPacket(const QByteArray& data, Identity& identityOut) { +void AvatarData::parseAvatarIdentityPacket(QSharedPointer message, Identity& identityOut, quint64& messageNumberOut) { + const QByteArray& data = message->getMessage(); + messageNumberOut = message->getMessageNumber(); QDataStream packetStream(data); packetStream >> identityOut.uuid >> identityOut.skeletonModelURL >> identityOut.attachmentData >> identityOut.displayName >> identityOut.sessionDisplayName >> identityOut.avatarEntityData; qDebug() << __FUNCTION__ + << "messageNumberOut:" << messageNumberOut << "identityOut.uuid:" << identityOut.uuid << "identityOut.skeletonModelURL:" << identityOut.skeletonModelURL << "identityOut.displayName:" << identityOut.displayName @@ -1473,7 +1476,15 @@ QUrl AvatarData::cannonicalSkeletonModelURL(const QUrl& emptyURL) const { return _skeletonModelURL.scheme() == "file" ? emptyURL : _skeletonModelURL; } -void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged) { +void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, quint64 messageNumber) { + qDebug() << __FUNCTION__ << "messageNumber:" << messageNumber << "_lastIdentityPacketMessageNumber:" << _lastIdentityPacketMessageNumber; + + if (messageNumber < _lastIdentityPacketMessageNumber) { + qDebug() << "ignoring late identity packet for avatar " << getSessionUUID(); + return; + } + + _lastIdentityPacketMessageNumber = messageNumber; if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) { qDebug() << __FUNCTION__ << "about to call setSkeletonModelURL(identity.skeletonModelURL);... identity.skeletonModelURL:" << identity.skeletonModelURL; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 8319eb5249..0eb22fd938 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -532,11 +532,11 @@ public: AvatarEntityMap avatarEntityData; }; - static void parseAvatarIdentityPacket(const QByteArray& data, Identity& identityOut); + static void parseAvatarIdentityPacket(QSharedPointer message, Identity& identityOut, quint64& messageNumberOut); // identityChanged returns true if identity has changed, false otherwise. // displayNameChanged returns true if displayName has changed, false otherwise. - void processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged); + void processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, quint64 messageNumber); QByteArray identityByteArray() const; @@ -778,6 +778,8 @@ protected: quint64 _audioLoudnessChanged { 0 }; float _audioAverageLoudness { 0.0f }; + quint64 _lastIdentityPacketMessageNumber { 0 }; + private: friend void avatarStateFromFrame(const QByteArray& frameData, AvatarData* _avatar); static QUrl _defaultFullAvatarModelUrl; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 46a3a67976..f371159e6e 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -131,7 +131,8 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer << "messageNumber:" << message->getMessageNumber(); AvatarData::Identity identity; - AvatarData::parseAvatarIdentityPacket(message->getMessage(), identity); + quint64 messageNumber; + AvatarData::parseAvatarIdentityPacket(message, identity, messageNumber); // make sure this isn't for an ignored avatar auto nodeList = DependencyManager::get(); @@ -152,7 +153,7 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer auto avatar = newOrExistingAvatar(identity.uuid, sendingNode); bool identityChanged = false; bool displayNameChanged = false; - avatar->processAvatarIdentity(identity, identityChanged, displayNameChanged); + avatar->processAvatarIdentity(identity, identityChanged, displayNameChanged, messageNumber); } } From c03182546bb4b41e0dc54b767873016cf21e5f23 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 21 Apr 2017 09:11:51 -0700 Subject: [PATCH 05/29] some cleanup --- interface/src/avatar/Avatar.cpp | 10 +++++----- libraries/avatars/src/AvatarData.cpp | 15 +++++++-------- libraries/avatars/src/AvatarHashMap.cpp | 4 ---- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 563de9434d..9d79a40c11 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -341,8 +341,6 @@ void Avatar::updateAvatarEntities() { void Avatar::simulate(float deltaTime, bool inView) { PROFILE_RANGE(simulation, "simulate"); - //qDebug() << __FUNCTION__ << "skeleton download attempts:" << _skeletonModel->getResourceDownloadAttempts(); - _simulationRate.increment(); if (inView) { _simulationInViewRate.increment(); @@ -1114,15 +1112,17 @@ void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { void Avatar::setModelURLFinished(bool success) { if (!success && _skeletonModelURL != AvatarData::defaultFullAvatarModelUrl()) { - // FIXME -- - if (_skeletonModel->getResourceDownloadAttempts() > 4) { + const int MAX_SKELETON_DOWNLOAD_ATTEMPTS = 4; // NOTE: must be less than MAX_ATTEMPTS in ResourceCache.cpp + if (_skeletonModel->getResourceDownloadAttempts() > MAX_SKELETON_DOWNLOAD_ATTEMPTS) { qCWarning(interfaceapp) << "Using default after failing to load Avatar model: " << _skeletonModelURL; // call _skeletonModel.setURL, but leave our copy of _skeletonModelURL alone. This is so that // we don't redo this every time we receive an identity packet from the avatar with the bad url. QMetaObject::invokeMethod(_skeletonModel.get(), "setURL", Qt::QueuedConnection, Q_ARG(QUrl, AvatarData::defaultFullAvatarModelUrl())); } else { - qCWarning(interfaceapp) << "Avatar model: " << _skeletonModelURL << "failed to load... attempts:" << _skeletonModel->getResourceDownloadAttempts(); + qCWarning(interfaceapp) << "Avatar model: " << _skeletonModelURL + << "failed to load... attempts:" << _skeletonModel->getResourceDownloadAttempts() + << "out of:" << MAX_SKELETON_DOWNLOAD_ATTEMPTS; } } } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index d06fdf502b..b81bf86559 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1460,13 +1460,14 @@ void AvatarData::parseAvatarIdentityPacket(QSharedPointer messa packetStream >> identityOut.uuid >> identityOut.skeletonModelURL >> identityOut.attachmentData >> identityOut.displayName >> identityOut.sessionDisplayName >> identityOut.avatarEntityData; - qDebug() << __FUNCTION__ +#ifdef WANT_DEBUG + qCDebug(avatars) << __FUNCTION__ << "messageNumberOut:" << messageNumberOut << "identityOut.uuid:" << identityOut.uuid << "identityOut.skeletonModelURL:" << identityOut.skeletonModelURL << "identityOut.displayName:" << identityOut.displayName - << "identityOut.sessionDisplayName:" << identityOut.sessionDisplayName - ; + << "identityOut.sessionDisplayName:" << identityOut.sessionDisplayName; +#endif } @@ -1477,17 +1478,15 @@ QUrl AvatarData::cannonicalSkeletonModelURL(const QUrl& emptyURL) const { } void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, quint64 messageNumber) { - qDebug() << __FUNCTION__ << "messageNumber:" << messageNumber << "_lastIdentityPacketMessageNumber:" << _lastIdentityPacketMessageNumber; - if (messageNumber < _lastIdentityPacketMessageNumber) { - qDebug() << "ignoring late identity packet for avatar " << getSessionUUID(); + qCDebug(avatars) << "Ignoring late identity packet for avatar " << getSessionUUID() + << "messageNumber:" << messageNumber << "_lastIdentityPacketMessageNumber:" << _lastIdentityPacketMessageNumber; return; } _lastIdentityPacketMessageNumber = messageNumber; if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) { - qDebug() << __FUNCTION__ << "about to call setSkeletonModelURL(identity.skeletonModelURL);... identity.skeletonModelURL:" << identity.skeletonModelURL; setSkeletonModelURL(identity.skeletonModelURL); identityChanged = true; if (_firstSkeletonCheck) { @@ -1535,7 +1534,7 @@ QByteArray AvatarData::identityByteArray() const { void AvatarData::setSkeletonModelURL(const QUrl& skeletonModelURL) { if (skeletonModelURL.isEmpty()) { - qDebug() << __FUNCTION__ << "caller called with empty URL."; + qCDebug(avatars) << __FUNCTION__ << "caller called with empty URL."; } const QUrl& expanded = skeletonModelURL.isEmpty() ? AvatarData::defaultFullAvatarModelUrl() : skeletonModelURL; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index f371159e6e..c4aa6c8479 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -126,10 +126,6 @@ AvatarSharedPointer AvatarHashMap::parseAvatarData(QSharedPointer message, SharedNodePointer sendingNode) { - qDebug() << __FUNCTION__ << "sendingNode:" << sendingNode << "message.failed():" << message->failed() - << "isComplete:" << message->isComplete() - << "messageNumber:" << message->getMessageNumber(); - AvatarData::Identity identity; quint64 messageNumber; AvatarData::parseAvatarIdentityPacket(message, identity, messageNumber); From fbc699d6b261fd6d137628139d4048643fa84e88 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 21 Apr 2017 09:30:00 -0700 Subject: [PATCH 06/29] handle overflow case --- libraries/avatars/src/AvatarData.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index b81bf86559..b904c2b6e8 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -1478,7 +1479,10 @@ QUrl AvatarData::cannonicalSkeletonModelURL(const QUrl& emptyURL) const { } void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, quint64 messageNumber) { - if (messageNumber < _lastIdentityPacketMessageNumber) { + + if (messageNumber < _lastIdentityPacketMessageNumber && + _lastIdentityPacketMessageNumber < std::numeric_limits::max()) { + qCDebug(avatars) << "Ignoring late identity packet for avatar " << getSessionUUID() << "messageNumber:" << messageNumber << "_lastIdentityPacketMessageNumber:" << _lastIdentityPacketMessageNumber; return; From f133713d0e2dabb114bde522e8d4defc7362d542 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 21 Apr 2017 10:21:34 -0700 Subject: [PATCH 07/29] CR feedback --- interface/src/avatar/Avatar.cpp | 5 +++-- libraries/avatars/src/AvatarData.cpp | 2 +- libraries/avatars/src/AvatarData.h | 2 +- .../src/model-networking/ModelCache.h | 1 + libraries/networking/src/ReceivedMessage.cpp | 1 - libraries/networking/src/ReceivedMessage.h | 2 +- libraries/networking/src/ResourceCache.cpp | 12 +++++++----- libraries/networking/src/ResourceCache.h | 6 +++++- libraries/render-utils/src/Model.h | 1 + 9 files changed, 20 insertions(+), 12 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 9d79a40c11..0a4cdefef1 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -1112,8 +1112,9 @@ void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { void Avatar::setModelURLFinished(bool success) { if (!success && _skeletonModelURL != AvatarData::defaultFullAvatarModelUrl()) { - const int MAX_SKELETON_DOWNLOAD_ATTEMPTS = 4; // NOTE: must be less than MAX_ATTEMPTS in ResourceCache.cpp - if (_skeletonModel->getResourceDownloadAttempts() > MAX_SKELETON_DOWNLOAD_ATTEMPTS) { + const int MAX_SKELETON_DOWNLOAD_ATTEMPTS = 4; // NOTE: we don't want to be as generous as ResourceCache is, we only want 4 attempts + if (_skeletonModel->getResourceDownloadAttemptsRemaining() <= 0 || + _skeletonModel->getResourceDownloadAttempts() > MAX_SKELETON_DOWNLOAD_ATTEMPTS) { qCWarning(interfaceapp) << "Using default after failing to load Avatar model: " << _skeletonModelURL; // call _skeletonModel.setURL, but leave our copy of _skeletonModelURL alone. This is so that // we don't redo this every time we receive an identity packet from the avatar with the bad url. diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index b904c2b6e8..f541610ae9 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1454,7 +1454,7 @@ QStringList AvatarData::getJointNames() const { return _jointNames; } -void AvatarData::parseAvatarIdentityPacket(QSharedPointer message, Identity& identityOut, quint64& messageNumberOut) { +void AvatarData::parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut, quint64& messageNumberOut) { const QByteArray& data = message->getMessage(); messageNumberOut = message->getMessageNumber(); QDataStream packetStream(data); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 0eb22fd938..2ffa3c020c 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -532,7 +532,7 @@ public: AvatarEntityMap avatarEntityData; }; - static void parseAvatarIdentityPacket(QSharedPointer message, Identity& identityOut, quint64& messageNumberOut); + static void parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut, quint64& messageNumberOut); // identityChanged returns true if identity has changed, false otherwise. // displayNameChanged returns true if displayName has changed, false otherwise. diff --git a/libraries/model-networking/src/model-networking/ModelCache.h b/libraries/model-networking/src/model-networking/ModelCache.h index 67d57eab19..4c68e1b6c3 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.h +++ b/libraries/model-networking/src/model-networking/ModelCache.h @@ -113,6 +113,7 @@ public: QUrl getURL() const { return (bool)_resource ? _resource->getURL() : QUrl(); } int getResourceDownloadAttempts() { return _resource ? _resource->getDownloadAttempts() : 0; } + int getResourceDownloadAttemptsRemaining() { return _resource ? _resource->getDownloadAttemptsRemaining() : 0; } private: void startWatching(); diff --git a/libraries/networking/src/ReceivedMessage.cpp b/libraries/networking/src/ReceivedMessage.cpp index 5c8239f227..ecf7eb9fde 100644 --- a/libraries/networking/src/ReceivedMessage.cpp +++ b/libraries/networking/src/ReceivedMessage.cpp @@ -27,7 +27,6 @@ ReceivedMessage::ReceivedMessage(const NLPacketList& packetList) _packetType(packetList.getType()), _packetVersion(packetList.getVersion()), _senderSockAddr(packetList.getSenderSockAddr()), - _isComplete(true), _messageNumber(packetList.getMessageNumber()) { } diff --git a/libraries/networking/src/ReceivedMessage.h b/libraries/networking/src/ReceivedMessage.h index d154794719..ba61ef7044 100644 --- a/libraries/networking/src/ReceivedMessage.h +++ b/libraries/networking/src/ReceivedMessage.h @@ -101,7 +101,7 @@ private: std::atomic _isComplete { true }; std::atomic _failed { false }; - udt::Packet::MessageNumber _messageNumber { 0 }; + const udt::Packet::MessageNumber _messageNumber; // only settable on construction }; diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index ed0d5fd20b..1e09bd4608 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -621,8 +621,6 @@ void Resource::init() { } } -const int MAX_ATTEMPTS = 8; - void Resource::attemptRequest() { _startedLoading = true; @@ -724,14 +722,17 @@ void Resource::handleReplyFinished() { } else { switch (result) { case ResourceRequest::Result::Timeout: { - qCDebug(networking) << "Timed out loading" << _url << "received" << _bytesReceived << "total" << _bytesTotal << "attempt:" << _attempts << "of" << MAX_ATTEMPTS; + qCDebug(networking) << "Timed out loading" << _url << "received" << _bytesReceived << "total" << _bytesTotal + << "attempt:" << _attempts << "attemptsRemaining:" << _attemptsRemaining; // Fall through to other cases } case ResourceRequest::Result::ServerUnavailable: { - qCDebug(networking) << "Server Unavailable loading" << _url << "attempt:" << _attempts << "of" << MAX_ATTEMPTS; + qCDebug(networking) << "Server Unavailable loading" << _url << "attempt:" << _attempts << "attemptsRemaining:" << _attemptsRemaining; // retry with increasing delays const int BASE_DELAY_MS = 1000; if (_attempts++ < MAX_ATTEMPTS) { + _attemptsRemaining--; + auto waitTime = BASE_DELAY_MS * (int)pow(2.0, _attempts); qCDebug(networking).noquote() << "Server unavailable for" << _url << "- may retry in" << waitTime << "ms" @@ -743,7 +744,8 @@ void Resource::handleReplyFinished() { // fall through to final failure } default: { - qCDebug(networking) << "Error loading " << _url << "attempt:" << _attempts << "of" << MAX_ATTEMPTS; + _attemptsRemaining = 0; + qCDebug(networking) << "Error loading " << _url << "attempt:" << _attempts << "attemptsRemaining:" << _attemptsRemaining; auto error = (result == ResourceRequest::Timeout) ? QNetworkReply::TimeoutError : QNetworkReply::UnknownNetworkError; emit failed(error); diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index df21a296a6..8531560d99 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -396,7 +396,7 @@ public: const QUrl& getURL() const { return _url; } int getDownloadAttempts() { return _attempts; } - + int getDownloadAttemptsRemaining() { return _attemptsRemaining; } signals: /// Fired when the resource begins downloading. @@ -477,6 +477,10 @@ private: qint64 _bytesTotal{ 0 }; qint64 _bytes{ 0 }; int _attempts{ 0 }; + + const int MAX_ATTEMPTS = 8; + + int _attemptsRemaining { MAX_ATTEMPTS }; bool _isInScript{ false }; }; diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 3e67f2a296..5899ccf6b5 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -253,6 +253,7 @@ public: void renderDebugMeshBoxes(gpu::Batch& batch); int getResourceDownloadAttempts() { return _renderWatcher.getResourceDownloadAttempts(); } + int getResourceDownloadAttemptsRemaining() { return _renderWatcher.getResourceDownloadAttemptsRemaining(); } public slots: void loadURLFinished(bool success); From ff45ad53a3ac7a0d6fe4b5f243714c8d74dbedc3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 21 Apr 2017 10:40:41 -0700 Subject: [PATCH 08/29] some more CR cleanup --- interface/src/avatar/Avatar.cpp | 3 ++- libraries/networking/src/ResourceCache.cpp | 9 ++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 0a4cdefef1..ab3ba206f2 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -1115,7 +1115,8 @@ void Avatar::setModelURLFinished(bool success) { const int MAX_SKELETON_DOWNLOAD_ATTEMPTS = 4; // NOTE: we don't want to be as generous as ResourceCache is, we only want 4 attempts if (_skeletonModel->getResourceDownloadAttemptsRemaining() <= 0 || _skeletonModel->getResourceDownloadAttempts() > MAX_SKELETON_DOWNLOAD_ATTEMPTS) { - qCWarning(interfaceapp) << "Using default after failing to load Avatar model: " << _skeletonModelURL; + qCWarning(interfaceapp) << "Using default after failing to load Avatar model: " << _skeletonModelURL + << "after" << _skeletonModel->getResourceDownloadAttempts() << "attempts."; // call _skeletonModel.setURL, but leave our copy of _skeletonModelURL alone. This is so that // we don't redo this every time we receive an identity packet from the avatar with the bad url. QMetaObject::invokeMethod(_skeletonModel.get(), "setURL", diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 1e09bd4608..ba4de0e8ef 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -720,19 +720,18 @@ void Resource::handleReplyFinished() { emit loaded(data); downloadFinished(data); } else { + _attempts++; switch (result) { case ResourceRequest::Result::Timeout: { - qCDebug(networking) << "Timed out loading" << _url << "received" << _bytesReceived << "total" << _bytesTotal - << "attempt:" << _attempts << "attemptsRemaining:" << _attemptsRemaining; + qCDebug(networking) << "Timed out loading" << _url << "received" << _bytesReceived << "total" << _bytesTotal ; // Fall through to other cases } case ResourceRequest::Result::ServerUnavailable: { + _attemptsRemaining--; qCDebug(networking) << "Server Unavailable loading" << _url << "attempt:" << _attempts << "attemptsRemaining:" << _attemptsRemaining; // retry with increasing delays const int BASE_DELAY_MS = 1000; - if (_attempts++ < MAX_ATTEMPTS) { - _attemptsRemaining--; - + if (_attempts < MAX_ATTEMPTS) { auto waitTime = BASE_DELAY_MS * (int)pow(2.0, _attempts); qCDebug(networking).noquote() << "Server unavailable for" << _url << "- may retry in" << waitTime << "ms" From 088cdae320533494a97db424d20892359a2d9c4f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 21 Apr 2017 11:14:47 -0700 Subject: [PATCH 09/29] CR feedback --- assignment-client/src/avatars/AvatarMixer.cpp | 2 +- libraries/avatars/src/AvatarData.cpp | 8 +++----- libraries/avatars/src/AvatarData.h | 6 +++--- libraries/avatars/src/AvatarHashMap.cpp | 2 +- libraries/networking/src/ReceivedMessage.h | 2 +- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 6e163e6d0b..532452a12d 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -404,7 +404,7 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes // parse the identity packet and update the change timestamp if appropriate AvatarData::Identity identity; - quint64 messageNumber; + udt::Packet::MessageNumber messageNumber; AvatarData::parseAvatarIdentityPacket(message, identity, messageNumber); bool identityChanged = false; bool displayNameChanged = false; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index f541610ae9..4e9264829f 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1454,7 +1454,7 @@ QStringList AvatarData::getJointNames() const { return _jointNames; } -void AvatarData::parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut, quint64& messageNumberOut) { +void AvatarData::parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut, udt::Packet::MessageNumber& messageNumberOut) { const QByteArray& data = message->getMessage(); messageNumberOut = message->getMessageNumber(); QDataStream packetStream(data); @@ -1478,11 +1478,9 @@ QUrl AvatarData::cannonicalSkeletonModelURL(const QUrl& emptyURL) const { return _skeletonModelURL.scheme() == "file" ? emptyURL : _skeletonModelURL; } -void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, quint64 messageNumber) { - - if (messageNumber < _lastIdentityPacketMessageNumber && - _lastIdentityPacketMessageNumber < std::numeric_limits::max()) { +void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, udt::Packet::MessageNumber messageNumber) { + if (messageNumber < _lastIdentityPacketMessageNumber) { qCDebug(avatars) << "Ignoring late identity packet for avatar " << getSessionUUID() << "messageNumber:" << messageNumber << "_lastIdentityPacketMessageNumber:" << _lastIdentityPacketMessageNumber; return; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 2ffa3c020c..fdf3f0530c 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -532,11 +532,11 @@ public: AvatarEntityMap avatarEntityData; }; - static void parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut, quint64& messageNumberOut); + static void parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut, udt::Packet::MessageNumber& messageNumberOut); // identityChanged returns true if identity has changed, false otherwise. // displayNameChanged returns true if displayName has changed, false otherwise. - void processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, quint64 messageNumber); + void processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, udt::Packet::MessageNumber messageNumber); QByteArray identityByteArray() const; @@ -778,7 +778,7 @@ protected: quint64 _audioLoudnessChanged { 0 }; float _audioAverageLoudness { 0.0f }; - quint64 _lastIdentityPacketMessageNumber { 0 }; + udt::Packet::MessageNumber _lastIdentityPacketMessageNumber{ 0 }; private: friend void avatarStateFromFrame(const QByteArray& frameData, AvatarData* _avatar); diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index c4aa6c8479..c4cd303360 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -127,7 +127,7 @@ AvatarSharedPointer AvatarHashMap::parseAvatarData(QSharedPointer message, SharedNodePointer sendingNode) { AvatarData::Identity identity; - quint64 messageNumber; + udt::Packet::MessageNumber messageNumber; AvatarData::parseAvatarIdentityPacket(message, identity, messageNumber); // make sure this isn't for an ignored avatar diff --git a/libraries/networking/src/ReceivedMessage.h b/libraries/networking/src/ReceivedMessage.h index ba61ef7044..4787c849a2 100644 --- a/libraries/networking/src/ReceivedMessage.h +++ b/libraries/networking/src/ReceivedMessage.h @@ -50,7 +50,7 @@ public: qint64 getBytesLeftToRead() const { return _data.size() - _position; } - qint64 getMessageNumber() const { return _messageNumber; } + udt::Packet::MessageNumber getMessageNumber() const { return _messageNumber; } void seek(qint64 position) { _position = position; } From f07884602a4df09a7c8008e8042ab935fd79514c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 21 Apr 2017 13:13:29 -0700 Subject: [PATCH 10/29] more CR feedback --- libraries/networking/src/ReceivedMessage.h | 2 +- libraries/networking/src/ResourceCache.h | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/networking/src/ReceivedMessage.h b/libraries/networking/src/ReceivedMessage.h index 4787c849a2..414d9fee52 100644 --- a/libraries/networking/src/ReceivedMessage.h +++ b/libraries/networking/src/ReceivedMessage.h @@ -50,7 +50,7 @@ public: qint64 getBytesLeftToRead() const { return _data.size() - _position; } - udt::Packet::MessageNumber getMessageNumber() const { return _messageNumber; } + const udt::Packet::MessageNumber& getMessageNumber() const { return _messageNumber; } void seek(qint64 position) { _position = position; } diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index 8531560d99..1c586d53f6 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -395,8 +395,8 @@ public: const QUrl& getURL() const { return _url; } - int getDownloadAttempts() { return _attempts; } - int getDownloadAttemptsRemaining() { return _attemptsRemaining; } + unsigned int getDownloadAttempts() { return _attempts; } + unsigned int getDownloadAttemptsRemaining() { return _attemptsRemaining; } signals: /// Fired when the resource begins downloading. @@ -476,11 +476,11 @@ private: qint64 _bytesReceived{ 0 }; qint64 _bytesTotal{ 0 }; qint64 _bytes{ 0 }; - int _attempts{ 0 }; + unsigned int _attempts{ 0 }; - const int MAX_ATTEMPTS = 8; + static const int MAX_ATTEMPTS = 8; - int _attemptsRemaining { MAX_ATTEMPTS }; + unsigned int _attemptsRemaining { MAX_ATTEMPTS }; bool _isInScript{ false }; }; From da68c49dc158ab83cd004b8087a54a4115202d0d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 21 Apr 2017 13:31:40 -0700 Subject: [PATCH 11/29] more cleanup --- libraries/networking/src/udt/PacketList.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/PacketList.h b/libraries/networking/src/udt/PacketList.h index 09857c795e..9fc914e7fb 100644 --- a/libraries/networking/src/udt/PacketList.h +++ b/libraries/networking/src/udt/PacketList.h @@ -43,7 +43,7 @@ public: size_t getDataSize() const; size_t getMessageSize() const; QByteArray getMessage() const; - udt::Packet::MessageNumber getMessageNumber() const { return _messageNumber; } + MessageNumber getMessageNumber() const { return _messageNumber; } QByteArray getExtendedHeader() const { return _extendedHeader; } From c9aad6b762f40043b79fc621f7219deceb95ecb2 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 24 Apr 2017 17:36:05 -0700 Subject: [PATCH 12/29] new approach to the tpose fix, as well as other improvements --- assignment-client/src/avatars/AvatarMixer.cpp | 6 +-- interface/src/Application.cpp | 2 + interface/src/avatar/AvatarManager.cpp | 1 + interface/src/avatar/MyAvatar.cpp | 7 +++- libraries/avatars/src/AvatarData.cpp | 38 ++++++++++++++----- libraries/avatars/src/AvatarData.h | 21 ++++++++-- libraries/avatars/src/AvatarHashMap.cpp | 5 +-- .../networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 3 +- 9 files changed, 61 insertions(+), 24 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 532452a12d..182b38b124 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -393,6 +393,7 @@ void AvatarMixer::handleRequestsDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode) { + qDebug() << __FUNCTION__; auto start = usecTimestampNow(); auto nodeList = DependencyManager::get(); getOrCreateClientData(senderNode); @@ -404,11 +405,10 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes // parse the identity packet and update the change timestamp if appropriate AvatarData::Identity identity; - udt::Packet::MessageNumber messageNumber; - AvatarData::parseAvatarIdentityPacket(message, identity, messageNumber); + AvatarData::parseAvatarIdentityPacket(message, identity); bool identityChanged = false; bool displayNameChanged = false; - avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged, messageNumber); + avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged); if (identityChanged) { QMutexLocker nodeDataLocker(&nodeData->getMutex()); nodeData->flagIdentityChange(); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d7005f2c0d..a785cb5d7a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5198,6 +5198,8 @@ void Application::resettingDomain() { void Application::nodeAdded(SharedNodePointer node) const { if (node->getType() == NodeType::AvatarMixer) { // new avatar mixer, send off our identity packet right away + + qDebug() << __FUNCTION__ << "about to call... getMyAvatar()->sendIdentityPacket();"; getMyAvatar()->sendIdentityPacket(); getMyAvatar()->resetLastSent(); } diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 585776b395..6f9793ad34 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -213,6 +213,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { } } avatar->animateScaleChanges(deltaTime); + if (avatar->shouldDie()) { avatar->die(); removeAvatar(avatar->getID()); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index f4f078c9e5..c7d6b03f46 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -414,8 +414,11 @@ void MyAvatar::update(float deltaTime) { uint64_t now = usecTimestampNow(); if (now > _identityPacketExpiry || _avatarEntityDataLocallyEdited) { - _identityPacketExpiry = now + AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS; - sendIdentityPacket(); + _identityPacketExpiry = now + AVATAR_IDENTITY_PACKET_SEND_INTERVAL_USECS; + if (getIdentityDataChanged()) { + qDebug() << __FUNCTION__ << "about to call... sendIdentityPacket(); --- _identityPacketExpiry:" << _identityPacketExpiry << "_avatarEntityDataLocallyEdited:" << _avatarEntityDataLocallyEdited; + sendIdentityPacket(); + } } simulate(deltaTime); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 4e9264829f..a0a710cd82 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1454,16 +1454,20 @@ QStringList AvatarData::getJointNames() const { return _jointNames; } -void AvatarData::parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut, udt::Packet::MessageNumber& messageNumberOut) { +void AvatarData::parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut) { const QByteArray& data = message->getMessage(); - messageNumberOut = message->getMessageNumber(); QDataStream packetStream(data); - packetStream >> identityOut.uuid >> identityOut.skeletonModelURL >> identityOut.attachmentData >> identityOut.displayName >> identityOut.sessionDisplayName >> identityOut.avatarEntityData; + packetStream >> identityOut.uuid + >> identityOut.skeletonModelURL + >> identityOut.attachmentData + >> identityOut.displayName + >> identityOut.sessionDisplayName + >> identityOut.avatarEntityData + >> identityOut.updatedAt; #ifdef WANT_DEBUG qCDebug(avatars) << __FUNCTION__ - << "messageNumberOut:" << messageNumberOut << "identityOut.uuid:" << identityOut.uuid << "identityOut.skeletonModelURL:" << identityOut.skeletonModelURL << "identityOut.displayName:" << identityOut.displayName @@ -1478,15 +1482,16 @@ QUrl AvatarData::cannonicalSkeletonModelURL(const QUrl& emptyURL) const { return _skeletonModelURL.scheme() == "file" ? emptyURL : _skeletonModelURL; } -void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, udt::Packet::MessageNumber messageNumber) { +void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged) { - if (messageNumber < _lastIdentityPacketMessageNumber) { + if (identity.updatedAt < _identityUpdatedAt) { qCDebug(avatars) << "Ignoring late identity packet for avatar " << getSessionUUID() - << "messageNumber:" << messageNumber << "_lastIdentityPacketMessageNumber:" << _lastIdentityPacketMessageNumber; + << "identity.updatedAt:" << identity.updatedAt << "_identityUpdatedAt:" << _identityUpdatedAt; return; } - _lastIdentityPacketMessageNumber = messageNumber; + _identityUpdatedAt = identity.updatedAt; + qDebug() << __FUNCTION__ << "_identityUpdatedAt:" << _identityUpdatedAt; if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) { setSkeletonModelURL(identity.skeletonModelURL); @@ -1525,10 +1530,16 @@ void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityC QByteArray AvatarData::identityByteArray() const { QByteArray identityData; QDataStream identityStream(&identityData, QIODevice::Append); - const QUrl& urlToSend = cannonicalSkeletonModelURL(emptyURL); + const QUrl& urlToSend = cannonicalSkeletonModelURL(emptyURL); // depends on _skeletonModelURL _avatarEntitiesLock.withReadLock([&] { - identityStream << getSessionUUID() << urlToSend << _attachmentData << _displayName << getSessionDisplayNameForTransport() << _avatarEntityData; + identityStream << getSessionUUID() + << urlToSend + << _attachmentData + << _displayName + << getSessionDisplayNameForTransport() // depends on _sessionDisplayName + << _avatarEntityData + << _identityUpdatedAt; }); return identityData; @@ -1547,6 +1558,7 @@ void AvatarData::setSkeletonModelURL(const QUrl& skeletonModelURL) { qCDebug(avatars) << "Changing skeleton model for avatar" << getSessionUUID() << "to" << _skeletonModelURL.toString(); updateJointMappings(); + markIdentityDataChanged(); } void AvatarData::setDisplayName(const QString& displayName) { @@ -1556,6 +1568,7 @@ void AvatarData::setDisplayName(const QString& displayName) { sendIdentityPacket(); qCDebug(avatars) << "Changing display name for avatar to" << displayName; + markIdentityDataChanged(); } QVector AvatarData::getAttachmentData() const { @@ -1574,6 +1587,7 @@ void AvatarData::setAttachmentData(const QVector& attachmentData return; } _attachmentData = attachmentData; + markIdentityDataChanged(); } void AvatarData::attach(const QString& modelURL, const QString& jointName, @@ -1717,6 +1731,7 @@ void AvatarData::sendIdentityPacket() { }); _avatarEntityDataLocallyEdited = false; + _identityDataChanged = false; } void AvatarData::updateJointMappings() { @@ -2253,10 +2268,12 @@ void AvatarData::updateAvatarEntity(const QUuid& entityID, const QByteArray& ent if (_avatarEntityData.size() < MAX_NUM_AVATAR_ENTITIES) { _avatarEntityData.insert(entityID, entityData); _avatarEntityDataLocallyEdited = true; + markIdentityDataChanged(); } } else { itr.value() = entityData; _avatarEntityDataLocallyEdited = true; + markIdentityDataChanged(); } }); } @@ -2270,6 +2287,7 @@ void AvatarData::clearAvatarEntity(const QUuid& entityID) { _avatarEntitiesLock.withWriteLock([&] { _avatarEntityData.remove(entityID); _avatarEntityDataLocallyEdited = true; + markIdentityDataChanged(); }); } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index fdf3f0530c..b7877f29df 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -249,6 +249,7 @@ static const float MIN_AVATAR_SCALE = .005f; const float MAX_AUDIO_LOUDNESS = 1000.0f; // close enough for mouth animation const int AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS = 1000; +const int AVATAR_IDENTITY_PACKET_SEND_INTERVAL_USECS = AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS * USECS_PER_MSEC; // See also static AvatarData::defaultFullAvatarModelUrl(). const QString DEFAULT_FULL_AVATAR_MODEL_NAME = QString("Default"); @@ -530,13 +531,14 @@ public: QString displayName; QString sessionDisplayName; AvatarEntityMap avatarEntityData; + quint64 updatedAt; }; - static void parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut, udt::Packet::MessageNumber& messageNumberOut); + static void parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut); // identityChanged returns true if identity has changed, false otherwise. // displayNameChanged returns true if displayName has changed, false otherwise. - void processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, udt::Packet::MessageNumber messageNumber); + void processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged); QByteArray identityByteArray() const; @@ -546,7 +548,10 @@ public: virtual void setSkeletonModelURL(const QUrl& skeletonModelURL); virtual void setDisplayName(const QString& displayName); - virtual void setSessionDisplayName(const QString& sessionDisplayName) { _sessionDisplayName = sessionDisplayName; }; + virtual void setSessionDisplayName(const QString& sessionDisplayName) { + _sessionDisplayName = sessionDisplayName; + markIdentityDataChanged(); + } Q_INVOKABLE QVector getAttachmentData() const; Q_INVOKABLE virtual void setAttachmentData(const QVector& attachmentData); @@ -619,6 +624,7 @@ public: static float _avatarSortCoefficientCenter; static float _avatarSortCoefficientAge; + bool getIdentityDataChanged() const { return _identityDataChanged; } // has the identity data changed since the last time sendIdentityPacket() was called signals: @@ -778,7 +784,14 @@ protected: quint64 _audioLoudnessChanged { 0 }; float _audioAverageLoudness { 0.0f }; - udt::Packet::MessageNumber _lastIdentityPacketMessageNumber{ 0 }; + bool _identityDataChanged { false }; + quint64 _identityUpdatedAt { 0 }; + + void markIdentityDataChanged() { + _identityDataChanged = true; + _identityUpdatedAt = usecTimestampNow(); + } + private: friend void avatarStateFromFrame(const QByteArray& frameData, AvatarData* _avatar); diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index c4cd303360..9d4d96c5d0 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -127,8 +127,7 @@ AvatarSharedPointer AvatarHashMap::parseAvatarData(QSharedPointer message, SharedNodePointer sendingNode) { AvatarData::Identity identity; - udt::Packet::MessageNumber messageNumber; - AvatarData::parseAvatarIdentityPacket(message, identity, messageNumber); + AvatarData::parseAvatarIdentityPacket(message, identity); // make sure this isn't for an ignored avatar auto nodeList = DependencyManager::get(); @@ -149,7 +148,7 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer auto avatar = newOrExistingAvatar(identity.uuid, sendingNode); bool identityChanged = false; bool displayNameChanged = false; - avatar->processAvatarIdentity(identity, identityChanged, displayNameChanged, messageNumber); + avatar->processAvatarIdentity(identity, identityChanged, displayNameChanged); } } diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 246821908a..67a63bb530 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -56,7 +56,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::AvatarData: case PacketType::BulkAvatarData: case PacketType::KillAvatar: - return static_cast(AvatarMixerPacketVersion::StickAndBallDefaultAvatar); + return static_cast(AvatarMixerPacketVersion::IdentityPacketsIncludeUpdateTime); case PacketType::MessagesData: return static_cast(MessageDataVersion::TextOrBinaryData); case PacketType::ICEServerHeartbeat: diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 03a773f24f..bb743f4363 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -229,7 +229,8 @@ enum class AvatarMixerPacketVersion : PacketVersion { ImmediateSessionDisplayNameUpdates, VariableAvatarData, AvatarAsChildFixes, - StickAndBallDefaultAvatar + StickAndBallDefaultAvatar, + IdentityPacketsIncludeUpdateTime }; enum class DomainConnectRequestVersion : PacketVersion { From 382645ddd034429923d7282d96abb45c02e62ad6 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 24 Apr 2017 18:01:54 -0700 Subject: [PATCH 13/29] more cleanup --- assignment-client/src/Agent.cpp | 2 +- assignment-client/src/avatars/AvatarMixer.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 12 ++++-------- interface/src/avatar/MyAvatar.h | 2 -- libraries/avatars/src/AvatarData.cpp | 12 ++++++------ libraries/avatars/src/AvatarData.h | 3 +-- libraries/avatars/src/AvatarHashMap.cpp | 2 +- 7 files changed, 14 insertions(+), 21 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 46e826c596..bb72d679cb 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -537,7 +537,7 @@ void Agent::setIsAvatar(bool isAvatar) { connect(_avatarIdentityTimer, &QTimer::timeout, this, &Agent::sendAvatarIdentityPacket); // start the timers - _avatarIdentityTimer->start(AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS); + _avatarIdentityTimer->start(AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS); // FIXME - we shouldn't really need to constantly send identity packets // tell the avatarAudioTimer to start ticking emit startAvatarAudioTimer(); diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 182b38b124..43eac8ebbe 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -405,7 +405,7 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes // parse the identity packet and update the change timestamp if appropriate AvatarData::Identity identity; - AvatarData::parseAvatarIdentityPacket(message, identity); + AvatarData::parseAvatarIdentityPacket(message->getMessage(), identity); bool identityChanged = false; bool displayNameChanged = false; avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index c7d6b03f46..59b262a308 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -412,13 +412,9 @@ void MyAvatar::update(float deltaTime) { Q_ARG(glm::vec3, (getPosition() - halfBoundingBoxDimensions)), Q_ARG(glm::vec3, (halfBoundingBoxDimensions*2.0f))); - uint64_t now = usecTimestampNow(); - if (now > _identityPacketExpiry || _avatarEntityDataLocallyEdited) { - _identityPacketExpiry = now + AVATAR_IDENTITY_PACKET_SEND_INTERVAL_USECS; - if (getIdentityDataChanged()) { - qDebug() << __FUNCTION__ << "about to call... sendIdentityPacket(); --- _identityPacketExpiry:" << _identityPacketExpiry << "_avatarEntityDataLocallyEdited:" << _avatarEntityDataLocallyEdited; - sendIdentityPacket(); - } + if (getIdentityDataChanged()) { + qDebug() << __FUNCTION__ << "about to call... sendIdentityPacket();"; + sendIdentityPacket(); } simulate(deltaTime); @@ -1261,7 +1257,7 @@ void MyAvatar::useFullAvatarURL(const QUrl& fullAvatarURL, const QString& modelN setSkeletonModelURL(fullAvatarURL); UserActivityLogger::getInstance().changedModel("skeleton", urlString); } - _identityPacketExpiry = 0; // triggers an identity packet next update() + markIdentityDataChanged(); } void MyAvatar::setAttachmentData(const QVector& attachmentData) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 74af44c99a..a201ee54c9 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -701,8 +701,6 @@ private: std::mutex _holdActionsMutex; std::vector _holdActions; - uint64_t _identityPacketExpiry { 0 }; - float AVATAR_MOVEMENT_ENERGY_CONSTANT { 0.001f }; float AUDIO_ENERGY_CONSTANT { 0.000001f }; float MAX_AVATAR_MOVEMENT_PER_FRAME { 30.0f }; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 491f667067..532e762e0e 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -14,7 +14,6 @@ #include #include -#include #include #include @@ -1455,8 +1454,7 @@ QStringList AvatarData::getJointNames() const { return _jointNames; } -void AvatarData::parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut) { - const QByteArray& data = message->getMessage(); +void AvatarData::parseAvatarIdentityPacket(const QByteArray& data, Identity& identityOut) { QDataStream packetStream(data); packetStream >> identityOut.uuid @@ -1491,9 +1489,6 @@ void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityC return; } - _identityUpdatedAt = identity.updatedAt; - qDebug() << __FUNCTION__ << "_identityUpdatedAt:" << _identityUpdatedAt; - if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) { setSkeletonModelURL(identity.skeletonModelURL); identityChanged = true; @@ -1526,6 +1521,11 @@ void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityC // flag this avatar as non-stale by updating _averageBytesReceived const int BOGUS_NUM_BYTES = 1; _averageBytesReceived.updateAverage(BOGUS_NUM_BYTES); + + // use the timestamp from this identity, since we want to honor the updated times in "server clock" + // this will overwrite any changes we made locally to this AvatarData's _identityUpdatedAt + _identityUpdatedAt = identity.updatedAt; + qDebug() << __FUNCTION__ << "_identityUpdatedAt:" << _identityUpdatedAt; } QByteArray AvatarData::identityByteArray() const { diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index b7877f29df..b4d3839d8a 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -249,7 +249,6 @@ static const float MIN_AVATAR_SCALE = .005f; const float MAX_AUDIO_LOUDNESS = 1000.0f; // close enough for mouth animation const int AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS = 1000; -const int AVATAR_IDENTITY_PACKET_SEND_INTERVAL_USECS = AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS * USECS_PER_MSEC; // See also static AvatarData::defaultFullAvatarModelUrl(). const QString DEFAULT_FULL_AVATAR_MODEL_NAME = QString("Default"); @@ -534,7 +533,7 @@ public: quint64 updatedAt; }; - static void parseAvatarIdentityPacket(const QSharedPointer& message, Identity& identityOut); + static void parseAvatarIdentityPacket(const QByteArray& data, Identity& identityOut); // identityChanged returns true if identity has changed, false otherwise. // displayNameChanged returns true if displayName has changed, false otherwise. diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 9d4d96c5d0..0d341c684e 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -127,7 +127,7 @@ AvatarSharedPointer AvatarHashMap::parseAvatarData(QSharedPointer message, SharedNodePointer sendingNode) { AvatarData::Identity identity; - AvatarData::parseAvatarIdentityPacket(message, identity); + AvatarData::parseAvatarIdentityPacket(message->getMessage(), identity); // make sure this isn't for an ignored avatar auto nodeList = DependencyManager::get(); From 95a3e0a09295cd6ed83c128f4a0461d97448f3d9 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 24 Apr 2017 18:06:33 -0700 Subject: [PATCH 14/29] fix whitespace --- libraries/networking/src/ResourceCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index ba4de0e8ef..fcf199bec3 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -723,7 +723,7 @@ void Resource::handleReplyFinished() { _attempts++; switch (result) { case ResourceRequest::Result::Timeout: { - qCDebug(networking) << "Timed out loading" << _url << "received" << _bytesReceived << "total" << _bytesTotal ; + qCDebug(networking) << "Timed out loading" << _url << "received" << _bytesReceived << "total" << _bytesTotal; // Fall through to other cases } case ResourceRequest::Result::ServerUnavailable: { From d179135a87568b882a28ded16d1ce5ad3fbbc768 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 24 Apr 2017 18:21:22 -0700 Subject: [PATCH 15/29] remove dead code --- libraries/networking/src/ReceivedMessage.cpp | 6 ++---- libraries/networking/src/ReceivedMessage.h | 5 ----- libraries/networking/src/udt/PacketList.h | 2 -- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/libraries/networking/src/ReceivedMessage.cpp b/libraries/networking/src/ReceivedMessage.cpp index ecf7eb9fde..2c5a11334b 100644 --- a/libraries/networking/src/ReceivedMessage.cpp +++ b/libraries/networking/src/ReceivedMessage.cpp @@ -26,8 +26,7 @@ ReceivedMessage::ReceivedMessage(const NLPacketList& packetList) _sourceID(packetList.getSourceID()), _packetType(packetList.getType()), _packetVersion(packetList.getVersion()), - _senderSockAddr(packetList.getSenderSockAddr()), - _messageNumber(packetList.getMessageNumber()) + _senderSockAddr(packetList.getSenderSockAddr()) { } @@ -39,8 +38,7 @@ ReceivedMessage::ReceivedMessage(NLPacket& packet) _packetType(packet.getType()), _packetVersion(packet.getVersion()), _senderSockAddr(packet.getSenderSockAddr()), - _isComplete(packet.getPacketPosition() == NLPacket::ONLY), - _messageNumber(packet.getMessageNumber()) + _isComplete(packet.getPacketPosition() == NLPacket::ONLY) { } diff --git a/libraries/networking/src/ReceivedMessage.h b/libraries/networking/src/ReceivedMessage.h index 414d9fee52..3acb7163e7 100644 --- a/libraries/networking/src/ReceivedMessage.h +++ b/libraries/networking/src/ReceivedMessage.h @@ -50,8 +50,6 @@ public: qint64 getBytesLeftToRead() const { return _data.size() - _position; } - const udt::Packet::MessageNumber& getMessageNumber() const { return _messageNumber; } - void seek(qint64 position) { _position = position; } qint64 peek(char* data, qint64 size); @@ -100,9 +98,6 @@ private: std::atomic _isComplete { true }; std::atomic _failed { false }; - - const udt::Packet::MessageNumber _messageNumber; // only settable on construction - }; Q_DECLARE_METATYPE(ReceivedMessage*) diff --git a/libraries/networking/src/udt/PacketList.h b/libraries/networking/src/udt/PacketList.h index 9fc914e7fb..5083d77ec9 100644 --- a/libraries/networking/src/udt/PacketList.h +++ b/libraries/networking/src/udt/PacketList.h @@ -43,8 +43,6 @@ public: size_t getDataSize() const; size_t getMessageSize() const; QByteArray getMessage() const; - MessageNumber getMessageNumber() const { return _messageNumber; } - QByteArray getExtendedHeader() const { return _extendedHeader; } From 5164aa405696d01879a040db90103e1660d4b59f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 25 Apr 2017 18:21:09 -0700 Subject: [PATCH 16/29] hacking --- interface/src/Application.cpp | 1 + libraries/avatars/src/AvatarData.cpp | 3 +++ libraries/avatars/src/AvatarData.h | 11 ++++------- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dfe563b65a..0b8e37c21f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5209,6 +5209,7 @@ void Application::nodeAdded(SharedNodePointer node) const { // new avatar mixer, send off our identity packet right away qDebug() << __FUNCTION__ << "about to call... getMyAvatar()->sendIdentityPacket();"; + getMyAvatar()->markIdentityDataChanged(); getMyAvatar()->sendIdentityPacket(); getMyAvatar()->resetLastSent(); } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 532e762e0e..af43b16861 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1489,6 +1489,9 @@ void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityC return; } + qCDebug(avatars) << __FUNCTION__ << "got identity packet for avatar " << getSessionUUID() + << "identity.updatedAt:" << identity.updatedAt << "_identityUpdatedAt:" << _identityUpdatedAt; + if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) { setSkeletonModelURL(identity.skeletonModelURL); identityChanged = true; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index b4d3839d8a..7b24ae6cd7 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -624,7 +624,10 @@ public: static float _avatarSortCoefficientAge; bool getIdentityDataChanged() const { return _identityDataChanged; } // has the identity data changed since the last time sendIdentityPacket() was called - + void markIdentityDataChanged() { + _identityDataChanged = true; + _identityUpdatedAt = usecTimestampNow(); + } signals: void displayNameChanged(); @@ -786,12 +789,6 @@ protected: bool _identityDataChanged { false }; quint64 _identityUpdatedAt { 0 }; - void markIdentityDataChanged() { - _identityDataChanged = true; - _identityUpdatedAt = usecTimestampNow(); - } - - private: friend void avatarStateFromFrame(const QByteArray& frameData, AvatarData* _avatar); static QUrl _defaultFullAvatarModelUrl; From 517bbc795f6590cd490ccf96be408ac6b6749563 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Apr 2017 11:29:42 -0700 Subject: [PATCH 17/29] interface/ --- libraries/avatars/src/AvatarData.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index af43b16861..a4ea016e79 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1532,11 +1532,22 @@ void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityC } QByteArray AvatarData::identityByteArray() const { + qDebug() << __FUNCTION__; + QByteArray identityData; QDataStream identityStream(&identityData, QIODevice::Append); const QUrl& urlToSend = cannonicalSkeletonModelURL(emptyURL); // depends on _skeletonModelURL _avatarEntitiesLock.withReadLock([&] { + + qDebug() << __FUNCTION__ + << "session:" << getSessionUUID() + << "url:" << urlToSend + << "displayName:" << _displayName + << "sessionDisplayName:" << getSessionDisplayNameForTransport() + << "identityUpdatedAt:" << _identityUpdatedAt; + + identityStream << getSessionUUID() << urlToSend << _attachmentData @@ -1720,6 +1731,7 @@ void AvatarData::sendAvatarDataPacket() { } void AvatarData::sendIdentityPacket() { + qDebug() << __FUNCTION__; auto nodeList = DependencyManager::get(); QByteArray identityData = identityByteArray(); @@ -1728,9 +1740,14 @@ void AvatarData::sendIdentityPacket() { packetList->write(identityData); nodeList->eachMatchingNode( [&](const SharedNodePointer& node)->bool { + if (node->getType() == NodeType::AvatarMixer) { + qDebug() << "AvatarData::sendIdentityPacket()... found mixer node, node->getActiveSocket():" << node->getActiveSocket(); + } + return node->getType() == NodeType::AvatarMixer && node->getActiveSocket(); }, [&](const SharedNodePointer& node) { + qDebug() << "AvatarData::sendIdentityPacket()... about to call.... nodeList->sendPacketList(std::move(packetList), *node);"; nodeList->sendPacketList(std::move(packetList), *node); }); From 5dd6daaad78a76565fa839e62ea699312cb8452d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Apr 2017 11:42:38 -0700 Subject: [PATCH 18/29] send identity on nodeActivated not nodeAdded --- interface/src/Application.cpp | 17 +++++++++-------- interface/src/main.cpp | 31 +++++++++++++++++++------------ 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2d39a0e993..4801f39272 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5205,14 +5205,7 @@ void Application::resettingDomain() { } void Application::nodeAdded(SharedNodePointer node) const { - if (node->getType() == NodeType::AvatarMixer) { - // new avatar mixer, send off our identity packet right away - - qDebug() << __FUNCTION__ << "about to call... getMyAvatar()->sendIdentityPacket();"; - getMyAvatar()->markIdentityDataChanged(); - getMyAvatar()->sendIdentityPacket(); - getMyAvatar()->resetLastSent(); - } + // nothing to do here } void Application::nodeActivated(SharedNodePointer node) { @@ -5248,6 +5241,14 @@ void Application::nodeActivated(SharedNodePointer node) { if (node->getType() == NodeType::AudioMixer) { DependencyManager::get()->negotiateAudioFormat(); } + + if (node->getType() == NodeType::AvatarMixer) { + // new avatar mixer, send off our identity packet right away + qDebug() << __FUNCTION__ << "about to call... getMyAvatar()->sendIdentityPacket();"; + getMyAvatar()->markIdentityDataChanged(); + getMyAvatar()->sendIdentityPacket(); + getMyAvatar()->resetLastSent(); + } } void Application::nodeKilled(SharedNodePointer node) { diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 39b37e3d19..99dbb1a28e 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -79,6 +79,25 @@ int main(int argc, const char* argv[]) { instanceMightBeRunning = false; } + QCommandLineParser parser; + QCommandLineOption checkMinSpecOption("checkMinSpec", "Check if machine meets minimum specifications"); + QCommandLineOption runServerOption("runServer", "Whether to run the server"); + QCommandLineOption serverContentPathOption("serverContentPath", "Where to find server content", "serverContentPath"); + QCommandLineOption allowMultipleInstancesOption("allowMultipleInstances", "Allow multiple instances to run"); + parser.addOption(checkMinSpecOption); + parser.addOption(runServerOption); + parser.addOption(serverContentPathOption); + parser.addOption(allowMultipleInstancesOption); + parser.parse(arguments); + bool runServer = parser.isSet(runServerOption); + bool serverContentPathOptionIsSet = parser.isSet(serverContentPathOption); + QString serverContentPathOptionValue = serverContentPathOptionIsSet ? parser.value(serverContentPathOption) : QString(); + bool allowMultipleInstances = parser.isSet(allowMultipleInstancesOption); + + if (allowMultipleInstances) { + instanceMightBeRunning = false; + } + if (instanceMightBeRunning) { // Try to connect and send message to existing interface instance QLocalSocket socket; @@ -137,18 +156,6 @@ int main(int argc, const char* argv[]) { } } - QCommandLineParser parser; - QCommandLineOption checkMinSpecOption("checkMinSpec", "Check if machine meets minimum specifications"); - QCommandLineOption runServerOption("runServer", "Whether to run the server"); - QCommandLineOption serverContentPathOption("serverContentPath", "Where to find server content", "serverContentPath"); - parser.addOption(checkMinSpecOption); - parser.addOption(runServerOption); - parser.addOption(serverContentPathOption); - parser.parse(arguments); - bool runServer = parser.isSet(runServerOption); - bool serverContentPathOptionIsSet = parser.isSet(serverContentPathOption); - QString serverContentPathOptionValue = serverContentPathOptionIsSet ? parser.value(serverContentPathOption) : QString(); - QElapsedTimer startupTime; startupTime.start(); From 75c2776836aee8c5b82aa23ac9c1554bcec9518d Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 25 Apr 2017 09:41:37 -0700 Subject: [PATCH 19/29] remove keep-alive packet from avatar-mixer --- assignment-client/src/avatars/AvatarMixerSlave.cpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixerSlave.cpp b/assignment-client/src/avatars/AvatarMixerSlave.cpp index 6e3dd150a4..2ad8bb58ed 100644 --- a/assignment-client/src/avatars/AvatarMixerSlave.cpp +++ b/assignment-client/src/avatars/AvatarMixerSlave.cpp @@ -263,16 +263,8 @@ void AvatarMixerSlave::broadcastAvatarData(const SharedNodePointer& node) { // make sure we haven't already sent this data from this sender to this receiver // or that somehow we haven't sent if (lastSeqToReceiver == lastSeqFromSender && lastSeqToReceiver != 0) { - // don't ignore this avatar if we haven't sent any update for a long while - // in an effort to prevent other interfaces from deleting a stale avatar instance - uint64_t lastBroadcastTime = nodeData->getLastBroadcastTime(avatarNode->getUUID()); - const AvatarMixerClientData* otherNodeData = reinterpret_cast(avatarNode->getLinkedData()); - const uint64_t AVATAR_UPDATE_STALE = AVATAR_UPDATE_TIMEOUT - USECS_PER_SECOND; - if (lastBroadcastTime > otherNodeData->getIdentityChangeTimestamp() && - lastBroadcastTime + AVATAR_UPDATE_STALE > startIgnoreCalculation) { - ++numAvatarsHeldBack; - shouldIgnore = true; - } + ++numAvatarsHeldBack; + shouldIgnore = true; } else if (lastSeqFromSender - lastSeqToReceiver > 1) { // this is a skip - we still send the packet but capture the presence of the skip so we see it happening ++numAvatarsWithSkippedFrames; @@ -285,7 +277,7 @@ void AvatarMixerSlave::broadcastAvatarData(const SharedNodePointer& node) { int avatarRank = 0; // this is overly conservative, because it includes some avatars we might not consider - int remainingAvatars = (int)sortedAvatars.size(); + int remainingAvatars = (int)sortedAvatars.size(); while (!sortedAvatars.empty()) { AvatarPriority sortData = sortedAvatars.top(); From 08972da843df54f117ab4e0fa763187851fb6bc4 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 25 Apr 2017 09:41:21 -0700 Subject: [PATCH 20/29] remove unused Node::_isAlive cruft --- libraries/networking/src/Node.cpp | 1 - libraries/networking/src/Node.h | 4 ---- 2 files changed, 5 deletions(-) diff --git a/libraries/networking/src/Node.cpp b/libraries/networking/src/Node.cpp index 033f4bbaa8..60227eeaa1 100644 --- a/libraries/networking/src/Node.cpp +++ b/libraries/networking/src/Node.cpp @@ -56,7 +56,6 @@ Node::Node(const QUuid& uuid, NodeType_t type, const HifiSockAddr& publicSocket, NetworkPeer(uuid, publicSocket, localSocket, parent), _type(type), _connectionSecret(connectionSecret), - _isAlive(true), _pingMs(-1), // "Uninitialized" _clockSkewUsec(0), _mutex(), diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h index 28afb8b943..d1bbffd817 100644 --- a/libraries/networking/src/Node.h +++ b/libraries/networking/src/Node.h @@ -54,9 +54,6 @@ public: NodeData* getLinkedData() const { return _linkedData.get(); } void setLinkedData(std::unique_ptr linkedData) { _linkedData = std::move(linkedData); } - bool isAlive() const { return _isAlive; } - void setAlive(bool isAlive) { _isAlive = isAlive; } - int getPingMs() const { return _pingMs; } void setPingMs(int pingMs) { _pingMs = pingMs; } @@ -92,7 +89,6 @@ private: QUuid _connectionSecret; std::unique_ptr _linkedData; - bool _isAlive; int _pingMs; qint64 _clockSkewUsec; QMutex _mutex; From 4511156d7bbba1cd558223eb14a10b6a2e21470f Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 25 Apr 2017 09:42:03 -0700 Subject: [PATCH 21/29] cache avatar identity info forever --- interface/src/avatar/Avatar.cpp | 31 ++++++++++--- interface/src/avatar/Avatar.h | 3 ++ interface/src/avatar/AvatarManager.cpp | 60 ++++++++------------------ interface/src/avatar/AvatarManager.h | 5 +-- libraries/avatars/src/AvatarData.cpp | 3 -- libraries/avatars/src/AvatarData.h | 10 +---- libraries/avatars/src/AvatarHashMap.h | 2 +- 7 files changed, 50 insertions(+), 64 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index ab3ba206f2..4f8cc6655e 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -115,8 +115,6 @@ Avatar::Avatar(QThread* thread, RigPointer rig) : } Avatar::~Avatar() { - assert(isDead()); // mark dead before calling the dtor - auto treeRenderer = DependencyManager::get(); EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr; if (entityTree) { @@ -447,6 +445,24 @@ float Avatar::getSimulationRate(const QString& rateName) const { return 0.0f; } +void Avatar::getIdentity(Identity& identity) const { + identity.uuid = getSessionUUID(); + identity.skeletonModelURL = _skeletonModelURL; + identity.attachmentData = _attachmentData; + identity.displayName = _displayName; + identity.sessionDisplayName = _sessionDisplayName; + identity.avatarEntityData = _avatarEntityData; +} + +void Avatar::setIdentity(const Identity& identity) { + assert(identity.uuid == getSessionUUID()); + setSkeletonModelURL(identity.skeletonModelURL); + _attachmentData = identity.attachmentData; + _displayName = identity.displayName; + _sessionDisplayName = identity.sessionDisplayName; + _avatarEntityData = identity.avatarEntityData; +} + bool Avatar::isLookingAtMe(AvatarSharedPointer avatar) const { const float HEAD_SPHERE_RADIUS = 0.1f; glm::vec3 theirLookAt = dynamic_pointer_cast(avatar)->getHead()->getLookAtPosition(); @@ -510,12 +526,13 @@ static TextRenderer3D* textRenderer(TextRendererType type) { void Avatar::addToScene(AvatarSharedPointer self, const render::ScenePointer& scene, render::Transaction& transaction) { auto avatarPayload = new render::Payload(self); auto avatarPayloadPointer = Avatar::PayloadPointer(avatarPayload); - _renderItemID = scene->allocateID(); - transaction.resetItem(_renderItemID, avatarPayloadPointer); - _skeletonModel->addToScene(scene, transaction); + if (_skeletonModel->addToScene(scene, transaction)) { + _renderItemID = scene->allocateID(); + transaction.resetItem(_renderItemID, avatarPayloadPointer); - for (auto& attachmentModel : _attachmentModels) { - attachmentModel->addToScene(scene, transaction); + for (auto& attachmentModel : _attachmentModels) { + attachmentModel->addToScene(scene, transaction); + } } } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 8c055885fd..3b9bb7e0f2 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -238,6 +238,9 @@ public: return (lerpValue*(4.0f - 2.0f * lerpValue) - 1.0f); } + void getIdentity(Identity& identity) const; + void setIdentity(const Identity& identity); + public slots: // FIXME - these should be migrated to use Pose data instead diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 6f9793ad34..e3293a7874 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -214,11 +214,6 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { } avatar->animateScaleChanges(deltaTime); - if (avatar->shouldDie()) { - avatar->die(); - removeAvatar(avatar->getID()); - } - const float OUT_OF_VIEW_THRESHOLD = 0.5f * AvatarData::OUT_OF_VIEW_PENALTY; uint64_t now = usecTimestampNow(); if (now < updateExpiry) { @@ -331,35 +326,14 @@ AvatarSharedPointer AvatarManager::newSharedAvatar() { return std::make_shared(qApp->thread(), std::make_shared()); } -void AvatarManager::processAvatarDataPacket(QSharedPointer message, SharedNodePointer sendingNode) { - PerformanceTimer perfTimer("receiveAvatar"); - // enumerate over all of the avatars in this packet - // only add them if mixerWeakPointer points to something (meaning that mixer is still around) - while (message->getBytesLeftToRead()) { - AvatarSharedPointer avatarData = parseAvatarData(message, sendingNode); - if (avatarData) { - auto avatar = std::static_pointer_cast(avatarData); - if (avatar->isInScene()) { - if (!_shouldRender) { - // rare transition so we process the transaction immediately - const render::ScenePointer& scene = qApp->getMain3DScene(); - render::Transaction transaction; - avatar->removeFromScene(avatar, scene, transaction); - if (scene) { - scene->enqueueTransaction(transaction); - } - } - } else if (_shouldRender) { - // very rare transition so we process the transaction immediately - const render::ScenePointer& scene = qApp->getMain3DScene(); - render::Transaction transaction; - avatar->addToScene(avatar, scene, transaction); - if (scene) { - scene->enqueueTransaction(transaction); - } - } - } +AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { + AvatarSharedPointer avatarData = AvatarHashMap::addAvatar(sessionUUID, mixerWeakPointer); + QMap::iterator itr = _identityCache.find(sessionUUID); + if (itr != _identityCache.end()) { + auto avatar = std::static_pointer_cast(avatarData); + avatar->setIdentity(*itr); } + return avatarData; } void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason) { @@ -367,8 +341,13 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar // removedAvatar is a shared pointer to an AvatarData but we need to get to the derived Avatar // class in this context so we can call methods that don't exist at the base class. - Avatar* avatar = static_cast(removedAvatar.get()); - avatar->die(); + auto avatar = std::static_pointer_cast(removedAvatar); + + // there is no way to request identity data from the avatar-mixer + // therefore whenever we remove an avatar we cache the identity in case we need it later + AvatarData::Identity identity; + avatar->getIdentity(identity); + _identityCache[avatar->getSessionUUID()] = identity; AvatarMotionState* motionState = avatar->getMotionState(); if (motionState) { @@ -404,14 +383,11 @@ void AvatarManager::clearOtherAvatars() { if (avatar->isInScene()) { avatar->removeFromScene(avatar, scene, transaction); } - AvatarMotionState* motionState = avatar->getMotionState(); - if (motionState) { - _motionStatesThatMightUpdate.remove(motionState); - _motionStatesToAddToPhysics.remove(motionState); - _motionStatesToRemoveFromPhysics.push_back(motionState); - } + handleRemovedAvatar(avatar); + avatarIterator = _avatarHash.erase(avatarIterator); + } else { + ++avatarIterator; } - ++avatarIterator; } scene->enqueueTransaction(transaction); _myAvatar->clearLookAtTargetAvatar(); diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 6eabbd081f..af372f7627 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -98,9 +98,6 @@ public slots: void setShouldShowReceiveStats(bool shouldShowReceiveStats) { _shouldShowReceiveStats = shouldShowReceiveStats; } void updateAvatarRenderStatus(bool shouldRenderAvatars); -protected slots: - void processAvatarDataPacket(QSharedPointer message, SharedNodePointer sendingNode) override; - private: explicit AvatarManager(QObject* parent = 0); explicit AvatarManager(const AvatarManager& other); @@ -108,6 +105,7 @@ private: void simulateAvatarFades(float deltaTime); AvatarSharedPointer newSharedAvatar() override; + AvatarSharedPointer addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) override; void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; QVector _avatarsToFade; @@ -120,6 +118,7 @@ private: quint64 _lastSendAvatarDataTime = 0; // Controls MyAvatar send data rate. QVector _localLights; + QMap _identityCache; bool _shouldShowReceiveStats = false; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index a4ea016e79..e75f801885 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1521,9 +1521,6 @@ void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityC setAvatarEntityData(identity.avatarEntityData); identityChanged = true; } - // flag this avatar as non-stale by updating _averageBytesReceived - const int BOGUS_NUM_BYTES = 1; - _averageBytesReceived.updateAverage(BOGUS_NUM_BYTES); // use the timestamp from this identity, since we want to honor the updated times in "server clock" // this will overwrite any changes we made locally to this AvatarData's _identityUpdatedAt diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 7b24ae6cd7..036e862b1d 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -110,9 +110,7 @@ const char LEFT_HAND_POINTING_FLAG = 1; const char RIGHT_HAND_POINTING_FLAG = 2; const char IS_FINGER_POINTING_FLAG = 4; -const qint64 AVATAR_UPDATE_TIMEOUT = 5 * USECS_PER_SECOND; - -// AvatarData state flags - we store the details about the packet encoding in the first byte, +// AvatarData state flags - we store the details about the packet encoding in the first byte, // before the "header" structure const char AVATARDATA_FLAGS_MINIMUM = 0; @@ -568,7 +566,6 @@ public: void setOwningAvatarMixer(const QWeakPointer& owningAvatarMixer) { _owningAvatarMixer = owningAvatarMixer; } - int getUsecsSinceLastUpdate() const { return _averageBytesReceived.getUsecsSinceLastEvent(); } int getAverageBytesReceivedPerSecond() const; int getReceiveRate() const; @@ -604,9 +601,6 @@ public: return _lastSentJointData; } - - bool shouldDie() const { return _owningAvatarMixer.isNull() || getUsecsSinceLastUpdate() > AVATAR_UPDATE_TIMEOUT; } - static const float OUT_OF_VIEW_PENALTY; static void sortAvatars( @@ -631,7 +625,7 @@ public: signals: void displayNameChanged(); - + public slots: void sendAvatarDataPacket(); void sendIdentityPacket(); diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index e944c7c887..21ea8081c7 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -57,7 +57,7 @@ public slots: protected slots: void sessionUUIDChanged(const QUuid& sessionUUID, const QUuid& oldUUID); - virtual void processAvatarDataPacket(QSharedPointer message, SharedNodePointer sendingNode); + void processAvatarDataPacket(QSharedPointer message, SharedNodePointer sendingNode); void processAvatarIdentityPacket(QSharedPointer message, SharedNodePointer sendingNode); void processKillAvatar(QSharedPointer message, SharedNodePointer sendingNode); void processExitingSpaceBubble(QSharedPointer message, SharedNodePointer sendingNode); From ac751029c0d9a5248cb499ce509ebde1f4b1ac17 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 25 Apr 2017 15:34:59 -0700 Subject: [PATCH 22/29] remove identity cache code --- interface/src/avatar/Avatar.cpp | 18 ------------------ interface/src/avatar/Avatar.h | 3 --- interface/src/avatar/AvatarManager.cpp | 11 ----------- interface/src/avatar/AvatarManager.h | 2 -- 4 files changed, 34 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 4f8cc6655e..4efb68f847 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -445,24 +445,6 @@ float Avatar::getSimulationRate(const QString& rateName) const { return 0.0f; } -void Avatar::getIdentity(Identity& identity) const { - identity.uuid = getSessionUUID(); - identity.skeletonModelURL = _skeletonModelURL; - identity.attachmentData = _attachmentData; - identity.displayName = _displayName; - identity.sessionDisplayName = _sessionDisplayName; - identity.avatarEntityData = _avatarEntityData; -} - -void Avatar::setIdentity(const Identity& identity) { - assert(identity.uuid == getSessionUUID()); - setSkeletonModelURL(identity.skeletonModelURL); - _attachmentData = identity.attachmentData; - _displayName = identity.displayName; - _sessionDisplayName = identity.sessionDisplayName; - _avatarEntityData = identity.avatarEntityData; -} - bool Avatar::isLookingAtMe(AvatarSharedPointer avatar) const { const float HEAD_SPHERE_RADIUS = 0.1f; glm::vec3 theirLookAt = dynamic_pointer_cast(avatar)->getHead()->getLookAtPosition(); diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 3b9bb7e0f2..8c055885fd 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -238,9 +238,6 @@ public: return (lerpValue*(4.0f - 2.0f * lerpValue) - 1.0f); } - void getIdentity(Identity& identity) const; - void setIdentity(const Identity& identity); - public slots: // FIXME - these should be migrated to use Pose data instead diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index e3293a7874..c0b001911f 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -326,16 +326,6 @@ AvatarSharedPointer AvatarManager::newSharedAvatar() { return std::make_shared(qApp->thread(), std::make_shared()); } -AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { - AvatarSharedPointer avatarData = AvatarHashMap::addAvatar(sessionUUID, mixerWeakPointer); - QMap::iterator itr = _identityCache.find(sessionUUID); - if (itr != _identityCache.end()) { - auto avatar = std::static_pointer_cast(avatarData); - avatar->setIdentity(*itr); - } - return avatarData; -} - void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason) { AvatarHashMap::handleRemovedAvatar(removedAvatar, removalReason); @@ -347,7 +337,6 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar // therefore whenever we remove an avatar we cache the identity in case we need it later AvatarData::Identity identity; avatar->getIdentity(identity); - _identityCache[avatar->getSessionUUID()] = identity; AvatarMotionState* motionState = avatar->getMotionState(); if (motionState) { diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index af372f7627..45f1a597eb 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -105,7 +105,6 @@ private: void simulateAvatarFades(float deltaTime); AvatarSharedPointer newSharedAvatar() override; - AvatarSharedPointer addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) override; void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; QVector _avatarsToFade; @@ -118,7 +117,6 @@ private: quint64 _lastSendAvatarDataTime = 0; // Controls MyAvatar send data rate. QVector _localLights; - QMap _identityCache; bool _shouldShowReceiveStats = false; From fd874429c1d203068d9079d90c254815200fd688 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 25 Apr 2017 15:40:51 -0700 Subject: [PATCH 23/29] remove unused cruft --- interface/src/avatar/AvatarManager.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index c0b001911f..c4bcb67a16 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -333,11 +333,6 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar // class in this context so we can call methods that don't exist at the base class. auto avatar = std::static_pointer_cast(removedAvatar); - // there is no way to request identity data from the avatar-mixer - // therefore whenever we remove an avatar we cache the identity in case we need it later - AvatarData::Identity identity; - avatar->getIdentity(identity); - AvatarMotionState* motionState = avatar->getMotionState(); if (motionState) { _motionStatesThatMightUpdate.remove(motionState); From 7154a11192e49945a8ac39a9820a12d47546a887 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Apr 2017 14:03:36 -0700 Subject: [PATCH 24/29] add some more logging --- assignment-client/src/Agent.cpp | 1 + assignment-client/src/avatars/AvatarMixer.cpp | 8 ++++++++ assignment-client/src/avatars/AvatarMixerSlave.cpp | 2 ++ libraries/avatars/src/AvatarData.cpp | 5 ++--- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index c8ab489311..3cfccbea9e 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -583,6 +583,7 @@ void Agent::setIsAvatar(bool isAvatar) { void Agent::sendAvatarIdentityPacket() { if (_isAvatar) { auto scriptedAvatar = DependencyManager::get(); + qDebug() << __FUNCTION__ << "about to call sendIdentityPacket()"; scriptedAvatar->sendIdentityPacket(); } } diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 43eac8ebbe..5e131cbcd7 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -70,6 +70,7 @@ AvatarMixer::~AvatarMixer() { } void AvatarMixer::sendIdentityPacket(AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode) { + qDebug() << __FUNCTION__ << "about to call nodeData->getAvatar().identityByteArray()... for node:" << nodeData->getNodeID(); QByteArray individualData = nodeData->getAvatar().identityByteArray(); auto identityPacket = NLPacket::create(PacketType::AvatarIdentity, individualData.size()); @@ -215,6 +216,8 @@ void AvatarMixer::manageDisplayName(const SharedNodePointer& node) { soFar.second++; // refcount nodeData->flagIdentityChange(); nodeData->setAvatarSessionDisplayNameMustChange(false); + + qCDebug(avatars) << __FUNCTION__ << "about to call sendIdentityPacket()"; sendIdentityPacket(nodeData, node); // Tell node whose name changed about its new session display name. qCDebug(avatars) << "Giving session display name" << sessionDisplayName << "to node with ID" << node->getUUID(); } @@ -405,9 +408,14 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes // parse the identity packet and update the change timestamp if appropriate AvatarData::Identity identity; + + qCDebug(avatars) << __FUNCTION__ << "about to call parseAvatarIdentityPacket()"; AvatarData::parseAvatarIdentityPacket(message->getMessage(), identity); + bool identityChanged = false; bool displayNameChanged = false; + + qCDebug(avatars) << __FUNCTION__ << "about to call processAvatarIdentity()"; avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged); if (identityChanged) { QMutexLocker nodeDataLocker(&nodeData->getMutex()); diff --git a/assignment-client/src/avatars/AvatarMixerSlave.cpp b/assignment-client/src/avatars/AvatarMixerSlave.cpp index 2ad8bb58ed..3266276a45 100644 --- a/assignment-client/src/avatars/AvatarMixerSlave.cpp +++ b/assignment-client/src/avatars/AvatarMixerSlave.cpp @@ -67,6 +67,7 @@ void AvatarMixerSlave::processIncomingPackets(const SharedNodePointer& node) { int AvatarMixerSlave::sendIdentityPacket(const AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode) { + qDebug() << __FUNCTION__ << "about to call nodeData->getConstAvatarData().identityByteArray()... for node:" << nodeData->getNodeID(); QByteArray individualData = nodeData->getConstAvatarData()->identityByteArray(); individualData.replace(0, NUM_BYTES_RFC4122_UUID, nodeData->getNodeID().toRfc4122()); // FIXME, this looks suspicious auto identityPackets = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); @@ -302,6 +303,7 @@ void AvatarMixerSlave::broadcastAvatarData(const SharedNodePointer& node) { // If the time that the mixer sent AVATAR DATA about Avatar B to Avatar A is BEFORE OR EQUAL TO // the time that Avatar B flagged an IDENTITY DATA change, send IDENTITY DATA about Avatar B to Avatar A. if (nodeData->getLastBroadcastTime(otherNode->getUUID()) <= otherNodeData->getIdentityChangeTimestamp()) { + qCDebug(avatars) << __FUNCTION__ << "about to call sendIdentityPacket()"; identityBytesSent += sendIdentityPacket(otherNodeData, node); } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index e75f801885..a9ca366d05 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1529,15 +1529,13 @@ void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityC } QByteArray AvatarData::identityByteArray() const { - qDebug() << __FUNCTION__; - QByteArray identityData; QDataStream identityStream(&identityData, QIODevice::Append); const QUrl& urlToSend = cannonicalSkeletonModelURL(emptyURL); // depends on _skeletonModelURL _avatarEntitiesLock.withReadLock([&] { - qDebug() << __FUNCTION__ + qDebug() << "AvatarData::identityByteArray() ... " << "session:" << getSessionUUID() << "url:" << urlToSend << "displayName:" << _displayName @@ -1731,6 +1729,7 @@ void AvatarData::sendIdentityPacket() { qDebug() << __FUNCTION__; auto nodeList = DependencyManager::get(); + qDebug() << __FUNCTION__ << "about to call identityByteArray()... for getSessionUUID:" << getSessionUUID(); QByteArray identityData = identityByteArray(); auto packetList = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); From 3de92121e0bd460e7b61118e947d1ccbbceeab8e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Apr 2017 15:28:10 -0700 Subject: [PATCH 25/29] more logging --- assignment-client/src/avatars/AvatarMixer.cpp | 6 +++--- assignment-client/src/avatars/AvatarMixerSlave.cpp | 8 ++++++-- libraries/networking/src/udt/Socket.h | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 5e131cbcd7..540a081fd8 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -70,7 +70,7 @@ AvatarMixer::~AvatarMixer() { } void AvatarMixer::sendIdentityPacket(AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode) { - qDebug() << __FUNCTION__ << "about to call nodeData->getAvatar().identityByteArray()... for node:" << nodeData->getNodeID(); + qDebug() << __FUNCTION__ << "about to call nodeData->getAvatar().identityByteArray()... for node:" << nodeData->getNodeID() << "destinationNode:" << destinationNode->getUUID(); QByteArray individualData = nodeData->getAvatar().identityByteArray(); auto identityPacket = NLPacket::create(PacketType::AvatarIdentity, individualData.size()); @@ -409,13 +409,13 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes // parse the identity packet and update the change timestamp if appropriate AvatarData::Identity identity; - qCDebug(avatars) << __FUNCTION__ << "about to call parseAvatarIdentityPacket()"; + qCDebug(avatars) << __FUNCTION__ << "about to call parseAvatarIdentityPacket() for packet from node:" << nodeData->getNodeID(); AvatarData::parseAvatarIdentityPacket(message->getMessage(), identity); bool identityChanged = false; bool displayNameChanged = false; - qCDebug(avatars) << __FUNCTION__ << "about to call processAvatarIdentity()"; + qCDebug(avatars) << __FUNCTION__ << "about to call processAvatarIdentity() node:" << nodeData->getNodeID(); avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged); if (identityChanged) { QMutexLocker nodeDataLocker(&nodeData->getMutex()); diff --git a/assignment-client/src/avatars/AvatarMixerSlave.cpp b/assignment-client/src/avatars/AvatarMixerSlave.cpp index 3266276a45..c3ff2a74dc 100644 --- a/assignment-client/src/avatars/AvatarMixerSlave.cpp +++ b/assignment-client/src/avatars/AvatarMixerSlave.cpp @@ -67,7 +67,7 @@ void AvatarMixerSlave::processIncomingPackets(const SharedNodePointer& node) { int AvatarMixerSlave::sendIdentityPacket(const AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode) { - qDebug() << __FUNCTION__ << "about to call nodeData->getConstAvatarData().identityByteArray()... for node:" << nodeData->getNodeID(); + qDebug() << __FUNCTION__ << "about to call nodeData->getConstAvatarData().identityByteArray()... for node:" << nodeData->getNodeID() << "destinationNode:" << destinationNode->getUUID(); QByteArray individualData = nodeData->getConstAvatarData()->identityByteArray(); individualData.replace(0, NUM_BYTES_RFC4122_UUID, nodeData->getNodeID().toRfc4122()); // FIXME, this looks suspicious auto identityPackets = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); @@ -303,7 +303,11 @@ void AvatarMixerSlave::broadcastAvatarData(const SharedNodePointer& node) { // If the time that the mixer sent AVATAR DATA about Avatar B to Avatar A is BEFORE OR EQUAL TO // the time that Avatar B flagged an IDENTITY DATA change, send IDENTITY DATA about Avatar B to Avatar A. if (nodeData->getLastBroadcastTime(otherNode->getUUID()) <= otherNodeData->getIdentityChangeTimestamp()) { - qCDebug(avatars) << __FUNCTION__ << "about to call sendIdentityPacket()"; + qCDebug(avatars) << __FUNCTION__ << "about to call sendIdentityPacket()" + << "other node:" << otherNode->getUUID() + << "destination node:" << nodeData->getNodeID() + << "nodeData->getLastBroadcastTime(otherNode->getUUID()):" << nodeData->getLastBroadcastTime(otherNode->getUUID()) + << "otherNodeData->getIdentityChangeTimestamp():" << otherNodeData->getIdentityChangeTimestamp(); identityBytesSent += sendIdentityPacket(otherNodeData, node); } diff --git a/libraries/networking/src/udt/Socket.h b/libraries/networking/src/udt/Socket.h index 1919e00b41..df03178630 100644 --- a/libraries/networking/src/udt/Socket.h +++ b/libraries/networking/src/udt/Socket.h @@ -26,7 +26,7 @@ #include "TCPVegasCC.h" #include "Connection.h" -//#define UDT_CONNECTION_DEBUG +#define UDT_CONNECTION_DEBUG class UDTTest; From 1f9e07b828cb11f3b4e76d5109a81a0f7cd59aed Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Apr 2017 16:40:13 -0700 Subject: [PATCH 26/29] more logging --- assignment-client/src/avatars/AvatarMixer.cpp | 10 ++++------ assignment-client/src/avatars/AvatarMixerSlave.cpp | 3 +++ libraries/avatars/src/AvatarData.cpp | 7 ++++++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 540a081fd8..7ecb4db62f 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -72,14 +72,12 @@ AvatarMixer::~AvatarMixer() { void AvatarMixer::sendIdentityPacket(AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode) { qDebug() << __FUNCTION__ << "about to call nodeData->getAvatar().identityByteArray()... for node:" << nodeData->getNodeID() << "destinationNode:" << destinationNode->getUUID(); QByteArray individualData = nodeData->getAvatar().identityByteArray(); - - auto identityPacket = NLPacket::create(PacketType::AvatarIdentity, individualData.size()); - individualData.replace(0, NUM_BYTES_RFC4122_UUID, nodeData->getNodeID().toRfc4122()); + qDebug() << __FUNCTION__ << "REPLACED " << NUM_BYTES_RFC4122_UUID << "bytes in identityByteArray with:" << nodeData->getNodeID() << ".toRfc4122()..."; - identityPacket->write(individualData); - - DependencyManager::get()->sendPacket(std::move(identityPacket), *destinationNode); + auto identityPackets = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); + identityPackets->write(individualData); + DependencyManager::get()->sendPacketList(std::move(identityPackets), *destinationNode); ++_sumIdentityPackets; } diff --git a/assignment-client/src/avatars/AvatarMixerSlave.cpp b/assignment-client/src/avatars/AvatarMixerSlave.cpp index c3ff2a74dc..1f0e781b83 100644 --- a/assignment-client/src/avatars/AvatarMixerSlave.cpp +++ b/assignment-client/src/avatars/AvatarMixerSlave.cpp @@ -70,9 +70,12 @@ int AvatarMixerSlave::sendIdentityPacket(const AvatarMixerClientData* nodeData, qDebug() << __FUNCTION__ << "about to call nodeData->getConstAvatarData().identityByteArray()... for node:" << nodeData->getNodeID() << "destinationNode:" << destinationNode->getUUID(); QByteArray individualData = nodeData->getConstAvatarData()->identityByteArray(); individualData.replace(0, NUM_BYTES_RFC4122_UUID, nodeData->getNodeID().toRfc4122()); // FIXME, this looks suspicious + qDebug() << __FUNCTION__ << "REPLACED " << NUM_BYTES_RFC4122_UUID << "bytes in identityByteArray with:" << nodeData->getNodeID() << ".toRfc4122()..."; + auto identityPackets = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); identityPackets->write(individualData); DependencyManager::get()->sendPacketList(std::move(identityPackets), *destinationNode); + _stats.numIdentityPackets++; return individualData.size(); } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index a9ca366d05..de2cd3a7c3 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1737,7 +1737,12 @@ void AvatarData::sendIdentityPacket() { nodeList->eachMatchingNode( [&](const SharedNodePointer& node)->bool { if (node->getType() == NodeType::AvatarMixer) { - qDebug() << "AvatarData::sendIdentityPacket()... found mixer node, node->getActiveSocket():" << node->getActiveSocket(); + qDebug() << "AvatarData::sendIdentityPacket()... found mixer node, node->getActiveSocket():" << node->getActiveSocket() + << "getPublicSocket()" << node->getPublicSocket() + << "getLocalSocket()" << node->getLocalSocket() + << "getSymmetricSocket()" << node->getSymmetricSocket() + << "getActiveSocket()" << *node->getActiveSocket(); + } return node->getType() == NodeType::AvatarMixer && node->getActiveSocket(); From a26dca73b1b7dbe7b1b6770259db067e27190e9b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Apr 2017 18:02:09 -0700 Subject: [PATCH 27/29] more logging --- libraries/networking/src/LimitedNodeList.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 8feb695c79..fa1842db4c 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -437,6 +437,8 @@ qint64 LimitedNodeList::sendPacketList(std::unique_ptr packetList, qint64 LimitedNodeList::sendPacketList(std::unique_ptr packetList, const Node& destinationNode) { auto activeSocket = destinationNode.getActiveSocket(); if (activeSocket) { + qDebug() << __FUNCTION__ << "activeSocket:" << *activeSocket; + // close the last packet in the list packetList->closeCurrentPacket(); From 834a447d62bda1fa403468421b0f021744f791b4 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Apr 2017 18:36:44 -0700 Subject: [PATCH 28/29] remove debugging code --- assignment-client/src/Agent.cpp | 1 - assignment-client/src/avatars/AvatarMixer.cpp | 10 ------- .../src/avatars/AvatarMixerSlave.cpp | 9 ------- interface/src/Application.cpp | 1 - interface/src/avatar/MyAvatar.cpp | 1 - libraries/avatars/src/AvatarData.cpp | 26 ------------------- libraries/networking/src/LimitedNodeList.cpp | 2 -- libraries/networking/src/udt/Socket.h | 2 +- 8 files changed, 1 insertion(+), 51 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 3cfccbea9e..c8ab489311 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -583,7 +583,6 @@ void Agent::setIsAvatar(bool isAvatar) { void Agent::sendAvatarIdentityPacket() { if (_isAvatar) { auto scriptedAvatar = DependencyManager::get(); - qDebug() << __FUNCTION__ << "about to call sendIdentityPacket()"; scriptedAvatar->sendIdentityPacket(); } } diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 7ecb4db62f..a54c418cc3 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -70,15 +70,11 @@ AvatarMixer::~AvatarMixer() { } void AvatarMixer::sendIdentityPacket(AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode) { - qDebug() << __FUNCTION__ << "about to call nodeData->getAvatar().identityByteArray()... for node:" << nodeData->getNodeID() << "destinationNode:" << destinationNode->getUUID(); QByteArray individualData = nodeData->getAvatar().identityByteArray(); individualData.replace(0, NUM_BYTES_RFC4122_UUID, nodeData->getNodeID().toRfc4122()); - qDebug() << __FUNCTION__ << "REPLACED " << NUM_BYTES_RFC4122_UUID << "bytes in identityByteArray with:" << nodeData->getNodeID() << ".toRfc4122()..."; - auto identityPackets = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); identityPackets->write(individualData); DependencyManager::get()->sendPacketList(std::move(identityPackets), *destinationNode); - ++_sumIdentityPackets; } @@ -394,7 +390,6 @@ void AvatarMixer::handleRequestsDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode) { - qDebug() << __FUNCTION__; auto start = usecTimestampNow(); auto nodeList = DependencyManager::get(); getOrCreateClientData(senderNode); @@ -406,14 +401,9 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer mes // parse the identity packet and update the change timestamp if appropriate AvatarData::Identity identity; - - qCDebug(avatars) << __FUNCTION__ << "about to call parseAvatarIdentityPacket() for packet from node:" << nodeData->getNodeID(); AvatarData::parseAvatarIdentityPacket(message->getMessage(), identity); - bool identityChanged = false; bool displayNameChanged = false; - - qCDebug(avatars) << __FUNCTION__ << "about to call processAvatarIdentity() node:" << nodeData->getNodeID(); avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged); if (identityChanged) { QMutexLocker nodeDataLocker(&nodeData->getMutex()); diff --git a/assignment-client/src/avatars/AvatarMixerSlave.cpp b/assignment-client/src/avatars/AvatarMixerSlave.cpp index 1f0e781b83..2ad8bb58ed 100644 --- a/assignment-client/src/avatars/AvatarMixerSlave.cpp +++ b/assignment-client/src/avatars/AvatarMixerSlave.cpp @@ -67,15 +67,11 @@ void AvatarMixerSlave::processIncomingPackets(const SharedNodePointer& node) { int AvatarMixerSlave::sendIdentityPacket(const AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode) { - qDebug() << __FUNCTION__ << "about to call nodeData->getConstAvatarData().identityByteArray()... for node:" << nodeData->getNodeID() << "destinationNode:" << destinationNode->getUUID(); QByteArray individualData = nodeData->getConstAvatarData()->identityByteArray(); individualData.replace(0, NUM_BYTES_RFC4122_UUID, nodeData->getNodeID().toRfc4122()); // FIXME, this looks suspicious - qDebug() << __FUNCTION__ << "REPLACED " << NUM_BYTES_RFC4122_UUID << "bytes in identityByteArray with:" << nodeData->getNodeID() << ".toRfc4122()..."; - auto identityPackets = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); identityPackets->write(individualData); DependencyManager::get()->sendPacketList(std::move(identityPackets), *destinationNode); - _stats.numIdentityPackets++; return individualData.size(); } @@ -306,11 +302,6 @@ void AvatarMixerSlave::broadcastAvatarData(const SharedNodePointer& node) { // If the time that the mixer sent AVATAR DATA about Avatar B to Avatar A is BEFORE OR EQUAL TO // the time that Avatar B flagged an IDENTITY DATA change, send IDENTITY DATA about Avatar B to Avatar A. if (nodeData->getLastBroadcastTime(otherNode->getUUID()) <= otherNodeData->getIdentityChangeTimestamp()) { - qCDebug(avatars) << __FUNCTION__ << "about to call sendIdentityPacket()" - << "other node:" << otherNode->getUUID() - << "destination node:" << nodeData->getNodeID() - << "nodeData->getLastBroadcastTime(otherNode->getUUID()):" << nodeData->getLastBroadcastTime(otherNode->getUUID()) - << "otherNodeData->getIdentityChangeTimestamp():" << otherNodeData->getIdentityChangeTimestamp(); identityBytesSent += sendIdentityPacket(otherNodeData, node); } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4801f39272..8cbcb668b0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5244,7 +5244,6 @@ void Application::nodeActivated(SharedNodePointer node) { if (node->getType() == NodeType::AvatarMixer) { // new avatar mixer, send off our identity packet right away - qDebug() << __FUNCTION__ << "about to call... getMyAvatar()->sendIdentityPacket();"; getMyAvatar()->markIdentityDataChanged(); getMyAvatar()->sendIdentityPacket(); getMyAvatar()->resetLastSent(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 59b262a308..7bc961c654 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -413,7 +413,6 @@ void MyAvatar::update(float deltaTime) { Q_ARG(glm::vec3, (halfBoundingBoxDimensions*2.0f))); if (getIdentityDataChanged()) { - qDebug() << __FUNCTION__ << "about to call... sendIdentityPacket();"; sendIdentityPacket(); } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index de2cd3a7c3..3a6da8bcee 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1489,9 +1489,6 @@ void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityC return; } - qCDebug(avatars) << __FUNCTION__ << "got identity packet for avatar " << getSessionUUID() - << "identity.updatedAt:" << identity.updatedAt << "_identityUpdatedAt:" << _identityUpdatedAt; - if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) { setSkeletonModelURL(identity.skeletonModelURL); identityChanged = true; @@ -1525,7 +1522,6 @@ void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityC // use the timestamp from this identity, since we want to honor the updated times in "server clock" // this will overwrite any changes we made locally to this AvatarData's _identityUpdatedAt _identityUpdatedAt = identity.updatedAt; - qDebug() << __FUNCTION__ << "_identityUpdatedAt:" << _identityUpdatedAt; } QByteArray AvatarData::identityByteArray() const { @@ -1534,15 +1530,6 @@ QByteArray AvatarData::identityByteArray() const { const QUrl& urlToSend = cannonicalSkeletonModelURL(emptyURL); // depends on _skeletonModelURL _avatarEntitiesLock.withReadLock([&] { - - qDebug() << "AvatarData::identityByteArray() ... " - << "session:" << getSessionUUID() - << "url:" << urlToSend - << "displayName:" << _displayName - << "sessionDisplayName:" << getSessionDisplayNameForTransport() - << "identityUpdatedAt:" << _identityUpdatedAt; - - identityStream << getSessionUUID() << urlToSend << _attachmentData @@ -1726,29 +1713,16 @@ void AvatarData::sendAvatarDataPacket() { } void AvatarData::sendIdentityPacket() { - qDebug() << __FUNCTION__; auto nodeList = DependencyManager::get(); - - qDebug() << __FUNCTION__ << "about to call identityByteArray()... for getSessionUUID:" << getSessionUUID(); QByteArray identityData = identityByteArray(); auto packetList = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); packetList->write(identityData); nodeList->eachMatchingNode( [&](const SharedNodePointer& node)->bool { - if (node->getType() == NodeType::AvatarMixer) { - qDebug() << "AvatarData::sendIdentityPacket()... found mixer node, node->getActiveSocket():" << node->getActiveSocket() - << "getPublicSocket()" << node->getPublicSocket() - << "getLocalSocket()" << node->getLocalSocket() - << "getSymmetricSocket()" << node->getSymmetricSocket() - << "getActiveSocket()" << *node->getActiveSocket(); - - } - return node->getType() == NodeType::AvatarMixer && node->getActiveSocket(); }, [&](const SharedNodePointer& node) { - qDebug() << "AvatarData::sendIdentityPacket()... about to call.... nodeList->sendPacketList(std::move(packetList), *node);"; nodeList->sendPacketList(std::move(packetList), *node); }); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index fa1842db4c..8feb695c79 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -437,8 +437,6 @@ qint64 LimitedNodeList::sendPacketList(std::unique_ptr packetList, qint64 LimitedNodeList::sendPacketList(std::unique_ptr packetList, const Node& destinationNode) { auto activeSocket = destinationNode.getActiveSocket(); if (activeSocket) { - qDebug() << __FUNCTION__ << "activeSocket:" << *activeSocket; - // close the last packet in the list packetList->closeCurrentPacket(); diff --git a/libraries/networking/src/udt/Socket.h b/libraries/networking/src/udt/Socket.h index df03178630..1919e00b41 100644 --- a/libraries/networking/src/udt/Socket.h +++ b/libraries/networking/src/udt/Socket.h @@ -26,7 +26,7 @@ #include "TCPVegasCC.h" #include "Connection.h" -#define UDT_CONNECTION_DEBUG +//#define UDT_CONNECTION_DEBUG class UDTTest; From 76902b15d3f3f9cd2087f0b1a7035bbd18bb6651 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Apr 2017 18:51:41 -0700 Subject: [PATCH 29/29] remove one last debug log --- assignment-client/src/avatars/AvatarMixer.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index a54c418cc3..05dbfee912 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -210,8 +210,6 @@ void AvatarMixer::manageDisplayName(const SharedNodePointer& node) { soFar.second++; // refcount nodeData->flagIdentityChange(); nodeData->setAvatarSessionDisplayNameMustChange(false); - - qCDebug(avatars) << __FUNCTION__ << "about to call sendIdentityPacket()"; sendIdentityPacket(nodeData, node); // Tell node whose name changed about its new session display name. qCDebug(avatars) << "Giving session display name" << sessionDisplayName << "to node with ID" << node->getUUID(); }