diff --git a/CMakeLists.txt b/CMakeLists.txt index 7293e9f825..8abcce4489 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -337,6 +337,13 @@ if (BUILD_GPU_FRAME_PLAYER_ONLY) add_subdirectory(tools/gpu-frame-player) else() +if (SCREENSHARE) + add_subdirectory(screenshare) +endif() + +# BUILD_TOOLS option will be handled inside the tools's CMakeLists.txt because 'scribe' tool is required for build anyway +add_subdirectory(tools) + # add subdirectories for all targets if (BUILD_SERVER) add_subdirectory(assignment-client) @@ -363,13 +370,6 @@ if (BUILD_CLIENT OR BUILD_SERVER) add_subdirectory(server-console) endif() -if (SCREENSHARE) - add_subdirectory(screenshare) -endif() - -# BUILD_TOOLS option will be handled inside the tools's CMakeLists.txt because 'scribe' tool is required for build anyway -add_subdirectory(tools) - endif() if (BUILD_TESTS) diff --git a/README.md b/README.md index b84849b205..c1cd8323e9 100644 --- a/README.md +++ b/README.md @@ -73,8 +73,16 @@ Vircadia consists of many projects and codebases with its unifying structure's g There are many contributors to Vircadia. Code writers, reviewers, testers, documentation writers, modelers, and general supporters of the project are all integral to its development and success towards its goals. Find out how you can [contribute](CONTRIBUTING.md)! -### [Supporters](https://github.com/sponsors/digisomni/) +### Support -| [Karol Suprynowicz - 74hc595](https://github.com/ksuprynowicz) | +You can support the Vircadia project financially through [GitHub Sponsors](https://github.com/sponsors/digisomni/). + +You can also support individual active contributors by visiting each repository, this is the main Vircadia repository's [list of active contributors](https://vircadia.com/contributors-redirector/?redirect=vircadia/vircadia). Click on a contributor's profile to see if they accept donations! + +Keep in mind that Vircadia consists of multiple smaller projects that might have different active contributors. This is a [a non-exhaustive list](https://github.com/vircadia). + +#### Supporters of the Vircadia Project + +| [Karol Suprynowicz - 74hc595](https://github.com/ksuprynowicz) | | --- | -|

[![ksuprynowicz](https://avatars.githubusercontent.com/u/11568651?s=64&v=4)](https://github.com/ksuprynowicz)

+|

[ksuprynowicz](https://github.com/ksuprynowicz)

\ No newline at end of file diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index bd35c20df8..134696b852 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -46,7 +46,8 @@ const long long ASSIGNMENT_REQUEST_INTERVAL_MSECS = 1 * 1000; AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QString assignmentPool, quint16 listenPort, QUuid walletUUID, QString assignmentServerHostname, - quint16 assignmentServerPort, quint16 assignmentMonitorPort) : + quint16 assignmentServerPort, quint16 assignmentMonitorPort, + bool disableDomainPortAutoDiscovery) : _assignmentServerHostname(DEFAULT_ASSIGNMENT_SERVER_HOSTNAME) { LogUtils::init(); @@ -91,6 +92,13 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri _assignmentServerSocket.setObjectName("AssignmentServer"); nodeList->setAssignmentServerSocket(_assignmentServerSocket); + if (disableDomainPortAutoDiscovery) { + _disableDomainPortAutoDiscovery = disableDomainPortAutoDiscovery; + qCDebug(assignment_client) << "Disabling domain port auto discovery by the assignment client due to parsed command line parameter."; + } + + nodeList->disableDomainPortAutoDiscovery(_disableDomainPortAutoDiscovery); + qCDebug(assignment_client) << "Assignment server socket is" << _assignmentServerSocket; // call a timer function every ASSIGNMENT_REQUEST_INTERVAL_MSECS to ask for assignment, if required @@ -179,7 +187,7 @@ void AssignmentClient::setUpStatusToMonitor() { void AssignmentClient::sendStatusPacketToACM() { // tell the assignment client monitor what this assignment client is doing (if anything) auto nodeList = DependencyManager::get(); - + quint8 assignmentType = Assignment::Type::AllTypes; if (_currentAssignment) { @@ -190,7 +198,7 @@ void AssignmentClient::sendStatusPacketToACM() { statusPacket->write(_childAssignmentUUID.toRfc4122()); statusPacket->writePrimitive(assignmentType); - + nodeList->sendPacket(std::move(statusPacket), _assignmentClientMonitorSocket); } @@ -200,7 +208,7 @@ void AssignmentClient::sendAssignmentRequest() { auto nodeList = DependencyManager::get(); - if (_assignmentServerHostname == "localhost") { + if (_assignmentServerHostname == "localhost" && !_disableDomainPortAutoDiscovery) { // we want to check again for the local domain-server port in case the DS has restarted quint16 localAssignmentServerPort; if (nodeList->getLocalServerPortFromSharedMemory(DOMAIN_SERVER_LOCAL_PORT_SMEM_KEY, localAssignmentServerPort)) { @@ -285,10 +293,10 @@ void AssignmentClient::handleCreateAssignmentPacket(QSharedPointer message) { const SockAddr& senderSockAddr = message->getSenderSockAddr(); - + if (senderSockAddr.getAddress() == QHostAddress::LocalHost || senderSockAddr.getAddress() == QHostAddress::LocalHostIPv6) { - + qCDebug(assignment_client) << "AssignmentClientMonitor at" << senderSockAddr << "requested stop via PacketType::StopNode."; QCoreApplication::quit(); } else { @@ -322,7 +330,7 @@ void AssignmentClient::handleAuthenticationRequest() { void AssignmentClient::assignmentCompleted() { crash::annotations::setShutdownState(true); - + // we expect that to be here the previous assignment has completely cleaned up assert(_currentAssignment.isNull()); @@ -343,7 +351,7 @@ void AssignmentClient::assignmentCompleted() { nodeList->setOwnerType(NodeType::Unassigned); nodeList->reset("Assignment completed"); nodeList->resetNodeInterestSet(); - + _isAssigned = false; } diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index 58e0e8cda1..d9ef694522 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -26,9 +26,9 @@ class AssignmentClient : public QObject { Q_OBJECT public: AssignmentClient(Assignment::Type requestAssignmentType, QString assignmentPool, - quint16 listenPort, - QUuid walletUUID, QString assignmentServerHostname, quint16 assignmentServerPort, - quint16 assignmentMonitorPort); + quint16 listenPort, QUuid walletUUID, QString assignmentServerHostname, + quint16 assignmentServerPort, quint16 assignmentMonitorPort, + bool disableDomainPortAutoDiscovery); ~AssignmentClient(); public slots: @@ -63,6 +63,7 @@ private: QTimer _requestTimer; // timer for requesting and assignment QTimer _statsTimerACM; // timer for sending stats to assignment client monitor QUuid _childAssignmentUUID = QUuid::createUuid(); + bool _disableDomainPortAutoDiscovery { false }; protected: SockAddr _assignmentClientMonitorSocket; diff --git a/assignment-client/src/AssignmentClientApp.cpp b/assignment-client/src/AssignmentClientApp.cpp index 1dd050fcb9..41d0de7f9a 100644 --- a/assignment-client/src/AssignmentClientApp.cpp +++ b/assignment-client/src/AssignmentClientApp.cpp @@ -4,6 +4,7 @@ // // Created by Seth Alves on 2/19/15. // Copyright 2015 High Fidelity, Inc. +// Copyright 2021 Vircadia contributors. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -44,7 +45,7 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) : // parse command-line QCommandLineParser parser; - parser.setApplicationDescription("High Fidelity Assignment Client"); + parser.setApplicationDescription("Vircadia Assignment Client"); const QCommandLineOption helpOption = parser.addHelpOption(); const QCommandLineOption versionOption = parser.addVersionOption(); @@ -54,8 +55,8 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) : type = static_cast(static_cast(type) + 1)) { typeDescription.append(QStringLiteral("\n%1 | %2").arg(QString::number(type), Assignment::typeToString(type))); } - const QCommandLineOption clientTypeOption(ASSIGNMENT_TYPE_OVERRIDE_OPTION, typeDescription, "type"); + const QCommandLineOption clientTypeOption(ASSIGNMENT_TYPE_OVERRIDE_OPTION, typeDescription, "type"); parser.addOption(clientTypeOption); const QCommandLineOption poolOption(ASSIGNMENT_POOL_OPTION, "set assignment pool", "pool-name"); @@ -99,6 +100,10 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) : const QCommandLineOption logDirectoryOption(ASSIGNMENT_LOG_DIRECTORY, "directory to store logs", "log-directory"); parser.addOption(logDirectoryOption); + const QCommandLineOption disableDomainPortAutoDiscoveryOption(ASSIGNMENT_DISABLE_DOMAIN_AUTO_PORT_DISCOVERY, + "assignment clients automatically search for the domain server on the local machine, if networking is being managed, then disable automatic discovery of the domain server port"); + parser.addOption(disableDomainPortAutoDiscoveryOption); + const QCommandLineOption parentPIDOption(PARENT_PID_OPTION, "PID of the parent process", "parent-pid"); parser.addOption(parentPIDOption); @@ -151,11 +156,14 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) : } QString logDirectory; - if (parser.isSet(logDirectoryOption)) { logDirectory = parser.value(logDirectoryOption); } + bool disableDomainPortAutoDiscovery = false; + if (parser.isSet(disableDomainPortAutoDiscoveryOption)) { + disableDomainPortAutoDiscovery = true; + } Assignment::Type requestAssignmentType = Assignment::AllTypes; if (argumentVariantMap.contains(ASSIGNMENT_TYPE_OVERRIDE_OPTION)) { @@ -250,13 +258,15 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) : AssignmentClientMonitor* monitor = new AssignmentClientMonitor(numForks, minForks, maxForks, requestAssignmentType, assignmentPool, listenPort, childMinListenPort, walletUUID, assignmentServerHostname, - assignmentServerPort, httpStatusPort, logDirectory); + assignmentServerPort, httpStatusPort, logDirectory, + disableDomainPortAutoDiscovery); monitor->setParent(this); connect(this, &QCoreApplication::aboutToQuit, monitor, &AssignmentClientMonitor::aboutToQuit); } else { AssignmentClient* client = new AssignmentClient(requestAssignmentType, assignmentPool, listenPort, walletUUID, assignmentServerHostname, - assignmentServerPort, monitorPort); + assignmentServerPort, monitorPort, + disableDomainPortAutoDiscovery); client->setParent(this); connect(this, &QCoreApplication::aboutToQuit, client, &AssignmentClient::aboutToQuit); } diff --git a/assignment-client/src/AssignmentClientApp.h b/assignment-client/src/AssignmentClientApp.h index 1b50922980..e48e05f4f0 100644 --- a/assignment-client/src/AssignmentClientApp.h +++ b/assignment-client/src/AssignmentClientApp.h @@ -4,6 +4,7 @@ // // Created by Seth Alves on 2/19/15. // Copyright 2015 High Fidelity, Inc. +// Copyright 2021 Vircadia contributors. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -28,6 +29,7 @@ const QString ASSIGNMENT_MAX_FORKS_OPTION = "max"; const QString ASSIGNMENT_CLIENT_MONITOR_PORT_OPTION = "monitor-port"; const QString ASSIGNMENT_HTTP_STATUS_PORT = "http-status-port"; const QString ASSIGNMENT_LOG_DIRECTORY = "log-directory"; +const QString ASSIGNMENT_DISABLE_DOMAIN_AUTO_PORT_DISCOVERY = "disable-domain-port-auto-discovery"; class AssignmentClientApp : public QCoreApplication { Q_OBJECT diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 221a922a4b..30d63470e5 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -42,7 +42,8 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen const unsigned int maxAssignmentClientForks, Assignment::Type requestAssignmentType, QString assignmentPool, quint16 listenPort, quint16 childMinListenPort, QUuid walletUUID, QString assignmentServerHostname, - quint16 assignmentServerPort, quint16 httpStatusServerPort, QString logDirectory) : + quint16 assignmentServerPort, quint16 httpStatusServerPort, QString logDirectory, + bool disableDomainPortAutoDiscovery) : _httpManager(QHostAddress::LocalHost, httpStatusServerPort, "", this), _numAssignmentClientForks(numAssignmentClientForks), _minAssignmentClientForks(minAssignmentClientForks), @@ -52,7 +53,8 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen _walletUUID(walletUUID), _assignmentServerHostname(assignmentServerHostname), _assignmentServerPort(assignmentServerPort), - _childMinListenPort(childMinListenPort) + _childMinListenPort(childMinListenPort), + _disableDomainPortAutoDiscovery(disableDomainPortAutoDiscovery) { qDebug() << "_requestAssignmentType =" << _requestAssignmentType; @@ -199,6 +201,9 @@ void AssignmentClientMonitor::spawnChildClient() { _childArguments.append("--" + ASSIGNMENT_TYPE_OVERRIDE_OPTION); _childArguments.append(QString::number(_requestAssignmentType)); } + if (_disableDomainPortAutoDiscovery) { + _childArguments.append("--" + ASSIGNMENT_DISABLE_DOMAIN_AUTO_PORT_DISCOVERY); + } if (listenPort) { _childArguments.append("-" + ASSIGNMENT_CLIENT_LISTEN_PORT_OPTION); @@ -267,7 +272,7 @@ void AssignmentClientMonitor::spawnChildClient() { stderrPath = stderrPathTemp; stderrFilename = stderrFilenameTemp; } - + qDebug() << "Child stdout being written to: " << stdoutFilename; qDebug() << "Child stderr being written to: " << stderrFilename; } diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index f5355476b7..20d4a6767b 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -4,6 +4,7 @@ // // Created by Stephen Birarda on 1/10/2014. // Copyright 2014 High Fidelity, Inc. +// Copyright 2021 Vircadia contributors. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -27,7 +28,7 @@ extern const char* NUM_FORKS_PARAMETER; struct ACProcess { - QProcess* process; // looks like a dangling pointer, but is parented by the AssignmentClientMonitor + QProcess* process; // looks like a dangling pointer, but is parented by the AssignmentClientMonitor QString logStdoutPath; QString logStderrPath; }; @@ -39,7 +40,7 @@ public: const unsigned int maxAssignmentClientForks, Assignment::Type requestAssignmentType, QString assignmentPool, quint16 listenPort, quint16 childMinListenPort, QUuid walletUUID, QString assignmentServerHostname, quint16 assignmentServerPort, quint16 httpStatusServerPort, - QString logDirectory); + QString logDirectory, bool disableDomainPortAutoDiscovery); ~AssignmentClientMonitor(); void stopChildProcesses(); @@ -80,6 +81,7 @@ private: QSet _childListenPorts; bool _wantsChildFileLogging { false }; + bool _disableDomainPortAutoDiscovery { false }; }; #endif // hifi_AssignmentClientMonitor_h diff --git a/hifi_qt.py b/hifi_qt.py index 078f80c38d..f832d5f940 100644 --- a/hifi_qt.py +++ b/hifi_qt.py @@ -196,7 +196,7 @@ endif() print("https://github.com/vircadia/vircadia/tree/master/tools/qt-builder") print("") print("Alternatively, you can try building against the system Qt by setting the VIRCADIA_USE_SYSTEM_QT environment variable.") - print("You'll need to install the development packages, and to have Qt 5.15.0 or newer. ") + print("You'll need to install the development packages, and to have Qt 5.15.0 or later.") def writeConfig(self): print("Writing cmake config to {}".format(self.configFilePath)) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index a2a29ed4ba..9d8fd93f20 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -19,35 +19,35 @@ endfunction() set(CUSTOM_INTERFACE_QRC_PATHS "") -find_npm() +find_package( + Qt5 COMPONENTS + Gui Widgets Multimedia Network Qml Quick Script Svg + ${PLATFORM_QT_COMPONENTS} + WebChannel WebSockets +) -if (BUILD_TOOLS AND NPM_EXECUTABLE) - add_custom_qrc_path(CUSTOM_INTERFACE_QRC_PATHS "${CMAKE_SOURCE_DIR}/tools/jsdoc/out/hifiJSDoc.json" "auto-complete/hifiJSDoc.json") + +if (BUILD_TOOLS AND JSDOC_ENABLED) + message(STATUS "JSDoc enabled, depending on jsdoc") + add_custom_qrc_path(CUSTOM_INTERFACE_QRC_PATHS "${CMAKE_BINARY_DIR}/tools/jsdoc/out/hifiJSDoc.json" "auto-complete/hifiJSDoc.json") endif () set(RESOURCES_QRC ${CMAKE_CURRENT_BINARY_DIR}/resources.qrc) -set(RESOURCES_RCC ${CMAKE_CURRENT_SOURCE_DIR}/compiledResources/resources.rcc) +set(RESOURCES_RCC ${CMAKE_CURRENT_BINARY_DIR}/resources.rcc) generate_qrc(OUTPUT ${RESOURCES_QRC} PATH ${CMAKE_CURRENT_SOURCE_DIR}/resources CUSTOM_PATHS ${CUSTOM_INTERFACE_QRC_PATHS} GLOBS *) if (ANDROID) # on Android, don't compress the rcc binary - add_custom_command( - OUTPUT ${RESOURCES_RCC} - DEPENDS ${RESOURCES_QRC} ${GENERATE_QRC_DEPENDS} - COMMAND "${RCC_BINARY}" - ARGS ${RESOURCES_QRC} -no-compress -binary -o ${RESOURCES_RCC} - ) + qt5_add_binary_resources(resources "${RESOURCES_QRC}" DESTINATION "${RESOURCES_RCC}" OPTIONS -no-compress) else () - add_custom_command( - OUTPUT ${RESOURCES_RCC} - DEPENDS ${RESOURCES_QRC} ${GENERATE_QRC_DEPENDS} - COMMAND "${RCC_BINARY}" - ARGS ${RESOURCES_QRC} -binary -o ${RESOURCES_RCC} - ) + qt5_add_binary_resources(resources "${RESOURCES_QRC}" DESTINATION "${RESOURCES_RCC}") +endif() + +if (BUILD_TOOLS AND JSDOC_ENABLED) + add_dependencies(resources jsdoc) endif() list(APPEND GENERATE_QRC_DEPENDS ${RESOURCES_RCC}) -add_custom_target(resources ALL DEPENDS ${GENERATE_QRC_DEPENDS}) # set a default root dir for each of our optional externals if it was not passed set(OPTIONAL_EXTERNALS "LeapMotion") @@ -96,13 +96,6 @@ else () list(REMOVE_ITEM INTERFACE_SRCS ${SPEECHRECOGNIZER_CPP}) endif () -find_package( - Qt5 COMPONENTS - Gui Widgets Multimedia Network Qml Quick Script Svg - ${PLATFORM_QT_COMPONENTS} - WebChannel WebSockets -) - # grab the ui files in resources/ui file (GLOB_RECURSE QT_UI_FILES ui/*.ui) source_group("UI Files" FILES ${QT_UI_FILES}) @@ -191,13 +184,7 @@ else () add_executable(${TARGET_NAME} ${INTERFACE_SRCS} ${QM}) endif () - -if (BUILD_TOOLS AND NPM_EXECUTABLE) - # require JSDoc to be build before interface is deployed - add_dependencies(resources jsdoc) -endif() - -if (WIN32 OR APPLE) +if (NOT ANDROID) add_dependencies(${TARGET_NAME} resources) endif() @@ -343,10 +330,6 @@ if (APPLE) COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_SOURCE_DIR}/scripts" "${RESOURCES_DEV_DIR}/scripts" - # copy JSDoc files beside the executable - COMMAND "${CMAKE_COMMAND}" -E copy_directory - "${CMAKE_SOURCE_DIR}/tools/jsdoc/out" - "${RESOURCES_DEV_DIR}/jsdoc" # copy the resources files beside the executable COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${RESOURCES_RCC}" @@ -378,6 +361,13 @@ if (APPLE) ) endif() + if (JSDOC_ENABLED) + add_custom_command(TARGET ${TARGET_NAME} POST_BUILD + # copy JSDoc files beside the executable + COMMAND "${CMAKE_COMMAND}" -E copy_directory + "${JSDOC_OUTPUT_PATH}" + "${RESOURCES_DEV_DIR}/jsdoc") + endif() # call the fixup_interface macro to add required bundling commands for installation fixup_interface() @@ -387,9 +377,6 @@ else() # copy the resources files beside the executable add_custom_command(TARGET ${TARGET_NAME} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy_if_different - "${RESOURCES_RCC}" - "${INTERFACE_EXEC_DIR}" # FIXME, the edit script code loads HTML from the scripts folder # which in turn relies on CSS that refers to the fonts. In theory # we should be able to modify the CSS to reference the QRC path to @@ -407,11 +394,18 @@ else() COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${PROJECT_SOURCE_DIR}/resources/serverless/redirect.json" "${RESOURCES_DEV_DIR}/serverless/redirect.json" + COMMAND "${CMAKE_COMMAND}" -E copy_if_different + "${RESOURCES_RCC}" + "${INTERFACE_EXEC_DIR}/resources.rcc" + ) + + if (JSDOC_ENABLED) + add_custom_command(TARGET ${TARGET_NAME} POST_BUILD # copy JSDoc files beside the executable COMMAND "${CMAKE_COMMAND}" -E copy_directory - "${CMAKE_SOURCE_DIR}/tools/jsdoc/out" - "${INTERFACE_EXEC_DIR}/jsdoc" - ) + "${JSDOC_OUTPUT_PATH}" + "${INTERFACE_EXEC_DIR}/jsdoc") + endif() # link target to external libraries if (WIN32) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 759a96388d..a235ed1c93 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -805,11 +805,13 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { { const QString resourcesBinaryFile = PathUtils::getRccPath(); + qCInfo(interfaceapp) << "Loading primary resources from" << resourcesBinaryFile; + if (!QFile::exists(resourcesBinaryFile)) { - throw std::runtime_error("Unable to find primary resources"); + throw std::runtime_error(QString("Unable to find primary resources from '%1'").arg(resourcesBinaryFile).toStdString()); } if (!QResource::registerResource(resourcesBinaryFile)) { - throw std::runtime_error("Unable to load primary resources"); + throw std::runtime_error(QString("Unable to load primary resources from '%1'").arg(resourcesBinaryFile).toStdString()); } } @@ -1965,7 +1967,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo } QString scriptsSwitch = QString("--").append(SCRIPTS_SWITCH); - _defaultScriptsLocation = getCmdOption(argc, constArgv, scriptsSwitch.toStdString().c_str()); + _defaultScriptsLocation.setPath(getCmdOption(argc, constArgv, scriptsSwitch.toStdString().c_str())); // Make sure we don't time out during slow operations at startup updateHeartbeat(); @@ -3264,12 +3266,12 @@ void Application::initializeUi() { auto newValidator = [=](const QUrl& url) -> bool { QString whitelistPrefix = "[WHITELIST ENTITY SCRIPTS]"; QList safeURLS = { "" }; - safeURLS += qEnvironmentVariable("EXTRA_WHITELIST").trimmed().split(QRegExp("\\s*,\\s*"), QString::SkipEmptyParts); + safeURLS += qEnvironmentVariable("EXTRA_WHITELIST").trimmed().split(QRegExp("\\s*,\\s*"), Qt::SkipEmptyParts); // PULL SAFEURLS FROM INTERFACE.JSON Settings QVariant raw = Setting::Handle("private/settingsSafeURLS").get(); - QStringList settingsSafeURLS = raw.toString().trimmed().split(QRegExp("\\s*[,\r\n]+\\s*"), QString::SkipEmptyParts); + QStringList settingsSafeURLS = raw.toString().trimmed().split(QRegExp("\\s*[,\r\n]+\\s*"), Qt::SkipEmptyParts); safeURLS += settingsSafeURLS; // END PULL SAFEURLS FROM INTERFACE.JSON Settings @@ -8846,19 +8848,19 @@ void Application::initPlugins(const QStringList& arguments) { parser.parse(arguments); if (parser.isSet(display)) { - auto preferredDisplays = parser.value(display).split(',', QString::SkipEmptyParts); + auto preferredDisplays = parser.value(display).split(',', Qt::SkipEmptyParts); qInfo() << "Setting prefered display plugins:" << preferredDisplays; PluginManager::getInstance()->setPreferredDisplayPlugins(preferredDisplays); } if (parser.isSet(disableDisplays)) { - auto disabledDisplays = parser.value(disableDisplays).split(',', QString::SkipEmptyParts); + auto disabledDisplays = parser.value(disableDisplays).split(',', Qt::SkipEmptyParts); qInfo() << "Disabling following display plugins:" << disabledDisplays; PluginManager::getInstance()->disableDisplays(disabledDisplays); } if (parser.isSet(disableInputs)) { - auto disabledInputs = parser.value(disableInputs).split(',', QString::SkipEmptyParts); + auto disabledInputs = parser.value(disableInputs).split(',', Qt::SkipEmptyParts); qInfo() << "Disabling following input plugins:" << disabledInputs; PluginManager::getInstance()->disableInputs(disabledInputs); } diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 3a320cc628..760a7b1127 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -827,10 +827,10 @@ Menu::Menu() { }); // Help > Vircadia Forum - /* action = addActionToQMenuAndActionHash(helpMenu, "Online Forums"); + action = addActionToQMenuAndActionHash(helpMenu, "Community Support"); connect(action, &QAction::triggered, qApp, [] { - QDesktopServices::openUrl(NetworkingConstants::HELP_FORUM_URL)); - }); */ + QDesktopServices::openUrl(NetworkingConstants::HELP_COMMUNITY_URL); + }); // Help > Scripting Reference action = addActionToQMenuAndActionHash(helpMenu, "Online Script Reference"); diff --git a/libraries/animation/CMakeLists.txt b/libraries/animation/CMakeLists.txt index d962d9e222..2e811969ec 100644 --- a/libraries/animation/CMakeLists.txt +++ b/libraries/animation/CMakeLists.txt @@ -7,3 +7,7 @@ include_hifi_library_headers(hfm) include_hifi_library_headers(image) target_nsight() + +if (WIN32) + add_compile_definitions(_USE_MATH_DEFINES) +endif() diff --git a/libraries/embedded-webserver/src/HTTPConnection.cpp b/libraries/embedded-webserver/src/HTTPConnection.cpp index 4c00ba676c..5932c7ed56 100644 --- a/libraries/embedded-webserver/src/HTTPConnection.cpp +++ b/libraries/embedded-webserver/src/HTTPConnection.cpp @@ -124,9 +124,9 @@ HTTPConnection::HTTPConnection(QTcpSocket* socket, HTTPManager* parentManager) : _socket->setParent(this); // connect initial slots - connect(socket, SIGNAL(readyRead()), SLOT(readRequest())); - connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(deleteLater())); - connect(socket, SIGNAL(disconnected()), SLOT(deleteLater())); + connect(socket, &QAbstractSocket::readyRead, this, &HTTPConnection::readRequest); + connect(socket, &QAbstractSocket::errorOccurred, this, &HTTPConnection::deleteLater); + connect(socket, &QAbstractSocket::disconnected, this, &HTTPConnection::deleteLater); } HTTPConnection::~HTTPConnection() { diff --git a/libraries/entities-renderer/CMakeLists.txt b/libraries/entities-renderer/CMakeLists.txt index 5f40c8d5fe..67f34f4831 100644 --- a/libraries/entities-renderer/CMakeLists.txt +++ b/libraries/entities-renderer/CMakeLists.txt @@ -19,3 +19,6 @@ include_hifi_library_headers(graphics-scripting) # for Forward.h target_bullet() target_polyvox() +if (WIN32) + add_compile_definitions(_USE_MATH_DEFINES) +endif() diff --git a/libraries/entities/CMakeLists.txt b/libraries/entities/CMakeLists.txt index bddd4b5e67..b6ed62c15a 100644 --- a/libraries/entities/CMakeLists.txt +++ b/libraries/entities/CMakeLists.txt @@ -9,3 +9,7 @@ include_hifi_library_headers(ktx) include_hifi_library_headers(material-networking) include_hifi_library_headers(procedural) link_hifi_libraries(shared shaders networking octree avatars graphics model-networking) + +if (WIN32) + add_compile_definitions(_USE_MATH_DEFINES) +endif() diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 63d8842a91..1c544f24f0 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -68,7 +68,7 @@ EntityTree::~EntityTree() { } void EntityTree::setEntityScriptSourceWhitelist(const QString& entityScriptSourceWhitelist) { - _entityScriptSourceWhitelist = entityScriptSourceWhitelist.split(',', QString::SkipEmptyParts); + _entityScriptSourceWhitelist = entityScriptSourceWhitelist.split(',', Qt::SkipEmptyParts); } diff --git a/libraries/image/CMakeLists.txt b/libraries/image/CMakeLists.txt index 62f48f66e2..8c72bc7e72 100644 --- a/libraries/image/CMakeLists.txt +++ b/libraries/image/CMakeLists.txt @@ -11,3 +11,7 @@ if (UNIX AND NOT APPLE) find_package(Threads REQUIRED) target_link_libraries(image Threads::Threads) endif() + +if (WIN32) + add_compile_definitions(_USE_MATH_DEFINES) +endif() diff --git a/libraries/networking/src/AssetResourceRequest.cpp b/libraries/networking/src/AssetResourceRequest.cpp index 423e4f3521..5419424f46 100644 --- a/libraries/networking/src/AssetResourceRequest.cpp +++ b/libraries/networking/src/AssetResourceRequest.cpp @@ -59,7 +59,7 @@ void AssetResourceRequest::doSend() { // We'll either have a hash or an ATP path to a file (that maps to a hash) if (urlIsAssetHash(_url)) { // We've detected that this is a hash - simply use AssetClient to request that asset - auto parts = _url.path().split(".", QString::SkipEmptyParts); + auto parts = _url.path().split(".", Qt::SkipEmptyParts); auto hash = parts.length() > 0 ? parts[0] : ""; requestHash(hash); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 8a551f55cb..1559a86355 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -1237,8 +1237,7 @@ void LimitedNodeList::updateLocalSocket() { QTcpSocket* localIPTestSocket = new QTcpSocket; connect(localIPTestSocket, &QTcpSocket::connected, this, &LimitedNodeList::connectedForLocalSocketTest); - connect(localIPTestSocket, static_cast(&QTcpSocket::error), - this, &LimitedNodeList::errorTestingLocalSocket); + connect(localIPTestSocket, &QTcpSocket::errorOccurred, this, &LimitedNodeList::errorTestingLocalSocket); // attempt to connect to our reliable host localIPTestSocket->connectToHost(RELIABLE_LOCAL_IP_CHECK_HOST, RELIABLE_LOCAL_IP_CHECK_PORT); diff --git a/libraries/networking/src/NetworkingConstants.h b/libraries/networking/src/NetworkingConstants.h index ae3607eed9..35180e5829 100644 --- a/libraries/networking/src/NetworkingConstants.h +++ b/libraries/networking/src/NetworkingConstants.h @@ -71,8 +71,9 @@ namespace NetworkingConstants { const unsigned short STUN_SERVER_DEFAULT_PORT = 19302; #endif - const QUrl HELP_DOCS_URL { "https://docs.vircadia.com" }; - const QUrl HELP_FORUM_URL { "https://forum.vircadia.com" }; + const QUrl HELP_COMMUNITY_URL{ "https://vircadia.com/#community" }; + const QUrl HELP_DOCS_URL{ "https://docs.vircadia.com" }; + const QUrl HELP_FORUM_URL{ "https://forum.vircadia.com" }; const QUrl HELP_SCRIPTING_REFERENCE_URL{ "https://apidocs.vircadia.dev/" }; const QUrl HELP_RELEASE_NOTES_URL{ "https://docs.vircadia.com/release-notes.html" }; const QUrl HELP_BUG_REPORT_URL{ "https://github.com/vircadia/vircadia/issues" }; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index b8e6cdf80a..1957b09e82 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -376,8 +376,8 @@ void NodeList::sendDomainServerCheckIn() { // is this our localhost domain-server? // if so we need to make sure we have an up-to-date local port in case it restarted - if (domainSockAddr.getAddress() == QHostAddress::LocalHost - || hostname == "localhost") { + if ((domainSockAddr.getAddress() == QHostAddress::LocalHost || hostname == "localhost") + && _domainPortAutoDiscovery) { quint16 domainPort = DEFAULT_DOMAIN_SERVER_PORT; getLocalServerPortFromSharedMemory(DOMAIN_SERVER_LOCAL_PORT_SMEM_KEY, domainPort); @@ -534,7 +534,7 @@ void NodeList::sendDomainServerCheckIn() { sendPacket(std::move(packetCopy), domainSockAddr); } sendPacket(std::move(domainPacket), domainSockAddr); - + } } @@ -661,7 +661,7 @@ void NodeList::handleICEConnectionToDomainServer() { _domainHandler.getICEClientID(), _domainHandler.getPendingDomainID()); } -} +} void NodeList::pingPunchForDomainServer() { // make sure if we're here that we actually still need to ping the domain-server @@ -715,7 +715,7 @@ void NodeList::processDomainList(QSharedPointer message) { // WEBRTC TODO: Move code into packet library. And update reference in DomainServerList.js. - // parse header information + // parse header information QDataStream packetStream(message->getMessage()); // grab the domain's ID from the beginning of the packet @@ -796,7 +796,7 @@ void NodeList::processDomainList(QSharedPointer message) { if (_domainHandler.isConnected() && _domainHandler.getUUID() != domainUUID) { // Received packet from different domain. - qWarning() << "IGNORING DomainList packet from" << domainUUID << "while connected to" + qWarning() << "IGNORING DomainList packet from" << domainUUID << "while connected to" << _domainHandler.getUUID() << ": sent " << pingLagTime << " msec ago."; qWarning(networking) << "DomainList request lag (interface->ds): " << domainServerRequestLag << "msec"; qWarning(networking) << "DomainList server processing time: " << domainServerCheckinProcessingTime << "usec"; @@ -823,7 +823,7 @@ void NodeList::processDomainList(QSharedPointer message) { setSessionLocalID(newLocalID); setSessionUUID(newUUID); - // FIXME: Remove this call to requestDomainSettings() and reinstate the one in DomainHandler::setIsConnected(), in version + // FIXME: Remove this call to requestDomainSettings() and reinstate the one in DomainHandler::setIsConnected(), in version // 2021.2.0. (New protocol version implies a domain server upgrade.) if (!_domainHandler.isConnected() && _domainHandler.getScheme() == URL_SCHEME_VIRCADIA && !_domainHandler.getHostname().isEmpty()) { @@ -833,7 +833,7 @@ void NodeList::processDomainList(QSharedPointer message) { _domainHandler.requestDomainSettings(); } - // Don't continue login to the domain if have avatar entities and don't have permissions to rez them, unless user has OKed + // Don't continue login to the domain if have avatar entities and don't have permissions to rez them, unless user has OKed // continuing login. if (!newPermissions.can(NodePermissions::Permission::canRezAvatarEntities) && (!adjustedPermissions || !_domainHandler.canConnectWithoutAvatarEntities())) { @@ -926,7 +926,7 @@ void NodeList::pingPunchForInactiveNode(const SharedNodePointer& node) { if (node->getConnectionAttempts() > 0 && node->getConnectionAttempts() % NUM_DEBUG_CONNECTION_ATTEMPTS == 0) { qCDebug(networking) << "No response to UDP hole punch pings for node" << node->getUUID() << "in last 2 s."; } - + auto nodeID = node->getUUID(); // send the ping packet to the local and public sockets for this node diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 7af0dc405f..bbc0a3e0d9 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -71,6 +71,8 @@ public: void setAssignmentServerSocket(const SockAddr& serverSocket) { _assignmentServerSocket = serverSocket; } void sendAssignment(Assignment& assignment); + void disableDomainPortAutoDiscovery(bool disabled = false) { _domainPortAutoDiscovery = !disabled; }; + void setIsShuttingDown(bool isShuttingDown) { _isShuttingDown = isShuttingDown; } void ignoreNodesInRadius(bool enabled = true); @@ -106,7 +108,7 @@ public: public slots: void reset(QString reason, bool skipDomainHandlerReset = false); void resetFromDomainHandler() { reset("Reset from Domain Handler", true); } - + void sendDomainServerCheckIn(); void handleDSPathQuery(const QString& newPath); @@ -183,6 +185,7 @@ private: bool _requestsDomainListData { false }; bool _sendDomainServerCheckInEnabled { true }; + bool _domainPortAutoDiscovery { true }; mutable QReadWriteLock _ignoredSetLock; tbb::concurrent_unordered_set _ignoredNodeIDs; diff --git a/libraries/render-utils/CMakeLists.txt b/libraries/render-utils/CMakeLists.txt index 4c444bcd15..904e7ea94c 100644 --- a/libraries/render-utils/CMakeLists.txt +++ b/libraries/render-utils/CMakeLists.txt @@ -16,3 +16,6 @@ if (NOT ANDROID) target_nsight() endif () +if (WIN32) + add_compile_definitions(_USE_MATH_DEFINES) +endif() diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index dd3bcd0587..1178ca3ab1 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1624,7 +1624,7 @@ std::set Model::getMeshIDsFromMaterialID(QString parentMaterialNam }; if (parentMaterialName.length() > 2 && parentMaterialName.startsWith("[") && parentMaterialName.endsWith("]")) { - QStringList list = parentMaterialName.split(",", QString::SkipEmptyParts); + QStringList list = parentMaterialName.split(",", Qt::SkipEmptyParts); for (int i = 0; i < list.length(); i++) { auto& target = list[i]; if (i == 0) { diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 6627f75ae6..c1578265e3 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -187,7 +187,7 @@ void inputControllerFromScriptValue(const QScriptValue &object, controller::Inpu // // Extract the url portion of a url that has been encoded with encodeEntityIdIntoEntityUrl(...) QString extractUrlFromEntityUrl(const QString& url) { - auto parts = url.split(' ', QString::SkipEmptyParts); + auto parts = url.split(' ', Qt::SkipEmptyParts); if (parts.length() > 0) { return parts[0]; } else { @@ -2386,7 +2386,7 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co bool passList = false; // assume unsafe QString whitelistPrefix = "[WHITELIST ENTITY SCRIPTS]"; QList safeURLPrefixes = { "file:///", "atp:", "cache:" }; - safeURLPrefixes += qEnvironmentVariable("EXTRA_WHITELIST").trimmed().split(QRegExp("\\s*,\\s*"), QString::SkipEmptyParts); + safeURLPrefixes += qEnvironmentVariable("EXTRA_WHITELIST").trimmed().split(QRegExp("\\s*,\\s*"), Qt::SkipEmptyParts); // Entity Script Whitelist toggle check. Setting::Handle whitelistEnabled {"private/whitelistEnabled", false }; @@ -2397,7 +2397,7 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co // Pull SAFEURLS from the Interface.JSON settings. QVariant raw = Setting::Handle("private/settingsSafeURLS").get(); - QStringList settingsSafeURLS = raw.toString().trimmed().split(QRegExp("\\s*[,\r\n]+\\s*"), QString::SkipEmptyParts); + QStringList settingsSafeURLS = raw.toString().trimmed().split(QRegExp("\\s*[,\r\n]+\\s*"), Qt::SkipEmptyParts); safeURLPrefixes += settingsSafeURLS; // END Pull SAFEURLS from the Interface.JSON settings. diff --git a/libraries/shared/CMakeLists.txt b/libraries/shared/CMakeLists.txt index 57904be586..59fb4d81ab 100644 --- a/libraries/shared/CMakeLists.txt +++ b/libraries/shared/CMakeLists.txt @@ -7,6 +7,7 @@ setup_hifi_library(Gui Network Script) if (WIN32) target_link_libraries(${TARGET_NAME} Wbemuuid.lib) + add_compile_definitions(_USE_MATH_DEFINES) endif() if (ANDROID) diff --git a/libraries/shared/src/shared/FileUtils.cpp b/libraries/shared/src/shared/FileUtils.cpp index 164af091de..52c0ee01f9 100644 --- a/libraries/shared/src/shared/FileUtils.cpp +++ b/libraries/shared/src/shared/FileUtils.cpp @@ -68,7 +68,7 @@ QString FileUtils::readFile(const QString& filename) { } QStringList FileUtils::readLines(const QString& filename, QString::SplitBehavior splitBehavior) { - return readFile(filename).split(QRegularExpression("[\\r\\n]"), QString::SkipEmptyParts); + return readFile(filename).split(QRegularExpression("[\\r\\n]"), Qt::SkipEmptyParts); } void FileUtils::locateFile(const QString& filePath) { diff --git a/pkg-scripts/vircadia-assignment-client.service b/pkg-scripts/vircadia-assignment-client.service index 9c86e4e874..be5b450519 100644 --- a/pkg-scripts/vircadia-assignment-client.service +++ b/pkg-scripts/vircadia-assignment-client.service @@ -1,5 +1,5 @@ [Unit] -Description=Assignment client service for Vircadia server +Description=Assignment client service for the Vircadia server After=network.target PartOf=vircadia-server.target diff --git a/pkg-scripts/vircadia-assignment-client@.service b/pkg-scripts/vircadia-assignment-client@.service index 4684947426..4595bbf9f7 100644 --- a/pkg-scripts/vircadia-assignment-client@.service +++ b/pkg-scripts/vircadia-assignment-client@.service @@ -1,5 +1,5 @@ [Unit] -Description=Assignment client service for Vircadia server +Description=Assignment client service for the Vircadia server After=network.target PartOf=vircadia-server@%i.target @@ -14,7 +14,7 @@ User=vircadia Group=vircadia #LimitCORE=infinity #ExecStart=/opt/vircadia/assignment-client -n 6 -ExecStart=/opt/vircadia/assignment-client --min 6 --max 20 --server-port $HIFI_DOMAIN_SERVER_PORT +ExecStart=/opt/vircadia/assignment-client --min 6 --max 20 --server-port $HIFI_DOMAIN_SERVER_PORT --disable-domain-port-auto-discovery [Install] WantedBy=multi-user.target diff --git a/screenshare/package-lock.json b/screenshare/package-lock.json index 6bb34b21a5..16a9828357 100644 --- a/screenshare/package-lock.json +++ b/screenshare/package-lock.json @@ -1014,9 +1014,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "pend": { diff --git a/scripts/communityScripts/explore/explore.html b/scripts/communityScripts/explore/explore.html index c147dba134..51f2045915 100644 --- a/scripts/communityScripts/explore/explore.html +++ b/scripts/communityScripts/explore/explore.html @@ -13,8 +13,18 @@ #component-templates { display: none; } + + .thumbnailItem .d-flex { + background: rgba(0, 0, 0, 0.2); + backdrop-filter: blur(5px); + text-shadow: 1px 1px 2px black, 0 0 25px black, 0 0 5px black; + } + + .thumbnailItemHover .d-flex { + background: rgba(100, 100, 100, 0.2); + } - +
@@ -22,7 +32,7 @@ @@ -30,7 +40,7 @@ mdi-close - Add Location + Add Location Beacon Save @@ -101,30 +111,28 @@ @@ -230,7 +238,7 @@ Go Home @@ -238,7 +246,7 @@ Go Back @@ -246,14 +254,14 @@ Go Forward + mdi-map-marker-plus + -->
@@ -286,22 +294,75 @@ +