From a260be9a4d4be6c26c74f7de3f006f74f48b24cc Mon Sep 17 00:00:00 2001 From: Bradley Austin Davis Date: Thu, 30 Jul 2015 12:25:15 -0700 Subject: [PATCH] HMDTools dialog restoration phase 2, electric boogaloo --- interface/src/ui/HMDToolsDialog.cpp | 37 ++++++----- .../oculus/Oculus_0_5_DisplayPlugin.cpp | 61 ++++++++++--------- .../oculus/Oculus_0_5_DisplayPlugin.h | 4 ++ 3 files changed, 55 insertions(+), 47 deletions(-) diff --git a/interface/src/ui/HMDToolsDialog.cpp b/interface/src/ui/HMDToolsDialog.cpp index 6e82fc19c4..3e349df30d 100644 --- a/interface/src/ui/HMDToolsDialog.cpp +++ b/interface/src/ui/HMDToolsDialog.cpp @@ -37,6 +37,24 @@ HMDToolsDialog::HMDToolsDialog(QWidget* parent) : _previousDialogScreen(NULL), _inHDMMode(false) { + // FIXME do we want to support more than one connected HMD? It seems like a pretty corner case + foreach(auto dp, getDisplayPlugins()) { + // The first plugin is always the standard 2D display, by convention + if (_defaultPluginName.isEmpty()) { + _defaultPluginName = dp->getName(); + continue; + } + + if (dp->isHmd()) { + // Not all HMD's have corresponding screens + if (dp->getHmdScreen() >= 0) { + _hmdScreenNumber = dp->getHmdScreen(); + } + _hmdPluginName = dp->getName(); + break; + } + } + this->setWindowTitle("HMD Tools"); // Create layouter @@ -90,25 +108,6 @@ HMDToolsDialog::HMDToolsDialog(QWidget* parent) : // keep track of changes to the number of screens connect(QApplication::desktop(), &QDesktopWidget::screenCountChanged, this, &HMDToolsDialog::screenCountChanged); - - - // FIXME do we want to support more than one connected HMD? It seems like a pretty corner case - foreach(auto dp, getDisplayPlugins()) { - // The first plugin is always the standard 2D display, by convention - if (_defaultPluginName.isEmpty()) { - _defaultPluginName = dp->getName(); - continue; - } - - if (dp->isHmd()) { - // Not all HMD's have corresponding screens - if (dp->getHmdScreen() >= 0) { - _hmdScreenNumber = dp->getHmdScreen(); - } - _hmdPluginName = dp->getName(); - break; - } - } } HMDToolsDialog::~HMDToolsDialog() { diff --git a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp index 7b4b5ddbe3..a782399c4a 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.cpp @@ -38,6 +38,7 @@ const QString & Oculus_0_5_DisplayPlugin::getName() const { return NAME; } + bool Oculus_0_5_DisplayPlugin::isSupported() const { if (!ovr_Initialize(nullptr)) { return false; @@ -46,6 +47,21 @@ bool Oculus_0_5_DisplayPlugin::isSupported() const { if (ovrHmd_Detect() > 0) { result = true; } + + auto hmd = ovrHmd_Create(0); + if (hmd) { + QPoint targetPosition{ hmd->WindowsPos.x, hmd->WindowsPos.y }; + auto screens = qApp->screens(); + for(int i = 0; i < screens.size(); ++i) { + auto screen = screens[i]; + QPoint position = screen->geometry().topLeft(); + if (position == targetPosition) { + _hmdScreen = i; + break; + } + } + } + ovr_Shutdown(); return result; } @@ -55,28 +71,18 @@ void Oculus_0_5_DisplayPlugin::activate(PluginContainer * container) { Q_ASSERT(false); qFatal("Failed to Initialize SDK"); } + _hswDismissed = false; _hmd = ovrHmd_Create(0); if (!_hmd) { qFatal("Failed to acquire HMD"); } OculusBaseDisplayPlugin::activate(container); - QScreen* target{nullptr}; - QPoint targetPosition{ _hmd->WindowsPos.x, _hmd->WindowsPos.y }; - foreach(auto screen, qApp->screens()) { - QRect screenPosition = screen->geometry(); - QPoint position = screenPosition.topLeft(); - if (position == targetPosition) { - target = screen; - break; - } + int screen = getHmdScreen(); + if (screen != -1) { + container->setFullscreen(qApp->screens()[screen]); } - - if (target) { - container->setFullscreen(target); - } - _window->installEventFilter(this); _window->makeCurrent(); ovrGLConfig config; memset(&config, 0, sizeof(ovrRenderAPIConfig)); @@ -137,19 +143,15 @@ void Oculus_0_5_DisplayPlugin::display(GLuint finalTexture, const glm::uvec2& sc bool _hswDismissed{false}; // Pass input events on to the application bool Oculus_0_5_DisplayPlugin::eventFilter(QObject* receiver, QEvent* event) { - - switch (event->type()) { - case QEvent::KeyPress: - if (!_hswDismissed) { - static ovrHSWDisplayState hswState; - ovrHmd_GetHSWDisplayState(_hmd, &hswState); - if (hswState.Displayed) { - ovrHmd_DismissHSWDisplay(_hmd); - } else { - _hswDismissed = true; - } - } - } + if (!_hswDismissed && (event->type() == QEvent::KeyPress)) { + static ovrHSWDisplayState hswState; + ovrHmd_GetHSWDisplayState(_hmd, &hswState); + if (hswState.Displayed) { + ovrHmd_DismissHSWDisplay(_hmd); + } else { + _hswDismissed = true; + } + } return OculusBaseDisplayPlugin::eventFilter(receiver, event); } @@ -159,7 +161,10 @@ bool Oculus_0_5_DisplayPlugin::eventFilter(QObject* receiver, QEvent* event) { // thread void Oculus_0_5_DisplayPlugin::finishFrame() { _window->doneCurrent(); -// _hmdWindow->doneCurrent(); }; +int Oculus_0_5_DisplayPlugin::getHmdScreen() const { + return _hmdScreen; +} + #endif diff --git a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h index 61cb71a267..f29b374833 100644 --- a/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/oculus/Oculus_0_5_DisplayPlugin.h @@ -24,6 +24,8 @@ public: virtual bool eventFilter(QObject* receiver, QEvent* event) override; + virtual int getHmdScreen() const override; + protected: virtual void preRender() override; virtual void preDisplay() override; @@ -33,6 +35,8 @@ protected: private: ovrTexture _eyeTextures[2]; + mutable int _hmdScreen{ -1 }; + bool _hswDismissed{ false }; static const QString NAME; };