mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-10 07:12:50 +02:00
try to fix nodelist not getting destroyed
This commit is contained in:
parent
8a9c27ed92
commit
1ba28de5b6
13 changed files with 98 additions and 89 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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()));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue