From 335ed667bb1958e6f310cfeb64bcd3156d60978b Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 29 Jun 2016 16:05:17 -0700 Subject: [PATCH 01/26] dk2 snapshot takes picture of HMD window --- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 14 ++++++++++++++ .../src/display-plugins/hmd/HmdDisplayPlugin.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index f1aa1edc81..38fb86dc28 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -38,6 +38,20 @@ QRect HmdDisplayPlugin::getRecommendedOverlayRect() const { return CompositorHelper::VIRTUAL_SCREEN_RECOMMENDED_OVERLAY_RECT; } +QImage HmdDisplayPlugin::getScreenshot() const { + using namespace oglplus; + QImage screenshot(_compositeFramebuffer->size.x, _compositeFramebuffer->size.y, QImage::Format_RGBA8888); + auto windowSize = toGlm(_container->getPrimaryWidget()->size()); + _compositeFramebuffer->Bound(Framebuffer::Target::Read, [&] { + Context::BlitFramebuffer( + 0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, + 0, 0, windowSize.x, windowSize.y, + BufferSelectBit::ColorBuffer, BlitFilter::Nearest); + Context::ReadPixels(0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, enums::PixelDataFormat::RGBA, enums::PixelDataType::UnsignedByte, screenshot.bits()); + }); + return screenshot.mirrored(false, true); +} + bool HmdDisplayPlugin::internalActivate() { _monoPreview = _container->getBoolSetting("monoPreview", DEFAULT_MONO_VIEW); diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index fada15d864..9a8d89a2c8 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -27,6 +27,8 @@ public: void setEyeRenderPose(uint32_t frameIndex, Eye eye, const glm::mat4& pose) override final; bool isDisplayVisible() const override { return isHmdMounted(); } + QImage getScreenshot() const override; + QRect getRecommendedOverlayRect() const override final; virtual glm::mat4 getHeadPose() const override; From 40d584021a47e2c0d1960f13a07ac98115263cf1 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 29 Jun 2016 18:09:46 -0700 Subject: [PATCH 02/26] replace old code completely, removed unnecessary blit --- .../src/display-plugins/OpenGLDisplayPlugin.cpp | 10 ++++++---- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 14 -------------- .../src/display-plugins/hmd/HmdDisplayPlugin.h | 2 -- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index b72f52351f..8650c086e3 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -647,12 +647,14 @@ void OpenGLDisplayPlugin::withMainThreadContext(std::function f) const { } QImage OpenGLDisplayPlugin::getScreenshot() const { - QImage result; + using namespace oglplus; + QImage screenshot(_compositeFramebuffer->size.x, _compositeFramebuffer->size.y, QImage::Format_RGBA8888); withMainThreadContext([&] { - static auto widget = _container->getPrimaryWidget(); - result = widget->grabFrameBuffer(); + auto windowSize = toGlm(_container->getPrimaryWidget()->size()); + Framebuffer::Bind(Framebuffer::Target::Read, _compositeFramebuffer->fbo); + Context::ReadPixels(0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, enums::PixelDataFormat::RGBA, enums::PixelDataType::UnsignedByte, screenshot.bits()); }); - return result; + return screenshot.mirrored(false, true); } uint32_t OpenGLDisplayPlugin::getSceneTextureId() const { diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 38fb86dc28..f1aa1edc81 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -38,20 +38,6 @@ QRect HmdDisplayPlugin::getRecommendedOverlayRect() const { return CompositorHelper::VIRTUAL_SCREEN_RECOMMENDED_OVERLAY_RECT; } -QImage HmdDisplayPlugin::getScreenshot() const { - using namespace oglplus; - QImage screenshot(_compositeFramebuffer->size.x, _compositeFramebuffer->size.y, QImage::Format_RGBA8888); - auto windowSize = toGlm(_container->getPrimaryWidget()->size()); - _compositeFramebuffer->Bound(Framebuffer::Target::Read, [&] { - Context::BlitFramebuffer( - 0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, - 0, 0, windowSize.x, windowSize.y, - BufferSelectBit::ColorBuffer, BlitFilter::Nearest); - Context::ReadPixels(0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, enums::PixelDataFormat::RGBA, enums::PixelDataType::UnsignedByte, screenshot.bits()); - }); - return screenshot.mirrored(false, true); -} - bool HmdDisplayPlugin::internalActivate() { _monoPreview = _container->getBoolSetting("monoPreview", DEFAULT_MONO_VIEW); diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index 9a8d89a2c8..fada15d864 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -27,8 +27,6 @@ public: void setEyeRenderPose(uint32_t frameIndex, Eye eye, const glm::mat4& pose) override final; bool isDisplayVisible() const override { return isHmdMounted(); } - QImage getScreenshot() const override; - QRect getRecommendedOverlayRect() const override final; virtual glm::mat4 getHeadPose() const override; From be102ba9265a8915ec947414bae05fb43933704f Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Thu, 30 Jun 2016 10:05:57 -0700 Subject: [PATCH 03/26] remove unused variable --- .../display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 8650c086e3..18f39cd3df 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -650,7 +650,6 @@ QImage OpenGLDisplayPlugin::getScreenshot() const { using namespace oglplus; QImage screenshot(_compositeFramebuffer->size.x, _compositeFramebuffer->size.y, QImage::Format_RGBA8888); withMainThreadContext([&] { - auto windowSize = toGlm(_container->getPrimaryWidget()->size()); Framebuffer::Bind(Framebuffer::Target::Read, _compositeFramebuffer->fbo); Context::ReadPixels(0, 0, _compositeFramebuffer->size.x, _compositeFramebuffer->size.y, enums::PixelDataFormat::RGBA, enums::PixelDataType::UnsignedByte, screenshot.bits()); }); From 38776fe007220cc7b57fdc68e2ac975a359ae22e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 30 Jun 2016 14:35:27 -0700 Subject: [PATCH 04/26] Fix multiple sessions being created for some users If a user didn't have send-data activated they don't have their session id sent in the header of requests, but instead send it inside the request body. The session id being send in the request included curly braces which the server considers invalid. --- interface/src/DiscoverabilityManager.cpp | 6 ++---- libraries/networking/src/AccountManager.h | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index c4d985419e..6550edff18 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -80,8 +80,7 @@ void DiscoverabilityManager::updateLocation() { locationObject.insert(FRIENDS_ONLY_KEY_IN_LOCATION, (_mode.get() == Discoverability::Friends)); // if we have a session ID add it now, otherwise add a null value - auto sessionID = accountManager->getSessionID(); - rootObject[SESSION_ID_KEY] = sessionID.isNull() ? QJsonValue() : sessionID.toString(); + rootObject[SESSION_ID_KEY] = accountManager->getSessionIDWithoutCurlyBraces(); JSONCallbackParameters callbackParameters; callbackParameters.jsonCallbackReceiver = this; @@ -111,8 +110,7 @@ void DiscoverabilityManager::updateLocation() { callbackParameters.jsonCallbackMethod = "handleHeartbeatResponse"; QJsonObject heartbeatObject; - auto sessionID = accountManager->getSessionID(); - heartbeatObject[SESSION_ID_KEY] = sessionID.isNull() ? QJsonValue() : sessionID.toString(); + heartbeatObject[SESSION_ID_KEY] = accountManager->getSessionIDWithoutCurlyBraces(); accountManager->sendRequest(API_USER_HEARTBEAT_PATH, AccountManagerAuth::Optional, QNetworkAccessManager::PutOperation, callbackParameters, diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index c12f663d3e..7a8d2a72fa 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -24,6 +24,8 @@ #include +#include "UUID.h" + class JSONCallbackParameters { public: JSONCallbackParameters(QObject* jsonCallbackReceiver = nullptr, const QString& jsonCallbackMethod = QString(), @@ -86,6 +88,7 @@ public: static QJsonObject dataObjectFromResponse(QNetworkReply& requestReply); + QString getSessionIDWithoutCurlyBraces() const { return uuidStringWithoutCurlyBraces(_sessionID); } QUuid getSessionID() const { return _sessionID; } void setSessionID(const QUuid& sessionID) { _sessionID = sessionID; } From 49da7d9a61beae00f125694ca86dcc45c8a6b526 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 30 Jun 2016 14:43:27 -0700 Subject: [PATCH 05/26] Remove sending of session id in request body in favor of header --- interface/src/DiscoverabilityManager.cpp | 9 +-------- libraries/networking/src/AccountManager.cpp | 8 ++------ libraries/networking/src/AccountManager.h | 1 - 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index 6550edff18..4051bd8a1e 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -79,9 +79,6 @@ void DiscoverabilityManager::updateLocation() { const QString FRIENDS_ONLY_KEY_IN_LOCATION = "friends_only"; locationObject.insert(FRIENDS_ONLY_KEY_IN_LOCATION, (_mode.get() == Discoverability::Friends)); - // if we have a session ID add it now, otherwise add a null value - rootObject[SESSION_ID_KEY] = accountManager->getSessionIDWithoutCurlyBraces(); - JSONCallbackParameters callbackParameters; callbackParameters.jsonCallbackReceiver = this; callbackParameters.jsonCallbackMethod = "handleHeartbeatResponse"; @@ -109,12 +106,8 @@ void DiscoverabilityManager::updateLocation() { callbackParameters.jsonCallbackReceiver = this; callbackParameters.jsonCallbackMethod = "handleHeartbeatResponse"; - QJsonObject heartbeatObject; - heartbeatObject[SESSION_ID_KEY] = accountManager->getSessionIDWithoutCurlyBraces(); - accountManager->sendRequest(API_USER_HEARTBEAT_PATH, AccountManagerAuth::Optional, - QNetworkAccessManager::PutOperation, callbackParameters, - QJsonDocument(heartbeatObject).toJson()); + QNetworkAccessManager::PutOperation, callbackParameters); } } diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index e49bf5d5a5..ed325b8d69 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -220,12 +220,8 @@ void AccountManager::sendRequest(const QString& path, networkRequest.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter()); - // if we're allowed to send usage data, include whatever the current session ID is with this request - auto& activityLogger = UserActivityLogger::getInstance(); - if (activityLogger.isEnabled()) { - networkRequest.setRawHeader(METAVERSE_SESSION_ID_HEADER, - uuidStringWithoutCurlyBraces(_sessionID).toLocal8Bit()); - } + networkRequest.setRawHeader(METAVERSE_SESSION_ID_HEADER, + uuidStringWithoutCurlyBraces(_sessionID).toLocal8Bit()); QUrl requestURL = _authURL; diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index 7a8d2a72fa..cdf7e3f1cd 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -88,7 +88,6 @@ public: static QJsonObject dataObjectFromResponse(QNetworkReply& requestReply); - QString getSessionIDWithoutCurlyBraces() const { return uuidStringWithoutCurlyBraces(_sessionID); } QUuid getSessionID() const { return _sessionID; } void setSessionID(const QUuid& sessionID) { _sessionID = sessionID; } From dd73f0c333116a1b78c8553206b8cc6262b15dec Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 30 Jun 2016 14:50:29 -0700 Subject: [PATCH 06/26] Remove unused header from AccountManager.h --- libraries/networking/src/AccountManager.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index cdf7e3f1cd..c12f663d3e 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -24,8 +24,6 @@ #include -#include "UUID.h" - class JSONCallbackParameters { public: JSONCallbackParameters(QObject* jsonCallbackReceiver = nullptr, const QString& jsonCallbackMethod = QString(), From 86f8b578412bf0f905aa9df05f10bf794a72dc9b Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 30 Jun 2016 15:16:28 -0700 Subject: [PATCH 07/26] Highlight controls based on activeFocus, not focus --- interface/resources/qml/controls-uit/SpinBox.qml | 12 ++++++------ interface/resources/qml/controls-uit/TextField.qml | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/interface/resources/qml/controls-uit/SpinBox.qml b/interface/resources/qml/controls-uit/SpinBox.qml index 5d78cfc5a8..a1237d4bc7 100755 --- a/interface/resources/qml/controls-uit/SpinBox.qml +++ b/interface/resources/qml/controls-uit/SpinBox.qml @@ -36,15 +36,15 @@ SpinBox { id: spinStyle background: Rectangle { color: isLightColorScheme - ? (spinBox.focus ? hifi.colors.white : hifi.colors.lightGray) - : (spinBox.focus ? hifi.colors.black : hifi.colors.baseGrayShadow) + ? (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGray) + : (spinBox.activeFocus ? hifi.colors.black : hifi.colors.baseGrayShadow) border.color: spinBoxLabelInside.visible ? spinBoxLabelInside.color : hifi.colors.primaryHighlight - border.width: spinBox.focus ? spinBoxLabelInside.visible ? 2 : 1 : 0 + border.width: spinBox.activeFocus ? spinBoxLabelInside.visible ? 2 : 1 : 0 } textColor: isLightColorScheme - ? (spinBox.focus ? hifi.colors.black : hifi.colors.lightGray) - : (spinBox.focus ? hifi.colors.white : hifi.colors.lightGrayText) + ? (spinBox.activeFocus ? hifi.colors.black : hifi.colors.lightGray) + : (spinBox.activeFocus ? hifi.colors.white : hifi.colors.lightGrayText) selectedTextColor: hifi.colors.black selectionColor: hifi.colors.primaryHighlight @@ -96,7 +96,7 @@ SpinBox { anchors.fill: parent propagateComposedEvents: true onWheel: { - if(spinBox.focus) + if(spinBox.activeFocus) wheel.accepted = false else wheel.accepted = true diff --git a/interface/resources/qml/controls-uit/TextField.qml b/interface/resources/qml/controls-uit/TextField.qml index 79027cdc3b..65fab00700 100644 --- a/interface/resources/qml/controls-uit/TextField.qml +++ b/interface/resources/qml/controls-uit/TextField.qml @@ -36,14 +36,14 @@ TextField { style: TextFieldStyle { textColor: isLightColorScheme - ? (textField.focus ? hifi.colors.black : hifi.colors.lightGray) - : (textField.focus ? hifi.colors.white : hifi.colors.lightGrayText) + ? (textField.activeFocus ? hifi.colors.black : hifi.colors.lightGray) + : (textField.activeFocus ? hifi.colors.white : hifi.colors.lightGrayText) background: Rectangle { color: isLightColorScheme - ? (textField.focus ? hifi.colors.white : hifi.colors.textFieldLightBackground) - : (textField.focus ? hifi.colors.black : hifi.colors.baseGrayShadow) + ? (textField.activeFocus ? hifi.colors.white : hifi.colors.textFieldLightBackground) + : (textField.activeFocus ? hifi.colors.black : hifi.colors.baseGrayShadow) border.color: hifi.colors.primaryHighlight - border.width: textField.focus ? 1 : 0 + border.width: textField.activeFocus ? 1 : 0 radius: isSearchField ? textField.height / 2 : 0 HiFiGlyphs { From ce54f1b1d12dda0ff2b9ea14fff0d6f9d2a01311 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 30 Jun 2016 15:18:14 -0700 Subject: [PATCH 08/26] Improve desktop 'unfocus' functionality --- interface/resources/qml/desktop/Desktop.qml | 26 ++++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/interface/resources/qml/desktop/Desktop.qml b/interface/resources/qml/desktop/Desktop.qml index 27fa9692b9..59d5b435ba 100644 --- a/interface/resources/qml/desktop/Desktop.qml +++ b/interface/resources/qml/desktop/Desktop.qml @@ -30,6 +30,7 @@ FocusScope { if (!repositionLocked) { d.handleSizeChanged(); } + } onHeightChanged: d.handleSizeChanged(); @@ -66,7 +67,6 @@ FocusScope { if (desktop.repositionLocked) { return; } - var oldRecommendedRect = recommendedRect; var newRecommendedRectJS = (typeof Controller === "undefined") ? Qt.rect(0,0,0,0) : Controller.getRecommendedOverlayRect(); var newRecommendedRect = Qt.rect(newRecommendedRectJS.x, newRecommendedRectJS.y, @@ -311,8 +311,8 @@ FocusScope { onPinnedChanged: { if (pinned) { - nullFocus.focus = true; - nullFocus.forceActiveFocus(); + desktop.focus = true; + desktop.forceActiveFocus(); // recalculate our non-pinned children hiddenChildren = d.findMatchingChildren(desktop, function(child){ @@ -486,17 +486,31 @@ FocusScope { } function unfocusWindows() { + // First find the active focus item, and unfocus it, all the way + // up the parent chain to the window + var currentFocus = offscreenWindow.activeFocusItem; + var targetWindow = d.getDesktopWindow(currentFocus); + while (currentFocus) { + if (currentFocus === targetWindow) { + break; + } + currentFocus.focus = false; + currentFocus = currentFocus.parent; + } + + // Unfocus all windows var windows = d.getTopLevelWindows(); for (var i = 0; i < windows.length; ++i) { windows[i].focus = false; } + + // For the desktop to have active focus desktop.focus = true; + desktop.forceActiveFocus(); } FocusHack { id: focusHack; } - FocusScope { id: nullFocus; } - Rectangle { id: focusDebugger; objectName: "focusDebugger" @@ -510,5 +524,5 @@ FocusScope { enabled: DebugQML onTriggered: focusDebugger.visible = !focusDebugger.visible } - + } From 167cb72a0ef03aadef3ba528f15202ee09ed4b14 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 30 Jun 2016 15:18:59 -0700 Subject: [PATCH 09/26] Don't auto-focus the filter field in running scripts --- interface/resources/qml/hifi/dialogs/RunningScripts.qml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/interface/resources/qml/hifi/dialogs/RunningScripts.qml b/interface/resources/qml/hifi/dialogs/RunningScripts.qml index 5457caccf1..3f05a140ae 100644 --- a/interface/resources/qml/hifi/dialogs/RunningScripts.qml +++ b/interface/resources/qml/hifi/dialogs/RunningScripts.qml @@ -53,11 +53,6 @@ ScrollingWindow { updateRunningScripts(); } - function setDefaultFocus() { - // Work around FocusScope of scrollable window. - filterEdit.forceActiveFocus(); - } - function updateRunningScripts() { var runningScripts = ScriptDiscoveryService.getRunning(); runningScriptsModel.clear() @@ -276,7 +271,6 @@ ScrollingWindow { isSearchField: true anchors.left: parent.left anchors.right: parent.right - focus: true colorScheme: hifi.colorSchemes.dark placeholderText: "Filter" onTextChanged: scriptsModel.filterRegExp = new RegExp("^.*" + text + ".*$", "i") From 14784a60888b4584d31db40d9c794ae9f653ee21 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 30 Jun 2016 15:22:13 -0700 Subject: [PATCH 10/26] Remove default focus on text fields --- scripts/developer/tests/playaPerformanceTest.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/developer/tests/playaPerformanceTest.qml b/scripts/developer/tests/playaPerformanceTest.qml index cd8171a0f6..028cfc9e1a 100644 --- a/scripts/developer/tests/playaPerformanceTest.qml +++ b/scripts/developer/tests/playaPerformanceTest.qml @@ -125,7 +125,6 @@ Rectangle { TextField { id: addressLine - focus: true anchors { left: parent.left; right: parent.right; top: row.bottom; margins: 16; From ff55644fe859a72da6e16e5b15d92f1e5da171b8 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 30 Jun 2016 16:24:11 -0700 Subject: [PATCH 11/26] stateful hud toolbar buttons --- interface/resources/qml/AddressBarDialog.qml | 1 + .../DialogsManagerScriptingInterface.cpp | 2 ++ .../DialogsManagerScriptingInterface.h | 1 + interface/src/ui/AddressBarDialog.cpp | 4 ++++ interface/src/ui/AddressBarDialog.h | 1 + interface/src/ui/DialogsManager.h | 2 ++ scripts/system/examples.js | 18 +++++++++++------- scripts/system/goto.js | 16 +++++++++++----- scripts/system/hmd.js | 19 ++++++++++++------- scripts/system/mute.js | 19 ++++++++++++++----- 10 files changed, 59 insertions(+), 24 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index a48804faba..dc060b70e1 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -30,6 +30,7 @@ Window { width: addressBarDialog.implicitWidth height: addressBarDialog.implicitHeight + onShownChanged: addressBarDialog.observeShownChanged(shown); Component.onCompleted: { root.parentChanged.connect(center); center(); diff --git a/interface/src/scripting/DialogsManagerScriptingInterface.cpp b/interface/src/scripting/DialogsManagerScriptingInterface.cpp index 80a8b4ac7c..cbca7ff4ff 100644 --- a/interface/src/scripting/DialogsManagerScriptingInterface.cpp +++ b/interface/src/scripting/DialogsManagerScriptingInterface.cpp @@ -18,6 +18,8 @@ DialogsManagerScriptingInterface::DialogsManagerScriptingInterface() { connect(DependencyManager::get().data(), &DialogsManager::addressBarToggled, this, &DialogsManagerScriptingInterface::addressBarToggled); + connect(DependencyManager::get().data(), &DialogsManager::addressBarShown, + this, &DialogsManagerScriptingInterface::addressBarShown); } void DialogsManagerScriptingInterface::toggleAddressBar() { diff --git a/interface/src/scripting/DialogsManagerScriptingInterface.h b/interface/src/scripting/DialogsManagerScriptingInterface.h index ef44e20d61..075b89f0e5 100644 --- a/interface/src/scripting/DialogsManagerScriptingInterface.h +++ b/interface/src/scripting/DialogsManagerScriptingInterface.h @@ -24,6 +24,7 @@ public slots: signals: void addressBarToggled(); + void addressBarShown(bool visible); }; #endif diff --git a/interface/src/ui/AddressBarDialog.cpp b/interface/src/ui/AddressBarDialog.cpp index ba0cf18d32..6fb437e312 100644 --- a/interface/src/ui/AddressBarDialog.cpp +++ b/interface/src/ui/AddressBarDialog.cpp @@ -16,6 +16,7 @@ #include "DependencyManager.h" #include "AddressManager.h" +#include "DialogsManager.h" HIFI_QML_DEF(AddressBarDialog) @@ -74,3 +75,6 @@ void AddressBarDialog::displayAddressNotFoundMessage() { OffscreenUi::critical("", "There is no address information for that user or place"); } +void AddressBarDialog::observeShownChanged(bool visible) { + DependencyManager::get()->emitAddressBarShown(visible); +} diff --git a/interface/src/ui/AddressBarDialog.h b/interface/src/ui/AddressBarDialog.h index b2751860cc..bbce52c67c 100644 --- a/interface/src/ui/AddressBarDialog.h +++ b/interface/src/ui/AddressBarDialog.h @@ -38,6 +38,7 @@ protected: Q_INVOKABLE void loadHome(); Q_INVOKABLE void loadBack(); Q_INVOKABLE void loadForward(); + Q_INVOKABLE void observeShownChanged(bool visible); bool _backEnabled; bool _forwardEnabled; diff --git a/interface/src/ui/DialogsManager.h b/interface/src/ui/DialogsManager.h index b8fa22ec83..c48c6df0e6 100644 --- a/interface/src/ui/DialogsManager.h +++ b/interface/src/ui/DialogsManager.h @@ -40,6 +40,7 @@ public: QPointer getHMDToolsDialog() const { return _hmdToolsDialog; } QPointer getLodToolsDialog() const { return _lodToolsDialog; } QPointer getOctreeStatsDialog() const { return _octreeStatsDialog; } + void emitAddressBarShown(bool visible) { emit addressBarShown(visible); } public slots: void toggleAddressBar(); @@ -60,6 +61,7 @@ public slots: signals: void addressBarToggled(); + void addressBarShown(bool visible); private slots: void hmdToolsClosed(); diff --git a/scripts/system/examples.js b/scripts/system/examples.js index a948f9e563..4d838bc8af 100644 --- a/scripts/system/examples.js +++ b/scripts/system/examples.js @@ -55,16 +55,20 @@ var toolBar = Toolbars.getToolbar("com.highfidelity.interface.toolbar.system"); var browseExamplesButton = toolBar.addButton({ imageURL: toolIconUrl + "examples-01.svg", objectName: "examples", - yOffset: 50, - alpha: 0.9, + buttonState: 1, + alpha: 0.9 }); -var browseExamplesButtonDown = false; - -browseExamplesButton.clicked.connect(function(){ +function onExamplesWindowVisibilityChanged() { + browseExamplesButton.writeProperty('buttonState', examplesWindow.visible ? 0 : 1); +} +function onClick() { toggleExamples(); -}); +} +browseExamplesButton.clicked.connect(onClick); +examplesWindow.visibleChanged.connect(onExamplesWindowVisibilityChanged); Script.scriptEnding.connect(function () { - browseExamplesButton.clicked.disconnect(); + browseExamplesButton.clicked.disconnect(onClick); + examplesWindow.visibleChanged.disconnect(onExamplesWindowVisibilityChanged); }); diff --git a/scripts/system/goto.js b/scripts/system/goto.js index a2ade02a78..4650e72dad 100644 --- a/scripts/system/goto.js +++ b/scripts/system/goto.js @@ -16,14 +16,20 @@ var button = toolBar.addButton({ objectName: "goto", imageURL: Script.resolvePath("assets/images/tools/directory-01.svg"), visible: true, - yOffset: 50, + buttonState: 1, alpha: 0.9, }); - -button.clicked.connect(function(){ + +function onAddressBarShown(visible) { + button.writeProperty('buttonState', visible ? 0 : 1); +} +function onClicked(){ DialogsManager.toggleAddressBar(); -}); +} +button.clicked.connect(onClicked); +DialogsManager.addressBarShown.connect(onAddressBarShown); Script.scriptEnding.connect(function () { - button.clicked.disconnect(); + button.clicked.disconnect(onClicked); + DialogsManager.addressBarShown.disconnect(onAddressBarShown); }); diff --git a/scripts/system/hmd.js b/scripts/system/hmd.js index 2965c0d254..0d6a273975 100644 --- a/scripts/system/hmd.js +++ b/scripts/system/hmd.js @@ -20,23 +20,28 @@ var desktopMenuItemName = "Desktop"; var toolBar = Toolbars.getToolbar("com.highfidelity.interface.toolbar.system"); var button; - +function onHmdChanged(isHmd) { + button.writeProperty('buttonState', isHmd ? 0 : 1); +} +function onClicked(){ + var isDesktop = Menu.isOptionChecked(desktopMenuItemName); + Menu.setIsOptionChecked(isDesktop ? headset : desktopMenuItemName, true); +} if (headset) { button = toolBar.addButton({ objectName: "hmdToggle", imageURL: Script.resolvePath("assets/images/tools/hmd-switch-01.svg"), visible: true, - yOffset: 50, alpha: 0.9, }); + onHmdChanged(HMD.active); - button.clicked.connect(function(){ - var isDesktop = Menu.isOptionChecked(desktopMenuItemName); - Menu.setIsOptionChecked(isDesktop ? headset : desktopMenuItemName, true); - }); + button.clicked.connect(onClicked); + HMD.displayModeChanged.connect(onHmdChanged); Script.scriptEnding.connect(function () { - button.clicked.disconnect(); + button.clicked.disconnect(onClicked); + HMD.displayModeChanged.disconnect(onHmdChanged); }); } diff --git a/scripts/system/mute.js b/scripts/system/mute.js index f66b6852ea..f91ecbafae 100644 --- a/scripts/system/mute.js +++ b/scripts/system/mute.js @@ -14,16 +14,25 @@ var toolBar = Toolbars.getToolbar("com.highfidelity.interface.toolbar.system"); var button = toolBar.addButton({ objectName: "mute", - imageURL: Script.resolvePath("assets/images/tools/microphone.svg"), + imageURL: Script.resolvePath("assets/images/tools/mic-01.svg"), visible: true, alpha: 0.9, }); - -button.clicked.connect(function(){ + +function onMuteToggled() { + // We could just toggle state, but we're less likely to get out of wack if we read the AudioDevice. + // muted => "on" button state => buttonState 1 + button.writeProperty('buttonState', AudioDevice.getMuted() ? 1 : 0); +} +onMuteToggled(); +function onClicked(){ var menuItem = "Mute Microphone"; Menu.setIsOptionChecked(menuItem, !Menu.isOptionChecked(menuItem)); -}); +} +button.clicked.connect(onClicked); +AudioDevice.muteToggled.connect(onMuteToggled); Script.scriptEnding.connect(function () { - button.clicked.disconnect(); + button.clicked.disconnect(onClicked); + AudioDevice.muteToggled.disconnect(onMuteToggled); }); From f03f5f3e683a807c989a569272d080c843021362 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 30 Jun 2016 16:47:10 -0700 Subject: [PATCH 12/26] new icons --- interface/resources/icons/hud-01.svg | 105 ----- interface/resources/icons/hud.svg | 258 ++++++++++++ interface/resources/qml/hifi/Desktop.qml | 2 +- .../assets/images/tools/directory-01.svg | 194 ---------- .../system/assets/images/tools/directory.svg | 366 ++++++++++++++++++ .../system/assets/images/tools/edit-01.svg | 94 ----- scripts/system/assets/images/tools/edit.svg | 234 +++++++++++ .../assets/images/tools/examples-01.svg | 306 --------------- .../assets/images/tools/hmd-switch-01.svg | 124 ------ scripts/system/assets/images/tools/market.svg | 258 ++++++++++++ scripts/system/assets/images/tools/mic.svg | 164 ++++++++ scripts/system/assets/images/tools/switch.svg | 230 +++++++++++ scripts/system/edit.js | 2 +- scripts/system/examples.js | 2 +- scripts/system/goto.js | 2 +- scripts/system/hmd.js | 2 +- scripts/system/mute.js | 2 +- 17 files changed, 1516 insertions(+), 829 deletions(-) delete mode 100644 interface/resources/icons/hud-01.svg create mode 100644 interface/resources/icons/hud.svg delete mode 100644 scripts/system/assets/images/tools/directory-01.svg create mode 100644 scripts/system/assets/images/tools/directory.svg delete mode 100644 scripts/system/assets/images/tools/edit-01.svg create mode 100644 scripts/system/assets/images/tools/edit.svg delete mode 100644 scripts/system/assets/images/tools/examples-01.svg delete mode 100644 scripts/system/assets/images/tools/hmd-switch-01.svg create mode 100644 scripts/system/assets/images/tools/market.svg create mode 100644 scripts/system/assets/images/tools/mic.svg create mode 100644 scripts/system/assets/images/tools/switch.svg diff --git a/interface/resources/icons/hud-01.svg b/interface/resources/icons/hud-01.svg deleted file mode 100644 index 4929389268..0000000000 --- a/interface/resources/icons/hud-01.svg +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/interface/resources/icons/hud.svg b/interface/resources/icons/hud.svg new file mode 100644 index 0000000000..9e77aa6040 --- /dev/null +++ b/interface/resources/icons/hud.svg @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/resources/qml/hifi/Desktop.qml b/interface/resources/qml/hifi/Desktop.qml index 169542c0f0..7a7a6b63df 100644 --- a/interface/resources/qml/hifi/Desktop.qml +++ b/interface/resources/qml/hifi/Desktop.qml @@ -56,7 +56,7 @@ OriginalDesktop.Desktop { var sysToolbar = desktop.getToolbar("com.highfidelity.interface.toolbar.system"); var toggleHudButton = sysToolbar.addButton({ objectName: "hudToggle", - imageURL: "../../../icons/hud-01.svg", + imageURL: "../../../icons/hud.svg", visible: true, pinned: true, }); diff --git a/scripts/system/assets/images/tools/directory-01.svg b/scripts/system/assets/images/tools/directory-01.svg deleted file mode 100644 index d038611d69..0000000000 --- a/scripts/system/assets/images/tools/directory-01.svg +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/system/assets/images/tools/directory.svg b/scripts/system/assets/images/tools/directory.svg new file mode 100644 index 0000000000..912243c52e --- /dev/null +++ b/scripts/system/assets/images/tools/directory.svg @@ -0,0 +1,366 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/system/assets/images/tools/edit-01.svg b/scripts/system/assets/images/tools/edit-01.svg deleted file mode 100644 index c661c6f678..0000000000 --- a/scripts/system/assets/images/tools/edit-01.svg +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/system/assets/images/tools/edit.svg b/scripts/system/assets/images/tools/edit.svg new file mode 100644 index 0000000000..13389a2b14 --- /dev/null +++ b/scripts/system/assets/images/tools/edit.svg @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/system/assets/images/tools/examples-01.svg b/scripts/system/assets/images/tools/examples-01.svg deleted file mode 100644 index ec4758dcde..0000000000 --- a/scripts/system/assets/images/tools/examples-01.svg +++ /dev/null @@ -1,306 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/system/assets/images/tools/hmd-switch-01.svg b/scripts/system/assets/images/tools/hmd-switch-01.svg deleted file mode 100644 index 31389d355c..0000000000 --- a/scripts/system/assets/images/tools/hmd-switch-01.svg +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/system/assets/images/tools/market.svg b/scripts/system/assets/images/tools/market.svg new file mode 100644 index 0000000000..fa4a3d7256 --- /dev/null +++ b/scripts/system/assets/images/tools/market.svg @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/system/assets/images/tools/mic.svg b/scripts/system/assets/images/tools/mic.svg new file mode 100644 index 0000000000..f3afccca70 --- /dev/null +++ b/scripts/system/assets/images/tools/mic.svg @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MUTE + + + + + + + + + + + + MUTE + + UNMUTE + + + + + + + + + + + + + + + + + + UNMUTE + + diff --git a/scripts/system/assets/images/tools/switch.svg b/scripts/system/assets/images/tools/switch.svg new file mode 100644 index 0000000000..23655d747d --- /dev/null +++ b/scripts/system/assets/images/tools/switch.svg @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/system/edit.js b/scripts/system/edit.js index 9d5585e353..6810bae590 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -192,7 +192,7 @@ var toolBar = (function() { }); activeButton = toolBar.addTool({ - imageURL: toolIconUrl + "edit-01.svg", + imageURL: toolIconUrl + "edit.svg", subImage: { x: 0, y: Tool.IMAGE_WIDTH, diff --git a/scripts/system/examples.js b/scripts/system/examples.js index 4d838bc8af..0ec2644f9c 100644 --- a/scripts/system/examples.js +++ b/scripts/system/examples.js @@ -53,7 +53,7 @@ function toggleExamples() { var toolBar = Toolbars.getToolbar("com.highfidelity.interface.toolbar.system"); var browseExamplesButton = toolBar.addButton({ - imageURL: toolIconUrl + "examples-01.svg", + imageURL: toolIconUrl + "market.svg", objectName: "examples", buttonState: 1, alpha: 0.9 diff --git a/scripts/system/goto.js b/scripts/system/goto.js index 4650e72dad..24c402ab85 100644 --- a/scripts/system/goto.js +++ b/scripts/system/goto.js @@ -14,7 +14,7 @@ var toolBar = Toolbars.getToolbar("com.highfidelity.interface.toolbar.system"); var button = toolBar.addButton({ objectName: "goto", - imageURL: Script.resolvePath("assets/images/tools/directory-01.svg"), + imageURL: Script.resolvePath("assets/images/tools/directory.svg"), visible: true, buttonState: 1, alpha: 0.9, diff --git a/scripts/system/hmd.js b/scripts/system/hmd.js index 0d6a273975..305557b60c 100644 --- a/scripts/system/hmd.js +++ b/scripts/system/hmd.js @@ -30,7 +30,7 @@ function onClicked(){ if (headset) { button = toolBar.addButton({ objectName: "hmdToggle", - imageURL: Script.resolvePath("assets/images/tools/hmd-switch-01.svg"), + imageURL: Script.resolvePath("assets/images/tools/switch.svg"), visible: true, alpha: 0.9, }); diff --git a/scripts/system/mute.js b/scripts/system/mute.js index f91ecbafae..cd29e8faae 100644 --- a/scripts/system/mute.js +++ b/scripts/system/mute.js @@ -14,7 +14,7 @@ var toolBar = Toolbars.getToolbar("com.highfidelity.interface.toolbar.system"); var button = toolBar.addButton({ objectName: "mute", - imageURL: Script.resolvePath("assets/images/tools/mic-01.svg"), + imageURL: Script.resolvePath("assets/images/tools/mic.svg"), visible: true, alpha: 0.9, }); From 804a187a7b81928a386b29270d9b1d7fe0af86f7 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Fri, 1 Jul 2016 10:17:17 -0700 Subject: [PATCH 13/26] Mute changes. --- scripts/system/assets/images/tools/mic.svg | 121 +++++++++++------- .../system/assets/images/tools/microphone.svg | 13 -- scripts/system/mute.js | 7 +- 3 files changed, 80 insertions(+), 61 deletions(-) delete mode 100644 scripts/system/assets/images/tools/microphone.svg diff --git a/scripts/system/assets/images/tools/mic.svg b/scripts/system/assets/images/tools/mic.svg index f3afccca70..126bb539fc 100644 --- a/scripts/system/assets/images/tools/mic.svg +++ b/scripts/system/assets/images/tools/mic.svg @@ -10,12 +10,7 @@ .st4{filter:url(#Adobe_OpacityMaskFilter_1_);} .st5{mask:url(#SVGID_2_);} .st6{fill:#1E1E1E;} - .st7{fill:none;stroke:#75FF48;stroke-width:0.25;stroke-miterlimit:10;} - .st8{fill:none;} - .st9{fill:#FFFFFF;} - .st10{font-family:'Raleway-Bold';} - .st11{font-size:9px;} - .st12{fill:#333333;} + .st7{fill:#FFFFFF;} @@ -95,9 +90,7 @@ fIzDR8cN4+ibinDd+4E+1lB91Xov/9k=" transform="matrix(1 0 0 1 -2 148)"> - - - + @@ -106,59 +99,97 @@ fIzDR8cN4+ibinDd+4E+1lB91Xov/9k=" transform="matrix(1 0 0 1 -2 148)"> - - MUTE - - - - - + + + + + + + + + - - - - - + + + + + - - MUTE - - UNMUTE + h-2.3l0-1.8C28.9,78.5,31,76.3,31,73.7z"/> + + + + + + + + + + + + + + - - + + c0.4-0.4,0.4-1.1,0-1.5L26.5,13.9z"/> - - + + h-2.3l0-1.8C28.8,28.6,30.9,26.5,30.9,23.8z"/> - - + + c0.4,0.4,1.1,0.4,1.5,0c0.4-0.4,0.4-1.1,0-1.5L26.5,163.8z"/> - - + + h-2.3l0-1.8C28.8,178.6,30.9,176.4,30.9,173.7z"/> + + + + + + + + - - UNMUTE diff --git a/scripts/system/assets/images/tools/microphone.svg b/scripts/system/assets/images/tools/microphone.svg deleted file mode 100644 index bd5e8afac7..0000000000 --- a/scripts/system/assets/images/tools/microphone.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - image/svg+xml - - - Layer 1 - - - - Mute - - - \ No newline at end of file diff --git a/scripts/system/mute.js b/scripts/system/mute.js index cd29e8faae..1a575efa01 100644 --- a/scripts/system/mute.js +++ b/scripts/system/mute.js @@ -16,13 +16,14 @@ var button = toolBar.addButton({ objectName: "mute", imageURL: Script.resolvePath("assets/images/tools/mic.svg"), visible: true, - alpha: 0.9, + buttonState: 1, + alpha: 0.9 }); function onMuteToggled() { // We could just toggle state, but we're less likely to get out of wack if we read the AudioDevice. - // muted => "on" button state => buttonState 1 - button.writeProperty('buttonState', AudioDevice.getMuted() ? 1 : 0); + // muted => button "on" state => 1. go figure. + button.writeProperty('buttonState', AudioDevice.getMuted() ? 0 : 1); } onMuteToggled(); function onClicked(){ From 43c7fd1e27093ca5577c542919b439d14d6373cf Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Fri, 1 Jul 2016 10:34:13 -0700 Subject: [PATCH 14/26] New art. --- interface/resources/icons/hud.svg | 309 ++++--------- .../system/assets/images/tools/directory.svg | 427 +++++++----------- scripts/system/assets/images/tools/edit.svg | 243 +++------- scripts/system/assets/images/tools/market.svg | 249 +++------- scripts/system/assets/images/tools/mic.svg | 221 ++++----- scripts/system/assets/images/tools/switch.svg | 295 +++++------- 6 files changed, 583 insertions(+), 1161 deletions(-) diff --git a/interface/resources/icons/hud.svg b/interface/resources/icons/hud.svg index 9e77aa6040..acfd21b909 100644 --- a/interface/resources/icons/hud.svg +++ b/interface/resources/icons/hud.svg @@ -3,140 +3,29 @@ - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -144,115 +33,113 @@ vaK3kSYV8RW8iTCviK3kSYV8RW8iTCiPaa0X/wAJMKhq3ZXV/pkbI0eRJfe0h26v/9k=" transform= - - + + - - + - - - + + + - - + + - - + - - - + + + - - + + - - + - - + + + + + + + + + + + + - - - - - - - - - - - - + c-0.4-0.2-0.7-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.2-0.8-0.2-1.2v-3.4h1.3v3.4c0,0.3,0,0.5,0.1,0.8 + c0.1,0.3,0.1,0.5,0.3,0.7c0.1,0.2,0.3,0.4,0.5,0.5C25,191.7,25.3,191.8,25.6,191.8z"/> + diff --git a/scripts/system/assets/images/tools/directory.svg b/scripts/system/assets/images/tools/directory.svg index 912243c52e..09f3c14bf0 100644 --- a/scripts/system/assets/images/tools/directory.svg +++ b/scripts/system/assets/images/tools/directory.svg @@ -3,364 +3,253 @@ - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - + + + c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2s-0.4,0.3-0.6,0.5c-0.2,0.2-0.3,0.4-0.3,0.7C33.7,38.5,33.7,38.8,33.7,39.1z"/> - + C16.6,17.2,16.5,17.1,16.6,17z M16,18.2L16,18.2c0-0.2,0.1-0.2,0.2-0.2l3.3,0.8c0.1,0,0.1,0.1,0.1,0.2l0.1,4.7 + c0,0.1,0,0.1-0.1,0.1h-0.1l0,0h-0.1h-0.1l0,0c-0.1,0-0.3-0.1-0.5-0.1c-1.1-0.3-1.9-0.6-2.6-1.1c-0.4-0.3-0.6-0.6-0.6-1 + C15.6,20.5,15.7,19.3,16,18.2z"/> - + - - + - - + + + c-0.2-0.1-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.1-0.8,0.2s-0.4,0.3-0.6,0.5c-0.2,0.2-0.3,0.4-0.3,0.7C33.7,88.5,33.7,88.8,33.7,89.1z"/> - + C16.6,67.2,16.5,67.1,16.6,67z M16,68.2L16,68.2c0-0.2,0.1-0.2,0.2-0.2l3.3,0.8c0.1,0,0.1,0.1,0.1,0.2l0.1,4.7 + c0,0.1,0,0.1-0.1,0.1h-0.1l0,0h-0.1h-0.1l0,0c-0.1,0-0.3-0.1-0.5-0.1c-1.1-0.3-1.9-0.6-2.6-1.1c-0.4-0.3-0.6-0.6-0.6-1 + C15.6,70.5,15.7,69.3,16,68.2z"/> - + - - - - + C18.9,138.6,18.9,138.9,18.9,139.2z"/> + + - + c-0.1,0-0.1-0.1-0.1-0.2L25,119.5L25,119.5z M25,125.6c0-0.1,0.1-0.2,0.2-0.2h0.2l3.4-0.2c0,0,0.1,0,0.1,0.1c0,0,0.1,0.1,0,0.1 + v0.1l0,0c0,0,0,0,0,0.1v0.1v0.1c0,0.1,0,0.2-0.1,0.3c-0.1,0.1-0.1,0.3-0.2,0.4l-0.1,0.2c-0.2,0.6-0.5,1.2-0.7,1.8 + c-0.2,0.5-0.6,0.9-0.9,1.3c-0.3,0.3-0.9,0.6-1.5,0.6h-0.2l0,0c0,0-0.1,0-0.1-0.1v-0.1L25,125.6L25,125.6z M21.5,129.5l-0.1,0.1 + l0,0l-0.2-0.1l0,0c-1.8-0.4-4.2-2.6-5.1-5.2v-0.1c0-0.1,0-0.1,0-0.2c0,0,0.1-0.1,0.2,0l0.9,0.3c0.8,0.2,1.6,0.5,2.4,0.7 + c0.2,0.1,0.4,0.1,0.4,0.4c0.3,1.6,0.8,2.8,1.5,3.8l0.1,0.1C21.6,129.4,21.6,129.4,21.5,129.5z M24.2,130.1c0,0.1-0.1,0.1-0.1,0.1 + H24c0,0,0,0-0.1,0c0,0-0.9-0.3-1.3-0.8c-1-1.3-1.5-2.7-1.9-4l0,0v-0.1c0-0.1,0-0.1,0-0.1l0.1-0.1h0.1l1.9,0.2l1.2,0.1 + c0.1,0,0.2,0.1,0.2,0.2L24.2,130.1L24.2,130.1z M22.8,119.3l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2v5c0,0,0,0.1-0.1,0.1H24l0,0 + c0,0-0.9-0.1-1.4-0.1c-0.6,0-1.2-0.1-1.7-0.2c-0.2,0-0.4-0.3-0.4-0.4c-0.1-1.2-0.1-2.3-0.2-3.1c0-0.3,0-1.4,0-1.5s0-0.1,0.1-0.1 + c0,0,0.1-0.1,0.1,0H22.8z M16.4,117.1L16.4,117.1c0.8-2.1,2.8-3.9,5-4.7l0.2-0.1c0.1,0,0.2,0,0.2,0.1s0,0.1,0,0.2l-0.1,0.2 + c-1.2,1.6-1.7,3.5-2,5.3v0.1c0,0,0,0.1-0.1,0.1h-0.1c0,0,0,0-0.1,0h-0.1c-0.4-0.1-0.7-0.2-1.1-0.3c-0.6-0.1-1.2-0.3-1.8-0.5h-0.1 + C16.4,117.3,16.3,117.2,16.4,117.1z M15.8,118.3L15.8,118.3c0-0.2,0.1-0.2,0.2-0.2l3.3,0.8c0.1,0,0.1,0.1,0.1,0.2l0.1,4.7 + c0,0.1,0,0.1-0.1,0.1h-0.1l0,0h-0.1h-0.1l0,0c-0.1,0-0.3-0.1-0.5-0.1c-1.1-0.3-1.9-0.6-2.6-1.1c-0.4-0.3-0.6-0.6-0.6-1 + C15.4,120.6,15.5,119.4,15.8,118.3z"/> - + - - - - + C18.9,188.7,18.9,189,18.9,189.3z"/> + + - + C30,174.1,30,174.1,30,173.9L30,173.9z M30.1,175.1c0.8-0.2,1.5-0.4,2.3-0.6l0.9-0.3c0.1,0,0.1,0,0.2,0.1c0,0,0.1,0.1,0,0.2v0.1 + c-0.5,1.2-1.1,2.2-2,3.1c-0.8,0.9-1.9,1.5-3.1,2.1h-0.1c0,0,0,0-0.1,0h-0.1c-0.1,0-0.1-0.1-0.1-0.2v-0.1l0,0c0,0,0-0.1,0.1-0.2 + c0.4-0.6,1-1.6,1.5-3.7C29.7,175.3,29.8,175.1,30.1,175.1z M25,169.6c0-0.1,0.1-0.2,0.2-0.2h0.2l2.7-0.1l0.9-0.1c0,0,0,0,0.1,0 + l0,0h0.1h0.1c0.1,0,0.1,0.1,0.1,0.2c0,0.1,0,0.2,0,0.4c0,0.1,0,0.3,0,0.4v0.3c0,0.5,0,1,0,1.4v0.2c0,0.4,0,0.8-0.1,1.1 + c0,0.1,0,0.2,0,0.3s0,0.2,0,0.3s0,0.4-0.4,0.5c-0.7,0.1-1.3,0.1-2,0.2h-0.2c-0.2,0-0.5,0-0.8,0.1c-0.4,0-0.5,0.1-0.6,0.1h-0.1 + l-0.2-0.1c-0.1,0-0.1-0.1-0.1-0.2L25,169.6L25,169.6z M25,175.7c0-0.1,0.1-0.2,0.2-0.2h0.2l3.4-0.2c0,0,0.1,0,0.1,0.1 + c0,0,0.1,0.1,0,0.1v0.1l0,0c0,0,0,0,0,0.1v0.1v0.1c0,0.1,0,0.2-0.1,0.3s-0.1,0.3-0.2,0.4l-0.1,0.2c-0.2,0.6-0.5,1.2-0.7,1.8 + c-0.2,0.5-0.6,0.9-0.9,1.3c-0.3,0.3-0.9,0.6-1.5,0.6h-0.2l0,0c0,0-0.1,0-0.1-0.1v-0.1L25,175.7L25,175.7z M21.5,179.6l-0.1,0.1 + l0,0l-0.2-0.1l0,0c-1.8-0.4-4.2-2.6-5.1-5.2v-0.1c0-0.1,0-0.1,0-0.2c0,0,0.1-0.1,0.2,0l0.9,0.3c0.8,0.2,1.6,0.5,2.4,0.7 + c0.2,0.1,0.4,0.1,0.4,0.4c0.3,1.6,0.8,2.8,1.5,3.8l0.1,0.1C21.6,179.5,21.6,179.5,21.5,179.6z M24.2,180.2c0,0.1-0.1,0.1-0.1,0.1 + H24c0,0,0,0-0.1,0c0,0-0.9-0.3-1.3-0.8c-1-1.3-1.5-2.7-1.9-4l0,0v-0.1c0-0.1,0-0.1,0-0.1l0.1-0.1h0.1l1.9,0.2l1.2,0.1 + c0.1,0,0.2,0.1,0.2,0.2L24.2,180.2L24.2,180.2z M22.8,169.4l1.2,0.1c0.1,0,0.2,0.1,0.2,0.2v5c0,0,0,0.1-0.1,0.1H24l0,0 + c0,0-0.9-0.1-1.4-0.1c-0.6,0-1.2-0.1-1.7-0.2c-0.2,0-0.4-0.3-0.4-0.4c-0.1-1.2-0.1-2.3-0.2-3.1c0-0.3,0-1.4,0-1.5 + c0-0.1,0-0.1,0.1-0.1c0,0,0.1-0.1,0.1,0H22.8z M16.4,167.2L16.4,167.2c0.8-2.1,2.8-3.9,5-4.7l0.2-0.1c0.1,0,0.2,0,0.2,0.1 + c0,0.1,0,0.1,0,0.2l-0.1,0.2c-1.2,1.6-1.7,3.5-2,5.3v0.1c0,0,0,0.1-0.1,0.1h-0.1c0,0,0,0-0.1,0h-0.1c-0.4-0.1-0.7-0.2-1.1-0.3 + c-0.6-0.1-1.2-0.3-1.8-0.5h-0.1C16.4,167.4,16.3,167.3,16.4,167.2z M15.8,168.4L15.8,168.4c0-0.2,0.1-0.2,0.2-0.2l3.3,0.8 + c0.1,0,0.1,0.1,0.1,0.2l0.1,4.7c0,0.1,0,0.1-0.1,0.1h-0.1l0,0h-0.1h-0.1l0,0c-0.1,0-0.3-0.1-0.5-0.1c-1.1-0.3-1.9-0.6-2.6-1.1 + c-0.4-0.3-0.6-0.6-0.6-1C15.4,170.7,15.5,169.5,15.8,168.4z"/> - + diff --git a/scripts/system/assets/images/tools/edit.svg b/scripts/system/assets/images/tools/edit.svg index 13389a2b14..f65e0cd84d 100644 --- a/scripts/system/assets/images/tools/edit.svg +++ b/scripts/system/assets/images/tools/edit.svg @@ -3,232 +3,121 @@ - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + + + c0,0,0.1,0,0.1,0c0.1-0.4,0.2-0.8,0.2-1.3C37.2,21.7,33.7,18.9,30.2,19.9z M17.5,11.5c-0.4,0-0.7-0.3-0.7-0.7 + c0-0.4,0.3-0.8,0.7-0.8c0.4,0,0.8,0.4,0.8,0.7C18.3,11.1,17.9,11.5,17.5,11.5z M27.9,13.8c0.3,0.3,0.6,0.7,1,1 + c-0.7,0.7-1.4,1.4-2.1,2.1c-0.3-0.3-0.7-0.7-1-1C26.5,15.2,27.2,14.5,27.9,13.8z"/> - - + - - + c0.2-0.1,0.4-0.3,0.6-0.4s0.3-0.4,0.4-0.7C24.2,39.8,24.2,39.5,24.2,39.2z"/> + + - - - + + + c0,0,0.1,0,0.1,0c0.1-0.4,0.2-0.8,0.2-1.3C37.2,71.7,33.8,68.9,30.3,69.9z M17.6,61.5c-0.4,0-0.7-0.3-0.7-0.7 + c0-0.4,0.3-0.8,0.7-0.8c0.4,0,0.8,0.4,0.8,0.7C18.3,61.1,18,61.5,17.6,61.5z M28,63.8c0.3,0.3,0.6,0.7,1,1 + c-0.7,0.7-1.4,1.4-2.1,2.1c-0.3-0.3-0.7-0.7-1-1C26.6,65.2,27.3,64.5,28,63.8z"/> - - + - - + c0.2-0.1,0.4-0.3,0.6-0.4s0.3-0.4,0.4-0.7C24.2,89.8,24.2,89.5,24.2,89.2z"/> + + - - - + + + c0,0,0.1,0,0.1,0c0.1-0.4,0.2-0.8,0.2-1.3C37.1,121.8,33.7,119,30.2,120z M17.5,111.5c-0.4,0-0.7-0.3-0.7-0.7 + c0-0.4,0.3-0.8,0.7-0.8c0.4,0,0.8,0.4,0.8,0.7C18.2,111.2,17.9,111.5,17.5,111.5z M27.9,113.9c0.3,0.3,0.6,0.7,1,1 + c-0.7,0.7-1.4,1.4-2.1,2.1c-0.3-0.3-0.7-0.7-1-1C26.5,115.3,27.2,114.6,27.9,113.9z"/> - - - - + + + + - - - + + + c0,0,0.1,0,0.1,0c0.1-0.4,0.2-0.8,0.2-1.3C37.1,171.9,33.7,169,30.2,170.1z M17.4,161.6c-0.4,0-0.7-0.3-0.7-0.7 + c0-0.4,0.3-0.8,0.7-0.8c0.4,0,0.8,0.4,0.8,0.7C18.2,161.2,17.8,161.6,17.4,161.6z M27.8,164c0.3,0.3,0.6,0.7,1,1 + c-0.7,0.7-1.4,1.4-2.1,2.1c-0.3-0.3-0.7-0.7-1-1C26.4,165.4,27.1,164.7,27.8,164z"/> - - - - + + + + diff --git a/scripts/system/assets/images/tools/market.svg b/scripts/system/assets/images/tools/market.svg index fa4a3d7256..0cec030933 100644 --- a/scripts/system/assets/images/tools/market.svg +++ b/scripts/system/assets/images/tools/market.svg @@ -3,158 +3,47 @@ - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + + - - - + c-0.1-0.1-0.2-0.2-0.3-0.2C24,37.1,23.9,37,23.8,37h-1.5V39.1z"/> + + + - - - + c-0.1-0.2-0.1-0.4-0.2-0.6c-0.1-0.2-0.1-0.4-0.2-0.7l-0.2-0.6H32.1z"/> + + - - - + + - - - + c-0.1-0.1-0.2-0.2-0.3-0.2C24,87.1,23.9,87,23.8,87h-1.5V89.1z"/> + + + - - - + c-0.1-0.2-0.1-0.4-0.2-0.6c-0.1-0.2-0.1-0.4-0.2-0.7l-0.2-0.6H32.1z"/> + + - - - + + - - - + c-0.1-0.1-0.2-0.2-0.3-0.2c-0.1-0.1-0.2-0.1-0.3-0.1h-1.5V139.2z"/> + + + - - - + c-0.1-0.6-0.3-1.3-0.5-2c-0.1-0.2-0.1-0.4-0.2-0.6c-0.1-0.2-0.1-0.4-0.2-0.7l-0.2-0.6H32z"/> + + - - - - - - + + + + + + - - - + c-0.1-0.6-0.3-1.3-0.5-2c-0.1-0.2-0.1-0.4-0.2-0.6c-0.1-0.2-0.1-0.4-0.2-0.7l-0.2-0.6H32z"/> + + diff --git a/scripts/system/assets/images/tools/mic.svg b/scripts/system/assets/images/tools/mic.svg index 126bb539fc..0424f3eb49 100644 --- a/scripts/system/assets/images/tools/mic.svg +++ b/scripts/system/assets/images/tools/mic.svg @@ -3,193 +3,124 @@ - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - + + + - + - - + - - + c-0.4-0.2-0.6-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.1-0.8-0.1-1.2v-3.3H22v3.3c0,0.3,0,0.5,0.1,0.8 + c0.1,0.2,0.1,0.5,0.3,0.7c0.1,0.2,0.3,0.3,0.5,0.5S23.2,191.8,23.5,191.8z"/> + + - - - - - + + + + - - - - - + + + + + + h-2.3l0-1.8C28.6,79,30.7,76.9,30.7,74.2z"/> - - + + + + + + + + + - - - - - - - - - - + c0.1,0.2,0.1,0.5,0.3,0.7s0.3,0.3,0.5,0.5S30.1,41.9,30.4,41.9z"/> + + - - + + - - + + c0,2.6,2.1,4.8,4.8,5.2l0,1.8h-2.2c-0.5,0-0.9,0.4-0.9,0.9c0,0.5,0.4,0.9,0.9,0.9H28c0.5,0,0.9-0.4,0.9-0.9c0-0.5-0.4-0.9-0.9-0.9 + h-2.3l0-1.8C28.5,29.2,30.6,27,30.6,24.4z"/> - - + + c0.4,0.4,1.1,0.4,1.5,0c0.4-0.4,0.4-1.1,0-1.5L26.1,164.3z"/> - - + + c0,2.6,2.1,4.8,4.8,5.2l0,1.8h-2.2c-0.5,0-0.9,0.4-0.9,0.9c0,0.5,0.4,0.9,0.9,0.9H28c0.5,0,0.9-0.4,0.9-0.9c0-0.5-0.4-0.9-0.9-0.9 + h-2.3l0-1.8C28.5,179.1,30.6,176.9,30.6,174.3z"/> - - - - + + + - - + s-0.6-0.4-0.9-0.7c-0.2-0.3-0.4-0.6-0.5-1c-0.1-0.4-0.1-0.8-0.1-1.2v-3.3h1.2v3.3c0,0.3,0,0.5,0.1,0.8c0.1,0.2,0.1,0.5,0.3,0.7 + c0.1,0.2,0.3,0.3,0.5,0.5S30,141.9,30.3,141.9z"/> + + diff --git a/scripts/system/assets/images/tools/switch.svg b/scripts/system/assets/images/tools/switch.svg index 23655d747d..e67a9aac04 100644 --- a/scripts/system/assets/images/tools/switch.svg +++ b/scripts/system/assets/images/tools/switch.svg @@ -3,228 +3,165 @@ - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - + + + - - - - + + + + + + + + + + + + + + + - - + + - - - + + + - - - - + + + + - - + + - - - + + + - - - - + + + + - + C31.3,190.2,31.3,189.8,31.3,189.4z"/> + + + From 02cc6cc567150909587d9f09c39882b354f5c4a3 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Fri, 1 Jul 2016 12:18:26 -0700 Subject: [PATCH 15/26] hover states --- .../qml/hifi/toolbars/ToolbarButton.qml | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/hifi/toolbars/ToolbarButton.qml b/interface/resources/qml/hifi/toolbars/ToolbarButton.qml index a3be4533d2..4356b18253 100644 --- a/interface/resources/qml/hifi/toolbars/ToolbarButton.qml +++ b/interface/resources/qml/hifi/toolbars/ToolbarButton.qml @@ -8,6 +8,7 @@ Item { property var subImage; property int yOffset: 0 property int buttonState: 0 + property int hoverOffset: 0 property var toolbar; property real size: 50 // toolbar ? toolbar.buttonSize : 50 width: size; height: size @@ -36,9 +37,15 @@ Item { } } - + function updateOffset() { + yOffset = size * (buttonState + hoverOffset); + } onButtonStateChanged: { - yOffset = size * buttonState + hoverOffset = 0; // subtle: show the new state without hover. don't wait for mouse to be moved away + // The above is per UX design, but ALSO avoid a subtle issue that would be a problem because + // the hand controllers don't move the mouse when not triggered, so releasing the trigger would + // never show unhovered. + updateOffset(); } Component.onCompleted: { @@ -58,8 +65,18 @@ Item { } MouseArea { + id: mouseArea + hoverEnabled: true anchors.fill: parent onClicked: button.clicked(); + onEntered: { + hoverOffset = 2; + updateOffset(); + } + onExited: { + hoverOffset = 0; + updateOffset(); + } } } From 1ad9cfde99c3a882537f3d39c4f1821939fde12f Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Fri, 1 Jul 2016 13:54:00 -0700 Subject: [PATCH 16/26] make hud button participate in buttonState just like other toolbar chicklets --- interface/resources/qml/hifi/Desktop.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/hifi/Desktop.qml b/interface/resources/qml/hifi/Desktop.qml index 7a7a6b63df..561bd722f2 100644 --- a/interface/resources/qml/hifi/Desktop.qml +++ b/interface/resources/qml/hifi/Desktop.qml @@ -61,8 +61,8 @@ OriginalDesktop.Desktop { pinned: true, }); - toggleHudButton.yOffset = Qt.binding(function(){ - return desktop.pinned ? 50 : 0 + toggleHudButton.buttonState = Qt.binding(function(){ + return desktop.pinned ? 1 : 0 }); toggleHudButton.clicked.connect(function(){ console.log("Clicked on hud button") From 88d28120b683160a65a291884f09704cc6894593 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Fri, 1 Jul 2016 15:48:58 -0700 Subject: [PATCH 17/26] Adding missed file --- plugins/openvr/src/OpenVrHelpers.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp index 399712d920..c93a2178b5 100644 --- a/plugins/openvr/src/OpenVrHelpers.cpp +++ b/plugins/openvr/src/OpenVrHelpers.cpp @@ -268,6 +268,7 @@ void handleOpenVrEvents() { case vr::VREvent_KeyboardClosed: _keyboardFocusObject = nullptr; _keyboardShown = false; + DependencyManager::get()->unfocusWindows(); break; default: From 760f4366e13e357a66603d81e64c2e2a98087f84 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 2 Jul 2016 11:25:04 +1200 Subject: [PATCH 18/26] Don't show users border when hover mouse if logged out --- scripts/system/users.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/system/users.js b/scripts/system/users.js index d25e1b76b4..2ff2689bad 100644 --- a/scripts/system/users.js +++ b/scripts/system/users.js @@ -826,6 +826,10 @@ var usersWindow = (function () { function onMouseMoveEvent(event) { var isVisible; + if (!isLoggedIn) { + return; + } + if (isMovingScrollbar) { if (scrollbarBackgroundPosition.x - WINDOW_MARGIN <= event.x && event.x <= scrollbarBackgroundPosition.x + SCROLLBAR_BACKGROUND_WIDTH + WINDOW_MARGIN From d3c006b5daec2769120f3fed9e1b0696291dd69a Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Fri, 1 Jul 2016 18:50:53 -0700 Subject: [PATCH 19/26] Added floating-point audio resampler --- libraries/audio/src/AudioSRC.cpp | 126 +++++++++++++++++++++++++++++-- libraries/audio/src/AudioSRC.h | 4 + 2 files changed, 122 insertions(+), 8 deletions(-) diff --git a/libraries/audio/src/AudioSRC.cpp b/libraries/audio/src/AudioSRC.cpp index 98de36e655..688e36c777 100644 --- a/libraries/audio/src/AudioSRC.cpp +++ b/libraries/audio/src/AudioSRC.cpp @@ -539,6 +539,58 @@ void AudioSRC::convertOutputToInt16(float** inputs, int16_t* output, int numFram } } +// deinterleave stereo +void AudioSRC::convertInputFromFloat(const float* input, float** outputs, int numFrames) { + + if (_numChannels == 1) { + + memcpy(outputs[0], input, numFrames * sizeof(float)); + + } else if (_numChannels == 2) { + + int i = 0; + for (; i < numFrames - 3; i += 4) { + __m128 f0 = _mm_loadu_ps(&input[2*i + 0]); + __m128 f1 = _mm_loadu_ps(&input[2*i + 4]); + + // deinterleave + _mm_storeu_ps(&outputs[0][i], _mm_shuffle_ps(f0, f1, _MM_SHUFFLE(2,0,2,0))); + _mm_storeu_ps(&outputs[1][i], _mm_shuffle_ps(f0, f1, _MM_SHUFFLE(3,1,3,1))); + } + for (; i < numFrames; i++) { + // deinterleave + outputs[0][i] = input[2*i + 0]; + outputs[1][i] = input[2*i + 1]; + } + } +} + +// interleave stereo +void AudioSRC::convertOutputToFloat(float** inputs, float* output, int numFrames) { + + if (_numChannels == 1) { + + memcpy(output, inputs[0], numFrames * sizeof(float)); + + } else if (_numChannels == 2) { + + int i = 0; + for (; i < numFrames - 3; i += 4) { + __m128 f0 = _mm_loadu_ps(&inputs[0][i]); + __m128 f1 = _mm_loadu_ps(&inputs[1][i]); + + // interleave + _mm_storeu_ps(&output[2*i + 0], _mm_unpacklo_ps(f0, f1)); + _mm_storeu_ps(&output[2*i + 4], _mm_unpackhi_ps(f0, f1)); + } + for (; i < numFrames; i++) { + // interleave + output[2*i + 0] = inputs[0][i]; + output[2*i + 1] = inputs[1][i]; + } + } +} + #else int AudioSRC::multirateFilter1(const float* input0, float* output0, int inputFrames) { @@ -738,6 +790,38 @@ void AudioSRC::convertOutputToInt16(float** inputs, int16_t* output, int numFram } } +// deinterleave stereo +void AudioSRC::convertInputFromFloat(const float* input, float** outputs, int numFrames) { + + if (_numChannels == 1) { + + memcpy(outputs[0], input, numFrames * sizeof(float)); + + } else if (_numChannels == 2) { + for (int i = 0; i < numFrames; i++) { + // deinterleave + outputs[0][i] = input[2*i + 0]; + outputs[1][i] = input[2*i + 1]; + } + } +} + +// interleave stereo +void AudioSRC::convertOutputToFloat(float** inputs, float* output, int numFrames) { + + if (_numChannels == 1) { + + memcpy(output, inputs[0], numFrames * sizeof(float)); + + } else if (_numChannels == 2) { + for (int i = 0; i < numFrames; i++) { + // interleave + output[2*i + 0] = inputs[0][i]; + output[2*i + 1] = inputs[1][i]; + } + } +} + #endif int AudioSRC::processFloat(float** inputs, float** outputs, int inputFrames) { @@ -749,19 +833,19 @@ int AudioSRC::processFloat(float** inputs, float** outputs, int inputFrames) { if (_numChannels == 1) { // refill history buffers - memcpy(_history[0] + _numHistory, _inputs[0], nh * sizeof(float)); + memcpy(_history[0] + _numHistory, inputs[0], nh * sizeof(float)); // process history buffer - outputFrames += multirateFilter1(_history[0], _outputs[0], nh); + outputFrames += multirateFilter1(_history[0], outputs[0], nh); // process remaining input if (ni) { - outputFrames += multirateFilter1(_inputs[0], _outputs[0] + outputFrames, ni); + outputFrames += multirateFilter1(inputs[0], outputs[0] + outputFrames, ni); } // shift history buffers if (ni) { - memcpy(_history[0], _inputs[0] + ni, _numHistory * sizeof(float)); + memcpy(_history[0], inputs[0] + ni, _numHistory * sizeof(float)); } else { memmove(_history[0], _history[0] + nh, _numHistory * sizeof(float)); } @@ -769,15 +853,15 @@ int AudioSRC::processFloat(float** inputs, float** outputs, int inputFrames) { } else if (_numChannels == 2) { // refill history buffers - memcpy(_history[0] + _numHistory, _inputs[0], nh * sizeof(float)); - memcpy(_history[1] + _numHistory, _inputs[1], nh * sizeof(float)); + memcpy(_history[0] + _numHistory, inputs[0], nh * sizeof(float)); + memcpy(_history[1] + _numHistory, inputs[1], nh * sizeof(float)); // process history buffer - outputFrames += multirateFilter2(_history[0], _history[1], _outputs[0], _outputs[1], nh); + outputFrames += multirateFilter2(_history[0], _history[1], outputs[0], outputs[1], nh); // process remaining input if (ni) { - outputFrames += multirateFilter2(_inputs[0], _inputs[1], _outputs[0] + outputFrames, _outputs[1] + outputFrames, ni); + outputFrames += multirateFilter2(inputs[0], inputs[1], outputs[0] + outputFrames, outputs[1] + outputFrames, ni); } // shift history buffers @@ -885,6 +969,32 @@ int AudioSRC::render(const int16_t* input, int16_t* output, int inputFrames) { return outputFrames; } +// +// This version handles input/output as interleaved float +// +int AudioSRC::render(const float* input, float* output, int inputFrames) { + int outputFrames = 0; + + while (inputFrames) { + + int ni = std::min(inputFrames, _inputBlock); + + convertInputFromFloat(input, _inputs, ni); + + int no = processFloat(_inputs, _outputs, ni); + assert(no <= SRC_BLOCK); + + convertOutputToFloat(_outputs, output, no); + + input += _numChannels * ni; + output += _numChannels * no; + inputFrames -= ni; + outputFrames += no; + } + + return outputFrames; +} + // the min output frames that will be produced by inputFrames int AudioSRC::getMinOutput(int inputFrames) { if (_step == 0) { diff --git a/libraries/audio/src/AudioSRC.h b/libraries/audio/src/AudioSRC.h index a4aefc5ed7..409507f68e 100644 --- a/libraries/audio/src/AudioSRC.h +++ b/libraries/audio/src/AudioSRC.h @@ -35,6 +35,7 @@ public: ~AudioSRC(); int render(const int16_t* input, int16_t* output, int inputFrames); + int render(const float* input, float* output, int inputFrames); int getMinOutput(int inputFrames); int getMaxOutput(int inputFrames); @@ -78,6 +79,9 @@ private: void convertInputFromInt16(const int16_t* input, float** outputs, int numFrames); void convertOutputToInt16(float** inputs, int16_t* output, int numFrames); + void convertInputFromFloat(const float* input, float** outputs, int numFrames); + void convertOutputToFloat(float** inputs, float* output, int numFrames); + int processFloat(float** inputs, float** outputs, int inputFrames); }; From ad8f17a1425b2cf11de348d8daa250dbb4d8111b Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Fri, 1 Jul 2016 19:29:43 -0700 Subject: [PATCH 20/26] Add support for deinterleaved float-point audio (native format) --- libraries/audio/src/AudioSRC.cpp | 6 +++--- libraries/audio/src/AudioSRC.h | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/libraries/audio/src/AudioSRC.cpp b/libraries/audio/src/AudioSRC.cpp index 688e36c777..185ad948e7 100644 --- a/libraries/audio/src/AudioSRC.cpp +++ b/libraries/audio/src/AudioSRC.cpp @@ -824,7 +824,7 @@ void AudioSRC::convertOutputToFloat(float** inputs, float* output, int numFrames #endif -int AudioSRC::processFloat(float** inputs, float** outputs, int inputFrames) { +int AudioSRC::render(float** inputs, float** outputs, int inputFrames) { int outputFrames = 0; int nh = std::min(_numHistory, inputFrames); // number of frames from history buffer @@ -955,7 +955,7 @@ int AudioSRC::render(const int16_t* input, int16_t* output, int inputFrames) { convertInputFromInt16(input, _inputs, ni); - int no = processFloat(_inputs, _outputs, ni); + int no = render(_inputs, _outputs, ni); assert(no <= SRC_BLOCK); convertOutputToInt16(_outputs, output, no); @@ -981,7 +981,7 @@ int AudioSRC::render(const float* input, float* output, int inputFrames) { convertInputFromFloat(input, _inputs, ni); - int no = processFloat(_inputs, _outputs, ni); + int no = render(_inputs, _outputs, ni); assert(no <= SRC_BLOCK); convertOutputToFloat(_outputs, output, no); diff --git a/libraries/audio/src/AudioSRC.h b/libraries/audio/src/AudioSRC.h index 409507f68e..e8c8f4370f 100644 --- a/libraries/audio/src/AudioSRC.h +++ b/libraries/audio/src/AudioSRC.h @@ -34,7 +34,13 @@ public: AudioSRC(int inputSampleRate, int outputSampleRate, int numChannels); ~AudioSRC(); + // deinterleaved float input/output (native format) + int render(float** inputs, float** outputs, int inputFrames); + + // interleaved int16_t input/output int render(const int16_t* input, int16_t* output, int inputFrames); + + // interleaved float input/output int render(const float* input, float* output, int inputFrames); int getMinOutput(int inputFrames); @@ -81,8 +87,6 @@ private: void convertInputFromFloat(const float* input, float** outputs, int numFrames); void convertOutputToFloat(float** inputs, float* output, int numFrames); - - int processFloat(float** inputs, float** outputs, int inputFrames); }; #endif // AudioSRC_h From 941067b9d01d6269da07cc6da87082c3734a0811 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Sat, 2 Jul 2016 07:25:04 -0700 Subject: [PATCH 21/26] Added floating-point audio reverb --- libraries/audio/src/AudioReverb.cpp | 81 ++++++++++++++++++++++++++++- libraries/audio/src/AudioReverb.h | 7 +++ 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/libraries/audio/src/AudioReverb.cpp b/libraries/audio/src/AudioReverb.cpp index 5c57e92ce5..5f1da56b4c 100644 --- a/libraries/audio/src/AudioReverb.cpp +++ b/libraries/audio/src/AudioReverb.cpp @@ -1725,7 +1725,7 @@ void ReverbImpl::reset() { // Public API // -static const int REVERB_BLOCK = 1024; +static const int REVERB_BLOCK = 256; AudioReverb::AudioReverb(float sampleRate) { @@ -1898,6 +1898,44 @@ void AudioReverb::convertOutputToInt16(float** inputs, int16_t* output, int numF } } +// deinterleave stereo +void AudioReverb::convertInputFromFloat(const float* input, float** outputs, int numFrames) { + + int i = 0; + for (; i < numFrames - 3; i += 4) { + __m128 f0 = _mm_loadu_ps(&input[2*i + 0]); + __m128 f1 = _mm_loadu_ps(&input[2*i + 4]); + + // deinterleave + _mm_storeu_ps(&outputs[0][i], _mm_shuffle_ps(f0, f1, _MM_SHUFFLE(2,0,2,0))); + _mm_storeu_ps(&outputs[1][i], _mm_shuffle_ps(f0, f1, _MM_SHUFFLE(3,1,3,1))); + } + for (; i < numFrames; i++) { + // deinterleave + outputs[0][i] = input[2*i + 0]; + outputs[1][i] = input[2*i + 1]; + } +} + +// interleave stereo +void AudioReverb::convertOutputToFloat(float** inputs, float* output, int numFrames) { + + int i = 0; + for(; i < numFrames - 3; i += 4) { + __m128 f0 = _mm_loadu_ps(&inputs[0][i]); + __m128 f1 = _mm_loadu_ps(&inputs[1][i]); + + // interleave + _mm_storeu_ps(&output[2*i + 0],_mm_unpacklo_ps(f0,f1)); + _mm_storeu_ps(&output[2*i + 4],_mm_unpackhi_ps(f0,f1)); + } + for(; i < numFrames; i++) { + // interleave + output[2*i + 0] = inputs[0][i]; + output[2*i + 1] = inputs[1][i]; + } +} + #else // convert int16_t to float, deinterleave stereo @@ -1944,6 +1982,26 @@ void AudioReverb::convertOutputToInt16(float** inputs, int16_t* output, int numF } } +// deinterleave stereo +void AudioReverb::convertInputFromFloat(const float* input, float** outputs, int numFrames) { + + for (int i = 0; i < numFrames; i++) { + // deinterleave + outputs[0][i] = input[2*i + 0]; + outputs[1][i] = input[2*i + 1]; + } +} + +// interleave stereo +void AudioReverb::convertOutputToFloat(float** inputs, float* output, int numFrames) { + + for (int i = 0; i < numFrames; i++) { + // interleave + output[2*i + 0] = inputs[0][i]; + output[2*i + 1] = inputs[1][i]; + } +} + #endif // @@ -1966,3 +2024,24 @@ void AudioReverb::render(const int16_t* input, int16_t* output, int numFrames) { numFrames -= n; } } + +// +// This version handles input/output as interleaved float +// +void AudioReverb::render(const float* input, float* output, int numFrames) { + + while (numFrames) { + + int n = MIN(numFrames, REVERB_BLOCK); + + convertInputFromFloat(input, _inout, n); + + _impl->process(_inout, _inout, n); + + convertOutputToFloat(_inout, output, n); + + input += 2 * n; + output += 2 * n; + numFrames -= n; + } +} diff --git a/libraries/audio/src/AudioReverb.h b/libraries/audio/src/AudioReverb.h index 639d62d8ec..ee163698ea 100644 --- a/libraries/audio/src/AudioReverb.h +++ b/libraries/audio/src/AudioReverb.h @@ -64,13 +64,20 @@ public: // interleaved int16_t input/output void render(const int16_t* input, int16_t* output, int numFrames); + // interleaved float input/output + void render(const float* input, float* output, int numFrames); + private: ReverbImpl *_impl; ReverbParameters _params; float* _inout[2]; + void convertInputFromInt16(const int16_t* input, float** outputs, int numFrames); void convertOutputToInt16(float** inputs, int16_t* output, int numFrames); + + void convertInputFromFloat(const float* input, float** outputs, int numFrames); + void convertOutputToFloat(float** inputs, float* output, int numFrames); }; #endif // hifi_AudioReverb_h From b7874116b9377bf6029ac6842c99b15f3221e595 Mon Sep 17 00:00:00 2001 From: humbletim Date: Sat, 2 Jul 2016 23:36:08 -0400 Subject: [PATCH 22/26] fix TypedArray byte ordering and .subarray end indexing --- .../script-engine/src/TypedArrayPrototype.cpp | 4 +- libraries/script-engine/src/TypedArrays.cpp | 12 +++- .../diagnostics/typedArraysUnitTest.js | 58 ++++++++++++++++++- 3 files changed, 71 insertions(+), 3 deletions(-) diff --git a/libraries/script-engine/src/TypedArrayPrototype.cpp b/libraries/script-engine/src/TypedArrayPrototype.cpp index bb612b393f..4de948e806 100644 --- a/libraries/script-engine/src/TypedArrayPrototype.cpp +++ b/libraries/script-engine/src/TypedArrayPrototype.cpp @@ -71,8 +71,10 @@ QScriptValue TypedArrayPrototype::subarray(qint32 begin, qint32 end) { end = (end < 0) ? length + end : end; // here we clamp the indices to fit the array + // note: begin offset is *inclusive* while end offset is *exclusive* + // (see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray#Parameters) begin = glm::clamp(begin, 0, (length - 1)); - end = glm::clamp(end, 0, (length - 1)); + end = glm::clamp(end, 0, length); byteOffset += begin * bytesPerElement; length = (end - begin > 0) ? end - begin : 0; diff --git a/libraries/script-engine/src/TypedArrays.cpp b/libraries/script-engine/src/TypedArrays.cpp index c1c4117f76..4d5181ff33 100644 --- a/libraries/script-engine/src/TypedArrays.cpp +++ b/libraries/script-engine/src/TypedArrays.cpp @@ -88,7 +88,11 @@ QScriptValue TypedArray::construct(QScriptContext* context, QScriptEngine* engin if (arrayBuffer) { if (context->argumentCount() == 1) { // Case for entire ArrayBuffer - newObject = cls->newInstance(bufferArg, 0, arrayBuffer->size()); + if (arrayBuffer->size() % cls->_bytesPerElement != 0) { + engine->evaluate("throw \"RangeError: byteLength is not a multiple of BYTES_PER_ELEMENT\""); + } + quint32 length = arrayBuffer->size() / cls->_bytesPerElement; + newObject = cls->newInstance(bufferArg, 0, length); } else { QScriptValue byteOffsetArg = context->argument(1); if (!byteOffsetArg.isNumber()) { @@ -206,6 +210,7 @@ QScriptValue propertyHelper(const QByteArray* arrayBuffer, const QScriptString& QDataStream stream(*arrayBuffer); stream.skipRawData(id); + stream.setByteOrder(QDataStream::LittleEndian); T result; stream >> result; return result; @@ -218,6 +223,7 @@ void setPropertyHelper(QByteArray* arrayBuffer, const QScriptString& name, uint if (arrayBuffer && value.isNumber()) { QDataStream stream(arrayBuffer, QIODevice::ReadWrite); stream.skipRawData(id); + stream.setByteOrder(QDataStream::LittleEndian); stream << (T)value.toNumber(); } @@ -357,6 +363,7 @@ QScriptValue Float32ArrayClass::property(const QScriptValue& object, const QScri if (ok && arrayBuffer) { QDataStream stream(*arrayBuffer); stream.skipRawData(id); + stream.setByteOrder(QDataStream::LittleEndian); stream.setFloatingPointPrecision(QDataStream::SinglePrecision); float result; @@ -375,6 +382,7 @@ void Float32ArrayClass::setProperty(QScriptValue& object, const QScriptString& n if (ba && value.isNumber()) { QDataStream stream(ba, QIODevice::ReadWrite); stream.skipRawData(id); + stream.setByteOrder(QDataStream::LittleEndian); stream.setFloatingPointPrecision(QDataStream::SinglePrecision); stream << (float)value.toNumber(); @@ -392,6 +400,7 @@ QScriptValue Float64ArrayClass::property(const QScriptValue& object, const QScri if (ok && arrayBuffer) { QDataStream stream(*arrayBuffer); stream.skipRawData(id); + stream.setByteOrder(QDataStream::LittleEndian); stream.setFloatingPointPrecision(QDataStream::DoublePrecision); double result; @@ -410,6 +419,7 @@ void Float64ArrayClass::setProperty(QScriptValue& object, const QScriptString& n if (ba && value.isNumber()) { QDataStream stream(ba, QIODevice::ReadWrite); stream.skipRawData(id); + stream.setByteOrder(QDataStream::LittleEndian); stream.setFloatingPointPrecision(QDataStream::DoublePrecision); stream << (double)value.toNumber(); diff --git a/scripts/developer/utilities/diagnostics/typedArraysUnitTest.js b/scripts/developer/utilities/diagnostics/typedArraysUnitTest.js index a50a40e43e..c61865c8d6 100644 --- a/scripts/developer/utilities/diagnostics/typedArraysUnitTest.js +++ b/scripts/developer/utilities/diagnostics/typedArraysUnitTest.js @@ -9,7 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -Script.include("../../libraries/unitTest.js"); +Script.include("../../../../script-archive/libraries/unitTest.js"); // e.g. extractbits([0xff, 0x80, 0x00, 0x00], 23, 30); inclusive function extractbits(bytes, lo, hi) { @@ -551,6 +551,20 @@ test('TypedArray.subarray', function () { this.arrayEqual(a.subarray(-1, -4), []); this.arrayEqual(a.subarray(1).subarray(1), [3, 4, 5]); this.arrayEqual(a.subarray(1, 4).subarray(1, 2), [3]); + + var a = new Float32Array(16); + a[0] = -1; + a[15] = 1/8; + this.assertEquals(a.length, 16); + this.assertEquals(a.byteLength, a.length * a.BYTES_PER_ELEMENT); + + this.assertEquals(a.subarray(-12).length, 12, '[-12,)'); + this.arrayEqual(a.subarray(-16), a, '[-16,)'); + this.arrayEqual(a.subarray(12, 16), [0,0,0,1/8], '[12,16)'); + this.arrayEqual(a.subarray(0, 4), [-1,0,0,0],'[0,4)'); + this.arrayEqual(a.subarray(-16, -12), [-1,0,0,0],'[-16,-12)'); + this.assertEquals(a.subarray(0, -12).length, 4,'[0,-12)'); + this.arrayEqual(a.subarray(-10), a.subarray(6),'[-10,)'); }); @@ -706,3 +720,45 @@ test('Regression Tests', function() { this.assertEquals(truncated, -minFloat32, 'smallest 32 bit float should not truncate to zero'); }); +test('new TypedArray(ArrayBuffer).length Tests', function() { + var uint8s = new Uint8Array([0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff]), + buffer = uint8s.buffer; + + this.assertEquals(buffer.byteLength, 8, 'buffer.length'); + + var _this = this; + [ + 'Uint8Array', 'Uint16Array', 'Uint32Array', 'Int8Array', 'Int16Array', 'Int32Array', + 'Float32Array', 'Float64Array', 'Uint8ClampedArray' + ].forEach(function(typeArrayName) { + var typeArray = eval(typeArrayName); + var a = new typeArray(buffer); + _this.assertEquals(a.BYTES_PER_ELEMENT, typeArrayName.match(/\d+/)[0]/8, typeArrayName+'.BYTES_PER_ELEMENT'); + _this.assertEquals(a.byteLength, buffer.byteLength, typeArrayName+'.byteLength'); + _this.assertEquals(a.length, buffer.byteLength / typeArray.BYTES_PER_ELEMENT, typeArrayName+'.length'); + }); +}); + +test('Native endianness check', function() { + var buffer = ArrayBuffer(4); + new Uint8Array(buffer).set([0xaa, 0xbb, 0xcc, 0xdd]); + var endian = { aabbccdd: 'big', ddccbbaa: 'little' }[ + new Uint32Array(buffer)[0].toString(16) + ]; + this.assertEquals(endian, 'little'); +}); + +test('TypeArray byte order tests', function() { + var uint8s = new Uint8Array([0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff]), + buffer = uint8s.buffer; + + this.arrayEqual(new Uint8Array(buffer), [0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff], "Uint8Array"); + this.arrayEqual(new Uint16Array(buffer), [0x00ff, 0x0000, 0x0000, 0xff00], "Uint16Array"); + this.arrayEqual(new Uint32Array(buffer), [0x000000ff, 0xff000000], "Uint32Array"); + + this.arrayEqual(new Int8Array(buffer), [-1,0,0,0,0,0,0,-1], "Int8Array"); + this.arrayEqual(new Int16Array(buffer), [255, 0, 0, -256], "Int16Array"); + + this.arrayEqual(new Float32Array(buffer), [3.5733110840282835e-43, -1.7014118346046923e+38], "Float32Array"); + this.arrayEqual(new Float64Array(buffer), [-5.486124068793999e+303], "Float64Array"); +}); From f7c9957bb1d391a33c096485a9fb1cc637c6600e Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Sun, 3 Jul 2016 11:33:05 -0700 Subject: [PATCH 23/26] PR feedback: better naming of convertInput() and convertOutput() --- libraries/audio/src/AudioSRC.cpp | 28 ++++++++++++++-------------- libraries/audio/src/AudioSRC.h | 8 ++++---- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/libraries/audio/src/AudioSRC.cpp b/libraries/audio/src/AudioSRC.cpp index 185ad948e7..5dba63b349 100644 --- a/libraries/audio/src/AudioSRC.cpp +++ b/libraries/audio/src/AudioSRC.cpp @@ -389,7 +389,7 @@ int AudioSRC::multirateFilter2(const float* input0, const float* input1, float* } // convert int16_t to float, deinterleave stereo -void AudioSRC::convertInputFromInt16(const int16_t* input, float** outputs, int numFrames) { +void AudioSRC::convertInput(const int16_t* input, float** outputs, int numFrames) { __m128 scale = _mm_set1_ps(1/32768.0f); if (_numChannels == 1) { @@ -467,8 +467,8 @@ static inline __m128 dither4() { return _mm_mul_ps(d0, _mm_set1_ps(1/65536.0f)); } -// convert float to int16_t, interleave stereo -void AudioSRC::convertOutputToInt16(float** inputs, int16_t* output, int numFrames) { +// convert float to int16_t with dither, interleave stereo +void AudioSRC::convertOutput(float** inputs, int16_t* output, int numFrames) { __m128 scale = _mm_set1_ps(32768.0f); if (_numChannels == 1) { @@ -540,7 +540,7 @@ void AudioSRC::convertOutputToInt16(float** inputs, int16_t* output, int numFram } // deinterleave stereo -void AudioSRC::convertInputFromFloat(const float* input, float** outputs, int numFrames) { +void AudioSRC::convertInput(const float* input, float** outputs, int numFrames) { if (_numChannels == 1) { @@ -566,7 +566,7 @@ void AudioSRC::convertInputFromFloat(const float* input, float** outputs, int nu } // interleave stereo -void AudioSRC::convertOutputToFloat(float** inputs, float* output, int numFrames) { +void AudioSRC::convertOutput(float** inputs, float* output, int numFrames) { if (_numChannels == 1) { @@ -726,7 +726,7 @@ int AudioSRC::multirateFilter2(const float* input0, const float* input1, float* } // convert int16_t to float, deinterleave stereo -void AudioSRC::convertInputFromInt16(const int16_t* input, float** outputs, int numFrames) { +void AudioSRC::convertInput(const int16_t* input, float** outputs, int numFrames) { const float scale = 1/32768.0f; if (_numChannels == 1) { @@ -750,8 +750,8 @@ static inline float dither() { return (int32_t)(r0 - r1) * (1/65536.0f); } -// convert float to int16_t, interleave stereo -void AudioSRC::convertOutputToInt16(float** inputs, int16_t* output, int numFrames) { +// convert float to int16_t with dither, interleave stereo +void AudioSRC::convertOutput(float** inputs, int16_t* output, int numFrames) { const float scale = 32768.0f; if (_numChannels == 1) { @@ -791,7 +791,7 @@ void AudioSRC::convertOutputToInt16(float** inputs, int16_t* output, int numFram } // deinterleave stereo -void AudioSRC::convertInputFromFloat(const float* input, float** outputs, int numFrames) { +void AudioSRC::convertInput(const float* input, float** outputs, int numFrames) { if (_numChannels == 1) { @@ -807,7 +807,7 @@ void AudioSRC::convertInputFromFloat(const float* input, float** outputs, int nu } // interleave stereo -void AudioSRC::convertOutputToFloat(float** inputs, float* output, int numFrames) { +void AudioSRC::convertOutput(float** inputs, float* output, int numFrames) { if (_numChannels == 1) { @@ -953,12 +953,12 @@ int AudioSRC::render(const int16_t* input, int16_t* output, int inputFrames) { int ni = std::min(inputFrames, _inputBlock); - convertInputFromInt16(input, _inputs, ni); + convertInput(input, _inputs, ni); int no = render(_inputs, _outputs, ni); assert(no <= SRC_BLOCK); - convertOutputToInt16(_outputs, output, no); + convertOutput(_outputs, output, no); input += _numChannels * ni; output += _numChannels * no; @@ -979,12 +979,12 @@ int AudioSRC::render(const float* input, float* output, int inputFrames) { int ni = std::min(inputFrames, _inputBlock); - convertInputFromFloat(input, _inputs, ni); + convertInput(input, _inputs, ni); int no = render(_inputs, _outputs, ni); assert(no <= SRC_BLOCK); - convertOutputToFloat(_outputs, output, no); + convertOutput(_outputs, output, no); input += _numChannels * ni; output += _numChannels * no; diff --git a/libraries/audio/src/AudioSRC.h b/libraries/audio/src/AudioSRC.h index e8c8f4370f..f7becc22c3 100644 --- a/libraries/audio/src/AudioSRC.h +++ b/libraries/audio/src/AudioSRC.h @@ -82,11 +82,11 @@ private: int multirateFilter1_AVX2(const float* input0, float* output0, int inputFrames); int multirateFilter2_AVX2(const float* input0, const float* input1, float* output0, float* output1, int inputFrames); - void convertInputFromInt16(const int16_t* input, float** outputs, int numFrames); - void convertOutputToInt16(float** inputs, int16_t* output, int numFrames); + void convertInput(const int16_t* input, float** outputs, int numFrames); + void convertOutput(float** inputs, int16_t* output, int numFrames); - void convertInputFromFloat(const float* input, float** outputs, int numFrames); - void convertOutputToFloat(float** inputs, float* output, int numFrames); + void convertInput(const float* input, float** outputs, int numFrames); + void convertOutput(float** inputs, float* output, int numFrames); }; #endif // AudioSRC_h From 014f6fa259f5b12f9492fd534c39fa28a3617f18 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Sun, 3 Jul 2016 11:40:32 -0700 Subject: [PATCH 24/26] PR feedback: better naming of convertInput() and convertOutput() --- libraries/audio/src/AudioReverb.cpp | 28 ++++++++++++++-------------- libraries/audio/src/AudioReverb.h | 8 ++++---- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/libraries/audio/src/AudioReverb.cpp b/libraries/audio/src/AudioReverb.cpp index 5f1da56b4c..652f7ed58d 100644 --- a/libraries/audio/src/AudioReverb.cpp +++ b/libraries/audio/src/AudioReverb.cpp @@ -1804,7 +1804,7 @@ void AudioReverb::render(float** inputs, float** outputs, int numFrames) { #include // convert int16_t to float, deinterleave stereo -void AudioReverb::convertInputFromInt16(const int16_t* input, float** outputs, int numFrames) { +void AudioReverb::convertInput(const int16_t* input, float** outputs, int numFrames) { __m128 scale = _mm_set1_ps(1/32768.0f); int i = 0; @@ -1855,8 +1855,8 @@ static inline __m128 dither4() { return _mm_mul_ps(d0, _mm_set1_ps(1/65536.0f)); } -// convert float to int16_t, interleave stereo -void AudioReverb::convertOutputToInt16(float** inputs, int16_t* output, int numFrames) { +// convert float to int16_t with dither, interleave stereo +void AudioReverb::convertOutput(float** inputs, int16_t* output, int numFrames) { __m128 scale = _mm_set1_ps(32768.0f); int i = 0; @@ -1899,7 +1899,7 @@ void AudioReverb::convertOutputToInt16(float** inputs, int16_t* output, int numF } // deinterleave stereo -void AudioReverb::convertInputFromFloat(const float* input, float** outputs, int numFrames) { +void AudioReverb::convertInput(const float* input, float** outputs, int numFrames) { int i = 0; for (; i < numFrames - 3; i += 4) { @@ -1918,7 +1918,7 @@ void AudioReverb::convertInputFromFloat(const float* input, float** outputs, int } // interleave stereo -void AudioReverb::convertOutputToFloat(float** inputs, float* output, int numFrames) { +void AudioReverb::convertOutput(float** inputs, float* output, int numFrames) { int i = 0; for(; i < numFrames - 3; i += 4) { @@ -1939,7 +1939,7 @@ void AudioReverb::convertOutputToFloat(float** inputs, float* output, int numFra #else // convert int16_t to float, deinterleave stereo -void AudioReverb::convertInputFromInt16(const int16_t* input, float** outputs, int numFrames) { +void AudioReverb::convertInput(const int16_t* input, float** outputs, int numFrames) { const float scale = 1/32768.0f; for (int i = 0; i < numFrames; i++) { @@ -1957,8 +1957,8 @@ static inline float dither() { return (int32_t)(r0 - r1) * (1/65536.0f); } -// convert float to int16_t, interleave stereo -void AudioReverb::convertOutputToInt16(float** inputs, int16_t* output, int numFrames) { +// convert float to int16_t with dither, interleave stereo +void AudioReverb::convertOutput(float** inputs, int16_t* output, int numFrames) { const float scale = 32768.0f; for (int i = 0; i < numFrames; i++) { @@ -1983,7 +1983,7 @@ void AudioReverb::convertOutputToInt16(float** inputs, int16_t* output, int numF } // deinterleave stereo -void AudioReverb::convertInputFromFloat(const float* input, float** outputs, int numFrames) { +void AudioReverb::convertInput(const float* input, float** outputs, int numFrames) { for (int i = 0; i < numFrames; i++) { // deinterleave @@ -1993,7 +1993,7 @@ void AudioReverb::convertInputFromFloat(const float* input, float** outputs, int } // interleave stereo -void AudioReverb::convertOutputToFloat(float** inputs, float* output, int numFrames) { +void AudioReverb::convertOutput(float** inputs, float* output, int numFrames) { for (int i = 0; i < numFrames; i++) { // interleave @@ -2013,11 +2013,11 @@ void AudioReverb::render(const int16_t* input, int16_t* output, int numFrames) { int n = MIN(numFrames, REVERB_BLOCK); - convertInputFromInt16(input, _inout, n); + convertInput(input, _inout, n); _impl->process(_inout, _inout, n); - convertOutputToInt16(_inout, output, n); + convertOutput(_inout, output, n); input += 2 * n; output += 2 * n; @@ -2034,11 +2034,11 @@ void AudioReverb::render(const float* input, float* output, int numFrames) { int n = MIN(numFrames, REVERB_BLOCK); - convertInputFromFloat(input, _inout, n); + convertInput(input, _inout, n); _impl->process(_inout, _inout, n); - convertOutputToFloat(_inout, output, n); + convertOutput(_inout, output, n); input += 2 * n; output += 2 * n; diff --git a/libraries/audio/src/AudioReverb.h b/libraries/audio/src/AudioReverb.h index ee163698ea..adb8890f6a 100644 --- a/libraries/audio/src/AudioReverb.h +++ b/libraries/audio/src/AudioReverb.h @@ -73,11 +73,11 @@ private: float* _inout[2]; - void convertInputFromInt16(const int16_t* input, float** outputs, int numFrames); - void convertOutputToInt16(float** inputs, int16_t* output, int numFrames); + void convertInput(const int16_t* input, float** outputs, int numFrames); + void convertOutput(float** inputs, int16_t* output, int numFrames); - void convertInputFromFloat(const float* input, float** outputs, int numFrames); - void convertOutputToFloat(float** inputs, float* output, int numFrames); + void convertInput(const float* input, float** outputs, int numFrames); + void convertOutput(float** inputs, float* output, int numFrames); }; #endif // hifi_AudioReverb_h From f43c6447e1abd6c3f3ec8934eef82a217ce0c698 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Sun, 3 Jul 2016 11:46:23 -0700 Subject: [PATCH 25/26] remove unneeded #pragma --- libraries/audio/src/AudioReverb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio/src/AudioReverb.cpp b/libraries/audio/src/AudioReverb.cpp index 652f7ed58d..c561231376 100644 --- a/libraries/audio/src/AudioReverb.cpp +++ b/libraries/audio/src/AudioReverb.cpp @@ -13,13 +13,13 @@ #include "AudioReverb.h" #ifdef _MSC_VER -#pragma warning(disable : 4351) // new behavior: elements of array will be default initialized #include inline static int MULHI(int a, int b) { long long c = __emul(a, b); return ((int*)&c)[1]; } + #else #define MULHI(a,b) (int)(((long long)(a) * (b)) >> 32) From 0ad7aa72fb09f7b67da3399a2ff0cb83d33e05d2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 4 Jul 2016 14:34:38 +1200 Subject: [PATCH 26/26] Prevent users window from being dragged offscreen --- scripts/system/users.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/system/users.js b/scripts/system/users.js index 2ff2689bad..853067b90b 100644 --- a/scripts/system/users.js +++ b/scripts/system/users.js @@ -344,6 +344,7 @@ var usersWindow = (function () { windowTextHeight, windowLineSpacing, windowLineHeight, // = windowTextHeight + windowLineSpacing + windowMinimumHeight, usersOnline, // Raw users data linesOfUsers = [], // Array of indexes pointing into usersOnline @@ -435,6 +436,11 @@ var usersWindow = (function () { } } + function saturateWindowPosition() { + windowPosition.x = Math.max(0, Math.min(viewport.x - WINDOW_WIDTH, windowPosition.x)); + windowPosition.y = Math.max(windowMinimumHeight, Math.min(viewport.y, windowPosition.y)); + } + function updateOverlayPositions() { // Overlay positions are all relative to windowPosition; windowPosition is the position of the windowPane overlay. var windowLeft = windowPosition.x, @@ -854,6 +860,8 @@ var usersWindow = (function () { x: event.x - movingClickOffset.x, y: event.y - movingClickOffset.y }; + + saturateWindowPosition(); calculateWindowHeight(); updateOverlayPositions(); updateUsersDisplay(); @@ -947,6 +955,7 @@ var usersWindow = (function () { windowTextHeight = Math.floor(Overlays.textSize(textSizeOverlay, "1").height); windowLineSpacing = Math.floor(Overlays.textSize(textSizeOverlay, "1\n2").height - 2 * windowTextHeight); windowLineHeight = windowTextHeight + windowLineSpacing; + windowMinimumHeight = windowTextHeight + WINDOW_MARGIN + WINDOW_BASE_MARGIN; Overlays.deleteOverlay(textSizeOverlay); viewport = Controller.getViewportDimensions(); @@ -958,7 +967,6 @@ var usersWindow = (function () { if (offset.hasOwnProperty("x") && offset.hasOwnProperty("y")) { windowPosition.x = offset.x < 0 ? viewport.x + offset.x : offset.x; windowPosition.y = offset.y <= 0 ? viewport.y + offset.y : offset.y; - } else { hmdViewport = Controller.getRecommendedOverlayRect(); windowPosition = { @@ -967,6 +975,7 @@ var usersWindow = (function () { }; } + saturateWindowPosition(); calculateWindowHeight(); windowBorder = Overlays.addOverlay("rectangle", {