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:
parent
1023ef6e49
commit
14977f79e2
5 changed files with 39 additions and 22 deletions
|
@ -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()
|
||||
|
|
|
@ -105,6 +105,4 @@ namespace MWVR
|
|||
};
|
||||
}
|
||||
|
||||
std::ostream& operator <<(std::ostream& os, const MWVR::Pose& pose);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 };
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue