From 28f164d7e59d02ecf365c356613bab3fc65c8b6a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 4 Dec 2017 14:43:50 -0800 Subject: [PATCH 1/3] Remove legacy jurisdiction code --- assignment-client/src/Agent.cpp | 15 - assignment-client/src/Agent.h | 1 - .../src/octree/OctreeHeadlessViewer.cpp | 176 +--------- .../src/octree/OctreeHeadlessViewer.h | 4 - .../src/octree/OctreeSendThread.cpp | 5 +- assignment-client/src/octree/OctreeServer.cpp | 44 --- assignment-client/src/octree/OctreeServer.h | 4 - .../src/octree/OctreeServerConsts.h | 1 - .../src/scripts/EntityScriptServer.cpp | 15 - .../src/scripts/EntityScriptServer.h | 1 - interface/src/Application.cpp | 201 +---------- interface/src/Application.h | 5 +- interface/src/ui/OctreeStatsDialog.cpp | 35 +- interface/src/ui/OctreeStatsDialog.h | 2 +- interface/src/ui/OctreeStatsProvider.cpp | 34 +- interface/src/ui/OctreeStatsProvider.h | 3 +- libraries/networking/src/udt/PacketHeaders.h | 2 - libraries/octree/src/JurisdictionListener.cpp | 85 ----- libraries/octree/src/JurisdictionListener.h | 60 ---- libraries/octree/src/JurisdictionMap.cpp | 325 ------------------ libraries/octree/src/JurisdictionMap.h | 88 ----- libraries/octree/src/JurisdictionSender.cpp | 68 ---- libraries/octree/src/JurisdictionSender.h | 58 ---- libraries/octree/src/Octree.cpp | 25 +- libraries/octree/src/Octree.h | 8 - .../octree/src/OctreeEditPacketSender.cpp | 216 ++++-------- libraries/octree/src/OctreeEditPacketSender.h | 11 - libraries/octree/src/OctreeSceneStats.cpp | 95 +---- libraries/octree/src/OctreeSceneStats.h | 12 +- .../octree/src/OctreeScriptingInterface.cpp | 26 +- .../octree/src/OctreeScriptingInterface.h | 7 +- 31 files changed, 113 insertions(+), 1519 deletions(-) delete mode 100644 libraries/octree/src/JurisdictionListener.cpp delete mode 100644 libraries/octree/src/JurisdictionListener.h delete mode 100644 libraries/octree/src/JurisdictionMap.cpp delete mode 100644 libraries/octree/src/JurisdictionMap.h delete mode 100644 libraries/octree/src/JurisdictionSender.cpp delete mode 100644 libraries/octree/src/JurisdictionSender.h diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index f166a780ff..2fc905c6fd 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -94,7 +94,6 @@ Agent::Agent(ReceivedMessage& message) : packetReceiver.registerListenerForTypes( { PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase }, this, "handleOctreePacket"); - packetReceiver.registerListener(PacketType::Jurisdiction, this, "handleJurisdictionPacket"); packetReceiver.registerListener(PacketType::SelectedAudioFormat, this, "handleSelectedAudioFormat"); @@ -149,17 +148,6 @@ void Agent::handleOctreePacket(QSharedPointer message, SharedNo } } -void Agent::handleJurisdictionPacket(QSharedPointer message, SharedNodePointer senderNode) { - NodeType_t nodeType; - message->peekPrimitive(&nodeType); - - // PacketType_JURISDICTION, first byte is the node type... - if (nodeType == NodeType::EntityServer) { - DependencyManager::get()->getJurisdictionListener()-> - queueReceivedPacket(message, senderNode); - } -} - void Agent::handleAudioPacket(QSharedPointer message) { _receivedAudioStream.parseData(*message); _lastReceivedAudioLoudness = _receivedAudioStream.getNextOutputFrameLoudness(); @@ -483,10 +471,7 @@ void Agent::executeScript() { auto recordingInterface = DependencyManager::get(); _scriptEngine->registerGlobalObject("Recording", recordingInterface.data()); - // we need to make sure that init has been called for our EntityScriptingInterface - // so that it actually has a jurisdiction listener when we ask it for it next entityScriptingInterface->init(); - _entityViewer.setJurisdictionListener(entityScriptingInterface->getJurisdictionListener()); _entityViewer.init(); diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 168da185b6..1229f06276 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -73,7 +73,6 @@ private slots: void handleAudioPacket(QSharedPointer message); void handleOctreePacket(QSharedPointer message, SharedNodePointer senderNode); - void handleJurisdictionPacket(QSharedPointer message, SharedNodePointer senderNode); void handleSelectedAudioFormat(QSharedPointer message); void nodeActivated(SharedNodePointer activatedNode); diff --git a/assignment-client/src/octree/OctreeHeadlessViewer.cpp b/assignment-client/src/octree/OctreeHeadlessViewer.cpp index 4e885da7a5..d3b20fb623 100644 --- a/assignment-client/src/octree/OctreeHeadlessViewer.cpp +++ b/assignment-client/src/octree/OctreeHeadlessViewer.cpp @@ -23,23 +23,6 @@ void OctreeHeadlessViewer::queryOctree() { char serverType = getMyNodeType(); PacketType packetType = getMyQueryMessageType(); - NodeToJurisdictionMap& jurisdictions = *_jurisdictionListener->getJurisdictions(); - - bool wantExtraDebugging = false; - - if (wantExtraDebugging) { - qCDebug(octree) << "OctreeHeadlessViewer::queryOctree() _jurisdictionListener=" << _jurisdictionListener; - qCDebug(octree) << "---------------"; - qCDebug(octree) << "_jurisdictionListener=" << _jurisdictionListener; - qCDebug(octree) << "Jurisdictions..."; - jurisdictions.withReadLock([&] { - for (NodeToJurisdictionMapIterator i = jurisdictions.begin(); i != jurisdictions.end(); ++i) { - qCDebug(octree) << i.key() << ": " << &i.value(); - } - }); - qCDebug(octree) << "---------------"; - } - _octreeQuery.setCameraPosition(_viewFrustum.getPosition()); _octreeQuery.setCameraOrientation(_viewFrustum.getOrientation()); _octreeQuery.setCameraFov(_viewFrustum.getFieldOfView()); @@ -51,159 +34,22 @@ void OctreeHeadlessViewer::queryOctree() { _octreeQuery.setOctreeSizeScale(_voxelSizeScale); _octreeQuery.setBoundaryLevelAdjust(_boundaryLevelAdjust); - // Iterate all of the nodes, and get a count of how many voxel servers we have... - int totalServers = 0; - int inViewServers = 0; - int unknownJurisdictionServers = 0; - - DependencyManager::get()->eachNode([&](const SharedNodePointer& node){ - // only send to the NodeTypes that are serverType - if (node->getActiveSocket() && node->getType() == serverType) { - totalServers++; - - // get the server bounds for this server - QUuid nodeUUID = node->getUUID(); - - // if we haven't heard from this voxel server, go ahead and send it a query, so we - // can get the jurisdiction... - VoxelPositionSize rootDetails; - bool foundRootDetails = false; - jurisdictions.withReadLock([&] { - if (jurisdictions.find(nodeUUID) == jurisdictions.end()) { - unknownJurisdictionServers++; - return; - } - const JurisdictionMap& map = (jurisdictions)[nodeUUID]; - - auto rootCode = map.getRootOctalCode(); - if (!rootCode) { - return; - } - - voxelDetailsForCode(rootCode.get(), rootDetails); - foundRootDetails = true; - }); - - if (foundRootDetails) { - AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); - if ((bool)(_viewFrustum.calculateCubeKeyholeIntersection(serverBounds))) { - inViewServers++; - } - } - } - }); - - if (wantExtraDebugging) { - qCDebug(octree, "Servers: total %d, in view %d, unknown jurisdiction %d", - totalServers, inViewServers, unknownJurisdictionServers); - } - - int perServerPPS = 0; - const int SMALL_BUDGET = 10; - int perUnknownServer = SMALL_BUDGET; - int totalPPS = getMaxPacketsPerSecond(); - - // determine PPS based on number of servers - if (inViewServers >= 1) { - // set our preferred PPS to be exactly evenly divided among all of the voxel servers... and allocate 1 PPS - // for each unknown jurisdiction server - perServerPPS = (totalPPS / inViewServers) - (unknownJurisdictionServers * perUnknownServer); - } else { - if (unknownJurisdictionServers > 0) { - perUnknownServer = (totalPPS / unknownJurisdictionServers); - } - } - - if (wantExtraDebugging) { - qCDebug(octree, "perServerPPS: %d perUnknownServer: %d", perServerPPS, perUnknownServer); - } - auto nodeList = DependencyManager::get(); - nodeList->eachNode([&](const SharedNodePointer& node){ - // only send to the NodeTypes that are serverType - if (node->getActiveSocket() && node->getType() == serverType) { - // get the server bounds for this server - QUuid nodeUUID = node->getUUID(); + auto node = nodeList->soloNodeOfType(serverType); + if (node && node->getActiveSocket()) { + _octreeQuery.setMaxQueryPacketsPerSecond(getMaxPacketsPerSecond()); - bool inView = false; - bool unknownView = false; + auto queryPacket = NLPacket::create(packetType); - // if we haven't heard from this voxel server, go ahead and send it a query, so we - // can get the jurisdiction... - VoxelPositionSize rootDetails; - bool foundRootDetails = false; - jurisdictions.withReadLock([&] { - if (jurisdictions.find(nodeUUID) == jurisdictions.end()) { - unknownView = true; // assume it's in view - if (wantExtraDebugging) { - qCDebug(octree) << "no known jurisdiction for node " << *node << ", assume it's visible."; - } - return; - } + // encode the query data + auto packetData = reinterpret_cast(queryPacket->getPayload()); + int packetSize = _octreeQuery.getBroadcastData(packetData); + queryPacket->setPayloadSize(packetSize); - const JurisdictionMap& map = (jurisdictions)[nodeUUID]; - auto rootCode = map.getRootOctalCode(); - - if (!rootCode) { - if (wantExtraDebugging) { - qCDebug(octree) << "Jurisdiction without RootCode for node " << *node << ". That's unusual!"; - } - return; - } - voxelDetailsForCode(rootCode.get(), rootDetails); - foundRootDetails = true; - }); - - if (foundRootDetails) { - AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); - inView = (bool)(_viewFrustum.calculateCubeKeyholeIntersection(serverBounds)); - } - - if (inView) { - _octreeQuery.setMaxQueryPacketsPerSecond(perServerPPS); - if (wantExtraDebugging) { - qCDebug(octree) << "inView for node " << *node << ", give it budget of " << perServerPPS; - } - } else if (unknownView) { - if (wantExtraDebugging) { - qCDebug(octree) << "no known jurisdiction for node " << *node << ", give it budget of " - << perUnknownServer << " to send us jurisdiction."; - } - - // set the query's position/orientation to be degenerate in a manner that will get the scene quickly - // If there's only one server, then don't do this, and just let the normal voxel query pass through - // as expected... this way, we will actually get a valid scene if there is one to be seen - if (totalServers > 1) { - _octreeQuery.setCameraPosition(glm::vec3(-0.1,-0.1,-0.1)); - const glm::quat OFF_IN_NEGATIVE_SPACE = glm::quat(-0.5, 0, -0.5, 1.0); - _octreeQuery.setCameraOrientation(OFF_IN_NEGATIVE_SPACE); - _octreeQuery.setCameraNearClip(0.1f); - _octreeQuery.setCameraFarClip(0.1f); - if (wantExtraDebugging) { - qCDebug(octree) << "Using 'minimal' camera position for node" << *node; - } - } else { - if (wantExtraDebugging) { - qCDebug(octree) << "Using regular camera position for node" << *node; - } - } - _octreeQuery.setMaxQueryPacketsPerSecond(perUnknownServer); - } else { - _octreeQuery.setMaxQueryPacketsPerSecond(0); - } - - // setup the query packet - auto queryPacket = NLPacket::create(packetType); - - // read the data to our packet and set the payload size to fit the query - int querySize = _octreeQuery.getBroadcastData(reinterpret_cast(queryPacket->getPayload())); - queryPacket->setPayloadSize(querySize); - - // ask the NodeList to send it - nodeList->sendPacket(std::move(queryPacket), *node); - } - }); + // make sure we still have an active socket + nodeList->sendUnreliablePacket(*queryPacket, *node); + } } diff --git a/assignment-client/src/octree/OctreeHeadlessViewer.h b/assignment-client/src/octree/OctreeHeadlessViewer.h index 5a7544498d..feb8211c39 100644 --- a/assignment-client/src/octree/OctreeHeadlessViewer.h +++ b/assignment-client/src/octree/OctreeHeadlessViewer.h @@ -13,7 +13,6 @@ #define hifi_OctreeHeadlessViewer_h #include -#include #include @@ -23,8 +22,6 @@ class OctreeHeadlessViewer : public OctreeProcessor { public: OctreeHeadlessViewer(); virtual ~OctreeHeadlessViewer() {}; - - void setJurisdictionListener(JurisdictionListener* jurisdictionListener) { _jurisdictionListener = jurisdictionListener; } OctreeQuery& getOctreeQuery() { return _octreeQuery; } @@ -57,7 +54,6 @@ public slots: unsigned getOctreeElementsCount() const { return _tree->getOctreeElementsCount(); } private: - JurisdictionListener* _jurisdictionListener = nullptr; OctreeQuery _octreeQuery; ViewFrustum _viewFrustum; diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 3ae653307f..d5b9da7353 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -391,8 +391,7 @@ int OctreeSendThread::packetDistributor(SharedNodePointer node, OctreeQueryNode* nodeData->sceneStart(usecTimestampNow() - CHANGE_FUDGE); // start tracking our stats - nodeData->stats.sceneStarted(isFullScene, viewFrustumChanged, - _myServer->getOctree()->getRoot(), _myServer->getJurisdiction()); + nodeData->stats.sceneStarted(isFullScene, viewFrustumChanged, _myServer->getOctree()->getRoot()); preStartNewScene(nodeData, isFullScene); } @@ -507,7 +506,7 @@ void OctreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, Octre float octreeSizeScale = nodeData->getOctreeSizeScale(); EncodeBitstreamParams params(INT_MAX, WANT_EXISTS_BITS, DONT_CHOP, viewFrustumChanged, boundaryLevelAdjust, octreeSizeScale, - isFullScene, _myServer->getJurisdiction(), nodeData); + isFullScene, nodeData); // Our trackSend() function is implemented by the server subclass, and will be called back as new entities/data elements are sent params.trackSend = [this](const QUuid& dataID, quint64 dataEdited) { _myServer->trackSend(dataID, dataEdited, _nodeUuid); diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index c535c48dda..42494ea7ee 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -237,8 +237,6 @@ OctreeServer::OctreeServer(ReceivedMessage& message) : _debugSending(false), _debugReceiving(false), _verboseDebug(false), - _jurisdiction(NULL), - _jurisdictionSender(NULL), _octreeInboundPacketProcessor(NULL), _persistThread(NULL), _started(time(0)), @@ -257,12 +255,6 @@ OctreeServer::~OctreeServer() { delete[] _parsedArgV; } - if (_jurisdictionSender) { - _jurisdictionSender->terminating(); - _jurisdictionSender->terminate(); - _jurisdictionSender->deleteLater(); - } - if (_octreeInboundPacketProcessor) { _octreeInboundPacketProcessor->terminating(); _octreeInboundPacketProcessor->terminate(); @@ -275,9 +267,6 @@ OctreeServer::~OctreeServer() { _persistThread->deleteLater(); } - delete _jurisdiction; - _jurisdiction = NULL; - // cleanup our tree here... qDebug() << qPrintable(_safeServerName) << "server START cleaning up octree... [" << this << "]"; _tree.reset(); @@ -933,10 +922,6 @@ void OctreeServer::handleOctreeDataNackPacket(QSharedPointer me } } -void OctreeServer::handleJurisdictionRequestPacket(QSharedPointer message, SharedNodePointer senderNode) { - _jurisdictionSender->queueReceivedPacket(message, senderNode); -} - void OctreeServer::handleOctreeFileReplacement(QSharedPointer message) { if (!_isFinished && !_isShuttingDown) { // these messages are only allowed to come from the domain server, so make sure that is the case @@ -1111,23 +1096,6 @@ void OctreeServer::readConfiguration() { qDebug() << "statusPort= DISABLED"; } - QString jurisdictionFile; - if (readOptionString(QString("jurisdictionFile"), settingsSectionObject, jurisdictionFile)) { - qDebug("jurisdictionFile=%s", qPrintable(jurisdictionFile)); - qDebug("about to readFromFile().... jurisdictionFile=%s", qPrintable(jurisdictionFile)); - _jurisdiction = new JurisdictionMap(qPrintable(jurisdictionFile)); - qDebug("after readFromFile().... jurisdictionFile=%s", qPrintable(jurisdictionFile)); - } else { - QString jurisdictionRoot; - bool hasRoot = readOptionString(QString("jurisdictionRoot"), settingsSectionObject, jurisdictionRoot); - QString jurisdictionEndNodes; - bool hasEndNodes = readOptionString(QString("jurisdictionEndNodes"), settingsSectionObject, jurisdictionEndNodes); - - if (hasRoot || hasEndNodes) { - _jurisdiction = new JurisdictionMap(qPrintable(jurisdictionRoot), qPrintable(jurisdictionEndNodes)); - } - } - readOptionBool(QString("verboseDebug"), settingsSectionObject, _verboseDebug); qDebug("verboseDebug=%s", debug::valueOf(_verboseDebug)); @@ -1241,7 +1209,6 @@ void OctreeServer::domainSettingsRequestComplete() { auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerListener(getMyQueryMessageType(), this, "handleOctreeQueryPacket"); packetReceiver.registerListener(PacketType::OctreeDataNack, this, "handleOctreeDataNackPacket"); - packetReceiver.registerListener(PacketType::JurisdictionRequest, this, "handleJurisdictionRequestPacket"); packetReceiver.registerListener(PacketType::OctreeFileReplacement, this, "handleOctreeFileReplacement"); packetReceiver.registerListener(PacketType::OctreeFileReplacementFromUrl, this, "handleOctreeFileReplacementFromURL"); @@ -1365,13 +1332,6 @@ void OctreeServer::domainSettingsRequestComplete() { _persistThread->initialize(true); } - // set up our jurisdiction broadcaster... - if (_jurisdiction) { - _jurisdiction->setNodeType(getMyNodeType()); - } - _jurisdictionSender = new JurisdictionSender(_jurisdiction, getMyNodeType()); - _jurisdictionSender->initialize(true); - // set up our OctreeServerPacketProcessor _octreeInboundPacketProcessor = new OctreeInboundPacketProcessor(this); _octreeInboundPacketProcessor->initialize(true); @@ -1441,10 +1401,6 @@ void OctreeServer::aboutToFinish() { _octreeInboundPacketProcessor->terminating(); } - if (_jurisdictionSender) { - _jurisdictionSender->terminating(); - } - // Shut down all the send threads for (auto& it : _sendThreads) { auto& sendThread = *it.second; diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index f930f299f3..0eba914064 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -44,7 +44,6 @@ public: bool wantsVerboseDebug() const { return _verboseDebug; } OctreePointer getOctree() { return _tree; } - JurisdictionMap* getJurisdiction() { return _jurisdiction; } int getPacketsPerClientPerInterval() const { return std::min(_packetsPerClientPerInterval, std::max(1, getPacketsTotalPerInterval() / std::max(1, getCurrentClientCount()))); } @@ -138,7 +137,6 @@ private slots: void domainSettingsRequestComplete(); void handleOctreeQueryPacket(QSharedPointer message, SharedNodePointer senderNode); void handleOctreeDataNackPacket(QSharedPointer message, SharedNodePointer senderNode); - void handleJurisdictionRequestPacket(QSharedPointer message, SharedNodePointer senderNode); void handleOctreeFileReplacement(QSharedPointer message); void handleOctreeFileReplacementFromURL(QSharedPointer message); void removeSendThread(); @@ -190,8 +188,6 @@ protected: bool _debugReceiving; bool _debugTimestampNow; bool _verboseDebug; - JurisdictionMap* _jurisdiction; - JurisdictionSender* _jurisdictionSender; OctreeInboundPacketProcessor* _octreeInboundPacketProcessor; OctreePersistThread* _persistThread; diff --git a/assignment-client/src/octree/OctreeServerConsts.h b/assignment-client/src/octree/OctreeServerConsts.h index 30b55b8786..2706b3ef73 100644 --- a/assignment-client/src/octree/OctreeServerConsts.h +++ b/assignment-client/src/octree/OctreeServerConsts.h @@ -14,7 +14,6 @@ #include #include // for MAX_PACKET_SIZE -#include const int MAX_FILENAME_LENGTH = 1024; diff --git a/assignment-client/src/scripts/EntityScriptServer.cpp b/assignment-client/src/scripts/EntityScriptServer.cpp index c8067ce81f..b4a6b3af93 100644 --- a/assignment-client/src/scripts/EntityScriptServer.cpp +++ b/assignment-client/src/scripts/EntityScriptServer.cpp @@ -79,7 +79,6 @@ EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssig auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerListenerForTypes({ PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase }, this, "handleOctreePacket"); - packetReceiver.registerListener(PacketType::Jurisdiction, this, "handleJurisdictionPacket"); packetReceiver.registerListener(PacketType::SelectedAudioFormat, this, "handleSelectedAudioFormat"); auto avatarHashMap = DependencyManager::set(); @@ -283,11 +282,8 @@ void EntityScriptServer::run() { // Setup Script Engine resetEntitiesScriptEngine(); - // we need to make sure that init has been called for our EntityScriptingInterface - // so that it actually has a jurisdiction listener when we ask it for it next auto entityScriptingInterface = DependencyManager::get(); entityScriptingInterface->init(); - _entityViewer.setJurisdictionListener(entityScriptingInterface->getJurisdictionListener()); _entityViewer.init(); @@ -566,17 +562,6 @@ void EntityScriptServer::handleOctreePacket(QSharedPointer mess } } -void EntityScriptServer::handleJurisdictionPacket(QSharedPointer message, SharedNodePointer senderNode) { - NodeType_t nodeType; - message->peekPrimitive(&nodeType); - - // PacketType_JURISDICTION, first byte is the node type... - if (nodeType == NodeType::EntityServer) { - DependencyManager::get()->getJurisdictionListener()-> - queueReceivedPacket(message, senderNode); - } -} - void EntityScriptServer::aboutToFinish() { shutdownScriptEngine(); diff --git a/assignment-client/src/scripts/EntityScriptServer.h b/assignment-client/src/scripts/EntityScriptServer.h index f9c5e921f0..9c6c4c752e 100644 --- a/assignment-client/src/scripts/EntityScriptServer.h +++ b/assignment-client/src/scripts/EntityScriptServer.h @@ -41,7 +41,6 @@ public slots: private slots: void handleOctreePacket(QSharedPointer message, SharedNodePointer senderNode); - void handleJurisdictionPacket(QSharedPointer message, SharedNodePointer senderNode); void handleSelectedAudioFormat(QSharedPointer message); void handleReloadEntityServerScriptPacket(QSharedPointer message, SharedNodePointer senderNode); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 459197f1e3..e96ce0967c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1189,8 +1189,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo userActivityLogger.logAction("launch", properties); } - // Tell our entity edit sender about our known jurisdictions - _entityEditSender.setServerJurisdictions(&_entityServerJurisdictions); _entityEditSender.setMyAvatar(myAvatar.get()); // The entity octree will have to know about MyAvatar for the parentJointName import @@ -4557,7 +4555,7 @@ void Application::reloadResourceCaches() { _lastQueriedTime = 0; _octreeQuery.incrementConnectionID(); - queryOctree(NodeType::EntityServer, PacketType::EntityQuery, _entityServerJurisdictions); + queryOctree(NodeType::EntityServer, PacketType::EntityQuery); DependencyManager::get()->clearCache(); @@ -5050,7 +5048,7 @@ void Application::update(float deltaTime) { if (queryIsDue || viewIsDifferentEnough) { _lastQueriedTime = now; if (DependencyManager::get()->shouldRenderEntities()) { - queryOctree(NodeType::EntityServer, PacketType::EntityQuery, _entityServerJurisdictions); + queryOctree(NodeType::EntityServer, PacketType::EntityQuery); } sendAvatarViewFrustum(); _lastQueriedViewFrustum = _viewFrustum; @@ -5271,15 +5269,12 @@ int Application::sendNackPackets() { return packetsSent; } -void Application::queryOctree(NodeType_t serverType, PacketType packetType, NodeToJurisdictionMap& jurisdictions) { +void Application::queryOctree(NodeType_t serverType, PacketType packetType) { if (!_settingsLoaded) { return; // bail early if settings are not loaded } - //qCDebug(interfaceapp) << ">>> inside... queryOctree()... _viewFrustum.getFieldOfView()=" << _viewFrustum.getFieldOfView(); - bool wantExtraDebugging = getLogger()->extraDebugging(); - ViewFrustum viewFrustum; copyViewFrustum(viewFrustum); _octreeQuery.setCameraPosition(viewFrustum.getPosition()); @@ -5294,147 +5289,22 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType, Node _octreeQuery.setOctreeSizeScale(lodManager->getOctreeSizeScale()); _octreeQuery.setBoundaryLevelAdjust(lodManager->getBoundaryLevelAdjust()); - // Iterate all of the nodes, and get a count of how many octree servers we have... - int totalServers = 0; - int inViewServers = 0; - int unknownJurisdictionServers = 0; - auto nodeList = DependencyManager::get(); - nodeList->eachNode([&](const SharedNodePointer& node) { - // only send to the NodeTypes that are serverType - if (node->getActiveSocket() && node->getType() == serverType) { - totalServers++; + auto node = nodeList->soloNodeOfType(serverType); + if (node && node->getActiveSocket()) { + _octreeQuery.setMaxQueryPacketsPerSecond(getMaxOctreePacketsPerSecond()); - // get the server bounds for this server - QUuid nodeUUID = node->getUUID(); + auto queryPacket = NLPacket::create(packetType); - // if we haven't heard from this voxel server, go ahead and send it a query, so we - // can get the jurisdiction... - if (jurisdictions.find(nodeUUID) == jurisdictions.end()) { - unknownJurisdictionServers++; - } else { - const JurisdictionMap& map = (jurisdictions)[nodeUUID]; + // encode the query data + auto packetData = reinterpret_cast(queryPacket->getPayload()); + int packetSize = _octreeQuery.getBroadcastData(packetData); + queryPacket->setPayloadSize(packetSize); - auto rootCode = map.getRootOctalCode(); - - if (rootCode) { - VoxelPositionSize rootDetails; - voxelDetailsForCode(rootCode.get(), rootDetails); - AACube serverBounds(glm::vec3(rootDetails.x * TREE_SCALE, - rootDetails.y * TREE_SCALE, - rootDetails.z * TREE_SCALE) - glm::vec3(HALF_TREE_SCALE), - rootDetails.s * TREE_SCALE); - if (viewFrustum.cubeIntersectsKeyhole(serverBounds)) { - inViewServers++; - } - } - } - } - }); - - if (wantExtraDebugging) { - qCDebug(interfaceapp, "Servers: total %d, in view %d, unknown jurisdiction %d", - totalServers, inViewServers, unknownJurisdictionServers); + // make sure we still have an active socket + nodeList->sendUnreliablePacket(*queryPacket, *node); } - - int perServerPPS = 0; - const int SMALL_BUDGET = 10; - int perUnknownServer = SMALL_BUDGET; - int totalPPS = getMaxOctreePacketsPerSecond(); - - // determine PPS based on number of servers - if (inViewServers >= 1) { - // set our preferred PPS to be exactly evenly divided among all of the voxel servers... and allocate 1 PPS - // for each unknown jurisdiction server - perServerPPS = (totalPPS / inViewServers) - (unknownJurisdictionServers * perUnknownServer); - } else { - if (unknownJurisdictionServers > 0) { - perUnknownServer = (totalPPS / unknownJurisdictionServers); - } - } - - if (wantExtraDebugging) { - qCDebug(interfaceapp, "perServerPPS: %d perUnknownServer: %d", perServerPPS, perUnknownServer); - } - - auto queryPacket = NLPacket::create(packetType); - - nodeList->eachNode([&](const SharedNodePointer& node) { - // only send to the NodeTypes that are serverType - if (node->getActiveSocket() && node->getType() == serverType) { - - // get the server bounds for this server - QUuid nodeUUID = node->getUUID(); - - bool inView = false; - bool unknownView = false; - - // if we haven't heard from this voxel server, go ahead and send it a query, so we - // can get the jurisdiction... - if (jurisdictions.find(nodeUUID) == jurisdictions.end()) { - unknownView = true; // assume it's in view - if (wantExtraDebugging) { - qCDebug(interfaceapp) << "no known jurisdiction for node " << *node << ", assume it's visible."; - } - } else { - const JurisdictionMap& map = (jurisdictions)[nodeUUID]; - - auto rootCode = map.getRootOctalCode(); - - if (rootCode) { - VoxelPositionSize rootDetails; - voxelDetailsForCode(rootCode.get(), rootDetails); - AACube serverBounds(glm::vec3(rootDetails.x * TREE_SCALE, - rootDetails.y * TREE_SCALE, - rootDetails.z * TREE_SCALE) - glm::vec3(HALF_TREE_SCALE), - rootDetails.s * TREE_SCALE); - - - inView = viewFrustum.cubeIntersectsKeyhole(serverBounds); - } else if (wantExtraDebugging) { - qCDebug(interfaceapp) << "Jurisdiction without RootCode for node " << *node << ". That's unusual!"; - } - } - - if (inView) { - _octreeQuery.setMaxQueryPacketsPerSecond(perServerPPS); - } else if (unknownView) { - if (wantExtraDebugging) { - qCDebug(interfaceapp) << "no known jurisdiction for node " << *node << ", give it budget of " - << perUnknownServer << " to send us jurisdiction."; - } - - // set the query's position/orientation to be degenerate in a manner that will get the scene quickly - // If there's only one server, then don't do this, and just let the normal voxel query pass through - // as expected... this way, we will actually get a valid scene if there is one to be seen - if (totalServers > 1) { - _octreeQuery.setCameraPosition(glm::vec3(-0.1,-0.1,-0.1)); - const glm::quat OFF_IN_NEGATIVE_SPACE = glm::quat(-0.5, 0, -0.5, 1.0); - _octreeQuery.setCameraOrientation(OFF_IN_NEGATIVE_SPACE); - _octreeQuery.setCameraNearClip(0.1f); - _octreeQuery.setCameraFarClip(0.1f); - if (wantExtraDebugging) { - qCDebug(interfaceapp) << "Using 'minimal' camera position for node" << *node; - } - } else { - if (wantExtraDebugging) { - qCDebug(interfaceapp) << "Using regular camera position for node" << *node; - } - } - _octreeQuery.setMaxQueryPacketsPerSecond(perUnknownServer); - } else { - _octreeQuery.setMaxQueryPacketsPerSecond(0); - } - - // encode the query data - int packetSize = _octreeQuery.getBroadcastData(reinterpret_cast(queryPacket->getPayload())); - queryPacket->setPayloadSize(packetSize); - - // make sure we still have an active socket - nodeList->sendUnreliablePacket(*queryPacket, *node); - } - }); } @@ -5549,11 +5419,6 @@ void Application::clearDomainOctreeDetails() { resetPhysicsReadyInformation(); - // reset our node to stats and node to jurisdiction maps... since these must be changing... - _entityServerJurisdictions.withWriteLock([&] { - _entityServerJurisdictions.clear(); - }); - _octreeServerSceneStats.withWriteLock([&] { _octreeServerSceneStats.clear(); }); @@ -5755,8 +5620,6 @@ bool Application::nearbyEntitiesAreReadyForPhysics() { } int Application::processOctreeStats(ReceivedMessage& message, SharedNodePointer sendingNode) { - // But, also identify the sender, and keep track of the contained jurisdiction root for this server - // parse the incoming stats datas stick it in a temporary object for now, while we // determine which server it belongs to int statsMessageLength = 0; @@ -5771,42 +5634,6 @@ int Application::processOctreeStats(ReceivedMessage& message, SharedNodePointer if (octreeStats.isFullScene()) { _fullSceneReceivedCounter++; } - - // see if this is the first we've heard of this node... - NodeToJurisdictionMap* jurisdiction = nullptr; - QString serverType; - if (sendingNode->getType() == NodeType::EntityServer) { - jurisdiction = &_entityServerJurisdictions; - serverType = "Entity"; - } - - bool found = false; - - jurisdiction->withReadLock([&] { - if (jurisdiction->find(nodeUUID) != jurisdiction->end()) { - found = true; - return; - } - - VoxelPositionSize rootDetails; - voxelDetailsForCode(octreeStats.getJurisdictionRoot().get(), rootDetails); - - qCDebug(interfaceapp, "stats from new %s server... [%f, %f, %f, %f]", - qPrintable(serverType), - (double)rootDetails.x, (double)rootDetails.y, (double)rootDetails.z, (double)rootDetails.s); - }); - - if (!found) { - // store jurisdiction details for later use - // This is bit of fiddling is because JurisdictionMap assumes it is the owner of the values used to construct it - // but OctreeSceneStats thinks it's just returning a reference to its contents. So we need to make a copy of the - // details from the OctreeSceneStats to construct the JurisdictionMap - JurisdictionMap jurisdictionMap; - jurisdictionMap.copyContents(octreeStats.getJurisdictionRoot(), octreeStats.getJurisdictionEndNodes()); - jurisdiction->withWriteLock([&] { - (*jurisdiction)[nodeUUID] = jurisdictionMap; - }); - } }); return statsMessageLength; @@ -5827,7 +5654,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEnginePointe return !entityServerNode || isPhysicsEnabled(); }); - // setup the packet senders and jurisdiction listeners of the script engine's scripting interfaces so + // setup the packet sender of the script engine's scripting interfaces so // we can use the same ones from the application. auto entityScriptingInterface = DependencyManager::get(); entityScriptingInterface->setPacketSender(&_entityEditSender); diff --git a/interface/src/Application.h b/interface/src/Application.h index ee16740f20..5267d50cf6 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -228,8 +228,6 @@ public: FileLogger* getLogger() const { return _logger; } - NodeToJurisdictionMap& getEntityServerJurisdictions() { return _entityServerJurisdictions; } - float getRenderResolutionScale() const; qint64 getCurrentSessionRuntime() const { return _sessionRunTimer.elapsed(); } @@ -450,7 +448,7 @@ private: void updateThreads(float deltaTime); void updateDialogs(float deltaTime) const; - void queryOctree(NodeType_t serverType, PacketType packetType, NodeToJurisdictionMap& jurisdictions); + void queryOctree(NodeType_t serverType, PacketType packetType); int sendNackPackets(); void sendAvatarViewFrustum(); @@ -571,7 +569,6 @@ private: StDev _idleLoopStdev; float _idleLoopMeasuredJitter; - NodeToJurisdictionMap _entityServerJurisdictions; NodeToOctreeSceneStats _octreeServerSceneStats; ControllerScriptingInterface* _controllerScriptingInterface{ nullptr }; QPointer _logDialog; diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index fc0e6781d7..77ed29d5ae 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -378,8 +378,7 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { void OctreeStatsDialog::showAllOctreeServers() { int serverCount = 0; - showOctreeServersOfType(serverCount, NodeType::EntityServer, "Entity", - qApp->getEntityServerJurisdictions()); + showOctreeServersOfType(serverCount, NodeType::EntityServer, "Entity"); if (_octreeServerLabelsCount > serverCount) { for (int i = serverCount; i < _octreeServerLabelsCount; i++) { @@ -391,8 +390,7 @@ void OctreeStatsDialog::showAllOctreeServers() { } } -void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t serverType, const char* serverTypeName, - NodeToJurisdictionMap& serverJurisdictions) { +void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t serverType, const char* serverTypeName) { QLocale locale(QLocale::English); @@ -424,35 +422,6 @@ void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t ser QUuid nodeUUID = node->getUUID(); - // lookup our nodeUUID in the jurisdiction map, if it's missing then we're - // missing at least one jurisdiction - serverJurisdictions.withReadLock([&] { - if (serverJurisdictions.find(nodeUUID) == serverJurisdictions.end()) { - serverDetails << " unknown jurisdiction "; - return; - } - const JurisdictionMap& map = serverJurisdictions[nodeUUID]; - - auto rootCode = map.getRootOctalCode(); - - if (rootCode) { - QString rootCodeHex = octalCodeToHexString(rootCode.get()); - - VoxelPositionSize rootDetails; - voxelDetailsForCode(rootCode.get(), rootDetails); - AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); - serverDetails << " jurisdiction: " - << qPrintable(rootCodeHex) - << " [" - << rootDetails.x << ", " - << rootDetails.y << ", " - << rootDetails.z << ": " - << rootDetails.s << "] "; - } else { - serverDetails << " jurisdiction has no rootCode"; - } // root code - }); - // now lookup stats details for this server... if (_extraServerDetails[serverCount-1] != LESS) { NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats(); diff --git a/interface/src/ui/OctreeStatsDialog.h b/interface/src/ui/OctreeStatsDialog.h index 67f5c01f65..7686b7c726 100644 --- a/interface/src/ui/OctreeStatsDialog.h +++ b/interface/src/ui/OctreeStatsDialog.h @@ -48,7 +48,7 @@ protected: void showAllOctreeServers(); void showOctreeServersOfType(int& serverNumber, NodeType_t serverType, - const char* serverTypeName, NodeToJurisdictionMap& serverJurisdictions); + const char* serverTypeName); private: diff --git a/interface/src/ui/OctreeStatsProvider.cpp b/interface/src/ui/OctreeStatsProvider.cpp index 5f40b9916d..e35524f5f8 100644 --- a/interface/src/ui/OctreeStatsProvider.cpp +++ b/interface/src/ui/OctreeStatsProvider.cpp @@ -239,16 +239,14 @@ void OctreeStatsProvider::updateOctreeStatsData() { void OctreeStatsProvider::updateOctreeServers() { int serverCount = 0; - showOctreeServersOfType(serverCount, NodeType::EntityServer, "Entity", - qApp->getEntityServerJurisdictions()); + showOctreeServersOfType(serverCount, NodeType::EntityServer, "Entity"); if (m_serversNum != serverCount) { m_serversNum = serverCount; emit serversNumChanged(m_serversNum); } } -void OctreeStatsProvider::showOctreeServersOfType(int& serverCount, NodeType_t serverType, const char* serverTypeName, - NodeToJurisdictionMap& serverJurisdictions) { +void OctreeStatsProvider::showOctreeServersOfType(int& serverCount, NodeType_t serverType, const char* serverTypeName) { m_servers.clear(); @@ -270,35 +268,7 @@ void OctreeStatsProvider::showOctreeServersOfType(int& serverCount, NodeType_t s } QUuid nodeUUID = node->getUUID(); - - // lookup our nodeUUID in the jurisdiction map, if it's missing then we're - // missing at least one jurisdiction - serverJurisdictions.withReadLock([&] { - if (serverJurisdictions.find(nodeUUID) == serverJurisdictions.end()) { - lesserDetails += " unknown jurisdiction "; - return; - } - const JurisdictionMap& map = serverJurisdictions[nodeUUID]; - auto rootCode = map.getRootOctalCode(); - - if (rootCode) { - QString rootCodeHex = octalCodeToHexString(rootCode.get()); - - VoxelPositionSize rootDetails; - voxelDetailsForCode(rootCode.get(), rootDetails); - AACube serverBounds(glm::vec3(rootDetails.x, rootDetails.y, rootDetails.z), rootDetails.s); - lesserDetails += QString(" jurisdiction: %1 [%2, %3, %4: %5]") - .arg(rootCodeHex) - .arg(rootDetails.x) - .arg(rootDetails.y) - .arg(rootDetails.z) - .arg(rootDetails.s); - } else { - lesserDetails += " jurisdiction has no rootCode"; - } // root code - }); - // now lookup stats details for this server... NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats(); sceneStats->withReadLock([&] { diff --git a/interface/src/ui/OctreeStatsProvider.h b/interface/src/ui/OctreeStatsProvider.h index c919ca102f..04aff24edd 100644 --- a/interface/src/ui/OctreeStatsProvider.h +++ b/interface/src/ui/OctreeStatsProvider.h @@ -121,8 +121,7 @@ private slots: void updateOctreeStatsData(); protected: void updateOctreeServers(); - void showOctreeServersOfType(int& serverNumber, NodeType_t serverType, - const char* serverTypeName, NodeToJurisdictionMap& serverJurisdictions); + void showOctreeServersOfType(int& serverNumber, NodeType_t serverType, const char* serverTypeName); private: NodeToOctreeSceneStats* _model; diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 85f321a198..e23cdad7d3 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -56,8 +56,6 @@ public: ICEServerPeerInformation, ICEServerQuery, OctreeStats, - Jurisdiction, - JurisdictionRequest, AssignmentClientStatus, NoisyMute, AvatarIdentity, diff --git a/libraries/octree/src/JurisdictionListener.cpp b/libraries/octree/src/JurisdictionListener.cpp deleted file mode 100644 index 76c5069006..0000000000 --- a/libraries/octree/src/JurisdictionListener.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// -// JurisdictionListener.cpp -// libraries/octree/src -// -// Created by Brad Hefta-Gaub on 8/12/13. -// Copyright 2013 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include - -#include -#include -#include -#include "JurisdictionListener.h" - -JurisdictionListener::JurisdictionListener(NodeType_t type) : - _nodeType(type), - _packetSender(JurisdictionListener::DEFAULT_PACKETS_PER_SECOND) -{ - setObjectName("Jurisdiction Listener"); - - connect(DependencyManager::get().data(), &NodeList::nodeKilled, this, &JurisdictionListener::nodeKilled); - - // tell our NodeList we want to hear about nodes with our node type - DependencyManager::get()->addNodeTypeToInterestSet(type); -} - -void JurisdictionListener::nodeKilled(SharedNodePointer node) { - if (_jurisdictions.find(node->getUUID()) != _jurisdictions.end()) { - _jurisdictions.erase(_jurisdictions.find(node->getUUID())); - } -} - -bool JurisdictionListener::queueJurisdictionRequest() { - auto nodeList = DependencyManager::get(); - - int nodeCount = 0; - - nodeList->eachNode([&](const SharedNodePointer& node) { - if (node->getType() == getNodeType() && node->getActiveSocket()) { - auto packet = NLPacket::create(PacketType::JurisdictionRequest, 0); - _packetSender.queuePacketForSending(node, std::move(packet)); - nodeCount++; - } - }); - - if (nodeCount > 0){ - _packetSender.setPacketsPerSecond(nodeCount); - } else { - _packetSender.setPacketsPerSecond(NO_SERVER_CHECK_RATE); - } - - // keep going if still running - return isStillRunning(); -} - -void JurisdictionListener::processPacket(QSharedPointer message, SharedNodePointer sendingNode) { - if (message->getType() == PacketType::Jurisdiction) { - JurisdictionMap map; - map.unpackFromPacket(*message); - _jurisdictions[message->getSourceID()] = map; - } -} - -bool JurisdictionListener::process() { - bool continueProcessing = isStillRunning(); - - // If we're still running, and we don't have any requests waiting to be sent, then queue our jurisdiction requests - if (continueProcessing && !_packetSender.hasPacketsToSend()) { - queueJurisdictionRequest(); - } - - if (continueProcessing) { - continueProcessing = _packetSender.process(); - } - if (continueProcessing) { - // NOTE: This will sleep if there are no pending packets to process - continueProcessing = ReceivedPacketProcessor::process(); - } - - return continueProcessing; -} diff --git a/libraries/octree/src/JurisdictionListener.h b/libraries/octree/src/JurisdictionListener.h deleted file mode 100644 index 7aee1659ff..0000000000 --- a/libraries/octree/src/JurisdictionListener.h +++ /dev/null @@ -1,60 +0,0 @@ -// -// JurisdictionListener.h -// libraries/octree/src -// -// Created by Brad Hefta-Gaub on 8/12/13. -// Copyright 2013 High Fidelity, Inc. -// -// Voxel Packet Sender -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_JurisdictionListener_h -#define hifi_JurisdictionListener_h - -#include -#include -#include - -#include "JurisdictionMap.h" - -/// Sends out PacketType::_JURISDICTION_REQUEST packets to all voxel servers and then listens for and processes -/// the PacketType::_JURISDICTION packets it receives in order to maintain an accurate state of all jurisidictions -/// within the domain. As with other ReceivedPacketProcessor classes the user is responsible for reading inbound packets -/// and adding them to the processing queue by calling queueReceivedPacket() -class JurisdictionListener : public ReceivedPacketProcessor { - Q_OBJECT -public: - static const int DEFAULT_PACKETS_PER_SECOND = 1; - static const int NO_SERVER_CHECK_RATE = 60; // if no servers yet detected, keep checking at 60fps - - JurisdictionListener(NodeType_t type = NodeType::EntityServer); - - virtual bool process() override; - - NodeToJurisdictionMap* getJurisdictions() { return &_jurisdictions; } - - - NodeType_t getNodeType() const { return _nodeType; } - void setNodeType(NodeType_t type) { _nodeType = type; } - -public slots: - /// Called by NodeList to inform us that a node has been killed. - void nodeKilled(SharedNodePointer node); - -protected: - /// Callback for processing of received packets. Will process any queued PacketType::_JURISDICTION and update the - /// jurisdiction map member variable - virtual void processPacket(QSharedPointer messsage, SharedNodePointer sendingNode) override; - -private: - NodeToJurisdictionMap _jurisdictions; - NodeType_t _nodeType; - - bool queueJurisdictionRequest(); - - PacketSender _packetSender; -}; -#endif // hifi_JurisdictionListener_h diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp deleted file mode 100644 index fcbc085339..0000000000 --- a/libraries/octree/src/JurisdictionMap.cpp +++ /dev/null @@ -1,325 +0,0 @@ -// -// JurisdictionMap.cpp -// libraries/octree/src -// -// Created by Brad Hefta-Gaub on 8/1/13. -// Copyright 2013 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include -#include -#include -#include - -#include -#include -#include - -#include "OctreeLogging.h" -#include "JurisdictionMap.h" - -void myDebugOutputBits(unsigned char byte, bool withNewLine) { - if (isalnum(byte)) { - printf("[ %d (%c): ", byte, byte); - } else { - printf("[ %d (0x%x): ", byte, byte); - } - - for (int i = 0; i < 8; i++) { - printf("%d", byte >> (7 - i) & 1); - } - printf(" ] "); - - if (withNewLine) { - printf("\n"); - } -} - -void myDebugPrintOctalCode(const unsigned char* octalCode, bool withNewLine) { - if (!octalCode) { - printf("nullptr"); - } else { - for (size_t i = 0; i < bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(octalCode)); i++) { - myDebugOutputBits(octalCode[i], false); - } - } - if (withNewLine) { - printf("\n"); - } -} - -// standard assignment -// copy assignment -JurisdictionMap& JurisdictionMap::operator=(const JurisdictionMap& other) { - copyContents(other); - return *this; -} - -// Copy constructor -JurisdictionMap::JurisdictionMap(const JurisdictionMap& other) : _rootOctalCode(nullptr) { - copyContents(other); -} - -void JurisdictionMap::copyContents(const OctalCodePtr& rootCodeIn, const OctalCodePtrList& endNodesIn) { - OctalCodePtr rootCode = rootCodeIn; - if (!rootCode) { - rootCode = createOctalCodePtr(1); - *rootCode = 0; - } - - OctalCodePtrList emptyEndNodes; - init(rootCode, endNodesIn); -} - -void JurisdictionMap::copyContents(const JurisdictionMap& other) { - _nodeType = other._nodeType; - - OctalCodePtr rootOctalCode; - OctalCodePtrList endNodes; - - std::tie(rootOctalCode, endNodes) = other.getRootAndEndNodeOctalCodes(); - - init(rootOctalCode, endNodes); -} - -JurisdictionMap::~JurisdictionMap() { -} - -JurisdictionMap::JurisdictionMap(NodeType_t type) : _rootOctalCode(nullptr) { - _nodeType = type; - OctalCodePtr rootCode = createOctalCodePtr(1); - *rootCode = 0; - - OctalCodePtrList emptyEndNodes; - init(rootCode, emptyEndNodes); -} - -JurisdictionMap::JurisdictionMap(const char* filename) : _rootOctalCode(nullptr) { - readFromFile(filename); -} - -JurisdictionMap::JurisdictionMap(const char* rootHexCode, const char* endNodesHexCodes) { - - qCDebug(octree, "JurisdictionMap::JurisdictionMap(const char* rootHexCode=[%p] %s, const char* endNodesHexCodes=[%p] %s)", - rootHexCode, rootHexCode, endNodesHexCodes, endNodesHexCodes); - - _rootOctalCode = hexStringToOctalCode(QString(rootHexCode)); - - qCDebug(octree, "JurisdictionMap::JurisdictionMap() _rootOctalCode=%p octalCode=", _rootOctalCode.get()); - myDebugPrintOctalCode(_rootOctalCode.get(), true); - - QString endNodesHexStrings(endNodesHexCodes); - QString delimiterPattern(","); - QStringList endNodeList = endNodesHexStrings.split(delimiterPattern); - - for (int i = 0; i < endNodeList.size(); i++) { - QString endNodeHexString = endNodeList.at(i); - - auto endNodeOctcode = hexStringToOctalCode(endNodeHexString); - - qCDebug(octree, "JurisdictionMap::JurisdictionMap() endNodeList(%d)=%s", - i, endNodeHexString.toLocal8Bit().constData()); - - //printOctalCode(endNodeOctcode); - _endNodes.push_back(endNodeOctcode); - - qCDebug(octree, "JurisdictionMap::JurisdictionMap() endNodeOctcode=%p octalCode=", endNodeOctcode.get()); - myDebugPrintOctalCode(endNodeOctcode.get(), true); - - } -} - -std::tuple JurisdictionMap::getRootAndEndNodeOctalCodes() const { - std::lock_guard lock(_octalCodeMutex); - return std::tuple(_rootOctalCode, _endNodes); -} - -OctalCodePtr JurisdictionMap::getRootOctalCode() const { - std::lock_guard lock(_octalCodeMutex); - return _rootOctalCode; -} - -OctalCodePtrList JurisdictionMap::getEndNodeOctalCodes() const { - std::lock_guard lock(_octalCodeMutex); - return _endNodes; -} - -void JurisdictionMap::init(OctalCodePtr rootOctalCode, const OctalCodePtrList& endNodes) { - std::lock_guard lock(_octalCodeMutex); - _rootOctalCode = rootOctalCode; - _endNodes = endNodes; -} - -JurisdictionMap::Area JurisdictionMap::isMyJurisdiction(const unsigned char* nodeOctalCode, int childIndex) const { - // to be in our jurisdiction, we must be under the root... - - std::lock_guard lock(_octalCodeMutex); - - // if the node is an ancestor of my root, then we return ABOVE - if (isAncestorOf(nodeOctalCode, _rootOctalCode.get())) { - return ABOVE; - } - - // otherwise... - bool isInJurisdiction = isAncestorOf(_rootOctalCode.get(), nodeOctalCode, childIndex); - // if we're under the root, then we can't be under any of the endpoints - if (isInJurisdiction) { - for (size_t i = 0; i < _endNodes.size(); i++) { - bool isUnderEndNode = isAncestorOf(_endNodes[i].get(), nodeOctalCode); - if (isUnderEndNode) { - isInJurisdiction = false; - break; - } - } - } - return isInJurisdiction ? WITHIN : BELOW; -} - - -bool JurisdictionMap::readFromFile(const char* filename) { - QString settingsFile(filename); - QSettings settings(settingsFile, QSettings::IniFormat); - QString rootCode = settings.value("root","00").toString(); - qCDebug(octree) << "rootCode=" << rootCode; - - std::lock_guard lock(_octalCodeMutex); - _rootOctalCode = hexStringToOctalCode(rootCode); - printOctalCode(_rootOctalCode.get()); - - settings.beginGroup("endNodes"); - const QStringList childKeys = settings.childKeys(); - QHash values; - foreach (const QString &childKey, childKeys) { - QString childValue = settings.value(childKey).toString(); - values.insert(childKey, childValue); - qCDebug(octree) << childKey << "=" << childValue; - - auto octcode = hexStringToOctalCode(childValue); - printOctalCode(octcode.get()); - - _endNodes.push_back(octcode); - } - settings.endGroup(); - return true; -} - -void JurisdictionMap::displayDebugDetails() const { - std::lock_guard lock(_octalCodeMutex); - - QString rootNodeValue = octalCodeToHexString(_rootOctalCode.get()); - - qCDebug(octree) << "root:" << rootNodeValue; - - for (size_t i = 0; i < _endNodes.size(); i++) { - QString value = octalCodeToHexString(_endNodes[i].get()); - qCDebug(octree) << "End node[" << i << "]: " << rootNodeValue; - } -} - - -bool JurisdictionMap::writeToFile(const char* filename) { - QString settingsFile(filename); - QSettings settings(settingsFile, QSettings::IniFormat); - - std::lock_guard lock(_octalCodeMutex); - - QString rootNodeValue = octalCodeToHexString(_rootOctalCode.get()); - - settings.setValue("root", rootNodeValue); - - settings.beginGroup("endNodes"); - for (size_t i = 0; i < _endNodes.size(); i++) { - QString key = QString("endnode%1").arg(i); - QString value = octalCodeToHexString(_endNodes[i].get()); - settings.setValue(key, value); - } - settings.endGroup(); - return true; -} - -std::unique_ptr JurisdictionMap::packEmptyJurisdictionIntoMessage(NodeType_t type) { - int bytes = 0; - auto packet = NLPacket::create(PacketType::Jurisdiction, sizeof(type) + sizeof(bytes)); - - // Pack the Node Type in first byte - packet->writePrimitive(type); - // No root or end node details to pack! - packet->writePrimitive(bytes); - - return packet; // includes header! -} - -std::unique_ptr JurisdictionMap::packIntoPacket() { - auto packet = NLPacket::create(PacketType::Jurisdiction); - - // Pack the Node Type in first byte - NodeType_t type = getNodeType(); - packet->writePrimitive(type); - - // add the root jurisdiction - std::lock_guard lock(_octalCodeMutex); - if (_rootOctalCode) { - size_t bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(_rootOctalCode.get())); - // No root or end node details to pack! - packet->writePrimitive(bytes); - packet->write(reinterpret_cast(_rootOctalCode.get()), bytes); - - // if and only if there's a root jurisdiction, also include the end nodes - int endNodeCount = (int)_endNodes.size(); - packet->writePrimitive(endNodeCount); - - for (int i=0; i < endNodeCount; i++) { - auto endNodeCode = _endNodes[i].get(); - size_t bytes = 0; - if (endNodeCode) { - bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodeCode)); - } - packet->writePrimitive(bytes); - packet->write(reinterpret_cast(endNodeCode), bytes); - } - } else { - int bytes = 0; - packet->writePrimitive(bytes); - } - - return packet; -} - -int JurisdictionMap::unpackFromPacket(ReceivedMessage& message) { - // read the root jurisdiction - int bytes = 0; - message.readPrimitive(&bytes); - - std::lock_guard lock(_octalCodeMutex); - _rootOctalCode = nullptr; - _endNodes.clear(); - - if (bytes > 0 && bytes <= message.getBytesLeftToRead()) { - _rootOctalCode = createOctalCodePtr(bytes); - message.read(reinterpret_cast(_rootOctalCode.get()), bytes); - - // if and only if there's a root jurisdiction, also include the end nodes - int endNodeCount = 0; - message.readPrimitive(&endNodeCount); - - for (int i = 0; i < endNodeCount; i++) { - int bytes = 0; - message.readPrimitive(&bytes); - - if (bytes <= message.getBytesLeftToRead()) { - auto endNodeCode = createOctalCodePtr(bytes); - message.read(reinterpret_cast(endNodeCode.get()), bytes); - - // if the endNodeCode was 0 length then don't add it - if (bytes > 0) { - _endNodes.push_back(endNodeCode); - } - } - } - } - - return message.getPosition(); // excludes header -} diff --git a/libraries/octree/src/JurisdictionMap.h b/libraries/octree/src/JurisdictionMap.h deleted file mode 100644 index b5a311c3d9..0000000000 --- a/libraries/octree/src/JurisdictionMap.h +++ /dev/null @@ -1,88 +0,0 @@ -// -// JurisdictionMap.h -// libraries/octree/src -// -// Created by Brad Hefta-Gaub on 8/1/13. -// Copyright 2013 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_JurisdictionMap_h -#define hifi_JurisdictionMap_h - -#include -#include -#include - -#include -#include - -#include - -#include -#include -#include - -class JurisdictionMap { -public: - enum Area { - ABOVE, - WITHIN, - BELOW - }; - - // standard constructors - JurisdictionMap(NodeType_t type = NodeType::EntityServer); // default constructor - JurisdictionMap(const JurisdictionMap& other); // copy constructor - - // standard assignment - JurisdictionMap& operator=(const JurisdictionMap& other); // copy assignment - - // application constructors - JurisdictionMap(const char* filename); - JurisdictionMap(const char* rootHextString, const char* endNodesHextString); - - ~JurisdictionMap(); - - Area isMyJurisdiction(const unsigned char* nodeOctalCode, int childIndex) const; - - bool writeToFile(const char* filename); - bool readFromFile(const char* filename); - - // Provide an atomic way to get both the rootOctalCode and endNodeOctalCodes. - std::tuple getRootAndEndNodeOctalCodes() const; - OctalCodePtr getRootOctalCode() const; - OctalCodePtrList getEndNodeOctalCodes() const; - - void copyContents(const OctalCodePtr& rootCodeIn, const OctalCodePtrList& endNodesIn); - - int unpackFromPacket(ReceivedMessage& message); - std::unique_ptr packIntoPacket(); - - /// Available to pack an empty or unknown jurisdiction into a network packet, used when no JurisdictionMap is available - static std::unique_ptr packEmptyJurisdictionIntoMessage(NodeType_t type); - - void displayDebugDetails() const; - - NodeType_t getNodeType() const { return _nodeType; } - void setNodeType(NodeType_t type) { _nodeType = type; } - -private: - void copyContents(const JurisdictionMap& other); // use assignment instead - void init(OctalCodePtr rootOctalCode, const OctalCodePtrList& endNodes); - - mutable std::mutex _octalCodeMutex; - OctalCodePtr _rootOctalCode { nullptr }; - OctalCodePtrList _endNodes; - NodeType_t _nodeType; -}; - -/// Map between node IDs and their reported JurisdictionMap. Typically used by classes that need to know which nodes are -/// managing which jurisdictions. -class NodeToJurisdictionMap : public QMap, public ReadWriteLockable {}; -typedef QMap::iterator NodeToJurisdictionMapIterator; - - -#endif // hifi_JurisdictionMap_h diff --git a/libraries/octree/src/JurisdictionSender.cpp b/libraries/octree/src/JurisdictionSender.cpp deleted file mode 100644 index dfe1a6d872..0000000000 --- a/libraries/octree/src/JurisdictionSender.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// JurisdictionSender.cpp -// libraries/octree/src -// -// Created by Brad Hefta-Gaub on 8/12/13. -// Copyright 2013 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include - -#include -#include -#include -#include "JurisdictionSender.h" - - -JurisdictionSender::JurisdictionSender(JurisdictionMap* map, NodeType_t type) : - ReceivedPacketProcessor(), - _jurisdictionMap(map), - _nodeType(type), - _packetSender(JurisdictionSender::DEFAULT_PACKETS_PER_SECOND) -{ -} - -JurisdictionSender::~JurisdictionSender() { -} - -void JurisdictionSender::processPacket(QSharedPointer message, SharedNodePointer sendingNode) { - if (message->getType() == PacketType::JurisdictionRequest) { - lockRequestingNodes(); - _nodesRequestingJurisdictions.push(sendingNode->getUUID()); - unlockRequestingNodes(); - } -} - -bool JurisdictionSender::process() { - bool continueProcessing = isStillRunning(); - - // call our ReceivedPacketProcessor base class process so we'll get any pending packets - if (continueProcessing && (continueProcessing = ReceivedPacketProcessor::process())) { - int nodeCount = 0; - - lockRequestingNodes(); - while (!_nodesRequestingJurisdictions.empty()) { - - QUuid nodeUUID = _nodesRequestingJurisdictions.front(); - _nodesRequestingJurisdictions.pop(); - SharedNodePointer node = DependencyManager::get()->nodeWithUUID(nodeUUID); - - if (node && node->getActiveSocket()) { - auto packet = (_jurisdictionMap) ? _jurisdictionMap->packIntoPacket() - : JurisdictionMap::packEmptyJurisdictionIntoMessage(getNodeType()); - _packetSender.queuePacketForSending(node, std::move(packet)); - nodeCount++; - } - } - unlockRequestingNodes(); - - // set our packets per second to be the number of nodes - _packetSender.setPacketsPerSecond(nodeCount); - - continueProcessing = _packetSender.process(); - } - return continueProcessing; -} diff --git a/libraries/octree/src/JurisdictionSender.h b/libraries/octree/src/JurisdictionSender.h deleted file mode 100644 index b2d738cd36..0000000000 --- a/libraries/octree/src/JurisdictionSender.h +++ /dev/null @@ -1,58 +0,0 @@ -// -// JurisdictionSender.h -// libraries/octree/src -// -// Created by Brad Hefta-Gaub on 8/12/13. -// Copyright 2013 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#ifndef hifi_JurisdictionSender_h -#define hifi_JurisdictionSender_h - -#include -#include - -#include -#include -#include "JurisdictionMap.h" - -/// Will process PacketType::_JURISDICTION_REQUEST packets and send out PacketType::_JURISDICTION packets -/// to requesting parties. As with other ReceivedPacketProcessor classes the user is responsible for reading inbound packets -/// and adding them to the processing queue by calling queueReceivedPacket() -class JurisdictionSender : public ReceivedPacketProcessor { - Q_OBJECT -public: - static const int DEFAULT_PACKETS_PER_SECOND = 1; - - JurisdictionSender(JurisdictionMap* map, NodeType_t type = NodeType::EntityServer); - ~JurisdictionSender(); - - void setJurisdiction(JurisdictionMap* map) { _jurisdictionMap = map; } - - virtual bool process() override; - - NodeType_t getNodeType() const { return _nodeType; } - void setNodeType(NodeType_t type) { _nodeType = type; } - -protected: - virtual void processPacket(QSharedPointer message, SharedNodePointer sendingNode) override; - - /// Locks all the resources of the thread. - void lockRequestingNodes() { _requestingNodeMutex.lock(); } - - /// Unlocks all the resources of the thread. - void unlockRequestingNodes() { _requestingNodeMutex.unlock(); } - - -private: - QMutex _requestingNodeMutex; - JurisdictionMap* _jurisdictionMap; - std::queue _nodesRequestingJurisdictions; - NodeType_t _nodeType; - - PacketSender _packetSender; -}; -#endif // hifi_JurisdictionSender_h diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 3190f25d7e..c63ff2f560 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -1020,16 +1020,6 @@ int Octree::encodeTreeBitstreamRecursion(const OctreeElementPointer& element, return bytesAtThisLevel; } - // If we've been provided a jurisdiction map, then we need to honor it. - if (params.jurisdictionMap) { - // here's how it works... if we're currently above our root jurisdiction, then we proceed normally. - // but once we're in our own jurisdiction, then we need to make sure we're not below it. - if (JurisdictionMap::BELOW == params.jurisdictionMap->isMyJurisdiction(element->getOctalCode(), CHECK_NODE_ONLY)) { - params.stopReason = EncodeBitstreamParams::OUT_OF_JURISDICTION; - return bytesAtThisLevel; - } - } - ViewFrustum::intersection nodeLocationThisView = ViewFrustum::INSIDE; // assume we're inside if (octreeQueryNode->getUsesFrustum() && !params.recurseEverything) { float boundaryDistance = boundaryDistanceForRenderLevel(element->getLevel() + params.boundaryLevelAdjust, @@ -1152,18 +1142,9 @@ int Octree::encodeTreeBitstreamRecursion(const OctreeElementPointer& element, for (int i = 0; i < NUMBER_OF_CHILDREN; i++) { OctreeElementPointer childElement = element->getChildAtIndex(i); - // if the caller wants to include childExistsBits, then include them even if not in view, if however, - // we're in a portion of the tree that's not our responsibility, then we assume the child nodes exist - // even if they don't in our local tree - bool notMyJurisdiction = false; - if (params.jurisdictionMap) { - notMyJurisdiction = JurisdictionMap::WITHIN != params.jurisdictionMap->isMyJurisdiction(element->getOctalCode(), i); - } - if (params.includeExistsBits) { - // If the child is known to exist, OR, it's not my jurisdiction, then we mark the bit as existing - if (childElement || notMyJurisdiction) { - childrenExistInTreeBits += (1 << (7 - i)); - } + // if the caller wants to include childExistsBits, then include them + if (params.includeExistsBits && childElement) { + childrenExistInTreeBits += (1 << (7 - i)); } sortedChildren[i] = childElement; diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index ec6a0e810d..1648cb0f47 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -24,7 +24,6 @@ #include #include -#include "JurisdictionMap.h" #include "OctreeElement.h" #include "OctreeElementBag.h" #include "OctreePacketData.h" @@ -62,7 +61,6 @@ const int NO_BOUNDARY_ADJUST = 0; const int LOW_RES_MOVING_ADJUST = 1; #define IGNORE_COVERAGE_MAP NULL -#define IGNORE_JURISDICTION_MAP NULL class EncodeBitstreamParams { public: @@ -77,7 +75,6 @@ public: int boundaryLevelAdjust; float octreeElementSizeScale; bool forceSendScene; - JurisdictionMap* jurisdictionMap; NodeData* nodeData; // output hints from the encode process @@ -87,7 +84,6 @@ public: NULL_NODE, NULL_NODE_DATA, TOO_DEEP, - OUT_OF_JURISDICTION, LOD_SKIP, OUT_OF_VIEW, WAS_IN_VIEW, @@ -105,7 +101,6 @@ public: int boundaryLevelAdjust = NO_BOUNDARY_ADJUST, float octreeElementSizeScale = DEFAULT_OCTREE_SIZE_SCALE, bool forceSendScene = true, - JurisdictionMap* jurisdictionMap = IGNORE_JURISDICTION_MAP, NodeData* nodeData = nullptr) : maxEncodeLevel(maxEncodeLevel), maxLevelReached(0), @@ -115,7 +110,6 @@ public: boundaryLevelAdjust(boundaryLevelAdjust), octreeElementSizeScale(octreeElementSizeScale), forceSendScene(forceSendScene), - jurisdictionMap(jurisdictionMap), nodeData(nodeData), stopReason(UNKNOWN) { @@ -131,7 +125,6 @@ public: case DIDNT_FIT: qDebug("DIDNT_FIT"); break; case NULL_NODE: qDebug("NULL_NODE"); break; case TOO_DEEP: qDebug("TOO_DEEP"); break; - case OUT_OF_JURISDICTION: qDebug("OUT_OF_JURISDICTION"); break; case LOD_SKIP: qDebug("LOD_SKIP"); break; case OUT_OF_VIEW: qDebug("OUT_OF_VIEW"); break; case WAS_IN_VIEW: qDebug("WAS_IN_VIEW"); break; @@ -148,7 +141,6 @@ public: case DIDNT_FIT: return QString("DIDNT_FIT"); break; case NULL_NODE: return QString("NULL_NODE"); break; case TOO_DEEP: return QString("TOO_DEEP"); break; - case OUT_OF_JURISDICTION: return QString("OUT_OF_JURISDICTION"); break; case LOD_SKIP: return QString("LOD_SKIP"); break; case OUT_OF_VIEW: return QString("OUT_OF_VIEW"); break; case WAS_IN_VIEW: return QString("WAS_IN_VIEW"); break; diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 7e46831faa..4f10c9bf79 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -22,13 +22,10 @@ const int OctreeEditPacketSender::DEFAULT_MAX_PENDING_MESSAGES = PacketSender::D OctreeEditPacketSender::OctreeEditPacketSender() : - PacketSender(), _shouldSend(true), _maxPendingMessages(DEFAULT_MAX_PENDING_MESSAGES), - _releaseQueuedMessagesPending(false), - _serverJurisdictions(NULL) + _releaseQueuedMessagesPending(false) { - } OctreeEditPacketSender::~OctreeEditPacketSender() { @@ -40,34 +37,8 @@ OctreeEditPacketSender::~OctreeEditPacketSender() { bool OctreeEditPacketSender::serversExist() const { - bool hasServers = false; - bool atLeastOneJurisdictionMissing = false; // assume the best - - DependencyManager::get()->eachNodeBreakable([&](const SharedNodePointer& node){ - if (node->getType() == getMyNodeType() && node->getActiveSocket()) { - - QUuid nodeUUID = node->getUUID(); - // If we've got Jurisdictions set, then check to see if we know the jurisdiction for this server - if (_serverJurisdictions) { - // lookup our nodeUUID in the jurisdiction map, if it's missing then we're - // missing at least one jurisdiction - _serverJurisdictions->withReadLock([&] { - if ((*_serverJurisdictions).find(nodeUUID) == (*_serverJurisdictions).end()) { - atLeastOneJurisdictionMissing = true; - } - }); - } - hasServers = true; - } - - if (atLeastOneJurisdictionMissing) { - return false; // no point in looking further - return false from anonymous function - } else { - return true; - } - }); - - return (hasServers && !atLeastOneJurisdictionMissing); + auto node = DependencyManager::get()->soloNodeOfType(getMyNodeType()); + return node && node->getActiveSocket(); } // This method is called when the edit packet layer has determined that it has a fully formed packet destined for @@ -132,7 +103,7 @@ void OctreeEditPacketSender::queuePacketListToNode(const QUuid& nodeUUID, std::u } void OctreeEditPacketSender::processPreServerExistsPackets() { - assert(serversExist()); // we should only be here if we have jurisdictions + assert(serversExist()); // we should only be here if we have servers // First send out all the single message packets... _pendingPacketsLock.lock(); @@ -150,7 +121,7 @@ void OctreeEditPacketSender::processPreServerExistsPackets() { _pendingPacketsLock.unlock(); - // if while waiting for the jurisdictions the caller called releaseQueuedMessages() + // if while waiting for the servers the caller called releaseQueuedMessages() // then we want to honor that request now. if (_releaseQueuedMessagesPending) { releaseQueuedMessages(); @@ -178,34 +149,12 @@ void OctreeEditPacketSender::queuePacketToNodes(std::unique_ptr packet return; // bail early } - assert(serversExist()); // we must have jurisdictions to be here!! + assert(serversExist()); // we must have servers to be here!! - const unsigned char* octCode = reinterpret_cast(packet->getPayload()) + sizeof(short) + sizeof(quint64); - - // We want to filter out edit messages for servers based on the server's Jurisdiction - // But we can't really do that with a packed message, since each edit message could be destined - // for a different server... So we need to actually manage multiple queued packets... one - // for each server - - DependencyManager::get()->eachNode([&](const SharedNodePointer& node){ - // only send to the NodeTypes that are getMyNodeType() - if (node->getActiveSocket() && node->getType() == getMyNodeType()) { - QUuid nodeUUID = node->getUUID(); - bool isMyJurisdiction = true; - // we need to get the jurisdiction for this - // here we need to get the "pending packet" for this server - _serverJurisdictions->withReadLock([&] { - const JurisdictionMap& map = (*_serverJurisdictions)[nodeUUID]; - isMyJurisdiction = (map.isMyJurisdiction(octCode, CHECK_NODE_ONLY) == JurisdictionMap::WITHIN); - }); - - if (isMyJurisdiction) { - // make a copy of this packet for this node and queue - auto packetCopy = NLPacket::createCopy(*packet); - queuePacketToNode(nodeUUID, std::move(packetCopy)); - } - } - }); + auto node = DependencyManager::get()->soloNodeOfType(getMyNodeType()); + if (node && node->getActiveSocket()) { + queuePacketToNode(node->getUUID(), std::move(packet)); + } } @@ -216,8 +165,8 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType type, QByteArray& return; // bail early } - // If we don't have jurisdictions, then we will simply queue up all of these packets and wait till we have - // jurisdictions for processing + // If we don't have servers, then we will simply queue up all of these packets and wait till we have + // servers for processing if (!serversExist()) { if (_maxPendingMessages > 0) { EditMessagePair messagePair { type, QByteArray(editMessage) }; @@ -235,107 +184,80 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType type, QByteArray& return; // bail early } - // We want to filter out edit messages for servers based on the server's Jurisdiction - // But we can't really do that with a packed message, since each edit message could be destined - // for a different server... So we need to actually manage multiple queued packets... one - // for each server _packetsQueueLock.lock(); - DependencyManager::get()->eachNode([&](const SharedNodePointer& node){ - // only send to the NodeTypes that are getMyNodeType() - if (node->getActiveSocket() && node->getType() == getMyNodeType()) { - QUuid nodeUUID = node->getUUID(); - bool isMyJurisdiction = true; + auto node = DependencyManager::get()->soloNodeOfType(getMyNodeType()); + if (node && node->getActiveSocket()) { + QUuid nodeUUID = node->getUUID(); - if (type == PacketType::EntityErase) { - isMyJurisdiction = true; // send erase messages to all servers - } else if (_serverJurisdictions) { - // we need to get the jurisdiction for this - // here we need to get the "pending packet" for this server - _serverJurisdictions->withReadLock([&] { - if ((*_serverJurisdictions).find(nodeUUID) != (*_serverJurisdictions).end()) { - const JurisdictionMap& map = (*_serverJurisdictions)[nodeUUID]; - isMyJurisdiction = (map.isMyJurisdiction(reinterpret_cast(editMessage.data()), - CHECK_NODE_ONLY) == JurisdictionMap::WITHIN); - } else { - isMyJurisdiction = false; - } - }); + // for edit messages, we will attempt to combine multiple edit commands where possible, we + // don't do this for add because we send those reliably + if (type == PacketType::EntityAdd) { + auto newPacket = NLPacketList::create(type, QByteArray(), true, true); + auto nodeClockSkew = node->getClockSkewUsec(); + + // pack sequence number + quint16 sequence = _outgoingSequenceNumbers[nodeUUID]++; + newPacket->writePrimitive(sequence); + + // pack in timestamp + quint64 now = usecTimestampNow() + nodeClockSkew; + newPacket->writePrimitive(now); + + + // We call this virtual function that allows our specific type of EditPacketSender to + // fixup the buffer for any clock skew + if (nodeClockSkew != 0) { + adjustEditPacketForClockSkew(type, editMessage, nodeClockSkew); } - if (isMyJurisdiction) { - // for edit messages, we will attempt to combine multiple edit commands where possible, we - // don't do this for add because we send those reliably - if (type == PacketType::EntityAdd) { + newPacket->write(editMessage); - auto newPacket = NLPacketList::create(type, QByteArray(), true, true); - auto nodeClockSkew = node->getClockSkewUsec(); + // release the new packet + releaseQueuedPacketList(nodeUUID, std::move(newPacket)); - // pack sequence number - quint16 sequence = _outgoingSequenceNumbers[nodeUUID]++; - newPacket->writePrimitive(sequence); + // tell the sent packet history that we used a sequence number for an untracked packet + auto& sentPacketHistory = _sentPacketHistories[nodeUUID]; + sentPacketHistory.untrackedPacketSent(sequence); + } else { + // only a NLPacket for now + std::unique_ptr& bufferedPacket = _pendingEditPackets[nodeUUID].first; - // pack in timestamp - quint64 now = usecTimestampNow() + nodeClockSkew; - newPacket->writePrimitive(now); + if (!bufferedPacket) { + bufferedPacket = initializePacket(type, node->getClockSkewUsec()); + } else { + // If we're switching type, then we send the last one and start over + if ((type != bufferedPacket->getType() && bufferedPacket->getPayloadSize() > 0) || + (editMessage.size() >= bufferedPacket->bytesAvailableForWrite())) { + // create the new packet and swap it with the packet in _pendingEditPackets + auto packetToRelease = initializePacket(type, node->getClockSkewUsec()); + bufferedPacket.swap(packetToRelease); - // We call this virtual function that allows our specific type of EditPacketSender to - // fixup the buffer for any clock skew - if (nodeClockSkew != 0) { - adjustEditPacketForClockSkew(type, editMessage, nodeClockSkew); - } - - newPacket->write(editMessage); - - // release the new packet - releaseQueuedPacketList(nodeUUID, std::move(newPacket)); - - // tell the sent packet history that we used a sequence number for an untracked packet - auto& sentPacketHistory = _sentPacketHistories[nodeUUID]; - sentPacketHistory.untrackedPacketSent(sequence); - } else { - - std::unique_ptr& bufferedPacket = _pendingEditPackets[nodeUUID].first; //only a NLPacket for now - - if (!bufferedPacket) { - bufferedPacket = initializePacket(type, node->getClockSkewUsec()); - } else { - // If we're switching type, then we send the last one and start over - if ((type != bufferedPacket->getType() && bufferedPacket->getPayloadSize() > 0) || - (editMessage.size() >= bufferedPacket->bytesAvailableForWrite())) { - - // create the new packet and swap it with the packet in _pendingEditPackets - auto packetToRelease = initializePacket(type, node->getClockSkewUsec()); - bufferedPacket.swap(packetToRelease); - - // release the previously buffered packet - releaseQueuedPacket(nodeUUID, std::move(packetToRelease)); - } - } - - // This is really the first time we know which server/node this particular edit message - // is going to, so we couldn't adjust for clock skew till now. But here's our chance. - // We call this virtual function that allows our specific type of EditPacketSender to - // fixup the buffer for any clock skew - if (node->getClockSkewUsec() != 0) { - adjustEditPacketForClockSkew(type, editMessage, node->getClockSkewUsec()); - } - - bufferedPacket->write(editMessage); - + // release the previously buffered packet + releaseQueuedPacket(nodeUUID, std::move(packetToRelease)); } } + + // This is really the first time we know which server/node this particular edit message + // is going to, so we couldn't adjust for clock skew till now. But here's our chance. + // We call this virtual function that allows our specific type of EditPacketSender to + // fixup the buffer for any clock skew + if (node->getClockSkewUsec() != 0) { + adjustEditPacketForClockSkew(type, editMessage, node->getClockSkewUsec()); + } + + bufferedPacket->write(editMessage); } - }); + } _packetsQueueLock.unlock(); } void OctreeEditPacketSender::releaseQueuedMessages() { - // if we don't yet have jurisdictions then we can't actually release messages yet because we don't - // know where to send them to. Instead, just remember this request and when we eventually get jurisdictions + // if we don't yet have servers then we can't actually release messages yet because we don't + // know where to send them to. Instead, just remember this request and when we eventually get servers // call release again at that time. if (!serversExist()) { _releaseQueuedMessagesPending = true; @@ -397,8 +319,8 @@ std::unique_ptr OctreeEditPacketSender::initializePacket(PacketType ty } bool OctreeEditPacketSender::process() { - // if we have server jurisdiction details, and we have pending pre-jurisdiction packets, then process those - // before doing our normal process step. This processPreJurisdictionPackets() + // if we have servers, and we have pending pre-servers exist packets, then process those + // before doing our normal process step. This processPreServerExistPackets() if (serversExist() && (!_preServerEdits.empty() || !_preServerSingleMessagePackets.empty() )) { processPreServerExistsPackets(); } diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index 79c363bec5..8a33eb8b73 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -17,7 +17,6 @@ #include #include -#include "JurisdictionMap.h" #include "SentPacketHistory.h" /// Utility for processing, packing, queueing and sending of outbound edit messages. @@ -49,14 +48,6 @@ public: /// in an application like interface when all octree features are disabled. void setShouldSend(bool shouldSend) { _shouldSend = shouldSend; } - /// call this to inform the OctreeEditPacketSender of the server jurisdictions. This is required for normal operation. - /// The internal contents of the jurisdiction map may change throughout the lifetime of the OctreeEditPacketSender. This map - /// can be set prior to servers being present, so long as the contents of the map accurately reflect the current - /// known jurisdictions. - void setServerJurisdictions(NodeToJurisdictionMap* serverJurisdictions) { - _serverJurisdictions = serverJurisdictions; - } - /// if you're running in non-threaded mode, you must call this method regularly virtual bool process() override; @@ -108,8 +99,6 @@ protected: std::list _preServerEdits; // these will get packed into other larger packets std::list> _preServerSingleMessagePackets; // these will go out as is - NodeToJurisdictionMap* _serverJurisdictions; - QMutex _releaseQueuedPacketMutex; // TODO: add locks for this and _pendingEditPackets diff --git a/libraries/octree/src/OctreeSceneStats.cpp b/libraries/octree/src/OctreeSceneStats.cpp index 09b2d6ddf5..054603440d 100644 --- a/libraries/octree/src/OctreeSceneStats.cpp +++ b/libraries/octree/src/OctreeSceneStats.cpp @@ -37,15 +37,13 @@ OctreeSceneStats::OctreeSceneStats() : _incomingBytes(0), _incomingWastedBytes(0), _incomingOctreeSequenceNumberStats(), - _incomingFlightTimeAverage(samples), - _jurisdictionRoot(NULL) + _incomingFlightTimeAverage(samples) { reset(); } // copy constructor -OctreeSceneStats::OctreeSceneStats(const OctreeSceneStats& other) : -_jurisdictionRoot(NULL) { +OctreeSceneStats::OctreeSceneStats(const OctreeSceneStats& other) { copyFromOther(other); } @@ -109,26 +107,6 @@ void OctreeSceneStats::copyFromOther(const OctreeSceneStats& other) { _existsInPacketBitsWritten = other._existsInPacketBitsWritten; _treesRemoved = other._treesRemoved; - // before copying the jurisdictions, delete any current values... - _jurisdictionRoot = nullptr; - _jurisdictionEndNodes.clear(); - - // Now copy the values from the other - if (other._jurisdictionRoot) { - auto bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(other._jurisdictionRoot.get())); - _jurisdictionRoot = createOctalCodePtr(bytes); - memcpy(_jurisdictionRoot.get(), other._jurisdictionRoot.get(), bytes); - } - for (size_t i = 0; i < other._jurisdictionEndNodes.size(); i++) { - auto& endNodeCode = other._jurisdictionEndNodes[i]; - if (endNodeCode) { - auto bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodeCode.get())); - auto endNodeCodeCopy = createOctalCodePtr(bytes); - memcpy(endNodeCodeCopy.get(), endNodeCode.get(), bytes); - _jurisdictionEndNodes.push_back(endNodeCodeCopy); - } - } - _incomingPacket = other._incomingPacket; _incomingBytes = other._incomingBytes; _incomingWastedBytes = other._incomingWastedBytes; @@ -141,8 +119,7 @@ OctreeSceneStats::~OctreeSceneStats() { reset(); } -void OctreeSceneStats::sceneStarted(bool isFullScene, bool isMoving, const OctreeElementPointer& root, - JurisdictionMap* jurisdictionMap) { +void OctreeSceneStats::sceneStarted(bool isFullScene, bool isMoving, const OctreeElementPointer& root) { reset(); // resets packet and octree stats _isStarted = true; _start = usecTimestampNow(); @@ -153,14 +130,6 @@ void OctreeSceneStats::sceneStarted(bool isFullScene, bool isMoving, const Octre _isFullScene = isFullScene; _isMoving = isMoving; - - // setup jurisdictions - if (jurisdictionMap) { - std::tie(_jurisdictionRoot, _jurisdictionEndNodes) = jurisdictionMap->getRootAndEndNodeOctalCodes(); - } else { - _jurisdictionRoot = nullptr; - _jurisdictionEndNodes.clear(); - } } void OctreeSceneStats::sceneCompleted() { @@ -236,9 +205,6 @@ void OctreeSceneStats::reset() { _existsBitsWritten = 0; _existsInPacketBitsWritten = 0; _treesRemoved = 0; - - _jurisdictionRoot = nullptr; - _jurisdictionEndNodes.clear(); } void OctreeSceneStats::packetSent(int bytes) { @@ -374,29 +340,6 @@ int OctreeSceneStats::packIntoPacket() { _statsPacket->writePrimitive(_existsInPacketBitsWritten); _statsPacket->writePrimitive(_treesRemoved); - // add the root jurisdiction - if (_jurisdictionRoot) { - // copy the - int bytes = (int)bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(_jurisdictionRoot.get())); - _statsPacket->writePrimitive(bytes); - _statsPacket->write(reinterpret_cast(_jurisdictionRoot.get()), bytes); - - // if and only if there's a root jurisdiction, also include the end elements - int endNodeCount = (int)_jurisdictionEndNodes.size(); - - _statsPacket->writePrimitive(endNodeCount); - - for (int i=0; i < endNodeCount; i++) { - auto& endNodeCode = _jurisdictionEndNodes[i]; - auto bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodeCode.get())); - _statsPacket->writePrimitive(bytes); - _statsPacket->write(reinterpret_cast(endNodeCode.get()), bytes); - } - } else { - int bytes = 0; - _statsPacket->writePrimitive(bytes); - } - return _statsPacket->getPayloadSize(); } @@ -458,38 +401,6 @@ int OctreeSceneStats::unpackFromPacket(ReceivedMessage& packet) { packet.readPrimitive(&_existsBitsWritten); packet.readPrimitive(&_existsInPacketBitsWritten); packet.readPrimitive(&_treesRemoved); - // before allocating new juridiction, clean up existing ones - _jurisdictionRoot = nullptr; - _jurisdictionEndNodes.clear(); - - // read the root jurisdiction - int bytes = 0; - packet.readPrimitive(&bytes); - - if (bytes == 0) { - _jurisdictionRoot = nullptr; - _jurisdictionEndNodes.clear(); - } else { - _jurisdictionRoot = createOctalCodePtr(bytes); - packet.read(reinterpret_cast(_jurisdictionRoot.get()), bytes); - - // if and only if there's a root jurisdiction, also include the end elements - _jurisdictionEndNodes.clear(); - - int endNodeCount = 0; - packet.readPrimitive(&endNodeCount); - - for (int i=0; i < endNodeCount; i++) { - int bytes = 0; - - packet.readPrimitive(&bytes); - - auto endNodeCode = createOctalCodePtr(bytes); - packet.read(reinterpret_cast(endNodeCode.get()), bytes); - - _jurisdictionEndNodes.push_back(endNodeCode); - } - } // running averages _elapsedAverage.updateAverage((float)_elapsed); diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index 3774d4287d..78b4dfd26f 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -17,7 +17,6 @@ #include #include -#include "JurisdictionMap.h" #include "OctreePacketData.h" #include "SequenceNumberStats.h" #include "OctalCode.h" @@ -39,7 +38,7 @@ public: OctreeSceneStats& operator= (const OctreeSceneStats& other); // copy assignment /// Call when beginning the computation of a scene. Initializes internal structures - void sceneStarted(bool fullScene, bool moving, const OctreeElementPointer& root, JurisdictionMap* jurisdictionMap); + void sceneStarted(bool fullScene, bool moving, const OctreeElementPointer& root); bool getIsSceneStarted() const { return _isStarted; } /// Call when the computation of a scene is completed. Finalizes internal structures @@ -143,12 +142,6 @@ public: /// \param Item item The item from the stats you're interested in. const char* getItemValue(Item item); - /// Returns OctCode for root element of the jurisdiction of this particular octree server - OctalCodePtr getJurisdictionRoot() const { return _jurisdictionRoot; } - - /// Returns list of OctCodes for end elements of the jurisdiction of this particular octree server - const OctalCodePtrList& getJurisdictionEndNodes() const { return _jurisdictionEndNodes; } - bool isMoving() const { return _isMoving; } bool isFullScene() const { return _isFullScene; } quint64 getTotalElements() const { return _totalElements; } @@ -277,9 +270,6 @@ private: static ItemInfo _ITEMS[]; static const int MAX_ITEM_VALUE_LENGTH = 128; char _itemValueBuffer[MAX_ITEM_VALUE_LENGTH]; - - OctalCodePtr _jurisdictionRoot; - std::vector _jurisdictionEndNodes; }; /// Map between element IDs and their reported OctreeSceneStats. Typically used by classes that need to know which elements sent diff --git a/libraries/octree/src/OctreeScriptingInterface.cpp b/libraries/octree/src/OctreeScriptingInterface.cpp index 8913e88cf5..618e8ac469 100644 --- a/libraries/octree/src/OctreeScriptingInterface.cpp +++ b/libraries/octree/src/OctreeScriptingInterface.cpp @@ -13,12 +13,9 @@ #include "OctreeScriptingInterface.h" -OctreeScriptingInterface::OctreeScriptingInterface(OctreeEditPacketSender* packetSender, - JurisdictionListener* jurisdictionListener) : +OctreeScriptingInterface::OctreeScriptingInterface(OctreeEditPacketSender* packetSender) : _packetSender(packetSender), - _jurisdictionListener(jurisdictionListener), - _managedPacketSender(false), - _managedJurisdictionListener(false), + _managedPacketSender(false), _initialized(false) { } @@ -28,12 +25,6 @@ OctreeScriptingInterface::~OctreeScriptingInterface() { } void OctreeScriptingInterface::cleanupManagedObjects() { - if (_managedJurisdictionListener) { - _jurisdictionListener->terminate(); - _jurisdictionListener->deleteLater(); - _managedJurisdictionListener = false; - _jurisdictionListener = NULL; - } if (_managedPacketSender) { _packetSender->terminate(); _packetSender->deleteLater(); @@ -46,29 +37,16 @@ void OctreeScriptingInterface::setPacketSender(OctreeEditPacketSender* packetSen _packetSender = packetSender; } -void OctreeScriptingInterface::setJurisdictionListener(JurisdictionListener* jurisdictionListener) { - _jurisdictionListener = jurisdictionListener; -} - void OctreeScriptingInterface::init() { if (_initialized) { return; } - if (_jurisdictionListener) { - _managedJurisdictionListener = false; - } else { - _managedJurisdictionListener = true; - _jurisdictionListener = new JurisdictionListener(getServerNodeType()); - _jurisdictionListener->initialize(true); - } - if (_packetSender) { _managedPacketSender = false; } else { _managedPacketSender = true; _packetSender = createPacketSender(); - _packetSender->setServerJurisdictions(_jurisdictionListener->getJurisdictions()); } if (QCoreApplication::instance()) { diff --git a/libraries/octree/src/OctreeScriptingInterface.h b/libraries/octree/src/OctreeScriptingInterface.h index 86b9730393..c31da94532 100644 --- a/libraries/octree/src/OctreeScriptingInterface.h +++ b/libraries/octree/src/OctreeScriptingInterface.h @@ -14,21 +14,18 @@ #include -#include "JurisdictionListener.h" #include "OctreeEditPacketSender.h" /// handles scripting of Particle commands from JS passed to assigned clients class OctreeScriptingInterface : public QObject { Q_OBJECT public: - OctreeScriptingInterface(OctreeEditPacketSender* packetSender = NULL, JurisdictionListener* jurisdictionListener = NULL); + OctreeScriptingInterface(OctreeEditPacketSender* packetSender = nullptr); ~OctreeScriptingInterface(); OctreeEditPacketSender* getPacketSender() const { return _packetSender; } - JurisdictionListener* getJurisdictionListener() const { return _jurisdictionListener; } void setPacketSender(OctreeEditPacketSender* packetSender); - void setJurisdictionListener(JurisdictionListener* jurisdictionListener); void init(); virtual NodeType_t getServerNodeType() const = 0; @@ -86,9 +83,7 @@ public slots: protected: /// attached OctreeEditPacketSender that handles queuing and sending of packets to VS OctreeEditPacketSender* _packetSender = nullptr; - JurisdictionListener* _jurisdictionListener = nullptr; bool _managedPacketSender; - bool _managedJurisdictionListener; bool _initialized; }; From 06e2f394f9e23819c4e04e62b74d560f6feb1ca9 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 4 Dec 2017 17:12:09 -0800 Subject: [PATCH 2/3] Update Octree server stats to handle single server --- .../hifi/dialogs/TabletEntityStatistics.qml | 146 +++++++------- interface/src/ui/OctreeStatsDialog.cpp | 153 ++++++-------- interface/src/ui/OctreeStatsDialog.h | 35 ++-- interface/src/ui/OctreeStatsProvider.cpp | 187 ++++++++---------- interface/src/ui/OctreeStatsProvider.h | 13 +- 5 files changed, 234 insertions(+), 300 deletions(-) diff --git a/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml b/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml index da295917a0..cf3e39a885 100644 --- a/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml +++ b/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml @@ -154,90 +154,86 @@ Rectangle { color: OctreeStats.getColor() } - Repeater { - model: OctreeStats.serversNum + Column { + id: serverColumn + width: scrollView.width - 10 + x: 5 + spacing: 5 - delegate: Column { - id: serverColumn - width: scrollView.width - 10 - x: 5 - spacing: 5 + state: "less" - state: "less" + TabletEntityStatisticsItem { + id: serverStats + width: parent.width + titleText: qsTr("Entity Server") + ":" + colorScheme: root.colorScheme + color: OctreeStats.getColor() + } - TabletEntityStatisticsItem { - id: serverStats - width: parent.width - titleText: qsTr("Entity Server ") + (index+1) + ":" + Row { + id: buttonsRow + width: parent.width + height: 30 + spacing: 10 + + HifiControls.Button { + id: moreButton + color: hifi.buttons.blue colorScheme: root.colorScheme - color: OctreeStats.getColor() - } - - Row { - id: buttonsRow - width: parent.width + width: parent.width / 2 - 10 height: 30 - spacing: 10 - - HifiControls.Button { - id: moreButton - color: hifi.buttons.blue - colorScheme: root.colorScheme - width: parent.width / 2 - 10 - height: 30 - onClicked: { - if (serverColumn.state === "less") { - serverColumn.state = "more" - } else if (serverColumn.state === "more") { - serverColumn.state = "most" - } else { - serverColumn.state = "more" - } + onClicked: { + if (serverColumn.state === "less") { + serverColumn.state = "more" + } else if (serverColumn.state === "more") { + serverColumn.state = "most" + } else { + serverColumn.state = "more" } } - HifiControls.Button { - id: mostButton - color: hifi.buttons.blue - colorScheme: root.colorScheme - height: 30 - width: parent.width / 2 - 10 - onClicked: { - if (serverColumn.state === "less") { - serverColumn.state = "most" - } else if (serverColumn.state === "more") { - serverColumn.state = "less" - } else { - serverColumn.state = "less" - } - } - - } } - states: [ - State { - name: "less" - PropertyChanges { target: moreButton; text: qsTr("more..."); } - PropertyChanges { target: mostButton; text: qsTr("most..."); } - PropertyChanges { target: serverStats; text: OctreeStats.servers[index*3]; } - }, - State { - name: "more" - PropertyChanges { target: moreButton; text: qsTr("most..."); } - PropertyChanges { target: mostButton; text: qsTr("less..."); } - PropertyChanges { target: serverStats; text: OctreeStats.servers[index*3] + - OctreeStats.servers[index*3 + 1]; } - }, - State { - name: "most" - PropertyChanges { target: moreButton; text: qsTr("less..."); } - PropertyChanges { target: mostButton; text: qsTr("least..."); } - PropertyChanges { target: serverStats; text: OctreeStats.servers[index*3] + - OctreeStats.servers[index*3 + 1] + - OctreeStats.servers[index*3 + 2]; } + HifiControls.Button { + id: mostButton + color: hifi.buttons.blue + colorScheme: root.colorScheme + height: 30 + width: parent.width / 2 - 10 + onClicked: { + if (serverColumn.state === "less") { + serverColumn.state = "most" + } else if (serverColumn.state === "more") { + serverColumn.state = "less" + } else { + serverColumn.state = "less" + } } - ] - } //servers column - } //repeater + + } + } + states: [ + State { + name: "less" + PropertyChanges { target: moreButton; text: qsTr("more..."); } + PropertyChanges { target: mostButton; text: qsTr("most..."); } + PropertyChanges { target: serverStats; text: OctreeStats.servers[0]; } + }, + State { + name: "more" + PropertyChanges { target: moreButton; text: qsTr("most..."); } + PropertyChanges { target: mostButton; text: qsTr("less..."); } + PropertyChanges { target: serverStats; text: OctreeStats.servers[0] + + OctreeStats.servers[1]; } + }, + State { + name: "most" + PropertyChanges { target: moreButton; text: qsTr("less..."); } + PropertyChanges { target: mostButton; text: qsTr("least..."); } + PropertyChanges { target: serverStats; text: OctreeStats.servers[0] + + OctreeStats.servers[1] + + OctreeStats.servers[2]; } + } + ] + } //servers column } //column } //flickable } diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index 77ed29d5ae..ec5d800042 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -26,27 +26,17 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* model) : QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint), - _model(model), - _averageUpdatesPerSecond(SAMPLES_PER_SECOND) + _model(model) { - - _statCount = 0; - _octreeServerLabelsCount = 0; - - for (int i = 0; i < MAX_VOXEL_SERVERS; i++) { - _octreeServerLables[i] = 0; - _extraServerDetails[i] = LESS; - } - for (int i = 0; i < MAX_STATS; i++) { - _labels[i] = NULL; + _labels[i] = nullptr; } - this->setWindowTitle("Octree Server Statistics"); + setWindowTitle("Octree Server Statistics"); // Create layouter _form = new QFormLayout(); - this->QDialog::setLayout(_form); + setLayout(_form); // Setup stat items _serverElements = AddStatItem("Elements on Servers"); @@ -63,7 +53,14 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* mo _entityUpdateTime = AddStatItem("Entity Update Time"); _entityUpdates = AddStatItem("Entity Updates"); - + + + _octreeServerLabel = AddStatItem("Entity Server"); + _labels[_octreeServerLabel]->setTextFormat(Qt::RichText); + _labels[_octreeServerLabel]->setTextInteractionFlags(Qt::TextBrowserInteraction); + connect(_labels[_octreeServerLabel], SIGNAL(linkActivated(const QString&)), + this, SLOT(moreless(const QString&))); + layout()->setSizeConstraint(QLayout::SetFixedSize); } @@ -74,23 +71,16 @@ void OctreeStatsDialog::RemoveStatItem(int item) { _form->removeWidget(automaticLabel); automaticLabel->deleteLater(); myLabel->deleteLater(); - _labels[item] = NULL; + _labels[item] = nullptr; } void OctreeStatsDialog::moreless(const QString& link) { - QStringList linkDetails = link.split("-"); - const int COMMAND_ITEM = 0; - const int SERVER_NUMBER_ITEM = 1; - QString serverNumberString = linkDetails[SERVER_NUMBER_ITEM]; - QString command = linkDetails[COMMAND_ITEM]; - int serverNumber = serverNumberString.toInt(); - - if (command == "more") { - _extraServerDetails[serverNumber-1] = MORE; - } else if (command == "most") { - _extraServerDetails[serverNumber-1] = MOST; + if (link == "more") { + _extraServerDetails = MORE; + } else if (link == "most") { + _extraServerDetails = MOST; } else { - _extraServerDetails[serverNumber-1] = LESS; + _extraServerDetails = LESS; } } @@ -376,60 +366,34 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { QDialog::paintEvent(event); } void OctreeStatsDialog::showAllOctreeServers() { - int serverCount = 0; - - showOctreeServersOfType(serverCount, NodeType::EntityServer, "Entity"); - - if (_octreeServerLabelsCount > serverCount) { - for (int i = serverCount; i < _octreeServerLabelsCount; i++) { - int serverLabel = _octreeServerLables[i]; - RemoveStatItem(serverLabel); - _octreeServerLables[i] = 0; - } - _octreeServerLabelsCount = serverCount; - } + showOctreeServersOfType(NodeType::EntityServer); } -void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t serverType, const char* serverTypeName) { - +void OctreeStatsDialog::showOctreeServersOfType(NodeType_t serverType) { QLocale locale(QLocale::English); - auto nodeList = DependencyManager::get(); - nodeList->eachNode([&](const SharedNodePointer& node){ - - // only send to the NodeTypes that are NodeType_t_VOXEL_SERVER - if (node->getType() == serverType) { - serverCount++; - - if (serverCount > _octreeServerLabelsCount) { - QString label = QString("%1 Server %2").arg(serverTypeName).arg(serverCount); - int thisServerRow = _octreeServerLables[serverCount-1] = AddStatItem(label.toUtf8().constData()); - _labels[thisServerRow]->setTextFormat(Qt::RichText); - _labels[thisServerRow]->setTextInteractionFlags(Qt::TextBrowserInteraction); - connect(_labels[thisServerRow], SIGNAL(linkActivated(const QString&)), this, SLOT(moreless(const QString&))); - _octreeServerLabelsCount++; - } - - std::stringstream serverDetails(""); - std::stringstream extraDetails(""); - std::stringstream linkDetails(""); - - if (node->getActiveSocket()) { - serverDetails << "active "; - } else { - serverDetails << "inactive "; - } - - QUuid nodeUUID = node->getUUID(); - - // now lookup stats details for this server... - if (_extraServerDetails[serverCount-1] != LESS) { - NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats(); - sceneStats->withReadLock([&] { - if (sceneStats->find(nodeUUID) != sceneStats->end()) { - OctreeSceneStats& stats = sceneStats->at(nodeUUID); + auto node = DependencyManager::get()->soloNodeOfType(serverType); + if (node) { + std::stringstream serverDetails(""); + std::stringstream extraDetails(""); + std::stringstream linkDetails(""); - switch (_extraServerDetails[serverCount - 1]) { + if (node->getActiveSocket()) { + serverDetails << "active "; + } else { + serverDetails << "inactive "; + } + + QUuid nodeUUID = node->getUUID(); + + // now lookup stats details for this server... + if (_extraServerDetails != LESS) { + NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats(); + sceneStats->withReadLock([&] { + if (sceneStats->find(nodeUUID) != sceneStats->end()) { + OctreeSceneStats& stats = sceneStats->at(nodeUUID); + + switch (_extraServerDetails) { case MOST: { extraDetails << "
"; @@ -507,7 +471,7 @@ void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t ser " Average Ping Time: " << qPrintable(incomingPingTimeString) << " msecs"; serverDetails << "
" << - " Average Clock Skew: " << qPrintable(incomingClockSkewString) << " msecs" << + " Average Clock Skew: " << qPrintable(incomingClockSkewString) << " msecs" << " [" << qPrintable(formattedClockSkewString) << "]"; @@ -516,38 +480,37 @@ void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t ser " Wasted Bytes: " << qPrintable(incomingWastedBytesString); serverDetails << extraDetails.str(); - if (_extraServerDetails[serverCount - 1] == MORE) { - linkDetails << " " << " [most...]"; - linkDetails << " " << " [less...]"; + if (_extraServerDetails == MORE) { + linkDetails << " [most...]"; + linkDetails << " [less...]"; } else { - linkDetails << " " << " [less...]"; - linkDetails << " " << " [least...]"; + linkDetails << " [less...]"; + linkDetails << " [least...]"; } } break; case LESS: { // nothing } break; - } } - }); - } else { - linkDetails << " " << " [more...]"; - linkDetails << " " << " [most...]"; - } - serverDetails << linkDetails.str(); - _labels[_octreeServerLables[serverCount - 1]]->setText(serverDetails.str().c_str()); - } // is VOXEL_SERVER - }); + } + }); + } else { + linkDetails << " [more...]"; + linkDetails << " [most...]"; + } + serverDetails << linkDetails.str(); + _labels[_octreeServerLabel]->setText(serverDetails.str().c_str()); + } } void OctreeStatsDialog::reject() { // Just regularly close upon ESC - this->QDialog::close(); + QDialog::close(); } void OctreeStatsDialog::closeEvent(QCloseEvent* event) { - this->QDialog::closeEvent(event); + QDialog::closeEvent(event); emit closed(); } diff --git a/interface/src/ui/OctreeStatsDialog.h b/interface/src/ui/OctreeStatsDialog.h index 7686b7c726..81bf5f251f 100644 --- a/interface/src/ui/OctreeStatsDialog.h +++ b/interface/src/ui/OctreeStatsDialog.h @@ -19,7 +19,6 @@ #include #define MAX_STATS 100 -#define MAX_VOXEL_SERVERS 50 #define DEFAULT_COLOR 0 class OctreeStatsDialog : public QDialog { @@ -47,18 +46,22 @@ protected: void RemoveStatItem(int item); void showAllOctreeServers(); - void showOctreeServersOfType(int& serverNumber, NodeType_t serverType, - const char* serverTypeName); + void showOctreeServersOfType(NodeType_t serverType); private: + enum details { + LESS, + MORE, + MOST + }; - typedef enum { LESS, MORE, MOST } details; - - QFormLayout* _form; + QFormLayout* _form { nullptr }; QLabel* _labels[MAX_STATS]; - NodeToOctreeSceneStats* _model; - int _statCount; - + NodeToOctreeSceneStats* _model { nullptr }; + int _statCount { 0 }; + + int _octreeServerLabel; + int _sendingMode; int _serverElements; int _localElements; @@ -72,16 +75,14 @@ private: int _processedPacketsTiming; int _outboundEditPackets; - const int SAMPLES_PER_SECOND = 10; - SimpleMovingAverage _averageUpdatesPerSecond; - quint64 _lastWindowAt = usecTimestampNow(); - quint64 _lastKnownTrackedEdits = 0; + const int SAMPLES_PER_SECOND { 10 }; + SimpleMovingAverage _averageUpdatesPerSecond { SAMPLES_PER_SECOND }; + quint64 _lastWindowAt { usecTimestampNow() }; + quint64 _lastKnownTrackedEdits { 0 }; - quint64 _lastRefresh = 0; + quint64 _lastRefresh { 0 }; - int _octreeServerLables[MAX_VOXEL_SERVERS]; - int _octreeServerLabelsCount; - details _extraServerDetails[MAX_VOXEL_SERVERS]; + details _extraServerDetails { LESS }; }; #endif // hifi_OctreeStatsDialog_h diff --git a/interface/src/ui/OctreeStatsProvider.cpp b/interface/src/ui/OctreeStatsProvider.cpp index e35524f5f8..0358685d70 100644 --- a/interface/src/ui/OctreeStatsProvider.cpp +++ b/interface/src/ui/OctreeStatsProvider.cpp @@ -16,9 +16,9 @@ OctreeStatsProvider::OctreeStatsProvider(QObject* parent, NodeToOctreeSceneStats* model) : QObject(parent), - _model(model) - , _statCount(0) - , _averageUpdatesPerSecond(SAMPLES_PER_SECOND) + _model(model), + _statCount(0), + _averageUpdatesPerSecond(SAMPLES_PER_SECOND) { //schedule updates connect(&_updateTimer, &QTimer::timeout, this, &OctreeStatsProvider::updateOctreeStatsData); @@ -57,10 +57,6 @@ OctreeStatsProvider::~OctreeStatsProvider() { _updateTimer.stop(); } -int OctreeStatsProvider::serversNum() const { - return m_serversNum; -} - void OctreeStatsProvider::updateOctreeStatsData() { // Processed Entities Related stats @@ -237,110 +233,97 @@ void OctreeStatsProvider::updateOctreeStatsData() { } void OctreeStatsProvider::updateOctreeServers() { - int serverCount = 0; - - showOctreeServersOfType(serverCount, NodeType::EntityServer, "Entity"); - if (m_serversNum != serverCount) { - m_serversNum = serverCount; - emit serversNumChanged(m_serversNum); - } + showOctreeServersOfType(NodeType::EntityServer); } -void OctreeStatsProvider::showOctreeServersOfType(int& serverCount, NodeType_t serverType, const char* serverTypeName) { - +void OctreeStatsProvider::showOctreeServersOfType(NodeType_t serverType) { m_servers.clear(); - auto nodeList = DependencyManager::get(); - nodeList->eachNode([&](const SharedNodePointer& node) { - - // only send to the NodeTypes that are NodeType_t_VOXEL_SERVER - if (node->getType() == serverType) { - serverCount++; - - QString lesserDetails; - QString moreDetails; - QString mostDetails; - - if (node->getActiveSocket()) { - lesserDetails += "active "; - } else { - lesserDetails += "inactive "; - } - - QUuid nodeUUID = node->getUUID(); + auto node = DependencyManager::get()->soloNodeOfType(serverType); + if (node) { + QString lesserDetails; + QString moreDetails; + QString mostDetails; - // now lookup stats details for this server... - NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats(); - sceneStats->withReadLock([&] { - if (sceneStats->find(nodeUUID) != sceneStats->end()) { - OctreeSceneStats& stats = sceneStats->at(nodeUUID); + if (node->getActiveSocket()) { + lesserDetails += "active "; + } else { + lesserDetails += "inactive "; + } - float lastFullEncode = stats.getLastFullTotalEncodeTime() / USECS_PER_MSEC; - float lastFullSend = stats.getLastFullElapsedTime() / USECS_PER_MSEC; - float lastFullSendInSeconds = stats.getLastFullElapsedTime() / USECS_PER_SECOND; - float lastFullPackets = stats.getLastFullTotalPackets(); - float lastFullPPS = lastFullPackets; - if (lastFullSendInSeconds > 0) { - lastFullPPS = lastFullPackets / lastFullSendInSeconds; - } + QUuid nodeUUID = node->getUUID(); - mostDetails += QString("

Last Full Scene... Encode: %1 ms Send: %2 ms Packets: %3 Bytes: %4 Rate: %5 PPS") - .arg(lastFullEncode) - .arg(lastFullSend) - .arg(lastFullPackets) - .arg(stats.getLastFullTotalBytes()) - .arg(lastFullPPS); + // now lookup stats details for this server... + NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats(); + sceneStats->withReadLock([&] { + if (sceneStats->find(nodeUUID) != sceneStats->end()) { + OctreeSceneStats& stats = sceneStats->at(nodeUUID); - for (int i = 0; i < OctreeSceneStats::ITEM_COUNT; i++) { - OctreeSceneStats::Item item = (OctreeSceneStats::Item)(i); - OctreeSceneStats::ItemInfo& itemInfo = stats.getItemInfo(item); - mostDetails += QString("
%1 %2") - .arg(itemInfo.caption).arg(stats.getItemValue(item)); - } - - moreDetails += "
Node UUID: " +nodeUUID.toString() + " "; - - moreDetails += QString("
Elements: %1 total %2 internal %3 leaves ") - .arg(stats.getTotalElements()) - .arg(stats.getTotalInternal()) - .arg(stats.getTotalLeaves()); - - const SequenceNumberStats& seqStats = stats.getIncomingOctreeSequenceNumberStats(); - qint64 clockSkewInUsecs = node->getClockSkewUsec(); - qint64 clockSkewInMS = clockSkewInUsecs / (qint64)USECS_PER_MSEC; - - moreDetails += QString("
Incoming Packets: %1/ Lost: %2/ Recovered: %3") - .arg(stats.getIncomingPackets()) - .arg(seqStats.getLost()) - .arg(seqStats.getRecovered()); - - moreDetails += QString("
Out of Order: %1/ Early: %2/ Late: %3/ Unreasonable: %4") - .arg(seqStats.getOutOfOrder()) - .arg(seqStats.getEarly()) - .arg(seqStats.getLate()) - .arg(seqStats.getUnreasonable()); - - moreDetails += QString("
Average Flight Time: %1 msecs") - .arg(stats.getIncomingFlightTimeAverage()); - - moreDetails += QString("
Average Ping Time: %1 msecs") - .arg(node->getPingMs()); - - moreDetails += QString("
Average Clock Skew: %1 msecs [%2]") - .arg(clockSkewInMS) - .arg(formatUsecTime(clockSkewInUsecs)); - - - moreDetails += QString("
Incoming Bytes: %1 Wasted Bytes: %2") - .arg(stats.getIncomingBytes()) - .arg(stats.getIncomingWastedBytes()); + float lastFullEncode = stats.getLastFullTotalEncodeTime() / USECS_PER_MSEC; + float lastFullSend = stats.getLastFullElapsedTime() / USECS_PER_MSEC; + float lastFullSendInSeconds = stats.getLastFullElapsedTime() / USECS_PER_SECOND; + float lastFullPackets = stats.getLastFullTotalPackets(); + float lastFullPPS = lastFullPackets; + if (lastFullSendInSeconds > 0) { + lastFullPPS = lastFullPackets / lastFullSendInSeconds; } - }); - m_servers.append(lesserDetails); - m_servers.append(moreDetails); - m_servers.append(mostDetails); - } // is VOXEL_SERVER - }); + + mostDetails += QString("

Last Full Scene... Encode: %1 ms Send: %2 ms Packets: %3 Bytes: %4 Rate: %5 PPS") + .arg(lastFullEncode) + .arg(lastFullSend) + .arg(lastFullPackets) + .arg(stats.getLastFullTotalBytes()) + .arg(lastFullPPS); + + for (int i = 0; i < OctreeSceneStats::ITEM_COUNT; i++) { + OctreeSceneStats::Item item = (OctreeSceneStats::Item)(i); + OctreeSceneStats::ItemInfo& itemInfo = stats.getItemInfo(item); + mostDetails += QString("
%1 %2") + .arg(itemInfo.caption).arg(stats.getItemValue(item)); + } + + moreDetails += "
Node UUID: " +nodeUUID.toString() + " "; + + moreDetails += QString("
Elements: %1 total %2 internal %3 leaves ") + .arg(stats.getTotalElements()) + .arg(stats.getTotalInternal()) + .arg(stats.getTotalLeaves()); + + const SequenceNumberStats& seqStats = stats.getIncomingOctreeSequenceNumberStats(); + qint64 clockSkewInUsecs = node->getClockSkewUsec(); + qint64 clockSkewInMS = clockSkewInUsecs / (qint64)USECS_PER_MSEC; + + moreDetails += QString("
Incoming Packets: %1/ Lost: %2/ Recovered: %3") + .arg(stats.getIncomingPackets()) + .arg(seqStats.getLost()) + .arg(seqStats.getRecovered()); + + moreDetails += QString("
Out of Order: %1/ Early: %2/ Late: %3/ Unreasonable: %4") + .arg(seqStats.getOutOfOrder()) + .arg(seqStats.getEarly()) + .arg(seqStats.getLate()) + .arg(seqStats.getUnreasonable()); + + moreDetails += QString("
Average Flight Time: %1 msecs") + .arg(stats.getIncomingFlightTimeAverage()); + + moreDetails += QString("
Average Ping Time: %1 msecs") + .arg(node->getPingMs()); + + moreDetails += QString("
Average Clock Skew: %1 msecs [%2]") + .arg(clockSkewInMS) + .arg(formatUsecTime(clockSkewInUsecs)); + + + moreDetails += QString("
Incoming Bytes: %1 Wasted Bytes: %2") + .arg(stats.getIncomingBytes()) + .arg(stats.getIncomingWastedBytes()); + } + }); + m_servers.append(lesserDetails); + m_servers.append(moreDetails); + m_servers.append(mostDetails); + } emit serversChanged(m_servers); } diff --git a/interface/src/ui/OctreeStatsProvider.h b/interface/src/ui/OctreeStatsProvider.h index 04aff24edd..c73f0960f6 100644 --- a/interface/src/ui/OctreeStatsProvider.h +++ b/interface/src/ui/OctreeStatsProvider.h @@ -18,15 +18,10 @@ #include "DependencyManager.h" -#define MAX_STATS 100 -#define MAX_VOXEL_SERVERS 50 -#define DEFAULT_COLOR 0 - class OctreeStatsProvider : public QObject, public Dependency { Q_OBJECT SINGLETON_DEPENDENCY - Q_PROPERTY(int serversNum READ serversNum NOTIFY serversNumChanged) Q_PROPERTY(QString serverElements READ serverElements NOTIFY serverElementsChanged) Q_PROPERTY(QString localElements READ localElements NOTIFY localElementsChanged) Q_PROPERTY(QString localElementsMemory READ localElementsMemory NOTIFY localElementsMemoryChanged) @@ -45,8 +40,6 @@ public: OctreeStatsProvider(QObject* parent, NodeToOctreeSceneStats* model); ~OctreeStatsProvider(); - int serversNum() const; - QString serverElements() const { return m_serverElements; } @@ -96,8 +89,6 @@ public: } signals: - - void serversNumChanged(int serversNum); void serverElementsChanged(const QString &serverElements); void localElementsChanged(const QString &localElements); void sendingModeChanged(const QString &sendingMode); @@ -121,7 +112,7 @@ private slots: void updateOctreeStatsData(); protected: void updateOctreeServers(); - void showOctreeServersOfType(int& serverNumber, NodeType_t serverType, const char* serverTypeName); + void showOctreeServersOfType(NodeType_t serverType); private: NodeToOctreeSceneStats* _model; @@ -135,7 +126,7 @@ private: quint64 _lastRefresh = 0; QTimer _updateTimer; - int m_serversNum {0}; + QString m_serverElements; QString m_localElements; QString m_localElementsMemory; From aec5ab59213457e4558910fce32ec07b50344cb0 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 7 Dec 2017 11:49:05 -0800 Subject: [PATCH 3/3] CR --- .../hifi/dialogs/TabletEntityStatistics.qml | 144 +++++++++--------- interface/src/ui/OctreeStatsProvider.cpp | 12 ++ interface/src/ui/OctreeStatsProvider.h | 7 +- libraries/networking/src/LimitedNodeList.cpp | 5 +- 4 files changed, 96 insertions(+), 72 deletions(-) diff --git a/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml b/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml index cf3e39a885..da295917a0 100644 --- a/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml +++ b/interface/resources/qml/hifi/dialogs/TabletEntityStatistics.qml @@ -154,86 +154,90 @@ Rectangle { color: OctreeStats.getColor() } - Column { - id: serverColumn - width: scrollView.width - 10 - x: 5 - spacing: 5 + Repeater { + model: OctreeStats.serversNum - state: "less" + delegate: Column { + id: serverColumn + width: scrollView.width - 10 + x: 5 + spacing: 5 - TabletEntityStatisticsItem { - id: serverStats - width: parent.width - titleText: qsTr("Entity Server") + ":" - colorScheme: root.colorScheme - color: OctreeStats.getColor() - } + state: "less" - Row { - id: buttonsRow - width: parent.width - height: 30 - spacing: 10 - - HifiControls.Button { - id: moreButton - color: hifi.buttons.blue + TabletEntityStatisticsItem { + id: serverStats + width: parent.width + titleText: qsTr("Entity Server ") + (index+1) + ":" colorScheme: root.colorScheme - width: parent.width / 2 - 10 + color: OctreeStats.getColor() + } + + Row { + id: buttonsRow + width: parent.width height: 30 - onClicked: { - if (serverColumn.state === "less") { - serverColumn.state = "more" - } else if (serverColumn.state === "more") { - serverColumn.state = "most" - } else { - serverColumn.state = "more" + spacing: 10 + + HifiControls.Button { + id: moreButton + color: hifi.buttons.blue + colorScheme: root.colorScheme + width: parent.width / 2 - 10 + height: 30 + onClicked: { + if (serverColumn.state === "less") { + serverColumn.state = "more" + } else if (serverColumn.state === "more") { + serverColumn.state = "most" + } else { + serverColumn.state = "more" + } } } - } - HifiControls.Button { - id: mostButton - color: hifi.buttons.blue - colorScheme: root.colorScheme - height: 30 - width: parent.width / 2 - 10 - onClicked: { - if (serverColumn.state === "less") { - serverColumn.state = "most" - } else if (serverColumn.state === "more") { - serverColumn.state = "less" - } else { - serverColumn.state = "less" + HifiControls.Button { + id: mostButton + color: hifi.buttons.blue + colorScheme: root.colorScheme + height: 30 + width: parent.width / 2 - 10 + onClicked: { + if (serverColumn.state === "less") { + serverColumn.state = "most" + } else if (serverColumn.state === "more") { + serverColumn.state = "less" + } else { + serverColumn.state = "less" + } } - } + } } - } - states: [ - State { - name: "less" - PropertyChanges { target: moreButton; text: qsTr("more..."); } - PropertyChanges { target: mostButton; text: qsTr("most..."); } - PropertyChanges { target: serverStats; text: OctreeStats.servers[0]; } - }, - State { - name: "more" - PropertyChanges { target: moreButton; text: qsTr("most..."); } - PropertyChanges { target: mostButton; text: qsTr("less..."); } - PropertyChanges { target: serverStats; text: OctreeStats.servers[0] + - OctreeStats.servers[1]; } - }, - State { - name: "most" - PropertyChanges { target: moreButton; text: qsTr("less..."); } - PropertyChanges { target: mostButton; text: qsTr("least..."); } - PropertyChanges { target: serverStats; text: OctreeStats.servers[0] + - OctreeStats.servers[1] + - OctreeStats.servers[2]; } - } - ] - } //servers column + states: [ + State { + name: "less" + PropertyChanges { target: moreButton; text: qsTr("more..."); } + PropertyChanges { target: mostButton; text: qsTr("most..."); } + PropertyChanges { target: serverStats; text: OctreeStats.servers[index*3]; } + }, + State { + name: "more" + PropertyChanges { target: moreButton; text: qsTr("most..."); } + PropertyChanges { target: mostButton; text: qsTr("less..."); } + PropertyChanges { target: serverStats; text: OctreeStats.servers[index*3] + + OctreeStats.servers[index*3 + 1]; } + }, + State { + name: "most" + PropertyChanges { target: moreButton; text: qsTr("less..."); } + PropertyChanges { target: mostButton; text: qsTr("least..."); } + PropertyChanges { target: serverStats; text: OctreeStats.servers[index*3] + + OctreeStats.servers[index*3 + 1] + + OctreeStats.servers[index*3 + 2]; } + } + ] + } //servers column + } //repeater } //column } //flickable } diff --git a/interface/src/ui/OctreeStatsProvider.cpp b/interface/src/ui/OctreeStatsProvider.cpp index 0358685d70..a393660c17 100644 --- a/interface/src/ui/OctreeStatsProvider.cpp +++ b/interface/src/ui/OctreeStatsProvider.cpp @@ -57,6 +57,10 @@ OctreeStatsProvider::~OctreeStatsProvider() { _updateTimer.stop(); } +int OctreeStatsProvider::serversNum() const { + return m_serversNum; +} + void OctreeStatsProvider::updateOctreeStatsData() { // Processed Entities Related stats @@ -238,9 +242,12 @@ void OctreeStatsProvider::updateOctreeServers() { void OctreeStatsProvider::showOctreeServersOfType(NodeType_t serverType) { m_servers.clear(); + int serverCount = 0; auto node = DependencyManager::get()->soloNodeOfType(serverType); if (node) { + ++serverCount; + QString lesserDetails; QString moreDetails; QString mostDetails; @@ -324,6 +331,11 @@ void OctreeStatsProvider::showOctreeServersOfType(NodeType_t serverType) { m_servers.append(moreDetails); m_servers.append(mostDetails); } + + if (serverCount != m_serversNum) { + m_serversNum = serverCount; + emit serversNumChanged(m_serversNum); + } emit serversChanged(m_servers); } diff --git a/interface/src/ui/OctreeStatsProvider.h b/interface/src/ui/OctreeStatsProvider.h index c73f0960f6..5b3d4d735c 100644 --- a/interface/src/ui/OctreeStatsProvider.h +++ b/interface/src/ui/OctreeStatsProvider.h @@ -22,6 +22,7 @@ class OctreeStatsProvider : public QObject, public Dependency { Q_OBJECT SINGLETON_DEPENDENCY + Q_PROPERTY(int serversNum READ serversNum NOTIFY serversNumChanged) Q_PROPERTY(QString serverElements READ serverElements NOTIFY serverElementsChanged) Q_PROPERTY(QString localElements READ localElements NOTIFY localElementsChanged) Q_PROPERTY(QString localElementsMemory READ localElementsMemory NOTIFY localElementsMemoryChanged) @@ -40,6 +41,8 @@ public: OctreeStatsProvider(QObject* parent, NodeToOctreeSceneStats* model); ~OctreeStatsProvider(); + int serversNum() const; + QString serverElements() const { return m_serverElements; } @@ -89,6 +92,8 @@ public: } signals: + + void serversNumChanged(int serversNum); void serverElementsChanged(const QString &serverElements); void localElementsChanged(const QString &localElements); void sendingModeChanged(const QString &sendingMode); @@ -126,7 +131,7 @@ private: quint64 _lastRefresh = 0; QTimer _updateTimer; - + int m_serversNum { 0 }; QString m_serverElements; QString m_localElements; QString m_localElementsMemory; diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 94bc4eeff6..1b80c3b3af 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -42,7 +42,10 @@ static Setting::Handle LIMITED_NODELIST_LOCAL_PORT("LimitedNodeList.Loc const std::set SOLO_NODE_TYPES = { NodeType::AvatarMixer, NodeType::AudioMixer, - NodeType::AssetServer + NodeType::AssetServer, + NodeType::EntityServer, + NodeType::MessagesMixer, + NodeType::EntityScriptServer }; LimitedNodeList::LimitedNodeList(int socketListenPort, int dtlsListenPort) :