diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 19da129488..c8897fe2b1 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -326,6 +326,12 @@ void AudioMixer::run() { if (matchingNode) { nodeList->updateNodeWithData(matchingNode, nodeAddress, packetData, receivedBytes); + + if (!matchingNode->getActiveSocket()) { + // we don't have an active socket for this node, but they're talking to us + // this means they've heard from us and can reply, let's assume public is active + matchingNode->activatePublicSocket(); + } } } else { // let processNodeData handle it. diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 45e7245fc7..d1d48a15e2 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2370,6 +2370,8 @@ void Application::queryVoxels() { return; } + bool wantExtraDebugging = Menu::getInstance()->isOptionChecked(MenuOption::ExtraDebugging); + // These will be the same for all servers, so we can set them up once and then reuse for each server we send to. _voxelQuery.setWantLowResMoving(Menu::getInstance()->isOptionChecked(MenuOption::LowRes)); _voxelQuery.setWantColor(Menu::getInstance()->isOptionChecked(MenuOption::SendVoxelColors)); @@ -2428,7 +2430,7 @@ void Application::queryVoxels() { } } - if (unknownJurisdictionServers > 0) { + if (wantExtraDebugging && unknownJurisdictionServers > 0) { qDebug("Servers: total %d, in view %d, unknown jurisdiction %d \n", totalServers, inViewServers, unknownJurisdictionServers); } @@ -2448,7 +2450,7 @@ void Application::queryVoxels() { } } - if (unknownJurisdictionServers > 0) { + if (wantExtraDebugging && unknownJurisdictionServers > 0) { qDebug("perServerPPS: %d perUnknownServer: %d\n", perServerPPS, perUnknownServer); } @@ -2468,7 +2470,9 @@ void Application::queryVoxels() { // can get the jurisdiction... if (_voxelServerJurisdictions.find(nodeUUID) == _voxelServerJurisdictions.end()) { unknownView = true; // assume it's in view - qDebug() << "no known jurisdiction for node " << *node << ", assume it's visible.\n"; + if (wantExtraDebugging) { + qDebug() << "no known jurisdiction for node " << *node << ", assume it's visible.\n"; + } } else { const JurisdictionMap& map = (_voxelServerJurisdictions)[nodeUUID]; @@ -2486,21 +2490,38 @@ void Application::queryVoxels() { } else { inView = false; } + } else { + if (wantExtraDebugging) { + qDebug() << "Jurisdiction without RootCode for node " << *node << ". That's unusual!\n"; + } } } if (inView) { _voxelQuery.setMaxVoxelPacketsPerSecond(perServerPPS); } else if (unknownView) { - qDebug() << "no known jurisdiction for node " << *node << ", give it budget of " - << perUnknownServer << " to send us jurisdiction.\n"; + if (wantExtraDebugging) { + qDebug() << "no known jurisdiction for node " << *node << ", give it budget of " + << perUnknownServer << " to send us jurisdiction.\n"; + } // set the query's position/orientation to be degenerate in a manner that will get the scene quickly - _voxelQuery.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); - _voxelQuery.setCameraOrientation(OFF_IN_NEGATIVE_SPACE); - _voxelQuery.setCameraNearClip(0.1); - _voxelQuery.setCameraFarClip(0.1); + // 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) { + _voxelQuery.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); + _voxelQuery.setCameraOrientation(OFF_IN_NEGATIVE_SPACE); + _voxelQuery.setCameraNearClip(0.1); + _voxelQuery.setCameraFarClip(0.1); + if (wantExtraDebugging) { + qDebug() << "Using 'minimal' camera position for node " << *node << "\n"; + } + } else { + if (wantExtraDebugging) { + qDebug() << "Using regular camera position for node " << *node << "\n"; + } + } _voxelQuery.setMaxVoxelPacketsPerSecond(perUnknownServer); } else { _voxelQuery.setMaxVoxelPacketsPerSecond(0); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 11d1513404..a1f83007fd 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -475,6 +475,9 @@ Menu::Menu() : addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::DeltaSending); addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::OcclusionCulling); addCheckableActionToQMenuAndActionHash(voxelProtoOptionsMenu, MenuOption::DestructiveAddVoxel); + + addCheckableActionToQMenuAndActionHash(developerMenu, MenuOption::ExtraDebugging); + #ifndef Q_OS_MAC QMenu* helpMenu = addMenu("Help"); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 1bb25d8f21..cf6a35ff2b 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -163,6 +163,7 @@ namespace MenuOption { const QString DontCallOpenGLForVoxels = "Don't call glDrawRangeElementsEXT() for Voxels"; const QString EchoAudio = "Echo Audio"; const QString ExportVoxels = "Export Voxels"; + const QString ExtraDebugging = "Extra Debugging"; const QString HeadMouse = "Head Mouse"; const QString FaceMode = "Cycle Face Mode"; const QString FaceshiftTCP = "Faceshift (TCP)"; diff --git a/libraries/shared/src/Logging.cpp b/libraries/shared/src/Logging.cpp index bfdc3523f1..0182034be6 100644 --- a/libraries/shared/src/Logging.cpp +++ b/libraries/shared/src/Logging.cpp @@ -80,6 +80,8 @@ const char* stringForLogType(QtMsgType msgType) { return "FATAL"; case QtWarningMsg: return "WARNING"; + default: + return "UNKNOWN"; } } diff --git a/libraries/voxel-server-library/src/VoxelServer.cpp b/libraries/voxel-server-library/src/VoxelServer.cpp index cf0eeb4de9..b6b7ae92ae 100644 --- a/libraries/voxel-server-library/src/VoxelServer.cpp +++ b/libraries/voxel-server-library/src/VoxelServer.cpp @@ -460,6 +460,12 @@ void VoxelServer::run() { if (node) { nodeList->updateNodeWithData(node, &senderAddress, packetData, packetLength); + if (!node->getActiveSocket()) { + // we don't have an active socket for this node, but they're talking to us + // this means they've heard from us and can reply, let's assume public is active + node->activatePublicSocket(); + } + VoxelNodeData* nodeData = (VoxelNodeData*) node->getLinkedData(); if (nodeData && !nodeData->isVoxelSendThreadInitalized()) { nodeData->initializeVoxelSendThread(this);