History

Merge branch 'master' into feat/domain-setup

Liv Erickson committed 9 years ago

Commit da700712 parents be860d6 4acccb6184 files · +5287 −1611Browse files

Showing the changes to interface/src/Application.cpp (1 of 184 files). Show all

Unified · Split

interface/src/Application.cpp+172−82
@@ -61,6 +61,7 @@ · 60 unmodified lines
61#include <AssetClient.h>61#include <AssetClient.h>
62#include <AssetUpload.h>62#include <AssetUpload.h>
63#include <AutoUpdater.h>63#include <AutoUpdater.h>
64#include <Midi.h>
64#include <AudioInjectorManager.h>65#include <AudioInjectorManager.h>
65#include <AvatarBookmarks.h>66#include <AvatarBookmarks.h>
66#include <CursorManager.h>67#include <CursorManager.h>
@@ -69,7 +70,7 @@ · 2 unmodified lines
69#include <EntityScriptClient.h>70#include <EntityScriptClient.h>
70#include <EntityScriptServerLogClient.h>71#include <EntityScriptServerLogClient.h>
71#include <EntityScriptingInterface.h>72#include <EntityScriptingInterface.h>
72#include <HoverOverlayInterface.h>73#include "ui/overlays/ContextOverlayInterface.h"
73#include <ErrorDialog.h>74#include <ErrorDialog.h>
74#include <FileScriptingInterface.h>75#include <FileScriptingInterface.h>
75#include <Finally.h>76#include <Finally.h>
@@ -230,6 +231,7 @@ static const QString FBX_EXTENSION = ".fbx"; · 154 unmodified lines
230static const QString OBJ_EXTENSION = ".obj";231static const QString OBJ_EXTENSION = ".obj";
231static const QString AVA_JSON_EXTENSION = ".ava.json";232static const QString AVA_JSON_EXTENSION = ".ava.json";
232static const QString WEB_VIEW_TAG = "noDownload=true";233static const QString WEB_VIEW_TAG = "noDownload=true";
234static const QString ZIP_EXTENSION = ".zip";
233 235
234static const float MIRROR_FULLSCREEN_DISTANCE = 0.389f;236static const float MIRROR_FULLSCREEN_DISTANCE = 0.389f;
235 237
@@ -264,7 +266,8 @@ const QHash<QString, Application::AcceptURLMethod> Application::_acceptedExtensi · 28 unmodified lines
264 { JSON_EXTENSION, &Application::importJSONFromURL },266 { JSON_EXTENSION, &Application::importJSONFromURL },
265 { JS_EXTENSION, &Application::askToLoadScript },267 { JS_EXTENSION, &Application::askToLoadScript },
266 { FST_EXTENSION, &Application::askToSetAvatarUrl },268 { FST_EXTENSION, &Application::askToSetAvatarUrl },
267 { JSON_GZ_EXTENSION, &Application::askToReplaceDomainContent }269 { JSON_GZ_EXTENSION, &Application::askToReplaceDomainContent },
270 { ZIP_EXTENSION, &Application::importFromZIP }
268};271};
269 272
270class DeadlockWatchdogThread : public QThread {273class DeadlockWatchdogThread : public QThread {
@@ -403,6 +406,10 @@ public: · 132 unmodified lines
403 return true;406 return true;
404 }407 }
405 }408 }
409
410 if (message->message == WM_DEVICECHANGE) {
411 Midi::USBchanged(); // re-scan the MIDI bus
412 }
406 }413 }
407 return false;414 return false;
408 }415 }
@@ -573,6 +580,7 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { · 164 unmodified lines
573 DependencyManager::set<SceneScriptingInterface>();580 DependencyManager::set<SceneScriptingInterface>();
574 DependencyManager::set<OffscreenUi>();581 DependencyManager::set<OffscreenUi>();
575 DependencyManager::set<AutoUpdater>();582 DependencyManager::set<AutoUpdater>();
583 DependencyManager::set<Midi>();
576 DependencyManager::set<PathUtils>();584 DependencyManager::set<PathUtils>();
577 DependencyManager::set<InterfaceDynamicFactory>();585 DependencyManager::set<InterfaceDynamicFactory>();
578 DependencyManager::set<AudioInjectorManager>();586 DependencyManager::set<AudioInjectorManager>();
@@ -595,7 +603,7 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { · 16 unmodified lines
595 DependencyManager::set<Snapshot>();603 DependencyManager::set<Snapshot>();
596 DependencyManager::set<CloseEventSender>();604 DependencyManager::set<CloseEventSender>();
597 DependencyManager::set<ResourceManager>();605 DependencyManager::set<ResourceManager>();
598 DependencyManager::set<HoverOverlayInterface>();606 DependencyManager::set<ContextOverlayInterface>();
599 607
600 return previousSessionCrashed;608 return previousSessionCrashed;
601}609}
@@ -624,6 +632,7 @@ const float DEFAULT_DESKTOP_TABLET_SCALE_PERCENT = 75.0f; · 22 unmodified lines
624const bool DEFAULT_DESKTOP_TABLET_BECOMES_TOOLBAR = true;632const bool DEFAULT_DESKTOP_TABLET_BECOMES_TOOLBAR = true;
625const bool DEFAULT_HMD_TABLET_BECOMES_TOOLBAR = false;633const bool DEFAULT_HMD_TABLET_BECOMES_TOOLBAR = false;
626const bool DEFAULT_PREFER_AVATAR_FINGER_OVER_STYLUS = false;634const bool DEFAULT_PREFER_AVATAR_FINGER_OVER_STYLUS = false;
635const QString DEFAULT_CURSOR_NAME = "DEFAULT";
627 636
628Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bool runningMarkerExisted) :637Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bool runningMarkerExisted) :
629 QApplication(argc, argv),638 QApplication(argc, argv),
@@ -643,6 +652,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 13 unmodified lines
643 _hmdTabletBecomesToolbarSetting("hmdTabletBecomesToolbar", DEFAULT_HMD_TABLET_BECOMES_TOOLBAR),652 _hmdTabletBecomesToolbarSetting("hmdTabletBecomesToolbar", DEFAULT_HMD_TABLET_BECOMES_TOOLBAR),
644 _preferAvatarFingerOverStylusSetting("preferAvatarFingerOverStylus", DEFAULT_PREFER_AVATAR_FINGER_OVER_STYLUS),653 _preferAvatarFingerOverStylusSetting("preferAvatarFingerOverStylus", DEFAULT_PREFER_AVATAR_FINGER_OVER_STYLUS),
645 _constrainToolbarPosition("toolbar/constrainToolbarToCenterX", true),654 _constrainToolbarPosition("toolbar/constrainToolbarToCenterX", true),
655 _preferredCursor("preferredCursor", DEFAULT_CURSOR_NAME),
646 _scaleMirror(1.0f),656 _scaleMirror(1.0f),
647 _rotateMirror(0.0f),657 _rotateMirror(0.0f),
648 _raiseMirror(0.0f),658 _raiseMirror(0.0f),
@@ -938,14 +948,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 289 unmodified lines
938 _glWidget->setFocusPolicy(Qt::StrongFocus);948 _glWidget->setFocusPolicy(Qt::StrongFocus);
939 _glWidget->setFocus();949 _glWidget->setFocus();
940 950
941#ifdef Q_OS_MAC951 showCursor(Cursor::Manager::lookupIcon(_preferredCursor.get()));
942 auto cursorTarget = _window; // OSX doesn't seem to provide for hiding the cursor only on the GL widget
943#else
944 // On windows and linux, hiding the top level cursor also means it's invisible when hovering over the
945 // window menu, which is a pain, so only hide it for the GL surface
946 auto cursorTarget = _glWidget;
947#endif
948 cursorTarget->setCursor(Qt::BlankCursor);
949 952
950 // enable mouse tracking; otherwise, we only get drag events953 // enable mouse tracking; otherwise, we only get drag events
951 _glWidget->setMouseTracking(true);954 _glWidget->setMouseTracking(true);
@@ -1329,12 +1332,16 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 377 unmodified lines
1329 // Keyboard focus handling for Web overlays.1332 // Keyboard focus handling for Web overlays.
1330 auto overlays = &(qApp->getOverlays());1333 auto overlays = &(qApp->getOverlays());
1331 1334
1332 connect(overlays, &Overlays::mousePressOnOverlay, [=](OverlayID overlayID, const PointerEvent& event) {1335 connect(overlays, &Overlays::mousePressOnOverlay, [=](const OverlayID& overlayID, const PointerEvent& event) {
1333 setKeyboardFocusEntity(UNKNOWN_ENTITY_ID);1336 auto thisOverlay = std::dynamic_pointer_cast<Web3DOverlay>(overlays->getOverlay(overlayID));
1334 setKeyboardFocusOverlay(overlayID);1337 // Only Web overlays can have keyboard focus.
1338 if (thisOverlay) {
1339 setKeyboardFocusEntity(UNKNOWN_ENTITY_ID);
1340 setKeyboardFocusOverlay(overlayID);
1341 }
1335 });1342 });
1336 1343
1337 connect(overlays, &Overlays::overlayDeleted, [=](OverlayID overlayID) {1344 connect(overlays, &Overlays::overlayDeleted, [=](const OverlayID& overlayID) {
1338 if (overlayID == _keyboardFocusedOverlay.get()) {1345 if (overlayID == _keyboardFocusedOverlay.get()) {
1339 setKeyboardFocusOverlay(UNKNOWN_OVERLAY_ID);1346 setKeyboardFocusOverlay(UNKNOWN_OVERLAY_ID);
1340 }1347 }
@@ -1349,6 +1356,21 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 8 unmodified lines
1349 setKeyboardFocusEntity(UNKNOWN_ENTITY_ID);1356 setKeyboardFocusEntity(UNKNOWN_ENTITY_ID);
1350 });1357 });
1351 1358
1359 connect(overlays,
1360 SIGNAL(mousePressOnOverlay(const OverlayID&, const PointerEvent&)),
1361 DependencyManager::get<ContextOverlayInterface>().data(),
1362 SLOT(contextOverlays_mousePressOnOverlay(const OverlayID&, const PointerEvent&)));
1363
1364 connect(overlays,
1365 SIGNAL(hoverEnterOverlay(const OverlayID&, const PointerEvent&)),
1366 DependencyManager::get<ContextOverlayInterface>().data(),
1367 SLOT(contextOverlays_hoverEnterOverlay(const OverlayID&, const PointerEvent&)));
1368
1369 connect(overlays,
1370 SIGNAL(hoverLeaveOverlay(const OverlayID&, const PointerEvent&)),
1371 DependencyManager::get<ContextOverlayInterface>().data(),
1372 SLOT(contextOverlays_hoverLeaveOverlay(const OverlayID&, const PointerEvent&)));
1373
1352 // Add periodic checks to send user activity data1374 // Add periodic checks to send user activity data
1353 static int CHECK_NEARBY_AVATARS_INTERVAL_MS = 10000;1375 static int CHECK_NEARBY_AVATARS_INTERVAL_MS = 10000;
1354 static int NEARBY_AVATAR_RADIUS_METERS = 10;1376 static int NEARBY_AVATAR_RADIUS_METERS = 10;
@@ -1475,7 +1497,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo · 120 unmodified lines
1475 properties["atp_mapping_requests"] = atpMappingRequests;1497 properties["atp_mapping_requests"] = atpMappingRequests;
1476 1498
1477 properties["throttled"] = _displayPlugin ? _displayPlugin->isThrottled() : false;1499 properties["throttled"] = _displayPlugin ? _displayPlugin->isThrottled() : false;
1478 1500
1479 QJsonObject bytesDownloaded;1501 QJsonObject bytesDownloaded;
1480 bytesDownloaded["atp"] = statTracker->getStat(STAT_ATP_RESOURCE_TOTAL_BYTES).toInt();1502 bytesDownloaded["atp"] = statTracker->getStat(STAT_ATP_RESOURCE_TOTAL_BYTES).toInt();
1481 bytesDownloaded["http"] = statTracker->getStat(STAT_HTTP_RESOURCE_TOTAL_BYTES).toInt();1503 bytesDownloaded["http"] = statTracker->getStat(STAT_HTTP_RESOURCE_TOTAL_BYTES).toInt();
@@ -1743,9 +1765,16 @@ void Application::checkChangeCursor() { · 261 unmodified lines
1743 }1765 }
1744}1766}
1745 1767
1746void Application::showCursor(const QCursor& cursor) {1768void Application::showCursor(const Cursor::Icon& cursor) {
1747 QMutexLocker locker(&_changeCursorLock);1769 QMutexLocker locker(&_changeCursorLock);
1748 _desiredCursor = cursor;1770
1771 auto managedCursor = Cursor::Manager::instance().getCursor();
1772 auto curIcon = managedCursor->getIcon();
1773 if (curIcon != cursor) {
1774 managedCursor->setIcon(cursor);
1775 curIcon = cursor;
1776 }
1777 _desiredCursor = cursor == Cursor::Icon::SYSTEM ? Qt::ArrowCursor : Qt::BlankCursor;
1749 _cursorNeedsChanging = true;1778 _cursorNeedsChanging = true;
1750}1779}
1751 1780
@@ -2120,7 +2149,6 @@ void Application::initializeUi() { · 368 unmodified lines
2120 surfaceContext->setContextProperty("AvatarManager", DependencyManager::get<AvatarManager>().data());2149 surfaceContext->setContextProperty("AvatarManager", DependencyManager::get<AvatarManager>().data());
2121 surfaceContext->setContextProperty("UndoStack", &_undoStackScriptingInterface);2150 surfaceContext->setContextProperty("UndoStack", &_undoStackScriptingInterface);
2122 surfaceContext->setContextProperty("LODManager", DependencyManager::get<LODManager>().data());2151 surfaceContext->setContextProperty("LODManager", DependencyManager::get<LODManager>().data());
2123 surfaceContext->setContextProperty("Paths", DependencyManager::get<PathUtils>().data());
2124 surfaceContext->setContextProperty("HMD", DependencyManager::get<HMDScriptingInterface>().data());2152 surfaceContext->setContextProperty("HMD", DependencyManager::get<HMDScriptingInterface>().data());
2125 surfaceContext->setContextProperty("Scene", DependencyManager::get<SceneScriptingInterface>().data());2153 surfaceContext->setContextProperty("Scene", DependencyManager::get<SceneScriptingInterface>().data());
2126 surfaceContext->setContextProperty("Render", _renderEngine->getConfiguration().get());2154 surfaceContext->setContextProperty("Render", _renderEngine->getConfiguration().get());
@@ -2131,7 +2159,7 @@ void Application::initializeUi() { · 4 unmodified lines
2131 surfaceContext->setContextProperty("ApplicationCompositor", &getApplicationCompositor());2159 surfaceContext->setContextProperty("ApplicationCompositor", &getApplicationCompositor());
2132 2160
2133 surfaceContext->setContextProperty("AvatarInputs", AvatarInputs::getInstance());2161 surfaceContext->setContextProperty("AvatarInputs", AvatarInputs::getInstance());
2134 surfaceContext->setContextProperty("HoverOverlay", DependencyManager::get<HoverOverlayInterface>().data());2162 surfaceContext->setContextProperty("ContextOverlay", DependencyManager::get<ContextOverlayInterface>().data());
2135 2163
2136 if (auto steamClient = PluginManager::getInstance()->getSteamClientPlugin()) {2164 if (auto steamClient = PluginManager::getInstance()->getSteamClientPlugin()) {
2137 surfaceContext->setContextProperty("Steam", new SteamScriptingInterface(engine, steamClient.get()));2165 surfaceContext->setContextProperty("Steam", new SteamScriptingInterface(engine, steamClient.get()));
@@ -2167,9 +2195,11 @@ void Application::initializeUi() { · 29 unmodified lines
2167 _window->setMenuBar(new Menu());2195 _window->setMenuBar(new Menu());
2168 2196
2169 auto compositorHelper = DependencyManager::get<CompositorHelper>();2197 auto compositorHelper = DependencyManager::get<CompositorHelper>();
2170 connect(compositorHelper.data(), &CompositorHelper::allowMouseCaptureChanged, [=] {2198 connect(compositorHelper.data(), &CompositorHelper::allowMouseCaptureChanged, this, [=] {
2171 if (isHMDMode()) {2199 if (isHMDMode()) {
2172 showCursor(compositorHelper->getAllowMouseCapture() ? Qt::BlankCursor : Qt::ArrowCursor);2200 showCursor(compositorHelper->getAllowMouseCapture() ?
2201 Cursor::Manager::lookupIcon(_preferredCursor.get()) :
2202 Cursor::Icon::SYSTEM);
2173 }2203 }
2174 });2204 });
2175 2205
@@ -2235,7 +2265,7 @@ void Application::paintGL() { · 59 unmodified lines
2235 QMutexLocker viewLocker(&_viewMutex);2265 QMutexLocker viewLocker(&_viewMutex);
2236 _viewFrustum.calculate();2266 _viewFrustum.calculate();
2237 }2267 }
2238 renderArgs = RenderArgs(_gpuContext, getEntities(), lodManager->getOctreeSizeScale(),2268 renderArgs = RenderArgs(_gpuContext, lodManager->getOctreeSizeScale(),
2239 lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE,2269 lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE,
2240 RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE);2270 RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE);
2241 {2271 {
@@ -2321,7 +2351,7 @@ void Application::paintGL() { · 79 unmodified lines
2321 }2351 }
2322 } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) {2352 } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) {
2323 if (isHMDMode()) {2353 if (isHMDMode()) {
2324 auto mirrorBodyOrientation = myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f));2354 auto mirrorBodyOrientation = myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f));
2325 2355
2326 glm::quat hmdRotation = extractRotation(myAvatar->getHMDSensorMatrix());2356 glm::quat hmdRotation = extractRotation(myAvatar->getHMDSensorMatrix());
2327 // Mirror HMD yaw and roll2357 // Mirror HMD yaw and roll
@@ -2343,7 +2373,7 @@ void Application::paintGL() { · 15 unmodified lines
2343 + mirrorBodyOrientation * glm::vec3(0.0f, 0.0f, 1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror2373 + mirrorBodyOrientation * glm::vec3(0.0f, 0.0f, 1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror
2344 + mirrorBodyOrientation * hmdOffset);2374 + mirrorBodyOrientation * hmdOffset);
2345 } else {2375 } else {
2346 _myCamera.setOrientation(myAvatar->getWorldAlignedOrientation()2376 _myCamera.setOrientation(myAvatar->getOrientation()
2347 * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)));2377 * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)));
2348 _myCamera.setPosition(myAvatar->getDefaultEyePosition()2378 _myCamera.setPosition(myAvatar->getDefaultEyePosition()
2349 + glm::vec3(0, _raiseMirror * myAvatar->getUniformScale(), 0)2379 + glm::vec3(0, _raiseMirror * myAvatar->getUniformScale(), 0)
@@ -2511,6 +2541,12 @@ void Application::setPreferAvatarFingerOverStylus(bool value) { · 161 unmodified lines
2511 _preferAvatarFingerOverStylusSetting.set(value);2541 _preferAvatarFingerOverStylusSetting.set(value);
2512}2542}
2513 2543
2544void Application::setPreferredCursor(const QString& cursorName) {
2545 qCDebug(interfaceapp) << "setPreferredCursor" << cursorName;
2546 _preferredCursor.set(cursorName.isEmpty() ? DEFAULT_CURSOR_NAME : cursorName);
2547 showCursor(Cursor::Manager::lookupIcon(_preferredCursor.get()));
2548}
2549
2514void Application::setSettingConstrainToolbarPosition(bool setting) {2550void Application::setSettingConstrainToolbarPosition(bool setting) {
2515 _constrainToolbarPosition.set(setting);2551 _constrainToolbarPosition.set(setting);
2516 DependencyManager::get<OffscreenUi>()->setConstrainToolbarToCenterX(setting);2552 DependencyManager::get<OffscreenUi>()->setConstrainToolbarToCenterX(setting);
@@ -2744,6 +2780,20 @@ bool Application::importSVOFromURL(const QString& urlString) { · 227 unmodified lines
2744 return true;2780 return true;
2745}2781}
2746 2782
2783void Application::onPresent(quint32 frameCount) {
2784 if (shouldPaint()) {
2785 postEvent(this, new QEvent(static_cast<QEvent::Type>(Idle)), Qt::HighEventPriority);
2786 postEvent(this, new QEvent(static_cast<QEvent::Type>(Paint)), Qt::HighEventPriority);
2787 }
2788}
2789
2790bool Application::importFromZIP(const QString& filePath) {
2791 qDebug() << "A zip file has been dropped in: " << filePath;
2792 QUrl empty;
2793 qApp->getFileDownloadInterface()->runUnzip(filePath, empty, true, true);
2794 return true;
2795}
2796
2747bool _renderRequested { false };2797bool _renderRequested { false };
2748 2798
2749bool Application::event(QEvent* event) {2799bool Application::event(QEvent* event) {
@@ -2760,23 +2810,9 @@ bool Application::event(QEvent* event) { · 10 unmodified lines
2760 // Explicit idle keeps the idle running at a lower interval, but without any rendering2810 // Explicit idle keeps the idle running at a lower interval, but without any rendering
2761 // see (windowMinimizedChanged)2811 // see (windowMinimizedChanged)
2762 case Event::Idle:2812 case Event::Idle:
2763 {2813 idle();
2764 float nsecsElapsed = (float)_lastTimeUpdated.nsecsElapsed();2814 // Clear the event queue of pending idle calls
2765 _lastTimeUpdated.start();2815 removePostedEvents(this, Idle);
2766 idle(nsecsElapsed);
2767 }
2768 return true;
2769
2770 case Event::Present:
2771 if (!_renderRequested) {
2772 float nsecsElapsed = (float)_lastTimeUpdated.nsecsElapsed();
2773 if (shouldPaint(nsecsElapsed)) {
2774 _renderRequested = true;
2775 _lastTimeUpdated.start();
2776 idle(nsecsElapsed);
2777 postEvent(this, new QEvent(static_cast<QEvent::Type>(Paint)), Qt::HighEventPriority);
2778 }
2779 }
2780 return true;2816 return true;
2781 2817
2782 case Event::Paint:2818 case Event::Paint:
@@ -2784,9 +2820,8 @@ bool Application::event(QEvent* event) { · 1 unmodified line
2784 // or AvatarInputs will mysteriously move to the bottom-right2820 // or AvatarInputs will mysteriously move to the bottom-right
2785 AvatarInputs::getInstance()->update();2821 AvatarInputs::getInstance()->update();
2786 paintGL();2822 paintGL();
2787 // wait for the next present event before starting idle / paint again2823 // Clear the event queue of pending paint calls
2788 removePostedEvents(this, Present);2824 removePostedEvents(this, Paint);
2789 _renderRequested = false;
2790 return true;2825 return true;
2791 2826
2792 default:2827 default:
@@ -3026,7 +3061,9 @@ void Application::keyPressEvent(QKeyEvent* event) { · 233 unmodified lines
3026 break;3061 break;
3027 3062
3028 case Qt::Key_F: {3063 case Qt::Key_F: {
3029 _physicsEngine->dumpNextStats();3064 if (isOption) {
3065 _physicsEngine->dumpNextStats();
3066 }
3030 break;3067 break;
3031 }3068 }
3032 3069
@@ -3070,9 +3107,13 @@ void Application::keyPressEvent(QKeyEvent* event) { · 37 unmodified lines
3070 auto cursor = Cursor::Manager::instance().getCursor();3107 auto cursor = Cursor::Manager::instance().getCursor();
3071 auto curIcon = cursor->getIcon();3108 auto curIcon = cursor->getIcon();
3072 if (curIcon == Cursor::Icon::DEFAULT) {3109 if (curIcon == Cursor::Icon::DEFAULT) {
3073 cursor->setIcon(Cursor::Icon::LINK);3110 showCursor(Cursor::Icon::RETICLE);
3111 } else if (curIcon == Cursor::Icon::RETICLE) {
3112 showCursor(Cursor::Icon::SYSTEM);
3113 } else if (curIcon == Cursor::Icon::SYSTEM) {
3114 showCursor(Cursor::Icon::LINK);
3074 } else {3115 } else {
3075 cursor->setIcon(Cursor::Icon::DEFAULT);3116 showCursor(Cursor::Icon::DEFAULT);
3076 }3117 }
3077 } else {3118 } else {
3078 resetSensors(true);3119 resetSensors(true);
@@ -3599,7 +3640,7 @@ bool Application::acceptSnapshot(const QString& urlString) { · 520 unmodified lines
3599 3640
3600static uint32_t _renderedFrameIndex { INVALID_FRAME };3641static uint32_t _renderedFrameIndex { INVALID_FRAME };
3601 3642
3602bool Application::shouldPaint(float nsecsElapsed) {3643bool Application::shouldPaint() {
3603 if (_aboutToQuit) {3644 if (_aboutToQuit) {
3604 return false;3645 return false;
3605 }3646 }
@@ -3619,11 +3660,9 @@ bool Application::shouldPaint(float nsecsElapsed) { · 13 unmodified lines
3619 (float)paintDelaySamples / paintDelayUsecs << "us";3660 (float)paintDelaySamples / paintDelayUsecs << "us";
3620 }3661 }
3621#endif3662#endif
3622 3663
3623 float msecondsSinceLastUpdate = nsecsElapsed / NSECS_PER_USEC / USECS_PER_MSEC;
3624
3625 // Throttle if requested3664 // Throttle if requested
3626 if (displayPlugin->isThrottled() && (msecondsSinceLastUpdate < THROTTLED_SIM_FRAME_PERIOD_MS)) {3665 if (displayPlugin->isThrottled() && (_lastTimeUpdated.elapsed() < THROTTLED_SIM_FRAME_PERIOD_MS)) {
3627 return false;3666 return false;
3628 }3667 }
3629 3668
@@ -3840,7 +3879,7 @@ void setupCpuMonitorThread() { · 210 unmodified lines
3840#endif3879#endif
3841 3880
3842 3881
3843void Application::idle(float nsecsElapsed) {3882void Application::idle() {
3844 PerformanceTimer perfTimer("idle");3883 PerformanceTimer perfTimer("idle");
3845 3884
3846 // Update the deadlock watchdog3885 // Update the deadlock watchdog
@@ -3897,7 +3936,8 @@ void Application::idle(float nsecsElapsed) { · 50 unmodified lines
3897 steamClient->runCallbacks();3936 steamClient->runCallbacks();
3898 }3937 }
3899 3938
3900 float secondsSinceLastUpdate = nsecsElapsed / NSECS_PER_MSEC / MSECS_PER_SECOND;3939 float secondsSinceLastUpdate = (float)_lastTimeUpdated.nsecsElapsed() / NSECS_PER_MSEC / MSECS_PER_SECOND;
3940 _lastTimeUpdated.start();
3901 3941
3902 // If the offscreen Ui has something active that is NOT the root, then assume it has keyboard focus.3942 // If the offscreen Ui has something active that is NOT the root, then assume it has keyboard focus.
3903 if (_keyboardDeviceHasFocus && offscreenUi && offscreenUi->getWindow()->activeFocusItem() != offscreenUi->getRootItem()) {3943 if (_keyboardDeviceHasFocus && offscreenUi && offscreenUi->getWindow()->activeFocusItem() != offscreenUi->getRootItem()) {
@@ -4131,6 +4171,7 @@ void Application::loadSettings() { · 227 unmodified lines
4131 //DependencyManager::get<LODManager>()->setAutomaticLODAdjust(false);4171 //DependencyManager::get<LODManager>()->setAutomaticLODAdjust(false);
4132 4172
4133 Menu::getInstance()->loadSettings();4173 Menu::getInstance()->loadSettings();
4174
4134 // If there is a preferred plugin, we probably messed it up with the menu settings, so fix it.4175 // If there is a preferred plugin, we probably messed it up with the menu settings, so fix it.
4135 auto pluginManager = PluginManager::getInstance();4176 auto pluginManager = PluginManager::getInstance();
4136 auto plugins = pluginManager->getPreferredDisplayPlugins();4177 auto plugins = pluginManager->getPreferredDisplayPlugins();
@@ -4144,24 +4185,44 @@ void Application::loadSettings() { · 7 unmodified lines
4144 break;4185 break;
4145 }4186 }
4146 }4187 }
4147 } else {4188 }
4189
4190 Setting::Handle<bool> firstRun { Settings::firstRun, true };
4191 bool isFirstPerson = false;
4192 if (firstRun.get()) {
4148 // If this is our first run, and no preferred devices were set, default to4193 // If this is our first run, and no preferred devices were set, default to
4149 // an HMD device if available.4194 // an HMD device if available.
4150 Setting::Handle<bool> firstRun { Settings::firstRun, true };4195 auto displayPlugins = pluginManager->getDisplayPlugins();
4151 if (firstRun.get()) {4196 for (auto& plugin : displayPlugins) {
4152 auto displayPlugins = pluginManager->getDisplayPlugins();4197 if (plugin->isHmd()) {
4153 for (auto& plugin : displayPlugins) {4198 if (auto action = menu->getActionForOption(plugin->getName())) {
4154 if (plugin->isHmd()) {4199 action->setChecked(true);
4155 if (auto action = menu->getActionForOption(plugin->getName())) {4200 action->trigger();
4156 action->setChecked(true);4201 break;
4157 action->trigger();
4158 break;
4159 }
4160 }4202 }
4161 }4203 }
4162 }4204 }
4205
4206 isFirstPerson = (qApp->isHMDMode());
4207 } else {
4208 // if this is not the first run, the camera will be initialized differently depending on user settings
4209
4210 if (qApp->isHMDMode()) {
4211 // if the HMD is active, use first-person camera, unless the appropriate setting is checked
4212 isFirstPerson = menu->isOptionChecked(MenuOption::FirstPersonHMD);
4213 } else {
4214 // if HMD is not active, only use first person if the menu option is checked
4215 isFirstPerson = menu->isOptionChecked(MenuOption::FirstPerson);
4216 }
4163 }4217 }
4164 4218
4219 // finish initializing the camera, based on everything we checked above. Third person camera will be used if no settings
4220 // dictated that we should be in first person
4221 Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, isFirstPerson);
4222 Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, !isFirstPerson);
4223 _myCamera.setMode((isFirstPerson) ? CAMERA_MODE_FIRST_PERSON : CAMERA_MODE_THIRD_PERSON);
4224 cameraMenuChanged();
4225
4165 auto inputs = pluginManager->getInputPlugins();4226 auto inputs = pluginManager->getInputPlugins();
4166 for (auto plugin : inputs) {4227 for (auto plugin : inputs) {
4167 if (!plugin->isActive()) {4228 if (!plugin->isActive()) {
@@ -4210,7 +4271,6 @@ void Application::init() { · 42 unmodified lines
4210 DependencyManager::get<DeferredLightingEffect>()->init();4271 DependencyManager::get<DeferredLightingEffect>()->init();
4211 4272
4212 DependencyManager::get<AvatarManager>()->init();4273 DependencyManager::get<AvatarManager>()->init();
4213 _myCamera.setMode(CAMERA_MODE_FIRST_PERSON);
4214 4274
4215 _timerStart.start();4275 _timerStart.start();
4216 _lastTimeUpdated.start();4276 _lastTimeUpdated.start();
@@ -4466,27 +4526,29 @@ void Application::cameraModeChanged() { · 249 unmodified lines
4466 4526
4467 4527
4468void Application::cameraMenuChanged() {4528void Application::cameraMenuChanged() {
4469 if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) {4529 auto menu = Menu::getInstance();
4530 if (menu->isOptionChecked(MenuOption::FullscreenMirror)) {
4470 if (_myCamera.getMode() != CAMERA_MODE_MIRROR) {4531 if (_myCamera.getMode() != CAMERA_MODE_MIRROR) {
4471 _myCamera.setMode(CAMERA_MODE_MIRROR);4532 _myCamera.setMode(CAMERA_MODE_MIRROR);
4533 getMyAvatar()->reset(false, false, false); // to reset any active MyAvatar::FollowHelpers
4472 }4534 }
4473 } else if (Menu::getInstance()->isOptionChecked(MenuOption::FirstPerson)) {4535 } else if (menu->isOptionChecked(MenuOption::FirstPerson)) {
4474 if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON) {4536 if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON) {
4475 _myCamera.setMode(CAMERA_MODE_FIRST_PERSON);4537 _myCamera.setMode(CAMERA_MODE_FIRST_PERSON);
4476 getMyAvatar()->setBoomLength(MyAvatar::ZOOM_MIN);4538 getMyAvatar()->setBoomLength(MyAvatar::ZOOM_MIN);
4477 }4539 }
4478 } else if (Menu::getInstance()->isOptionChecked(MenuOption::ThirdPerson)) {4540 } else if (menu->isOptionChecked(MenuOption::ThirdPerson)) {
4479 if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) {4541 if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) {
4480 _myCamera.setMode(CAMERA_MODE_THIRD_PERSON);4542 _myCamera.setMode(CAMERA_MODE_THIRD_PERSON);
4481 if (getMyAvatar()->getBoomLength() == MyAvatar::ZOOM_MIN) {4543 if (getMyAvatar()->getBoomLength() == MyAvatar::ZOOM_MIN) {
4482 getMyAvatar()->setBoomLength(MyAvatar::ZOOM_DEFAULT);4544 getMyAvatar()->setBoomLength(MyAvatar::ZOOM_DEFAULT);
4483 }4545 }
4484 }4546 }
4485 } else if (Menu::getInstance()->isOptionChecked(MenuOption::IndependentMode)) {4547 } else if (menu->isOptionChecked(MenuOption::IndependentMode)) {
4486 if (_myCamera.getMode() != CAMERA_MODE_INDEPENDENT) {4548 if (_myCamera.getMode() != CAMERA_MODE_INDEPENDENT) {
4487 _myCamera.setMode(CAMERA_MODE_INDEPENDENT);4549 _myCamera.setMode(CAMERA_MODE_INDEPENDENT);
4488 }4550 }
4489 } else if (Menu::getInstance()->isOptionChecked(MenuOption::CameraEntityMode)) {4551 } else if (menu->isOptionChecked(MenuOption::CameraEntityMode)) {
4490 if (_myCamera.getMode() != CAMERA_MODE_ENTITY) {4552 if (_myCamera.getMode() != CAMERA_MODE_ENTITY) {
4491 _myCamera.setMode(CAMERA_MODE_ENTITY);4553 _myCamera.setMode(CAMERA_MODE_ENTITY);
4492 }4554 }
@@ -5380,6 +5442,17 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se · 887 unmodified lines
5380 }5442 }
5381 renderArgs->_debugFlags = renderDebugFlags;5443 renderArgs->_debugFlags = renderDebugFlags;
5382 //ViveControllerManager::getInstance().updateRendering(renderArgs, _main3DScene, transaction);5444 //ViveControllerManager::getInstance().updateRendering(renderArgs, _main3DScene, transaction);
5445
5446 RenderArgs::OutlineFlags renderOutlineFlags = RenderArgs::RENDER_OUTLINE_NONE;
5447 auto contextOverlayInterface = DependencyManager::get<ContextOverlayInterface>();
5448 if (contextOverlayInterface->getEnabled()) {
5449 if (DependencyManager::get<ContextOverlayInterface>()->getIsInMarketplaceInspectionMode()) {
5450 renderOutlineFlags = RenderArgs::RENDER_OUTLINE_MARKETPLACE_MODE;
5451 } else {
5452 renderOutlineFlags = RenderArgs::RENDER_OUTLINE_WIREFRAMES;
5453 }
5454 }
5455 renderArgs->_outlineFlags = renderOutlineFlags;
5383 }5456 }
5384 }5457 }
5385 5458
@@ -5844,7 +5917,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri · 458 unmodified lines
5844 auto entityScriptServerLog = DependencyManager::get<EntityScriptServerLogClient>();5917 auto entityScriptServerLog = DependencyManager::get<EntityScriptServerLogClient>();
5845 scriptEngine->registerGlobalObject("EntityScriptServerLog", entityScriptServerLog.data());5918 scriptEngine->registerGlobalObject("EntityScriptServerLog", entityScriptServerLog.data());
5846 scriptEngine->registerGlobalObject("AvatarInputs", AvatarInputs::getInstance());5919 scriptEngine->registerGlobalObject("AvatarInputs", AvatarInputs::getInstance());
5847 scriptEngine->registerGlobalObject("HoverOverlay", DependencyManager::get<HoverOverlayInterface>().data());5920 scriptEngine->registerGlobalObject("ContextOverlay", DependencyManager::get<ContextOverlayInterface>().data());
5848 5921
5849 qScriptRegisterMetaType(scriptEngine, OverlayIDtoScriptValue, OverlayIDfromScriptValue);5922 qScriptRegisterMetaType(scriptEngine, OverlayIDtoScriptValue, OverlayIDfromScriptValue);
5850 5923
@@ -6199,7 +6272,7 @@ void Application::addAssetToWorldFromURLRequestFinished() { · 348 unmodified lines
6199 if (tempFile.open(QIODevice::WriteOnly)) {6272 if (tempFile.open(QIODevice::WriteOnly)) {
6200 tempFile.write(request->getData());6273 tempFile.write(request->getData());
6201 addAssetToWorldInfoClear(filename); // Remove message from list; next one added will have a different key.6274 addAssetToWorldInfoClear(filename); // Remove message from list; next one added will have a different key.
6202 qApp->getFileDownloadInterface()->runUnzip(downloadPath, url, true);6275 qApp->getFileDownloadInterface()->runUnzip(downloadPath, url, true, false);
6203 } else {6276 } else {
6204 QString errorInfo = "Couldn't open temporary file for download";6277 QString errorInfo = "Couldn't open temporary file for download";
6205 qWarning(interfaceapp) << errorInfo;6278 qWarning(interfaceapp) << errorInfo;
@@ -6229,12 +6302,18 @@ void Application::addAssetToWorldUnzipFailure(QString filePath) { · 23 unmodified lines
6229 addAssetToWorldError(filename, "Couldn't unzip file " + filename + ".");6302 addAssetToWorldError(filename, "Couldn't unzip file " + filename + ".");
6230}6303}
6231 6304
6232void Application::addAssetToWorld(QString filePath) {6305void Application::addAssetToWorld(QString filePath, QString zipFile, bool isZip) {
6233 // Automatically upload and add asset to world as an alternative manual process initiated by showAssetServerWidget().6306 // Automatically upload and add asset to world as an alternative manual process initiated by showAssetServerWidget().
6234 6307 QString mapping;
6235 QString path = QUrl(filePath).toLocalFile();6308 QString path = filePath;
6236 QString filename = filenameFromPath(path);6309 QString filename = filenameFromPath(path);
6237 QString mapping = "/" + filename;6310 if (isZip) {
6311 QString assetFolder = zipFile.section("/", -1);
6312 assetFolder.remove(".zip");
6313 mapping = "/" + assetFolder + "/" + filename;
6314 } else {
6315 mapping = "/" + filename;
6316 }
6238 6317
6239 // Test repeated because possibly different code paths.6318 // Test repeated because possibly different code paths.
6240 if (!DependencyManager::get<NodeList>()->getThisNodeCanWriteAssets()) {6319 if (!DependencyManager::get<NodeList>()->getThisNodeCanWriteAssets()) {
@@ -6315,7 +6394,13 @@ void Application::addAssetToWorldSetMapping(QString filePath, QString mapping, Q · 74 unmodified lines
6315 qWarning(interfaceapp) << "Error downloading model: " + errorInfo;6394 qWarning(interfaceapp) << "Error downloading model: " + errorInfo;
6316 addAssetToWorldError(filenameFromPath(filePath), errorInfo);6395 addAssetToWorldError(filenameFromPath(filePath), errorInfo);
6317 } else {6396 } else {
6318 addAssetToWorldAddEntity(filePath, mapping);6397 // to prevent files that aren't models from being loaded into world automatically
6398 if (filePath.endsWith(".obj") || filePath.endsWith(".fbx")) {
6399 addAssetToWorldAddEntity(filePath, mapping);
6400 } else {
6401 qCDebug(interfaceapp) << "Zipped contents are not supported entity files";
6402 addAssetToWorldInfoDone(filenameFromPath(filePath));
6403 }
6319 }6404 }
6320 request->deleteLater();6405 request->deleteLater();
6321 });6406 });
@@ -6605,15 +6690,18 @@ void Application::onAssetToWorldMessageBoxClosed() { · 283 unmodified lines
6605}6690}
6606 6691
6607 6692
6608void Application::handleUnzip(QString zipFile, QString unzipFile, bool autoAdd) {6693void Application::handleUnzip(QString zipFile, QStringList unzipFile, bool autoAdd, bool isZip) {
6609 if (autoAdd) {6694 if (autoAdd) {
6610 if (!unzipFile.isEmpty()) {6695 if (!unzipFile.isEmpty()) {
6611 addAssetToWorld(unzipFile);6696 for (int i = 0; i < unzipFile.length(); i++) {
6697 qCDebug(interfaceapp) << "Preparing file for asset server: " << unzipFile.at(i);
6698 addAssetToWorld(unzipFile.at(i), zipFile, isZip);
6699 }
6612 } else {6700 } else {
6613 addAssetToWorldUnzipFailure(zipFile);6701 addAssetToWorldUnzipFailure(zipFile);
6614 }6702 }
6615 } else {6703 } else {
6616 showAssetServerWidget(unzipFile);6704 showAssetServerWidget(unzipFile.first());
6617 }6705 }
6618}6706}
6619 6707
@@ -7076,6 +7164,7 @@ void Application::updateDisplayMode() { · 456 unmodified lines
7076 7164
7077 auto oldDisplayPlugin = _displayPlugin;7165 auto oldDisplayPlugin = _displayPlugin;
7078 if (_displayPlugin) {7166 if (_displayPlugin) {
7167 disconnect(_displayPluginPresentConnection);
7079 _displayPlugin->deactivate();7168 _displayPlugin->deactivate();
7080 }7169 }
7081 7170
@@ -7116,6 +7205,7 @@ void Application::updateDisplayMode() { · 34 unmodified lines
7116 _offscreenContext->makeCurrent();7205 _offscreenContext->makeCurrent();
7117 getApplicationCompositor().setDisplayPlugin(newDisplayPlugin);7206 getApplicationCompositor().setDisplayPlugin(newDisplayPlugin);
7118 _displayPlugin = newDisplayPlugin;7207 _displayPlugin = newDisplayPlugin;
7208 _displayPluginPresentConnection = connect(_displayPlugin.get(), &DisplayPlugin::presented, this, &Application::onPresent);
7119 offscreenUi->getDesktop()->setProperty("repositionLocked", wasRepositionLocked);7209 offscreenUi->getDesktop()->setProperty("repositionLocked", wasRepositionLocked);
7120 }7210 }
7121 7211