From e7425a81288edb25ee0a78683ae4a74b0ebfdb3b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 20 May 2014 15:20:27 -0700 Subject: [PATCH] support for models in root element --- libraries/models/src/ModelTree.h | 1 + libraries/networking/src/PacketHeaders.cpp | 6 +++--- libraries/octree/src/Octree.cpp | 24 +++++++++++++++++++++- libraries/octree/src/Octree.h | 1 + 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/libraries/models/src/ModelTree.h b/libraries/models/src/ModelTree.h index 10ef62c0a0..b8df1c1a22 100644 --- a/libraries/models/src/ModelTree.h +++ b/libraries/models/src/ModelTree.h @@ -41,6 +41,7 @@ public: virtual int processEditPacketData(PacketType packetType, const unsigned char* packetData, int packetLength, const unsigned char* editData, int maxLength, const SharedNodePointer& senderNode); + virtual bool rootElementHasData() const { return true; } virtual void update(); void storeModel(const ModelItem& model, const SharedNodePointer& senderNode = SharedNodePointer()); diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index b9eee6e0c9..0f0b57635c 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -53,8 +53,6 @@ PacketVersion versionForPacketType(PacketType type) { return 1; case PacketTypeEnvironmentData: return 1; - case PacketTypeParticleData: - return 1; case PacketTypeDomainList: case PacketTypeDomainListRequest: return 3; @@ -66,8 +64,10 @@ PacketVersion versionForPacketType(PacketType type) { return 1; case PacketTypeOctreeStats: return 1; + case PacketTypeParticleData: + return 1; case PacketTypeModelData: - return 1; + return 2; default: return 0; } diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 3042626a51..fd0cbcff7c 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -301,6 +301,13 @@ int Octree::readElementData(OctreeElement* destinationElement, const unsigned ch } } } + + // if this is the root, and there is more data to read, allow it to read it's element data... + if (destinationElement == _rootElement && rootElementHasData() && (bytesLeftToRead - bytesRead) > 0) { + // tell the element to read the subsequent data + bytesRead += _rootElement->readElementDataFromBuffer(nodeData + bytesRead, bytesLeftToRead - bytesRead, args); + } + return bytesRead; } @@ -1524,7 +1531,22 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, } } // end keepDiggingDeeper - // At this point all our BitMasks are complete... so let's output them to see how they compare... + // If we made it this far, then we've written all of our child data... if this element is the root + // element, then we also allow the root element to write out it's data... + if (continueThisLevel && element == _rootElement && rootElementHasData()) { + int bytesBeforeChild = packetData->getUncompressedSize(); + continueThisLevel = element->appendElementData(packetData, params); + int bytesAfterChild = packetData->getUncompressedSize(); + + if (continueThisLevel) { + bytesAtThisLevel += (bytesAfterChild - bytesBeforeChild); // keep track of byte count for this child + + if (params.stats) { + params.stats->colorSent(element); + } + } + } + // if we were unable to fit this level in our packet, then rewind and add it to the element bag for // sending later... if (continueThisLevel) { diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 1e71884faa..81a9823dd5 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -211,6 +211,7 @@ public: const unsigned char* editData, int maxLength, const SharedNodePointer& sourceNode) { return 0; } virtual bool recurseChildrenWithData() const { return true; } + virtual bool rootElementHasData() const { return false; } virtual void update() { }; // nothing to do by default