From 14977f79e236b66a4192fb06090c3061141a0817 Mon Sep 17 00:00:00 2001 From: Mads Buvik Sandvei Date: Wed, 22 Jul 2020 20:01:56 +0200 Subject: [PATCH] Merge fixes --- apps/openmw/mwrender/camera.cpp | 17 ++++++++++------- apps/openmw/mwvr/openxrmanager.hpp | 2 -- apps/openmw/mwvr/vrsession.cpp | 25 ++++++++++++++++--------- apps/openmw/mwvr/vrsession.hpp | 2 +- apps/openmw/mwvr/vrview.cpp | 15 ++++++++++++--- 5 files changed, 39 insertions(+), 22 deletions(-) diff --git a/apps/openmw/mwrender/camera.cpp b/apps/openmw/mwrender/camera.cpp index 954b7e54a..414d70258 100644 --- a/apps/openmw/mwrender/camera.cpp +++ b/apps/openmw/mwrender/camera.cpp @@ -69,6 +69,9 @@ namespace MWRender mIsNearest(false), mHeight(124.f), mBaseCameraDistance(Settings::Manager::getFloat("third person camera distance", "Camera")), + mPitch(0.f), + mYaw(0.f), + mRoll(0.f), mVanityToggleQueued(false), mVanityToggleQueuedValue(false), mViewModeToggleQueued(false), @@ -156,7 +159,12 @@ namespace MWRender void Camera::updateCamera(osg::Camera *cam) { - osg::Quat orient = osg::Quat(getPitch(), osg::Vec3d(1,0,0)) * osg::Quat(getRoll(), osg::Vec3d(0, 1, 0)) * osg::Quat(getYaw(), osg::Vec3d(0,0,1)); + osg::Quat orient = + osg::Quat(getPitch(), osg::Vec3d(1,0,0)) +#ifdef USE_OPENXR + * osg::Quat(getRoll(), osg::Vec3d(0,1,0)) +#endif + * osg::Quat(getYaw(), osg::Vec3d(0,0,1)); osg::Vec3d focal, position; getPosition(focal, position); @@ -400,7 +408,6 @@ namespace MWRender void Camera::setRoll(float angle) { -#ifdef USE_OPENXR if (angle > osg::PI) { angle -= osg::PI * 2; } @@ -408,11 +415,6 @@ namespace MWRender angle += osg::PI * 2; } mRoll = angle; -#else - // It seems OpenMW saves roll data, causing the camera to get tilted - // when loading a VR save in non-VR. - mRoll = 0.f; -#endif } void Camera::setPitch(float angle) @@ -553,6 +555,7 @@ namespace MWRender { setPitch(-mTrackingPtr.getRefData().getPosition().rot[0] - mDeferredRotation.x()); setYaw(-mTrackingPtr.getRefData().getPosition().rot[2] - mDeferredRotation.z()); + setRoll(-mTrackingPtr.getRefData().getPosition().rot[1] - mDeferredRotation.y()); } void Camera::instantTransition() diff --git a/apps/openmw/mwvr/openxrmanager.hpp b/apps/openmw/mwvr/openxrmanager.hpp index cde9aab15..dd88c7a9d 100644 --- a/apps/openmw/mwvr/openxrmanager.hpp +++ b/apps/openmw/mwvr/openxrmanager.hpp @@ -105,6 +105,4 @@ namespace MWVR }; } -std::ostream& operator <<(std::ostream& os, const MWVR::Pose& pose); - #endif diff --git a/apps/openmw/mwvr/vrsession.cpp b/apps/openmw/mwvr/vrsession.cpp index 8aac92bbe..4ae3d63e6 100644 --- a/apps/openmw/mwvr/vrsession.cpp +++ b/apps/openmw/mwvr/vrsession.cpp @@ -96,14 +96,16 @@ namespace MWVR return viewMatrix; } - osg::Matrix VRSession::viewMatrix(FramePhase phase, Side side) + osg::Matrix VRSession::viewMatrix(FramePhase phase, Side side, bool offset) { - MWVR::Pose pose{}; - pose = predictedPoses(phase).view[(int)side].pose; - - if (MWBase::Environment::get().getStateManager()->getState() == MWBase::StateManager::State_NoGame) + if (offset) { - pose = predictedPoses(phase).eye[(int)side]; + MWVR::Pose pose = predictedPoses(phase).view[(int)side].pose; + return viewMatrix(pose.position, pose.orientation); + } + else + { + MWVR::Pose pose = predictedPoses(phase).eye[(int)side]; osg::Vec3 position = pose.position * Environment::get().unitsPerMeter(); osg::Quat orientation = pose.orientation; osg::Vec3d forward = orientation * osg::Vec3d(0, 1, 0); @@ -113,8 +115,6 @@ namespace MWVR return viewMatrix; } - - return viewMatrix(pose.position, pose.orientation); } bool VRSession::isRunning() const { @@ -211,6 +211,7 @@ namespace MWVR void VRSession::doFrameSync() { + auto begin = std::chrono::steady_clock::now(); { std::unique_lock lock(mMutex); while (mLastRenderedFrame != mFrames - 1) @@ -218,12 +219,18 @@ namespace MWVR mCondition.wait(lock); } } - + auto condEnd = std::chrono::steady_clock::now(); auto* xr = Environment::get().getManager(); Log(Debug::Debug) << mFrames << ": WaitFrame " << std::this_thread::get_id(); xr->waitFrame(); Log(Debug::Debug) << mFrames << ": BeginFrame " << std::this_thread::get_id(); xr->beginFrame(); + auto xrSyncEnd = std::chrono::steady_clock::now(); + + auto condTime = std::chrono::duration_cast(condEnd - begin); + auto xrSyncTime = std::chrono::duration_cast(xrSyncEnd - condEnd); + Log(Debug::Debug) << "condTime: " << condTime.count() << ", xrSyncTime: " << xrSyncTime.count(); + } std::unique_ptr& VRSession::getFrame(FramePhase phase) diff --git a/apps/openmw/mwvr/vrsession.hpp b/apps/openmw/mwvr/vrsession.hpp index c3e099106..f6e374b2b 100644 --- a/apps/openmw/mwvr/vrsession.hpp +++ b/apps/openmw/mwvr/vrsession.hpp @@ -74,7 +74,7 @@ namespace MWVR float setPlayerScale(float scale) { return mPlayerScale = scale; } osg::Matrix viewMatrix(osg::Vec3 position, osg::Quat orientation); - osg::Matrix viewMatrix(FramePhase phase, Side side); + osg::Matrix viewMatrix(FramePhase phase, Side side, bool offset); osg::Matrix projectionMatrix(FramePhase phase, Side side); std::array, (int)FramePhase::NumPhases> mFrame{ nullptr }; diff --git a/apps/openmw/mwvr/vrview.cpp b/apps/openmw/mwvr/vrview.cpp index e3e0a5db8..7abd9c33b 100644 --- a/apps/openmw/mwvr/vrview.cpp +++ b/apps/openmw/mwvr/vrview.cpp @@ -98,10 +98,19 @@ namespace MWVR { auto* session = Environment::get().getSession(); auto viewMatrix = view.getCamera()->getViewMatrix(); - auto modifiedViewMatrix = viewMatrix * session->viewMatrix(VRSession::FramePhase::Update, side); - auto projectionMatrix = session->projectionMatrix(VRSession::FramePhase::Update, side); + bool haveView = viewMatrix.getTrans().length() > 0.01; - camera->setViewMatrix(modifiedViewMatrix); + if (haveView) + { + viewMatrix = viewMatrix * session->viewMatrix(VRSession::FramePhase::Update, side, true); + } + else + { + viewMatrix = session->viewMatrix(VRSession::FramePhase::Update, side, false); + } + camera->setViewMatrix(viewMatrix); + + auto projectionMatrix = session->projectionMatrix(VRSession::FramePhase::Update, side); camera->setProjectionMatrix(projectionMatrix); } else