From 6d7f8f4a6f2f7a9ce5f29a7e748b385806d0fe3c Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Mon, 18 Apr 2016 16:46:37 -0700 Subject: [PATCH 01/13] Make RateCounter rate atomic --- libraries/shared/src/shared/RateCounter.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/shared/RateCounter.h b/libraries/shared/src/shared/RateCounter.h index e24b1e6eca..2a06c5d09c 100644 --- a/libraries/shared/src/shared/RateCounter.h +++ b/libraries/shared/src/shared/RateCounter.h @@ -11,6 +11,7 @@ #define hifi_Shared_RateCounter_h #include +#include #include #include @@ -42,7 +43,7 @@ public: private: uint64_t _start { usecTimestampNow() }; size_t _count { 0 }; - float _rate { 0 }; + std::atomic _rate { 0 }; const float _scale { powf(10, PRECISION) }; }; From f48541961d461cc8eca524f18e1228c778de23d5 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Mon, 18 Apr 2016 17:26:29 -0700 Subject: [PATCH 02/13] Expose Rates to JS/QML --- interface/src/Application.cpp | 28 ++++++++++++++++++++++++++++ interface/src/Application.h | 1 + 2 files changed, 29 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 41eb7a305d..5383d130ab 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -508,6 +508,26 @@ Q_GUI_EXPORT void qt_gl_set_global_share_context(QOpenGLContext *context); Setting::Handle sessionRunTime{ "sessionRunTime", 0 }; +class Rates : public QObject { + Q_OBJECT + + Q_PROPERTY(float render READ getRenderRate) + Q_PROPERTY(float present READ getPresentRate) + Q_PROPERTY(float newFrame READ getNewFrameRate) + Q_PROPERTY(float dropped READ getDropRate) + Q_PROPERTY(float simulation READ getSimulationRate) + Q_PROPERTY(float avatar READ getAvatarRate) + +public: + Rates(QObject* parent) : QObject(parent) {} + float getRenderRate() { return qApp->getFps(); } + float getPresentRate() { return qApp->getActiveDisplayPlugin()->presentRate(); } + float getNewFrameRate() { return qApp->getActiveDisplayPlugin()->newFramePresentRate(); } + float getDropRate() { return qApp->getActiveDisplayPlugin()->droppedFrameRate(); } + float getSimulationRate() { return qApp->getAverageSimsPerSecond(); } + float getAvatarRate() { return qApp->getAvatarSimrate(); } +}; + Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : QApplication(argc, argv), _window(new MainWindow(desktop())), @@ -531,6 +551,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : _notifiedPacketVersionMismatchThisDomain(false), _maxOctreePPS(maxOctreePacketsPerSecond.get()), _lastFaceTrackerUpdate(0) + { // FIXME this may be excessively conservative. On the other hand // maybe I'm used to having an 8-core machine @@ -766,6 +787,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : ResourceCache::setRequestLimit(3); + _rates = new Rates(this); + _glWidget = new GLCanvas(); getApplicationCompositor().setRenderingWidget(_glWidget); _window->setCentralWidget(_glWidget); @@ -1390,6 +1413,7 @@ void Application::initializeUi() { rootContext->setContextProperty("Preferences", DependencyManager::get().data()); rootContext->setContextProperty("AddressManager", DependencyManager::get().data()); rootContext->setContextProperty("FrameTimings", &_frameTimingsScriptingInterface); + rootContext->setContextProperty("Rates", _rates); rootContext->setContextProperty("TREE_SCALE", TREE_SCALE); rootContext->setContextProperty("Quat", new Quat()); @@ -4443,6 +4467,8 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri // AvatarManager has some custom types AvatarManager::registerMetaTypes(scriptEngine); + scriptEngine->registerGlobalObject("Rates", _rates); + // hook our avatar and avatar hash map object into this script engine scriptEngine->registerGlobalObject("MyAvatar", getMyAvatar()); qScriptRegisterMetaType(scriptEngine, audioListenModeToScriptValue, audioListenModeFromScriptValue); @@ -5270,3 +5296,5 @@ void Application::showDesktop() { CompositorHelper& Application::getApplicationCompositor() const { return *DependencyManager::get(); } + +#include "Application.moc" diff --git a/interface/src/Application.h b/interface/src/Application.h index 6bfad21525..78424d0f57 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -399,6 +399,7 @@ private: uint32_t _frameCount { 0 }; // Frame Rate Measurement + QObject* _rates; RateCounter<> _frameCounter; RateCounter<> _avatarSimCounter; RateCounter<> _simCounter; From b11d6ca1c6723d04703055ed08f25937e8dbf1ae Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Mon, 18 Apr 2016 16:28:27 -0700 Subject: [PATCH 03/13] Make Render Rates qml script --- examples/utilities/render/rates.qml | 49 ++++++++++++++++++++++++ examples/utilities/render/renderRates.js | 21 ++++++++++ 2 files changed, 70 insertions(+) create mode 100644 examples/utilities/render/rates.qml create mode 100644 examples/utilities/render/renderRates.js diff --git a/examples/utilities/render/rates.qml b/examples/utilities/render/rates.qml new file mode 100644 index 0000000000..f4a4ee2c6c --- /dev/null +++ b/examples/utilities/render/rates.qml @@ -0,0 +1,49 @@ +// +// stats.qml +// examples/utilities/cache +// +// Created by Zach Pomerantz on 4/1/2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html +// +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import "../lib/plotperf" + +Item { + id: root + anchors.fill: parent + + property var caches: [ ["Present", "present"], ["Present", "present"], ["New", "newFrame"], ["Dropped", "dropped"], ["Simulation", "simulation"], ["Avatar", "avatar"] ] + property var colors: [ "#1AC567", "#00B4EF" ] + + Grid { + id: grid + rows: (root.caches.length / 2); columns: 2; spacing: 8 + anchors.fill: parent + + Repeater { + id: repeater + + model: root.caches + + Row { + PlotPerf { + title: modelData[0] + " Rate" + height: (grid.height - (grid.spacing * ((root.caches.length / 2) + 1))) / (root.caches.length / 2) + width: grid.width / 2 - grid.spacing * 1.5 + object: Rates + valueScale: 1 + valueUnit: "fps" + valueNumDigits: "2" + plots: [{ + prop: modelData[1], + color: root.colors[index % 2] + }] + } + } + } + } +} diff --git a/examples/utilities/render/renderRates.js b/examples/utilities/render/renderRates.js new file mode 100644 index 0000000000..1d15f4041c --- /dev/null +++ b/examples/utilities/render/renderRates.js @@ -0,0 +1,21 @@ +// +// cacheStats.js +// examples/utilities/cache +// +// Zach Pomerantz, created on 4/1/2016. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +// Set up the qml ui +var qml = Script.resolvePath('rates.qml'); +var window = new OverlayWindow({ + title: 'Render Rates', + source: qml, + width: 300, + height: 200 +}); +window.setPosition(500, 50); +window.closed.connect(function() { Script.stop(); }); From 4dacb04ee17fa8ad35b5c836ae8821dde7462eb1 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 19 Apr 2016 16:01:55 -0700 Subject: [PATCH 04/13] Rm myAvatar motion states on shutdown --- interface/src/avatar/AvatarManager.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index efd1bede47..402245d0c3 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -254,10 +254,7 @@ void AvatarManager::clearAllAvatars() { QWriteLocker locker(&_hashLock); - _myAvatar->die(); - _myAvatar.reset(); - - _avatarHash.clear(); + handleRemovedAvatar(_myAvatar); } void AvatarManager::setLocalLights(const QVector& localLights) { From 1fe12e70294a95535c1374cdd7c728aa3a66bdfe Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 20 Apr 2016 13:24:55 -0700 Subject: [PATCH 05/13] Mv Rates to RatesScriptingInterface.h --- interface/src/Application.cpp | 30 ++-------------- interface/src/Application.h | 1 - .../src/scripting/RatesScriptingInterface.h | 35 +++++++++++++++++++ 3 files changed, 38 insertions(+), 28 deletions(-) create mode 100644 interface/src/scripting/RatesScriptingInterface.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 5383d130ab..88f06cb00a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -131,6 +131,7 @@ #include "scripting/WebWindowClass.h" #include "scripting/WindowScriptingInterface.h" #include "scripting/ControllerScriptingInterface.h" +#include "scripting/RatesScriptingInterface.h" #if defined(Q_OS_MAC) || defined(Q_OS_WIN) #include "SpeechRecognizer.h" #endif @@ -508,26 +509,6 @@ Q_GUI_EXPORT void qt_gl_set_global_share_context(QOpenGLContext *context); Setting::Handle sessionRunTime{ "sessionRunTime", 0 }; -class Rates : public QObject { - Q_OBJECT - - Q_PROPERTY(float render READ getRenderRate) - Q_PROPERTY(float present READ getPresentRate) - Q_PROPERTY(float newFrame READ getNewFrameRate) - Q_PROPERTY(float dropped READ getDropRate) - Q_PROPERTY(float simulation READ getSimulationRate) - Q_PROPERTY(float avatar READ getAvatarRate) - -public: - Rates(QObject* parent) : QObject(parent) {} - float getRenderRate() { return qApp->getFps(); } - float getPresentRate() { return qApp->getActiveDisplayPlugin()->presentRate(); } - float getNewFrameRate() { return qApp->getActiveDisplayPlugin()->newFramePresentRate(); } - float getDropRate() { return qApp->getActiveDisplayPlugin()->droppedFrameRate(); } - float getSimulationRate() { return qApp->getAverageSimsPerSecond(); } - float getAvatarRate() { return qApp->getAvatarSimrate(); } -}; - Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : QApplication(argc, argv), _window(new MainWindow(desktop())), @@ -551,7 +532,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : _notifiedPacketVersionMismatchThisDomain(false), _maxOctreePPS(maxOctreePacketsPerSecond.get()), _lastFaceTrackerUpdate(0) - { // FIXME this may be excessively conservative. On the other hand // maybe I'm used to having an 8-core machine @@ -787,8 +767,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : ResourceCache::setRequestLimit(3); - _rates = new Rates(this); - _glWidget = new GLCanvas(); getApplicationCompositor().setRenderingWidget(_glWidget); _window->setCentralWidget(_glWidget); @@ -1413,7 +1391,7 @@ void Application::initializeUi() { rootContext->setContextProperty("Preferences", DependencyManager::get().data()); rootContext->setContextProperty("AddressManager", DependencyManager::get().data()); rootContext->setContextProperty("FrameTimings", &_frameTimingsScriptingInterface); - rootContext->setContextProperty("Rates", _rates); + rootContext->setContextProperty("Rates", new RatesScriptingInterface(this)); rootContext->setContextProperty("TREE_SCALE", TREE_SCALE); rootContext->setContextProperty("Quat", new Quat()); @@ -4467,7 +4445,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri // AvatarManager has some custom types AvatarManager::registerMetaTypes(scriptEngine); - scriptEngine->registerGlobalObject("Rates", _rates); + scriptEngine->registerGlobalObject("Rates", new RatesScriptingInterface(this)); // hook our avatar and avatar hash map object into this script engine scriptEngine->registerGlobalObject("MyAvatar", getMyAvatar()); @@ -5296,5 +5274,3 @@ void Application::showDesktop() { CompositorHelper& Application::getApplicationCompositor() const { return *DependencyManager::get(); } - -#include "Application.moc" diff --git a/interface/src/Application.h b/interface/src/Application.h index 78424d0f57..6bfad21525 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -399,7 +399,6 @@ private: uint32_t _frameCount { 0 }; // Frame Rate Measurement - QObject* _rates; RateCounter<> _frameCounter; RateCounter<> _avatarSimCounter; RateCounter<> _simCounter; diff --git a/interface/src/scripting/RatesScriptingInterface.h b/interface/src/scripting/RatesScriptingInterface.h new file mode 100644 index 0000000000..d849fe3f8c --- /dev/null +++ b/interface/src/scripting/RatesScriptingInterface.h @@ -0,0 +1,35 @@ +// +// RatesScriptingInterface.h +// interface/src/scripting +// +// Created by Zach Pomerantz on 4/20/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef HIFI_RATES_SCRIPTING_INTERFACE_H +#define HIFI_RATES_SCRIPTING_INTERFACE_H + +class RatesScriptingInterface : public QObject { + Q_OBJECT + + Q_PROPERTY(float render READ getRenderRate) + Q_PROPERTY(float present READ getPresentRate) + Q_PROPERTY(float newFrame READ getNewFrameRate) + Q_PROPERTY(float dropped READ getDropRate) + Q_PROPERTY(float simulation READ getSimulationRate) + Q_PROPERTY(float avatar READ getAvatarRate) + +public: + Rates(QObject* parent) : QObject(parent) {} + float getRenderRate() { return qApp->getFps(); } + float getPresentRate() { return qApp->getActiveDisplayPlugin()->presentRate(); } + float getNewFrameRate() { return qApp->getActiveDisplayPlugin()->newFramePresentRate(); } + float getDropRate() { return qApp->getActiveDisplayPlugin()->droppedFrameRate(); } + float getSimulationRate() { return qApp->getAverageSimsPerSecond(); } + float getAvatarRate() { return qApp->getAvatarSimrate(); } +}; + +#endif // HIFI_INTERFACE_RATES_SCRIPTING_INTERFACE_H From 477d6f40e4bd1292ecdf4c4e6eaf0f636354c31f Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 20 Apr 2016 13:39:57 -0700 Subject: [PATCH 06/13] Avoid use of atomic copy ctor in RateCounter --- libraries/shared/src/shared/RateCounter.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/shared/RateCounter.h b/libraries/shared/src/shared/RateCounter.h index 2a06c5d09c..d04d87493a 100644 --- a/libraries/shared/src/shared/RateCounter.h +++ b/libraries/shared/src/shared/RateCounter.h @@ -21,6 +21,8 @@ template class RateCounter { public: + RateCounter() { _rate = 0; } // avoid use of std::atomic copy ctor + void increment(size_t count = 1) { auto now = usecTimestampNow(); float currentIntervalMs = (now - _start) / (float) USECS_PER_MSEC; @@ -43,8 +45,8 @@ public: private: uint64_t _start { usecTimestampNow() }; size_t _count { 0 }; - std::atomic _rate { 0 }; const float _scale { powf(10, PRECISION) }; + std::atomic _rate; }; #endif From ad225b3aed6fa465992b587e836a67da87ffea74 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 20 Apr 2016 13:58:06 -0700 Subject: [PATCH 07/13] Fix RatesScriptingInterface ctor --- interface/src/scripting/RatesScriptingInterface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/scripting/RatesScriptingInterface.h b/interface/src/scripting/RatesScriptingInterface.h index d849fe3f8c..1da0aeb505 100644 --- a/interface/src/scripting/RatesScriptingInterface.h +++ b/interface/src/scripting/RatesScriptingInterface.h @@ -23,7 +23,7 @@ class RatesScriptingInterface : public QObject { Q_PROPERTY(float avatar READ getAvatarRate) public: - Rates(QObject* parent) : QObject(parent) {} + RatesScriptingInterface(QObject* parent) : QObject(parent) {} float getRenderRate() { return qApp->getFps(); } float getPresentRate() { return qApp->getActiveDisplayPlugin()->presentRate(); } float getNewFrameRate() { return qApp->getActiveDisplayPlugin()->newFramePresentRate(); } From 2c7cf3ea8378271970971edd91db0404cc3cd7e3 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 20 Apr 2016 14:32:25 -0700 Subject: [PATCH 08/13] Fix RateScriptingInterface headers --- interface/src/scripting/RatesScriptingInterface.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/scripting/RatesScriptingInterface.h b/interface/src/scripting/RatesScriptingInterface.h index 1da0aeb505..7bcab0ea70 100644 --- a/interface/src/scripting/RatesScriptingInterface.h +++ b/interface/src/scripting/RatesScriptingInterface.h @@ -12,6 +12,8 @@ #ifndef HIFI_RATES_SCRIPTING_INTERFACE_H #define HIFI_RATES_SCRIPTING_INTERFACE_H +#include + class RatesScriptingInterface : public QObject { Q_OBJECT From f90e1aaa236cb0da12c3c29aa875123d1ca51fe3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 20 Apr 2016 15:04:10 -0700 Subject: [PATCH 09/13] Remove #line from starsGrid.slf Fails to compile with certain drivers. --- libraries/render-utils/src/starsGrid.slf | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/render-utils/src/starsGrid.slf b/libraries/render-utils/src/starsGrid.slf index c52ccb54d9..ad9a45a4f5 100644 --- a/libraries/render-utils/src/starsGrid.slf +++ b/libraries/render-utils/src/starsGrid.slf @@ -1,6 +1,5 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -#line __LINE__ // Generated on <$_SCRIBE_DATE$> // stars.frag // fragment shader From 9c9bca546cbcec2fb41603fcb05f59ad2b0cdb27 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 21 Apr 2016 11:52:03 +1200 Subject: [PATCH 10/13] Add button that opens scripts directory window --- .../resources/qml/hifi/dialogs/RunningScripts.qml | 11 ++++++++++- libraries/ui/src/FileDialogHelper.cpp | 7 +++++++ libraries/ui/src/FileDialogHelper.h | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/dialogs/RunningScripts.qml b/interface/resources/qml/hifi/dialogs/RunningScripts.qml index 215710cc81..189d5968d0 100644 --- a/interface/resources/qml/hifi/dialogs/RunningScripts.qml +++ b/interface/resources/qml/hifi/dialogs/RunningScripts.qml @@ -24,7 +24,7 @@ Window { resizable: true destroyOnInvisible: true x: 40; y: 40 - implicitWidth: 400; implicitHeight: 695 + implicitWidth: 400; implicitHeight: 742 minSize: Qt.vector2d(200, 300) HifiConstants { id: hifi } @@ -237,6 +237,15 @@ Window { } HifiControls.VerticalSpacer { } + + HifiControls.Button { + id: directoryButton + text: "Reveal Scripts Folder" + width: 200 + onClicked: fileDialogHelper.openScriptsDirectory() + } + + HifiControls.VerticalSpacer { } } } } diff --git a/libraries/ui/src/FileDialogHelper.cpp b/libraries/ui/src/FileDialogHelper.cpp index 82ad877573..9e22d7e441 100644 --- a/libraries/ui/src/FileDialogHelper.cpp +++ b/libraries/ui/src/FileDialogHelper.cpp @@ -14,6 +14,9 @@ #include #include #include +#include + +#include "PathUtils.h" QUrl FileDialogHelper::home() { @@ -103,3 +106,7 @@ QStringList FileDialogHelper::drives() { } return result; } + +void FileDialogHelper::openScriptsDirectory() { + QDesktopServices::openUrl(defaultScriptsLocation()); +} diff --git a/libraries/ui/src/FileDialogHelper.h b/libraries/ui/src/FileDialogHelper.h index 2119b77917..55bc922839 100644 --- a/libraries/ui/src/FileDialogHelper.h +++ b/libraries/ui/src/FileDialogHelper.h @@ -58,6 +58,8 @@ public: Q_INVOKABLE bool validFolder(const QString& path); Q_INVOKABLE QUrl pathToUrl(const QString& path); Q_INVOKABLE QUrl saveHelper(const QString& saveText, const QUrl& currentFolder, const QStringList& selectionFilters); + + Q_INVOKABLE void openScriptsDirectory(); }; From 6c5335cfa76f555ba494c05b16183644eefe0b55 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 21 Apr 2016 15:17:06 +1200 Subject: [PATCH 11/13] Replace button with icon and text --- .../resources/qml/controls-uit/TextAction.qml | 67 +++++++++++++++++++ .../qml/hifi/dialogs/RunningScripts.qml | 25 ++++--- 2 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 interface/resources/qml/controls-uit/TextAction.qml diff --git a/interface/resources/qml/controls-uit/TextAction.qml b/interface/resources/qml/controls-uit/TextAction.qml new file mode 100644 index 0000000000..1c66c3630a --- /dev/null +++ b/interface/resources/qml/controls-uit/TextAction.qml @@ -0,0 +1,67 @@ +// +// TextField.qml +// +// Created by David Rowe on 21 Apr 2016 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +import QtQuick 2.5 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +import "../styles-uit" +import "../controls-uit" as HifiControls + +Item { + property string icon: "" + property int iconSize: 30 + property string text: "" + + property int colorScheme: hifi.colorSchemes.light + readonly property bool isLightColorScheme: colorScheme == hifi.colorSchemes.light + + signal clicked() + + height: Math.max(glyph.visible ? glyph.height - 4 : 0, string.visible ? string.height : 0) + width: glyph.width + string.anchors.leftMargin + string.width + + HiFiGlyphs { + id: glyph + anchors.left: parent.left + anchors.top: parent.top + anchors.topMargin: -2 + text: parent.icon + size: parent.iconSize + color: isLightColorScheme + ? (mouseArea.containsMouse ? hifi.colors.baseGrayHighlight : hifi.colors.lightGray) + : (mouseArea.containsMouse ? hifi.colors.faintGray : hifi.colors.lightGrayText) + visible: text !== "" + width: visible ? implicitWidth : 0 + } + + RalewaySemiBold { + id: string + anchors { + left: glyph.visible ? glyph.right : parent.left + leftMargin: visible && glyph.visible ? hifi.dimensions.contentSpacing.x : 0 + verticalCenter: glyph.visible ? glyph.verticalCenter : undefined + } + text: parent.text + size: hifi.fontSizes.inputLabel + color: isLightColorScheme + ? (mouseArea.containsMouse ? hifi.colors.baseGrayHighlight : hifi.colors.lightGray) + : (mouseArea.containsMouse ? hifi.colors.faintGray : hifi.colors.lightGrayText) + font.underline: true; + visible: text !== "" + } + + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + onClicked: parent.clicked() + } +} diff --git a/interface/resources/qml/hifi/dialogs/RunningScripts.qml b/interface/resources/qml/hifi/dialogs/RunningScripts.qml index 189d5968d0..cd3b2fdf20 100644 --- a/interface/resources/qml/hifi/dialogs/RunningScripts.qml +++ b/interface/resources/qml/hifi/dialogs/RunningScripts.qml @@ -24,7 +24,7 @@ Window { resizable: true destroyOnInvisible: true x: 40; y: 40 - implicitWidth: 400; implicitHeight: 742 + implicitWidth: 400; implicitHeight: 728 minSize: Qt.vector2d(200, 300) HifiConstants { id: hifi } @@ -236,16 +236,23 @@ Window { } } - HifiControls.VerticalSpacer { } - - HifiControls.Button { - id: directoryButton - text: "Reveal Scripts Folder" - width: 200 - onClicked: fileDialogHelper.openScriptsDirectory() + HifiControls.VerticalSpacer { + height: hifi.dimensions.controlInterlineHeight - 3 } - HifiControls.VerticalSpacer { } + HifiControls.TextAction { + id: directoryButton + icon: hifi.glyphs.script + iconSize: 24 + text: "Reveal Scripts Folder" + onClicked: fileDialogHelper.openScriptsDirectory() + colorScheme: hifi.colorSchemes.dark + anchors.left: parent.left + } + + HifiControls.VerticalSpacer { + height: hifi.dimensions.controlInterlineHeight - 3 + } } } } From 47d0b8f28fff58bd802940415a442cceb7a4549c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 21 Apr 2016 08:55:57 -0700 Subject: [PATCH 12/13] Fix 'Go Home' not working on OSX --- server-console/src/modules/path-finder.js | 29 ++++++++++------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/server-console/src/modules/path-finder.js b/server-console/src/modules/path-finder.js index 1898db91ac..d0e4639e4a 100644 --- a/server-console/src/modules/path-finder.js +++ b/server-console/src/modules/path-finder.js @@ -1,21 +1,22 @@ var fs = require('fs'); var path = require('path'); -exports.searchPaths = function(name, binaryType, releaseType) { - function platformExtension(name) { - if (name == "Interface" || name == "High Fidelity") { - if (process.platform == "darwin") { - return ".app/Contents/MacOS/" + name - } else if (process.platform == "win32") { - return ".exe" - } else { - return "" - } +function platformExtension(name) { + if (name == "Interface") { + if (process.platform == "darwin") { + return ".app/Contents/MacOS/" + name + } else if (process.platform == "win32") { + return ".exe" } else { - return process.platform == "win32" ? ".exe" : "" + return "" } + } else { + return process.platform == "win32" ? ".exe" : "" } +} + +exports.searchPaths = function(name, binaryType, releaseType) { var extension = platformExtension(name); var devBasePath = "../build/" + name + "/"; @@ -68,6 +69,7 @@ exports.discoveredPath = function (name, binaryType, releaseType) { try { var stats = fs.lstatSync(testPath); + var extension = platformExtension(name); if (stats.isFile() || (stats.isDirectory() && extension == ".app")) { console.log("Found " + name + " at " + testPath); @@ -81,11 +83,6 @@ exports.discoveredPath = function (name, binaryType, releaseType) { return null; } - // for a released server console on OS X, assume the name of the interface executable is "High Fidelity" - if (releaseType && process.platform == "darwin" && name == "Interface") { - name = "High Fidelity"; - } - // attempt to find a binary at the usual paths, return null if it doesn't exist return binaryFromPaths(name, this.searchPaths(name, binaryType, releaseType)); } From 8f91768bc0b17017d1ce7c6f21661a2e6d361de5 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 21 Apr 2016 13:47:55 -0700 Subject: [PATCH 13/13] Make the testing destination customizable --- examples/tests/playaPerformanceTest.qml | 122 +++++++++++++++--------- 1 file changed, 76 insertions(+), 46 deletions(-) diff --git a/examples/tests/playaPerformanceTest.qml b/examples/tests/playaPerformanceTest.qml index f1382358ae..6eb0061598 100644 --- a/examples/tests/playaPerformanceTest.qml +++ b/examples/tests/playaPerformanceTest.qml @@ -1,5 +1,6 @@ import QtQuick 2.5 import QtQuick.Controls 1.4 +import Qt.labs.settings 1.0 Rectangle { id: root @@ -8,67 +9,68 @@ Rectangle { signal sendToScript(var message); property var values: []; - property var host: AddressManager.hostname + property alias destination: addressLine.text + readonly property string nullDestination: "169.254.0.1" + property bool running: false - - Component.onCompleted: { - Window.domainChanged.connect(function(newDomain){ - if (newDomain !== root.host) { - root.host = AddressManager.hostname; - } - }); + function statusReport() { + console.log("PERF status connected: " + AddressManager.isConnected); } - - onHostChanged: { - if (root.running) { - if (host !== "Dreaming" && host !== "Playa") { + + Timer { + id: readyStateTimer + interval: 500 + repeat: true + running: false + onTriggered: { + if (!root.running) { + stop(); return; } - console.log("PERF new domain " + host) - if (host === "Dreaming") { - AddressManager.handleLookupString("Playa"); + if (AddressManager.isConnected) { + console.log("PERF already connected, disconnecting"); + AddressManager.handleLookupString(root.nullDestination); return; } + + stop(); + console.log("PERF disconnected, moving to target " + root.destination); + AddressManager.handleLookupString(root.destination); - if (host === "Playa") { - console.log("PERF starting timers and frame timing"); - // If we've arrived, start running the test - FrameTimings.start(); - rotationTimer.start(); - stopTimer.start(); - } + // If we've arrived, start running the test + console.log("PERF starting timers and frame timing"); + FrameTimings.start(); + rotationTimer.start(); + stopTimer.start(); } } + function startTest() { console.log("PERF startTest()"); - root.running = true - console.log("PERF current host: " + AddressManager.hostname) - // If we're already in playa, we need to go somewhere else... - if ("Playa" === AddressManager.hostname) { - console.log("PERF Navigating to dreaming") - AddressManager.handleLookupString("Dreaming/0,0,0"); - } else { - console.log("PERF Navigating to playa") - AddressManager.handleLookupString("Playa"); + if (!root.running) { + root.running = true + readyStateTimer.start(); } } function stopTest() { console.log("PERF stopTest()"); - root.running = false; - stopTimer.stop(); - rotationTimer.stop(); - FrameTimings.finish(); - root.values = FrameTimings.getValues(); - AddressManager.handleLookupString("Dreaming/0,0,0"); - resultGraph.requestPaint(); - console.log("PERF Value Count: " + root.values.length); - console.log("PERF Max: " + FrameTimings.max); - console.log("PERF Min: " + FrameTimings.min); - console.log("PERF Avg: " + FrameTimings.mean); - console.log("PERF StdDev: " + FrameTimings.standardDeviation); + if (root.running) { + root.running = false; + stopTimer.stop(); + rotationTimer.stop(); + FrameTimings.finish(); + root.values = FrameTimings.getValues(); + AddressManager.handleLookupString(root.nullDestination); + resultGraph.requestPaint(); + console.log("PERF Value Count: " + root.values.length); + console.log("PERF Max: " + FrameTimings.max); + console.log("PERF Min: " + FrameTimings.min); + console.log("PERF Avg: " + FrameTimings.mean); + console.log("PERF StdDev: " + FrameTimings.standardDeviation); + } } function yaw(a) { @@ -82,7 +84,6 @@ Rectangle { MyAvatar.setOrientationVar(yaw(Date.now() / 1000)); } - property bool running: false Timer { id: stopTimer @@ -102,14 +103,43 @@ Rectangle { Row { id: row - anchors { left: parent.left; right: parent.right; } + anchors { left: parent.left; right: parent.right; top: parent.top; margins: 16 } spacing: 8 Button { text: root.running ? "Stop" : "Run" onClicked: root.running ? stopTest() : startTest(); } + Button { + text: "Disconnect" + onClicked: AddressManager.handleLookupString(root.nullDestination); + } + Button { + text: "Connect" + onClicked: AddressManager.handleLookupString(root.destination); + } + Button { + text: "Status" + onClicked: statusReport(); + } } + TextField { + id: addressLine + focus: true + anchors { + left: parent.left; right: parent.right; + top: row.bottom; margins: 16; + } + text: "Playa" + onTextChanged: console.log("PERF new target " + text); + } + + Settings { + category: "Qml.Performance.RenderTest" + property alias destination: addressLine.text + } + + // Rectangle { // anchors { left: parent.left; right: parent.right; top: row.bottom; topMargin: 8; bottom: parent.bottom; } // //anchors.fill: parent @@ -130,7 +160,7 @@ Rectangle { Canvas { id: resultGraph - anchors { left: parent.left; right: parent.right; top: row.bottom; margins: 16; bottom: parent.bottom; } + anchors { left: parent.left; right: parent.right; top: addressLine.bottom; margins: 16; bottom: parent.bottom; } property real maxValue: 200; property real perFrame: 10000; property real k1: (5 / maxValue) * height;