From d218ca49609cdcea653e091d16803bc7b2e9a61c Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 18 Mar 2016 12:26:11 -0700 Subject: [PATCH 1/6] openvr: fix for crash on exit Before this fix, a script could call into HMD.getHUDLookAtPosition2D() while the app was shutting down, which in turn would call getHeadPose() on the currently active display plugin. This call could cause a crash within the openvr plugin, because the SDK was either shutdown, or in the process of shutting down on the main thread. This fixes this by spliting the previous DisplayPlugin::getHeadPose(int) into two parts: * updateHeadPose(int) which is only called once a frame and only by the main thread. * getHeadPose() which is thread-safe and will return a cached copy of the hmd pose sampled by the last updateHeadPose. --- interface/src/Application.cpp | 6 +++--- interface/src/avatar/AvatarUpdate.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 2 +- .../src/display-plugins/CompositorHelper.cpp | 2 +- libraries/plugins/src/plugins/DisplayPlugin.h | 10 ++++++++-- plugins/oculus/src/OculusBaseDisplayPlugin.cpp | 10 ++++++++-- plugins/oculus/src/OculusBaseDisplayPlugin.h | 5 ++++- plugins/openvr/src/OpenVrDisplayPlugin.cpp | 13 ++++++++++--- plugins/openvr/src/OpenVrDisplayPlugin.h | 5 ++++- 9 files changed, 40 insertions(+), 15 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a971051311..786f29fc90 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1603,7 +1603,7 @@ void Application::paintGL() { // unmodified head pose because the only plugin that cares (the Oculus plugin) uses it // for rotational timewarp. If we move to support positonal timewarp, we need to // ensure this contains the full pose composed with the eye offsets. - mat4 headPose = displayPlugin->getHeadPose(_frameCount); + mat4 headPose = displayPlugin->updateHeadPose(_frameCount); // FIXME we probably don't need to set the projection matrix every frame, // only when the display plugin changes (or in non-HMD modes when the user @@ -2975,7 +2975,7 @@ void Application::updateMyAvatarLookAtPosition() { lookAtPosition.x = -lookAtPosition.x; } if (isHMD) { - glm::mat4 headPose = getActiveDisplayPlugin()->getHeadPose(_frameCount); + glm::mat4 headPose = getActiveDisplayPlugin()->getHeadPose(); glm::quat hmdRotation = glm::quat_cast(headPose); lookAtSpot = _myCamera.getPosition() + myAvatar->getOrientation() * (hmdRotation * lookAtPosition); } else { @@ -4927,7 +4927,7 @@ mat4 Application::getEyeOffset(int eye) const { mat4 Application::getHMDSensorPose() const { if (isHMDMode()) { - return getActiveDisplayPlugin()->getHeadPose(_frameCount); + return getActiveDisplayPlugin()->getHeadPose(); } return mat4(); } diff --git a/interface/src/avatar/AvatarUpdate.cpp b/interface/src/avatar/AvatarUpdate.cpp index a52b584527..3e0d23cc1c 100644 --- a/interface/src/avatar/AvatarUpdate.cpp +++ b/interface/src/avatar/AvatarUpdate.cpp @@ -38,7 +38,7 @@ void AvatarUpdate::synchronousProcess() { // transform the head pose from the displayPlugin into avatar coordinates. glm::mat4 invAvatarMat = glm::inverse(createMatFromQuatAndPos(myAvatar->getOrientation(), myAvatar->getPosition())); - _headPose = invAvatarMat * (myAvatar->getSensorToWorldMatrix() * qApp->getActiveDisplayPlugin()->getHeadPose(frameCount)); + _headPose = invAvatarMat * (myAvatar->getSensorToWorldMatrix() * qApp->getActiveDisplayPlugin()->getHeadPose()); if (!isThreaded()) { process(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 7198f32422..550c11df4d 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1258,7 +1258,7 @@ void MyAvatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, fl if (qApp->isHMDMode()) { glm::vec3 cameraPosition = qApp->getCamera()->getPosition(); - glm::mat4 headPose = qApp->getActiveDisplayPlugin()->getHeadPose(qApp->getFrameCount()); + glm::mat4 headPose = qApp->getActiveDisplayPlugin()->getHeadPose(); glm::mat4 leftEyePose = qApp->getActiveDisplayPlugin()->getEyeToHeadTransform(Eye::Left); leftEyePose = leftEyePose * headPose; glm::vec3 leftEyePosition = extractTranslation(leftEyePose); diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp index f2040eaa43..3e09e96704 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp @@ -342,7 +342,7 @@ void CompositorHelper::computeHmdPickRay(const glm::vec2& cursorPos, glm::vec3& } glm::mat4 CompositorHelper::getUiTransform() const { - return _currentCamera * glm::inverse(_currentDisplayPlugin->getHeadPose(_currentFrame)); + return _currentCamera * glm::inverse(_currentDisplayPlugin->getHeadPose()); } //Finds the collision point of a world space ray diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index 76db1ecbe2..376cec7b70 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -121,8 +121,14 @@ public: static const glm::mat4 transform; return transform; } - virtual glm::mat4 getHeadPose(uint32_t frameIndex) const { - static const glm::mat4 pose; return pose; + // will query the underlying hmd api to compute the most recent head pose + virtual glm::mat4 updateHeadPose(uint32_t frameIndex) { + return glm::mat4(); + } + + // returns a copy of the most recent head pose, computed via updateHeadPose + virtual glm::mat4 getHeadPose() const { + return glm::mat4(); } // Needed for timewarp style features diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index f1613176df..0f87d526d7 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -15,14 +15,20 @@ void OculusBaseDisplayPlugin::resetSensors() { ovr_RecenterPose(_session); } -glm::mat4 OculusBaseDisplayPlugin::getHeadPose(uint32_t frameIndex) const { +glm::mat4 OculusBaseDisplayPlugin::updateHeadPose(uint32_t frameIndex) { static uint32_t lastFrameSeen = 0; auto displayTime = ovr_GetPredictedDisplayTime(_session, frameIndex); auto trackingState = ovr_GetTrackingState(_session, displayTime, frameIndex > lastFrameSeen); if (frameIndex > lastFrameSeen) { lastFrameSeen = frameIndex; } - return toGlm(trackingState.HeadPose.ThePose); + mat4 headPose = toGlm(trackingState.HeadPose.ThePose); + _headPoseCache.set(headPose); + return headPose; +} + +glm::mat4 OculusBaseDisplayPlugin::getHeadPose() const { + return _headPoseCache.get(); } bool OculusBaseDisplayPlugin::isSupported() const { diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index e6f0b265a2..cf8f38fe3a 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include @@ -20,7 +21,8 @@ public: // Stereo specific methods virtual void resetSensors() override final; - virtual glm::mat4 getHeadPose(uint32_t frameIndex) const override; + virtual glm::mat4 updateHeadPose(uint32_t frameIndex) override; + virtual glm::mat4 getHeadPose() const override; protected: void customizeContext() override; @@ -36,4 +38,5 @@ protected: ovrHmdDesc _hmdDesc; ovrLayerEyeFov _sceneLayer; ovrViewScaleDesc _viewScaleDesc; + ThreadSafeValueCache _headPoseCache { glm::mat4() }; }; diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index d0363d4dcc..f559e902d9 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -38,7 +38,7 @@ static mat4 _sensorResetMat; static std::array VR_EYES { { vr::Eye_Left, vr::Eye_Right } }; bool OpenVrDisplayPlugin::isSupported() const { - return !isOculusPresent() && vr::VR_IsHmdPresent(); + return /*!isOculusPresent() &&*/ vr::VR_IsHmdPresent(); } void OpenVrDisplayPlugin::internalActivate() { @@ -112,7 +112,7 @@ void OpenVrDisplayPlugin::resetSensors() { _sensorResetMat = glm::inverse(cancelOutRollAndPitch(m)); } -glm::mat4 OpenVrDisplayPlugin::getHeadPose(uint32_t frameIndex) const { +glm::mat4 OpenVrDisplayPlugin::updateHeadPose(uint32_t frameIndex) { float displayFrequency = _system->GetFloatTrackedDeviceProperty(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_DisplayFrequency_Float); float frameDuration = 1.f / displayFrequency; @@ -139,14 +139,21 @@ glm::mat4 OpenVrDisplayPlugin::getHeadPose(uint32_t frameIndex) const { _trackedDeviceLinearVelocities[i] = transformVectorFast(_sensorResetMat, toGlm(_trackedDevicePose[i].vVelocity)); _trackedDeviceAngularVelocities[i] = transformVectorFast(_sensorResetMat, toGlm(_trackedDevicePose[i].vAngularVelocity)); } + + _headPoseCache.set(_trackedDevicePoseMat4[0]); + return _trackedDevicePoseMat4[0]; } +glm::mat4 OpenVrDisplayPlugin::getHeadPose() const { + return _headPoseCache.get(); +} + void OpenVrDisplayPlugin::hmdPresent() { // Flip y-axis since GL UV coords are backwards. static vr::VRTextureBounds_t leftBounds{ 0, 0, 0.5f, 1 }; static vr::VRTextureBounds_t rightBounds{ 0.5f, 0, 1, 1 }; - + vr::Texture_t texture { (void*)oglplus::GetName(_compositeFramebuffer->color), vr::API_OpenGL, vr::ColorSpace_Auto }; _compositor->Submit(vr::Eye_Left, &texture, &leftBounds); diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index c7577fd53f..7405aab82e 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -12,6 +12,7 @@ #include #include +#include const float TARGET_RATE_OpenVr = 90.0f; // FIXME: get from sdk tracked device property? This number is vive-only. @@ -27,7 +28,8 @@ public: // Stereo specific methods virtual void resetSensors() override; - virtual glm::mat4 getHeadPose(uint32_t frameIndex) const override; + virtual glm::mat4 updateHeadPose(uint32_t frameIndex) override; + virtual glm::mat4 getHeadPose() const override; protected: void internalActivate() override; @@ -41,4 +43,5 @@ private: std::atomic _hmdActivityLevel { vr::k_EDeviceActivityLevel_Unknown }; static const QString NAME; mutable Mutex _poseMutex; + ThreadSafeValueCache _headPoseCache { glm::mat4() }; }; From 2faaf243a131a0bb28a41bb062f53f5dccd75809 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 18 Mar 2016 13:42:31 -0700 Subject: [PATCH 2/6] Revert change to OpenVrDisplayPlugin::isSupported() --- plugins/openvr/src/OpenVrDisplayPlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index f559e902d9..f5b80b0918 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -38,7 +38,7 @@ static mat4 _sensorResetMat; static std::array VR_EYES { { vr::Eye_Left, vr::Eye_Right } }; bool OpenVrDisplayPlugin::isSupported() const { - return /*!isOculusPresent() &&*/ vr::VR_IsHmdPresent(); + return !isOculusPresent() && vr::VR_IsHmdPresent(); } void OpenVrDisplayPlugin::internalActivate() { From 960ffd9c9e41054046d5238a03b2028e5fecb40c Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 18 Mar 2016 15:16:58 -0700 Subject: [PATCH 3/6] DisplayPlugins: updateHeadPose() no longer returns a value. Also, moved updateHeadPose so that the overlay and the main rendering use the same headPose. Which should also be the same place the latencyMarker for the ovr_GetTrackingState is set. --- interface/src/Application.cpp | 13 +++++++------ libraries/plugins/src/plugins/DisplayPlugin.h | 4 +--- plugins/oculus/src/OculusBaseDisplayPlugin.cpp | 9 ++------- plugins/oculus/src/OculusBaseDisplayPlugin.h | 2 +- plugins/openvr/src/OpenVrDisplayPlugin.cpp | 4 +--- plugins/openvr/src/OpenVrDisplayPlugin.h | 2 +- 6 files changed, 13 insertions(+), 21 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 786f29fc90..dc969d4ab4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1418,6 +1418,12 @@ void Application::paintGL() { // FIXME not needed anymore? _offscreenContext->makeCurrent(); + // Tell the plugin what pose we're using to render. In this case we're just using the + // unmodified head pose because the only plugin that cares (the Oculus plugin) uses it + // for rotational timewarp. If we move to support positonal timewarp, we need to + // ensure this contains the full pose composed with the eye offsets. + displayPlugin->updateHeadPose(_frameCount); + // update the avatar with a fresh HMD pose getMyAvatar()->updateFromHMDSensorMatrix(getHMDSensorPose()); @@ -1598,12 +1604,7 @@ void Application::paintGL() { auto baseProjection = renderArgs._viewFrustum->getProjection(); auto hmdInterface = DependencyManager::get(); float IPDScale = hmdInterface->getIPDScale(); - - // Tell the plugin what pose we're using to render. In this case we're just using the - // unmodified head pose because the only plugin that cares (the Oculus plugin) uses it - // for rotational timewarp. If we move to support positonal timewarp, we need to - // ensure this contains the full pose composed with the eye offsets. - mat4 headPose = displayPlugin->updateHeadPose(_frameCount); + mat4 headPose = displayPlugin->getHeadPose(); // FIXME we probably don't need to set the projection matrix every frame, // only when the display plugin changes (or in non-HMD modes when the user diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index 376cec7b70..e5ac78036e 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -122,9 +122,7 @@ public: } // will query the underlying hmd api to compute the most recent head pose - virtual glm::mat4 updateHeadPose(uint32_t frameIndex) { - return glm::mat4(); - } + virtual void updateHeadPose(uint32_t frameIndex) {} // returns a copy of the most recent head pose, computed via updateHeadPose virtual glm::mat4 getHeadPose() const { diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index 0f87d526d7..7a4bcc665b 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -15,16 +15,11 @@ void OculusBaseDisplayPlugin::resetSensors() { ovr_RecenterPose(_session); } -glm::mat4 OculusBaseDisplayPlugin::updateHeadPose(uint32_t frameIndex) { - static uint32_t lastFrameSeen = 0; +void OculusBaseDisplayPlugin::updateHeadPose(uint32_t frameIndex) { auto displayTime = ovr_GetPredictedDisplayTime(_session, frameIndex); - auto trackingState = ovr_GetTrackingState(_session, displayTime, frameIndex > lastFrameSeen); - if (frameIndex > lastFrameSeen) { - lastFrameSeen = frameIndex; - } + auto trackingState = ovr_GetTrackingState(_session, displayTime, true); mat4 headPose = toGlm(trackingState.HeadPose.ThePose); _headPoseCache.set(headPose); - return headPose; } glm::mat4 OculusBaseDisplayPlugin::getHeadPose() const { diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index cf8f38fe3a..61179a632f 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -21,7 +21,7 @@ public: // Stereo specific methods virtual void resetSensors() override final; - virtual glm::mat4 updateHeadPose(uint32_t frameIndex) override; + virtual void updateHeadPose(uint32_t frameIndex) override; virtual glm::mat4 getHeadPose() const override; protected: diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index f5b80b0918..abc47577d1 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -112,7 +112,7 @@ void OpenVrDisplayPlugin::resetSensors() { _sensorResetMat = glm::inverse(cancelOutRollAndPitch(m)); } -glm::mat4 OpenVrDisplayPlugin::updateHeadPose(uint32_t frameIndex) { +void OpenVrDisplayPlugin::updateHeadPose(uint32_t frameIndex) { float displayFrequency = _system->GetFloatTrackedDeviceProperty(vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_DisplayFrequency_Float); float frameDuration = 1.f / displayFrequency; @@ -141,8 +141,6 @@ glm::mat4 OpenVrDisplayPlugin::updateHeadPose(uint32_t frameIndex) { } _headPoseCache.set(_trackedDevicePoseMat4[0]); - - return _trackedDevicePoseMat4[0]; } glm::mat4 OpenVrDisplayPlugin::getHeadPose() const { diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index 7405aab82e..4f0320d237 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -28,7 +28,7 @@ public: // Stereo specific methods virtual void resetSensors() override; - virtual glm::mat4 updateHeadPose(uint32_t frameIndex) override; + virtual void updateHeadPose(uint32_t frameIndex) override; virtual glm::mat4 getHeadPose() const override; protected: From 4321c5a62b873c82246f00a73bc194d6e0e56638 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 18 Mar 2016 15:59:48 -0700 Subject: [PATCH 4/6] OculusLegacyDisplayPlugin: fixes for macosx and linux --- interface/src/avatar/AvatarUpdate.cpp | 1 - .../src/OculusLegacyDisplayPlugin.cpp | 15 ++++++++------- .../oculusLegacy/src/OculusLegacyDisplayPlugin.h | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/interface/src/avatar/AvatarUpdate.cpp b/interface/src/avatar/AvatarUpdate.cpp index 3e0d23cc1c..3b42b61fd2 100644 --- a/interface/src/avatar/AvatarUpdate.cpp +++ b/interface/src/avatar/AvatarUpdate.cpp @@ -30,7 +30,6 @@ void AvatarUpdate::synchronousProcess() { // Keep our own updated value, so that our asynchronous code can consult it. _isHMDMode = qApp->isHMDMode(); - auto frameCount = qApp->getFrameCount(); QSharedPointer manager = DependencyManager::get(); MyAvatar* myAvatar = manager->getMyAvatar(); diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp index 2b0ace8bcc..c0d27f8699 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp @@ -35,14 +35,15 @@ void OculusLegacyDisplayPlugin::resetSensors() { ovrHmd_RecenterPose(_hmd); } +glm::mat4 OculusLegacyDisplayPlugin::updateHeadPose(uint32_t frameIndex) { + Lock lock(_mutex); + _trackingState = ovrHmd_GetTrackingState(_hmd, ovr_GetTimeInSeconds()); + lastFrameSeen = frameIndex; + _headPoseCache.set(toGlm(_trackingState.HeadPose.ThePose)); +} + glm::mat4 OculusLegacyDisplayPlugin::getHeadPose(uint32_t frameIndex) const { - static uint32_t lastFrameSeen = 0; - if (frameIndex > lastFrameSeen) { - Lock lock(_mutex); - _trackingState = ovrHmd_GetTrackingState(_hmd, ovr_GetTimeInSeconds()); - lastFrameSeen = frameIndex; - } - return toGlm(_trackingState.HeadPose.ThePose); + return _headPoseCache.get(); } bool OculusLegacyDisplayPlugin::isSupported() const { diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h index f7d1be0244..4f13c49f2f 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include @@ -26,7 +27,8 @@ public: // Stereo specific methods virtual void resetSensors() override; - virtual glm::mat4 getHeadPose(uint32_t frameIndex) const override; + virtual void updateHeadPose(uint32_t frameIndex) override; + virtual glm::mat4 getHeadPose() const override; virtual float getTargetFrameRate() override; @@ -52,6 +54,7 @@ private: //ovrTexture _eyeTextures[2]; // FIXME - not currently in use mutable int _hmdScreen { -1 }; bool _hswDismissed { false }; + ThreadSafeValueCache _headPoseCache { glm::mat4() }; }; From e1d47e702813f4f68a5588464d23b7beb000ae48 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 18 Mar 2016 16:23:30 -0700 Subject: [PATCH 5/6] OculusLegacyDisplayPlugin: mac os x and linux fixes --- plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp | 5 ++--- plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp index c0d27f8699..b8a1d7c35f 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp @@ -35,14 +35,13 @@ void OculusLegacyDisplayPlugin::resetSensors() { ovrHmd_RecenterPose(_hmd); } -glm::mat4 OculusLegacyDisplayPlugin::updateHeadPose(uint32_t frameIndex) { +void OculusLegacyDisplayPlugin::updateHeadPose(uint32_t frameIndex) { Lock lock(_mutex); _trackingState = ovrHmd_GetTrackingState(_hmd, ovr_GetTimeInSeconds()); - lastFrameSeen = frameIndex; _headPoseCache.set(toGlm(_trackingState.HeadPose.ThePose)); } -glm::mat4 OculusLegacyDisplayPlugin::getHeadPose(uint32_t frameIndex) const { +glm::mat4 OculusLegacyDisplayPlugin::getHeadPose() const { return _headPoseCache.get(); } diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h index 4f13c49f2f..f100028beb 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h @@ -54,7 +54,7 @@ private: //ovrTexture _eyeTextures[2]; // FIXME - not currently in use mutable int _hmdScreen { -1 }; bool _hswDismissed { false }; - ThreadSafeValueCache _headPoseCache { glm::mat4() }; + ThreadSafeValueCache _headPoseCache { glm::mat4() }; }; From 5b2a050df7161cc9d647839e9fa8c53245dff725 Mon Sep 17 00:00:00 2001 From: Anthony Thibault Date: Sun, 20 Mar 2016 14:08:35 -0700 Subject: [PATCH 6/6] display-plugins: Pulled getHeadPose into common base class. * Moved getHeadPose and _headPoseCache out of each derived class and into HmdDisplayPlugin. * updated comment in application. --- interface/src/Application.cpp | 8 ++++---- .../src/display-plugins/hmd/HmdDisplayPlugin.cpp | 6 +++++- .../src/display-plugins/hmd/HmdDisplayPlugin.h | 5 ++++- plugins/oculus/src/OculusBaseDisplayPlugin.cpp | 4 ---- plugins/oculus/src/OculusBaseDisplayPlugin.h | 3 --- plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp | 4 ---- plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h | 3 --- plugins/openvr/src/OpenVrDisplayPlugin.cpp | 4 ---- plugins/openvr/src/OpenVrDisplayPlugin.h | 3 --- 9 files changed, 13 insertions(+), 27 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dc969d4ab4..d17b8b89fc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1418,10 +1418,6 @@ void Application::paintGL() { // FIXME not needed anymore? _offscreenContext->makeCurrent(); - // Tell the plugin what pose we're using to render. In this case we're just using the - // unmodified head pose because the only plugin that cares (the Oculus plugin) uses it - // for rotational timewarp. If we move to support positonal timewarp, we need to - // ensure this contains the full pose composed with the eye offsets. displayPlugin->updateHeadPose(_frameCount); // update the avatar with a fresh HMD pose @@ -1621,6 +1617,10 @@ void Application::paintGL() { mat4 eyeOffsetTransform = glm::translate(mat4(), eyeOffset * -1.0f * IPDScale); eyeOffsets[eye] = eyeOffsetTransform; + // Tell the plugin what pose we're using to render. In this case we're just using the + // unmodified head pose because the only plugin that cares (the Oculus plugin) uses it + // for rotational timewarp. If we move to support positonal timewarp, we need to + // ensure this contains the full pose composed with the eye offsets. displayPlugin->setEyeRenderPose(_frameCount, eye, headPose * glm::inverse(eyeOffsetTransform)); eyeProjections[eye] = displayPlugin->getEyeProjection(eye, baseProjection); diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 67bd0fb369..c3782b907f 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -160,4 +160,8 @@ void HmdDisplayPlugin::updateFrameData() { Parent::updateFrameData(); Lock lock(_mutex); _currentRenderEyePoses = _renderEyePoses[_currentRenderFrameIndex]; -} \ No newline at end of file +} + +glm::mat4 HmdDisplayPlugin::getHeadPose() const { + return _headPoseCache.get(); +} diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index 2d1b995ee6..659a3a16fa 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -7,6 +7,8 @@ // #pragma once +#include + #include #include "../OpenGLDisplayPlugin.h" @@ -24,7 +26,7 @@ public: void setEyeRenderPose(uint32_t frameIndex, Eye eye, const glm::mat4& pose) override final; bool isDisplayVisible() const override { return isHmdMounted(); } - + virtual glm::mat4 getHeadPose() const override; protected: virtual void hmdPresent() = 0; @@ -46,6 +48,7 @@ protected: using EyePoses = std::array; QMap _renderEyePoses; EyePoses _currentRenderEyePoses; + ThreadSafeValueCache _headPoseCache { glm::mat4() }; private: bool _enablePreview { false }; diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp index 7a4bcc665b..9d0838606e 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp @@ -22,10 +22,6 @@ void OculusBaseDisplayPlugin::updateHeadPose(uint32_t frameIndex) { _headPoseCache.set(headPose); } -glm::mat4 OculusBaseDisplayPlugin::getHeadPose() const { - return _headPoseCache.get(); -} - bool OculusBaseDisplayPlugin::isSupported() const { return oculusAvailable(); } diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h index 61179a632f..5455b61a60 100644 --- a/plugins/oculus/src/OculusBaseDisplayPlugin.h +++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h @@ -8,7 +8,6 @@ #pragma once #include -#include #include @@ -22,7 +21,6 @@ public: // Stereo specific methods virtual void resetSensors() override final; virtual void updateHeadPose(uint32_t frameIndex) override; - virtual glm::mat4 getHeadPose() const override; protected: void customizeContext() override; @@ -38,5 +36,4 @@ protected: ovrHmdDesc _hmdDesc; ovrLayerEyeFov _sceneLayer; ovrViewScaleDesc _viewScaleDesc; - ThreadSafeValueCache _headPoseCache { glm::mat4() }; }; diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp index b8a1d7c35f..73e18aa697 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp @@ -41,10 +41,6 @@ void OculusLegacyDisplayPlugin::updateHeadPose(uint32_t frameIndex) { _headPoseCache.set(toGlm(_trackingState.HeadPose.ThePose)); } -glm::mat4 OculusLegacyDisplayPlugin::getHeadPose() const { - return _headPoseCache.get(); -} - bool OculusLegacyDisplayPlugin::isSupported() const { if (!ovr_Initialize(nullptr)) { return false; diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h index f100028beb..bf4ae26205 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.h @@ -8,7 +8,6 @@ #pragma once #include -#include #include @@ -28,7 +27,6 @@ public: // Stereo specific methods virtual void resetSensors() override; virtual void updateHeadPose(uint32_t frameIndex) override; - virtual glm::mat4 getHeadPose() const override; virtual float getTargetFrameRate() override; @@ -54,7 +52,6 @@ private: //ovrTexture _eyeTextures[2]; // FIXME - not currently in use mutable int _hmdScreen { -1 }; bool _hswDismissed { false }; - ThreadSafeValueCache _headPoseCache { glm::mat4() }; }; diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index abc47577d1..843b70807d 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -143,10 +143,6 @@ void OpenVrDisplayPlugin::updateHeadPose(uint32_t frameIndex) { _headPoseCache.set(_trackedDevicePoseMat4[0]); } -glm::mat4 OpenVrDisplayPlugin::getHeadPose() const { - return _headPoseCache.get(); -} - void OpenVrDisplayPlugin::hmdPresent() { // Flip y-axis since GL UV coords are backwards. static vr::VRTextureBounds_t leftBounds{ 0, 0, 0.5f, 1 }; diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h index 4f0320d237..caaf75a4d0 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.h +++ b/plugins/openvr/src/OpenVrDisplayPlugin.h @@ -12,7 +12,6 @@ #include #include -#include const float TARGET_RATE_OpenVr = 90.0f; // FIXME: get from sdk tracked device property? This number is vive-only. @@ -29,7 +28,6 @@ public: // Stereo specific methods virtual void resetSensors() override; virtual void updateHeadPose(uint32_t frameIndex) override; - virtual glm::mat4 getHeadPose() const override; protected: void internalActivate() override; @@ -43,5 +41,4 @@ private: std::atomic _hmdActivityLevel { vr::k_EDeviceActivityLevel_Unknown }; static const QString NAME; mutable Mutex _poseMutex; - ThreadSafeValueCache _headPoseCache { glm::mat4() }; };