diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 8fb79a336a..fc853820a3 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -434,6 +434,7 @@ int OctreeSendThread::packetDistributor(SharedNodePointer node, OctreeQueryNode* nodeData->getLastTimeBagEmpty(), isFullScene, &nodeData->stats, _myServer->getJurisdiction(), &nodeData->extraEncodeData, + nodeData->getUsesFrustum(), nodeData); nodeData->copyCurrentViewFrustum(params.viewFrustum); if (viewFrustumChanged) { diff --git a/assignment-client/src/scripts/EntityScriptServer.cpp b/assignment-client/src/scripts/EntityScriptServer.cpp index f06d1a5b6f..ff3c0b09c5 100644 --- a/assignment-client/src/scripts/EntityScriptServer.cpp +++ b/assignment-client/src/scripts/EntityScriptServer.cpp @@ -246,6 +246,7 @@ void EntityScriptServer::checkAndCallPreload(const EntityItemID& entityID, const if (entity && entity->shouldPreloadServerScript() && _entitiesScriptEngine) { QString scriptUrl = entity->getServerScripts(); scriptUrl = ResourceManager::normalizeURL(scriptUrl); + qDebug() << "Loading entity server script" << scriptUrl << "for" << entityID; ScriptEngine::loadEntityScript(_entitiesScriptEngine, entityID, scriptUrl, reload); entity->serverScriptHasPreloaded(); } diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index f9038fd547..0b2e7fd5ca 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -2246,7 +2246,7 @@ bool EntityItem::matchesJSONFilters(const QJsonObject& jsonFilters) const { static const QString SERVER_SCRIPTS_PROPERTY = "serverScripts"; - for (auto& property : jsonFilters.keys()) { + foreach(const auto& property, jsonFilters.keys()) { if (property == SERVER_SCRIPTS_PROPERTY && jsonFilters[property] == EntityQueryFilterSymbol::NonDefault) { // check if this entity has a non-default value for serverScripts if (_serverScripts != ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS) { diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 1f9edb6866..7ece947e89 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -279,7 +279,7 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData int numberOfEntitiesOffset = 0; withReadLock([&] { QVector indexesOfEntitiesToInclude; - + // It's possible that our element has been previous completed. In this case we'll simply not include any of our // entities for encoding. This is needed because we encode the element data at the "parent" level, and so we // need to handle the case where our sibling elements need encoding but we don't. @@ -300,6 +300,7 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData auto jsonFilters = entityNodeData->getJSONParameters(); if (!jsonFilters.isEmpty()) { + // if params include JSON filters, check if this entity matches bool entityMatchesFilters = entity->matchesJSONFilters(jsonFilters); @@ -322,14 +323,13 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData } } } - if (hadElementExtraData) { includeThisEntity = includeThisEntity && entityTreeElementExtraEncodeData->entities.contains(entity->getEntityItemID()); } - if (includeThisEntity || params.recurseEverything) { + if (params.usesFrustum && (includeThisEntity || params.recurseEverything)) { // we want to use the maximum possible box for this, so that we don't have to worry about the nuance of // simulation changing what's visible. consider the case where the entity contains an angular velocity diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 9a132d6046..3ccee70871 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -82,6 +82,7 @@ public: OctreeSceneStats* stats; JurisdictionMap* jurisdictionMap; OctreeElementExtraEncodeData* extraEncodeData; + bool usesFrustum; NodeData* nodeData; // output hints from the encode process @@ -111,6 +112,7 @@ public: OctreeSceneStats* stats = IGNORE_SCENE_STATS, JurisdictionMap* jurisdictionMap = IGNORE_JURISDICTION_MAP, OctreeElementExtraEncodeData* extraEncodeData = nullptr, + bool usesFrustum = true, NodeData* nodeData = nullptr) : lastQuerySent(lastQuerySent), maxEncodeLevel(maxEncodeLevel), @@ -124,6 +126,7 @@ public: stats(stats), jurisdictionMap(jurisdictionMap), extraEncodeData(extraEncodeData), + usesFrustum(usesFrustum), nodeData(nodeData), stopReason(UNKNOWN) { diff --git a/libraries/octree/src/OctreeQuery.cpp b/libraries/octree/src/OctreeQuery.cpp index 73fe777646..a639eccaba 100644 --- a/libraries/octree/src/OctreeQuery.cpp +++ b/libraries/octree/src/OctreeQuery.cpp @@ -90,7 +90,7 @@ int OctreeQuery::parseData(ReceivedMessage& message) { // check if this query uses a view frustum memcpy(&_usesFrustum, sourceBuffer, sizeof(_usesFrustum)); - sourceBuffer += _usesFrustum; + sourceBuffer += sizeof(_usesFrustum); if (_usesFrustum) { // unpack camera details @@ -132,7 +132,10 @@ int OctreeQuery::parseData(ReceivedMessage& message) { sourceBuffer += binaryParametersBytes; // grab the parameter object from the packed binary representation of JSON - _jsonParameters = QJsonDocument::fromBinaryData(binaryJSONParameters).object(); + auto newJsonDocument = QJsonDocument::fromBinaryData(binaryJSONParameters); + + QWriteLocker jsonParameterLocker { &_jsonParametersLock }; + _jsonParameters = newJsonDocument.object(); } return sourceBuffer - startPosition; diff --git a/libraries/octree/src/OctreeQuery.h b/libraries/octree/src/OctreeQuery.h index 79285697a5..058c1dc585 100644 --- a/libraries/octree/src/OctreeQuery.h +++ b/libraries/octree/src/OctreeQuery.h @@ -32,6 +32,7 @@ typedef unsigned long long quint64; #include #include +#include #include @@ -69,8 +70,9 @@ public: void setCameraCenterRadius(float radius) { _cameraCenterRadius = radius; } // getters/setters for JSON filter - QJsonObject getJSONParameters() { return _jsonParameters; } - void setJSONParameters(const QJsonObject& jsonParameters) { _jsonParameters = jsonParameters; } + QJsonObject getJSONParameters() { QReadLocker locker { &_jsonParametersLock }; return _jsonParameters; } + void setJSONParameters(const QJsonObject& jsonParameters) + { QWriteLocker locker { &_jsonParametersLock }; _jsonParameters = jsonParameters; } // related to Octree Sending strategies int getMaxQueryPacketsPerSecond() const { return _maxQueryPPS; } @@ -104,6 +106,7 @@ protected: uint8_t _usesFrustum = true; QJsonObject _jsonParameters; + QReadWriteLock _jsonParametersLock; private: // privatize the copy constructor and assignment operator so they cannot be called