mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-07-08 06:21:35 +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),
|
mIsNearest(false),
|
||||||
mHeight(124.f),
|
mHeight(124.f),
|
||||||
mBaseCameraDistance(Settings::Manager::getFloat("third person camera distance", "Camera")),
|
mBaseCameraDistance(Settings::Manager::getFloat("third person camera distance", "Camera")),
|
||||||
|
mPitch(0.f),
|
||||||
|
mYaw(0.f),
|
||||||
|
mRoll(0.f),
|
||||||
mVanityToggleQueued(false),
|
mVanityToggleQueued(false),
|
||||||
mVanityToggleQueuedValue(false),
|
mVanityToggleQueuedValue(false),
|
||||||
mViewModeToggleQueued(false),
|
mViewModeToggleQueued(false),
|
||||||
|
@ -156,7 +159,12 @@ namespace MWRender
|
||||||
|
|
||||||
void Camera::updateCamera(osg::Camera *cam)
|
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;
|
osg::Vec3d focal, position;
|
||||||
getPosition(focal, position);
|
getPosition(focal, position);
|
||||||
|
|
||||||
|
@ -400,7 +408,6 @@ namespace MWRender
|
||||||
|
|
||||||
void Camera::setRoll(float angle)
|
void Camera::setRoll(float angle)
|
||||||
{
|
{
|
||||||
#ifdef USE_OPENXR
|
|
||||||
if (angle > osg::PI) {
|
if (angle > osg::PI) {
|
||||||
angle -= osg::PI * 2;
|
angle -= osg::PI * 2;
|
||||||
}
|
}
|
||||||
|
@ -408,11 +415,6 @@ namespace MWRender
|
||||||
angle += osg::PI * 2;
|
angle += osg::PI * 2;
|
||||||
}
|
}
|
||||||
mRoll = angle;
|
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)
|
void Camera::setPitch(float angle)
|
||||||
|
@ -553,6 +555,7 @@ namespace MWRender
|
||||||
{
|
{
|
||||||
setPitch(-mTrackingPtr.getRefData().getPosition().rot[0] - mDeferredRotation.x());
|
setPitch(-mTrackingPtr.getRefData().getPosition().rot[0] - mDeferredRotation.x());
|
||||||
setYaw(-mTrackingPtr.getRefData().getPosition().rot[2] - mDeferredRotation.z());
|
setYaw(-mTrackingPtr.getRefData().getPosition().rot[2] - mDeferredRotation.z());
|
||||||
|
setRoll(-mTrackingPtr.getRefData().getPosition().rot[1] - mDeferredRotation.y());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::instantTransition()
|
void Camera::instantTransition()
|
||||||
|
|
|
@ -105,6 +105,4 @@ namespace MWVR
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ostream& operator <<(std::ostream& os, const MWVR::Pose& pose);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -96,14 +96,16 @@ namespace MWVR
|
||||||
return viewMatrix;
|
return viewMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::Matrix VRSession::viewMatrix(FramePhase phase, Side side)
|
osg::Matrix VRSession::viewMatrix(FramePhase phase, Side side, bool offset)
|
||||||
{
|
{
|
||||||
MWVR::Pose pose{};
|
if (offset)
|
||||||
pose = predictedPoses(phase).view[(int)side].pose;
|
|
||||||
|
|
||||||
if (MWBase::Environment::get().getStateManager()->getState() == MWBase::StateManager::State_NoGame)
|
|
||||||
{
|
{
|
||||||
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::Vec3 position = pose.position * Environment::get().unitsPerMeter();
|
||||||
osg::Quat orientation = pose.orientation;
|
osg::Quat orientation = pose.orientation;
|
||||||
osg::Vec3d forward = orientation * osg::Vec3d(0, 1, 0);
|
osg::Vec3d forward = orientation * osg::Vec3d(0, 1, 0);
|
||||||
|
@ -113,8 +115,6 @@ namespace MWVR
|
||||||
|
|
||||||
return viewMatrix;
|
return viewMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
return viewMatrix(pose.position, pose.orientation);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VRSession::isRunning() const {
|
bool VRSession::isRunning() const {
|
||||||
|
@ -211,6 +211,7 @@ namespace MWVR
|
||||||
|
|
||||||
void VRSession::doFrameSync()
|
void VRSession::doFrameSync()
|
||||||
{
|
{
|
||||||
|
auto begin = std::chrono::steady_clock::now();
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lock(mMutex);
|
std::unique_lock<std::mutex> lock(mMutex);
|
||||||
while (mLastRenderedFrame != mFrames - 1)
|
while (mLastRenderedFrame != mFrames - 1)
|
||||||
|
@ -218,12 +219,18 @@ namespace MWVR
|
||||||
mCondition.wait(lock);
|
mCondition.wait(lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
auto condEnd = std::chrono::steady_clock::now();
|
||||||
auto* xr = Environment::get().getManager();
|
auto* xr = Environment::get().getManager();
|
||||||
Log(Debug::Debug) << mFrames << ": WaitFrame " << std::this_thread::get_id();
|
Log(Debug::Debug) << mFrames << ": WaitFrame " << std::this_thread::get_id();
|
||||||
xr->waitFrame();
|
xr->waitFrame();
|
||||||
Log(Debug::Debug) << mFrames << ": BeginFrame " << std::this_thread::get_id();
|
Log(Debug::Debug) << mFrames << ": BeginFrame " << std::this_thread::get_id();
|
||||||
xr->beginFrame();
|
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)
|
std::unique_ptr<VRSession::VRFrameMeta>& VRSession::getFrame(FramePhase phase)
|
||||||
|
|
|
@ -74,7 +74,7 @@ namespace MWVR
|
||||||
float setPlayerScale(float scale) { return mPlayerScale = scale; }
|
float setPlayerScale(float scale) { return mPlayerScale = scale; }
|
||||||
|
|
||||||
osg::Matrix viewMatrix(osg::Vec3 position, osg::Quat orientation);
|
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);
|
osg::Matrix projectionMatrix(FramePhase phase, Side side);
|
||||||
|
|
||||||
std::array<std::unique_ptr<VRFrameMeta>, (int)FramePhase::NumPhases> mFrame{ nullptr };
|
std::array<std::unique_ptr<VRFrameMeta>, (int)FramePhase::NumPhases> mFrame{ nullptr };
|
||||||
|
|
|
@ -98,10 +98,19 @@ namespace MWVR {
|
||||||
auto* session = Environment::get().getSession();
|
auto* session = Environment::get().getSession();
|
||||||
auto viewMatrix = view.getCamera()->getViewMatrix();
|
auto viewMatrix = view.getCamera()->getViewMatrix();
|
||||||
|
|
||||||
auto modifiedViewMatrix = viewMatrix * session->viewMatrix(VRSession::FramePhase::Update, side);
|
bool haveView = viewMatrix.getTrans().length() > 0.01;
|
||||||
auto projectionMatrix = session->projectionMatrix(VRSession::FramePhase::Update, side);
|
|
||||||
|
|
||||||
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);
|
camera->setProjectionMatrix(projectionMatrix);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue