1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-03-30 16:36:42 +00:00

Merge fixes

This commit is contained in:
Mads Buvik Sandvei 2020-07-22 20:01:56 +02:00
parent 1023ef6e49
commit 14977f79e2
5 changed files with 39 additions and 22 deletions

View file

@ -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()

View file

@ -105,6 +105,4 @@ namespace MWVR
};
}
std::ostream& operator <<(std::ostream& os, const MWVR::Pose& pose);
#endif

View file

@ -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<std::mutex> 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<std::chrono::milliseconds>(condEnd - begin);
auto xrSyncTime = std::chrono::duration_cast<std::chrono::milliseconds>(xrSyncEnd - condEnd);
Log(Debug::Debug) << "condTime: " << condTime.count() << ", xrSyncTime: " << xrSyncTime.count();
}
std::unique_ptr<VRSession::VRFrameMeta>& VRSession::getFrame(FramePhase phase)

View file

@ -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<std::unique_ptr<VRFrameMeta>, (int)FramePhase::NumPhases> mFrame{ nullptr };

View file

@ -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