From 0c4cd96bfddd85c2587f56821043635a46b169b0 Mon Sep 17 00:00:00 2001 From: volansystech <samir.thaker@volansys.com> Date: Wed, 24 May 2017 12:25:21 +0530 Subject: [PATCH 1/9] Initial Commit : Switch from HMD [Oculus Rift] mode to Desktop mode automatically when user removing Oculus Rift. --- interface/src/Application.cpp | 40 +++++++++++++++++++++++++++++++++++ interface/src/Application.h | 8 +++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ae490c05e7..ced5e51565 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1338,6 +1338,13 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo properties["active_display_plugin"] = getActiveDisplayPlugin()->getName(); properties["using_hmd"] = isHMDMode(); + if (isOculusRiftPluginAvailable()){ + qCDebug(interfaceapp) << "Oculus Rift Plugin is available"; + QTimer *switchModeTimer = new QTimer(this); + connect(switchModeTimer, SIGNAL(timeout()), this, SLOT(switchmode())); + switchModeTimer->start(500); + } + auto glInfo = getGLContextData(); properties["gl_info"] = glInfo; properties["gpu_used_memory"] = (int)BYTES_TO_MB(gpu::Context::getUsedGPUMemory()); @@ -6833,6 +6840,39 @@ void Application::updateDisplayMode() { Q_ASSERT_X(_displayPlugin, "Application::updateDisplayMode", "could not find an activated display plugin"); } +bool Application::isOculusRiftPluginAvailable(){ + bool isOculusRiftPluginAvailable = false; + auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins(); + // Default to the first item on the list, in case none of the menu items match + DisplayPluginPointer defaultplugin = displayPlugins.at(0); + if (defaultplugin->isHmd() && defaultplugin->getName() == "Oculus Rift"){ + oculusRiftPlugin = defaultplugin; + return true; // No need to iterate again,so return + } + // Iterate to check If Oculus Rift Plugin is available + foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) { + QString pluginname = displayPlugin->getName(); + if (displayPlugin->isHmd() && pluginname == "Oculus Rift") { + oculusRiftPlugin = displayPlugin; + _isDisplayVisible = displayPlugin->isDisplayVisible(); + isOculusRiftPluginAvailable = true; + break; + } + } + return isOculusRiftPluginAvailable; +} + +void Application::switchmode(){ + bool isDisplayVisible = oculusRiftPlugin->isDisplayVisible(); + if (isDisplayVisible != _isDisplayVisible){ + if (isDisplayVisible == false && _isDisplayVisible == true){ + qCDebug(interfaceapp) << "switching from HMD to desktop mode"; + setActiveDisplayPlugin("Desktop"); + } + } + _isDisplayVisible = isDisplayVisible; // assign current status +} + mat4 Application::getEyeProjection(int eye) const { QMutexLocker viewLocker(&_viewMutex); if (isHMDMode()) { diff --git a/interface/src/Application.h b/interface/src/Application.h index d9dc3f389f..c181e74c74 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -152,7 +152,7 @@ public: void paintGL(); void resizeGL(); - bool event(QEvent* event) override; + bool event(QEvent* event) override; bool eventFilter(QObject* object, QEvent* event) override; glm::uvec2 getCanvasSize() const; @@ -443,7 +443,7 @@ private slots: void addAssetToWorldErrorTimeout(); void handleSandboxStatus(QNetworkReply* reply); - + void switchmode(); private: static void initDisplay(); void init(); @@ -683,6 +683,10 @@ private: FileScriptingInterface* _fileDownload; AudioInjector* _snapshotSoundInjector { nullptr }; SharedSoundPointer _snapshotSound; + + bool isOculusRiftPluginAvailable(); + DisplayPluginPointer oculusRiftPlugin; + bool _isDisplayVisible; }; From 1f24e38585cca9d1d7919e803b4806569af34570 Mon Sep 17 00:00:00 2001 From: volansystech <samir.thaker@volansys.com> Date: Wed, 24 May 2017 21:00:40 +0530 Subject: [PATCH 2/9] Initial Commit: Switching from Desktop mode to HMD [Oculus Rift] mode automatically when the user wear Oculus Rift. --- interface/src/Application.cpp | 54 ++++++++++++++----- interface/src/Application.h | 10 ++-- .../display-plugins/OpenGLDisplayPlugin.cpp | 15 +++++- .../src/display-plugins/OpenGLDisplayPlugin.h | 6 +++ libraries/plugins/src/plugins/Plugin.h | 13 +++++ .../oculus/src/OculusBaseDisplayPlugin.cpp | 11 ++++ plugins/oculus/src/OculusBaseDisplayPlugin.h | 2 + 7 files changed, 92 insertions(+), 19 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ced5e51565..99c2b2febf 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1338,11 +1338,18 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo properties["active_display_plugin"] = getActiveDisplayPlugin()->getName(); properties["using_hmd"] = isHMDMode(); - if (isOculusRiftPluginAvailable()){ - qCDebug(interfaceapp) << "Oculus Rift Plugin is available"; - QTimer *switchModeTimer = new QTimer(this); - connect(switchModeTimer, SIGNAL(timeout()), this, SLOT(switchmode())); - switchModeTimer->start(500); + if (isOculusRiftPluginAvailable()) { + // If Oculus Rift Plugin is Available,And Current Display Plugin is not Oculus Rift + // then startOculusRiftStandBySession to listen Oculus HMD Mounted status. + if (getActiveDisplayPlugin()->getName() != "Oculus Rift" && + !oculusRiftPlugin->isFakeSessionActive()) { + startOculusRiftStandBySession(); + } + // Poll periodically to check whether the user has worn Oculus HMD or not. And switch mode + // accordingly. If the user wear HMD, switch to VR mode, if remove switch to Desktop mode. + QTimer *switchDisplayModeTimer = new QTimer(this); + connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayModeForOculus())); + switchDisplayModeTimer->start(500); } auto glInfo = getGLContextData(); @@ -1574,7 +1581,9 @@ void Application::aboutToQuit() { } getActiveDisplayPlugin()->deactivate(); - + if (oculusRiftPlugin && oculusRiftPlugin->isFakeSessionActive()){ + oculusRiftPlugin->endStandBySession(); + } // Hide Running Scripts dialog so that it gets destroyed in an orderly manner; prevents warnings at shutdown. DependencyManager::get<OffscreenUi>()->hide("RunningScripts"); @@ -6845,7 +6854,7 @@ bool Application::isOculusRiftPluginAvailable(){ auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins(); // Default to the first item on the list, in case none of the menu items match DisplayPluginPointer defaultplugin = displayPlugins.at(0); - if (defaultplugin->isHmd() && defaultplugin->getName() == "Oculus Rift"){ + if (defaultplugin->isHmd() && defaultplugin->getName() == "Oculus Rift") { oculusRiftPlugin = defaultplugin; return true; // No need to iterate again,so return } @@ -6854,7 +6863,7 @@ bool Application::isOculusRiftPluginAvailable(){ QString pluginname = displayPlugin->getName(); if (displayPlugin->isHmd() && pluginname == "Oculus Rift") { oculusRiftPlugin = displayPlugin; - _isDisplayVisible = displayPlugin->isDisplayVisible(); + _oculusHMDMountedStatus = displayPlugin->isDisplayVisible(); isOculusRiftPluginAvailable = true; break; } @@ -6862,15 +6871,32 @@ bool Application::isOculusRiftPluginAvailable(){ return isOculusRiftPluginAvailable; } -void Application::switchmode(){ - bool isDisplayVisible = oculusRiftPlugin->isDisplayVisible(); - if (isDisplayVisible != _isDisplayVisible){ - if (isDisplayVisible == false && _isDisplayVisible == true){ - qCDebug(interfaceapp) << "switching from HMD to desktop mode"; +void Application::switchDisplayModeForOculus(){ + bool currenthmdMountedStatus = oculusRiftPlugin->isDisplayVisible(); + if (currenthmdMountedStatus != _oculusHMDMountedStatus){ + // Switch to respective mode as soon as currenthmdMountedStatus changes + if (currenthmdMountedStatus == false && _oculusHMDMountedStatus == true) { + qCDebug(interfaceapp) << "Switching from HMD to desktop mode"; setActiveDisplayPlugin("Desktop"); + startOculusRiftStandBySession(); + } + if (currenthmdMountedStatus == true && _oculusHMDMountedStatus == false) { + qCDebug(interfaceapp) << "Switching from Desktop to HMD mode"; + endOculusRiftStandBySession(); + setActiveDisplayPlugin("Oculus Rift"); } } - _isDisplayVisible = isDisplayVisible; // assign current status + _oculusHMDMountedStatus = currenthmdMountedStatus; +} + +bool Application::startOculusRiftStandBySession(){ + bool isStandBySessionStarted = oculusRiftPlugin->startStandBySession(); + qCDebug(interfaceapp) << "startOculusRiftStandBySession: " << isStandBySessionStarted; + return isStandBySessionStarted; +} + +void Application::endOculusRiftStandBySession(){ + oculusRiftPlugin->endStandBySession(); } mat4 Application::getEyeProjection(int eye) const { diff --git a/interface/src/Application.h b/interface/src/Application.h index c181e74c74..a6ac244dc8 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -443,7 +443,7 @@ private slots: void addAssetToWorldErrorTimeout(); void handleSandboxStatus(QNetworkReply* reply); - void switchmode(); + void switchDisplayModeForOculus(); private: static void initDisplay(); void init(); @@ -684,9 +684,13 @@ private: AudioInjector* _snapshotSoundInjector { nullptr }; SharedSoundPointer _snapshotSound; - bool isOculusRiftPluginAvailable(); + DisplayPluginPointer oculusRiftPlugin; - bool _isDisplayVisible; + + bool isOculusRiftPluginAvailable(); + bool _oculusHMDMountedStatus; // Keep track of HMD Mounted Flag + bool startOculusRiftStandBySession(); + void endOculusRiftStandBySession(); }; diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 306db98b35..639acc7739 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -315,8 +315,7 @@ bool OpenGLDisplayPlugin::activate() { if (isHmd() && (getHmdScreen() >= 0)) { _container->showDisplayPluginsTools(); } - - return Parent::activate(); + return Parent::activate(); } void OpenGLDisplayPlugin::deactivate() { @@ -339,6 +338,18 @@ void OpenGLDisplayPlugin::deactivate() { Parent::deactivate(); } +bool OpenGLDisplayPlugin::startStandBySession() { + if (!activateStandBySession()) { + return false; + } + return Parent::startStandBySession(); +} + +void OpenGLDisplayPlugin::endStandBySession() { + deactivateStandBySession(); + return Parent::endStandBySession(); +} + void OpenGLDisplayPlugin::customizeContext() { auto presentThread = DependencyManager::get<PresentThread>(); Q_ASSERT(thread() == presentThread->thread()); diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index e1eea5de6c..ecde3b3c93 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -42,6 +42,8 @@ public: // between the main thread and the presentation thread bool activate() override final; void deactivate() override final; + bool startStandBySession() override final; + void endStandBySession() override final; bool eventFilter(QObject* receiver, QEvent* event) override; bool isDisplayVisible() const override { return true; } @@ -99,6 +101,10 @@ protected: // Returns true on successful activation virtual bool internalActivate() { return true; } virtual void internalDeactivate() {} + + // Returns true on successful activation of standby session + virtual bool activateStandBySession() { return true; } + virtual void deactivateStandBySession() {} // Plugin specific functionality to send the composed scene to the output window or device virtual void internalPresent(); diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h index 15588fafa4..74f04fff18 100644 --- a/libraries/plugins/src/plugins/Plugin.h +++ b/libraries/plugins/src/plugins/Plugin.h @@ -53,6 +53,18 @@ public: virtual bool isActive() { return _active; } + virtual bool startStandBySession(){ + _standbysessionactive = true; + return _standbysessionactive; + } + + virtual void endStandBySession(){ + _standbysessionactive = false; + } + + virtual bool isFakeSessionActive() { + return _standbysessionactive; + } /** * Called by the application during it's idle phase. If the plugin needs to do @@ -73,6 +85,7 @@ signals: protected: bool _active { false }; + bool _standbysessionactive { false }; PluginContainer* _container { nullptr }; static const char* UNKNOWN_PLUGIN_ID; diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index 26906ef2fb..28e30e0d21 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -127,6 +127,17 @@ void OculusBaseDisplayPlugin::internalDeactivate() { _session = nullptr; } +bool OculusBaseDisplayPlugin::activateStandBySession() { + _session = acquireOculusSession(); + if (!_session) { + return false; + } + return true; +} +void OculusBaseDisplayPlugin::deactivateStandBySession() { + releaseOculusSession(); + _session = nullptr; +} void OculusBaseDisplayPlugin::updatePresentPose() { //mat4 sensorResetMat; //_currentPresentFrameInfo.sensorSampleTime = ovr_GetTimeInSeconds(); diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index e5dc75095d..79085f817b 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -33,6 +33,8 @@ protected: void uncustomizeContext() override; bool internalActivate() override; void internalDeactivate() override; + bool activateStandBySession() override; + void deactivateStandBySession() override; void updatePresentPose() override; protected: From a2851b5bcbe9db8147348e5d54543a666e2b690b Mon Sep 17 00:00:00 2001 From: volansystech <samir.thaker@volansys.com> Date: Thu, 25 May 2017 18:32:46 +0530 Subject: [PATCH 3/9] Put proper comments and indentation. --- interface/src/Application.cpp | 22 +++++++++---------- interface/src/Application.h | 5 ++--- .../display-plugins/OpenGLDisplayPlugin.cpp | 2 +- libraries/plugins/src/plugins/Plugin.h | 16 +++++++------- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fda9b7b8f9..a40f31a8bb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1339,14 +1339,14 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo properties["using_hmd"] = isHMDMode(); if (isOculusRiftPluginAvailable()) { - // If Oculus Rift Plugin is Available,And Current Display Plugin is not Oculus Rift + // If Oculus Rift Plugin is available and current display plugin is not Oculus Rift // then startOculusRiftStandBySession to listen Oculus HMD Mounted status. if (getActiveDisplayPlugin()->getName() != "Oculus Rift" && - !oculusRiftPlugin->isFakeSessionActive()) { + !oculusRiftPlugin->isStandBySessionActive()) { startOculusRiftStandBySession(); } - // Poll periodically to check whether the user has worn Oculus HMD or not. And switch mode - // accordingly. If the user wear HMD, switch to VR mode, if remove switch to Desktop mode. + // Poll periodically to check whether the user has worn Oculus HMD or not. And switch Display mode accordingly. + // If the user wear Oculus HMD then switch to VR mode. If the user removes Oculus HMD then switch to Desktop mode. QTimer *switchDisplayModeTimer = new QTimer(this); connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayModeForOculus())); switchDisplayModeTimer->start(500); @@ -1581,7 +1581,7 @@ void Application::aboutToQuit() { } getActiveDisplayPlugin()->deactivate(); - if (oculusRiftPlugin && oculusRiftPlugin->isFakeSessionActive()){ + if (oculusRiftPlugin && oculusRiftPlugin->isStandBySessionActive()) { oculusRiftPlugin->endStandBySession(); } // Hide Running Scripts dialog so that it gets destroyed in an orderly manner; prevents warnings at shutdown. @@ -6846,14 +6846,14 @@ void Application::updateDisplayMode() { Q_ASSERT_X(_displayPlugin, "Application::updateDisplayMode", "could not find an activated display plugin"); } -bool Application::isOculusRiftPluginAvailable(){ +bool Application::isOculusRiftPluginAvailable() { bool isOculusRiftPluginAvailable = false; auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins(); // Default to the first item on the list, in case none of the menu items match DisplayPluginPointer defaultplugin = displayPlugins.at(0); if (defaultplugin->isHmd() && defaultplugin->getName() == "Oculus Rift") { oculusRiftPlugin = defaultplugin; - return true; // No need to iterate again,so return + return true; } // Iterate to check If Oculus Rift Plugin is available foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) { @@ -6868,9 +6868,9 @@ bool Application::isOculusRiftPluginAvailable(){ return isOculusRiftPluginAvailable; } -void Application::switchDisplayModeForOculus(){ +void Application::switchDisplayModeForOculus() { bool currenthmdMountedStatus = oculusRiftPlugin->isDisplayVisible(); - if (currenthmdMountedStatus != _oculusHMDMountedStatus){ + if (currenthmdMountedStatus != _oculusHMDMountedStatus) { // Switch to respective mode as soon as currenthmdMountedStatus changes if (currenthmdMountedStatus == false && _oculusHMDMountedStatus == true) { qCDebug(interfaceapp) << "Switching from HMD to desktop mode"; @@ -6886,13 +6886,13 @@ void Application::switchDisplayModeForOculus(){ _oculusHMDMountedStatus = currenthmdMountedStatus; } -bool Application::startOculusRiftStandBySession(){ +bool Application::startOculusRiftStandBySession() { bool isStandBySessionStarted = oculusRiftPlugin->startStandBySession(); qCDebug(interfaceapp) << "startOculusRiftStandBySession: " << isStandBySessionStarted; return isStandBySessionStarted; } -void Application::endOculusRiftStandBySession(){ +void Application::endOculusRiftStandBySession() { oculusRiftPlugin->endStandBySession(); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 6b172cdb9e..112b650160 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -152,7 +152,7 @@ public: void paintGL(); void resizeGL(); - bool event(QEvent* event) override; + bool event(QEvent* event) override; bool eventFilter(QObject* object, QEvent* event) override; glm::uvec2 getCanvasSize() const; @@ -685,9 +685,8 @@ private: DisplayPluginPointer oculusRiftPlugin; - bool isOculusRiftPluginAvailable(); - bool _oculusHMDMountedStatus; // Keep track of HMD Mounted Flag + bool _oculusHMDMountedStatus; // Keep track of Oculus Rift HMDMounted Flag bool startOculusRiftStandBySession(); void endOculusRiftStandBySession(); }; diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 96d3d8114c..cebe844b84 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -315,7 +315,7 @@ bool OpenGLDisplayPlugin::activate() { if (isHmd() && (getHmdScreen() >= 0)) { _container->showDisplayPluginsTools(); } - return Parent::activate(); + return Parent::activate(); } void OpenGLDisplayPlugin::deactivate() { diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h index 74f04fff18..045a9eee15 100644 --- a/libraries/plugins/src/plugins/Plugin.h +++ b/libraries/plugins/src/plugins/Plugin.h @@ -53,17 +53,17 @@ public: virtual bool isActive() { return _active; } - virtual bool startStandBySession(){ - _standbysessionactive = true; - return _standbysessionactive; + virtual bool startStandBySession() { + _standbysessionstatus = true; + return _standbysessionstatus; } - virtual void endStandBySession(){ - _standbysessionactive = false; + virtual void endStandBySession() { + _standbysessionstatus = false; } - virtual bool isFakeSessionActive() { - return _standbysessionactive; + virtual bool isStandBySessionActive() { + return _standbysessionstatus; } /** @@ -85,7 +85,7 @@ signals: protected: bool _active { false }; - bool _standbysessionactive { false }; + bool _standbysessionstatus { false }; PluginContainer* _container { nullptr }; static const char* UNKNOWN_PLUGIN_ID; From 0920dbc1a8910c986b2c83b2422aa7fa63e192d9 Mon Sep 17 00:00:00 2001 From: volansystech <samir.thaker@volansys.com> Date: Mon, 29 May 2017 15:53:33 +0530 Subject: [PATCH 4/9] Resolve the comments of @ZappoMan. --- interface/src/Application.cpp | 111 +++++++++--------- interface/src/Application.h | 13 +- .../display-plugins/OpenGLDisplayPlugin.cpp | 12 +- .../src/display-plugins/OpenGLDisplayPlugin.h | 10 +- libraries/plugins/src/plugins/Plugin.h | 22 ++-- .../oculus/src/OculusBaseDisplayPlugin.cpp | 14 +-- plugins/oculus/src/OculusBaseDisplayPlugin.h | 4 +- 7 files changed, 92 insertions(+), 94 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a40f31a8bb..57a627fe53 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -244,6 +244,8 @@ static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStanda Setting::Handle<int> maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTREE_PPS); static const QString MARKETPLACE_CDN_HOSTNAME = "mpassets.highfidelity.com"; +static const int INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS = 500; // milliseconds +static const QString OCULUS_RIFT_DISPLAY_PLUGIN_NAME = "Oculus Rift"; const QHash<QString, Application::AcceptURLMethod> Application::_acceptedExtensions { { SVO_EXTENSION, &Application::importSVOFromURL }, @@ -1338,19 +1340,20 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo properties["active_display_plugin"] = getActiveDisplayPlugin()->getName(); properties["using_hmd"] = isHMDMode(); - if (isOculusRiftPluginAvailable()) { - // If Oculus Rift Plugin is available and current display plugin is not Oculus Rift - // then startOculusRiftStandBySession to listen Oculus HMD Mounted status. - if (getActiveDisplayPlugin()->getName() != "Oculus Rift" && - !oculusRiftPlugin->isStandBySessionActive()) { - startOculusRiftStandBySession(); - } - // Poll periodically to check whether the user has worn Oculus HMD or not. And switch Display mode accordingly. - // If the user wear Oculus HMD then switch to VR mode. If the user removes Oculus HMD then switch to Desktop mode. - QTimer *switchDisplayModeTimer = new QTimer(this); - connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayModeForOculus())); - switchDisplayModeTimer->start(500); - } + if (isHMDPluginAvailable()) { + // Currently, autoswitch display mode support is only for Oculus Rift. + // If HMD Plugin is available and current display plugin is not HMD plugin + // then startHMDStandBySession to listen HMD Mounted status. + if (getActiveDisplayPlugin()->getName() != _hmdPluginName && + !_hmdPlugin->isStandBySessionActive()) { + startHMDStandBySession(); + } + // Poll periodically to check whether the user has worn HMD or not. And switch Display mode accordingly. + // If the user wear HMD then switch to VR mode. If the user removes HMD then switch to Desktop mode. + QTimer *switchDisplayModeTimer = new QTimer(this); + connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayMode())); + switchDisplayModeTimer->start(INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS); + } auto glInfo = getGLContextData(); properties["gl_info"] = glInfo; @@ -1581,8 +1584,8 @@ void Application::aboutToQuit() { } getActiveDisplayPlugin()->deactivate(); - if (oculusRiftPlugin && oculusRiftPlugin->isStandBySessionActive()) { - oculusRiftPlugin->endStandBySession(); + if (_hmdPlugin && _hmdPlugin->isStandBySessionActive()) { + _hmdPlugin->endStandBySession(); } // Hide Running Scripts dialog so that it gets destroyed in an orderly manner; prevents warnings at shutdown. DependencyManager::get<OffscreenUi>()->hide("RunningScripts"); @@ -6846,54 +6849,48 @@ void Application::updateDisplayMode() { Q_ASSERT_X(_displayPlugin, "Application::updateDisplayMode", "could not find an activated display plugin"); } -bool Application::isOculusRiftPluginAvailable() { - bool isOculusRiftPluginAvailable = false; - auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins(); - // Default to the first item on the list, in case none of the menu items match - DisplayPluginPointer defaultplugin = displayPlugins.at(0); - if (defaultplugin->isHmd() && defaultplugin->getName() == "Oculus Rift") { - oculusRiftPlugin = defaultplugin; - return true; - } - // Iterate to check If Oculus Rift Plugin is available - foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) { - QString pluginname = displayPlugin->getName(); - if (displayPlugin->isHmd() && pluginname == "Oculus Rift") { - oculusRiftPlugin = displayPlugin; - _oculusHMDMountedStatus = displayPlugin->isDisplayVisible(); - isOculusRiftPluginAvailable = true; - break; - } - } - return isOculusRiftPluginAvailable; +bool Application::isHMDPluginAvailable() { + bool isHMDEnabledPluginAvailable = false; + auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins(); + // Currently, autoswitch display mode support is only for Oculus Rift. + foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) { + if (displayPlugin->isHmd() && displayPlugin->getName() == OCULUS_RIFT_DISPLAY_PLUGIN_NAME) { + _hmdPlugin = displayPlugin; + _hmdPluginName = displayPlugin->getName(); + _hmdMountedStatus = displayPlugin->isDisplayVisible(); + isHMDEnabledPluginAvailable = true; + break; + } + } + return isHMDEnabledPluginAvailable; } -void Application::switchDisplayModeForOculus() { - bool currenthmdMountedStatus = oculusRiftPlugin->isDisplayVisible(); - if (currenthmdMountedStatus != _oculusHMDMountedStatus) { - // Switch to respective mode as soon as currenthmdMountedStatus changes - if (currenthmdMountedStatus == false && _oculusHMDMountedStatus == true) { - qCDebug(interfaceapp) << "Switching from HMD to desktop mode"; - setActiveDisplayPlugin("Desktop"); - startOculusRiftStandBySession(); - } - if (currenthmdMountedStatus == true && _oculusHMDMountedStatus == false) { - qCDebug(interfaceapp) << "Switching from Desktop to HMD mode"; - endOculusRiftStandBySession(); - setActiveDisplayPlugin("Oculus Rift"); - } - } - _oculusHMDMountedStatus = currenthmdMountedStatus; +void Application::switchDisplayMode() { + bool currentHMDMountedStatus = _hmdPlugin->isDisplayVisible(); + if (currentHMDMountedStatus != _hmdMountedStatus) { + // Switch to respective mode as soon as currenthmdMountedStatus changes + if (currentHMDMountedStatus == false && _hmdMountedStatus == true) { + qCDebug(interfaceapp) << "Switching from HMD to desktop mode"; + setActiveDisplayPlugin("Desktop"); + startHMDStandBySession(); + } + if (currentHMDMountedStatus == true && _hmdMountedStatus == false) { + qCDebug(interfaceapp) << "Switching from Desktop to HMD mode"; + endHMDStandBySession(); + setActiveDisplayPlugin(_hmdPluginName); + } + } + _hmdMountedStatus = currentHMDMountedStatus; } -bool Application::startOculusRiftStandBySession() { - bool isStandBySessionStarted = oculusRiftPlugin->startStandBySession(); - qCDebug(interfaceapp) << "startOculusRiftStandBySession: " << isStandBySessionStarted; - return isStandBySessionStarted; +bool Application::startHMDStandBySession() { + bool isStandBySessionStarted = _hmdPlugin->startStandBySession(); + qCDebug(interfaceapp) << "startHMDStandBySession: " << isStandBySessionStarted; + return isStandBySessionStarted; } -void Application::endOculusRiftStandBySession() { - oculusRiftPlugin->endStandBySession(); +void Application::endHMDStandBySession() { + _hmdPlugin->endStandBySession(); } mat4 Application::getEyeProjection(int eye) const { diff --git a/interface/src/Application.h b/interface/src/Application.h index 112b650160..699cb9f879 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -442,7 +442,7 @@ private slots: void addAssetToWorldErrorTimeout(); void handleSandboxStatus(QNetworkReply* reply); - void switchDisplayModeForOculus(); + void switchDisplayMode(); private: static void initDisplay(); void init(); @@ -684,11 +684,12 @@ private: SharedSoundPointer _snapshotSound; - DisplayPluginPointer oculusRiftPlugin; - bool isOculusRiftPluginAvailable(); - bool _oculusHMDMountedStatus; // Keep track of Oculus Rift HMDMounted Flag - bool startOculusRiftStandBySession(); - void endOculusRiftStandBySession(); + DisplayPluginPointer _hmdPlugin; // HMD Enabled Plugin + QString _hmdPluginName; + bool isHMDPluginAvailable(); + bool _hmdMountedStatus; // Check HMD Mounted status + bool startHMDStandBySession(); + void endHMDStandBySession(); }; diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index cebe844b84..3bdf9a672c 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -339,15 +339,15 @@ void OpenGLDisplayPlugin::deactivate() { } bool OpenGLDisplayPlugin::startStandBySession() { - if (!activateStandBySession()) { - return false; - } - return Parent::startStandBySession(); + if (!activateStandBySession()) { + return false; + } + return Parent::startStandBySession(); } void OpenGLDisplayPlugin::endStandBySession() { - deactivateStandBySession(); - return Parent::endStandBySession(); + deactivateStandBySession(); + return Parent::endStandBySession(); } void OpenGLDisplayPlugin::customizeContext() { diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index ecde3b3c93..9681158c55 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -42,8 +42,8 @@ public: // between the main thread and the presentation thread bool activate() override final; void deactivate() override final; - bool startStandBySession() override final; - void endStandBySession() override final; + bool startStandBySession() override final; + void endStandBySession() override final; bool eventFilter(QObject* receiver, QEvent* event) override; bool isDisplayVisible() const override { return true; } @@ -102,9 +102,9 @@ protected: virtual bool internalActivate() { return true; } virtual void internalDeactivate() {} - // Returns true on successful activation of standby session - virtual bool activateStandBySession() { return true; } - virtual void deactivateStandBySession() {} + // Returns true on successful activation of standby session + virtual bool activateStandBySession() { return true; } + virtual void deactivateStandBySession() {} // Plugin specific functionality to send the composed scene to the output window or device virtual void internalPresent(); diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h index 045a9eee15..11ea79186a 100644 --- a/libraries/plugins/src/plugins/Plugin.h +++ b/libraries/plugins/src/plugins/Plugin.h @@ -53,18 +53,18 @@ public: virtual bool isActive() { return _active; } - virtual bool startStandBySession() { - _standbysessionstatus = true; - return _standbysessionstatus; - } + virtual bool startStandBySession() { + _standbysessionstatus = true; + return _standbysessionstatus; + } - virtual void endStandBySession() { - _standbysessionstatus = false; - } + virtual void endStandBySession() { + _standbysessionstatus = false; + } - virtual bool isStandBySessionActive() { - return _standbysessionstatus; - } + virtual bool isStandBySessionActive() { + return _standbysessionstatus; + } /** * Called by the application during it's idle phase. If the plugin needs to do @@ -85,7 +85,7 @@ signals: protected: bool _active { false }; - bool _standbysessionstatus { false }; + bool _standbysessionstatus { false }; PluginContainer* _container { nullptr }; static const char* UNKNOWN_PLUGIN_ID; diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index 28e30e0d21..df98abf408 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -128,15 +128,15 @@ void OculusBaseDisplayPlugin::internalDeactivate() { } bool OculusBaseDisplayPlugin::activateStandBySession() { - _session = acquireOculusSession(); - if (!_session) { - return false; - } - return true; + _session = acquireOculusSession(); + if (!_session) { + return false; + } + return true; } void OculusBaseDisplayPlugin::deactivateStandBySession() { - releaseOculusSession(); - _session = nullptr; + releaseOculusSession(); + _session = nullptr; } void OculusBaseDisplayPlugin::updatePresentPose() { //mat4 sensorResetMat; diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index 79085f817b..1f54742c2d 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -33,8 +33,8 @@ protected: void uncustomizeContext() override; bool internalActivate() override; void internalDeactivate() override; - bool activateStandBySession() override; - void deactivateStandBySession() override; + bool activateStandBySession() override; + void deactivateStandBySession() override; void updatePresentPose() override; protected: From e90b1b5a67c8fd33d539c7d86b677ba24d17f61c Mon Sep 17 00:00:00 2001 From: volansystech <samir.thaker@volansys.com> Date: Mon, 29 May 2017 18:21:59 +0530 Subject: [PATCH 5/9] Resolve the comments of @ZappoMan. --- interface/src/Application.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d219d7bcb6..b5733fa6f5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -246,6 +246,7 @@ Setting::Handle<int> maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTRE static const QString MARKETPLACE_CDN_HOSTNAME = "mpassets.highfidelity.com"; static const int INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS = 500; // milliseconds static const QString OCULUS_RIFT_DISPLAY_PLUGIN_NAME = "Oculus Rift"; +static const QString DESKTOP_DISPLAY_PLUGIN_NAME = "Desktop"; const QHash<QString, Application::AcceptURLMethod> Application::_acceptedExtensions { { SVO_EXTENSION, &Application::importSVOFromURL }, @@ -1348,8 +1349,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo !_hmdPlugin->isStandBySessionActive()) { startHMDStandBySession(); } - // Poll periodically to check whether the user has worn HMD or not. And switch Display mode accordingly. - // If the user wear HMD then switch to VR mode. If the user removes HMD then switch to Desktop mode. + // Poll periodically to check whether the user has worn HMD or not. Switch Display mode accordingly. + // If the user wears HMD then switch to VR mode. If the user removes HMD then switch to Desktop mode. QTimer *switchDisplayModeTimer = new QTimer(this); connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayMode())); switchDisplayModeTimer->start(INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS); @@ -6773,7 +6774,7 @@ void Application::switchDisplayMode() { // Switch to respective mode as soon as currenthmdMountedStatus changes if (currentHMDMountedStatus == false && _hmdMountedStatus == true) { qCDebug(interfaceapp) << "Switching from HMD to desktop mode"; - setActiveDisplayPlugin("Desktop"); + setActiveDisplayPlugin(DESKTOP_DISPLAY_PLUGIN_NAME); startHMDStandBySession(); } if (currentHMDMountedStatus == true && _hmdMountedStatus == false) { From 58142817a12d132077515669953fd3c4087487df Mon Sep 17 00:00:00 2001 From: NeetBhagat <neet.bhagat@volansystech.com> Date: Wed, 31 May 2017 19:13:55 +0530 Subject: [PATCH 6/9] Resolve the review comments of @ZappoMan. --- interface/src/Application.cpp | 86 ++++++++++++++++++----------------- interface/src/Application.h | 14 ++---- 2 files changed, 49 insertions(+), 51 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b5733fa6f5..ac39f51d7e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -244,8 +244,8 @@ static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStanda Setting::Handle<int> maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTREE_PPS); static const QString MARKETPLACE_CDN_HOSTNAME = "mpassets.highfidelity.com"; -static const int INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS = 500; // milliseconds -static const QString OCULUS_RIFT_DISPLAY_PLUGIN_NAME = "Oculus Rift"; +static const int INTERVAL_TO_CHECK_HMD_WORN_STATUS = 500; // milliseconds +static const QString DISPLAY_PLUGIN_NAME_OCULUS_RIFT = "Oculus Rift"; static const QString DESKTOP_DISPLAY_PLUGIN_NAME = "Desktop"; const QHash<QString, Application::AcceptURLMethod> Application::_acceptedExtensions { @@ -1341,19 +1341,38 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo properties["active_display_plugin"] = getActiveDisplayPlugin()->getName(); properties["using_hmd"] = isHMDMode(); - if (isHMDPluginAvailable()) { - // Currently, autoswitch display mode support is only for Oculus Rift. - // If HMD Plugin is available and current display plugin is not HMD plugin - // then startHMDStandBySession to listen HMD Mounted status. - if (getActiveDisplayPlugin()->getName() != _hmdPluginName && - !_hmdPlugin->isStandBySessionActive()) { + _autoSwitchDisplayModeSupportedHMDPlugin = nullptr; + foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) { + if (displayPlugin->isHmd() && + displayPlugin->getName() == DISPLAY_PLUGIN_NAME_OCULUS_RIFT) { + + // Currently auto switch display mode support is only for Oculus Rift + // To support other plugins, add a condition + // (|| displayPlugin->getName() == "Other HMD Display Plugin Name") + + _autoSwitchDisplayModeSupportedHMDPlugin = displayPlugin; + _autoSwitchDisplayModeSupportedHMDPluginName = + _autoSwitchDisplayModeSupportedHMDPlugin->getName(); + _previousHMDWornStatus = + _autoSwitchDisplayModeSupportedHMDPlugin->isDisplayVisible(); + qCDebug(interfaceapp) << "_autoSwitchModeSupportedPluginName::" + << _autoSwitchDisplayModeSupportedHMDPluginName; + break; + } + } + + if (_autoSwitchDisplayModeSupportedHMDPlugin != nullptr) { + // If HMD Plugin is available and current display plugin is not HMD plugin + // then startHMDStandBySession to poll HMD Worn status. + if (getActiveDisplayPlugin()->getName() != _autoSwitchDisplayModeSupportedHMDPluginName && + !_autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) { startHMDStandBySession(); } // Poll periodically to check whether the user has worn HMD or not. Switch Display mode accordingly. // If the user wears HMD then switch to VR mode. If the user removes HMD then switch to Desktop mode. - QTimer *switchDisplayModeTimer = new QTimer(this); - connect(switchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayMode())); - switchDisplayModeTimer->start(INTERVAL_TO_CHECK_HMD_MOUNTED_STATUS); + QTimer* autoSwitchDisplayModeTimer = new QTimer(this); + connect(autoSwitchDisplayModeTimer, SIGNAL(timeout()), this, SLOT(switchDisplayMode())); + autoSwitchDisplayModeTimer->start(INTERVAL_TO_CHECK_HMD_WORN_STATUS); } auto glInfo = getGLContextData(); @@ -1585,9 +1604,10 @@ void Application::aboutToQuit() { } getActiveDisplayPlugin()->deactivate(); - if (_hmdPlugin && _hmdPlugin->isStandBySessionActive()) { - _hmdPlugin->endStandBySession(); - } + if (_autoSwitchDisplayModeSupportedHMDPlugin != nullptr + && _autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) { + _autoSwitchDisplayModeSupportedHMDPlugin->endStandBySession(); + } // Hide Running Scripts dialog so that it gets destroyed in an orderly manner; prevents warnings at shutdown. DependencyManager::get<OffscreenUi>()->hide("RunningScripts"); @@ -6752,48 +6772,30 @@ void Application::updateDisplayMode() { Q_ASSERT_X(_displayPlugin, "Application::updateDisplayMode", "could not find an activated display plugin"); } -bool Application::isHMDPluginAvailable() { - bool isHMDEnabledPluginAvailable = false; - auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins(); - // Currently, autoswitch display mode support is only for Oculus Rift. - foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) { - if (displayPlugin->isHmd() && displayPlugin->getName() == OCULUS_RIFT_DISPLAY_PLUGIN_NAME) { - _hmdPlugin = displayPlugin; - _hmdPluginName = displayPlugin->getName(); - _hmdMountedStatus = displayPlugin->isDisplayVisible(); - isHMDEnabledPluginAvailable = true; - break; - } - } - return isHMDEnabledPluginAvailable; -} - void Application::switchDisplayMode() { - bool currentHMDMountedStatus = _hmdPlugin->isDisplayVisible(); - if (currentHMDMountedStatus != _hmdMountedStatus) { - // Switch to respective mode as soon as currenthmdMountedStatus changes - if (currentHMDMountedStatus == false && _hmdMountedStatus == true) { + bool currentHMDWornStatus = _autoSwitchDisplayModeSupportedHMDPlugin->isDisplayVisible(); + if (currentHMDWornStatus != _previousHMDWornStatus) { + // Switch to respective mode as soon as currentHMDWornStatus changes + if (currentHMDWornStatus == false && _previousHMDWornStatus == true) { qCDebug(interfaceapp) << "Switching from HMD to desktop mode"; setActiveDisplayPlugin(DESKTOP_DISPLAY_PLUGIN_NAME); startHMDStandBySession(); } - if (currentHMDMountedStatus == true && _hmdMountedStatus == false) { + if (currentHMDWornStatus == true && _previousHMDWornStatus == false) { qCDebug(interfaceapp) << "Switching from Desktop to HMD mode"; endHMDStandBySession(); - setActiveDisplayPlugin(_hmdPluginName); + setActiveDisplayPlugin(_autoSwitchDisplayModeSupportedHMDPluginName); } } - _hmdMountedStatus = currentHMDMountedStatus; + _previousHMDWornStatus = currentHMDWornStatus; } -bool Application::startHMDStandBySession() { - bool isStandBySessionStarted = _hmdPlugin->startStandBySession(); - qCDebug(interfaceapp) << "startHMDStandBySession: " << isStandBySessionStarted; - return isStandBySessionStarted; +void Application::startHMDStandBySession() { + _autoSwitchDisplayModeSupportedHMDPlugin->startStandBySession(); } void Application::endHMDStandBySession() { - _hmdPlugin->endStandBySession(); + _autoSwitchDisplayModeSupportedHMDPlugin->endStandBySession(); } mat4 Application::getEyeProjection(int eye) const { diff --git a/interface/src/Application.h b/interface/src/Application.h index f19c2c9adf..e1fb37ef3a 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -681,14 +681,10 @@ private: AudioInjector* _snapshotSoundInjector { nullptr }; SharedSoundPointer _snapshotSound; - - DisplayPluginPointer _hmdPlugin; // HMD Enabled Plugin - QString _hmdPluginName; - bool isHMDPluginAvailable(); - bool _hmdMountedStatus; // Check HMD Mounted status - bool startHMDStandBySession(); - void endHMDStandBySession(); + DisplayPluginPointer _autoSwitchDisplayModeSupportedHMDPlugin = nullptr; + QString _autoSwitchDisplayModeSupportedHMDPluginName; + bool _previousHMDWornStatus; + void startHMDStandBySession(); + void endHMDStandBySession(); }; - - #endif // hifi_Application_h From c7c07b28e94bc9d0b6aa0ac767e39aacb84c0b8c Mon Sep 17 00:00:00 2001 From: NeetBhagat <neet.bhagat@volansystech.com> Date: Thu, 1 Jun 2017 12:14:54 +0530 Subject: [PATCH 7/9] Resolve the reviewed comments of @ZappoMan --- interface/src/Application.cpp | 8 +------- libraries/plugins/src/plugins/DisplayPlugin.h | 1 + plugins/oculus/src/OculusBaseDisplayPlugin.h | 1 + 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ac39f51d7e..b8bfff8c5f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -245,7 +245,6 @@ Setting::Handle<int> maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTRE static const QString MARKETPLACE_CDN_HOSTNAME = "mpassets.highfidelity.com"; static const int INTERVAL_TO_CHECK_HMD_WORN_STATUS = 500; // milliseconds -static const QString DISPLAY_PLUGIN_NAME_OCULUS_RIFT = "Oculus Rift"; static const QString DESKTOP_DISPLAY_PLUGIN_NAME = "Desktop"; const QHash<QString, Application::AcceptURLMethod> Application::_acceptedExtensions { @@ -1344,12 +1343,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo _autoSwitchDisplayModeSupportedHMDPlugin = nullptr; foreach(DisplayPluginPointer displayPlugin, PluginManager::getInstance()->getDisplayPlugins()) { if (displayPlugin->isHmd() && - displayPlugin->getName() == DISPLAY_PLUGIN_NAME_OCULUS_RIFT) { - - // Currently auto switch display mode support is only for Oculus Rift - // To support other plugins, add a condition - // (|| displayPlugin->getName() == "Other HMD Display Plugin Name") - + displayPlugin->getSupportsAutoSwitch()) { _autoSwitchDisplayModeSupportedHMDPlugin = displayPlugin; _autoSwitchDisplayModeSupportedHMDPluginName = _autoSwitchDisplayModeSupportedHMDPlugin->getName(); diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index 754c919fd4..297bdb2cca 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -200,6 +200,7 @@ public: virtual float newFramePresentRate() const { return -1.0f; } // Rate at which rendered frames are being skipped virtual float droppedFrameRate() const { return -1.0f; } + virtual bool getSupportsAutoSwitch() { return false; } // Hardware specific stats virtual QJsonObject getHardwareStats() const { return QJsonObject(); } diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index 1f54742c2d..bfdcc5db1e 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -26,6 +26,7 @@ public: void resetSensors() override final; bool beginFrameRender(uint32_t frameIndex) override; float getTargetFrameRate() const override { return _hmdDesc.DisplayRefreshRate; } + bool getSupportsAutoSwitch() override final { return true; } protected: From 6228ff19bf2c9315b6edc01747a985301421e436 Mon Sep 17 00:00:00 2001 From: NeetBhagat <neet.bhagat@volansystech.com> Date: Fri, 2 Jun 2017 14:37:17 +0530 Subject: [PATCH 8/9] Resolve the reviewed comments of @ZappoMan --- interface/src/Application.cpp | 26 +++++++++---------- interface/src/Application.h | 2 +- .../display-plugins/OpenGLDisplayPlugin.cpp | 3 ++- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8384204fb9..a3787847db 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1349,16 +1349,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo _autoSwitchDisplayModeSupportedHMDPlugin->getName(); _previousHMDWornStatus = _autoSwitchDisplayModeSupportedHMDPlugin->isDisplayVisible(); - qCDebug(interfaceapp) << "_autoSwitchModeSupportedPluginName::" - << _autoSwitchDisplayModeSupportedHMDPluginName; break; } } - if (_autoSwitchDisplayModeSupportedHMDPlugin != nullptr) { - // If HMD Plugin is available and current display plugin is not HMD plugin - // then startHMDStandBySession to poll HMD Worn status. - if (getActiveDisplayPlugin()->getName() != _autoSwitchDisplayModeSupportedHMDPluginName && + if (_autoSwitchDisplayModeSupportedHMDPlugin) { + if (getActiveDisplayPlugin() != _autoSwitchDisplayModeSupportedHMDPlugin && !_autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) { startHMDStandBySession(); } @@ -1600,7 +1596,7 @@ void Application::aboutToQuit() { } getActiveDisplayPlugin()->deactivate(); - if (_autoSwitchDisplayModeSupportedHMDPlugin != nullptr + if (_autoSwitchDisplayModeSupportedHMDPlugin && _autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) { _autoSwitchDisplayModeSupportedHMDPlugin->endStandBySession(); } @@ -6769,18 +6765,20 @@ void Application::updateDisplayMode() { } void Application::switchDisplayMode() { + if (!_autoSwitchDisplayModeSupportedHMDPlugin) { + return; + } bool currentHMDWornStatus = _autoSwitchDisplayModeSupportedHMDPlugin->isDisplayVisible(); if (currentHMDWornStatus != _previousHMDWornStatus) { - // Switch to respective mode as soon as currentHMDWornStatus changes - if (currentHMDWornStatus == false && _previousHMDWornStatus == true) { - qCDebug(interfaceapp) << "Switching from HMD to desktop mode"; - setActiveDisplayPlugin(DESKTOP_DISPLAY_PLUGIN_NAME); - startHMDStandBySession(); - } - if (currentHMDWornStatus == true && _previousHMDWornStatus == false) { + // Switch to respective mode as soon as currentHMDWornStatus changes + if (currentHMDWornStatus) { qCDebug(interfaceapp) << "Switching from Desktop to HMD mode"; endHMDStandBySession(); setActiveDisplayPlugin(_autoSwitchDisplayModeSupportedHMDPluginName); + } else { + qCDebug(interfaceapp) << "Switching from HMD to desktop mode"; + setActiveDisplayPlugin(DESKTOP_DISPLAY_PLUGIN_NAME); + startHMDStandBySession(); } } _previousHMDWornStatus = currentHMDWornStatus; diff --git a/interface/src/Application.h b/interface/src/Application.h index e1fb37ef3a..4cd47ada58 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -681,7 +681,7 @@ private: AudioInjector* _snapshotSoundInjector { nullptr }; SharedSoundPointer _snapshotSound; - DisplayPluginPointer _autoSwitchDisplayModeSupportedHMDPlugin = nullptr; + DisplayPluginPointer _autoSwitchDisplayModeSupportedHMDPlugin; QString _autoSwitchDisplayModeSupportedHMDPluginName; bool _previousHMDWornStatus; void startHMDStandBySession(); diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index 3bdf9a672c..fbdc1ad71e 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -315,6 +315,7 @@ bool OpenGLDisplayPlugin::activate() { if (isHmd() && (getHmdScreen() >= 0)) { _container->showDisplayPluginsTools(); } + return Parent::activate(); } @@ -347,7 +348,7 @@ bool OpenGLDisplayPlugin::startStandBySession() { void OpenGLDisplayPlugin::endStandBySession() { deactivateStandBySession(); - return Parent::endStandBySession(); + Parent::endStandBySession(); } void OpenGLDisplayPlugin::customizeContext() { From c3621d7c325c634d2b53e09eec78641b4ed0454f Mon Sep 17 00:00:00 2001 From: NeetBhagat <neet.bhagat@volansystech.com> Date: Tue, 6 Jun 2017 22:31:14 +0530 Subject: [PATCH 9/9] Resolved two issues: 1) While in HMD mode -> open Tablet -> Click Desktop. Desktop mode will be on. 2) Menu sync problem while switching modes. --- interface/src/Application.cpp | 13 +++++++------ interface/src/Application.h | 2 +- .../src/display-plugins/OpenGLDisplayPlugin.cpp | 6 +++--- .../src/display-plugins/OpenGLDisplayPlugin.h | 4 ++-- libraries/plugins/src/plugins/Plugin.h | 14 +++++++------- plugins/oculus/src/OculusBaseDisplayPlugin.cpp | 4 +--- plugins/oculus/src/OculusBaseDisplayPlugin.h | 2 +- 7 files changed, 22 insertions(+), 23 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c681f99ee2..314c51a4f2 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1360,7 +1360,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo if (_autoSwitchDisplayModeSupportedHMDPlugin) { if (getActiveDisplayPlugin() != _autoSwitchDisplayModeSupportedHMDPlugin && - !_autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) { + !_autoSwitchDisplayModeSupportedHMDPlugin->isSessionActive()) { startHMDStandBySession(); } // Poll periodically to check whether the user has worn HMD or not. Switch Display mode accordingly. @@ -1602,8 +1602,8 @@ void Application::aboutToQuit() { getActiveDisplayPlugin()->deactivate(); if (_autoSwitchDisplayModeSupportedHMDPlugin - && _autoSwitchDisplayModeSupportedHMDPlugin->isStandBySessionActive()) { - _autoSwitchDisplayModeSupportedHMDPlugin->endStandBySession(); + && _autoSwitchDisplayModeSupportedHMDPlugin->isSessionActive()) { + _autoSwitchDisplayModeSupportedHMDPlugin->endSession(); } // use the CloseEventSender via a QThread to send an event that says the user asked for the app to close auto closeEventSender = DependencyManager::get<CloseEventSender>(); @@ -6827,13 +6827,14 @@ void Application::switchDisplayMode() { // Switch to respective mode as soon as currentHMDWornStatus changes if (currentHMDWornStatus) { qCDebug(interfaceapp) << "Switching from Desktop to HMD mode"; - endHMDStandBySession(); + endHMDSession(); setActiveDisplayPlugin(_autoSwitchDisplayModeSupportedHMDPluginName); } else { qCDebug(interfaceapp) << "Switching from HMD to desktop mode"; setActiveDisplayPlugin(DESKTOP_DISPLAY_PLUGIN_NAME); startHMDStandBySession(); } + emit activeDisplayPluginChanged(); } _previousHMDWornStatus = currentHMDWornStatus; } @@ -6842,8 +6843,8 @@ void Application::startHMDStandBySession() { _autoSwitchDisplayModeSupportedHMDPlugin->startStandBySession(); } -void Application::endHMDStandBySession() { - _autoSwitchDisplayModeSupportedHMDPlugin->endStandBySession(); +void Application::endHMDSession() { + _autoSwitchDisplayModeSupportedHMDPlugin->endSession(); } mat4 Application::getEyeProjection(int eye) const { diff --git a/interface/src/Application.h b/interface/src/Application.h index 4cd47ada58..46e5e882a4 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -685,6 +685,6 @@ private: QString _autoSwitchDisplayModeSupportedHMDPluginName; bool _previousHMDWornStatus; void startHMDStandBySession(); - void endHMDStandBySession(); + void endHMDSession(); }; #endif // hifi_Application_h diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index fbdc1ad71e..bfd158ffb5 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -346,9 +346,9 @@ bool OpenGLDisplayPlugin::startStandBySession() { return Parent::startStandBySession(); } -void OpenGLDisplayPlugin::endStandBySession() { - deactivateStandBySession(); - Parent::endStandBySession(); +void OpenGLDisplayPlugin::endSession() { + deactivateSession(); + Parent::endSession(); } void OpenGLDisplayPlugin::customizeContext() { diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index 9681158c55..10a7558398 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -43,7 +43,7 @@ public: bool activate() override final; void deactivate() override final; bool startStandBySession() override final; - void endStandBySession() override final; + void endSession() override final; bool eventFilter(QObject* receiver, QEvent* event) override; bool isDisplayVisible() const override { return true; } @@ -104,7 +104,7 @@ protected: // Returns true on successful activation of standby session virtual bool activateStandBySession() { return true; } - virtual void deactivateStandBySession() {} + virtual void deactivateSession() {} // Plugin specific functionality to send the composed scene to the output window or device virtual void internalPresent(); diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h index 11ea79186a..2d4a24a1fe 100644 --- a/libraries/plugins/src/plugins/Plugin.h +++ b/libraries/plugins/src/plugins/Plugin.h @@ -54,16 +54,16 @@ public: return _active; } virtual bool startStandBySession() { - _standbysessionstatus = true; - return _standbysessionstatus; + _sessionStatus = true; + return _sessionStatus; } - virtual void endStandBySession() { - _standbysessionstatus = false; + virtual void endSession() { + _sessionStatus = false; } - virtual bool isStandBySessionActive() { - return _standbysessionstatus; + virtual bool isSessionActive() { + return _sessionStatus; } /** @@ -85,7 +85,7 @@ signals: protected: bool _active { false }; - bool _standbysessionstatus { false }; + bool _sessionStatus { false }; PluginContainer* _container { nullptr }; static const char* UNKNOWN_PLUGIN_ID; diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index df98abf408..93f4787f0f 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -123,8 +123,6 @@ bool OculusBaseDisplayPlugin::internalActivate() { void OculusBaseDisplayPlugin::internalDeactivate() { Parent::internalDeactivate(); - releaseOculusSession(); - _session = nullptr; } bool OculusBaseDisplayPlugin::activateStandBySession() { @@ -134,7 +132,7 @@ bool OculusBaseDisplayPlugin::activateStandBySession() { } return true; } -void OculusBaseDisplayPlugin::deactivateStandBySession() { +void OculusBaseDisplayPlugin::deactivateSession() { releaseOculusSession(); _session = nullptr; } diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index bfdcc5db1e..5230b11681 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -35,7 +35,7 @@ protected: bool internalActivate() override; void internalDeactivate() override; bool activateStandBySession() override; - void deactivateStandBySession() override; + void deactivateSession() override; void updatePresentPose() override; protected: