From 33378ede5ccabcbfc044d3cf6a88c2812b6385b8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 24 Jan 2017 16:34:57 -0800 Subject: [PATCH] force full scene send if json parameters changed --- assignment-client/src/octree/OctreeSendThread.cpp | 5 +++-- libraries/entities/src/EntityTreeElement.cpp | 7 ++++--- libraries/octree/src/OctreeQueryNode.cpp | 12 ++++++++++++ libraries/octree/src/OctreeQueryNode.h | 5 +++++ 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 7e88e47da8..afc17d71aa 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -316,8 +316,9 @@ int OctreeSendThread::packetDistributor(SharedNodePointer node, OctreeQueryNode* int truePacketsSent = 0; int trueBytesSent = 0; int packetsSentThisInterval = 0; - bool isFullScene = nodeData->getUsesFrustum() && - ((!viewFrustumChanged && nodeData->getViewFrustumJustStoppedChanging()) || nodeData->hasLodChanged()); + bool isFullScene = nodeData->haveJSONParametersChanged() || + (nodeData->getUsesFrustum() + && ((!viewFrustumChanged && nodeData->getViewFrustumJustStoppedChanging()) || nodeData->hasLodChanged())); bool somethingToSend = true; // assume we have something diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 4cd82f223d..51d6d2b270 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -302,14 +302,15 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData includeThisEntity = false; } - if (!jsonFilters.isEmpty()) { + // if this entity has been updated since our last full send and there are json filters, check them + if (includeThisEntity && !jsonFilters.isEmpty()) { // if params include JSON filters, check if this entity matches bool entityMatchesFilters = entity->matchesJSONFilters(jsonFilters); if (entityMatchesFilters) { // we should include this entity unless it has already been excluded - includeThisEntity = includeThisEntity && true; + includeThisEntity = true; // make sure this entity is in the set of entities sent last frame entityNodeData->insertEntitySentLastFrame(entity->getID()); @@ -317,7 +318,7 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData } else { // we might include this entity if it matched in the previous frame if (entityNodeData->sentEntityLastFrame(entity->getID())) { - includeThisEntity = includeThisEntity && true; + includeThisEntity = true; entityNodeData->removeEntitySentLastFrame(entity->getID()); } else { diff --git a/libraries/octree/src/OctreeQueryNode.cpp b/libraries/octree/src/OctreeQueryNode.cpp index fe0c6c2a1f..cffba0bef4 100644 --- a/libraries/octree/src/OctreeQueryNode.cpp +++ b/libraries/octree/src/OctreeQueryNode.cpp @@ -320,3 +320,15 @@ void OctreeQueryNode::parseNackPacket(ReceivedMessage& message) { _nackedSequenceNumbers.enqueue(sequenceNumber); } } + +bool OctreeQueryNode::haveJSONParametersChanged() { + bool parametersChanged = false; + auto currentParameters = getJSONParameters(); + + if (_lastCheckJSONParameters != getJSONParameters()) { + parametersChanged = true; + _lastCheckJSONParameters = currentParameters; + } + + return parametersChanged; +} diff --git a/libraries/octree/src/OctreeQueryNode.h b/libraries/octree/src/OctreeQueryNode.h index 021b293804..10c5598b30 100644 --- a/libraries/octree/src/OctreeQueryNode.h +++ b/libraries/octree/src/OctreeQueryNode.h @@ -100,6 +100,9 @@ public: bool hasNextNackedPacket() const; const NLPacket* getNextNackedPacket(); + // call only from OctreeSendThread for the given node + bool haveJSONParametersChanged(); + private: OctreeQueryNode(const OctreeQueryNode &); OctreeQueryNode& operator= (const OctreeQueryNode&); @@ -143,6 +146,8 @@ private: quint64 _sceneSendStartTime = 0; std::array _lastOctreePayload; + + QJsonObject _lastCheckJSONParameters; }; #endif // hifi_OctreeQueryNode_h