FInal changes to get MV rendering correctly

This commit is contained in:
Simon 2023-02-13 21:44:42 +00:00
parent 936f079db8
commit f1a165add7
7 changed files with 50 additions and 30 deletions

View file

@ -100,20 +100,20 @@ void HWViewpointBuffer::Set2D(F2DDrawer *drawer, FRenderState &di, int width, in
if (isDrawingFullscreen && isIn2D) //fullscreen 2D if (isDrawingFullscreen && isIn2D) //fullscreen 2D
{ {
matrices.mProjectionMatrixLeft.ortho(0, (float) width, (float) height, 0, -1.0f, 1.0f); matrices.mProjectionMatrix[0].ortho(0, (float) width, (float) height, 0, -1.0f, 1.0f);
matrices.mProjectionMatrixRight.ortho(0, (float) width, (float) height, 0, -1.0f, 1.0f); matrices.mProjectionMatrix[1].ortho(0, (float) width, (float) height, 0, -1.0f, 1.0f);
} }
else if (isIn2D) // HUD else if (isIn2D) // HUD
{ {
auto vrmode = VRMode::GetVRMode(true); auto vrmode = VRMode::GetVRMode(true);
matrices.mProjectionMatrixLeft = vrmode->mEyes[0].GetHUDProjection(width, height); matrices.mProjectionMatrix[0] = vrmode->mEyes[0].GetHUDProjection(width, height);
matrices.mProjectionMatrixRight = vrmode->mEyes[1].GetHUDProjection(width, height); matrices.mProjectionMatrix[1] = vrmode->mEyes[1].GetHUDProjection(width, height);
} }
else //Player Sprite else //Player Sprite
{ {
auto vrmode = VRMode::GetVRMode(true); auto vrmode = VRMode::GetVRMode(true);
matrices.mProjectionMatrixLeft = vrmode->mEyes[0].GetPlayerSpriteProjection(width, height); matrices.mProjectionMatrix[0] = vrmode->mEyes[0].GetPlayerSpriteProjection(width, height);
matrices.mProjectionMatrixRight = vrmode->mEyes[1].GetPlayerSpriteProjection(width, height); matrices.mProjectionMatrix[1] = vrmode->mEyes[1].GetPlayerSpriteProjection(width, height);
} }
matrices.CalcDependencies(); matrices.CalcDependencies();
SetViewpoint(di, &matrices); SetViewpoint(di, &matrices);

View file

@ -15,8 +15,7 @@ enum class ELightBlendMode : uint8_t
struct HWViewpointUniforms struct HWViewpointUniforms
{ {
VSMatrix mProjectionMatrixLeft; VSMatrix mProjectionMatrix[2];
VSMatrix mProjectionMatrixRight;
VSMatrix mViewMatrix; VSMatrix mViewMatrix;
VSMatrix mNormalViewMatrix; VSMatrix mNormalViewMatrix;
FVector4 mCameraPos; FVector4 mCameraPos;

View file

@ -171,7 +171,8 @@ float getHmdAdjustedHeightInMapUnit()
#define isqrt2 0.7071067812f #define isqrt2 0.7071067812f
static VRMode vrmi_mono = { 1, 1.f, 1.f, 1.f,{ { 0.f, 1.f },{ 0.f, 0.f } } }; static VRMode vrmi_mono = { 1, 1.f, 1.f, 1.f,{ { 0.f, 1.f },{ 0.f, 0.f } } };
static VRMode vrmi_stereo = { 1, 1.f, 1.f, 1.f,{ { -.5f, 1.f },{ .5f, 1.f } } }; static VRMode vrmi_stereo = { 2, 1.f, 1.f, 1.f,{ { -.5f, 1.f },{ .5f, 1.f } } };
static VRMode vrmi_openxr = { 1, 1.f, 1.f, 1.f,{ { -.5f, 1.f },{ .5f, 1.f } } };
static VRMode vrmi_sbsfull = { 2, .5f, 1.f, 2.f,{ { -.5f, .5f },{ .5f, .5f } } }; static VRMode vrmi_sbsfull = { 2, .5f, 1.f, 2.f,{ { -.5f, .5f },{ .5f, .5f } } };
static VRMode vrmi_sbssquished = { 2, .5f, 1.f, 1.f,{ { -.5f, 1.f },{ .5f, 1.f } } }; static VRMode vrmi_sbssquished = { 2, .5f, 1.f, 1.f,{ { -.5f, 1.f },{ .5f, 1.f } } };
static VRMode vrmi_lefteye = { 1, 1.f, 1.f, 1.f, { { -.5f, 1.f },{ 0.f, 0.f } } }; static VRMode vrmi_lefteye = { 1, 1.f, 1.f, 1.f, { { -.5f, 1.f },{ 0.f, 0.f } } };
@ -194,8 +195,10 @@ const VRMode *VRMode::GetVRMode(bool toscreen)
case VR_QUADSTEREO: case VR_QUADSTEREO:
case VR_AMBERBLUE: case VR_AMBERBLUE:
case VR_SIDEBYSIDELETTERBOX: case VR_SIDEBYSIDELETTERBOX:
return &vrmi_stereo;
case VR_OPENXR: case VR_OPENXR:
return &vrmi_stereo; return &vrmi_openxr;
case VR_SIDEBYSIDESQUISHED: case VR_SIDEBYSIDESQUISHED:
case VR_COLUMNINTERLEAVED: case VR_COLUMNINTERLEAVED:
@ -289,7 +292,7 @@ VSMatrix VREyeInfo::GetHUDProjection(int width, int height) const
new_projection.translate(-1.0, 1.0, 0); new_projection.translate(-1.0, 1.0, 0);
new_projection.scale(2.0 / width, -2.0 / height, -1.0); new_projection.scale(2.0 / width, -2.0 / height, -1.0);
VSMatrix proj = GetProjection(RazeXR_GetFOV(), ratio, fovratio); VSMatrix proj = GetCenterProjection(RazeXR_GetFOV(), ratio, fovratio);
proj.multMatrix(new_projection); proj.multMatrix(new_projection);
new_projection = proj; new_projection = proj;
@ -361,7 +364,7 @@ VSMatrix VREyeInfo::GetPlayerSpriteProjection(int width, int height) const
} }
new_projection.scale(2.0 / width, -2.0 / height, -1.0); new_projection.scale(2.0 / width, -2.0 / height, -1.0);
VSMatrix proj = GetProjection(RazeXR_GetFOV(), ratio, fovratio); VSMatrix proj = GetCenterProjection(RazeXR_GetFOV(), ratio, fovratio);
proj.multMatrix(new_projection); proj.multMatrix(new_projection);
new_projection = proj; new_projection = proj;
@ -380,7 +383,14 @@ int VREyeInfo::getEye() const
bool VR_GetVRProjection(int eye, float zNear, float zFar, float* projection); bool VR_GetVRProjection(int eye, float zNear, float zFar, float* projection);
VSMatrix VREyeInfo::GetProjection(float fov, float aspectRatio, float fovRatio) const VSMatrix VREyeInfo::GetStereoProjection(float fov, float aspectRatio, float fovRatio) const
{
VSMatrix projection = GetCenterProjection(fov, aspectRatio, fovRatio);
projection.translate(getStereoSeparation(1.0f), 0, 0);
return projection;
}
VSMatrix VREyeInfo::GetCenterProjection(float fov, float aspectRatio, float fovRatio) const
{ {
VSMatrix result; VSMatrix result;
@ -422,6 +432,7 @@ VSMatrix VREyeInfo::GetProjection(float fov, float aspectRatio, float fovRatio)
/* virtual */ /* virtual */
DVector3 VREyeInfo::GetViewShift(FRotator viewAngles) const DVector3 VREyeInfo::GetViewShift(FRotator viewAngles) const
{ {
if (mShiftFactor == 0) if (mShiftFactor == 0)
{ {
// pass-through for Mono view // pass-through for Mono view
@ -430,19 +441,18 @@ DVector3 VREyeInfo::GetViewShift(FRotator viewAngles) const
else else
{ {
vec3_t angles; vec3_t angles;
VectorSet(angles, viewAngles.Pitch.Degrees(), viewAngles.Yaw.Degrees(), viewAngles.Roll.Degrees()); VectorSet(angles, viewAngles.Pitch.Degrees(), viewAngles.Yaw.Degrees(),
viewAngles.Roll.Degrees());
vec3_t v_forward, v_right, v_up; vec3_t v_forward, v_right, v_up;
AngleVectors(angles, v_forward, v_right, v_up); AngleVectors(angles, v_forward, v_right, v_up);
vec3_t tmp; float posforward = 0;
VectorScale(v_right, getShift(), tmp); float posside = 0;
float dummy = 0;
float posforward=0;
float posside=0;
float dummy=0;
VR_GetMove(&dummy, &dummy, &posforward, &posside, &dummy, &dummy, &dummy, &dummy); VR_GetMove(&dummy, &dummy, &posforward, &posside, &dummy, &dummy, &dummy, &dummy);
DVector3 eyeOffset(tmp[0], tmp[1], tmp[2]); DVector3 eyeOffset;
eyeOffset.Zero();
if (vr_positional_tracking) if (vr_positional_tracking)
{ {

View file

@ -28,7 +28,8 @@ struct VREyeInfo
float mShiftFactor; float mShiftFactor;
float mScaleFactor; float mScaleFactor;
VSMatrix GetProjection(float fov, float aspectRatio, float fovRatio) const; VSMatrix GetCenterProjection(float fov, float aspectRatio, float fovRatio) const;
VSMatrix GetStereoProjection(float fov, float aspectRatio, float fovRatio) const;
DVector3 GetViewShift(FRotator angles) const; DVector3 GetViewShift(FRotator angles) const;
VSMatrix GetHUDProjection(int width, int height) const; VSMatrix GetHUDProjection(int width, int height) const;
VSMatrix GetPlayerSpriteProjection(int width, int height) const; VSMatrix GetPlayerSpriteProjection(int width, int height) const;

View file

@ -169,8 +169,8 @@ void RenderViewpoint(FRenderViewpoint& mainvp, IntRect* bounds, float fov, float
di->Viewpoint.FieldOfView = FAngle::fromDeg(fov); // Set the real FOV for the current scene (it's not necessarily the same as the global setting in r_viewpoint) di->Viewpoint.FieldOfView = FAngle::fromDeg(fov); // Set the real FOV for the current scene (it's not necessarily the same as the global setting in r_viewpoint)
// Stereo mode specific perspective projection // Stereo mode specific perspective projection
di->VPUniforms.mProjectionMatrixLeft = vrmode->mEyes[0].GetProjection(fov, ratio, fovratio); di->VPUniforms.mProjectionMatrix[0] = vrmode->mEyes[0].GetStereoProjection(fov, ratio, fovratio);
di->VPUniforms.mProjectionMatrixRight = vrmode->mEyes[1].GetProjection(fov, ratio, fovratio); di->VPUniforms.mProjectionMatrix[1] = vrmode->mEyes[1].GetStereoProjection(fov, ratio, fovratio);
// Stereo mode specific viewpoint adjustment // Stereo mode specific viewpoint adjustment

View file

@ -138,8 +138,8 @@ void HWDrawInfo::StartScene(FRenderViewpoint& parentvp, HWViewpointUniforms* uni
} }
else else
{ {
VPUniforms.mProjectionMatrixLeft.loadIdentity(); VPUniforms.mProjectionMatrix[0].loadIdentity();
VPUniforms.mProjectionMatrixRight.loadIdentity(); VPUniforms.mProjectionMatrix[1].loadIdentity();
VPUniforms.mViewMatrix.loadIdentity(); VPUniforms.mViewMatrix.loadIdentity();
VPUniforms.mNormalViewMatrix.loadIdentity(); VPUniforms.mNormalViewMatrix.loadIdentity();
//VPUniforms.mViewHeight = viewheight; //VPUniforms.mViewHeight = viewheight;
@ -731,19 +731,29 @@ void HWDrawInfo::DrawScene(int drawmode, bool portal)
if (!gl_no_skyclear) portalState.RenderFirstSkyPortal(recursion, this, RenderState); if (!gl_no_skyclear) portalState.RenderFirstSkyPortal(recursion, this, RenderState);
#ifndef __MOBILE__
//The original location of this call
RenderScene(RenderState); RenderScene(RenderState);
if (false)//applySSAO && RenderState.GetPassType() == GBUFFER_PASS) if (applySSAO && RenderState.GetPassType() == GBUFFER_PASS)
{ {
//screen->AmbientOccludeScene(VPUniforms.mProjectionMatrix[0].get()[5]); screen->AmbientOccludeScene(VPUniforms.mProjectionMatrix[0].get()[5]);
//screen->mViewpoints->Bind(RenderState, vpIndex); screen->mViewpoints->Bind(RenderState, vpIndex);
} }
#endif
// Handle all portals after rendering the opaque objects but before // Handle all portals after rendering the opaque objects but before
// doing all translucent stuff // doing all translucent stuff
recursion++; recursion++;
portalState.EndFrame(this, RenderState); portalState.EndFrame(this, RenderState);
recursion--; recursion--;
#ifdef __MOBILE__
//For some reason, doing this here this fixes the issue with portals being drawn out of order sometimes when using
// Direct to eye buffer rendering for multiview
RenderScene(RenderState);
#endif
RenderTranslucent(RenderState); RenderTranslucent(RenderState);
} }

View file

@ -44,7 +44,7 @@ const char *GetVersionString();
#define VERSIONSTR "1.7pre" #define VERSIONSTR "1.7pre"
#define RAZEXR_VERSIONSTR "RazeXR 0.1.5" #define RAZEXR_VERSIONSTR "RazeXR 0.2.0"
// The version as seen in the Windows resource // The version as seen in the Windows resource
#define RC_FILEVERSION 1,6,9999,0 #define RC_FILEVERSION 1,6,9999,0