try to fix nodelist not getting destroyed

This commit is contained in:
SamGondelman 2018-08-01 17:52:27 -07:00
parent 8a9c27ed92
commit 1ba28de5b6
13 changed files with 98 additions and 89 deletions

View file

@ -517,7 +517,7 @@ void Agent::setIsListeningToAudioStream(bool isListeningToAudioStream) {
auto nodeList = DependencyManager::get<NodeList>(); auto nodeList = DependencyManager::get<NodeList>();
nodeList->eachMatchingNode( nodeList->eachMatchingNode(
[&](const SharedNodePointer& node)->bool { [](const SharedNodePointer& node)->bool {
return (node->getType() == NodeType::AudioMixer) && node->getActiveSocket(); return (node->getType() == NodeType::AudioMixer) && node->getActiveSocket();
}, },
[&](const SharedNodePointer& node) { [&](const SharedNodePointer& node) {

View file

@ -264,7 +264,7 @@ void DomainGatekeeper::updateNodePermissions() {
QList<SharedNodePointer> nodesToKill; QList<SharedNodePointer> nodesToKill;
auto limitedNodeList = DependencyManager::get<LimitedNodeList>(); auto limitedNodeList = DependencyManager::get<LimitedNodeList>();
limitedNodeList->eachNode([this, limitedNodeList, &nodesToKill](const SharedNodePointer& node){ limitedNodeList->eachNode([this, &limitedNodeList, &nodesToKill](const SharedNodePointer& node){
// the id and the username in NodePermissions will often be the same, but id is set before // the id and the username in NodePermissions will often be the same, but id is set before
// authentication and verifiedUsername is only set once they user's key has been confirmed. // authentication and verifiedUsername is only set once they user's key has been confirmed.
QString verifiedUsername = node->getPermissions().getVerifiedUserName(); QString verifiedUsername = node->getPermissions().getVerifiedUserName();
@ -458,7 +458,7 @@ SharedNodePointer DomainGatekeeper::processAgentConnectRequest(const NodeConnect
// in case this is a node that's failing to connect // in case this is a node that's failing to connect
// double check we don't have the same node whose sockets match exactly already in the list // double check we don't have the same node whose sockets match exactly already in the list
limitedNodeList->eachNodeBreakable([&](const SharedNodePointer& node){ limitedNodeList->eachNodeBreakable([nodeConnection, username, &existingNodeID](const SharedNodePointer& node){
if (node->getPublicSocket() == nodeConnection.publicSockAddr && node->getLocalSocket() == nodeConnection.localSockAddr) { if (node->getPublicSocket() == nodeConnection.publicSockAddr && node->getLocalSocket() == nodeConnection.localSockAddr) {
// we have a node that already has these exact sockets - this can occur if a node // we have a node that already has these exact sockets - this can occur if a node
@ -1009,7 +1009,7 @@ void DomainGatekeeper::refreshGroupsCache() {
getDomainOwnerFriendsList(); getDomainOwnerFriendsList();
auto nodeList = DependencyManager::get<LimitedNodeList>(); auto nodeList = DependencyManager::get<LimitedNodeList>();
nodeList->eachNode([&](const SharedNodePointer& node) { nodeList->eachNode([this](const SharedNodePointer& node) {
if (!node->getPermissions().isAssignment) { if (!node->getPermissions().isAssignment) {
// this node is an agent // this node is an agent
const QString& verifiedUserName = node->getPermissions().getVerifiedUserName(); const QString& verifiedUserName = node->getPermissions().getVerifiedUserName();

View file

@ -1046,7 +1046,7 @@ bool DomainServer::isInInterestSet(const SharedNodePointer& nodeA, const SharedN
unsigned int DomainServer::countConnectedUsers() { unsigned int DomainServer::countConnectedUsers() {
unsigned int result = 0; unsigned int result = 0;
auto nodeList = DependencyManager::get<LimitedNodeList>(); auto nodeList = DependencyManager::get<LimitedNodeList>();
nodeList->eachNode([&](const SharedNodePointer& node){ nodeList->eachNode([&result](const SharedNodePointer& node){
// only count unassigned agents (i.e., users) // only count unassigned agents (i.e., users)
if (node->getType() == NodeType::Agent) { if (node->getType() == NodeType::Agent) {
auto nodeData = static_cast<DomainServerNodeData*>(node->getLinkedData()); auto nodeData = static_cast<DomainServerNodeData*>(node->getLinkedData());
@ -1149,7 +1149,7 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, const Hif
// DTLSServerSession* dtlsSession = _isUsingDTLS ? _dtlsSessions[senderSockAddr] : NULL; // DTLSServerSession* dtlsSession = _isUsingDTLS ? _dtlsSessions[senderSockAddr] : NULL;
if (nodeData->isAuthenticated()) { if (nodeData->isAuthenticated()) {
// if this authenticated node has any interest types, send back those nodes as well // if this authenticated node has any interest types, send back those nodes as well
limitedNodeList->eachNode([&](const SharedNodePointer& otherNode) { limitedNodeList->eachNode([this, node, &domainListPackets, &domainListStream](const SharedNodePointer& otherNode) {
if (otherNode->getUUID() != node->getUUID() && isInInterestSet(node, otherNode)) { if (otherNode->getUUID() != node->getUUID() && isInInterestSet(node, otherNode)) {
// since we're about to add a node to the packet we start a segment // since we're about to add a node to the packet we start a segment
domainListPackets->startSegment(); domainListPackets->startSegment();
@ -1209,7 +1209,7 @@ void DomainServer::broadcastNewNode(const SharedNodePointer& addedNode) {
int connectionSecretIndex = addNodePacket->pos(); int connectionSecretIndex = addNodePacket->pos();
limitedNodeList->eachMatchingNode( limitedNodeList->eachMatchingNode(
[&](const SharedNodePointer& node)->bool { [this, addedNode](const SharedNodePointer& node)->bool {
if (node->getLinkedData() && node->getActiveSocket() && node != addedNode) { if (node->getLinkedData() && node->getActiveSocket() && node != addedNode) {
// is the added Node in this node's interest list? // is the added Node in this node's interest list?
return isInInterestSet(node, addedNode); return isInInterestSet(node, addedNode);
@ -1217,7 +1217,7 @@ void DomainServer::broadcastNewNode(const SharedNodePointer& addedNode) {
return false; return false;
} }
}, },
[&](const SharedNodePointer& node) { [this, &addNodePacket, connectionSecretIndex, addedNode, &limitedNodeList](const SharedNodePointer& node) {
addNodePacket->seek(connectionSecretIndex); addNodePacket->seek(connectionSecretIndex);
QByteArray rfcConnectionSecret = connectionSecretForNodes(node, addedNode).toRfc4122(); QByteArray rfcConnectionSecret = connectionSecretForNodes(node, addedNode).toRfc4122();
@ -2832,7 +2832,7 @@ void DomainServer::updateReplicationNodes(ReplicationServerDirection direction)
auto serversSettings = replicationSettings.value(serversKey).toList(); auto serversSettings = replicationSettings.value(serversKey).toList();
std::vector<HifiSockAddr> knownReplicationNodes; std::vector<HifiSockAddr> knownReplicationNodes;
nodeList->eachNode([&](const SharedNodePointer& otherNode) { nodeList->eachNode([direction, &knownReplicationNodes](const SharedNodePointer& otherNode) {
if ((direction == Upstream && NodeType::isUpstream(otherNode->getType())) if ((direction == Upstream && NodeType::isUpstream(otherNode->getType()))
|| (direction == Downstream && NodeType::isDownstream(otherNode->getType()))) { || (direction == Downstream && NodeType::isDownstream(otherNode->getType()))) {
knownReplicationNodes.push_back(otherNode->getPublicSocket()); knownReplicationNodes.push_back(otherNode->getPublicSocket());
@ -2870,7 +2870,7 @@ void DomainServer::updateReplicationNodes(ReplicationServerDirection direction)
// collect them in a vector to separately remove them with handleKillNode (since eachNode has a read lock and // collect them in a vector to separately remove them with handleKillNode (since eachNode has a read lock and
// we cannot recursively take the write lock required by handleKillNode) // we cannot recursively take the write lock required by handleKillNode)
std::vector<SharedNodePointer> nodesToKill; std::vector<SharedNodePointer> nodesToKill;
nodeList->eachNode([&](const SharedNodePointer& otherNode) { nodeList->eachNode([this, direction, replicationNodesInSettings, replicationDirection, &nodesToKill](const SharedNodePointer& otherNode) {
if ((direction == Upstream && NodeType::isUpstream(otherNode->getType())) if ((direction == Upstream && NodeType::isUpstream(otherNode->getType()))
|| (direction == Downstream && NodeType::isDownstream(otherNode->getType()))) { || (direction == Downstream && NodeType::isDownstream(otherNode->getType()))) {
bool nodeInSettings = find(replicationNodesInSettings.cbegin(), replicationNodesInSettings.cend(), bool nodeInSettings = find(replicationNodesInSettings.cbegin(), replicationNodesInSettings.cend(),

View file

@ -1138,7 +1138,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
// setup a timer for domain-server check ins // setup a timer for domain-server check ins
QTimer* domainCheckInTimer = new QTimer(this); QTimer* domainCheckInTimer = new QTimer(this);
connect(domainCheckInTimer, &QTimer::timeout, [this, nodeList] { connect(domainCheckInTimer, &QTimer::timeout, [this, &nodeList] {
if (!isServerlessMode()) { if (!isServerlessMode()) {
nodeList->sendDomainServerCheckIn(); nodeList->sendDomainServerCheckIn();
} }
@ -1164,7 +1164,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
return myAvatar ? myAvatar->getOrientationForAudio() : Quaternions::IDENTITY; return myAvatar ? myAvatar->getOrientationForAudio() : Quaternions::IDENTITY;
}); });
recording::Frame::registerFrameHandler(AudioConstants::getAudioFrameName(), [=](recording::Frame::ConstPointer frame) { recording::Frame::registerFrameHandler(AudioConstants::getAudioFrameName(), [&audioIO](recording::Frame::ConstPointer frame) {
audioIO->handleRecordedAudioInput(frame->data); audioIO->handleRecordedAudioInput(frame->data);
}); });
@ -1835,13 +1835,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
} }
}); });
connect(entityScriptingInterface.data(), &EntityScriptingInterface::deletingEntity, [=](const EntityItemID& entityItemID) { connect(entityScriptingInterface.data(), &EntityScriptingInterface::deletingEntity, [this](const EntityItemID& entityItemID) {
if (entityItemID == _keyboardFocusedEntity.get()) { if (entityItemID == _keyboardFocusedEntity.get()) {
setKeyboardFocusEntity(UNKNOWN_ENTITY_ID); setKeyboardFocusEntity(UNKNOWN_ENTITY_ID);
} }
}); });
connect(getEntities()->getTree().get(), &EntityTree::deletingEntity, [=](const EntityItemID& entityItemID) { connect(getEntities()->getTree().get(), &EntityTree::deletingEntity, [](const EntityItemID& entityItemID) {
auto avatarManager = DependencyManager::get<AvatarManager>(); auto avatarManager = DependencyManager::get<AvatarManager>();
auto myAvatar = avatarManager ? avatarManager->getMyAvatar() : nullptr; auto myAvatar = avatarManager ? avatarManager->getMyAvatar() : nullptr;
if (myAvatar) { if (myAvatar) {
@ -1849,7 +1849,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
} }
}); });
EntityTree::setAddMaterialToEntityOperator([&](const QUuid& entityID, graphics::MaterialLayer material, const std::string& parentMaterialName) { EntityTree::setAddMaterialToEntityOperator([this](const QUuid& entityID, graphics::MaterialLayer material, const std::string& parentMaterialName) {
// try to find the renderable // try to find the renderable
auto renderable = getEntities()->renderableForEntityId(entityID); auto renderable = getEntities()->renderableForEntityId(entityID);
if (renderable) { if (renderable) {
@ -1864,7 +1864,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
} }
return false; return false;
}); });
EntityTree::setRemoveMaterialFromEntityOperator([&](const QUuid& entityID, graphics::MaterialPointer material, const std::string& parentMaterialName) { EntityTree::setRemoveMaterialFromEntityOperator([this](const QUuid& entityID, graphics::MaterialPointer material, const std::string& parentMaterialName) {
// try to find the renderable // try to find the renderable
auto renderable = getEntities()->renderableForEntityId(entityID); auto renderable = getEntities()->renderableForEntityId(entityID);
if (renderable) { if (renderable) {
@ -1899,7 +1899,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
return false; return false;
}); });
EntityTree::setAddMaterialToOverlayOperator([&](const QUuid& overlayID, graphics::MaterialLayer material, const std::string& parentMaterialName) { EntityTree::setAddMaterialToOverlayOperator([this](const QUuid& overlayID, graphics::MaterialLayer material, const std::string& parentMaterialName) {
auto overlay = _overlays.getOverlay(overlayID); auto overlay = _overlays.getOverlay(overlayID);
if (overlay) { if (overlay) {
overlay->addMaterial(material, parentMaterialName); overlay->addMaterial(material, parentMaterialName);
@ -1907,7 +1907,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
} }
return false; return false;
}); });
EntityTree::setRemoveMaterialFromOverlayOperator([&](const QUuid& overlayID, graphics::MaterialPointer material, const std::string& parentMaterialName) { EntityTree::setRemoveMaterialFromOverlayOperator([this](const QUuid& overlayID, graphics::MaterialPointer material, const std::string& parentMaterialName) {
auto overlay = _overlays.getOverlay(overlayID); auto overlay = _overlays.getOverlay(overlayID);
if (overlay) { if (overlay) {
overlay->removeMaterial(material, parentMaterialName); overlay->removeMaterial(material, parentMaterialName);
@ -1918,13 +1918,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
// Keyboard focus handling for Web overlays. // Keyboard focus handling for Web overlays.
auto overlays = &(qApp->getOverlays()); auto overlays = &(qApp->getOverlays());
connect(overlays, &Overlays::overlayDeleted, [=](const OverlayID& overlayID) { connect(overlays, &Overlays::overlayDeleted, [this](const OverlayID& overlayID) {
if (overlayID == _keyboardFocusedOverlay.get()) { if (overlayID == _keyboardFocusedOverlay.get()) {
setKeyboardFocusOverlay(UNKNOWN_OVERLAY_ID); setKeyboardFocusOverlay(UNKNOWN_OVERLAY_ID);
} }
}); });
connect(this, &Application::aboutToQuit, [=]() { connect(this, &Application::aboutToQuit, [this]() {
setKeyboardFocusOverlay(UNKNOWN_OVERLAY_ID); setKeyboardFocusOverlay(UNKNOWN_OVERLAY_ID);
setKeyboardFocusEntity(UNKNOWN_ENTITY_ID); setKeyboardFocusEntity(UNKNOWN_ENTITY_ID);
}); });
@ -2201,14 +2201,14 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
// This is done so we don't get a "connection time-out" message when we haven't passed in a URL. // This is done so we don't get a "connection time-out" message when we haven't passed in a URL.
if (arguments().contains("--url")) { if (arguments().contains("--url")) {
auto reply = SandboxUtils::getStatus(); auto reply = SandboxUtils::getStatus();
connect(reply, &QNetworkReply::finished, this, [=] { connect(reply, &QNetworkReply::finished, this, [this, reply] {
handleSandboxStatus(reply); handleSandboxStatus(reply);
}); });
} }
} else { } else {
PROFILE_RANGE(render, "GetSandboxStatus"); PROFILE_RANGE(render, "GetSandboxStatus");
auto reply = SandboxUtils::getStatus(); auto reply = SandboxUtils::getStatus();
connect(reply, &QNetworkReply::finished, this, [=] { connect(reply, &QNetworkReply::finished, this, [this, reply] {
handleSandboxStatus(reply); handleSandboxStatus(reply);
}); });
} }
@ -2235,8 +2235,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
connect(&_myCamera, &Camera::modeUpdated, this, &Application::cameraModeChanged); connect(&_myCamera, &Camera::modeUpdated, this, &Application::cameraModeChanged);
DependencyManager::get<PickManager>()->setShouldPickHUDOperator([&]() { return DependencyManager::get<HMDScriptingInterface>()->isHMDMode(); }); DependencyManager::get<PickManager>()->setShouldPickHUDOperator([]() { return DependencyManager::get<HMDScriptingInterface>()->isHMDMode(); });
DependencyManager::get<PickManager>()->setCalculatePos2DFromHUDOperator([&](const glm::vec3& intersection) { DependencyManager::get<PickManager>()->setCalculatePos2DFromHUDOperator([this](const glm::vec3& intersection) {
const glm::vec2 MARGIN(25.0f); const glm::vec2 MARGIN(25.0f);
glm::vec2 maxPos = _controllerScriptingInterface->getViewportDimensions() - MARGIN; glm::vec2 maxPos = _controllerScriptingInterface->getViewportDimensions() - MARGIN;
glm::vec2 pos2D = DependencyManager::get<HMDScriptingInterface>()->overlayFromWorldPoint(intersection); glm::vec2 pos2D = DependencyManager::get<HMDScriptingInterface>()->overlayFromWorldPoint(intersection);
@ -2246,7 +2246,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
// Setup the mouse ray pick and related operators // Setup the mouse ray pick and related operators
DependencyManager::get<EntityTreeRenderer>()->setMouseRayPickID(DependencyManager::get<PickManager>()->addPick(PickQuery::Ray, std::make_shared<MouseRayPick>( DependencyManager::get<EntityTreeRenderer>()->setMouseRayPickID(DependencyManager::get<PickManager>()->addPick(PickQuery::Ray, std::make_shared<MouseRayPick>(
PickFilter(PickScriptingInterface::PICK_ENTITIES() | PickScriptingInterface::PICK_INCLUDE_NONCOLLIDABLE()), 0.0f, true))); PickFilter(PickScriptingInterface::PICK_ENTITIES() | PickScriptingInterface::PICK_INCLUDE_NONCOLLIDABLE()), 0.0f, true)));
DependencyManager::get<EntityTreeRenderer>()->setMouseRayPickResultOperator([&](unsigned int rayPickID) { DependencyManager::get<EntityTreeRenderer>()->setMouseRayPickResultOperator([](unsigned int rayPickID) {
RayToEntityIntersectionResult entityResult; RayToEntityIntersectionResult entityResult;
entityResult.intersects = false; entityResult.intersects = false;
auto pickResult = DependencyManager::get<PickManager>()->getPrevPickResultTyped<RayPickResult>(rayPickID); auto pickResult = DependencyManager::get<PickManager>()->getPrevPickResultTyped<RayPickResult>(rayPickID);
@ -2262,7 +2262,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
} }
return entityResult; return entityResult;
}); });
DependencyManager::get<EntityTreeRenderer>()->setSetPrecisionPickingOperator([&](unsigned int rayPickID, bool value) { DependencyManager::get<EntityTreeRenderer>()->setSetPrecisionPickingOperator([](unsigned int rayPickID, bool value) {
DependencyManager::get<PickManager>()->setPrecisionPicking(rayPickID, value); DependencyManager::get<PickManager>()->setPrecisionPicking(rayPickID, value);
}); });
@ -2461,32 +2461,35 @@ void Application::cleanupBeforeQuit() {
_keyboardFocusHighlight = nullptr; _keyboardFocusHighlight = nullptr;
} }
auto nodeList = DependencyManager::get<NodeList>(); {
auto nodeList = DependencyManager::get<NodeList>();
// send the domain a disconnect packet, force stoppage of domain-server check-ins // send the domain a disconnect packet, force stoppage of domain-server check-ins
nodeList->getDomainHandler().disconnect(); nodeList->getDomainHandler().disconnect();
nodeList->setIsShuttingDown(true); nodeList->setIsShuttingDown(true);
// tell the packet receiver we're shutting down, so it can drop packets // tell the packet receiver we're shutting down, so it can drop packets
nodeList->getPacketReceiver().setShouldDropPackets(true); nodeList->getPacketReceiver().setShouldDropPackets(true);
}
getEntities()->shutdown(); // tell the entities system we're shutting down, so it will stop running scripts getEntities()->shutdown(); // tell the entities system we're shutting down, so it will stop running scripts
// Clear any queued processing (I/O, FBX/OBJ/Texture parsing) // Clear any queued processing (I/O, FBX/OBJ/Texture parsing)
QThreadPool::globalInstance()->clear(); QThreadPool::globalInstance()->clear();
DependencyManager::destroy<RecordingScriptingInterface>();
// FIXME: Something is still holding on to the ScriptEnginePointers contained in ScriptEngines, and they hold backpointers to ScriptEngines,
// so this doesn't shut down properly
DependencyManager::get<ScriptEngines>()->shutdownScripting(); // stop all currently running global scripts
// These classes hold ScriptEnginePointers, so they must be destroyed before ScriptEngines // These classes hold ScriptEnginePointers, so they must be destroyed before ScriptEngines
// Must be done after shutdownScripting in case any scripts try to access these things
{ {
DependencyManager::destroy<RecordingScriptingInterface>();
DependencyManager::destroy<StandAloneJSConsole>(); DependencyManager::destroy<StandAloneJSConsole>();
EntityTreePointer tree = getEntities()->getTree(); EntityTreePointer tree = getEntities()->getTree();
tree->setSimulation(nullptr); tree->setSimulation(nullptr);
DependencyManager::destroy<EntityTreeRenderer>(); DependencyManager::destroy<EntityTreeRenderer>();
} }
// FIXME: Something is still holding on to the ScriptEnginePointers contained in ScriptEngines, and they hold backpointers to ScriptEngines,
// so this doesn't shut down properly
DependencyManager::get<ScriptEngines>()->shutdownScripting(); // stop all currently running global scripts
DependencyManager::destroy<ScriptEngines>(); DependencyManager::destroy<ScriptEngines>();
_displayPlugin.reset(); _displayPlugin.reset();
@ -4748,7 +4751,7 @@ bool Application::exportEntities(const QString& filename,
exportTree->createRootElement(); exportTree->createRootElement();
glm::vec3 root(TREE_SCALE, TREE_SCALE, TREE_SCALE); glm::vec3 root(TREE_SCALE, TREE_SCALE, TREE_SCALE);
bool success = true; bool success = true;
entityTree->withReadLock([&] { entityTree->withReadLock([entityIDs, entityTree, givenOffset, myAvatarID, &root, &entities, &success, &exportTree] {
for (auto entityID : entityIDs) { // Gather entities and properties. for (auto entityID : entityIDs) { // Gather entities and properties.
auto entityItem = entityTree->findEntityByEntityItemID(entityID); auto entityItem = entityTree->findEntityByEntityItemID(entityID);
if (!entityItem) { if (!entityItem) {
@ -6345,7 +6348,6 @@ void Application::domainURLChanged(QUrl domainURL) {
void Application::resettingDomain() { void Application::resettingDomain() {
_notifiedPacketVersionMismatchThisDomain = false; _notifiedPacketVersionMismatchThisDomain = false;
auto nodeList = DependencyManager::get<NodeList>();
clearDomainOctreeDetails(); clearDomainOctreeDetails();
} }

View file

@ -64,7 +64,7 @@ void addAvatarEntities(const QVariantList& avatarEntities) {
EntityItemID id = EntityItemID(QUuid::createUuid()); EntityItemID id = EntityItemID(QUuid::createUuid());
bool success = true; bool success = true;
entityTree->withWriteLock([&] { entityTree->withWriteLock([&entityTree, id, &entityProperties, &success] {
EntityItemPointer entity = entityTree->addEntity(id, entityProperties); EntityItemPointer entity = entityTree->addEntity(id, entityProperties);
if (entity) { if (entity) {
if (entityProperties.queryAACubeRelatedPropertyChanged()) { if (entityProperties.queryAACubeRelatedPropertyChanged()) {

View file

@ -147,9 +147,11 @@ Menu::Menu() {
auto assetServerAction = addActionToQMenuAndActionHash(editMenu, MenuOption::AssetServer, auto assetServerAction = addActionToQMenuAndActionHash(editMenu, MenuOption::AssetServer,
Qt::CTRL | Qt::SHIFT | Qt::Key_A, Qt::CTRL | Qt::SHIFT | Qt::Key_A,
qApp, SLOT(showAssetServerWidget())); qApp, SLOT(showAssetServerWidget()));
auto nodeList = DependencyManager::get<NodeList>(); {
QObject::connect(nodeList.data(), &NodeList::canWriteAssetsChanged, assetServerAction, &QAction::setEnabled); auto nodeList = DependencyManager::get<NodeList>();
assetServerAction->setEnabled(nodeList->getThisNodeCanWriteAssets()); QObject::connect(nodeList.data(), &NodeList::canWriteAssetsChanged, assetServerAction, &QAction::setEnabled);
assetServerAction->setEnabled(nodeList->getThisNodeCanWriteAssets());
}
// Edit > Package Model as .fst... // Edit > Package Model as .fst...
addActionToQMenuAndActionHash(editMenu, MenuOption::PackageModel, 0, addActionToQMenuAndActionHash(editMenu, MenuOption::PackageModel, 0,
@ -620,8 +622,11 @@ Menu::Menu() {
addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::SendWrongProtocolVersion, 0, false, addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::SendWrongProtocolVersion, 0, false,
qApp, SLOT(sendWrongProtocolVersionsSignature(bool))); qApp, SLOT(sendWrongProtocolVersionsSignature(bool)));
addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::SendWrongDSConnectVersion, 0, false, {
nodeList.data(), SLOT(toggleSendNewerDSConnectVersion(bool))); auto nodeList = DependencyManager::get<NodeList>();
addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::SendWrongDSConnectVersion, 0, false,
nodeList.data(), SLOT(toggleSendNewerDSConnectVersion(bool)));
}
#endif #endif
@ -763,11 +768,14 @@ Menu::Menu() {
qApp, SLOT(toggleLogDialog())); qApp, SLOT(toggleLogDialog()));
auto essLogAction = addActionToQMenuAndActionHash(developerMenu, MenuOption::EntityScriptServerLog, 0, auto essLogAction = addActionToQMenuAndActionHash(developerMenu, MenuOption::EntityScriptServerLog, 0,
qApp, SLOT(toggleEntityScriptServerLogDialog())); qApp, SLOT(toggleEntityScriptServerLogDialog()));
QObject::connect(nodeList.data(), &NodeList::canRezChanged, essLogAction, [essLogAction] { {
auto nodeList = DependencyManager::get<NodeList>(); auto nodeList = DependencyManager::get<NodeList>();
QObject::connect(nodeList.data(), &NodeList::canRezChanged, essLogAction, [essLogAction] {
auto nodeList = DependencyManager::get<NodeList>();
essLogAction->setEnabled(nodeList->getThisNodeCanRez());
});
essLogAction->setEnabled(nodeList->getThisNodeCanRez()); essLogAction->setEnabled(nodeList->getThisNodeCanRez());
}); }
essLogAction->setEnabled(nodeList->getThisNodeCanRez());
addActionToQMenuAndActionHash(developerMenu, "Script Log (HMD friendly)...", Qt::NoButton, addActionToQMenuAndActionHash(developerMenu, "Script Log (HMD friendly)...", Qt::NoButton,
qApp, SLOT(showScriptLogs())); qApp, SLOT(showScriptLogs()));

View file

@ -79,7 +79,7 @@ AvatarManager::AvatarManager(QObject* parent) :
// when we hear that the user has ignored an avatar by session UUID // when we hear that the user has ignored an avatar by session UUID
// immediately remove that avatar instead of waiting for the absence of packets from avatar mixer // immediately remove that avatar instead of waiting for the absence of packets from avatar mixer
connect(nodeList.data(), &NodeList::ignoredNode, this, [=](const QUuid& nodeID, bool enabled) { connect(nodeList.data(), &NodeList::ignoredNode, this, [this](const QUuid& nodeID, bool enabled) {
if (enabled) { if (enabled) {
removeAvatar(nodeID, KillAvatarReason::AvatarIgnored); removeAvatar(nodeID, KillAvatarReason::AvatarIgnored);
} }
@ -334,10 +334,10 @@ void AvatarManager::postUpdate(float deltaTime, const render::ScenePointer& scen
void AvatarManager::sendIdentityRequest(const QUuid& avatarID) const { void AvatarManager::sendIdentityRequest(const QUuid& avatarID) const {
auto nodeList = DependencyManager::get<NodeList>(); auto nodeList = DependencyManager::get<NodeList>();
nodeList->eachMatchingNode( nodeList->eachMatchingNode(
[&](const SharedNodePointer& node)->bool { [](const SharedNodePointer& node)->bool {
return node->getType() == NodeType::AvatarMixer && node->getActiveSocket(); return node->getType() == NodeType::AvatarMixer && node->getActiveSocket();
}, },
[&](const SharedNodePointer& node) { [this, avatarID, &nodeList](const SharedNodePointer& node) {
auto packet = NLPacket::create(PacketType::AvatarIdentityRequest, NUM_BYTES_RFC4122_UUID, true); auto packet = NLPacket::create(PacketType::AvatarIdentityRequest, NUM_BYTES_RFC4122_UUID, true);
packet->write(avatarID.toRfc4122()); packet->write(avatarID.toRfc4122());
nodeList->sendPacket(std::move(packet), *node); nodeList->sendPacket(std::move(packet), *node);

View file

@ -328,7 +328,7 @@ Wallet::Wallet() {
packetReceiver.registerListener(PacketType::ChallengeOwnership, this, "handleChallengeOwnershipPacket"); packetReceiver.registerListener(PacketType::ChallengeOwnership, this, "handleChallengeOwnershipPacket");
packetReceiver.registerListener(PacketType::ChallengeOwnershipRequest, this, "handleChallengeOwnershipPacket"); packetReceiver.registerListener(PacketType::ChallengeOwnershipRequest, this, "handleChallengeOwnershipPacket");
connect(ledger.data(), &Ledger::accountResult, this, [&](QJsonObject result) { connect(ledger.data(), &Ledger::accountResult, this, [](QJsonObject result) {
auto wallet = DependencyManager::get<Wallet>(); auto wallet = DependencyManager::get<Wallet>();
auto walletScriptingInterface = DependencyManager::get<WalletScriptingInterface>(); auto walletScriptingInterface = DependencyManager::get<WalletScriptingInterface>();
uint status; uint status;

View file

@ -27,28 +27,27 @@
void setupPreferences() { void setupPreferences() {
auto preferences = DependencyManager::get<Preferences>(); auto preferences = DependencyManager::get<Preferences>();
auto nodeList = DependencyManager::get<NodeList>();
auto myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar(); auto myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
static const QString AVATAR_BASICS { "Avatar Basics" }; static const QString AVATAR_BASICS { "Avatar Basics" };
{ {
auto getter = [=]()->QString { return myAvatar->getDisplayName(); }; auto getter = [myAvatar]()->QString { return myAvatar->getDisplayName(); };
auto setter = [=](const QString& value) { myAvatar->setDisplayName(value); }; auto setter = [myAvatar](const QString& value) { myAvatar->setDisplayName(value); };
auto preference = new EditPreference(AVATAR_BASICS, "Avatar display name (optional)", getter, setter); auto preference = new EditPreference(AVATAR_BASICS, "Avatar display name (optional)", getter, setter);
preference->setPlaceholderText("Not showing a name"); preference->setPlaceholderText("Not showing a name");
preferences->addPreference(preference); preferences->addPreference(preference);
} }
{ {
auto getter = [=]()->QString { return myAvatar->getCollisionSoundURL(); }; auto getter = [myAvatar]()->QString { return myAvatar->getCollisionSoundURL(); };
auto setter = [=](const QString& value) { myAvatar->setCollisionSoundURL(value); }; auto setter = [myAvatar](const QString& value) { myAvatar->setCollisionSoundURL(value); };
auto preference = new EditPreference(AVATAR_BASICS, "Avatar collision sound URL (optional)", getter, setter); auto preference = new EditPreference(AVATAR_BASICS, "Avatar collision sound URL (optional)", getter, setter);
preference->setPlaceholderText("Enter the URL of a sound to play when you bump into something"); preference->setPlaceholderText("Enter the URL of a sound to play when you bump into something");
preferences->addPreference(preference); preferences->addPreference(preference);
} }
{ {
auto getter = [=]()->QString { return myAvatar->getFullAvatarURLFromPreferences().toString(); }; auto getter = [myAvatar]()->QString { return myAvatar->getFullAvatarURLFromPreferences().toString(); };
auto setter = [=](const QString& value) { myAvatar->useFullAvatarURL(value, ""); qApp->clearAvatarOverrideUrl(); }; auto setter = [myAvatar](const QString& value) { myAvatar->useFullAvatarURL(value, ""); qApp->clearAvatarOverrideUrl(); };
auto preference = new AvatarPreference(AVATAR_BASICS, "Appearance", getter, setter); auto preference = new AvatarPreference(AVATAR_BASICS, "Appearance", getter, setter);
preferences->addPreference(preference); preferences->addPreference(preference);
} }
@ -163,8 +162,8 @@ void setupPreferences() {
static const QString VIEW_CATEGORY{ "View" }; static const QString VIEW_CATEGORY{ "View" };
{ {
auto getter = [=]()->float { return myAvatar->getRealWorldFieldOfView(); }; auto getter = [myAvatar]()->float { return myAvatar->getRealWorldFieldOfView(); };
auto setter = [=](float value) { myAvatar->setRealWorldFieldOfView(value); }; auto setter = [myAvatar](float value) { myAvatar->setRealWorldFieldOfView(value); };
auto preference = new SpinnerPreference(VIEW_CATEGORY, "Real world vertical field of view (angular size of monitor)", getter, setter); auto preference = new SpinnerPreference(VIEW_CATEGORY, "Real world vertical field of view (angular size of monitor)", getter, setter);
preference->setMin(1); preference->setMin(1);
preference->setMax(180); preference->setMax(180);
@ -219,13 +218,13 @@ void setupPreferences() {
static const QString AVATAR_TUNING { "Avatar Tuning" }; static const QString AVATAR_TUNING { "Avatar Tuning" };
{ {
auto getter = [=]()->QString { return myAvatar->getDominantHand(); }; auto getter = [myAvatar]()->QString { return myAvatar->getDominantHand(); };
auto setter = [=](const QString& value) { myAvatar->setDominantHand(value); }; auto setter = [myAvatar](const QString& value) { myAvatar->setDominantHand(value); };
preferences->addPreference(new PrimaryHandPreference(AVATAR_TUNING, "Dominant Hand", getter, setter)); preferences->addPreference(new PrimaryHandPreference(AVATAR_TUNING, "Dominant Hand", getter, setter));
} }
{ {
auto getter = [=]()->float { return myAvatar->getTargetScale(); }; auto getter = [myAvatar]()->float { return myAvatar->getTargetScale(); };
auto setter = [=](float value) { myAvatar->setTargetScale(value); }; auto setter = [myAvatar](float value) { myAvatar->setTargetScale(value); };
auto preference = new SpinnerSliderPreference(AVATAR_TUNING, "Avatar Scale", getter, setter); auto preference = new SpinnerSliderPreference(AVATAR_TUNING, "Avatar Scale", getter, setter);
preference->setMin(0.25); preference->setMin(0.25);
preference->setMax(4); preference->setMax(4);
@ -240,16 +239,16 @@ void setupPreferences() {
} }
{ {
auto getter = [=]()->QString { return myAvatar->getAnimGraphOverrideUrl().toString(); }; auto getter = [myAvatar]()->QString { return myAvatar->getAnimGraphOverrideUrl().toString(); };
auto setter = [=](const QString& value) { myAvatar->setAnimGraphOverrideUrl(QUrl(value)); }; auto setter = [myAvatar](const QString& value) { myAvatar->setAnimGraphOverrideUrl(QUrl(value)); };
auto preference = new EditPreference(AVATAR_TUNING, "Avatar animation JSON", getter, setter); auto preference = new EditPreference(AVATAR_TUNING, "Avatar animation JSON", getter, setter);
preference->setPlaceholderText("default"); preference->setPlaceholderText("default");
preferences->addPreference(preference); preferences->addPreference(preference);
} }
{ {
auto getter = [=]()->bool { return myAvatar->getCollisionsEnabled(); }; auto getter = [myAvatar]()->bool { return myAvatar->getCollisionsEnabled(); };
auto setter = [=](bool value) { myAvatar->setCollisionsEnabled(value); }; auto setter = [myAvatar](bool value) { myAvatar->setCollisionsEnabled(value); };
auto preference = new CheckPreference(AVATAR_TUNING, "Enable Avatar collisions", getter, setter); auto preference = new CheckPreference(AVATAR_TUNING, "Enable Avatar collisions", getter, setter);
preferences->addPreference(preference); preferences->addPreference(preference);
} }
@ -270,15 +269,15 @@ void setupPreferences() {
{ {
static const QString movementsControlChannel = QStringLiteral("Hifi-Advanced-Movement-Disabler"); static const QString movementsControlChannel = QStringLiteral("Hifi-Advanced-Movement-Disabler");
auto getter = [=]()->bool { return myAvatar->useAdvancedMovementControls(); }; auto getter = [myAvatar]()->bool { return myAvatar->useAdvancedMovementControls(); };
auto setter = [=](bool value) { myAvatar->setUseAdvancedMovementControls(value); }; auto setter = [myAvatar](bool value) { myAvatar->setUseAdvancedMovementControls(value); };
preferences->addPreference(new CheckPreference(MOVEMENT, preferences->addPreference(new CheckPreference(MOVEMENT,
QStringLiteral("Advanced movement for hand controllers"), QStringLiteral("Advanced movement for hand controllers"),
getter, setter)); getter, setter));
} }
{ {
auto getter = [=]()->int { return myAvatar->getSnapTurn() ? 0 : 1; }; auto getter = [myAvatar]()->int { return myAvatar->getSnapTurn() ? 0 : 1; };
auto setter = [=](int value) { myAvatar->setSnapTurn(value == 0); }; auto setter = [myAvatar](int value) { myAvatar->setSnapTurn(value == 0); };
auto preference = new RadioButtonsPreference(MOVEMENT, "Snap turn / Smooth turn", getter, setter); auto preference = new RadioButtonsPreference(MOVEMENT, "Snap turn / Smooth turn", getter, setter);
QStringList items; QStringList items;
items << "Snap turn" << "Smooth turn"; items << "Snap turn" << "Smooth turn";
@ -306,20 +305,20 @@ void setupPreferences() {
{ {
static const QString movementsControlChannel = QStringLiteral("Hifi-Advanced-Movement-Disabler"); static const QString movementsControlChannel = QStringLiteral("Hifi-Advanced-Movement-Disabler");
auto getter = [=]()->bool { return myAvatar->useAdvancedMovementControls(); }; auto getter = [myAvatar]()->bool { return myAvatar->useAdvancedMovementControls(); };
auto setter = [=](bool value) { myAvatar->setUseAdvancedMovementControls(value); }; auto setter = [myAvatar](bool value) { myAvatar->setUseAdvancedMovementControls(value); };
preferences->addPreference(new CheckPreference(VR_MOVEMENT, preferences->addPreference(new CheckPreference(VR_MOVEMENT,
QStringLiteral("Advanced movement for hand controllers"), QStringLiteral("Advanced movement for hand controllers"),
getter, setter)); getter, setter));
} }
{ {
auto getter = [=]()->bool { return myAvatar->getFlyingHMDPref(); }; auto getter = [myAvatar]()->bool { return myAvatar->getFlyingHMDPref(); };
auto setter = [=](bool value) { myAvatar->setFlyingHMDPref(value); }; auto setter = [myAvatar](bool value) { myAvatar->setFlyingHMDPref(value); };
preferences->addPreference(new CheckPreference(VR_MOVEMENT, "Flying & jumping", getter, setter)); preferences->addPreference(new CheckPreference(VR_MOVEMENT, "Flying & jumping", getter, setter));
} }
{ {
auto getter = [=]()->int { return myAvatar->getSnapTurn() ? 0 : 1; }; auto getter = [myAvatar]()->int { return myAvatar->getSnapTurn() ? 0 : 1; };
auto setter = [=](int value) { myAvatar->setSnapTurn(value == 0); }; auto setter = [myAvatar](int value) { myAvatar->setSnapTurn(value == 0); };
auto preference = new RadioButtonsPreference(VR_MOVEMENT, "Snap turn / Smooth turn", getter, setter); auto preference = new RadioButtonsPreference(VR_MOVEMENT, "Snap turn / Smooth turn", getter, setter);
QStringList items; QStringList items;
items << "Snap turn" << "Smooth turn"; items << "Snap turn" << "Smooth turn";
@ -345,8 +344,8 @@ void setupPreferences() {
static const QString AVATAR_CAMERA{ "Mouse Sensitivity" }; static const QString AVATAR_CAMERA{ "Mouse Sensitivity" };
{ {
auto getter = [=]()->float { return myAvatar->getPitchSpeed(); }; auto getter = [myAvatar]()->float { return myAvatar->getPitchSpeed(); };
auto setter = [=](float value) { myAvatar->setPitchSpeed(value); }; auto setter = [myAvatar](float value) { myAvatar->setPitchSpeed(value); };
auto preference = new SpinnerSliderPreference(AVATAR_CAMERA, "Y input:", getter, setter); auto preference = new SpinnerSliderPreference(AVATAR_CAMERA, "Y input:", getter, setter);
preference->setMin(1.0f); preference->setMin(1.0f);
preference->setMax(360.0f); preference->setMax(360.0f);
@ -355,8 +354,8 @@ void setupPreferences() {
preferences->addPreference(preference); preferences->addPreference(preference);
} }
{ {
auto getter = [=]()->float { return myAvatar->getYawSpeed(); }; auto getter = [myAvatar]()->float { return myAvatar->getYawSpeed(); };
auto setter = [=](float value) { myAvatar->setYawSpeed(value); }; auto setter = [myAvatar](float value) { myAvatar->setYawSpeed(value); };
auto preference = new SpinnerSliderPreference(AVATAR_CAMERA, "X input:", getter, setter); auto preference = new SpinnerSliderPreference(AVATAR_CAMERA, "X input:", getter, setter);
preference->setMin(1.0f); preference->setMin(1.0f);
preference->setMax(360.0f); preference->setMax(360.0f);
@ -421,8 +420,8 @@ void setupPreferences() {
{ {
static const int MIN_PORT_NUMBER { 0 }; static const int MIN_PORT_NUMBER { 0 };
static const int MAX_PORT_NUMBER { 65535 }; static const int MAX_PORT_NUMBER { 65535 };
auto getter = [nodelist] { return static_cast<int>(nodelist->getSocketLocalPort()); }; auto getter = [&nodelist] { return static_cast<int>(nodelist->getSocketLocalPort()); };
auto setter = [nodelist](int preset) { nodelist->setSocketLocalPort(static_cast<quint16>(preset)); }; auto setter = [&nodelist](int preset) { nodelist->setSocketLocalPort(static_cast<quint16>(preset)); };
auto preference = new IntSpinnerPreference(NETWORKING, "Listening Port", getter, setter); auto preference = new IntSpinnerPreference(NETWORKING, "Listening Port", getter, setter);
preference->setMin(MIN_PORT_NUMBER); preference->setMin(MIN_PORT_NUMBER);
preference->setMax(MAX_PORT_NUMBER); preference->setMax(MAX_PORT_NUMBER);

View file

@ -174,7 +174,7 @@ void Stats::updateStats(bool force) {
int octreeServerCount = 0; int octreeServerCount = 0;
int pingOctreeMax = 0; int pingOctreeMax = 0;
int totalEntityKbps = 0; int totalEntityKbps = 0;
nodeList->eachNode([&](const SharedNodePointer& node) { nodeList->eachNode([&totalPingOctree, &totalEntityKbps, &octreeServerCount, &pingOctreeMax](const SharedNodePointer& node) {
// TODO: this should also support entities // TODO: this should also support entities
if (node->getType() == NodeType::EntityServer) { if (node->getType() == NodeType::EntityServer) {
totalPingOctree += node->getPingMs(); totalPingOctree += node->getPingMs();

View file

@ -1908,7 +1908,7 @@ void AvatarData::sendIdentityPacket() {
auto packetList = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true); auto packetList = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true);
packetList->write(identityData); packetList->write(identityData);
nodeList->eachMatchingNode( nodeList->eachMatchingNode(
[&](const SharedNodePointer& node)->bool { [](const SharedNodePointer& node)->bool {
return node->getType() == NodeType::AvatarMixer && node->getActiveSocket(); return node->getType() == NodeType::AvatarMixer && node->getActiveSocket();
}, },
[&](const SharedNodePointer& node) { [&](const SharedNodePointer& node) {

View file

@ -1249,7 +1249,7 @@ bool EntityScriptingInterface::actionWorker(const QUuid& entityID,
EntityItemPointer entity; EntityItemPointer entity;
bool doTransmit = false; bool doTransmit = false;
_entityTree->withWriteLock([&] { _entityTree->withWriteLock([this, &entity, entityID, myNodeID, &doTransmit, actor, &properties] {
EntitySimulationPointer simulation = _entityTree->getSimulation(); EntitySimulationPointer simulation = _entityTree->getSimulation();
entity = _entityTree->findEntityByEntityItemID(entityID); entity = _entityTree->findEntityByEntityItemID(entityID);
if (!entity) { if (!entity) {

View file

@ -1435,7 +1435,7 @@ void EntityTree::validatePop(const QString& certID, const EntityItemID& entityIt
QNetworkReply* networkReply = networkAccessManager.put(networkRequest, QJsonDocument(request).toJson()); QNetworkReply* networkReply = networkAccessManager.put(networkRequest, QJsonDocument(request).toJson());
connect(networkReply, &QNetworkReply::finished, [=]() { connect(networkReply, &QNetworkReply::finished, [this, networkReply, entityItemID, certID, senderNode]() {
QJsonObject jsonObject = QJsonDocument::fromJson(networkReply->readAll()).object(); QJsonObject jsonObject = QJsonDocument::fromJson(networkReply->readAll()).object();
jsonObject = jsonObject["data"].toObject(); jsonObject = jsonObject["data"].toObject();