From 7b0b7770513933f68d64ea19aa00a58654c807bc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 7 Dec 2016 17:29:54 -0800 Subject: [PATCH] Honor reorient and quit request from OVR --- interface/src/Application.cpp | 3 ++- libraries/plugins/src/plugins/DisplayPlugin.h | 3 ++- .../oculus/src/OculusBaseDisplayPlugin.cpp | 9 +++++++ plugins/oculus/src/OculusHelpers.cpp | 26 ++++++++++++++++--- plugins/oculus/src/OculusHelpers.h | 4 +++ 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c6150dcc53..b9b3b4ff82 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4750,7 +4750,7 @@ void Application::resetSensors(bool andReload) { DependencyManager::get()->reset(); getActiveDisplayPlugin()->resetSensors(); _overlayConductor.centerUI(); - getMyAvatar()->reset(andReload); + getMyAvatar()->reset(true, andReload); QMetaObject::invokeMethod(DependencyManager::get().data(), "reset", Qt::QueuedConnection); } @@ -5735,6 +5735,7 @@ void Application::updateDisplayMode() { QObject::connect(displayPlugin.get(), &DisplayPlugin::recommendedFramebufferSizeChanged, [this](const QSize & size) { resizeGL(); }); + QObject::connect(displayPlugin.get(), &DisplayPlugin::resetSensorsRequested, this, &Application::requestReset); first = false; } diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index c87669c99a..6b55d8ed64 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -205,7 +205,8 @@ public: signals: - void recommendedFramebufferSizeChanged(const QSize & size); + void recommendedFramebufferSizeChanged(const QSize& size); + void resetSensorsRequested(); protected: void incrementPresentCount(); diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index 7209104a85..5db5840f43 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -21,6 +21,15 @@ void OculusBaseDisplayPlugin::resetSensors() { } bool OculusBaseDisplayPlugin::beginFrameRender(uint32_t frameIndex) { + handleOVREvents(); + if (quitRequested()) { + QMetaObject::invokeMethod(qApp, "quit"); + return false; + } + if (reorientRequested()) { + emit resetSensorsRequested(); + } + _currentRenderFrameInfo = FrameInfo(); _currentRenderFrameInfo.sensorSampleTime = ovr_GetTimeInSeconds(); _currentRenderFrameInfo.predictedDisplayTime = ovr_GetPredictedDisplayTime(_session, frameIndex); diff --git a/plugins/oculus/src/OculusHelpers.cpp b/plugins/oculus/src/OculusHelpers.cpp index 5fbc0db7d1..feb0896fa4 100644 --- a/plugins/oculus/src/OculusHelpers.cpp +++ b/plugins/oculus/src/OculusHelpers.cpp @@ -20,15 +20,15 @@ #include #include -using Mutex = std::mutex; -using Lock = std::unique_lock; - Q_DECLARE_LOGGING_CATEGORY(oculus) Q_LOGGING_CATEGORY(oculus, "hifi.plugins.oculus") static std::atomic refCount { 0 }; static ovrSession session { nullptr }; +static bool _quitRequested { false }; +static bool _reorientRequested { false }; + inline ovrErrorInfo getError() { ovrErrorInfo error; ovr_GetLastErrorInfo(&error); @@ -116,6 +116,26 @@ void releaseOculusSession() { #endif } +void handleOVREvents() { + if (!session) { + return; + } + + ovrSessionStatus status; + if (!OVR_SUCCESS(ovr_GetSessionStatus(session, &status))) { + return; + } + + _quitRequested = status.ShouldQuit; + _reorientRequested = status.ShouldRecenter; +} + +bool quitRequested() { + return _quitRequested; +} +bool reorientRequested() { + return _reorientRequested; +} controller::Pose ovrControllerPoseToHandPose( ovrHandType hand, diff --git a/plugins/oculus/src/OculusHelpers.h b/plugins/oculus/src/OculusHelpers.h index e55dde1034..8244add84e 100644 --- a/plugins/oculus/src/OculusHelpers.h +++ b/plugins/oculus/src/OculusHelpers.h @@ -20,6 +20,10 @@ bool oculusAvailable(); ovrSession acquireOculusSession(); void releaseOculusSession(); +void handleOVREvents(); +bool quitRequested(); +bool reorientRequested(); + // Convenience method for looping over each eye with a lambda template inline void ovr_for_each_eye(Function function) {