diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 23e8c0d965..5833d8a764 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -302,7 +302,7 @@ void OctreeServer::initHTTPManager(int port) { _httpManager = new HTTPManager(port, documentRoot, this, this); } -bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url) { +bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { #ifdef FORCE_CRASH if (connection->requestOperation() == QNetworkAccessManager::GetOperation diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index fda3187892..aa0c419dd4 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -115,7 +115,7 @@ public: static int howManyThreadsDidHandlePacketSend(quint64 since = 0); static int howManyThreadsDidCallWriteDatagram(quint64 since = 0); - bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url); + bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler); virtual void aboutToFinish(); void forceNodeShutdown(SharedNodePointer node); diff --git a/domain-server/resources/web/assignment/scripts/.gitignore b/domain-server/resources/web/assignment/scripts/.gitignore new file mode 100644 index 0000000000..86d0cb2726 --- /dev/null +++ b/domain-server/resources/web/assignment/scripts/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore \ No newline at end of file diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index fa05b1cce9..48b3b15e8f 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -33,9 +33,24 @@ var viewHelpers = { input_type = _.has(setting, 'type') ? setting.type : "text" form_group += ""; - form_group += "" + + if (setting.type === 'select') { + form_group += "" + + form_group += "" + } else { + form_group += "" + } + form_group += "" + setting.help + "" } @@ -90,6 +105,11 @@ $(document).ready(function(){ $('#settings-form').on('click', '#choose-domain-btn', function(){ chooseFromHighFidelityDomains($(this)) }) + + $('#settings-form').on('change', 'select', function(){ + console.log("Changed" + $(this)) + $("input[name='" + $(this).attr('data-hidden-input') + "']").val($(this).val()).change() + }) var panelsSource = $('#panels-template').html() Settings.panelsTemplate = _.template(panelsSource) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index fb475f681d..786fd58d61 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1047,16 +1047,17 @@ const char ASSIGNMENT_SCRIPT_HOST_LOCATION[] = "resources/web/assignment"; QString pathForAssignmentScript(const QUuid& assignmentUUID) { QString newPath(ASSIGNMENT_SCRIPT_HOST_LOCATION); - newPath += "/"; + newPath += "/scripts/"; // append the UUID for this script as the new filename, remove the curly braces newPath += uuidStringWithoutCurlyBraces(assignmentUUID); return newPath; } -bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url) { +bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { const QString JSON_MIME_TYPE = "application/json"; const QString URI_ASSIGNMENT = "/assignment"; + const QString URI_ASSIGNMENT_SCRIPTS = URI_ASSIGNMENT + "/scripts"; const QString URI_NODES = "/nodes"; const QString UUID_REGEX_STRING = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"; @@ -1067,7 +1068,7 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url } // check if this is a request for a scripted assignment (with a temp unique UUID) - const QString ASSIGNMENT_REGEX_STRING = QString("\\%1\\/(%2)\\/?$").arg(URI_ASSIGNMENT).arg(UUID_REGEX_STRING); + const QString ASSIGNMENT_REGEX_STRING = QString("\\%1\\/(%2)\\/?$").arg(URI_ASSIGNMENT).arg(UUID_REGEX_STRING); QRegExp assignmentRegex(ASSIGNMENT_REGEX_STRING); if (connection->requestOperation() == QNetworkAccessManager::GetOperation @@ -1086,11 +1087,11 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url // via correct URL for the script so the client can download QUrl scriptURL = url; - scriptURL.setPath(URI_ASSIGNMENT + "/" + scriptURL.setPath(URI_ASSIGNMENT + "/scripts/" + uuidStringWithoutCurlyBraces(pendingData->getAssignmentUUID())); // have the HTTPManager serve the appropriate script file - return _httpManager.handleHTTPRequest(connection, scriptURL); + return _httpManager.handleHTTPRequest(connection, scriptURL, true); } } } @@ -1261,16 +1262,21 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url // create a file with the GUID of the assignment in the script host location QFile scriptFile(newPath); - scriptFile.open(QIODevice::WriteOnly); - scriptFile.write(formData[0].second); - - qDebug() << qPrintable(QString("Saved a script for assignment at %1%2") - .arg(newPath).arg(assignmentPool == emptyPool ? "" : " - pool is " + assignmentPool)); - - // add the script assigment to the assignment queue - SharedAssignmentPointer sharedScriptedAssignment(scriptAssignment); - _unfulfilledAssignments.enqueue(sharedScriptedAssignment); - _allAssignments.insert(sharedScriptedAssignment->getUUID(), sharedScriptedAssignment); + if (scriptFile.open(QIODevice::WriteOnly)) { + scriptFile.write(formData[0].second); + + qDebug() << qPrintable(QString("Saved a script for assignment at %1%2") + .arg(newPath).arg(assignmentPool == emptyPool ? "" : " - pool is " + assignmentPool)); + + // add the script assigment to the assignment queue + SharedAssignmentPointer sharedScriptedAssignment(scriptAssignment); + _unfulfilledAssignments.enqueue(sharedScriptedAssignment); + _allAssignments.insert(sharedScriptedAssignment->getUUID(), sharedScriptedAssignment); + } else { + // unable to save script for assignment - we shouldn't be here but debug it out + qDebug() << "Unable to save a script for assignment at" << newPath; + qDebug() << "Script will not be added to queue"; + } } // respond with a 200 code for successful upload @@ -1319,7 +1325,7 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url const QString HIFI_SESSION_COOKIE_KEY = "DS_WEB_SESSION_UUID"; -bool DomainServer::handleHTTPSRequest(HTTPSConnection* connection, const QUrl &url) { +bool DomainServer::handleHTTPSRequest(HTTPSConnection* connection, const QUrl &url, bool skipSubHandler) { const QString URI_OAUTH = "/oauth"; qDebug() << "HTTPS request received at" << url.toString(); if (url.path() == URI_OAUTH) { diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 44b8a15901..57d62291bd 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -43,8 +43,8 @@ public: static int const EXIT_CODE_REBOOT; - bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url); - bool handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url); + bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false); + bool handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url, bool skipSubHandler = false); public slots: /// Called by NodeList to inform us a node has been added diff --git a/examples/editModels.js b/examples/editModels.js index 5c426c9fb3..cbc215d0aa 100644 --- a/examples/editModels.js +++ b/examples/editModels.js @@ -2395,7 +2395,7 @@ function Tooltip() { this.x = 285; this.y = 115; this.width = 500; - this.height = 180; // 145; + this.height = 300; // 145; this.margin = 5; this.decimals = 3; @@ -2406,8 +2406,8 @@ function Tooltip() { height: this.height, margin: this.margin, text: "", - color: { red: 128, green: 128, blue: 128 }, - alpha: 0.2, + color: { red: 228, green: 228, blue: 228 }, + alpha: 0.5, visible: false }); this.show = function (doShow) { diff --git a/examples/leapHands.js b/examples/leapHands.js index cc50a328f8..1095a9f4dc 100644 --- a/examples/leapHands.js +++ b/examples/leapHands.js @@ -14,6 +14,7 @@ var leapHands = (function () { var isOnHMD, + LEAP_ON_HMD_MENU_ITEM = "Leap Motion on HMD", LEAP_OFFSET = 0.019, // Thickness of Leap Motion plus HMD clip HMD_OFFSET = 0.100, // Eyeballs to front surface of Oculus DK2 TODO: Confirm and make depend on device and eye relief hands, @@ -30,7 +31,11 @@ var leapHands = (function () { CALIBRATED = 2, CALIBRATION_TIME = 1000, // milliseconds PI = 3.141593, - isWindows; + isWindows, + avatarScale, + avatarFaceModelURL, + avatarSkeletonModelURL, + settingsTimer; function printSkeletonJointNames() { var jointNames, @@ -164,6 +169,10 @@ var leapHands = (function () { calibrationStatus = CALIBRATING; + avatarScale = MyAvatar.scale; + avatarFaceModelURL = MyAvatar.faceModelURL; + avatarSkeletonModelURL = MyAvatar.skeletonModelURL; + // Set avatar arms vertical, forearms horizontal, as "zero" position for calibration MyAvatar.setJointData("LeftArm", Quat.fromPitchYawRollDegrees(90.0, 0.0, -90.0)); MyAvatar.setJointData("LeftForeArm", Quat.fromPitchYawRollDegrees(90.0, 0.0, 180.0)); @@ -189,6 +198,37 @@ var leapHands = (function () { return false; } + function setIsOnHMD() { + isOnHMD = Menu.isOptionChecked(LEAP_ON_HMD_MENU_ITEM); + if (isOnHMD) { + print("Leap Motion: Is on HMD"); + + // Offset of Leap Motion origin from physical eye position + hands[0].zeroPosition = { x: 0.0, y: 0.0, z: HMD_OFFSET + LEAP_OFFSET }; + hands[1].zeroPosition = { x: 0.0, y: 0.0, z: HMD_OFFSET + LEAP_OFFSET }; + + calibrationStatus = CALIBRATED; + } else { + print("Leap Motion: Is on desk"); + calibrationStatus = UNCALIBRATED; + } + } + + function checkSettings() { + // There is no "scale changed" event so we need check periodically. + if (!isOnHMD && calibrationStatus > UNCALIBRATED && (MyAvatar.scale !== avatarScale + || MyAvatar.faceModelURL !== avatarFaceModelURL + || MyAvatar.skeletonModelURL !== avatarSkeletonModelURL)) { + print("Leap Motion: Recalibrate because avatar body or scale changed"); + calibrationStatus = UNCALIBRATED; + } + + // There is a "menu changed" event but we may as well check here. + if (isOnHMD !== Menu.isOptionChecked(LEAP_ON_HMD_MENU_ITEM)) { + setIsOnHMD(); + } + } + function setUp() { // TODO: Leap Motion controller joint naming doesn't match up with skeleton joint naming; numbers are out by 1. @@ -267,19 +307,9 @@ var leapHands = (function () { ] ]; - isOnHMD = Menu.isOptionChecked("Leap Motion on HMD"); - if (isOnHMD) { - print("Leap Motion is on HMD"); + setIsOnHMD(); - // Offset of Leap Motion origin from physical eye position - hands[0].zeroPosition = { x: 0.0, y: 0.0, z: HMD_OFFSET + LEAP_OFFSET }; - hands[1].zeroPosition = { x: 0.0, y: 0.0, z: HMD_OFFSET + LEAP_OFFSET }; - - calibrationStatus = CALIBRATED; - } else { - print("Leap Motion is on desk"); - calibrationStatus = UNCALIBRATED; - } + settingsTimer = Script.setInterval(checkSettings, 2000); } function moveHands() { @@ -302,7 +332,7 @@ var leapHands = (function () { if (hands[h].controller.isActive()) { - // Calibrate when and if a controller is first active. + // Calibrate if necessary. if (!checkCalibration()) { return; } @@ -430,6 +460,8 @@ var leapHands = (function () { i, j; + Script.clearInterval(settingsTimer); + for (h = 0; h < NUM_HANDS; h += 1) { Controller.releaseInputController(hands[h].controller); Controller.releaseInputController(wrists[h].controller); diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index ddc034801b..19f8ef6d5f 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -139,6 +139,8 @@ foreach(EXTERNAL ${OPTIONAL_EXTERNALS}) if (NOT APPLE OR NOT ${${EXTERNAL}_UPPERCASE} MATCHES "SIXENSE") target_link_libraries(${TARGET_NAME} ${${${EXTERNAL}_UPPERCASE}_LIBRARIES}) + elseif (APPLE AND NOT INSTALLER_BUILD) + add_definitions(-DSIXENSE_LIB_FILENAME=\"${${${EXTERNAL}_UPPERCASE}_LIBRARY_RELEASE}\") endif () endif () endforeach() diff --git a/interface/src/devices/SixenseManager.cpp b/interface/src/devices/SixenseManager.cpp index c3d694d06c..f5d838f95b 100644 --- a/interface/src/devices/SixenseManager.cpp +++ b/interface/src/devices/SixenseManager.cpp @@ -96,15 +96,28 @@ void SixenseManager::initialize() { #ifdef __APPLE__ if (!_sixenseLibrary) { - const QString SIXENSE_LIBRARY_NAME = "libsixense_x64.dylib"; - _sixenseLibrary = new QLibrary(SIXENSE_LIBRARY_NAME); + +#ifdef SIXENSE_LIB_FILENAME + _sixenseLibrary = new QLibrary(SIXENSE_LIB_FILENAME); +#else + const QString SIXENSE_LIBRARY_NAME = "libsixense_x64"; + QString frameworkSixenseLibrary = QCoreApplication::applicationDirPath() + "../Frameworks/" + + SIXENSE_LIBRARY_NAME; + + _sixenseLibrary = new QLibrary(frameworkSixenseLibrary); +#endif + } + + if (_sixenseLibrary->load()){ + qDebug() << "Loaded sixense library for hydra support -" << _sixenseLibrary->fileName(); + } else { + qDebug() << "Sixense library at" << _sixenseLibrary->fileName() << "failed to load." + << "Continuing without hydra support."; + return; } - qDebug() << "Initializing sixense library for hydra support - libsixense_x64.dylib load state is" - << _sixenseLibrary->isLoaded(); SixenseBaseFunction sixenseInit = (SixenseBaseFunction) _sixenseLibrary->resolve("sixenseInit"); #endif - sixenseInit(); _isInitialized = true; diff --git a/libraries/embedded-webserver/src/HTTPManager.cpp b/libraries/embedded-webserver/src/HTTPManager.cpp index ec5f16012e..702d709f72 100755 --- a/libraries/embedded-webserver/src/HTTPManager.cpp +++ b/libraries/embedded-webserver/src/HTTPManager.cpp @@ -40,8 +40,8 @@ void HTTPManager::incomingConnection(qintptr socketDescriptor) { } } -bool HTTPManager::handleHTTPRequest(HTTPConnection* connection, const QUrl& url) { - if (requestHandledByRequestHandler(connection, url)) { +bool HTTPManager::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { + if (!skipSubHandler && requestHandledByRequestHandler(connection, url)) { // this request was handled by our request handler object // so we don't need to attempt to do so in the document root return true; diff --git a/libraries/embedded-webserver/src/HTTPManager.h b/libraries/embedded-webserver/src/HTTPManager.h index e8745521dc..83c4103c15 100755 --- a/libraries/embedded-webserver/src/HTTPManager.h +++ b/libraries/embedded-webserver/src/HTTPManager.h @@ -24,7 +24,7 @@ class HTTPSConnection; class HTTPRequestHandler { public: /// Handles an HTTP request. - virtual bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url) = 0; + virtual bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false) = 0; }; /// Handles HTTP connections @@ -34,7 +34,7 @@ public: /// Initializes the manager. HTTPManager(quint16 port, const QString& documentRoot, HTTPRequestHandler* requestHandler = NULL, QObject* parent = 0); - bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url); + bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false); protected: /// Accepts all pending connections diff --git a/libraries/embedded-webserver/src/HTTPSManager.cpp b/libraries/embedded-webserver/src/HTTPSManager.cpp index 4e40a0e02c..94e1a35e20 100644 --- a/libraries/embedded-webserver/src/HTTPSManager.cpp +++ b/libraries/embedded-webserver/src/HTTPSManager.cpp @@ -38,12 +38,12 @@ void HTTPSManager::incomingConnection(qintptr socketDescriptor) { } } -bool HTTPSManager::handleHTTPRequest(HTTPConnection* connection, const QUrl &url) { - return handleHTTPSRequest(reinterpret_cast(connection), url); +bool HTTPSManager::handleHTTPRequest(HTTPConnection* connection, const QUrl &url, bool skipSubHandler) { + return handleHTTPSRequest(reinterpret_cast(connection), url, skipSubHandler); } -bool HTTPSManager::handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url) { - return HTTPManager::handleHTTPRequest(connection, url); +bool HTTPSManager::handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url, bool skipSubHandler) { + return HTTPManager::handleHTTPRequest(connection, url, skipSubHandler); } bool HTTPSManager::requestHandledByRequestHandler(HTTPConnection* connection, const QUrl& url) { diff --git a/libraries/embedded-webserver/src/HTTPSManager.h b/libraries/embedded-webserver/src/HTTPSManager.h index fe7c4dc065..66c0c76d0b 100644 --- a/libraries/embedded-webserver/src/HTTPSManager.h +++ b/libraries/embedded-webserver/src/HTTPSManager.h @@ -20,7 +20,7 @@ class HTTPSRequestHandler : public HTTPRequestHandler { public: /// Handles an HTTPS request - virtual bool handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url) = 0; + virtual bool handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url, bool skipSubHandler = false) = 0; }; class HTTPSManager : public HTTPManager, public HTTPSRequestHandler { @@ -35,8 +35,8 @@ public: void setCertificate(const QSslCertificate& certificate) { _certificate = certificate; } void setPrivateKey(const QSslKey& privateKey) { _privateKey = privateKey; } - bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url); - bool handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url); + bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false); + bool handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url, bool skipSubHandler = false); protected: void incomingConnection(qintptr socketDescriptor);