From ddc678bbc0dc5e8cf7d92e9307f9032b7adeadc9 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Tue, 23 Jul 2019 16:57:53 -0700 Subject: [PATCH 01/17] added interactivewindow proxy. moved event bridge binding to the proxy instead --- interface/src/ui/InteractiveWindow.cpp | 29 ++++++++++++++++++++++---- interface/src/ui/InteractiveWindow.h | 17 +++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/InteractiveWindow.cpp b/interface/src/ui/InteractiveWindow.cpp index fc2d8c56bf..0b83e2ed88 100644 --- a/interface/src/ui/InteractiveWindow.cpp +++ b/interface/src/ui/InteractiveWindow.cpp @@ -69,6 +69,16 @@ void QmlWindowProxy::parentNativeWindowToMainWindow() { #endif } +void InteractiveWindowProxy::emitScriptEvent(const QVariant& scriptMessage){ + qDebug() << "EmitScriptEvent"; + emit scriptEventReceived(scriptMessage); +} + +void InteractiveWindowProxy::emitWebEvent(const QVariant& webMessage) { + qDebug() << "EmitWebEvent"; + emit webEventReceived(webMessage); +} + static void qmlWindowProxyDeleter(QmlWindowProxy* qmlWindowProxy) { qmlWindowProxy->deleteLater(); } @@ -129,6 +139,10 @@ InteractiveWindow::InteractiveWindow(const QString& sourceUrl, const QVariantMap presentationMode = (InteractiveWindowPresentationMode) properties[PRESENTATION_MODE_PROPERTY].toInt(); } + if (!_interactiveWindowProxy) { + _interactiveWindowProxy = new InteractiveWindowProxy(); + } + if (properties.contains(DOCKED_PROPERTY) && presentationMode == InteractiveWindowPresentationMode::Native) { QVariantMap nativeWindowInfo = properties[DOCKED_PROPERTY].toMap(); Qt::DockWidgetArea dockArea = Qt::TopDockWidgetArea; @@ -182,11 +196,12 @@ InteractiveWindow::InteractiveWindow(const QString& sourceUrl, const QVariantMap break; } } - + + QObject::connect(quickView.get(), &QQuickView::statusChanged, [&, this] (QQuickView::Status status) { if (status == QQuickView::Ready) { QQuickItem* rootItem = _dockWidget->getRootItem(); - _dockWidget->getQuickView()->rootContext()->setContextProperty(EVENT_BRIDGE_PROPERTY, this); + _dockWidget->getQuickView()->rootContext()->setContextProperty(EVENT_BRIDGE_PROPERTY, _interactiveWindowProxy); QObject::connect(rootItem, SIGNAL(sendToScript(QVariant)), this, SLOT(qmlToScript(const QVariant&)), Qt::QueuedConnection); QObject::connect(rootItem, SIGNAL(keyPressEvent(int, int)), this, SLOT(forwardKeyPressEvent(int, int)), @@ -202,9 +217,9 @@ InteractiveWindow::InteractiveWindow(const QString& sourceUrl, const QVariantMap } else { auto offscreenUi = DependencyManager::get(); // Build the event bridge and wrapper on the main thread - offscreenUi->loadInNewContext(CONTENT_WINDOW_QML, [&](QQmlContext* context, QObject* object) { + offscreenUi->loadInNewContext(CONTENT_WINDOW_QML, [&, this](QQmlContext* context, QObject* object) { _qmlWindowProxy = std::shared_ptr(new QmlWindowProxy(object, nullptr), qmlWindowProxyDeleter); - context->setContextProperty(EVENT_BRIDGE_PROPERTY, this); + context->setContextProperty(EVENT_BRIDGE_PROPERTY, _interactiveWindowProxy); if (properties.contains(ADDITIONAL_FLAGS_PROPERTY)) { object->setProperty(ADDITIONAL_FLAGS_PROPERTY, properties[ADDITIONAL_FLAGS_PROPERTY].toUInt()); } @@ -275,10 +290,12 @@ void InteractiveWindow::sendToQml(const QVariant& message) { } void InteractiveWindow::emitScriptEvent(const QVariant& scriptMessage) { + //_interactiveWindowProxy->emitScriptEvent(scriptMessage); emit scriptEventReceived(scriptMessage); } void InteractiveWindow::emitWebEvent(const QVariant& webMessage) { + //_interactiveWindowProxy->emitWebEvent(webMessage); emit webEventReceived(webMessage); } @@ -291,6 +308,10 @@ void InteractiveWindow::close() { _qmlWindowProxy->deleteLater(); } + if (_interactiveWindowProxy) { + delete(_interactiveWindowProxy); + } + if (_dockWidget) { auto window = qApp->getWindow(); if (QThread::currentThread() != window->thread()) { diff --git a/interface/src/ui/InteractiveWindow.h b/interface/src/ui/InteractiveWindow.h index 0098658c16..a1eede8b8a 100644 --- a/interface/src/ui/InteractiveWindow.h +++ b/interface/src/ui/InteractiveWindow.h @@ -34,7 +34,23 @@ public: QObject* getQmlWindow() const { return _qmlWindow; } private: QObject* _qmlWindow; +}; + +class InteractiveWindowProxy : public QObject { + Q_OBJECT +public: + InteractiveWindowProxy(){} + +public slots: + + void emitScriptEvent(const QVariant& scriptMessage); + void emitWebEvent(const QVariant& webMessage); + +signals: + + void scriptEventReceived(const QVariant& message); + void webEventReceived(const QVariant& message); }; @@ -309,6 +325,7 @@ protected slots: private: std::shared_ptr _qmlWindowProxy; std::shared_ptr _dockWidget { nullptr }; + InteractiveWindowProxy *_interactiveWindowProxy{ nullptr }; }; typedef InteractiveWindow* InteractiveWindowPointer; From 8c022b025da1386ca0d5b4ff57886cddb63ae49d Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Wed, 24 Jul 2019 11:19:32 -0700 Subject: [PATCH 02/17] implementing Dante's change to connect the slots --- interface/src/ui/InteractiveWindow.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/InteractiveWindow.cpp b/interface/src/ui/InteractiveWindow.cpp index 0b83e2ed88..5cafae6a83 100644 --- a/interface/src/ui/InteractiveWindow.cpp +++ b/interface/src/ui/InteractiveWindow.cpp @@ -70,12 +70,10 @@ void QmlWindowProxy::parentNativeWindowToMainWindow() { } void InteractiveWindowProxy::emitScriptEvent(const QVariant& scriptMessage){ - qDebug() << "EmitScriptEvent"; emit scriptEventReceived(scriptMessage); } void InteractiveWindowProxy::emitWebEvent(const QVariant& webMessage) { - qDebug() << "EmitWebEvent"; emit webEventReceived(webMessage); } @@ -141,6 +139,8 @@ InteractiveWindow::InteractiveWindow(const QString& sourceUrl, const QVariantMap if (!_interactiveWindowProxy) { _interactiveWindowProxy = new InteractiveWindowProxy(); + QObject::connect(_interactiveWindowProxy, &InteractiveWindowProxy::webEventReceived, this, &InteractiveWindow::emitWebEvent, Qt::QueuedConnection); + QObject::connect(this, &InteractiveWindow::scriptEventReceived, _interactiveWindowProxy, &InteractiveWindowProxy::emitScriptEvent, Qt::QueuedConnection); } if (properties.contains(DOCKED_PROPERTY) && presentationMode == InteractiveWindowPresentationMode::Native) { @@ -278,6 +278,7 @@ InteractiveWindow::~InteractiveWindow() { } void InteractiveWindow::sendToQml(const QVariant& message) { + // Forward messages received from the script on to QML if (_dockWidget) { QQuickItem* rootItem = _dockWidget->getRootItem(); @@ -296,7 +297,7 @@ void InteractiveWindow::emitScriptEvent(const QVariant& scriptMessage) { void InteractiveWindow::emitWebEvent(const QVariant& webMessage) { //_interactiveWindowProxy->emitWebEvent(webMessage); - emit webEventReceived(webMessage); + emit webEventReceived(webMessage); } void InteractiveWindow::close() { @@ -309,7 +310,7 @@ void InteractiveWindow::close() { } if (_interactiveWindowProxy) { - delete(_interactiveWindowProxy); + _interactiveWindowProxy->deleteLater(); } if (_dockWidget) { @@ -322,6 +323,7 @@ void InteractiveWindow::close() { } _dockWidget = nullptr; _qmlWindowProxy = nullptr; + _interactiveWindowProxy = nullptr; } void InteractiveWindow::show() { From ac17493a40d8e746b49f969812490a3c7cce5a7d Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Wed, 24 Jul 2019 11:37:38 -0700 Subject: [PATCH 03/17] removing comments --- interface/src/ui/InteractiveWindow.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/ui/InteractiveWindow.cpp b/interface/src/ui/InteractiveWindow.cpp index 5cafae6a83..49c8d51812 100644 --- a/interface/src/ui/InteractiveWindow.cpp +++ b/interface/src/ui/InteractiveWindow.cpp @@ -291,12 +291,10 @@ void InteractiveWindow::sendToQml(const QVariant& message) { } void InteractiveWindow::emitScriptEvent(const QVariant& scriptMessage) { - //_interactiveWindowProxy->emitScriptEvent(scriptMessage); emit scriptEventReceived(scriptMessage); } void InteractiveWindow::emitWebEvent(const QVariant& webMessage) { - //_interactiveWindowProxy->emitWebEvent(webMessage); emit webEventReceived(webMessage); } From f94b082946f425263ce947169d9b7b03ab83103f Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Wed, 24 Jul 2019 11:47:10 -0700 Subject: [PATCH 04/17] addressing comment --- interface/src/ui/InteractiveWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/InteractiveWindow.cpp b/interface/src/ui/InteractiveWindow.cpp index 49c8d51812..f8961c6de1 100644 --- a/interface/src/ui/InteractiveWindow.cpp +++ b/interface/src/ui/InteractiveWindow.cpp @@ -217,7 +217,7 @@ InteractiveWindow::InteractiveWindow(const QString& sourceUrl, const QVariantMap } else { auto offscreenUi = DependencyManager::get(); // Build the event bridge and wrapper on the main thread - offscreenUi->loadInNewContext(CONTENT_WINDOW_QML, [&, this](QQmlContext* context, QObject* object) { + offscreenUi->loadInNewContext(CONTENT_WINDOW_QML, [&](QQmlContext* context, QObject* object) { _qmlWindowProxy = std::shared_ptr(new QmlWindowProxy(object, nullptr), qmlWindowProxyDeleter); context->setContextProperty(EVENT_BRIDGE_PROPERTY, _interactiveWindowProxy); if (properties.contains(ADDITIONAL_FLAGS_PROPERTY)) { From c4b63ed5e428d7d8d0f2fe59f859c33c580d32b1 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 24 Jul 2019 11:20:08 -0700 Subject: [PATCH 05/17] Fix qmlToScript getting called on script thread and causing crash --- interface/src/ui/InteractiveWindow.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/interface/src/ui/InteractiveWindow.cpp b/interface/src/ui/InteractiveWindow.cpp index fc2d8c56bf..1a4d631c23 100644 --- a/interface/src/ui/InteractiveWindow.cpp +++ b/interface/src/ui/InteractiveWindow.cpp @@ -187,8 +187,11 @@ InteractiveWindow::InteractiveWindow(const QString& sourceUrl, const QVariantMap if (status == QQuickView::Ready) { QQuickItem* rootItem = _dockWidget->getRootItem(); _dockWidget->getQuickView()->rootContext()->setContextProperty(EVENT_BRIDGE_PROPERTY, this); + // The qmlToScript method handles the thread-safety of this call. Because the QVariant argument + // passed to the sendToScript signal may wrap an externally managed and thread-unsafe QJSValue, + // qmlToScript needs to be called directly, so the QJSValue can be immediately converted to a plain QVariant. QObject::connect(rootItem, SIGNAL(sendToScript(QVariant)), this, SLOT(qmlToScript(const QVariant&)), - Qt::QueuedConnection); + Qt::DirectConnection); QObject::connect(rootItem, SIGNAL(keyPressEvent(int, int)), this, SLOT(forwardKeyPressEvent(int, int)), Qt::QueuedConnection); QObject::connect(rootItem, SIGNAL(keyReleaseEvent(int, int)), this, SLOT(forwardKeyReleaseEvent(int, int)), @@ -229,7 +232,10 @@ InteractiveWindow::InteractiveWindow(const QString& sourceUrl, const QVariantMap object->setProperty(VISIBLE_PROPERTY, properties[INTERACTIVE_WINDOW_VISIBLE_PROPERTY].toBool()); } - connect(object, SIGNAL(sendToScript(QVariant)), this, SLOT(qmlToScript(const QVariant&)), Qt::QueuedConnection); + // The qmlToScript method handles the thread-safety of this call. Because the QVariant argument + // passed to the sendToScript signal may wrap an externally managed and thread-unsafe QJSValue, + // qmlToScript needs to be called directly, so the QJSValue can be immediately converted to a plain QVariant. + connect(object, SIGNAL(sendToScript(QVariant)), this, SLOT(qmlToScript(const QVariant&)), Qt::DirectConnection); QObject::connect(object, SIGNAL(keyPressEvent(int, int)), this, SLOT(forwardKeyPressEvent(int, int)), Qt::QueuedConnection); QObject::connect(object, SIGNAL(keyReleaseEvent(int, int)), this, SLOT(forwardKeyReleaseEvent(int, int)), @@ -315,13 +321,21 @@ void InteractiveWindow::raise() { } } -void InteractiveWindow::qmlToScript(const QVariant& message) { +void InteractiveWindow::qmlToScript(const QVariant& originalMessage) { + QVariant message = originalMessage; if (message.canConvert()) { - emit fromQml(qvariant_cast(message).toVariant()); + message = qvariant_cast(message).toVariant(); } else if (message.canConvert()) { - emit fromQml(message.toString()); + message = message.toString(); } else { qWarning() << "Unsupported message type " << message; + return; + } + + if (thread() != QThread::currentThread()) { + QMetaObject::invokeMethod(this, "fromQml", Q_ARG(const QVariant&, message)); + } else { + emit fromQml(message); } } From bae3ebd5771f5308f7d604766cb4279fc31c41b6 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Wed, 24 Jul 2019 14:07:58 -0700 Subject: [PATCH 06/17] fix android local build --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e4746418d..f8fd5b7637 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ endif() include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macros/TargetPython.cmake") target_python() -if (WIN32) +if (WIN32 AND NOT HIFI_ANDROID) # Force x64 toolset set(CMAKE_GENERATOR_TOOLSET "host=x64" CACHE STRING "64-bit toolset" FORCE) endif() From bea31237b7b1f58ce6926725a3ec203c499e1320 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Wed, 24 Jul 2019 14:30:43 -0700 Subject: [PATCH 07/17] addressing comments --- interface/src/ui/InteractiveWindow.cpp | 12 ++++++------ interface/src/ui/InteractiveWindow.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/interface/src/ui/InteractiveWindow.cpp b/interface/src/ui/InteractiveWindow.cpp index f8961c6de1..8225e5f438 100644 --- a/interface/src/ui/InteractiveWindow.cpp +++ b/interface/src/ui/InteractiveWindow.cpp @@ -70,7 +70,7 @@ void QmlWindowProxy::parentNativeWindowToMainWindow() { } void InteractiveWindowProxy::emitScriptEvent(const QVariant& scriptMessage){ - emit scriptEventReceived(scriptMessage); + // emit scriptEventReceived(scriptMessage); } void InteractiveWindowProxy::emitWebEvent(const QVariant& webMessage) { @@ -137,11 +137,11 @@ InteractiveWindow::InteractiveWindow(const QString& sourceUrl, const QVariantMap presentationMode = (InteractiveWindowPresentationMode) properties[PRESENTATION_MODE_PROPERTY].toInt(); } - if (!_interactiveWindowProxy) { - _interactiveWindowProxy = new InteractiveWindowProxy(); - QObject::connect(_interactiveWindowProxy, &InteractiveWindowProxy::webEventReceived, this, &InteractiveWindow::emitWebEvent, Qt::QueuedConnection); - QObject::connect(this, &InteractiveWindow::scriptEventReceived, _interactiveWindowProxy, &InteractiveWindowProxy::emitScriptEvent, Qt::QueuedConnection); - } + _interactiveWindowProxy = std::make_unique(); + QObject::connect(_interactiveWindowProxy.get(), &InteractiveWindowProxy::webEventReceived, + this, &InteractiveWindow::emitWebEvent, Qt::QueuedConnection); + QObject::connect(this, &InteractiveWindow::scriptEventReceived, + _interactiveWindowProxy.get(), &InteractiveWindowProxy::emitScriptEvent, Qt::QueuedConnection); if (properties.contains(DOCKED_PROPERTY) && presentationMode == InteractiveWindowPresentationMode::Native) { QVariantMap nativeWindowInfo = properties[DOCKED_PROPERTY].toMap(); diff --git a/interface/src/ui/InteractiveWindow.h b/interface/src/ui/InteractiveWindow.h index a1eede8b8a..57025140a2 100644 --- a/interface/src/ui/InteractiveWindow.h +++ b/interface/src/ui/InteractiveWindow.h @@ -325,7 +325,7 @@ protected slots: private: std::shared_ptr _qmlWindowProxy; std::shared_ptr _dockWidget { nullptr }; - InteractiveWindowProxy *_interactiveWindowProxy{ nullptr }; + std::unique_ptr _interactiveWindowProxy{ nullptr }; }; typedef InteractiveWindow* InteractiveWindowPointer; From 53cf915e8d73212100783d8339edf0adda0a546b Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 24 Jul 2019 14:51:41 -0700 Subject: [PATCH 08/17] Guard for AudioInjectorManager existance; clear an audio interface pointer --- interface/src/Application.cpp | 1 + libraries/script-engine/src/ScriptAudioInjector.cpp | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ad38599dcf..1872a03221 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2824,6 +2824,7 @@ void Application::cleanupBeforeQuit() { // destroy Audio so it and its threads have a chance to go down safely // this must happen after QML, as there are unexplained audio crashes originating in qtwebengine + AudioInjector::setLocalAudioInterface(nullptr); DependencyManager::destroy(); DependencyManager::destroy(); diff --git a/libraries/script-engine/src/ScriptAudioInjector.cpp b/libraries/script-engine/src/ScriptAudioInjector.cpp index 267ac3339d..ebc9287c2a 100644 --- a/libraries/script-engine/src/ScriptAudioInjector.cpp +++ b/libraries/script-engine/src/ScriptAudioInjector.cpp @@ -33,5 +33,9 @@ ScriptAudioInjector::ScriptAudioInjector(const AudioInjectorPointer& injector) : } ScriptAudioInjector::~ScriptAudioInjector() { - DependencyManager::get()->stop(_injector); -} \ No newline at end of file + const auto audioInjectorManager = DependencyManager::get(); + // AudioInjectorManager may have been destroyed on application shutdown. + if (audioInjectorManager) { + audioInjectorManager->stop(_injector); + } +} From 3315271493852a8f879c5c1dcbba1c89a14a4325 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Wed, 24 Jul 2019 15:43:31 -0700 Subject: [PATCH 09/17] reverting commit: --- interface/src/ui/InteractiveWindow.cpp | 12 ++++++------ interface/src/ui/InteractiveWindow.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/interface/src/ui/InteractiveWindow.cpp b/interface/src/ui/InteractiveWindow.cpp index 8225e5f438..f8961c6de1 100644 --- a/interface/src/ui/InteractiveWindow.cpp +++ b/interface/src/ui/InteractiveWindow.cpp @@ -70,7 +70,7 @@ void QmlWindowProxy::parentNativeWindowToMainWindow() { } void InteractiveWindowProxy::emitScriptEvent(const QVariant& scriptMessage){ - // emit scriptEventReceived(scriptMessage); + emit scriptEventReceived(scriptMessage); } void InteractiveWindowProxy::emitWebEvent(const QVariant& webMessage) { @@ -137,11 +137,11 @@ InteractiveWindow::InteractiveWindow(const QString& sourceUrl, const QVariantMap presentationMode = (InteractiveWindowPresentationMode) properties[PRESENTATION_MODE_PROPERTY].toInt(); } - _interactiveWindowProxy = std::make_unique(); - QObject::connect(_interactiveWindowProxy.get(), &InteractiveWindowProxy::webEventReceived, - this, &InteractiveWindow::emitWebEvent, Qt::QueuedConnection); - QObject::connect(this, &InteractiveWindow::scriptEventReceived, - _interactiveWindowProxy.get(), &InteractiveWindowProxy::emitScriptEvent, Qt::QueuedConnection); + if (!_interactiveWindowProxy) { + _interactiveWindowProxy = new InteractiveWindowProxy(); + QObject::connect(_interactiveWindowProxy, &InteractiveWindowProxy::webEventReceived, this, &InteractiveWindow::emitWebEvent, Qt::QueuedConnection); + QObject::connect(this, &InteractiveWindow::scriptEventReceived, _interactiveWindowProxy, &InteractiveWindowProxy::emitScriptEvent, Qt::QueuedConnection); + } if (properties.contains(DOCKED_PROPERTY) && presentationMode == InteractiveWindowPresentationMode::Native) { QVariantMap nativeWindowInfo = properties[DOCKED_PROPERTY].toMap(); diff --git a/interface/src/ui/InteractiveWindow.h b/interface/src/ui/InteractiveWindow.h index 57025140a2..a1eede8b8a 100644 --- a/interface/src/ui/InteractiveWindow.h +++ b/interface/src/ui/InteractiveWindow.h @@ -325,7 +325,7 @@ protected slots: private: std::shared_ptr _qmlWindowProxy; std::shared_ptr _dockWidget { nullptr }; - std::unique_ptr _interactiveWindowProxy{ nullptr }; + InteractiveWindowProxy *_interactiveWindowProxy{ nullptr }; }; typedef InteractiveWindow* InteractiveWindowPointer; From 5d7286b055903f7254eceac2ba4ac7422ce70879 Mon Sep 17 00:00:00 2001 From: amer cerkic Date: Wed, 24 Jul 2019 16:05:13 -0700 Subject: [PATCH 10/17] removed change from my master branch, that is getting checked in on separate pr --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f8fd5b7637..5e4746418d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ endif() include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macros/TargetPython.cmake") target_python() -if (WIN32 AND NOT HIFI_ANDROID) +if (WIN32) # Force x64 toolset set(CMAKE_GENERATOR_TOOLSET "host=x64" CACHE STRING "64-bit toolset" FORCE) endif() From 2ec87f4e61a6f93af734ca09eb002190a601c919 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 24 Jul 2019 11:48:29 -0700 Subject: [PATCH 11/17] Add serverless tutorial --- cmake/macros/SetPackagingParameters.cmake | 7 +- interface/resources/serverless/tutorial.json | 3486 +++++++++++++++++- libraries/networking/src/AddressManager.cpp | 2 +- 3 files changed, 3482 insertions(+), 13 deletions(-) diff --git a/cmake/macros/SetPackagingParameters.cmake b/cmake/macros/SetPackagingParameters.cmake index 3ebc44e931..f8cff9f773 100644 --- a/cmake/macros/SetPackagingParameters.cmake +++ b/cmake/macros/SetPackagingParameters.cmake @@ -131,8 +131,11 @@ macro(SET_PACKAGING_PARAMETERS) endif () if (DEPLOY_PACKAGE) - # for deployed packages always grab the serverless content - set(DOWNLOAD_SERVERLESS_CONTENT ON) + # For deployed packages we do not grab the serverless content any longer. + # Instead, we deploy just the serverless content that is in the interface/resources/serverless + # directory. If we ever move back to delivering serverless via a hosted .zip file, + # we can re-enable this. + set(DOWNLOAD_SERVERLESS_CONTENT OFF) endif () if (APPLE) diff --git a/interface/resources/serverless/tutorial.json b/interface/resources/serverless/tutorial.json index f690de6643..8dbf23c95e 100644 --- a/interface/resources/serverless/tutorial.json +++ b/interface/resources/serverless/tutorial.json @@ -1,18 +1,3484 @@ { + "DataVersion": 3, + "Paths": { + "/": "/8.65411,-1.12434,-71.5262/0,0.992481,0,-0.122401" + }, "Entities": [ { - "type": "Box", + "avatarEntity": false, + "clientOnly": false, + "created": 1491937656000000, + "description": "Specify URL to your 48K 16bit PCM wav file & volume (0-1) in userData below", "dimensions": { - "x": 20, - "y": 1, - "z": 20 + "x": 0.6447294354438782, + "y": 0.6438502073287964, + "z": 0.26574596762657166 }, - "position" : { - "x": 0, - "y": -12, - "z": 0 - } + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{244f908e-3dba-4019-9a93-2b8441d5d24f}", + "isFacingAvatar": false, + "lastEdited": 1563467280904634, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/speakerGizmo/baked/speakerGizmo.baked.fst", + "name": "Sound Emitter - Birdsong", + "position": { + "x": -2.5392403602600098, + "y": 7.262417793273926, + "z": -75.7442398071289 + }, + "queryAACube": { + "scale": 0.9491259455680847, + "x": -3.013803243637085, + "y": 6.7878546714782715, + "z": -76.21880340576172 + }, + "rotation": { + "w": -0.5520867109298706, + "x": -1.52587890625e-05, + "y": -0.8338292837142944, + "z": -4.57763671875e-05 + }, + "script": "https://content.highfidelity.com/Experiences/Releases/usefulUtilities/soundEmitter/v1.2/soundEmitter.js", + "type": "Model", + "userData": "{\"soundURL\":\"https://content.highfidelity.com/welcome-tutorial/v1/audio/birdsongLoop_1.wav\",\"shouldLoop\":true,\"volume\":0.05,\"refreshInterval\":450,\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554398611144450, + "damping": 0, + "dimensions": { + "x": 0.029263636097311974, + "y": 0.20740893483161926, + "z": 0.3596978783607483 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{dd9b17d3-9597-4e6f-be4c-267e33715438}", + "isFacingAvatar": false, + "lastEdited": 1563467280907087, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "mirror-line", + "position": { + "x": 10.512893676757812, + "y": -1.227879285812378, + "z": -70.1580810546875 + }, + "queryAACube": { + "scale": 0.41624200344085693, + "x": 10.30477237701416, + "y": -1.4360003471374512, + "z": -70.36620330810547 + }, + "rotation": { + "w": 0.9108873605728149, + "x": -4.57763671875e-05, + "y": -0.4125887155532837, + "z": -0.0001373291015625 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "avatarEntity": false, + "clientOnly": false, + "created": 1492535214000000, + "description": "Specify URL to your 48K 16bit PCM wav file & volume (0-1) in userData below", + "dimensions": { + "x": 0.6447294354438782, + "y": 0.6438502073287964, + "z": 0.26574596762657166 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{929efcf1-65b3-4837-81a7-8fff63f5ee5f}", + "isFacingAvatar": false, + "lastEdited": 1563467280904018, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/speakerGizmo/baked/speakerGizmo.baked.fst", + "name": "Sound Emitter-creak", + "position": { + "x": 7.3341145515441895, + "y": 5.320479393005371, + "z": -96.89550018310547 + }, + "queryAACube": { + "scale": 0.9491259455680847, + "x": 6.859551429748535, + "y": 4.845916271209717, + "z": -97.37006378173828 + }, + "rotation": { + "w": 0.22429239749908447, + "x": -0.6706187725067139, + "y": -0.6705882549285889, + "z": -0.2243228554725647 + }, + "script": "https://content.highfidelity.com/Experiences/Releases/usefulUtilities/soundEmitter/v1.2/soundEmitter.js", + "type": "Model", + "userData": "{\"soundURL\":\"https://content.highfidelity.com/welcome-tutorial/v1/audio/woodCreaking.wav\",\"shouldLoop\":true,\"volume\":0.08,\"refreshInterval\":100,\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "avatarEntity": false, + "clientOnly": false, + "created": 1492535214000000, + "description": "Specify URL to your 48K 16bit PCM wav file & volume (0-1) in userData below", + "dimensions": { + "x": 0.6447294354438782, + "y": 0.6438502073287964, + "z": 0.26574596762657166 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{b51cccd1-8097-4a6d-a275-19065c3aae1e}", + "isFacingAvatar": false, + "lastEdited": 1563467280902702, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/speakerGizmo/baked/speakerGizmo.baked.fst", + "name": "Sound Emitter-creak", + "position": { + "x": 5.054196357727051, + "y": 16.41500473022461, + "z": -97.93896484375 + }, + "queryAACube": { + "scale": 0.9491259455680847, + "x": 4.5796332359313965, + "y": 15.940442085266113, + "z": -98.41352844238281 + }, + "rotation": { + "w": 0.22423136234283447, + "x": -0.6706187725067139, + "y": -0.6705882549285889, + "z": -0.2243228554725647 + }, + "script": "https://content.highfidelity.com/Experiences/Releases/usefulUtilities/soundEmitter/v1.2/soundEmitter.js", + "type": "Model", + "userData": "{\"soundURL\":\"https://content.highfidelity.com/welcome-tutorial/v1/audio/woodCreaking.wav\",\"shouldLoop\":true,\"volume\":0.02,\"refreshInterval\":200,\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554511218349438, + "damping": 0, + "dimensions": { + "x": 1.7221298217773438, + "y": 0.5118975043296814, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{59862a4c-c2c3-44ea-8873-a93f45a381d6}", + "isFacingAvatar": false, + "lastEdited": 1563467280913956, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 5.384548187255859, + "y": 1.103218913078308, + "z": -69.20768737792969 + }, + "queryAACube": { + "scale": 1.8076975345611572, + "x": 4.48069953918457, + "y": 0.1993701457977295, + "z": -70.11153411865234 + }, + "rotation": { + "w": 0.9086899757385254, + "x": -4.57763671875e-05, + "y": -0.41747158765792847, + "z": -1.52587890625e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554511017957088, + "damping": 0, + "dimensions": { + "x": 1.9762731790542603, + "y": 0.5533246994018555, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{67bb6524-3d7f-4c8a-98e8-2fe12577345e}", + "isFacingAvatar": false, + "lastEdited": 1563467280913169, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 9.034796714782715, + "y": 1.0587992668151855, + "z": -77.50987243652344 + }, + "queryAACube": { + "scale": 2.061995029449463, + "x": 8.003799438476562, + "y": 0.0278017520904541, + "z": -78.5408706665039 + }, + "rotation": { + "w": 0.9993896484375, + "x": -4.57763671875e-05, + "y": 0.0348668098449707, + "z": -4.57763671875e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "animation": { + "allowTranslation": false + }, + "avatarEntity": false, + "clientOnly": false, + "created": 1563414490548879, + "damping": 0, + "dimensions": { + "x": 1, + "y": 0.0010000000474974513, + "z": 0.4999999403953552 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{51495c3d-f585-4616-b262-93fcb50e0840}", + "isFacingAvatar": false, + "lastEdited": 1563467161318995, + "lastEditedBy": "{fc877f50-8986-4f75-b202-bd8a31f2abcc}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/mirrorsign4/baked/mirrorsign4.baked.fst", + "position": { + "x": 13.658286094665527, + "y": 1.33644700050354, + "z": -73.13211822509766 + }, + "queryAACube": { + "scale": 1.1180343627929688, + "x": 13.099268913269043, + "y": 0.7774298191070557, + "z": -73.69113159179688 + }, + "rotation": { + "w": 0.5251697301864624, + "x": 0.5251086950302124, + "y": -0.4742045998573303, + "z": 0.4728008508682251 + }, + "type": "Model" + }, + { + "avatarEntity": false, + "clientOnly": false, + "created": 1492535345000000, + "description": "Specify URL to your 48K 16bit PCM wav file & volume (0-1) in userData below", + "dimensions": { + "x": 0.6447294354438782, + "y": 0.6438502073287964, + "z": 0.26574596762657166 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{3e08bc1b-6a47-4fcf-b695-2de7973db6ac}", + "isFacingAvatar": false, + "lastEdited": 1563467280904481, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/speakerGizmo/baked/speakerGizmo.baked.fst", + "name": "Sound Emitter-creak", + "position": { + "x": 25.595827102661133, + "y": 4.308650493621826, + "z": -76.72611236572266 + }, + "queryAACube": { + "scale": 0.9491259455680847, + "x": 25.12126350402832, + "y": 3.834087610244751, + "z": -77.20067596435547 + }, + "rotation": { + "w": 0.22423136234283447, + "x": -0.6706187725067139, + "y": -0.6705882549285889, + "z": -0.2243228554725647 + }, + "script": "https://content.highfidelity.com/Experiences/Releases/usefulUtilities/soundEmitter/v1.2/soundEmitter.js", + "type": "Model", + "userData": "{\"soundURL\":\"https://content.highfidelity.com/welcome-tutorial/v1/audio/woodCreaking.wav\",\"shouldLoop\": true,\"volume\":0.03,\"refreshInterval\":100,\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "avatarEntity": false, + "clientOnly": false, + "created": 1491937656000000, + "description": "Specify URL to your 48K 16bit PCM wav file & volume (0-1) in userData below", + "dimensions": { + "x": 0.6447294354438782, + "y": 0.6438502073287964, + "z": 0.26574596762657166 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{e8a67ca6-652a-464b-bf8b-aee92a44ccc7}", + "isFacingAvatar": false, + "lastEdited": 1563467280902026, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/speakerGizmo/baked/speakerGizmo.baked.fst", + "name": "Sound Emitter - Birdsong", + "position": { + "x": 24.465959548950195, + "y": 3.5319595336914062, + "z": -70.24295043945312 + }, + "queryAACube": { + "scale": 0.9491259455680847, + "x": 23.991395950317383, + "y": 3.057396650314331, + "z": -70.71751403808594 + }, + "rotation": { + "w": 0.3171893358230591, + "x": -1.52587890625e-05, + "y": -0.9483634829521179, + "z": -1.52587890625e-05 + }, + "script": "https://content.highfidelity.com/Experiences/Releases/usefulUtilities/soundEmitter/v1.2/soundEmitter.js", + "type": "Model", + "userData": "{\"soundURL\":\"https://content.highfidelity.com/welcome-tutorial/v1/audio/birdsongLoop_1.wav\",\"shouldLoop\":true,\"volume\":0.05,\"refreshInterval\":250,\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "avatarEntity": false, + "clientOnly": false, + "created": 1527026155000000, + "description": "Specify URL to your 48K 16bit PCM wav file & volume (0-1) in userData below", + "dimensions": { + "x": 0.6447294354438782, + "y": 0.6438502073287964, + "z": 0.26574596762657166 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{b76eee5f-2605-447b-b4c6-5360afdf61f8}", + "isFacingAvatar": false, + "lastEdited": 1563467280902542, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/speakerGizmo/baked/speakerGizmo.baked.fst", + "name": "Sound Emitter - cicada", + "position": { + "x": 44.971160888671875, + "y": 5.307518482208252, + "z": -105.29989624023438 + }, + "queryAACube": { + "scale": 0.9491259455680847, + "x": 44.49659729003906, + "y": 4.832955360412598, + "z": -105.77445983886719 + }, + "rotation": { + "w": 0.3170672655105591, + "x": -1.52587890625e-05, + "y": -0.9484245181083679, + "z": -1.52587890625e-05 + }, + "script": "https://content.highfidelity.com/Experiences/Releases/usefulUtilities/soundEmitter/v1.2/soundEmitter.js", + "type": "Model", + "userData": "{\"soundURL\":\"https://content.highfidelity.com/welcome-tutorial/v1/audio/cicadasLoop_1.wav\",\"shouldLoop\":true,\"volume\":0.01,\"refreshInterval\":100,\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "avatarEntity": false, + "clientOnly": false, + "created": 1487019835000000, + "description": "Specify URL to your 48K 16bit PCM wav file & volume (0-1) in userData below", + "dimensions": { + "x": 0.6447294354438782, + "y": 0.6438502073287964, + "z": 0.26574596762657166 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{b22f3234-4db4-4480-bb7d-b76e3b007429}", + "isFacingAvatar": false, + "lastEdited": 1563467280903131, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/speakerGizmo/baked/speakerGizmo.baked.fst", + "name": "Sound Emitter - Crickets", + "position": { + "x": 37.3149528503418, + "y": 1.4047751426696777, + "z": -52.067230224609375 + }, + "queryAACube": { + "scale": 0.9491259455680847, + "x": 36.840389251708984, + "y": 0.930212140083313, + "z": -52.54179382324219 + }, + "rotation": { + "w": -1.52587890625e-05, + "x": -1.52587890625e-05, + "y": -1, + "z": -1.52587890625e-05 + }, + "script": "https://content.highfidelity.com/Experiences/Releases/usefulUtilities/soundEmitter/v1.2/soundEmitter.js", + "type": "Model", + "userData": "{\"soundURL\":\"https://content.highfidelity.com/welcome-tutorial/v1/audio/Mod_CCBY_253664__cliftonmcarlson__night-ambience-w-crickets.wav\",\"shouldLoop\":true,\"volume\":0.03,\"refreshInterval\":100,\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "ambientLight": { + "ambientIntensity": 1, + "ambientURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/canyon1.texmeta.json" + }, + "ambientLightMode": "enabled", + "avatarEntity": false, + "bloomMode": "enabled", + "clientOnly": false, + "created": 1501265920000000, + "dimensions": { + "x": 5000, + "y": 5000, + "z": 5000 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "haze": { + "hazeBackgroundBlend": 0.8500000238418579, + "hazeColor": { + "blue": 255, + "green": 79, + "red": 85 + }, + "hazeEnableGlare": true, + "hazeGlareAngle": 59, + "hazeGlareColor": { + "blue": 97, + "green": 200, + "red": 255 + }, + "hazeRange": 2000 + }, + "hazeMode": "enabled", + "id": "{1208ab36-f406-4e64-88cc-cc9f481265b4}", + "isFacingAvatar": false, + "keyLight": { + "castShadows": true, + "color": { + "blue": 102, + "green": 171, + "red": 255 + }, + "direction": { + "x": 0.6140186786651611, + "y": -0.3713679611682892, + "z": -0.6964675188064575 + }, + "intensity": 1.7999999523162842 + }, + "keyLightMode": "enabled", + "lastEdited": 1563467280901626, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "MakerZone", + "position": { + "x": -894.226806640625, + "y": 246.8264617919922, + "z": 1015.4898071289062 + }, + "queryAACube": { + "scale": 8660.25390625, + "x": -5224.353515625, + "y": -4083.300537109375, + "z": -3314.63720703125 + }, + "rotation": { + "w": 0.529900074005127, + "x": -4.57763671875e-05, + "y": 0.8480507135391235, + "z": -7.62939453125e-05 + }, + "shapeType": "box", + "skybox": { + "url": "https://content.highfidelity.com/welcome-tutorial/v1/baked/Sky_Day-Sun-Mid-photo.texmeta.json" + }, + "skyboxMode": "enabled", + "type": "Zone", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}" + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "created": 1550188725428410, + "cutoff": 74.30999755859375, + "damping": 0, + "dimensions": { + "x": 22.441450119018555, + "y": 22.441450119018555, + "z": 22.441450119018555 + }, + "exponent": 1, + "faceCamera": false, + "falloffRadius": 20, + "grab": { + "grabbable": false + }, + "id": "{90e36d2d-9482-4f51-abe7-1592b75df999}", + "intensity": 0.5, + "isFacingAvatar": false, + "lastEdited": 1563467280905058, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "position": { + "x": 9.553569793701172, + "y": 1.0302468538284302, + "z": -70.25057220458984 + }, + "queryAACube": { + "scale": 38.86973190307617, + "x": -9.881296157836914, + "y": -18.404619216918945, + "z": -89.68544006347656 + }, + "rotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "type": "Light", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "avatarEntity": false, + "clientOnly": false, + "collidesWith": "", + "collisionMask": 0, + "collisionless": true, + "created": 1550543327085605, + "dimensions": { + "x": 1.2472385168075562, + "y": 1.945894718170166, + "z": 0.009999999776482582 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabFollowsController": false, + "grabbable": false + }, + "id": "{93a7d1d0-8ed1-4274-89f5-1782a1866182}", + "ignoreForCollisions": true, + "isFacingAvatar": false, + "lastEdited": 1563467280903614, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "modelURL": "http://content.highfidelity.com/baked/avatar_island/mirror_without_backface/baked/mirror_without_backface.baked.fbx", + "name": "mirror_reflectingPlane", + "position": { + "x": 13.659734725952148, + "y": 0.16369032859802246, + "z": -73.13848114013672 + }, + "queryAACube": { + "scale": 4.372657775878906, + "x": 10.68004035949707, + "y": -1.5357954502105713, + "z": -74.91236114501953 + }, + "rotation": { + "w": -0.7427328824996948, + "x": 1.52587890625e-05, + "y": 0.6695811748504639, + "z": 0.0009918212890625 + }, + "script": "https://content.highfidelity.com/Experiences/Releases/usefulUtilities/mirror/2019-07-24_09-18-00/mirrorClient.js", + "scriptTimestamp": 1539903100303, + "type": "Model", + "userData": "{\"grabbableKey\":{\"grabbable\":false,\"ignoreIK\":false},\"original\":{\"id\":\"{6291b4e5-0dcb-484c-9c11-fe47725a4ad8}\"}}" + }, + { + "avatarEntity": false, + "clientOnly": false, + "created": 1550543327086377, + "dimensions": { + "x": 1.2754511833190918, + "y": 3.153184413909912, + "z": 1.5209078788757324 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{37eeb45f-18e6-4f09-9a12-7fc724bc3207}", + "isFacingAvatar": false, + "lastEdited": 1563467280901248, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "mirror_zone", + "parentID": "{93a7d1d0-8ed1-4274-89f5-1782a1866182}", + "position": { + "x": 0.03783285617828369, + "y": 0.192900612950325, + "z": 0.6896476745605469 + }, + "queryAACube": { + "scale": 3.8130435943603516, + "x": 11.114991188049316, + "y": -1.5054945945739746, + "z": -74.89230346679688 + }, + "rotation": { + "w": 0.999847412109375, + "x": -0.0161592960357666, + "y": 1.52587890625e-05, + "z": -0.006424069404602051 + }, + "script": "https://content.highfidelity.com/Experiences/Releases/usefulUtilities/mirror/2019-07-24_09-18-00/mirrorReflection.js", + "scriptTimestamp": 1512087165095, + "shapeType": "box", + "type": "Zone", + "userData": "{\n \"grabbableKey\": {\n \"grabbable\": false\n },\n \"original\": {\n \"id\": \"{da1e2fcd-d69b-47d7-b861-25b31f1c7175}\"\n }\n}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554335801064392, + "damping": 0, + "dimensions": { + "x": 13.220611572265625, + "y": 1.0003461837768555, + "z": 18.092063903808594 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{6cf8ef1e-a6f1-4513-95f1-325cbe7ccea6}", + "isFacingAvatar": false, + "lastEdited": 1563467161380716, + "lastEditedBy": "{fc877f50-8986-4f75-b202-bd8a31f2abcc}", + "localEntity": false, + "locked": true, + "name": "floor1", + "position": { + "x": 9.439321517944336, + "y": -1.6245304346084595, + "z": -72.88140869140625 + }, + "queryAACube": { + "scale": 22.430068969726562, + "x": -1.7757129669189453, + "y": -12.83956527709961, + "z": -84.09644317626953 + }, + "rotation": { + "w": 0.543907880783081, + "x": -1.52587890625e-05, + "y": -0.8391394019126892, + "z": -1.52587890625e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "avatarEntity": false, + "clientOnly": false, + "collisionless": true, + "created": 1554393775402859, + "dimensions": { + "x": 17.2584285736084, + "y": 5.475762367248535, + "z": 11.52783203125 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{fd11ca60-bcb9-419c-97de-f62829c0a90f}", + "ignoreForCollisions": true, + "isFacingAvatar": false, + "lastEdited": 1563467161380875, + "lastEditedBy": "{fc877f50-8986-4f75-b202-bd8a31f2abcc}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/welcome-pod2/baked/welcome-pod2.baked.fst", + "name": "Welcome Pod", + "position": { + "x": 13.916152000427246, + "y": 1.3918416500091553, + "z": -70.78492736816406 + }, + "queryAACube": { + "scale": 21.464582443237305, + "x": 3.1838607788085938, + "y": -9.340449333190918, + "z": -81.51721954345703 + }, + "rotation": { + "w": -0.18239110708236694, + "x": -4.57763671875e-05, + "y": -0.9832456111907959, + "z": 1.52587890625e-05 + }, + "type": "Model", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}" + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395164594013, + "damping": 0, + "dimensions": { + "x": 3.8521595001220703, + "y": 4.063507080078125, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{e0c24c12-89bc-42f6-8361-d78d41b165b6}", + "isFacingAvatar": false, + "lastEdited": 1563467280906743, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-wall", + "position": { + "x": 14.855209350585938, + "y": 1.0403138399124146, + "z": -68.7479248046875 + }, + "queryAACube": { + "scale": 5.602787017822266, + "x": 12.053815841674805, + "y": -1.7610796689987183, + "z": -71.54931640625 + }, + "rotation": { + "w": -0.0002288818359375, + "x": -0.9837949275970459, + "y": -0.0001373291015625, + "z": -0.17940032482147217 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395344119426, + "damping": 0, + "dimensions": { + "x": 11.6494140625, + "y": 4.063507080078125, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{0d82371a-af0e-4f10-9f6a-fb50a3b619cd}", + "isFacingAvatar": false, + "lastEdited": 1563467280915845, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-back-wall", + "position": { + "x": 6.5757904052734375, + "y": 0.9144222736358643, + "z": -73.51559448242188 + }, + "queryAACube": { + "scale": 12.339405059814453, + "x": 0.40608787536621094, + "y": -5.255280494689941, + "z": -79.68529510498047 + }, + "rotation": { + "w": 0.8191500902175903, + "x": -1.52587890625e-05, + "y": 0.5735408067703247, + "z": -7.62939453125e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395384473246, + "damping": 0, + "dimensions": { + "x": 3.8521595001220703, + "y": 4.063507080078125, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{f26146a8-0939-46fd-9905-092698513b37}", + "isFacingAvatar": false, + "lastEdited": 1563467280906345, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-wall", + "position": { + "x": 13.616107940673828, + "y": 1.039886713027954, + "z": -73.97779083251953 + }, + "queryAACube": { + "scale": 5.602787017822266, + "x": 10.814714431762695, + "y": -1.7615067958831787, + "z": -76.77918243408203 + }, + "rotation": { + "w": 0.7963531017303467, + "x": -0.0001373291015625, + "y": -0.6048523783683777, + "z": -1.52587890625e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395384473299, + "damping": 0, + "dimensions": { + "x": 6.047701835632324, + "y": 4.063507080078125, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{db6d648e-d172-4d15-b514-7dcc07af3c36}", + "isFacingAvatar": false, + "lastEdited": 1563467280907275, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-wall", + "position": { + "x": 10.673867225646973, + "y": 1.0397284030914307, + "z": -77.46546173095703 + }, + "queryAACube": { + "scale": 7.288812160491943, + "x": 7.029460906982422, + "y": -2.604677677154541, + "z": -81.10987091064453 + }, + "rotation": { + "w": 0.9553825855255127, + "x": -7.62939453125e-05, + "y": -0.29536890983581543, + "z": -4.57763671875e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395475622460, + "damping": 0, + "dimensions": { + "x": 3.8521595001220703, + "y": 4.063507080078125, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{61691f41-dc63-493d-ab8b-3495d7a9c14d}", + "isFacingAvatar": false, + "lastEdited": 1563467280913477, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-wall", + "position": { + "x": 11.448282241821289, + "y": 1.0398865938186646, + "z": -68.35993957519531 + }, + "queryAACube": { + "scale": 5.602787017822266, + "x": 8.646888732910156, + "y": -1.7615069150924683, + "z": -71.16133117675781 + }, + "rotation": { + "w": -0.0002288818359375, + "x": -0.9673762321472168, + "y": -1.52587890625e-05, + "z": 0.2533454895019531 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395498113470, + "damping": 0, + "dimensions": { + "x": 3.8521595001220703, + "y": 4.063507080078125, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{77de053d-5020-4fa0-b9aa-d627db7c9d39}", + "isFacingAvatar": false, + "lastEdited": 1563467280912614, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-wall", + "position": { + "x": 15.882454872131348, + "y": 1.0391541719436646, + "z": -71.47086334228516 + }, + "queryAACube": { + "scale": 5.602787017822266, + "x": 13.081061363220215, + "y": -1.7622393369674683, + "z": -74.27225494384766 + }, + "rotation": { + "w": -0.0002288818359375, + "x": -0.9837949275970459, + "y": -0.0001373291015625, + "z": -0.17940032482147217 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395615309489, + "damping": 0, + "dimensions": { + "x": 5.726871490478516, + "y": 6.041074752807617, + "z": 0.2973330616950989 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{49ffcb7c-b104-402f-8ba0-d2e680945938}", + "isFacingAvatar": false, + "lastEdited": 1563467161381977, + "lastEditedBy": "{fc877f50-8986-4f75-b202-bd8a31f2abcc}", + "localEntity": false, + "locked": true, + "name": "Floor 3", + "position": { + "x": 19.47880744934082, + "y": -1.1530930995941162, + "z": -68.66129302978516 + }, + "queryAACube": { + "scale": 8.329468727111816, + "x": 15.31407356262207, + "y": -5.317827224731445, + "z": -72.8260269165039 + }, + "rotation": { + "w": 0.6951247453689575, + "x": -0.6952773332595825, + "y": -0.1291981339454651, + "z": -0.1292286515235901 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395687275829, + "damping": 0, + "dimensions": { + "x": 4.614844799041748, + "y": 4.063507080078125, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{9cbd2b0f-13e4-428a-b153-4187414deec4}", + "isFacingAvatar": false, + "lastEdited": 1563467280908789, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-wall", + "position": { + "x": 21.860403060913086, + "y": 1.041013240814209, + "z": -69.77898406982422 + }, + "queryAACube": { + "scale": 6.152144908905029, + "x": 18.784330368041992, + "y": -2.0350592136383057, + "z": -72.85505676269531 + }, + "rotation": { + "w": -0.8343480825424194, + "x": 0.0002288818359375, + "y": 0.5512627363204956, + "z": 0.0001068115234375 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395719818630, + "damping": 0, + "dimensions": { + "x": 2.7593533992767334, + "y": 4.590254306793213, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{a1dc9796-400b-4672-b20f-c77786a73c11}", + "isFacingAvatar": false, + "lastEdited": 1563467280908308, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-wall", + "position": { + "x": 20.280054092407227, + "y": 1.5018401145935059, + "z": -72.24675750732422 + }, + "queryAACube": { + "scale": 5.35952091217041, + "x": 17.60029411315918, + "y": -1.1779203414916992, + "z": -74.92652130126953 + }, + "rotation": { + "w": -0.9687495231628418, + "x": 0.19557487964630127, + "y": 0.14308381080627441, + "z": 0.052933573722839355 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395749978274, + "damping": 0, + "dimensions": { + "x": 4.804360866546631, + "y": 4.063507080078125, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{dfda3708-5e09-45de-9be2-0cc256fdda3a}", + "isFacingAvatar": false, + "lastEdited": 1563467280906922, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-wall", + "position": { + "x": 20.669633865356445, + "y": 1.0425374507904053, + "z": -66.44235229492188 + }, + "queryAACube": { + "scale": 6.295551776885986, + "x": 17.52185821533203, + "y": -2.105238437652588, + "z": -69.59012603759766 + }, + "rotation": { + "w": -0.0003204345703125, + "x": -0.9677424430847168, + "y": -4.57763671875e-05, + "z": 0.2519416809082031 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395749983396, + "damping": 0, + "dimensions": { + "x": 2.2357139587402344, + "y": 4.063507080078125, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{26d0c15b-8a58-48c2-b1e8-0b04a529505f}", + "isFacingAvatar": false, + "lastEdited": 1563467280915515, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-wall", + "position": { + "x": 16.397750854492188, + "y": 0.7451583743095398, + "z": -66.87901306152344 + }, + "queryAACube": { + "scale": 4.642252445220947, + "x": 14.076624870300293, + "y": -1.575967788696289, + "z": -69.20014190673828 + }, + "rotation": { + "w": 0.19645988941192627, + "x": -0.8896162509918213, + "y": -0.08958572149276733, + "z": -0.40245670080184937 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554395833155826, + "damping": 0, + "dimensions": { + "x": 6.087839603424072, + "y": 4.063507080078125, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{5d2ed50f-8b33-4bc7-9d0e-e639d5dd2357}", + "isFacingAvatar": false, + "lastEdited": 1563467280913701, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-wall", + "position": { + "x": 7.133137226104736, + "y": 1.0399558544158936, + "z": -67.71293640136719 + }, + "queryAACube": { + "scale": 7.322150230407715, + "x": 3.472062110900879, + "y": -2.621119260787964, + "z": -71.37400817871094 + }, + "rotation": { + "w": -0.05049210786819458, + "x": 1.52587890625e-05, + "y": -0.998748779296875, + "z": 0.0001678466796875 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554397703510915, + "damping": 0, + "dimensions": { + "x": 13.220611572265625, + "y": 1.0003461837768555, + "z": 18.092063903808594 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{90901060-f216-447d-bbb9-8e43be6e90a6}", + "isFacingAvatar": false, + "lastEdited": 1563467280910975, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "roof", + "position": { + "x": 14.782567024230957, + "y": 3.50496506690979, + "z": -70.49324798583984 + }, + "queryAACube": { + "scale": 22.430068969726562, + "x": 3.567532539367676, + "y": -7.71006965637207, + "z": -81.70828247070312 + }, + "rotation": { + "w": 0.543541669845581, + "x": -0.0003814697265625, + "y": -0.8393835425376892, + "z": 0.0001373291015625 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554509979019596, + "damping": 0, + "dimensions": { + "x": 3.1357157230377197, + "y": 0.7045732736587524, + "z": 1.5312268733978271 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{d1693fdd-f7dc-4dac-b8d4-d10090ad08fc}", + "isFacingAvatar": false, + "lastEdited": 1563467280907424, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision_wall", + "position": { + "x": 19.5969181060791, + "y": -0.7506991624832153, + "z": -71.09772491455078 + }, + "queryAACube": { + "scale": 3.5600271224975586, + "x": 17.816904067993164, + "y": -2.530712604522705, + "z": -72.87773895263672 + }, + "rotation": { + "w": 0.999725341796875, + "x": -7.62939453125e-05, + "y": -0.023392081260681152, + "z": -4.57763671875e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554510972837087, + "damping": 0, + "dimensions": { + "x": 1.9762731790542603, + "y": 0.5533246994018555, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{6e904ccc-48ff-48f6-b948-ba1852c717e0}", + "isFacingAvatar": false, + "lastEdited": 1563467280912757, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 9.034714698791504, + "y": 0.12946277856826782, + "z": -77.50978088378906 + }, + "queryAACube": { + "scale": 2.061995029449463, + "x": 8.003717422485352, + "y": -0.9015347361564636, + "z": -78.54077911376953 + }, + "rotation": { + "w": 0.9993896484375, + "x": -4.57763671875e-05, + "y": 0.0348668098449707, + "z": -4.57763671875e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554511164106971, + "damping": 0, + "dimensions": { + "x": 0.20000000298023224, + "y": 0.5384143590927124, + "z": 1.8643357753753662 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{4ae513b1-3e8c-47ae-a791-a99c1401c881}", + "isFacingAvatar": false, + "lastEdited": 1563467280914421, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 5.680205345153809, + "y": 0.1265571266412735, + "z": -69.18448638916016 + }, + "queryAACube": { + "scale": 1.950804352760315, + "x": 4.704802989959717, + "y": -0.8488450646400452, + "z": -70.1598892211914 + }, + "rotation": { + "w": 0.9396963119506836, + "x": -1.52587890625e-05, + "y": 0.34200048446655273, + "z": -4.57763671875e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554511263685136, + "damping": 0, + "dimensions": { + "x": 0.20000000298023224, + "y": 1.1633296012878418, + "z": 3.318582773208618 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{f5c08b1d-503b-4bda-902b-35b1fa09b7cd}", + "isFacingAvatar": false, + "lastEdited": 1563467280906128, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 6.618948459625244, + "y": -0.47302883863449097, + "z": -68.3666000366211 + }, + "queryAACube": { + "scale": 3.522261619567871, + "x": 4.857817649841309, + "y": -2.2341597080230713, + "z": -70.12773132324219 + }, + "rotation": { + "w": 0.9396963119506836, + "x": -1.52587890625e-05, + "y": 0.34200048446655273, + "z": -4.57763671875e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554511341880877, + "damping": 0, + "dimensions": { + "x": 0.3861622214317322, + "y": 0.6504976153373718, + "z": 7.8453688621521 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{9bc8320e-e346-43a3-b03e-75590e326af0}", + "isFacingAvatar": false, + "lastEdited": 1563467280909531, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 6.845628261566162, + "y": -0.8465496301651001, + "z": -73.65797424316406 + }, + "queryAACube": { + "scale": 7.88175630569458, + "x": 2.904750108718872, + "y": -4.78742790222168, + "z": -77.5988540649414 + }, + "rotation": { + "w": 0.9812924861907959, + "x": -7.62939453125e-05, + "y": -0.1925230622291565, + "z": -1.52587890625e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554511476880919, + "damping": 0, + "dimensions": { + "x": 4.516627788543701, + "y": 3.408545970916748, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{176e50b8-0a35-432d-a08c-09aeb6e92919}", + "isFacingAvatar": false, + "lastEdited": 1563467280915687, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision_wall", + "position": { + "x": 14.866923332214355, + "y": 0.5867739319801331, + "z": -68.93809509277344 + }, + "queryAACube": { + "scale": 5.661988258361816, + "x": 12.035928726196289, + "y": -2.24422025680542, + "z": -71.76908874511719 + }, + "rotation": { + "w": 0.9808042049407959, + "x": -4.57763671875e-05, + "y": -0.19499504566192627, + "z": -7.62939453125e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554511520319224, + "damping": 0, + "dimensions": { + "x": 4.516627788543701, + "y": 3.408545970916748, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{0a971375-3ee2-4813-a5d0-4a2321c01fe6}", + "isFacingAvatar": false, + "lastEdited": 1563467280915984, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision_wall", + "position": { + "x": 15.85211181640625, + "y": 0.5864658951759338, + "z": -71.31785583496094 + }, + "queryAACube": { + "scale": 5.661988258361816, + "x": 13.0211181640625, + "y": -2.244528293609619, + "z": -74.14884948730469 + }, + "rotation": { + "w": 0.9807736873626709, + "x": -4.57763671875e-05, + "y": -0.19511711597442627, + "z": -4.57763671875e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554511585054335, + "damping": 0, + "dimensions": { + "x": 2.723170042037964, + "y": 0.20000000298023224, + "z": 1.7211601734161377 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{f9fd13cc-5b4f-47c6-80c4-27d85fac78b9}", + "isFacingAvatar": false, + "lastEdited": 1563467280905629, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 20.782413482666016, + "y": -0.5008415579795837, + "z": -66.48963165283203 + }, + "queryAACube": { + "scale": 3.2276999950408936, + "x": 19.168563842773438, + "y": -2.1146914958953857, + "z": -68.10348510742188 + }, + "rotation": { + "w": 0.9510490894317627, + "x": -1.52587890625e-05, + "y": 0.30897998809814453, + "z": -4.57763671875e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554511730254797, + "damping": 0, + "dimensions": { + "x": 1.3115150928497314, + "y": 0.20000000298023224, + "z": 1.1722313165664673 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{7f100ff4-028d-4acc-81fa-0d844ecd423e}", + "isFacingAvatar": false, + "lastEdited": 1563467280912463, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 17.6627140045166, + "y": -0.5005519390106201, + "z": -66.71401977539062 + }, + "queryAACube": { + "scale": 1.7703666687011719, + "x": 16.777530670166016, + "y": -1.385735273361206, + "z": -67.59920501708984 + }, + "rotation": { + "w": 0.9505302906036377, + "x": -0.0001678466796875, + "y": -0.31056690216064453, + "z": -4.57763671875e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554512002518553, + "damping": 0, + "dimensions": { + "x": 0.7308322787284851, + "y": 4.888399124145508, + "z": 0.783096432685852 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{3ecea56c-9cf2-4329-b5b2-b50448f9c5d1}", + "isFacingAvatar": false, + "lastEdited": 1563467280914810, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision_tree", + "position": { + "x": 7.177090167999268, + "y": 1.2557251453399658, + "z": -73.16246032714844 + }, + "queryAACube": { + "scale": 5.004378318786621, + "x": 4.674901008605957, + "y": -1.2464640140533447, + "z": -75.6646499633789 + }, + "rotation": { + "w": 0.9844968318939209, + "x": -4.57763671875e-05, + "y": -0.1754024624824524, + "z": -1.52587890625e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554512216650454, + "damping": 0, + "dimensions": { + "x": 1.1273462772369385, + "y": 0.27245450019836426, + "z": 1.547093152999878 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{5146be4a-b0a2-4b4b-8d17-e83b7db70519}", + "isFacingAvatar": false, + "lastEdited": 1563467280914211, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 21.151384353637695, + "y": -0.5318018794059753, + "z": -70.26309204101562 + }, + "queryAACube": { + "scale": 1.9335558414459229, + "x": 20.184606552124023, + "y": -1.498579740524292, + "z": -71.22987365722656 + }, + "rotation": { + "w": 0.9510490894317627, + "x": -1.52587890625e-05, + "y": 0.30897998809814453, + "z": -7.62939453125e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "collidesWith": "static,dynamic,kinematic,otherAvatar,", + "collisionMask": 23, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554512302898655, + "damping": 0, + "dimensions": { + "x": 1.1379551887512207, + "y": 2.7677454948425293, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{8d60c0d9-558b-4efc-b598-540844faebe6}", + "isFacingAvatar": false, + "lastEdited": 1563467280911168, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 17.958641052246094, + "y": 0.6593599915504456, + "z": -65.38139343261719 + }, + "queryAACube": { + "scale": 2.9992260932922363, + "x": 16.459028244018555, + "y": -0.8402530550956726, + "z": -66.8810043334961 + }, + "rotation": { + "w": 0.9411001205444336, + "x": 0.24956130981445312, + "y": -0.21806669235229492, + "z": 0.06657516956329346 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "collidesWith": "static,dynamic,kinematic,otherAvatar,", + "collisionMask": 23, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554512354734850, + "damping": 0, + "dimensions": { + "x": 1.4752637147903442, + "y": 4.9809184074401855, + "z": 0.4419654607772827 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{80b8eaf6-1466-4f68-bcfd-c1f3cc0d3701}", + "isFacingAvatar": false, + "lastEdited": 1563467280911325, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 19.03372573852539, + "y": 0.3482077419757843, + "z": -65.64324951171875 + }, + "queryAACube": { + "scale": 5.21356725692749, + "x": 16.426942825317383, + "y": -2.258575916290283, + "z": -68.25003051757812 + }, + "rotation": { + "w": 0.9732662439346313, + "x": 0.22880899906158447, + "y": 0.0168001651763916, + "z": 0.00889599323272705 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "collidesWith": "static,dynamic,kinematic,otherAvatar,", + "collisionMask": 23, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554512415741459, + "damping": 0, + "dimensions": { + "x": 1.1379551887512207, + "y": 2.7677454948425293, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{c4558dc0-43cb-4a81-bc2c-368c9a4e16d7}", + "isFacingAvatar": false, + "lastEdited": 1563467280907569, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 16.94318962097168, + "y": 0.6663778424263, + "z": -65.93487548828125 + }, + "queryAACube": { + "scale": 2.9992260932922363, + "x": 15.44357681274414, + "y": -0.8332352042198181, + "z": -67.43448638916016 + }, + "rotation": { + "w": 0.8979781866073608, + "x": 0.2502937316894531, + "y": -0.3521324396133423, + "z": 0.08326852321624756 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554512594526896, + "damping": 0, + "dimensions": { + "x": 2.599607467651367, + "y": 2.7401115894317627, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{9742281e-d2d1-47b2-9f0f-509da4cdfe32}", + "isFacingAvatar": false, + "lastEdited": 1563467280910674, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 20.485273361206055, + "y": 0.7680158615112305, + "z": -65.8010025024414 + }, + "queryAACube": { + "scale": 3.7823498249053955, + "x": 18.594099044799805, + "y": -1.1231590509414673, + "z": -67.69217681884766 + }, + "rotation": { + "w": 0.9451285600662231, + "x": 0.17512774467468262, + "y": 0.2709850072860718, + "z": -0.05082780122756958 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554512682906578, + "damping": 0, + "dimensions": { + "x": 0.20000000298023224, + "y": 2.732187271118164, + "z": 2.7675163745880127 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{2cccb27b-f01a-4b4a-a3ae-eb3fd7b6522e}", + "isFacingAvatar": false, + "lastEdited": 1563467280915375, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 21.92999839782715, + "y": 0.727752685546875, + "z": -67.24706268310547 + }, + "queryAACube": { + "scale": 3.894097328186035, + "x": 19.98295021057129, + "y": -1.2192959785461426, + "z": -69.1941146850586 + }, + "rotation": { + "w": 0.9482413530349731, + "x": 0.050431013107299805, + "y": -0.23134201765060425, + "z": -0.21159684658050537 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554512851406673, + "damping": 0, + "dimensions": { + "x": 0.43387630581855774, + "y": 4.7313127517700195, + "z": 2.3720154762268066 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{99ac48ff-bfb3-4de7-912c-d96cf7355c07}", + "isFacingAvatar": false, + "lastEdited": 1563467280910239, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 22.567644119262695, + "y": 1.3780510425567627, + "z": -69.06810760498047 + }, + "queryAACube": { + "scale": 5.310369968414307, + "x": 19.912458419799805, + "y": -1.2771339416503906, + "z": -71.7232894897461 + }, + "rotation": { + "w": 0.9829404354095459, + "x": -0.00871288776397705, + "y": 0.050553083419799805, + "z": -0.1765010952949524 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "collidesWith": "static,dynamic,kinematic,otherAvatar,", + "collisionMask": 23, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554513144280379, + "damping": 0, + "dimensions": { + "x": 0.20000000298023224, + "y": 5.408563137054443, + "z": 3.346208095550537 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{35482a9d-994a-4aa6-a1d0-11909e347251}", + "isFacingAvatar": false, + "lastEdited": 1563467280914955, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 22.037845611572266, + "y": 1.4232194423675537, + "z": -70.92962646484375 + }, + "queryAACube": { + "scale": 6.363149166107178, + "x": 18.856271743774414, + "y": -1.7583551406860352, + "z": -74.11119842529297 + }, + "rotation": { + "w": 0.9099106788635254, + "x": -0.07747006416320801, + "y": 0.35796141624450684, + "z": -0.19475090503692627 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554513450928413, + "damping": 0, + "dimensions": { + "x": 3.116267681121826, + "y": 4.054603576660156, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{b20e4789-aa5d-4544-a062-16e13aa0ed79}", + "isFacingAvatar": false, + "lastEdited": 1563467280907967, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 18.134056091308594, + "y": 1.0476075410842896, + "z": -72.24353790283203 + }, + "queryAACube": { + "scale": 5.117708206176758, + "x": 15.575201988220215, + "y": -1.5112465620040894, + "z": -74.8023910522461 + }, + "rotation": { + "w": 0.9672236442565918, + "x": -0.2066224217414856, + "y": 0.14421296119689941, + "z": 0.030441761016845703 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554513664429322, + "damping": 0, + "dimensions": { + "x": 0.20000000298023224, + "y": 2.6543757915496826, + "z": 1.3885936737060547 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{e9a6864c-7dfe-4d39-b375-a1bcc822d287}", + "isFacingAvatar": false, + "lastEdited": 1563467280906552, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 17.893924713134766, + "y": 0.8742422461509705, + "z": -71.33345794677734 + }, + "queryAACube": { + "scale": 3.002316474914551, + "x": 16.39276695251465, + "y": -0.6269159913063049, + "z": -72.8346176147461 + }, + "rotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554516803035825, + "damping": 0, + "dimensions": { + "x": 1.5199129581451416, + "y": 0.20000000298023224, + "z": 1.803011178970337 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{6b672df4-c098-4e7d-8132-2ca8cec9bfcd}", + "isFacingAvatar": false, + "lastEdited": 1563467280913027, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 21.629100799560547, + "y": -0.5141257047653198, + "z": -67.83106231689453 + }, + "queryAACube": { + "scale": 2.3666398525238037, + "x": 20.445781707763672, + "y": -1.6974456310272217, + "z": -69.0143814086914 + }, + "rotation": { + "w": 0.9825742244720459, + "x": -4.57763671875e-05, + "y": -0.18571758270263672, + "z": -4.57763671875e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554516852784984, + "damping": 0, + "dimensions": { + "x": 1.376994013786316, + "y": 0.20000000298023224, + "z": 1.803011178970337 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{08a79e11-378b-472e-8ed4-683178a4905f}", + "isFacingAvatar": false, + "lastEdited": 1563467280916164, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision", + "position": { + "x": 21.766597747802734, + "y": -0.5142682194709778, + "z": -69.11212921142578 + }, + "queryAACube": { + "scale": 2.2774901390075684, + "x": 20.627853393554688, + "y": -1.6530132293701172, + "z": -70.2508773803711 + }, + "rotation": { + "w": 0.9957274198532104, + "x": -4.57763671875e-05, + "y": 0.09214925765991211, + "z": -7.62939453125e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554667403968924, + "damping": 0, + "dimensions": { + "x": 2.2357139587402344, + "y": 4.063507080078125, + "z": 0.20000000298023224 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{34f507a2-e147-47ea-970c-5dfc4a523550}", + "isFacingAvatar": false, + "lastEdited": 1563467280915097, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-wall", + "position": { + "x": 17.651775360107422, + "y": 0.735522985458374, + "z": -65.75617218017578 + }, + "queryAACube": { + "scale": 4.642252445220947, + "x": 15.330649375915527, + "y": -1.5856032371520996, + "z": -68.07730102539062 + }, + "rotation": { + "w": 0.19780266284942627, + "x": -0.9584649205207825, + "y": -0.045212507247924805, + "z": -0.20054930448532104 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554668158560681, + "damping": 0, + "dimensions": { + "x": 2.2458550930023193, + "y": 0.20000000298023224, + "z": 1.613483190536499 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{9c2a1174-362d-42b4-8c69-5969f05c2ab2}", + "isFacingAvatar": false, + "lastEdited": 1563467280909129, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "position": { + "x": 18.860658645629883, + "y": -0.5461101531982422, + "z": -66.02705383300781 + }, + "queryAACube": { + "scale": 2.772578716278076, + "x": 17.474369049072266, + "y": -1.9323995113372803, + "z": -67.41334533691406 + }, + "rotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1554675694970161, + "damping": 0, + "dimensions": { + "x": 0.20000000298023224, + "y": 3.3708338737487793, + "z": 1.004555106163025 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{343c1b18-2ccb-4053-a429-0668f70be1de}", + "isFacingAvatar": false, + "lastEdited": 1563467280915236, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "position": { + "x": 15.91869831085205, + "y": 0.8493099808692932, + "z": -67.866455078125 + }, + "queryAACube": { + "scale": 3.523017406463623, + "x": 14.15718936920166, + "y": -0.9121987223625183, + "z": -69.62796020507812 + }, + "rotation": { + "w": 0.9905089139938354, + "x": 0.040970444679260254, + "y": -0.07103073596954346, + "z": 0.11021590232849121 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "animation": { + "allowTranslation": false + }, + "avatarEntity": false, + "clientOnly": false, + "created": 1557434224286737, + "damping": 0, + "dimensions": { + "x": 0.9039000272750854, + "y": 1, + "z": 1.6324000358581543 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{1f9e7521-6d58-49d1-aefa-3ac49918fc44}", + "isFacingAvatar": false, + "lastEdited": 1563467161386805, + "lastEditedBy": "{fc877f50-8986-4f75-b202-bd8a31f2abcc}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/Shield-Toolbar1/baked/Shield-Toolbar1.baked.fst", + "name": "PersonalShield.", + "position": { + "x": 21.056665420532227, + "y": 0.18451154232025146, + "z": -69.99424743652344 + }, + "queryAACube": { + "scale": 2.117017984390259, + "x": 19.99815559387207, + "y": -0.8739974498748779, + "z": -71.0527572631836 + }, + "rotation": { + "w": 0.024551749229431152, + "x": -7.62939453125e-05, + "y": -0.999725341796875, + "z": -4.57763671875e-05 + }, + "type": "Model" + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1557536614579891, + "damping": 0, + "dimensions": { + "x": 1.7990152835845947, + "y": 0.3200075626373291, + "z": 1.5757719278335571 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{f67fd522-c947-49a3-af81-a0de99a3953f}", + "isFacingAvatar": false, + "lastEdited": 1563467280905923, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "name": "collision-bench1", + "position": { + "x": 16.860097885131836, + "y": -0.549018919467926, + "z": -67.09400177001953 + }, + "queryAACube": { + "scale": 2.412865161895752, + "x": 15.653665542602539, + "y": -1.7554514408111572, + "z": -68.3004379272461 + }, + "rotation": { + "w": 0.9612420797348022, + "x": -1.52587890625e-05, + "y": 0.2755931615829468, + "z": -4.57763671875e-05 + }, + "shape": "Cube", + "type": "Box", + "visible": false + }, + { + "avatarEntity": false, + "clientOnly": false, + "collisionless": true, + "created": 1557781982596118, + "dimensions": { + "x": 0.9039000272750854, + "y": 1, + "z": 1.6324000358581543 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{ac2f0b92-2839-4ca3-90fe-c96c218c18e1}", + "ignoreForCollisions": true, + "isFacingAvatar": false, + "lastEdited": 1563467161387107, + "lastEditedBy": "{fc877f50-8986-4f75-b202-bd8a31f2abcc}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/Tablet-Toolbar1/baked/Tablet-Toolbar1.baked.fst", + "name": "Tablet", + "position": { + "x": 19.94297218322754, + "y": 0.18448932468891144, + "z": -66.57754516601562 + }, + "queryAACube": { + "scale": 2.117017984390259, + "x": 18.884462356567383, + "y": -0.8740196824073792, + "z": -67.63605499267578 + }, + "rotation": { + "w": 0.7489891052246094, + "x": -1.52587890625e-05, + "y": 0.6625620126724243, + "z": -0.0001373291015625 + }, + "type": "Model", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}" + }, + { + "angularDamping": 0, + "animation": { + "allowTranslation": false + }, + "avatarEntity": false, + "clientOnly": false, + "created": 1558036708243904, + "damping": 0, + "dimensions": { + "x": 12.360462188720703, + "y": 12.203283309936523, + "z": 12.380107879638672 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{c9bdbd9a-e767-44e8-baab-7638ffaf6f79}", + "isFacingAvatar": false, + "lastEdited": 1563467161387272, + "lastEditedBy": "{fc877f50-8986-4f75-b202-bd8a31f2abcc}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/LowPolyTreeAO2/baked/LowPolyTreeAO2.baked.fst", + "name": "Tree", + "position": { + "x": 7.227527141571045, + "y": 4.494775295257568, + "z": -73.15557861328125 + }, + "queryAACube": { + "scale": 21.32998275756836, + "x": -3.4374642372131348, + "y": -6.170216083526611, + "z": -83.82057189941406 + }, + "rotation": { + "w": 0.7661707401275635, + "x": -4.57763671875e-05, + "y": 0.6426031589508057, + "z": -0.0001068115234375 + }, + "type": "Model" + }, + { + "angularDamping": 0, + "animation": { + "allowTranslation": false + }, + "avatarEntity": false, + "clientOnly": false, + "created": 1563412618962599, + "damping": 0, + "dimensions": { + "x": 0.9039000272750854, + "y": 1, + "z": 1.6324000358581543 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{04baca89-93dd-41e5-9e55-74ba9fe3e2fd}", + "isFacingAvatar": false, + "lastEdited": 1563467280904916, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/Goto-Toolbar1/baked/Goto-Toolbar1.baked.fst", + "name": "Goto", + "position": { + "x": 21.300800323486328, + "y": 0.18451154232025146, + "z": -68.04023742675781 + }, + "queryAACube": { + "scale": 2.117017984390259, + "x": 20.242290496826172, + "y": -0.8739974498748779, + "z": -69.09874725341797 + }, + "rotation": { + "w": 0.3849087953567505, + "x": -7.62939453125e-05, + "y": 0.9229419231414795, + "z": -7.62939453125e-05 + }, + "type": "Model" + }, + { + "angularDamping": 0, + "animation": { + "allowTranslation": false + }, + "avatarEntity": false, + "clientOnly": false, + "created": 1563413103692919, + "damping": 0, + "dimensions": { + "x": 4.573084831237793, + "y": 1.4999998807907104, + "z": 2.496737003326416 + }, + "faceCamera": false, + "grab": { + "grabbable": false + }, + "id": "{e859cd08-8a8c-4f68-8dae-e5d2ac3e5614}", + "isFacingAvatar": false, + "lastEdited": 1563467161387566, + "lastEditedBy": "{fc877f50-8986-4f75-b202-bd8a31f2abcc}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/Controls/original/Controls.fbx", + "position": { + "x": 9.5448637008667, + "y": 0.3290107548236847, + "z": -68.53327178955078 + }, + "queryAACube": { + "scale": 5.421881675720215, + "x": 6.833922863006592, + "y": -2.381930112838745, + "z": -71.24420928955078 + }, + "rotation": { + "w": 0.9396963119506836, + "x": -1.52587890625e-05, + "y": 0.34196996688842773, + "z": -7.62939453125e-05 + }, + "type": "Model" + }, + { + "angularDamping": 0, + "avatarEntity": false, + "clientOnly": false, + "color": { + "blue": 239, + "green": 180, + "red": 0 + }, + "created": 1563413608610158, + "damping": 0, + "dimensions": { + "x": 4.348940849304199, + "y": 6.041074752807617, + "z": 0.2973330616950989 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{fff6c078-68a8-4b45-807f-a0245a57fe17}", + "isFacingAvatar": false, + "lastEdited": 1563467161387729, + "lastEditedBy": "{fc877f50-8986-4f75-b202-bd8a31f2abcc}", + "localEntity": false, + "locked": true, + "name": "Floor 3", + "position": { + "x": 14.78688907623291, + "y": -1.23642897605896, + "z": -70.46572875976562 + }, + "queryAACube": { + "scale": 7.449582099914551, + "x": 11.062097549438477, + "y": -4.961219787597656, + "z": -74.19052124023438 + }, + "rotation": { + "w": 0.6967726945877075, + "x": -0.6922560334205627, + "y": -0.1444571614265442, + "z": -0.12022584676742554 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"grabbableKey\":{\"grabbable\":false}}", + "visible": false + }, + { + "angularDamping": 0, + "animation": { + "allowTranslation": false + }, + "avatarEntity": false, + "clientOnly": false, + "created": 1563418305015493, + "damping": 0, + "dimensions": { + "x": 2.185603141784668, + "y": 1.0729032754898071, + "z": 0.7190596461296082 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{a7fb6cb2-2838-4d87-a5f7-1c10cd14a472}", + "isFacingAvatar": false, + "lastEdited": 1563467280903467, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/Avatar-Toolbar/baked/Avatar-Toolbar.baked.fst", + "name": "Avatar", + "position": { + "x": 13.075835227966309, + "y": 0.29294848442077637, + "z": -74.93418884277344 + }, + "queryAACube": { + "scale": 2.5387063026428223, + "x": 11.806482315063477, + "y": -0.9764046669006348, + "z": -76.20354461669922 + }, + "rotation": { + "w": 0.40666818618774414, + "x": -7.62939453125e-05, + "y": 0.9135423898696899, + "z": -0.0001678466796875 + }, + "type": "Model" + }, + { + "angularDamping": 0, + "animation": { + "allowTranslation": false + }, + "avatarEntity": false, + "clientOnly": false, + "created": 1563418414952653, + "damping": 0, + "dimensions": { + "x": 2.185603141784668, + "y": 1.0729032754898071, + "z": 0.7190596461296082 + }, + "faceCamera": false, + "grab": { + "equippableLeftRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "equippableRightRotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "grabbable": false + }, + "id": "{828ba18a-8ce4-4ad6-8583-9281580bb35c}", + "isFacingAvatar": false, + "lastEdited": 1563467280904188, + "lastEditedBy": "{d64a89a8-8afe-4459-8aa8-497e782083a3}", + "localEntity": false, + "locked": true, + "modelURL": "https://content.highfidelity.com/welcome-tutorial/v1/baked/Toolbar-Toolbar2/baked/Toolbar-Toolbar2.baked.fst", + "name": "Toolbar", + "position": { + "x": 11.481505393981934, + "y": 0.29294848442077637, + "z": -76.84197235107422 + }, + "queryAACube": { + "scale": 2.5387063026428223, + "x": 10.212152481079102, + "y": -0.9764046669006348, + "z": -78.111328125 + }, + "rotation": { + "w": 0.15632867813110352, + "x": -4.57763671875e-05, + "y": 0.9877011775970459, + "z": -0.0002593994140625 + }, + "type": "Model" } ], - "Version": 84 + "Id": "{5807d519-eb7d-496d-b22a-0820811291c9}", + "Version": 120 } diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 7b21cb3460..bd3dc7c177 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -30,7 +30,7 @@ #include "UserActivityLogger.h" #include "udt/PacketHeaders.h" -const QString DEFAULT_HIFI_ADDRESS = "hifi://welcome"; +const QString DEFAULT_HIFI_ADDRESS = "file:///~/serverless/tutorial.json"; const QString DEFAULT_HOME_ADDRESS = "file:///~/serverless/tutorial.json"; const QString REDIRECT_HIFI_ADDRESS = "file:///~/serverless/redirect.json"; const QString ADDRESS_MANAGER_SETTINGS_GROUP = "AddressManager"; From 4d9557dfc115ff42aba4d568301620cbff5faa2c Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 24 Jul 2019 17:16:22 -0700 Subject: [PATCH 12/17] Display version and autoupdate --- launchers/win32/CMakeLists.txt | 5 +- launchers/win32/Launcher.rc | 5 +- launchers/win32/LauncherDlg.cpp | 40 ++++++- launchers/win32/LauncherDlg.h | 2 + launchers/win32/LauncherManager.cpp | 104 +++++++++++++----- launchers/win32/LauncherManager.h | 20 +++- .../cmake/macros/SetPackagingParameters.cmake | 45 ++++++++ launchers/win32/resource.h | 1 + 8 files changed, 181 insertions(+), 41 deletions(-) create mode 100644 launchers/win32/cmake/macros/SetPackagingParameters.cmake diff --git a/launchers/win32/CMakeLists.txt b/launchers/win32/CMakeLists.txt index a472c68688..e42e3eb743 100644 --- a/launchers/win32/CMakeLists.txt +++ b/launchers/win32/CMakeLists.txt @@ -10,6 +10,7 @@ set(CMAKE_MFC_FLAG 1) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") +include("cmake/macros/SetPackagingParameters.cmake") add_executable(HQLauncher WIN32 @@ -49,6 +50,8 @@ function(set_from_env _RESULT_NAME _ENV_VAR_NAME _DEFAULT_VALUE) endif() endfunction() +set_packaging_parameters() + set_from_env(LAUNCHER_HMAC_SECRET LAUNCHER_HMAC_SECRET "") if (LAUNCHER_HMAC_SECRET STREQUAL "") @@ -56,7 +59,7 @@ if (LAUNCHER_HMAC_SECRET STREQUAL "") endif() target_compile_definitions(${PROJECT_NAME} PRIVATE LAUNCHER_HMAC_SECRET="${LAUNCHER_HMAC_SECRET}") - +target_compile_definitions(${PROJECT_NAME} PRIVATE LAUNCHER_BUILD_VERSION="${BUILD_VERSION}") # Preprocessor definitions target_compile_definitions(HQLauncher PRIVATE diff --git a/launchers/win32/Launcher.rc b/launchers/win32/Launcher.rc index eb72dced4c..b3225d5a4a 100644 --- a/launchers/win32/Launcher.rc +++ b/launchers/win32/Launcher.rc @@ -92,8 +92,8 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION EXSTYLE WS_EX_APPWINDOW FONT 10, "MS Shell Dlg", 400, 0, 0x0 BEGIN - CONTROL "",IDC_VOXEL,"Static",SS_BLACKRECT,65,3,174,123, NOT WS_VISIBLE - CONTROL "", IDC_PROGRESS, "Static", SS_BLACKRECT, 35, 170, 239, 4, NOT WS_VISIBLE + CONTROL "",IDC_VOXEL,"Static",SS_BLACKRECT,65,3,174,123 + CONTROL "",IDC_PROGRESS,"Static",SS_BLACKRECT,35,170,239,4 EDITTEXT IDC_ORGNAME,44,68,219,12,ES_AUTOHSCROLL | NOT WS_VISIBLE | NOT WS_BORDER EDITTEXT IDC_USERNAME,44,95,219,12,ES_AUTOHSCROLL | NOT WS_VISIBLE | NOT WS_BORDER EDITTEXT IDC_PASSWORD,44,122,219,12,ES_PASSWORD | ES_AUTOHSCROLL | NOT WS_VISIBLE | NOT WS_BORDER @@ -107,6 +107,7 @@ BEGIN RTEXT "",IDC_TERMS,15,172,180,15,NOT WS_VISIBLE CONTROL "",IDC_TERMS_LINK,"Button",BS_OWNERDRAW | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,197,172,80,15 CTEXT "",IDC_TROUBLE,65,203,174,15,NOT WS_VISIBLE + RTEXT "THIS IS THE VERSION",IDC_VERSION,0,205,305,10 CONTROL "NEXT",IDC_BUTTON_NEXT,"Button",BS_OWNERDRAW | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,107,158,94,16 CONTROL "Having Trouble?",IDC_TROUBLE_LINK,"Button",BS_OWNERDRAW | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,126,203,56,11 END diff --git a/launchers/win32/LauncherDlg.cpp b/launchers/win32/LauncherDlg.cpp index 2e5d568839..a2128b4389 100644 --- a/launchers/win32/LauncherDlg.cpp +++ b/launchers/win32/LauncherDlg.cpp @@ -40,6 +40,8 @@ static CString GRAPHIK_SEMIBOLD = _T("Graphik-Semibold"); static CString TROUBLE_URL = _T("https://www.highfidelity.com/hq-support"); static CString TERMS_URL = _T("https://www.highfidelity.com/termsofservice"); +static int SPLASH_DURATION = 100; + CLauncherDlg::CLauncherDlg(CWnd* pParent) : CDialog(IDD_LAUNCHER_DIALOG, pParent) @@ -112,6 +114,11 @@ BOOL CLauncherDlg::OnInitDialog() { m_voxel = (CStatic *)GetDlgItem(IDC_VOXEL); m_progress = (CStatic *)GetDlgItem(IDC_PROGRESS); + m_version = (CStatic *)GetDlgItem(IDC_VERSION); + CString version; + version.Format(_T("V.%s"), theApp._manager.getLauncherVersion()); + m_version->SetWindowTextW(version); + m_voxel->EnableD2DSupport(); m_progress->EnableD2DSupport(); @@ -230,7 +237,6 @@ void CLauncherDlg::startProcess() { theApp._manager.setFailed(true); } }); - } BOOL CLauncherDlg::getHQInfo(const CString& orgname) { @@ -322,11 +328,12 @@ void CLauncherDlg::drawLogo(CHwndRenderTarget* pRenderTarget) { void CLauncherDlg::drawSmallLogo(CHwndRenderTarget* pRenderTarget) { CD2DBitmap m_pBitmamLogo(pRenderTarget, IDB_PNG5, _T("PNG")); auto size = pRenderTarget->GetSize(); - int padding = 6; + int xPadding = 6; + int yPadding = 22; int logoWidth = 100; int logoHeight = 18; - float logoPosX = size.width - logoWidth - padding; - float logoPosY = size.height - logoHeight - padding; + float logoPosX = size.width - logoWidth - xPadding; + float logoPosY = size.height - logoHeight - yPadding; CD2DRectF logoRec(logoPosX, logoPosY, logoPosX + logoWidth, logoPosY + logoHeight); pRenderTarget->DrawBitmap(&m_pBitmamLogo, logoRec); } @@ -521,6 +528,7 @@ BOOL CLauncherDlg::getTextFormat(int resID, TextFormat& formatOut) { formatOut.size = FIELDS_FONT_SIZE; formatOut.color = COLOR_GREY; break; + case IDC_VERSION: case IDC_TERMS: formatOut.size = TERMS_FONT_SIZE; break; @@ -663,6 +671,24 @@ void CLauncherDlg::OnTimer(UINT_PTR nIDEvent) { // Refresh setDrawDialog(_drawStep, true); } + + if (theApp._manager.needsSelfUpdate()) { + if (theApp._manager.needsSelfDownload()) { + theApp._manager.downloadNewLauncher(); + } else { + if (_splashStep > SPLASH_DURATION && _splashStep < 2 * SPLASH_DURATION) { + theApp._manager.updateProgress(LauncherManager::ProcessType::Uninstall, (float)(_splashStep - SPLASH_DURATION) / SPLASH_DURATION); + _splashStep++; + } + if (theApp._manager.needsRestartNewLauncher()) { + if (_splashStep >= 2 * SPLASH_DURATION) { + theApp._manager.restartNewLauncher(); + exit(0); + } + } + } + } + if (_showSplash) { if (_splashStep == 0) { if (theApp._manager.needsUninstall()) { @@ -672,7 +698,7 @@ void CLauncherDlg::OnTimer(UINT_PTR nIDEvent) { theApp._manager.addToLog(_T("Start splash screen")); setDrawDialog(DrawStep::DrawLogo); } - } else if (_splashStep > 100 && !theApp._manager.needsToWait()) { + } else if (_splashStep > SPLASH_DURATION && !theApp._manager.needsToWait()) { _showSplash = false; if (theApp._manager.shouldShutDown()) { if (_applicationWND != NULL) { @@ -692,12 +718,14 @@ void CLauncherDlg::OnTimer(UINT_PTR nIDEvent) { theApp._manager.addToLog(_T("HQ failed to uninstall.")); theApp._manager.setFailed(true); } + } else if (theApp._manager.needsSelfUpdate()) { + setDrawDialog(DrawStep::DrawProcessUpdate); } else { theApp._manager.addToLog(_T("Starting login")); setDrawDialog(DrawStep::DrawLoginLogin); } } else if (theApp._manager.needsUninstall()) { - theApp._manager.updateProgress(LauncherManager::ProcessType::Uninstall, (float)_splashStep/100); + theApp._manager.updateProgress(LauncherManager::ProcessType::Uninstall, (float)_splashStep / SPLASH_DURATION); } _splashStep++; } else if (theApp._manager.shouldShutDown()) { diff --git a/launchers/win32/LauncherDlg.h b/launchers/win32/LauncherDlg.h index faebc8a822..d25618c554 100644 --- a/launchers/win32/LauncherDlg.h +++ b/launchers/win32/LauncherDlg.h @@ -94,6 +94,8 @@ protected: CStatic* m_username_banner; CStatic* m_password_banner; + CStatic* m_version; + HWND _applicationWND { 0 }; void drawBackground(CHwndRenderTarget* pRenderTarget); diff --git a/launchers/win32/LauncherManager.cpp b/launchers/win32/LauncherManager.cpp index 294c9742f5..d584e56ad1 100644 --- a/launchers/win32/LauncherManager.cpp +++ b/launchers/win32/LauncherManager.cpp @@ -23,8 +23,11 @@ LauncherManager::~LauncherManager() { void LauncherManager::init() { initLog(); - addToLog(_T("Getting most recent build")); - getMostRecentBuild(_latestApplicationURL, _latestVersion); + int tokenPos = 0; + _launcherVersion = CString(LAUNCHER_BUILD_VERSION).Tokenize(_T("-"), tokenPos); + addToLog(_T("Launcher is running version: " + _launcherVersion)); + addToLog(_T("Getting most recent builds")); + getMostRecentBuilds(_latestLauncherURL, _latestLauncherVersion, _latestApplicationURL, _latestVersion); } BOOL LauncherManager::initLog() { @@ -124,6 +127,8 @@ BOOL LauncherManager::restartLauncher() { void LauncherManager::updateProgress(ProcessType processType, float progress) { switch (processType) { + case ProcessType::DownloadLauncher: + break; case ProcessType::Uninstall: _progress = progress; break; @@ -359,14 +364,23 @@ LauncherUtils::ResponseError LauncherManager::readOrganizationJSON(const CString return LauncherUtils::ResponseError::ParsingJSON; } -void LauncherManager::getMostRecentBuild(CString& urlOut, CString& versionOut) { +void LauncherManager::getMostRecentBuilds(CString& launcherUrlOut, CString& launcherVersionOut, + CString& interfaceUrlOut, CString& interfaceVersionOut) { CString contentTypeJson = L"content-type:application/json"; std::function httpCallback = [&](CString response, int err) { LauncherUtils::ResponseError error = LauncherUtils::ResponseError(err); if (error == LauncherUtils::ResponseError::NoError) { Json::Value json; - error = LauncherUtils::ResponseError::ParsingJSON; if (LauncherUtils::parseJSON(response, json)) { + if (json["launcher"].isObject()) { + if (json["launcher"]["windows"].isObject() && json["launcher"]["windows"]["url"].isString()) { + launcherUrlOut = json["launcher"]["windows"]["url"].asCString(); + } + if (json["launcher"]["version"].isInt()) { + std::string version = std::to_string(json["launcher"]["version"].asInt()); + launcherVersionOut = CString(version.c_str()); + } + } int count = json["count"].isInt() ? json["count"].asInt() : 0; if (count > 0 && json["results"].isArray()) { for (int i = 0; i < count; i++) { @@ -374,19 +388,21 @@ void LauncherManager::getMostRecentBuild(CString& urlOut, CString& versionOut) { Json::Value result = json["results"][i]; if (result["latest_version"].isInt()) { std::string version = std::to_string(result["latest_version"].asInt()); - versionOut = CString(version.c_str()); + interfaceVersionOut = CString(version.c_str()); } if (result["installers"].isObject() && result["installers"]["windows"].isObject() && result["installers"]["windows"]["zip_url"].isString()) { - urlOut = result["installers"]["windows"]["zip_url"].asCString(); - error = LauncherUtils::ResponseError::NoError; + interfaceUrlOut = result["installers"]["windows"]["zip_url"].asCString(); } } } } + if (launcherUrlOut.IsEmpty() || launcherVersionOut.IsEmpty() || interfaceUrlOut.IsEmpty() || interfaceVersionOut.IsEmpty()) { + error = LauncherUtils::ResponseError::ParsingJSON; + } } - onMostRecentBuildReceived(response, error); + onMostRecentBuildsReceived(response, error); } }; LauncherUtils::httpCallOnThread(L"HQ Launcher", @@ -395,31 +411,46 @@ void LauncherManager::getMostRecentBuild(CString& urlOut, CString& versionOut) { contentTypeJson, CStringA(), false, httpCallback); } -void LauncherManager::onMostRecentBuildReceived(const CString& response, LauncherUtils::ResponseError error) { +void LauncherManager::onMostRecentBuildsReceived(const CString& response, LauncherUtils::ResponseError error) { if (error == LauncherUtils::ResponseError::NoError) { - addToLog(_T("Latest version: ") + _latestVersion); - CString currentVersion; - if (isApplicationInstalled(currentVersion, _domainURL, _contentURL, _loggedIn) && _loggedIn) { - addToLog(_T("Installed version: ") + currentVersion); - if (_latestVersion.Compare(currentVersion) == 0) { - addToLog(_T("Already running most recent build. Launching interface.exe")); - _shouldLaunch = TRUE; - _shouldShutdown = TRUE; - } else { - addToLog(_T("New build found. Updating")); - _shouldUpdate = TRUE; - } - } else if (_loggedIn) { - addToLog(_T("Interface not found but logged in. Reinstalling")); - _shouldUpdate = TRUE; + addToLog(_T("Latest launcher version: ") + _latestLauncherVersion); + + if (_updateLauncherAllowed && _latestLauncherVersion.Compare(_launcherVersion) != 0) { + CString updatingMsg; + updatingMsg.Format(_T("Updating Launcher from version: %s to version: %s"), _launcherVersion, _latestLauncherVersion); + addToLog(updatingMsg); + _shouldUpdateLauncher = TRUE; + _shouldDownloadLauncher = TRUE; } else { - _shouldInstall = TRUE; + if (_updateLauncherAllowed) { + addToLog(_T("Already running most recent build. Launching interface.exe")); + } else { + addToLog(_T("Updating the launcher was not allowed --noUpdate")); + } + CString currentVersion; + if (isApplicationInstalled(currentVersion, _domainURL, _contentURL, _loggedIn) && _loggedIn) { + addToLog(_T("Installed version: ") + currentVersion); + if (_latestVersion.Compare(currentVersion) == 0) { + addToLog(_T("Already running most recent build. Launching interface.exe")); + _shouldLaunch = TRUE; + _shouldShutdown = TRUE; + } else { + addToLog(_T("New build found. Updating")); + _shouldUpdate = TRUE; + } + } else if (_loggedIn) { + addToLog(_T("Interface not found but logged in. Reinstalling")); + _shouldUpdate = TRUE; + } else { + _shouldInstall = TRUE; + } } _shouldWait = FALSE; + } else { _hasFailed = true; CString msg; - msg.Format(_T("Getting most recent build has failed with error: %d"), error); + msg.Format(_T("Getting most recent builds has failed with error: %d"), error); addToLog(msg); msg.Format(_T("Response: %s"), response); addToLog(msg); @@ -563,9 +594,15 @@ void LauncherManager::onFileDownloaded(ProcessType type) { setFailed(true); } }); + } else if (type == ProcessType::DownloadLauncher) { + _shouldRestartNewLauncher = true; } } +void LauncherManager::restartNewLauncher() { + LauncherUtils::launchApplication(_tempLauncherPath, _T(" --restart")); +} + BOOL LauncherManager::installContent() { std::string contentZipFile = LauncherUtils::cStringToStd(_contentZipPath); @@ -610,18 +647,18 @@ BOOL LauncherManager::downloadFile(ProcessType type, const CString& url, CString } else { if (type == ProcessType::DownloadApplication) { addToLog(_T("Error downloading content.")); + } else if (type == ProcessType::DownloadLauncher) { + addToLog(_T("Error downloading launcher.")); } else { addToLog(_T("Error downloading application.")); } _hasFailed = true; } }; - std::function onProgress = [&](float progress) { + std::function onProgress = [&, type](float progress) { updateProgress(_currentProcess, progress); }; - if (!LauncherUtils::downloadFileOnThread(type, url, outPath, onDownloadFinished, onProgress)) { - success = FALSE; - } + success = LauncherUtils::downloadFileOnThread(type, url, outPath, onDownloadFinished, onProgress); } return success; } @@ -637,6 +674,13 @@ BOOL LauncherManager::downloadApplication() { return downloadFile(ProcessType::DownloadApplication, applicationURL, _applicationZipPath); } +BOOL LauncherManager::downloadNewLauncher() { + _shouldDownloadLauncher = FALSE; + getAndCreatePaths(PathType::Temp_Directory, _tempLauncherPath); + _tempLauncherPath += _T("/") + LAUNCHER_EXE_FILENAME; + return downloadFile(ProcessType::DownloadLauncher, _latestLauncherURL, _tempLauncherPath); +} + void LauncherManager::onCancel() { if (_currentProcess == ProcessType::UnzipApplication) { _latestVersion = _T(""); diff --git a/launchers/win32/LauncherManager.h b/launchers/win32/LauncherManager.h index 6ebebc5fc3..3fd8fdba07 100644 --- a/launchers/win32/LauncherManager.h +++ b/launchers/win32/LauncherManager.h @@ -49,6 +49,7 @@ public: ErrorIOFiles }; enum ProcessType { + DownloadLauncher = 0, DownloadContent, DownloadApplication, UnzipContent, @@ -67,7 +68,8 @@ public: BOOL isApplicationInstalled(CString& version, CString& domain, CString& content, bool& loggedIn); LauncherUtils::ResponseError getAccessTokenForCredentials(const CString& username, const CString& password); - void getMostRecentBuild(CString& urlOut, CString& versionOut); + void getMostRecentBuilds(CString& launcherUrlOut, CString& launcherVersionOut, + CString& interfaceUrlOut, CString& interfaceVersionOut); LauncherUtils::ResponseError readOrganizationJSON(const CString& hash); LauncherUtils::ResponseError readConfigJSON(CString& version, CString& domain, CString& content, bool& loggedIn); @@ -88,9 +90,12 @@ public: BOOL shouldShutDown() const { return _shouldShutdown; } BOOL shouldLaunch() const { return _shouldLaunch; } BOOL needsUpdate() { return _shouldUpdate; } + BOOL needsSelfUpdate() { return _shouldUpdateLauncher; } + BOOL needsSelfDownload() { return _shouldDownloadLauncher; } BOOL needsUninstall() { return _shouldUninstall; } BOOL needsInstall() { return _shouldInstall; } BOOL needsToWait() { return _shouldWait; } + BOOL needsRestartNewLauncher() { return _shouldRestartNewLauncher; } void setDisplayName(const CString& displayName) { _displayName = displayName; } bool isLoggedIn() { return _loggedIn; } bool hasFailed() { return _hasFailed; } @@ -101,19 +106,24 @@ public: BOOL downloadFile(ProcessType type, const CString& url, CString& localPath); BOOL downloadContent(); BOOL downloadApplication(); + BOOL downloadNewLauncher(); BOOL installContent(); BOOL extractApplication(); + void restartNewLauncher(); void onZipExtracted(ProcessType type, int size); void onFileDownloaded(ProcessType type); float getProgress() { return _progress; } void updateProgress(ProcessType processType, float progress); void onCancel(); + const CString& getLauncherVersion() const { return _launcherVersion; } private: ProcessType _currentProcess { ProcessType::DownloadApplication }; - void onMostRecentBuildReceived(const CString& response, LauncherUtils::ResponseError error); + void onMostRecentBuildsReceived(const CString& response, LauncherUtils::ResponseError error); CString _latestApplicationURL; CString _latestVersion; + CString _latestLauncherURL; + CString _latestLauncherVersion; CString _contentURL; CString _domainURL; CString _version; @@ -121,6 +131,8 @@ private: CString _tokensJSON; CString _applicationZipPath; CString _contentZipPath; + CString _launcherVersion; + CString _tempLauncherPath; bool _loggedIn { false }; bool _hasFailed { false }; BOOL _shouldUpdate { FALSE }; @@ -129,6 +141,10 @@ private: BOOL _shouldShutdown { FALSE }; BOOL _shouldLaunch { FALSE }; BOOL _shouldWait { TRUE }; + BOOL _shouldUpdateLauncher { FALSE }; + BOOL _shouldDownloadLauncher{ FALSE }; + BOOL _updateLauncherAllowed { TRUE }; + BOOL _shouldRestartNewLauncher { FALSE }; float _progress { 0.0f }; CStdioFile _logFile; }; diff --git a/launchers/win32/cmake/macros/SetPackagingParameters.cmake b/launchers/win32/cmake/macros/SetPackagingParameters.cmake new file mode 100644 index 0000000000..ed24b3bd6b --- /dev/null +++ b/launchers/win32/cmake/macros/SetPackagingParameters.cmake @@ -0,0 +1,45 @@ +# +# SetPackagingParameters.cmake +# cmake/macros +# +# Created by Leonardo Murillo on 07/14/2015. +# Copyright 2015 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 + +# This macro checks some Jenkins defined environment variables to determine the origin of this build +# and decides how targets should be packaged. + +macro(SET_PACKAGING_PARAMETERS) + set(PR_BUILD 0) + set(PRODUCTION_BUILD 0) + set(DEV_BUILD 0) + set(BUILD_NUMBER 0) + + set_from_env(RELEASE_TYPE RELEASE_TYPE "DEV") + set_from_env(RELEASE_NUMBER RELEASE_NUMBER "") + set_from_env(STABLE_BUILD STABLE_BUILD 0) + + message(STATUS "The RELEASE_TYPE variable is: ${RELEASE_TYPE}") + set(BUILD_NUMBER ${RELEASE_NUMBER}) + + if (RELEASE_TYPE STREQUAL "PRODUCTION") + set(PRODUCTION_BUILD 1) + set(BUILD_VERSION ${RELEASE_NUMBER}) + + # add definition for this release type + add_definitions(-DPRODUCTION_BUILD) + + elseif (RELEASE_TYPE STREQUAL "PR") + set(PR_BUILD 1) + set(BUILD_VERSION "PR${RELEASE_NUMBER}") + + # add definition for this release type + add_definitions(-DPR_BUILD) + else () + set(DEV_BUILD 1) + set(BUILD_VERSION "dev") + endif () + +endmacro(SET_PACKAGING_PARAMETERS) diff --git a/launchers/win32/resource.h b/launchers/win32/resource.h index 74c62b75cb..ffe1b1431b 100644 --- a/launchers/win32/resource.h +++ b/launchers/win32/resource.h @@ -27,6 +27,7 @@ #define IDC_TROUBLE 1023 #define IDC_VOXEL 1024 #define IDC_PROGRESS 1025 +#define IDC_VERSION 1026 #define IDC_TROUBLE_LINK 1027 // Next default values for new objects From 13952bf27e72c3a76d576b3424b659a77c688c29 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 25 Jul 2019 10:51:18 -0700 Subject: [PATCH 13/17] Fixes and seamless self update --- launchers/win32/Launcher.rc | 2 +- launchers/win32/LauncherApp.cpp | 27 ++++++++++----- launchers/win32/LauncherDlg.cpp | 22 +++++++++--- launchers/win32/LauncherManager.cpp | 53 ++++++++++++++++++++--------- launchers/win32/LauncherManager.h | 8 ++++- 5 files changed, 80 insertions(+), 32 deletions(-) diff --git a/launchers/win32/Launcher.rc b/launchers/win32/Launcher.rc index b3225d5a4a..80d5f74404 100644 --- a/launchers/win32/Launcher.rc +++ b/launchers/win32/Launcher.rc @@ -107,7 +107,7 @@ BEGIN RTEXT "",IDC_TERMS,15,172,180,15,NOT WS_VISIBLE CONTROL "",IDC_TERMS_LINK,"Button",BS_OWNERDRAW | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,197,172,80,15 CTEXT "",IDC_TROUBLE,65,203,174,15,NOT WS_VISIBLE - RTEXT "THIS IS THE VERSION",IDC_VERSION,0,205,305,10 + RTEXT "",IDC_VERSION,100,205,205,10 CONTROL "NEXT",IDC_BUTTON_NEXT,"Button",BS_OWNERDRAW | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,107,158,94,16 CONTROL "Having Trouble?",IDC_TROUBLE_LINK,"Button",BS_OWNERDRAW | BS_FLAT | NOT WS_VISIBLE | WS_TABSTOP,126,203,56,11 END diff --git a/launchers/win32/LauncherApp.cpp b/launchers/win32/LauncherApp.cpp index c15ba75a9b..5aae2f312b 100644 --- a/launchers/win32/LauncherApp.cpp +++ b/launchers/win32/LauncherApp.cpp @@ -39,16 +39,25 @@ BOOL CLauncherApp::InitInstance() { } int iNumOfArgs; LPWSTR* pArgs = CommandLineToArgvW(GetCommandLine(), &iNumOfArgs); - bool isUninstalling = false; - bool isRestarting = false; + bool uninstalling = false; + bool restarting = false; + bool noUpdate = false; + bool continueUpdating = false; if (iNumOfArgs > 1) { - if (CString(pArgs[1]).Compare(_T("--uninstall")) == 0) { - isUninstalling = true; - } else if (CString(pArgs[1]).Compare(_T("--restart")) == 0) { - isRestarting = true; + for (int i = 1; i < iNumOfArgs; i++) { + CString curArg = CString(pArgs[i]); + if (curArg.Compare(_T("--uninstall")) == 0) { + uninstalling = true; + } else if (curArg.Compare(_T("--restart")) == 0) { + restarting = true; + } else if (curArg.Compare(_T("--noUpdate")) == 0) { + noUpdate = true; + } else if (curArg.Compare(_T("--continueUpdating")) == 0) { + continueUpdating = true; + } } } - if (!isRestarting) { + if (!restarting) { // don't launch if already running CreateMutex(NULL, TRUE, _T("HQ_Launcher_Mutex")); if (GetLastError() == ERROR_ALREADY_EXISTS) { @@ -56,10 +65,10 @@ BOOL CLauncherApp::InitInstance() { } } - if (isUninstalling) { + if (uninstalling) { _manager.uninstall(); } else { - _manager.init(); + _manager.init(!noUpdate, continueUpdating); } if (!_manager.hasFailed() && !_manager.installLauncher()) { return FALSE; diff --git a/launchers/win32/LauncherDlg.cpp b/launchers/win32/LauncherDlg.cpp index a2128b4389..fb64555a69 100644 --- a/launchers/win32/LauncherDlg.cpp +++ b/launchers/win32/LauncherDlg.cpp @@ -677,7 +677,12 @@ void CLauncherDlg::OnTimer(UINT_PTR nIDEvent) { theApp._manager.downloadNewLauncher(); } else { if (_splashStep > SPLASH_DURATION && _splashStep < 2 * SPLASH_DURATION) { - theApp._manager.updateProgress(LauncherManager::ProcessType::Uninstall, (float)(_splashStep - SPLASH_DURATION) / SPLASH_DURATION); + float progress = (float)(_splashStep - SPLASH_DURATION) / SPLASH_DURATION; + if (theApp._manager.willContinueUpdating()) { + progress = CONTINUE_UPDATING_GLOBAL_OFFSET * progress; + progress = min(progress, CONTINUE_UPDATING_GLOBAL_OFFSET); + } + theApp._manager.updateProgress(LauncherManager::ProcessType::Uninstall, progress); _splashStep++; } if (theApp._manager.needsRestartNewLauncher()) { @@ -688,17 +693,21 @@ void CLauncherDlg::OnTimer(UINT_PTR nIDEvent) { } } } - + BOOL needsToWait = theApp._manager.needsToWait(); if (_showSplash) { if (_splashStep == 0) { if (theApp._manager.needsUninstall()) { theApp._manager.addToLog(_T("Waiting to uninstall")); setDrawDialog(DrawStep::DrawProcessUninstall); + } else if (theApp._manager.shouldContinueUpdating()) { + _splashStep = SPLASH_DURATION; + setDrawDialog(DrawStep::DrawProcessUpdate); + theApp._manager.updateProgress(LauncherManager::ProcessType::Uninstall, 0.0f); } else { theApp._manager.addToLog(_T("Start splash screen")); setDrawDialog(DrawStep::DrawLogo); } - } else if (_splashStep > SPLASH_DURATION && !theApp._manager.needsToWait()) { + } else if (_splashStep > SPLASH_DURATION && !needsToWait) { _showSplash = false; if (theApp._manager.shouldShutDown()) { if (_applicationWND != NULL) { @@ -769,12 +778,17 @@ void CLauncherDlg::setDrawDialog(DrawStep step, BOOL isUpdate) { auto m_voxelRenderTarget = m_voxel->GetRenderTarget(); auto m_progressRenderTarget = m_progress->GetRenderTarget(); switch (_drawStep) { - case DrawStep::DrawLogo: + case DrawStep::DrawLogo: { m_pRenderTarget->BeginDraw(); drawBackground(m_pRenderTarget); drawLogo(m_pRenderTarget); m_pRenderTarget->EndDraw(); + CRect redrawRec; + GetClientRect(redrawRec); + redrawRec.top = redrawRec.bottom - 30; + RedrawWindow(redrawRec); break; + } case DrawStep::DrawLoginLogin: case DrawStep::DrawLoginErrorOrg: case DrawStep::DrawLoginErrorCred: diff --git a/launchers/win32/LauncherManager.cpp b/launchers/win32/LauncherManager.cpp index d584e56ad1..a431672f2e 100644 --- a/launchers/win32/LauncherManager.cpp +++ b/launchers/win32/LauncherManager.cpp @@ -21,9 +21,14 @@ LauncherManager::LauncherManager() { LauncherManager::~LauncherManager() { } -void LauncherManager::init() { +void LauncherManager::init(BOOL allowUpdate, BOOL continueUpdating) { initLog(); int tokenPos = 0; + _updateLauncherAllowed = allowUpdate; + _continueUpdating = continueUpdating; + if (_continueUpdating) { + _progressOffset = CONTINUE_UPDATING_GLOBAL_OFFSET; + } _launcherVersion = CString(LAUNCHER_BUILD_VERSION).Tokenize(_T("-"), tokenPos); addToLog(_T("Launcher is running version: " + _launcherVersion)); addToLog(_T("Getting most recent builds")); @@ -158,6 +163,7 @@ void LauncherManager::updateProgress(ProcessType processType, float progress) { default: break; } + _progress = _progressOffset + (1.0f - _progressOffset) * _progress; TRACE("progress = %f\n", _progress); } @@ -205,11 +211,11 @@ BOOL LauncherManager::isApplicationInstalled(CString& version, CString& domain, CString applicationDir; getAndCreatePaths(PathType::Launcher_Directory, applicationDir); CString applicationPath = applicationDir + "interface\\interface.exe"; - BOOL isApplicationInstalled = PathFileExistsW(applicationPath); + BOOL isInstalled = PathFileExistsW(applicationPath); BOOL configFileExist = PathFileExistsW(applicationDir + _T("interface\\config.json")); if (configFileExist) { LauncherUtils::ResponseError status = readConfigJSON(version, domain, content, loggedIn); - return isApplicationInstalled && status == LauncherUtils::ResponseError::NoError; + return isInstalled && status == LauncherUtils::ResponseError::NoError; } return FALSE; } @@ -414,23 +420,26 @@ void LauncherManager::getMostRecentBuilds(CString& launcherUrlOut, CString& laun void LauncherManager::onMostRecentBuildsReceived(const CString& response, LauncherUtils::ResponseError error) { if (error == LauncherUtils::ResponseError::NoError) { addToLog(_T("Latest launcher version: ") + _latestLauncherVersion); - - if (_updateLauncherAllowed && _latestLauncherVersion.Compare(_launcherVersion) != 0) { + CString currentVersion; + BOOL isInstalled = (isApplicationInstalled(currentVersion, _domainURL, _contentURL, _loggedIn) && _loggedIn); + bool newInterfaceVersion = _latestVersion.Compare(currentVersion) != 0; + bool newLauncherVersion = _latestLauncherVersion.Compare(_launcherVersion) != 0 && _updateLauncherAllowed; + if (newLauncherVersion) { CString updatingMsg; updatingMsg.Format(_T("Updating Launcher from version: %s to version: %s"), _launcherVersion, _latestLauncherVersion); addToLog(updatingMsg); _shouldUpdateLauncher = TRUE; _shouldDownloadLauncher = TRUE; + _willContinueUpdating = isInstalled && newInterfaceVersion; } else { if (_updateLauncherAllowed) { addToLog(_T("Already running most recent build. Launching interface.exe")); } else { addToLog(_T("Updating the launcher was not allowed --noUpdate")); } - CString currentVersion; - if (isApplicationInstalled(currentVersion, _domainURL, _contentURL, _loggedIn) && _loggedIn) { + if (isInstalled) { addToLog(_T("Installed version: ") + currentVersion); - if (_latestVersion.Compare(currentVersion) == 0) { + if (!newInterfaceVersion) { addToLog(_T("Already running most recent build. Launching interface.exe")); _shouldLaunch = TRUE; _shouldShutdown = TRUE; @@ -552,7 +561,7 @@ BOOL LauncherManager::extractApplication() { } }; std::function onProgress = [&](float progress) { - updateProgress(ProcessType::UnzipApplication, progress); + updateProgress(ProcessType::UnzipApplication, max(progress, 0.0f)); }; _currentProcess = ProcessType::UnzipApplication; BOOL success = LauncherUtils::unzipFileOnThread(ProcessType::UnzipApplication, @@ -600,7 +609,13 @@ void LauncherManager::onFileDownloaded(ProcessType type) { } void LauncherManager::restartNewLauncher() { - LauncherUtils::launchApplication(_tempLauncherPath, _T(" --restart")); + closeLog(); + if (_willContinueUpdating) { + LauncherUtils::launchApplication(_tempLauncherPath, _T(" --restart --noUpdate --continueUpdating")); + } else { + LauncherUtils::launchApplication(_tempLauncherPath, _T(" --restart --noUpdate")); + } + Sleep(500); } @@ -619,7 +634,7 @@ BOOL LauncherManager::installContent() { } }; std::function onProgress = [&](float progress) { - updateProgress(ProcessType::UnzipContent, progress); + updateProgress(ProcessType::UnzipContent, max(progress, 0.0f)); }; _currentProcess = ProcessType::UnzipContent; BOOL success = LauncherUtils::unzipFileOnThread(ProcessType::UnzipContent, contentZipFile, @@ -634,10 +649,13 @@ BOOL LauncherManager::installContent() { BOOL LauncherManager::downloadFile(ProcessType type, const CString& url, CString& outPath) { - CString fileName = url.Mid(url.ReverseFind('/') + 1); - CString downloadDirectory; - BOOL success = getAndCreatePaths(LauncherManager::PathType::Download_Directory, downloadDirectory); - outPath = downloadDirectory + fileName; + BOOL success = TRUE; + if (outPath.IsEmpty()) { + CString fileName = url.Mid(url.ReverseFind('/') + 1); + CString downloadDirectory; + BOOL success = getAndCreatePaths(LauncherManager::PathType::Download_Directory, downloadDirectory); + outPath = downloadDirectory + fileName; + } _currentProcess = type; if (success) { addToLog(_T("Downloading: ") + url); @@ -656,7 +674,7 @@ BOOL LauncherManager::downloadFile(ProcessType type, const CString& url, CString } }; std::function onProgress = [&, type](float progress) { - updateProgress(_currentProcess, progress); + updateProgress(_currentProcess, max(progress, 0.0f)); }; success = LauncherUtils::downloadFileOnThread(type, url, outPath, onDownloadFinished, onProgress); } @@ -677,7 +695,8 @@ BOOL LauncherManager::downloadApplication() { BOOL LauncherManager::downloadNewLauncher() { _shouldDownloadLauncher = FALSE; getAndCreatePaths(PathType::Temp_Directory, _tempLauncherPath); - _tempLauncherPath += _T("/") + LAUNCHER_EXE_FILENAME; + CString tempName = _T("HQLauncher") + _launcherVersion + _T(".exe"); + _tempLauncherPath += tempName; return downloadFile(ProcessType::DownloadLauncher, _latestLauncherURL, _tempLauncherPath); } diff --git a/launchers/win32/LauncherManager.h b/launchers/win32/LauncherManager.h index 3fd8fdba07..29dd05b4e0 100644 --- a/launchers/win32/LauncherManager.h +++ b/launchers/win32/LauncherManager.h @@ -25,6 +25,7 @@ const float DOWNLOAD_APPLICATION_INSTALL_WEIGHT = 0.5f; const float EXTRACT_APPLICATION_INSTALL_WEIGHT = 0.2f; const float DOWNLOAD_APPLICATION_UPDATE_WEIGHT = 0.75f; const float EXTRACT_APPLICATION_UPDATE_WEIGHT = 0.25f; +const float CONTINUE_UPDATING_GLOBAL_OFFSET = 0.2f; class LauncherManager { @@ -58,7 +59,7 @@ public: }; LauncherManager(); ~LauncherManager(); - void init(); + void init(BOOL allowUpdate, BOOL continueUpdating); BOOL initLog(); BOOL addToLog(const CString& line); void closeLog(); @@ -96,6 +97,8 @@ public: BOOL needsInstall() { return _shouldInstall; } BOOL needsToWait() { return _shouldWait; } BOOL needsRestartNewLauncher() { return _shouldRestartNewLauncher; } + BOOL shouldContinueUpdating() { return _continueUpdating; } + BOOL willContinueUpdating() { return _willContinueUpdating; } void setDisplayName(const CString& displayName) { _displayName = displayName; } bool isLoggedIn() { return _loggedIn; } bool hasFailed() { return _hasFailed; } @@ -145,6 +148,9 @@ private: BOOL _shouldDownloadLauncher{ FALSE }; BOOL _updateLauncherAllowed { TRUE }; BOOL _shouldRestartNewLauncher { FALSE }; + BOOL _continueUpdating{ FALSE }; + BOOL _willContinueUpdating{ FALSE }; + float _progressOffset { 0.0f }; float _progress { 0.0f }; CStdioFile _logFile; }; From c3ad65f62890b499e1e0e0ae378bae1d6957f996 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 25 Jul 2019 11:22:20 -0700 Subject: [PATCH 14/17] add --skipSplash param --- launchers/win32/LauncherApp.cpp | 5 ++++- launchers/win32/LauncherDlg.cpp | 11 ++++++---- launchers/win32/LauncherManager.cpp | 6 +++-- launchers/win32/LauncherManager.h | 34 +++++++++++++++-------------- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/launchers/win32/LauncherApp.cpp b/launchers/win32/LauncherApp.cpp index 5aae2f312b..841a0bee3b 100644 --- a/launchers/win32/LauncherApp.cpp +++ b/launchers/win32/LauncherApp.cpp @@ -43,6 +43,7 @@ BOOL CLauncherApp::InitInstance() { bool restarting = false; bool noUpdate = false; bool continueUpdating = false; + bool skipSplash = false; if (iNumOfArgs > 1) { for (int i = 1; i < iNumOfArgs; i++) { CString curArg = CString(pArgs[i]); @@ -54,6 +55,8 @@ BOOL CLauncherApp::InitInstance() { noUpdate = true; } else if (curArg.Compare(_T("--continueUpdating")) == 0) { continueUpdating = true; + } else if (curArg.Compare(_T("--skipSplash")) == 0) { + skipSplash = true; } } } @@ -68,7 +71,7 @@ BOOL CLauncherApp::InitInstance() { if (uninstalling) { _manager.uninstall(); } else { - _manager.init(!noUpdate, continueUpdating); + _manager.init(!noUpdate, continueUpdating, skipSplash); } if (!_manager.hasFailed() && !_manager.installLauncher()) { return FALSE; diff --git a/launchers/win32/LauncherDlg.cpp b/launchers/win32/LauncherDlg.cpp index fb64555a69..d7d214842d 100644 --- a/launchers/win32/LauncherDlg.cpp +++ b/launchers/win32/LauncherDlg.cpp @@ -693,7 +693,6 @@ void CLauncherDlg::OnTimer(UINT_PTR nIDEvent) { } } } - BOOL needsToWait = theApp._manager.needsToWait(); if (_showSplash) { if (_splashStep == 0) { if (theApp._manager.needsUninstall()) { @@ -704,10 +703,14 @@ void CLauncherDlg::OnTimer(UINT_PTR nIDEvent) { setDrawDialog(DrawStep::DrawProcessUpdate); theApp._manager.updateProgress(LauncherManager::ProcessType::Uninstall, 0.0f); } else { - theApp._manager.addToLog(_T("Start splash screen")); - setDrawDialog(DrawStep::DrawLogo); + if (theApp._manager.shouldSkipSplashScreen()) { + _splashStep = SPLASH_DURATION; + } else { + theApp._manager.addToLog(_T("Start splash screen")); + setDrawDialog(DrawStep::DrawLogo); + } } - } else if (_splashStep > SPLASH_DURATION && !needsToWait) { + } else if (_splashStep > SPLASH_DURATION && !theApp._manager.needsToWait()) { _showSplash = false; if (theApp._manager.shouldShutDown()) { if (_applicationWND != NULL) { diff --git a/launchers/win32/LauncherManager.cpp b/launchers/win32/LauncherManager.cpp index a431672f2e..26ad95f7d2 100644 --- a/launchers/win32/LauncherManager.cpp +++ b/launchers/win32/LauncherManager.cpp @@ -21,11 +21,13 @@ LauncherManager::LauncherManager() { LauncherManager::~LauncherManager() { } -void LauncherManager::init(BOOL allowUpdate, BOOL continueUpdating) { +void LauncherManager::init(BOOL allowUpdate, BOOL continueUpdating, BOOL skipSplashScreen) { initLog(); int tokenPos = 0; _updateLauncherAllowed = allowUpdate; _continueUpdating = continueUpdating; + _skipSplashScreen = skipSplashScreen; + _shouldWait = !skipSplashScreen; if (_continueUpdating) { _progressOffset = CONTINUE_UPDATING_GLOBAL_OFFSET; } @@ -613,7 +615,7 @@ void LauncherManager::restartNewLauncher() { if (_willContinueUpdating) { LauncherUtils::launchApplication(_tempLauncherPath, _T(" --restart --noUpdate --continueUpdating")); } else { - LauncherUtils::launchApplication(_tempLauncherPath, _T(" --restart --noUpdate")); + LauncherUtils::launchApplication(_tempLauncherPath, _T(" --restart --noUpdate --skipSplash")); } Sleep(500); } diff --git a/launchers/win32/LauncherManager.h b/launchers/win32/LauncherManager.h index 29dd05b4e0..108327469d 100644 --- a/launchers/win32/LauncherManager.h +++ b/launchers/win32/LauncherManager.h @@ -59,7 +59,7 @@ public: }; LauncherManager(); ~LauncherManager(); - void init(BOOL allowUpdate, BOOL continueUpdating); + void init(BOOL allowUpdate, BOOL continueUpdating, BOOL skipSplashScreen); BOOL initLog(); BOOL addToLog(const CString& line); void closeLog(); @@ -90,18 +90,19 @@ public: const CString& getVersion() const { return _version; } BOOL shouldShutDown() const { return _shouldShutdown; } BOOL shouldLaunch() const { return _shouldLaunch; } - BOOL needsUpdate() { return _shouldUpdate; } - BOOL needsSelfUpdate() { return _shouldUpdateLauncher; } - BOOL needsSelfDownload() { return _shouldDownloadLauncher; } - BOOL needsUninstall() { return _shouldUninstall; } - BOOL needsInstall() { return _shouldInstall; } - BOOL needsToWait() { return _shouldWait; } - BOOL needsRestartNewLauncher() { return _shouldRestartNewLauncher; } - BOOL shouldContinueUpdating() { return _continueUpdating; } - BOOL willContinueUpdating() { return _willContinueUpdating; } + BOOL shouldSkipSplashScreen() const { return _skipSplashScreen; } + BOOL needsUpdate() const { return _shouldUpdate; } + BOOL needsSelfUpdate() const { return _shouldUpdateLauncher; } + BOOL needsSelfDownload() const { return _shouldDownloadLauncher; } + BOOL needsUninstall() const { return _shouldUninstall; } + BOOL needsInstall() const { return _shouldInstall; } + BOOL needsToWait() const { return _shouldWait; } + BOOL needsRestartNewLauncher() const { return _shouldRestartNewLauncher; } + BOOL shouldContinueUpdating() const { return _continueUpdating; } + BOOL willContinueUpdating() const { return _willContinueUpdating; } void setDisplayName(const CString& displayName) { _displayName = displayName; } - bool isLoggedIn() { return _loggedIn; } - bool hasFailed() { return _hasFailed; } + bool isLoggedIn() const { return _loggedIn; } + bool hasFailed() const { return _hasFailed; } void setFailed(bool hasFailed) { _hasFailed = hasFailed; } const CString& getLatestInterfaceURL() const { return _latestApplicationURL; } void uninstall() { _shouldUninstall = true; _shouldWait = false; }; @@ -115,7 +116,7 @@ public: void restartNewLauncher(); void onZipExtracted(ProcessType type, int size); void onFileDownloaded(ProcessType type); - float getProgress() { return _progress; } + float getProgress() const { return _progress; } void updateProgress(ProcessType processType, float progress); void onCancel(); const CString& getLauncherVersion() const { return _launcherVersion; } @@ -145,11 +146,12 @@ private: BOOL _shouldLaunch { FALSE }; BOOL _shouldWait { TRUE }; BOOL _shouldUpdateLauncher { FALSE }; - BOOL _shouldDownloadLauncher{ FALSE }; + BOOL _shouldDownloadLauncher { FALSE }; BOOL _updateLauncherAllowed { TRUE }; BOOL _shouldRestartNewLauncher { FALSE }; - BOOL _continueUpdating{ FALSE }; - BOOL _willContinueUpdating{ FALSE }; + BOOL _continueUpdating { FALSE }; + BOOL _willContinueUpdating { FALSE }; + BOOL _skipSplashScreen { FALSE }; float _progressOffset { 0.0f }; float _progress { 0.0f }; CStdioFile _logFile; From 6e33f3f23a23513e5e6a38ae0b00bc121a95bbfa Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 25 Jul 2019 11:49:28 -0700 Subject: [PATCH 15/17] BUGZ-969: Remove some audio-related code that hasn't worked in a while --- .../resources/html/createGlobalEventBridge.js | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/interface/resources/html/createGlobalEventBridge.js b/interface/resources/html/createGlobalEventBridge.js index a180fbc6cc..11616c051a 100644 --- a/interface/resources/html/createGlobalEventBridge.js +++ b/interface/resources/html/createGlobalEventBridge.js @@ -33,33 +33,6 @@ var EventBridge; // replace the TempEventBridge with the real one. var tempEventBridge = EventBridge; EventBridge = channel.objects.eventBridge; - EventBridge.audioOutputDeviceChanged.connect(function(deviceName) { - navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(function(mediaStream) { - navigator.mediaDevices.enumerateDevices().then(function(devices) { - devices.forEach(function(device) { - if (device.kind == "audiooutput") { - if (device.label == deviceName){ - console.log("Changing HTML audio output to device " + device.label); - var deviceId = device.deviceId; - var videos = document.getElementsByTagName("video"); - for (var i = 0; i < videos.length; i++){ - videos[i].setSinkId(deviceId); - } - var audios = document.getElementsByTagName("audio"); - for (var i = 0; i < audios.length; i++){ - audios[i].setSinkId(deviceId); - } - } - } - }); - - }).catch(function(err) { - console.log("Error getting media devices"+ err.name + ": " + err.message); - }); - }).catch(function(err) { - console.log("Error getting user media"+ err.name + ": " + err.message); - }); - }); // To be able to update the state of the output device selection for every element added to the DOM // we need to listen to events that might precede the addition of this elements. From 9872c1c2f709785ef2461d6656fd8330375da640 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 25 Jul 2019 13:55:44 -0700 Subject: [PATCH 16/17] Add missing emit inside of --- interface/src/ui/InteractiveWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/ui/InteractiveWindow.cpp b/interface/src/ui/InteractiveWindow.cpp index d432fc0793..4359995448 100644 --- a/interface/src/ui/InteractiveWindow.cpp +++ b/interface/src/ui/InteractiveWindow.cpp @@ -301,6 +301,7 @@ void InteractiveWindow::emitScriptEvent(const QVariant& scriptMessage) { } void InteractiveWindow::emitWebEvent(const QVariant& webMessage) { + emit webEventReceived(webMessage); } void InteractiveWindow::close() { From 58dea69ecf0f2276cbc7124217ad5965f58e0888 Mon Sep 17 00:00:00 2001 From: dante ruiz Date: Thu, 25 Jul 2019 15:41:34 -0700 Subject: [PATCH 17/17] create zip file for launcher --- tools/ci-scripts/postbuild.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/tools/ci-scripts/postbuild.py b/tools/ci-scripts/postbuild.py index 00b3007104..b93ed5a664 100644 --- a/tools/ci-scripts/postbuild.py +++ b/tools/ci-scripts/postbuild.py @@ -148,9 +148,30 @@ def signBuild(executablePath): ]) +def zipDarwinLauncher(): + launcherSourcePath = os.path.join(SOURCE_PATH, 'launchers', sys.platform) + launcherBuildPath = os.path.join(BUILD_PATH, 'launcher') + + archiveName = computeArchiveName('HQ Launcher') + + cpackCommand = [ + 'cpack', + '-G', 'ZIP', + '-D', "CPACK_PACKAGE_FILE_NAME={}".format(archiveName), + '-D', "CPACK_INCLUDE_TOPLEVEL_DIRECTORY=OFF" + ] + print("Create ZIP version of installer archive") + print(cpackCommand) + hifi_utils.executeSubprocess(cpackCommand, folder=launcherBuildPath) + launcherZipDestFile = os.path.join(BUILD_PATH, "{}.zip".format(archiveName)) + launcherZipSourceFile = os.path.join(launcherBuildPath, "{}.zip".format(archiveName)) + print("Moving {} to {}".format(launcherZipSourceFile, launcherZipDestFile)) + shutil.move(launcherZipSourceFile, launcherZipDestFile) + + def buildLightLauncher(): launcherSourcePath = os.path.join(SOURCE_PATH, 'launchers', sys.platform) - launcherBuildPath = os.path.join(BUILD_PATH, 'launcher') + launcherBuildPath = os.path.join(BUILD_PATH, 'launcher') if not os.path.exists(launcherBuildPath): os.makedirs(launcherBuildPath) # configure launcher build @@ -169,12 +190,13 @@ def buildLightLauncher(): if sys.platform == 'win32': buildTarget = 'ALL_BUILD' hifi_utils.executeSubprocess([ - 'cmake', + 'cmake', '--build', launcherBuildPath, - '--config', 'Release', + '--config', 'Release', '--target', buildTarget ], folder=launcherBuildPath) if sys.platform == 'darwin': + zipDarwinLauncher() launcherDestFile = os.path.join(BUILD_PATH, "{}.dmg".format(computeArchiveName('Launcher'))) launcherSourceFile = os.path.join(launcherBuildPath, "HQ Launcher.dmg") elif sys.platform == 'win32':