From a28d74570d5d066d3bd454484617daf76a3637e1 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 25 Nov 2014 09:25:22 -0800 Subject: [PATCH 01/18] bug fixes in setFullscreen() and setEnableVRMode() --- interface/src/Application.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 58b28fcef9..cd7dc813a6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1568,6 +1568,10 @@ void Application::checkBandwidthMeterClick() { } void Application::setFullscreen(bool fullscreen) { + if (Menu::getInstance()->isOptionChecked(MenuOption::Fullscreen) != fullscreen) { + Menu::getInstance()->getActionForOption(MenuOption::Fullscreen)->setChecked(fullscreen); + } + if (Menu::getInstance()->isOptionChecked(MenuOption::EnableVRMode)) { if (fullscreen) { // Menu show() after hide() doesn't work with Rift VR display so set height instead. @@ -1578,6 +1582,7 @@ void Application::setFullscreen(bool fullscreen) { } _window->setWindowState(fullscreen ? (_window->windowState() | Qt::WindowFullScreen) : (_window->windowState() & ~Qt::WindowFullScreen)); + _window->show(); } void Application::setEnable3DTVMode(bool enable3DTVMode) { @@ -1585,6 +1590,10 @@ void Application::setEnable3DTVMode(bool enable3DTVMode) { } void Application::setEnableVRMode(bool enableVRMode) { + if (Menu::getInstance()->isOptionChecked(MenuOption::EnableVRMode) != enableVRMode) { + Menu::getInstance()->getActionForOption(MenuOption::EnableVRMode)->setChecked(enableVRMode); + } + if (enableVRMode) { if (!OculusManager::isConnected()) { // attempt to reconnect the Oculus manager - it's possible this was a workaround From e9812d060890d5a130a510378c66a812b91bb46d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 25 Nov 2014 09:25:49 -0800 Subject: [PATCH 02/18] added similarStrings() helper --- libraries/shared/src/SharedUtil.cpp | 21 +++++++++++++++++++++ libraries/shared/src/SharedUtil.h | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index c376836d24..7b5a0bb15d 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -655,3 +655,24 @@ QString formatSecondsElapsed(float seconds) { } return result; } + +bool similarStrings(const QString& stringA, const QString& stringB) { + QStringList aWords = stringA.split(" "); + QStringList bWords = stringB.split(" "); + float aWordsInB = 0.0f; + foreach(QString aWord, aWords) { + if (bWords.contains(aWord)) { + aWordsInB += 1.0f; + } + } + float bWordsInA = 0.0f; + foreach(QString bWord, bWords) { + if (aWords.contains(bWord)) { + bWordsInA += 1.0f; + } + } + float similarity = 0.5f * (aWordsInB / (float)bWords.size()) + 0.5f * (bWordsInA / (float)aWords.size()); + const float SIMILAR_ENOUGH = 0.5f; // half the words the same is similar enough for us + return similarity >= SIMILAR_ENOUGH; +} + diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index 01edcc01b9..61b7365877 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -131,6 +131,6 @@ bool isNaN(float value); QString formatUsecTime(float usecs, int prec = 3); QString formatSecondsElapsed(float seconds); - +bool similarStrings(const QString& stringA, const QString& stringB); #endif // hifi_SharedUtil_h From e35242345c2643b8f6c6c399abda7a0315e73994 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 25 Nov 2014 09:26:24 -0800 Subject: [PATCH 03/18] first cut at HMD Tools dialog --- interface/src/Application.h | 2 + interface/src/Menu.cpp | 18 ++++ interface/src/Menu.h | 6 ++ interface/src/devices/OculusManager.cpp | 64 +++++++++++- interface/src/devices/OculusManager.h | 4 + interface/src/ui/HMDToolsDialog.cpp | 131 ++++++++++++++++++++++++ interface/src/ui/HMDToolsDialog.h | 43 ++++++++ 7 files changed, 266 insertions(+), 2 deletions(-) create mode 100644 interface/src/ui/HMDToolsDialog.cpp create mode 100644 interface/src/ui/HMDToolsDialog.h diff --git a/interface/src/Application.h b/interface/src/Application.h index c75202d96f..9f2cdbd520 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -71,6 +71,7 @@ #include "scripting/ControllerScriptingInterface.h" #include "ui/BandwidthDialog.h" #include "ui/BandwidthMeter.h" +#include "ui/HMDToolsDialog.h" #include "ui/ModelsBrowser.h" #include "ui/NodeBounds.h" #include "ui/OctreeStatsDialog.h" @@ -395,6 +396,7 @@ private slots: void connectedToDomain(const QString& hostname); + friend class HMDToolsDialog; void setFullscreen(bool fullscreen); void setEnable3DTVMode(bool enable3DTVMode); void setEnableVRMode(bool enableVRMode); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index db5cd5170d..151e9682ed 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -97,6 +97,7 @@ Menu::Menu() : _jsConsole(NULL), _octreeStatsDialog(NULL), _lodToolsDialog(NULL), + _hmdToolsDialog(NULL), _newLocationDialog(NULL), _userLocationsDialog(NULL), #if defined(Q_OS_MAC) || defined(Q_OS_WIN) @@ -334,6 +335,7 @@ Menu::Menu() : appInstance, SLOT(cameraMenuChanged())); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::UserInterface, Qt::Key_Slash, true); + addActionToQMenuAndActionHash(viewMenu, MenuOption::HMDTools, 0, this, SLOT(hmdTools())); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::EnableVRMode, 0, false, appInstance, @@ -1646,6 +1648,22 @@ void Menu::lodToolsClosed() { } } +void Menu::hmdTools() { + if (!_hmdToolsDialog) { + _hmdToolsDialog = new HMDToolsDialog(Application::getInstance()->getGLWidget()); + connect(_hmdToolsDialog, SIGNAL(closed()), SLOT(hmdToolsClosed())); + _hmdToolsDialog->show(); + } + _hmdToolsDialog->raise(); +} + +void Menu::hmdToolsClosed() { + if (_hmdToolsDialog) { + delete _hmdToolsDialog; + _hmdToolsDialog = NULL; + } +} + void Menu::cycleFrustumRenderMode() { _frustumDrawMode = (FrustumDrawMode)((_frustumDrawMode + 1) % FRUSTUM_DRAW_MODE_COUNT); updateFrustumRenderModeAction(); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 7e153eba5e..e41e2f35ea 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -76,6 +76,7 @@ class QSettings; class AnimationsDialog; class AttachmentsDialog; class BandwidthDialog; +class HMDToolsDialog; class LodToolsDialog; class MetavoxelEditor; class MetavoxelNetworkSimulator; @@ -120,6 +121,7 @@ public: ViewFrustumOffset getViewFrustumOffset() const { return _viewFrustumOffset; } OctreeStatsDialog* getOctreeStatsDialog() const { return _octreeStatsDialog; } LodToolsDialog* getLodToolsDialog() const { return _lodToolsDialog; } + HMDToolsDialog* getHMDToolsDialog() const { return _hmdToolsDialog; } int getMaxVoxels() const { return _maxVoxels; } QAction* getUseVoxelShader() const { return _useVoxelShader; } @@ -183,6 +185,7 @@ public slots: void bandwidthDetails(); void octreeStatsDetails(); void lodTools(); + void hmdTools(); void loadSettings(QSettings* settings = NULL); void saveSettings(QSettings* settings = NULL); void importSettings(); @@ -217,6 +220,7 @@ private slots: void bandwidthDetailsClosed(); void octreeStatsDetailsClosed(); void lodToolsClosed(); + void hmdToolsClosed(); void cycleFrustumRenderMode(); void runTests(); void showMetavoxelEditor(); @@ -284,6 +288,7 @@ private: QDialog* _jsConsole; OctreeStatsDialog* _octreeStatsDialog; LodToolsDialog* _lodToolsDialog; + HMDToolsDialog* _hmdToolsDialog; QPointer _newLocationDialog; QPointer _userLocationsDialog; #if defined(Q_OS_MAC) || defined(Q_OS_WIN) @@ -412,6 +417,7 @@ namespace MenuOption { const QString NamesAboveHeads = "Names Above Heads"; const QString GoToUser = "Go To User"; const QString HeadMouse = "Head Mouse"; + const QString HMDTools = "HMD Tools"; const QString IncreaseAvatarSize = "Increase Avatar Size"; const QString IncreaseVoxelSize = "Increase Voxel Size"; const QString KeyboardMotorControl = "Enable Keyboard Motor Control"; diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index e68a08a8f4..dfec98c358 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -14,9 +14,14 @@ #include "OculusManager.h" +#include +#include #include +#include #include + +#include #include #include "Application.h" @@ -75,9 +80,7 @@ glm::vec3 OculusManager::_rightEyePosition = glm::vec3(); void OculusManager::connect() { #ifdef HAVE_LIBOVR _calibrationState = UNCALIBRATED; - qDebug() << "Oculus SDK" << OVR_VERSION_STRING; - ovr_Initialize(); _ovrHmd = ovrHmd_Create(0); @@ -86,6 +89,7 @@ void OculusManager::connect() { UserActivityLogger::getInstance().connectedDevice("hmd", "oculus"); } _isConnected = true; + #if defined(__APPLE__) || defined(_WIN32) _eyeFov[0] = _ovrHmd->DefaultEyeFov[0]; _eyeFov[1] = _ovrHmd->DefaultEyeFov[1]; @@ -715,3 +719,59 @@ void OculusManager::overrideOffAxisFrustum(float& left, float& right, float& bot } #endif } + +int OculusManager::getHMDScreen() { + int hmdScreenIndex = -1; // unknown +#ifdef HAVE_LIBOVR + // TODO: it might be smarter to handle multiple HMDs connected in this case. but for now, + // we will simply assume the initialization code that set up _ovrHmd picked the best hmd + + if (_ovrHmd) { + QString productNameFromOVR = _ovrHmd->ProductName; + + int hmdWidth = _ovrHmd->Resolution.w; + int hmdHeight = _ovrHmd->Resolution.h; + int hmdAtX = _ovrHmd->WindowsPos.x; + int hmdAtY = _ovrHmd->WindowsPos.y; + + // we will score the likelihood that each screen is a match based on the following + // rubrik of potential matching features + const int EXACT_NAME_MATCH = 100; + const int SIMILAR_NAMES = 10; + const int EXACT_LOCATION_MATCH = 50; + const int EXACT_RESOLUTION_MATCH = 25; + + int bestMatchScore = 0; + + // look at the display list and see if we can find the best match + QDesktopWidget* desktop = QApplication::desktop(); + int screenNumber = 0; + foreach (QScreen* screen, QGuiApplication::screens()) { + QString screenName = screen->name(); + QRect screenRect = desktop->screenGeometry(screenNumber); + + int screenScore = 0; + if (screenName == productNameFromOVR) { + screenScore += EXACT_NAME_MATCH; + } + if (similarStrings(screenName, productNameFromOVR)) { + screenScore += SIMILAR_NAMES; + } + if (hmdWidth == screenRect.width() && hmdHeight == screenRect.height()) { + screenScore += EXACT_RESOLUTION_MATCH; + } + if (hmdAtX == screenRect.x() && hmdAtY == screenRect.y()) { + screenScore += EXACT_LOCATION_MATCH; + } + if (screenScore > bestMatchScore) { + bestMatchScore = screenScore; + hmdScreenIndex = screenNumber; + } + + screenNumber++; + } + } +#endif + return hmdScreenIndex; +} + diff --git a/interface/src/devices/OculusManager.h b/interface/src/devices/OculusManager.h index 20e43d572c..2e0354f61a 100644 --- a/interface/src/devices/OculusManager.h +++ b/interface/src/devices/OculusManager.h @@ -52,11 +52,15 @@ public: static glm::vec3 getLeftEyePosition() { return _leftEyePosition; } static glm::vec3 getRightEyePosition() { return _rightEyePosition; } + static int getHMDScreen(); + private: #ifdef HAVE_LIBOVR static void generateDistortionMesh(); static void renderDistortionMesh(ovrPosef eyeRenderPose[ovrEye_Count]); + static bool similarNames(const QString& nameA,const QString& nameB); + struct DistortionVertex { glm::vec2 pos; glm::vec2 texR; diff --git a/interface/src/ui/HMDToolsDialog.cpp b/interface/src/ui/HMDToolsDialog.cpp new file mode 100644 index 0000000000..11cc652c37 --- /dev/null +++ b/interface/src/ui/HMDToolsDialog.cpp @@ -0,0 +1,131 @@ +// +// HMDToolsDialog.cpp +// interface/src/ui +// +// Created by Brad Hefta-Gaub on 7/19/13. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include "Menu.h" +#include "devices/OculusManager.h" +#include "ui/HMDToolsDialog.h" + + +HMDToolsDialog::HMDToolsDialog(QWidget* parent) : + QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint) +{ + this->setWindowTitle("HMD Tools"); + + // Create layouter + QFormLayout* form = new QFormLayout(); + + // Add a button to enter + QPushButton* enterModeButton = new QPushButton("Enter HMD Mode"); + form->addRow("", enterModeButton); + connect(enterModeButton,SIGNAL(clicked(bool)),this,SLOT(enterModeClicked(bool))); + + // Add a button to leave + QPushButton* leaveModeButton = new QPushButton("Leave HMD Mode"); + form->addRow("", leaveModeButton); + connect(leaveModeButton,SIGNAL(clicked(bool)),this,SLOT(leaveModeClicked(bool))); + + this->QDialog::setLayout(form); + + + _wasMoved = false; + + _previousRect = Application::getInstance()->getWindow()->rect(); + + + // QDesktopWidget::screenCountChanged() SIGNAL +} + +HMDToolsDialog::~HMDToolsDialog() { +} + +void HMDToolsDialog::enterModeClicked(bool checked) { + qDebug() << "enterModeClicked"; + + int hmdScreen = OculusManager::getHMDScreen(); + + // hack to test... + if (hmdScreen == -1) { + hmdScreen = 0; + } + + if (hmdScreen >= 0) { + QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); + QScreen* targetScreen = QGuiApplication::screens()[hmdScreen]; + + _previousRect = Application::getInstance()->getWindow()->rect(); + qDebug() << "_previousRect:" << _previousRect; + _previousRect = QRect(mainWindow->mapToGlobal(_previousRect.topLeft()), + mainWindow->mapToGlobal(_previousRect.bottomRight())); + qDebug() << "after mapping... _previousRect:" << _previousRect; + + _previousScreen = mainWindow->screen(); + qDebug() << "_previousScreen:" << _previousScreen; + + QRect rect = QApplication::desktop()->screenGeometry(hmdScreen); + + qDebug() << "about to move to:" << rect.topLeft(); + + mainWindow->setScreen(targetScreen); + mainWindow->setGeometry(rect); + + _wasMoved = true; + } + Application::getInstance()->setFullscreen(true); + Application::getInstance()->setEnableVRMode(true); +} + +void HMDToolsDialog::moveWindowAfterLeaveMode() { + qDebug() << "moveWindowAfterLeaveMode"; + QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); + mainWindow->setScreen(_previousScreen); + mainWindow->setGeometry(_previousRect); +} + +void HMDToolsDialog::leaveModeClicked(bool checked) { + qDebug() << "leaveModeClicked"; + + Application::getInstance()->setFullscreen(false); + Application::getInstance()->setEnableVRMode(false); + + if (_wasMoved) { + QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); + mainWindow->setScreen(_previousScreen); + mainWindow->setGeometry(_previousRect); + + const int SLIGHT_DELAY = 1500; + QTimer::singleShot(SLIGHT_DELAY, this, SLOT(moveWindowAfterLeaveMode())); + } + _wasMoved = false; +} + +void HMDToolsDialog::reject() { + // Just regularly close upon ESC + this->QDialog::close(); +} + +void HMDToolsDialog::closeEvent(QCloseEvent* event) { + this->QDialog::closeEvent(event); + emit closed(); +} + + diff --git a/interface/src/ui/HMDToolsDialog.h b/interface/src/ui/HMDToolsDialog.h new file mode 100644 index 0000000000..ac6bebc5f4 --- /dev/null +++ b/interface/src/ui/HMDToolsDialog.h @@ -0,0 +1,43 @@ +// +// HMDToolsDialog.h +// interface/src/ui +// +// Created by Brad Hefta-Gaub on 7/19/13. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_HMDToolsDialog_h +#define hifi_HMDToolsDialog_h + +#include + +class HMDToolsDialog : public QDialog { + Q_OBJECT +public: + // Sets up the UI + HMDToolsDialog(QWidget* parent); + ~HMDToolsDialog(); + +signals: + void closed(); + +public slots: + void reject(); + void enterModeClicked(bool checked); + void leaveModeClicked(bool checked); + void moveWindowAfterLeaveMode(); + +protected: + // Emits a 'closed' signal when this dialog is closed. + void closeEvent(QCloseEvent*); + +private: + bool _wasMoved; + QRect _previousRect; + QScreen* _previousScreen; +}; + +#endif // hifi_HMDToolsDialog_h From 6108f7d9cd1e60c2bfdc465c09e50b030c8808be Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 25 Nov 2014 12:45:20 -0800 Subject: [PATCH 04/18] fix bug in resetSensors moving cursor to center of window on multiple screen systems --- interface/src/Application.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cd7dc813a6..90b4501662 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3502,7 +3502,6 @@ void Application::deleteVoxelAt(const VoxelDetail& voxel) { } } - void Application::resetSensors() { _mouseX = _glWidget->width() / 2; _mouseY = _glWidget->height() / 2; @@ -3516,7 +3515,11 @@ void Application::resetSensors() { _prioVR.reset(); //_leapmotion.reset(); - QCursor::setPos(_mouseX, _mouseY); + QScreen* currentScreen = _window->windowHandle()->screen(); + QWindow* mainWindow = _window->windowHandle(); + QPoint windowCenter = mainWindow->geometry().center(); + QCursor::setPos(currentScreen, windowCenter); + _myAvatar->reset(); QMetaObject::invokeMethod(&_audio, "reset", Qt::QueuedConnection); From bc376a0a15cec15a5e935f74a32cd2f794d7b226 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 25 Nov 2014 12:46:00 -0800 Subject: [PATCH 05/18] more improvements to HMD Tools --- interface/src/ui/HMDToolsDialog.cpp | 34 ++++++++++++++++++++++------- interface/src/ui/HMDToolsDialog.h | 2 ++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/interface/src/ui/HMDToolsDialog.cpp b/interface/src/ui/HMDToolsDialog.cpp index 11cc652c37..4f4c624065 100644 --- a/interface/src/ui/HMDToolsDialog.cpp +++ b/interface/src/ui/HMDToolsDialog.cpp @@ -51,8 +51,8 @@ HMDToolsDialog::HMDToolsDialog(QWidget* parent) : _previousRect = Application::getInstance()->getWindow()->rect(); - - // QDesktopWidget::screenCountChanged() SIGNAL + + Application::getInstance()->getWindow()->activateWindow(); } HMDToolsDialog::~HMDToolsDialog() { @@ -70,7 +70,7 @@ void HMDToolsDialog::enterModeClicked(bool checked) { if (hmdScreen >= 0) { QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); - QScreen* targetScreen = QGuiApplication::screens()[hmdScreen]; + _hmdScreen = QGuiApplication::screens()[hmdScreen]; _previousRect = Application::getInstance()->getWindow()->rect(); qDebug() << "_previousRect:" << _previousRect; @@ -85,27 +85,36 @@ void HMDToolsDialog::enterModeClicked(bool checked) { qDebug() << "about to move to:" << rect.topLeft(); - mainWindow->setScreen(targetScreen); + mainWindow->setScreen(_hmdScreen); mainWindow->setGeometry(rect); _wasMoved = true; } Application::getInstance()->setFullscreen(true); Application::getInstance()->setEnableVRMode(true); + + const int SLIGHT_DELAY = 500; + QTimer::singleShot(SLIGHT_DELAY, this, SLOT(activateWindowAfterEnterMode())); } -void HMDToolsDialog::moveWindowAfterLeaveMode() { - qDebug() << "moveWindowAfterLeaveMode"; +void HMDToolsDialog::activateWindowAfterEnterMode() { + qDebug() << "activateWindowAfterEnterMode"; + Application::getInstance()->getWindow()->activateWindow(); + QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); - mainWindow->setScreen(_previousScreen); - mainWindow->setGeometry(_previousRect); + QPoint windowCenter = mainWindow->geometry().center(); + //QPoint desktopCenter = mainWindow->mapToGlobal(windowCenter); + qDebug() << "windowCenter:" << windowCenter; + QCursor::setPos(_hmdScreen, windowCenter); } + void HMDToolsDialog::leaveModeClicked(bool checked) { qDebug() << "leaveModeClicked"; Application::getInstance()->setFullscreen(false); Application::getInstance()->setEnableVRMode(false); + Application::getInstance()->getWindow()->activateWindow(); if (_wasMoved) { QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); @@ -118,6 +127,15 @@ void HMDToolsDialog::leaveModeClicked(bool checked) { _wasMoved = false; } +void HMDToolsDialog::moveWindowAfterLeaveMode() { + qDebug() << "moveWindowAfterLeaveMode"; + QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); + mainWindow->setScreen(_previousScreen); + mainWindow->setGeometry(_previousRect); + Application::getInstance()->getWindow()->activateWindow(); +} + + void HMDToolsDialog::reject() { // Just regularly close upon ESC this->QDialog::close(); diff --git a/interface/src/ui/HMDToolsDialog.h b/interface/src/ui/HMDToolsDialog.h index ac6bebc5f4..9620a0529d 100644 --- a/interface/src/ui/HMDToolsDialog.h +++ b/interface/src/ui/HMDToolsDialog.h @@ -28,6 +28,7 @@ public slots: void reject(); void enterModeClicked(bool checked); void leaveModeClicked(bool checked); + void activateWindowAfterEnterMode(); void moveWindowAfterLeaveMode(); protected: @@ -38,6 +39,7 @@ private: bool _wasMoved; QRect _previousRect; QScreen* _previousScreen; + QScreen* _hmdScreen; }; #endif // hifi_HMDToolsDialog_h From aa44906841a7129d8d9cbddc9fa5985f49fd36da Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 25 Nov 2014 13:27:16 -0800 Subject: [PATCH 06/18] make HMD tools a checkable menu --- interface/src/Menu.cpp | 24 +++++++++++++++++------- interface/src/Menu.h | 2 +- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 1c1f9aec23..ac93a71bc0 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -335,7 +335,12 @@ Menu::Menu() : appInstance, SLOT(cameraMenuChanged())); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::UserInterface, Qt::Key_Slash, true); - addActionToQMenuAndActionHash(viewMenu, MenuOption::HMDTools, 0, this, SLOT(hmdTools())); + addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::HMDTools, Qt::META | Qt::Key_H, + false, + this, + SLOT(hmdTools(bool))); + + addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::EnableVRMode, 0, false, appInstance, @@ -1596,13 +1601,18 @@ void Menu::lodToolsClosed() { } } -void Menu::hmdTools() { - if (!_hmdToolsDialog) { - _hmdToolsDialog = new HMDToolsDialog(Application::getInstance()->getGLWidget()); - connect(_hmdToolsDialog, SIGNAL(closed()), SLOT(hmdToolsClosed())); - _hmdToolsDialog->show(); +void Menu::hmdTools(bool showTools) { + if (showTools) { + if (!_hmdToolsDialog) { + _hmdToolsDialog = new HMDToolsDialog(Application::getInstance()->getGLWidget()); + connect(_hmdToolsDialog, SIGNAL(closed()), SLOT(hmdToolsClosed())); + _hmdToolsDialog->show(); + } + _hmdToolsDialog->raise(); + } else { + hmdToolsClosed(); } - _hmdToolsDialog->raise(); + Application::getInstance()->getWindow()->activateWindow(); } void Menu::hmdToolsClosed() { diff --git a/interface/src/Menu.h b/interface/src/Menu.h index db836dc690..0d46c4020d 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -185,7 +185,7 @@ public slots: void bandwidthDetails(); void octreeStatsDetails(); void lodTools(); - void hmdTools(); + void hmdTools(bool showTools); void loadSettings(QSettings* settings = NULL); void saveSettings(QSettings* settings = NULL); void importSettings(); From f111fb2c4b0211a8151356b0ee5d3988dafbaa67 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 25 Nov 2014 20:36:39 -0800 Subject: [PATCH 07/18] added a comment to clarify why getCameraOrientation has an oculus special case --- interface/src/avatar/Head.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index e237d0ae6b..9f59fb38b7 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -273,7 +273,8 @@ void Head::setCorrectedLookAtPosition(glm::vec3 correctedLookAtPosition) { _correctedLookAtPosition = correctedLookAtPosition; } -glm::quat Head::getCameraOrientation () const { +glm::quat Head::getCameraOrientation() const { + // this is used to support driving toward where you're head is looking if (OculusManager::isConnected()) { return getOrientation(); } From e94db7bbc2b12010dfa31e9d0da5b4de603d4d53 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 25 Nov 2014 20:37:13 -0800 Subject: [PATCH 08/18] removed some debug, added a resetSensors() on exit of HMD mode --- interface/src/ui/HMDToolsDialog.cpp | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/interface/src/ui/HMDToolsDialog.cpp b/interface/src/ui/HMDToolsDialog.cpp index 4f4c624065..1e251248c3 100644 --- a/interface/src/ui/HMDToolsDialog.cpp +++ b/interface/src/ui/HMDToolsDialog.cpp @@ -59,32 +59,17 @@ HMDToolsDialog::~HMDToolsDialog() { } void HMDToolsDialog::enterModeClicked(bool checked) { - qDebug() << "enterModeClicked"; - int hmdScreen = OculusManager::getHMDScreen(); - // hack to test... - if (hmdScreen == -1) { - hmdScreen = 0; - } - if (hmdScreen >= 0) { QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); _hmdScreen = QGuiApplication::screens()[hmdScreen]; _previousRect = Application::getInstance()->getWindow()->rect(); - qDebug() << "_previousRect:" << _previousRect; _previousRect = QRect(mainWindow->mapToGlobal(_previousRect.topLeft()), mainWindow->mapToGlobal(_previousRect.bottomRight())); - qDebug() << "after mapping... _previousRect:" << _previousRect; - _previousScreen = mainWindow->screen(); - qDebug() << "_previousScreen:" << _previousScreen; - QRect rect = QApplication::desktop()->screenGeometry(hmdScreen); - - qDebug() << "about to move to:" << rect.topLeft(); - mainWindow->setScreen(_hmdScreen); mainWindow->setGeometry(rect); @@ -98,20 +83,14 @@ void HMDToolsDialog::enterModeClicked(bool checked) { } void HMDToolsDialog::activateWindowAfterEnterMode() { - qDebug() << "activateWindowAfterEnterMode"; Application::getInstance()->getWindow()->activateWindow(); - QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); QPoint windowCenter = mainWindow->geometry().center(); - //QPoint desktopCenter = mainWindow->mapToGlobal(windowCenter); - qDebug() << "windowCenter:" << windowCenter; QCursor::setPos(_hmdScreen, windowCenter); } void HMDToolsDialog::leaveModeClicked(bool checked) { - qDebug() << "leaveModeClicked"; - Application::getInstance()->setFullscreen(false); Application::getInstance()->setEnableVRMode(false); Application::getInstance()->getWindow()->activateWindow(); @@ -128,11 +107,11 @@ void HMDToolsDialog::leaveModeClicked(bool checked) { } void HMDToolsDialog::moveWindowAfterLeaveMode() { - qDebug() << "moveWindowAfterLeaveMode"; QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); mainWindow->setScreen(_previousScreen); mainWindow->setGeometry(_previousRect); Application::getInstance()->getWindow()->activateWindow(); + Application::getInstance()->resetSensors(); } From 53ecf97df2d25a58c502b78c856f5eb849941c64 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 25 Nov 2014 21:58:26 -0800 Subject: [PATCH 09/18] fix broken camera after leaving oculus/hmd mode --- interface/src/Application.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 31b1dd66f6..1a7ccf21ee 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -668,6 +668,8 @@ void Application::paintGL() { // Update camera position if (!OculusManager::isConnected()) { + _myCamera.setHmdPosition(glm::vec3()); + _myCamera.setHmdRotation(glm::quat()); _myCamera.update(1.0f / _fps); } From ee46c781c46ed56313656e7fc8a328a1935d2997 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Nov 2014 08:40:11 -0800 Subject: [PATCH 10/18] expand comment --- interface/src/avatar/Head.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 9f59fb38b7..660ebfcbb3 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -274,7 +274,11 @@ void Head::setCorrectedLookAtPosition(glm::vec3 correctedLookAtPosition) { } glm::quat Head::getCameraOrientation() const { - // this is used to support driving toward where you're head is looking + // NOTE: Head::getCameraOrientation() is not used for orienting the camera "view" while in Oculus mode, so + // you may wonder why this code is here. This method will be called while in Oculus mode to determine how + // to change the driving direction while in Oculus mode. It is used to support driving toward where you're + // head is looking. Note that in oculus mode, your actual camera view and where your head is looking is not + // always the same. if (OculusManager::isConnected()) { return getOrientation(); } From 821cf46ee99b11545d56a0f83560f0e6d057c1f5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Nov 2014 09:11:26 -0800 Subject: [PATCH 11/18] don't delete the HMDToolsDialog on hide, keep it around till app exit. --- interface/src/Menu.cpp | 12 +++++++----- interface/src/ui/HMDToolsDialog.cpp | 3 +++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ac93a71bc0..2c7b4a9efd 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -659,6 +659,10 @@ Menu::Menu() : Menu::~Menu() { bandwidthDetailsClosed(); octreeStatsDetailsClosed(); + if (_hmdToolsDialog) { + delete _hmdToolsDialog; + _hmdToolsDialog = NULL; + } } void Menu::loadSettings(QSettings* settings) { @@ -1606,8 +1610,8 @@ void Menu::hmdTools(bool showTools) { if (!_hmdToolsDialog) { _hmdToolsDialog = new HMDToolsDialog(Application::getInstance()->getGLWidget()); connect(_hmdToolsDialog, SIGNAL(closed()), SLOT(hmdToolsClosed())); - _hmdToolsDialog->show(); } + _hmdToolsDialog->show(); _hmdToolsDialog->raise(); } else { hmdToolsClosed(); @@ -1616,10 +1620,8 @@ void Menu::hmdTools(bool showTools) { } void Menu::hmdToolsClosed() { - if (_hmdToolsDialog) { - delete _hmdToolsDialog; - _hmdToolsDialog = NULL; - } + Menu::getInstance()->getActionForOption(MenuOption::HMDTools)->setChecked(false); + _hmdToolsDialog->hide(); } void Menu::cycleFrustumRenderMode() { diff --git a/interface/src/ui/HMDToolsDialog.cpp b/interface/src/ui/HMDToolsDialog.cpp index 1e251248c3..3cbbb5daf2 100644 --- a/interface/src/ui/HMDToolsDialog.cpp +++ b/interface/src/ui/HMDToolsDialog.cpp @@ -123,6 +123,9 @@ void HMDToolsDialog::reject() { void HMDToolsDialog::closeEvent(QCloseEvent* event) { this->QDialog::closeEvent(event); emit closed(); + + // TODO: consider if we want to prevent closing of this window + //event->ignore(); } From 59eeeb90067462a0fbd94976de15fab2f4034c51 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Nov 2014 10:11:29 -0800 Subject: [PATCH 12/18] add debug details to HMDTools --- interface/src/ui/HMDToolsDialog.cpp | 43 ++++++++++++++++++++++++++--- interface/src/ui/HMDToolsDialog.h | 4 +++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/HMDToolsDialog.cpp b/interface/src/ui/HMDToolsDialog.cpp index 3cbbb5daf2..80fb6a93d6 100644 --- a/interface/src/ui/HMDToolsDialog.cpp +++ b/interface/src/ui/HMDToolsDialog.cpp @@ -44,20 +44,52 @@ HMDToolsDialog::HMDToolsDialog(QWidget* parent) : form->addRow("", leaveModeButton); connect(leaveModeButton,SIGNAL(clicked(bool)),this,SLOT(leaveModeClicked(bool))); + // Create a label with debug details... + _debugDetails = new QLabel(); + _debugDetails->setText(getDebugDetails()); + const int WIDTH = 350; + const int HEIGHT = 100; + _debugDetails->setFixedSize(WIDTH, HEIGHT); + form->addRow("", _debugDetails); + this->QDialog::setLayout(form); - _wasMoved = false; - _previousRect = Application::getInstance()->getWindow()->rect(); - - Application::getInstance()->getWindow()->activateWindow(); + + QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); + connect(mainWindow, &QWindow::screenChanged, this, &HMDToolsDialog::applicationWindowScreenChanged); } HMDToolsDialog::~HMDToolsDialog() { } +void HMDToolsDialog::applicationWindowScreenChanged(QScreen* screen) { + _debugDetails->setText(getDebugDetails()); +} + +QString HMDToolsDialog::getDebugDetails() const { + QString results; + + int hmdScreenNumber = OculusManager::getHMDScreen(); + if (hmdScreenNumber > 0) { + results += "HMD Screen: " + QGuiApplication::screens()[hmdScreenNumber]->name() + "\n"; + } else { + results += "HMD Screen Name: Unknown\n"; + } + + int desktopPrimaryScreenNumber = QApplication::desktop()->primaryScreen(); + QScreen* desktopPrimaryScreen = QGuiApplication::screens()[desktopPrimaryScreenNumber]; + results += "Desktop's Primary Screen: " + desktopPrimaryScreen->name() + "\n"; + + results += "Application Primary Screen: " + QGuiApplication::primaryScreen()->name() + "\n"; + QScreen* mainWindowScreen = Application::getInstance()->getWindow()->windowHandle()->screen(); + results += "Application Main Window Screen: " + mainWindowScreen->name() + "\n"; + + return results; +} + void HMDToolsDialog::enterModeClicked(bool checked) { int hmdScreen = OculusManager::getHMDScreen(); @@ -74,6 +106,9 @@ void HMDToolsDialog::enterModeClicked(bool checked) { mainWindow->setGeometry(rect); _wasMoved = true; + } else { + // if we're on a single screen setup, then hide our tools window when entering HMD mode + hide(); } Application::getInstance()->setFullscreen(true); Application::getInstance()->setEnableVRMode(true); diff --git a/interface/src/ui/HMDToolsDialog.h b/interface/src/ui/HMDToolsDialog.h index 9620a0529d..c2a36f5a30 100644 --- a/interface/src/ui/HMDToolsDialog.h +++ b/interface/src/ui/HMDToolsDialog.h @@ -20,6 +20,8 @@ public: // Sets up the UI HMDToolsDialog(QWidget* parent); ~HMDToolsDialog(); + + QString getDebugDetails() const; signals: void closed(); @@ -30,6 +32,7 @@ public slots: void leaveModeClicked(bool checked); void activateWindowAfterEnterMode(); void moveWindowAfterLeaveMode(); + void applicationWindowScreenChanged(QScreen* screen); protected: // Emits a 'closed' signal when this dialog is closed. @@ -40,6 +43,7 @@ private: QRect _previousRect; QScreen* _previousScreen; QScreen* _hmdScreen; + QLabel* _debugDetails; }; #endif // hifi_HMDToolsDialog_h From c58061792198f2693578edb456ba2e45b9b38776 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Nov 2014 10:23:44 -0800 Subject: [PATCH 13/18] better mirrored monitor support --- interface/src/ui/HMDToolsDialog.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/interface/src/ui/HMDToolsDialog.cpp b/interface/src/ui/HMDToolsDialog.cpp index 80fb6a93d6..70d5d836fc 100644 --- a/interface/src/ui/HMDToolsDialog.cpp +++ b/interface/src/ui/HMDToolsDialog.cpp @@ -73,7 +73,7 @@ QString HMDToolsDialog::getDebugDetails() const { QString results; int hmdScreenNumber = OculusManager::getHMDScreen(); - if (hmdScreenNumber > 0) { + if (hmdScreenNumber >= 0) { results += "HMD Screen: " + QGuiApplication::screens()[hmdScreenNumber]->name() + "\n"; } else { results += "HMD Screen Name: Unknown\n"; @@ -91,7 +91,10 @@ QString HMDToolsDialog::getDebugDetails() const { } void HMDToolsDialog::enterModeClicked(bool checked) { + _debugDetails->setText(getDebugDetails()); + int hmdScreen = OculusManager::getHMDScreen(); + qDebug() << "enterModeClicked().... hmdScreen:" << hmdScreen; if (hmdScreen >= 0) { QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); @@ -106,10 +109,14 @@ void HMDToolsDialog::enterModeClicked(bool checked) { mainWindow->setGeometry(rect); _wasMoved = true; - } else { - // if we're on a single screen setup, then hide our tools window when entering HMD mode - hide(); } + + + // if we're on a single screen setup, then hide our tools window when entering HMD mode + if (QApplication::desktop()->screenCount() == 1) { + close(); + } + Application::getInstance()->setFullscreen(true); Application::getInstance()->setEnableVRMode(true); @@ -126,6 +133,8 @@ void HMDToolsDialog::activateWindowAfterEnterMode() { void HMDToolsDialog::leaveModeClicked(bool checked) { + _debugDetails->setText(getDebugDetails()); + Application::getInstance()->setFullscreen(false); Application::getInstance()->setEnableVRMode(false); Application::getInstance()->getWindow()->activateWindow(); @@ -152,15 +161,13 @@ void HMDToolsDialog::moveWindowAfterLeaveMode() { void HMDToolsDialog::reject() { // Just regularly close upon ESC - this->QDialog::close(); + close(); } void HMDToolsDialog::closeEvent(QCloseEvent* event) { + // TODO: consider if we want to prevent closing of this window with event->ignore(); this->QDialog::closeEvent(event); emit closed(); - - // TODO: consider if we want to prevent closing of this window - //event->ignore(); } From ad6680553c643bbb9f7d2b9d3c53127e09667e9a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Nov 2014 10:46:47 -0800 Subject: [PATCH 14/18] snap cursor to center of HMD tools dialog when shown, or app when the dialog is hidden --- interface/src/ui/HMDToolsDialog.cpp | 15 +++++++++++++++ interface/src/ui/HMDToolsDialog.h | 7 +++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/HMDToolsDialog.cpp b/interface/src/ui/HMDToolsDialog.cpp index 70d5d836fc..141b0d61ad 100644 --- a/interface/src/ui/HMDToolsDialog.cpp +++ b/interface/src/ui/HMDToolsDialog.cpp @@ -170,4 +170,19 @@ void HMDToolsDialog::closeEvent(QCloseEvent* event) { emit closed(); } +void HMDToolsDialog::centerCursorOnWidget(QWidget* widget) { + QWindow* window = widget->windowHandle(); + QScreen* screen = window->screen(); + QPoint windowCenter = window->geometry().center(); + QCursor::setPos(screen, windowCenter); +} + +void HMDToolsDialog::showEvent(QShowEvent* event) { + centerCursorOnWidget(this); +} + +void HMDToolsDialog::hideEvent(QHideEvent* event) { + centerCursorOnWidget(Application::getInstance()->getWindow()); +} + diff --git a/interface/src/ui/HMDToolsDialog.h b/interface/src/ui/HMDToolsDialog.h index c2a36f5a30..f1a5f582cd 100644 --- a/interface/src/ui/HMDToolsDialog.h +++ b/interface/src/ui/HMDToolsDialog.h @@ -35,10 +35,13 @@ public slots: void applicationWindowScreenChanged(QScreen* screen); protected: - // Emits a 'closed' signal when this dialog is closed. - void closeEvent(QCloseEvent*); + virtual void closeEvent(QCloseEvent*); // Emits a 'closed' signal when this dialog is closed. + virtual void showEvent(QShowEvent* event); + virtual void hideEvent(QHideEvent* event); private: + void centerCursorOnWidget(QWidget* widget); + bool _wasMoved; QRect _previousRect; QScreen* _previousScreen; From 0c5a97841185dd5db6728116db07f86c96a84a89 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Nov 2014 10:53:38 -0800 Subject: [PATCH 15/18] fix crash in activateWindowAfterEnterMode in no oculus case --- interface/src/ui/HMDToolsDialog.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/interface/src/ui/HMDToolsDialog.cpp b/interface/src/ui/HMDToolsDialog.cpp index 141b0d61ad..9a409b17f1 100644 --- a/interface/src/ui/HMDToolsDialog.cpp +++ b/interface/src/ui/HMDToolsDialog.cpp @@ -126,9 +126,9 @@ void HMDToolsDialog::enterModeClicked(bool checked) { void HMDToolsDialog::activateWindowAfterEnterMode() { Application::getInstance()->getWindow()->activateWindow(); - QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); - QPoint windowCenter = mainWindow->geometry().center(); - QCursor::setPos(_hmdScreen, windowCenter); + + // center the cursor on the main application window + centerCursorOnWidget(Application::getInstance()->getWindow()); } @@ -178,10 +178,12 @@ void HMDToolsDialog::centerCursorOnWidget(QWidget* widget) { } void HMDToolsDialog::showEvent(QShowEvent* event) { + // center the cursor on the hmd tools dialog centerCursorOnWidget(this); } void HMDToolsDialog::hideEvent(QHideEvent* event) { + // center the cursor on the main application window centerCursorOnWidget(Application::getInstance()->getWindow()); } From 208eb663bddb8a8bda402263a72a24fd7dba6202 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Nov 2014 12:07:39 -0800 Subject: [PATCH 16/18] prevent HMD tools from being moved to HMD screen --- interface/src/ui/HMDToolsDialog.cpp | 70 ++++++++++++++++++++++++++++- interface/src/ui/HMDToolsDialog.h | 5 +++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/HMDToolsDialog.cpp b/interface/src/ui/HMDToolsDialog.cpp index 9a409b17f1..a5e54fa546 100644 --- a/interface/src/ui/HMDToolsDialog.cpp +++ b/interface/src/ui/HMDToolsDialog.cpp @@ -27,7 +27,10 @@ HMDToolsDialog::HMDToolsDialog(QWidget* parent) : - QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint) + QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint) , + _previousScreen(NULL), + _hmdScreen(NULL), + _previousDialogScreen(NULL) { this->setWindowTitle("HMD Tools"); @@ -58,8 +61,18 @@ HMDToolsDialog::HMDToolsDialog(QWidget* parent) : _previousRect = Application::getInstance()->getWindow()->rect(); Application::getInstance()->getWindow()->activateWindow(); + // watch for our application window moving screens. If it does we want to update our screen details QWindow* mainWindow = Application::getInstance()->getWindow()->windowHandle(); connect(mainWindow, &QWindow::screenChanged, this, &HMDToolsDialog::applicationWindowScreenChanged); + + // watch for our dialog window moving screens. If it does we want to enforce our rules about what screens we're + // allowed on + QWindow* dialogWindow = windowHandle(); + connect(dialogWindow, &QWindow::screenChanged, this, &HMDToolsDialog::dialogWindowScreenChanged); + connect(dialogWindow, &QWindow::xChanged, this, &HMDToolsDialog::dialogWindowGeometryChanged); + connect(dialogWindow, &QWindow::yChanged, this, &HMDToolsDialog::dialogWindowGeometryChanged); + connect(dialogWindow, &QWindow::widthChanged, this, &HMDToolsDialog::dialogWindowGeometryChanged); + connect(dialogWindow, &QWindow::heightChanged, this, &HMDToolsDialog::dialogWindowGeometryChanged); } HMDToolsDialog::~HMDToolsDialog() { @@ -69,6 +82,61 @@ void HMDToolsDialog::applicationWindowScreenChanged(QScreen* screen) { _debugDetails->setText(getDebugDetails()); } +void HMDToolsDialog::dialogWindowGeometryChanged(int arg) { + QWindow* dialogWindow = windowHandle(); + _previousDialogRect = rect(); + _previousDialogRect = QRect(dialogWindow->mapToGlobal(_previousDialogRect.topLeft()), + dialogWindow->mapToGlobal(_previousDialogRect.bottomRight())); + _previousDialogScreen = dialogWindow->screen(); +} + +void HMDToolsDialog::dialogWindowScreenChanged(QScreen* screen) { + _debugDetails->setText(getDebugDetails()); + + // if we have more than one screen, and a known hmdScreen then try to + // keep our dialog off of the hmdScreen + if (QApplication::desktop()->screenCount() > 1) { + int hmdScreenNumber = OculusManager::getHMDScreen(); + + if (hmdScreenNumber >= 0) { + QScreen* hmdScreen = QGuiApplication::screens()[hmdScreenNumber]; + + if (screen == hmdScreen) { + qDebug() << "HMD Tools: Whoa! What are you doing? You don't want to move me to the HMD Screen!"; + QWindow* dialogWindow = windowHandle(); + + // try to pick a better screen + QScreen* betterScreen = NULL; + + QWindow* appWindow = Application::getInstance()->getWindow()->windowHandle(); + QScreen* appScreen = appWindow->screen(); + + if (_previousDialogScreen && _previousDialogScreen != hmdScreen) { + // first, if the previous dialog screen is not the HMD screen, then move it there. + betterScreen = appScreen; + } else if (appScreen != hmdScreen) { + // second, if the application screen is not the HMD screen, then move it there. + betterScreen = appScreen; + } else if (_previousScreen && _previousScreen != hmdScreen) { + // third, if the application screen is the HMD screen, we want to move it to + // the previous screen + betterScreen = _previousScreen; + } else { + // last, if we can't use the previous screen the use the primary desktop screen + int desktopPrimaryScreenNumber = QApplication::desktop()->primaryScreen(); + QScreen* desktopPrimaryScreen = QGuiApplication::screens()[desktopPrimaryScreenNumber]; + betterScreen = desktopPrimaryScreen; + } + + if (betterScreen) { + dialogWindow->setScreen(betterScreen); + dialogWindow->setGeometry(_previousDialogRect); + } + } + } + } +} + QString HMDToolsDialog::getDebugDetails() const { QString results; diff --git a/interface/src/ui/HMDToolsDialog.h b/interface/src/ui/HMDToolsDialog.h index f1a5f582cd..4fe0dd626f 100644 --- a/interface/src/ui/HMDToolsDialog.h +++ b/interface/src/ui/HMDToolsDialog.h @@ -33,6 +33,8 @@ public slots: void activateWindowAfterEnterMode(); void moveWindowAfterLeaveMode(); void applicationWindowScreenChanged(QScreen* screen); + void dialogWindowScreenChanged(QScreen* screen); + void dialogWindowGeometryChanged(int arg); protected: virtual void closeEvent(QCloseEvent*); // Emits a 'closed' signal when this dialog is closed. @@ -47,6 +49,9 @@ private: QScreen* _previousScreen; QScreen* _hmdScreen; QLabel* _debugDetails; + + QRect _previousDialogRect; + QScreen* _previousDialogScreen; }; #endif // hifi_HMDToolsDialog_h From 2fc3fdc7e6c717f36c8ff6e7426fd6f2f1b65702 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Nov 2014 12:26:02 -0800 Subject: [PATCH 17/18] improve how cameras are reset when leaving vr mode --- interface/src/Application.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1a7ccf21ee..397f883b3e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -668,8 +668,6 @@ void Application::paintGL() { // Update camera position if (!OculusManager::isConnected()) { - _myCamera.setHmdPosition(glm::vec3()); - _myCamera.setHmdRotation(glm::quat()); _myCamera.update(1.0f / _fps); } @@ -1606,6 +1604,11 @@ void Application::setEnableVRMode(bool enableVRMode) { OculusManager::recalibrate(); } else { OculusManager::abandonCalibration(); + + _mirrorCamera.setHmdPosition(glm::vec3()); + _mirrorCamera.setHmdRotation(glm::quat()); + _myCamera.setHmdPosition(glm::vec3()); + _myCamera.setHmdRotation(glm::quat()); } resizeGL(_glWidget->getDeviceWidth(), _glWidget->getDeviceHeight()); From 711f9f69058ca26e1a47602c959c9a72a49e60df Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 26 Nov 2014 12:34:47 -0800 Subject: [PATCH 18/18] fix bug where audio meter is incorrectly offset when in oculus mode --- interface/src/ui/ApplicationOverlay.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 55d4cf7c8b..1307672ad1 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -984,7 +984,8 @@ void ApplicationOverlay::renderAudioMeter() { const int AUDIO_METER_X = MIRROR_VIEW_LEFT_PADDING + MUTE_ICON_SIZE + AUDIO_METER_INSET + AUDIO_METER_GAP; int audioMeterY; - bool boxed = Menu::getInstance()->isOptionChecked(MenuOption::Mirror) && + bool smallMirrorVisible = Menu::getInstance()->isOptionChecked(MenuOption::Mirror) && !OculusManager::isConnected(); + bool boxed = smallMirrorVisible && !Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror); if (boxed) { audioMeterY = MIRROR_VIEW_HEIGHT + AUDIO_METER_GAP + MUTE_ICON_PADDING;