From 0c8848a463428e80e949a7f475141ddafb67c27d Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 3 Sep 2015 15:41:40 -0700 Subject: [PATCH] don't update _lastSendJointData if we didn't send --- assignment-client/src/avatars/AvatarMixer.cpp | 2 +- libraries/avatars/src/AvatarData.cpp | 17 ++++++++++++----- libraries/avatars/src/AvatarData.h | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 64969b55ce..1ab637b57f 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -387,7 +387,7 @@ void AvatarMixer::broadcastAvatarData() { return; } AvatarData& otherAvatar = otherNodeData->getAvatar(); - otherAvatar.doneEncoding(); + otherAvatar.doneEncoding(false); }); _lastFrameTimestamp = QDateTime::currentMSecsSinceEpoch(); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 555ca42d60..46a323733a 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -274,16 +274,20 @@ QByteArray AvatarData::toByteArray(bool cullSmallChanges, bool sendAll) { return avatarDataByteArray.left(destinationBuffer - startPosition); } -void AvatarData::doneEncoding() { +void AvatarData::doneEncoding(bool cullSmallChanges) { // The server has finished sending this version of the joint-data to other nodes. Update _lastSentJointData. _lastSentJointData.resize(_jointData.size()); for (int i = 0; i < _jointData.size(); i ++) { const JointData& data = _jointData[ i ]; - _lastSentJointData[i].rotation = data.rotation; + if (_lastSentJointData[i].rotation != data.rotation) { + if (!cullSmallChanges || + fabsf(glm::dot(data.rotation, _lastSentJointData[i].rotation)) <= AVATAR_MIN_ROTATION_DOT) { + _lastSentJointData[i].rotation = data.rotation; + } + } } } - bool AvatarData::shouldLogError(const quint64& now) { if (now > _errorLogExpiry) { _errorLogExpiry = now + DEFAULT_FILTERED_LOG_EXPIRY; @@ -1089,8 +1093,11 @@ void AvatarData::setJointMappingsFromNetworkReply() { void AvatarData::sendAvatarDataPacket() { auto nodeList = DependencyManager::get(); - QByteArray avatarByteArray = toByteArray(true, randFloat() < AVATAR_SEND_FULL_UPDATE_RATIO); - doneEncoding(); + // about 2% of the time, we send a full update (meaning, we transmit all the joint data), even if nothing has changed. + // this is to guard against a joint moving once, the packet getting lost, and the joint never moving again. + bool sendFullUpdate = randFloat() < AVATAR_SEND_FULL_UPDATE_RATIO; + QByteArray avatarByteArray = toByteArray(true, sendFullUpdate); + doneEncoding(true); auto avatarPacket = NLPacket::create(PacketType::AvatarData, avatarByteArray.size()); avatarPacket->write(avatarByteArray); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 8976074ec0..c4cc3fcaac 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -177,7 +177,7 @@ public: void setHandPosition(const glm::vec3& handPosition); virtual QByteArray toByteArray(bool cullSmallChanges, bool sendAll); - virtual void doneEncoding(); + virtual void doneEncoding(bool cullSmallChanges); /// \return true if an error should be logged bool shouldLogError(const quint64& now); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index ced0742a51..eeff6c15f0 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -600,7 +600,7 @@ void ScriptEngine::run() { const int SCRIPT_AUDIO_BUFFER_BYTES = SCRIPT_AUDIO_BUFFER_SAMPLES * sizeof(int16_t); QByteArray avatarByteArray = _avatarData->toByteArray(true, randFloat() < AVATAR_SEND_FULL_UPDATE_RATIO); - _avatarData->doneEncoding(); + _avatarData->doneEncoding(true); auto avatarPacket = NLPacket::create(PacketType::AvatarData, avatarByteArray.size()); avatarPacket->write(avatarByteArray);