From 781e2f409f0a4da4c2c37ca61467895c76974c8c Mon Sep 17 00:00:00 2001 From: 1P-Cusack <1p-cusack@1stplayable.com> Date: Wed, 21 Jun 2017 18:50:39 -0400 Subject: [PATCH 1/4] Adding support for loading obj.gz files in ModelCache. --- .../src/model-networking/ModelCache.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index 623832aaa8..3bb33e0a2a 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -20,6 +20,8 @@ #include +#include + #include "ModelNetworkingLogging.h" #include #include @@ -171,7 +173,9 @@ void GeometryReader::run() { QString urlname = _url.path().toLower(); if (!urlname.isEmpty() && !_url.path().isEmpty() && - (_url.path().toLower().endsWith(".fbx") || _url.path().toLower().endsWith(".obj"))) { + (_url.path().toLower().endsWith(".fbx") || + _url.path().toLower().endsWith(".obj") || + _url.path().toLower().endsWith(".gz"))) { FBXGeometry::Pointer fbxGeometry; if (_url.path().toLower().endsWith(".fbx")) { @@ -181,7 +185,12 @@ void GeometryReader::run() { } } else if (_url.path().toLower().endsWith(".obj")) { fbxGeometry.reset(OBJReader().readOBJ(_data, _mapping, _combineParts, _url)); - } else { + } else if (_url.path().toLower().endsWith(".gz")) { + QByteArray uncompressedData; + if (gunzip(_data, uncompressedData)){ + fbxGeometry.reset(OBJReader().readOBJ(uncompressedData, _mapping, _combineParts, _url)); + } + } else { throw QString("unsupported format"); } From f8c30c70e838b1fc3fff849c67a36de74d4991cb Mon Sep 17 00:00:00 2001 From: 1P-Cusack <1p-cusack@1stplayable.com> Date: Thu, 22 Jun 2017 11:21:19 -0400 Subject: [PATCH 2/4] Addressing some feedback. Making the .obj.gz checks more specific and adding an exception if gunzip fails. --- .../model-networking/src/model-networking/ModelCache.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index 3bb33e0a2a..704455c981 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -175,7 +175,7 @@ void GeometryReader::run() { if (!urlname.isEmpty() && !_url.path().isEmpty() && (_url.path().toLower().endsWith(".fbx") || _url.path().toLower().endsWith(".obj") || - _url.path().toLower().endsWith(".gz"))) { + _url.path().toLower().endsWith(".obj.gz"))) { FBXGeometry::Pointer fbxGeometry; if (_url.path().toLower().endsWith(".fbx")) { @@ -185,11 +185,14 @@ void GeometryReader::run() { } } else if (_url.path().toLower().endsWith(".obj")) { fbxGeometry.reset(OBJReader().readOBJ(_data, _mapping, _combineParts, _url)); - } else if (_url.path().toLower().endsWith(".gz")) { + } else if (_url.path().toLower().endsWith(".obj.gz")) { QByteArray uncompressedData; if (gunzip(_data, uncompressedData)){ fbxGeometry.reset(OBJReader().readOBJ(uncompressedData, _mapping, _combineParts, _url)); + } else { + throw QString("failed to decompress .obj.gz" ); } + } else { throw QString("unsupported format"); } From 42cceb02a4e2344626b118e1fa42db40ea6b01b9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 22 Jun 2017 11:10:43 -0700 Subject: [PATCH 3/4] push sequence number when managing identity data for agent --- assignment-client/src/avatars/AvatarMixer.cpp | 8 +++++++- libraries/avatars/src/AvatarData.cpp | 12 ++++++------ libraries/avatars/src/AvatarData.h | 4 +++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index f1e30f4442..28ede7a77d 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -331,7 +331,13 @@ void AvatarMixer::manageIdentityData(const SharedNodePointer& node) { } } if (sendIdentity) { - sendIdentityPacket(nodeData, node); // Tell node whose name changed about its new session display name or avatar. + + // since this packet includes a change to either the skeleton model URL or the display name + // it needs a new sequence number + nodeData->getAvatar().pushIdentitySequenceNumber(); + + // tell node whose name changed about its new session display name or avatar. + sendIdentityPacket(nodeData, node); } } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index eb4a02cb62..3bcd401e38 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1496,13 +1496,13 @@ void AvatarData::processAvatarIdentity(const QByteArray& identityData, bool& ide udt::SequenceNumber incomingSequenceNumber(incomingSequenceNumberType); if (!_hasProcessedFirstIdentity) { - _lastSequenceNumber = incomingSequenceNumber - 1; + _sequenceNumber = incomingSequenceNumber - 1; _hasProcessedFirstIdentity = true; qCDebug(avatars) << "Processing first identity packet for" << avatarSessionID << "-" << (udt::SequenceNumber::Type) incomingSequenceNumber; } - if (incomingSequenceNumber > _lastSequenceNumber) { + if (incomingSequenceNumber > _sequenceNumber) { Identity identity; packetStream >> identity.skeletonModelURL @@ -1512,7 +1512,7 @@ void AvatarData::processAvatarIdentity(const QByteArray& identityData, bool& ide >> identity.avatarEntityData; // set the store identity sequence number to match the incoming identity - _lastSequenceNumber = incomingSequenceNumber; + _sequenceNumber = incomingSequenceNumber; if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) { setSkeletonModelURL(identity.skeletonModelURL); @@ -1555,7 +1555,7 @@ void AvatarData::processAvatarIdentity(const QByteArray& identityData, bool& ide } else { qCDebug(avatars) << "Refusing to process identity for" << uuidStringWithoutCurlyBraces(avatarSessionID) << "since" - << (udt::SequenceNumber::Type) _lastSequenceNumber + << (udt::SequenceNumber::Type) _sequenceNumber << "is >=" << (udt::SequenceNumber::Type) incomingSequenceNumber; #endif } @@ -1571,7 +1571,7 @@ QByteArray AvatarData::identityByteArray() const { _avatarEntitiesLock.withReadLock([&] { identityStream << getSessionUUID() - << (udt::SequenceNumber::Type) _lastSequenceNumber + << (udt::SequenceNumber::Type) _sequenceNumber << urlToSend << _attachmentData << _displayName @@ -1755,7 +1755,7 @@ void AvatarData::sendIdentityPacket() { if (_identityDataChanged) { // if the identity data has changed, push the sequence number forwards - ++_lastSequenceNumber; + ++_sequenceNumber; } QByteArray identityData = identityByteArray(); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 8d09f936b5..204ca5d5af 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -625,6 +625,8 @@ public: bool getIdentityDataChanged() const { return _identityDataChanged; } // has the identity data changed since the last time sendIdentityPacket() was called void markIdentityDataChanged() { _identityDataChanged = true; } + void pushIdentitySequenceNumber() { ++_sequenceNumber; }; + float getDensity() const { return _density; } signals: @@ -781,7 +783,7 @@ protected: float _audioAverageLoudness { 0.0f }; bool _identityDataChanged { false }; - udt::SequenceNumber _lastSequenceNumber { 0 }; + udt::SequenceNumber _sequenceNumber { 0 }; bool _hasProcessedFirstIdentity { false }; float _density; From ccbae07170fea16badcbd70a4e83f42afd7a1523 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 22 Jun 2017 11:23:58 -0700 Subject: [PATCH 4/4] rename _sequenceNumber to _lastSequenceNumber --- libraries/avatars/src/AvatarData.cpp | 12 ++++++------ libraries/avatars/src/AvatarData.h | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 3bcd401e38..4926ca0fdb 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1496,13 +1496,13 @@ void AvatarData::processAvatarIdentity(const QByteArray& identityData, bool& ide udt::SequenceNumber incomingSequenceNumber(incomingSequenceNumberType); if (!_hasProcessedFirstIdentity) { - _sequenceNumber = incomingSequenceNumber - 1; + _identitySequenceNumber = incomingSequenceNumber - 1; _hasProcessedFirstIdentity = true; qCDebug(avatars) << "Processing first identity packet for" << avatarSessionID << "-" << (udt::SequenceNumber::Type) incomingSequenceNumber; } - if (incomingSequenceNumber > _sequenceNumber) { + if (incomingSequenceNumber > _identitySequenceNumber) { Identity identity; packetStream >> identity.skeletonModelURL @@ -1512,7 +1512,7 @@ void AvatarData::processAvatarIdentity(const QByteArray& identityData, bool& ide >> identity.avatarEntityData; // set the store identity sequence number to match the incoming identity - _sequenceNumber = incomingSequenceNumber; + _identitySequenceNumber = incomingSequenceNumber; if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) { setSkeletonModelURL(identity.skeletonModelURL); @@ -1555,7 +1555,7 @@ void AvatarData::processAvatarIdentity(const QByteArray& identityData, bool& ide } else { qCDebug(avatars) << "Refusing to process identity for" << uuidStringWithoutCurlyBraces(avatarSessionID) << "since" - << (udt::SequenceNumber::Type) _sequenceNumber + << (udt::SequenceNumber::Type) _identitySequenceNumber << "is >=" << (udt::SequenceNumber::Type) incomingSequenceNumber; #endif } @@ -1571,7 +1571,7 @@ QByteArray AvatarData::identityByteArray() const { _avatarEntitiesLock.withReadLock([&] { identityStream << getSessionUUID() - << (udt::SequenceNumber::Type) _sequenceNumber + << (udt::SequenceNumber::Type) _identitySequenceNumber << urlToSend << _attachmentData << _displayName @@ -1755,7 +1755,7 @@ void AvatarData::sendIdentityPacket() { if (_identityDataChanged) { // if the identity data has changed, push the sequence number forwards - ++_sequenceNumber; + ++_identitySequenceNumber; } QByteArray identityData = identityByteArray(); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 204ca5d5af..de905277d5 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -625,7 +625,7 @@ public: bool getIdentityDataChanged() const { return _identityDataChanged; } // has the identity data changed since the last time sendIdentityPacket() was called void markIdentityDataChanged() { _identityDataChanged = true; } - void pushIdentitySequenceNumber() { ++_sequenceNumber; }; + void pushIdentitySequenceNumber() { ++_identitySequenceNumber; }; float getDensity() const { return _density; } @@ -783,7 +783,7 @@ protected: float _audioAverageLoudness { 0.0f }; bool _identityDataChanged { false }; - udt::SequenceNumber _sequenceNumber { 0 }; + udt::SequenceNumber _identitySequenceNumber { 0 }; bool _hasProcessedFirstIdentity { false }; float _density;