Allow game to override pitch

This commit is contained in:
Simon 2023-06-25 14:50:41 +01:00
parent 727103b565
commit 5c6a0c84eb
3 changed files with 52 additions and 14 deletions

View file

@ -78,6 +78,7 @@ CVAR(Bool, vr_teleport, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Float, vr_weaponScale, 1.02f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_weaponScale, 1.02f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Float, vr_weaponPitchAdjust, 20.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_weaponPitchAdjust, 20.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Float, vr_weaponYawAdjust, 0.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_weaponYawAdjust, 0.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Bool, vr_allowPitchOverride, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Float, vr_snapTurn, 45.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_snapTurn, 45.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Int, vr_move_speed, 19, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Int, vr_move_speed, 19, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Float, vr_run_multiplier, 1.5, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_run_multiplier, 1.5, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)

View file

@ -55,8 +55,10 @@
#include "gamehud.h" #include "gamehud.h"
EXTERN_CVAR(Bool, cl_capfps) EXTERN_CVAR(Bool, cl_capfps)
EXTERN_CVAR(Bool, vr_allowPitchOverride);
extern float vrYaw; extern float vrYaw;
extern float vrPitch;
PalEntry GlobalMapFog; PalEntry GlobalMapFog;
float GlobalFogDensity = 350.f; float GlobalFogDensity = 350.f;
@ -108,6 +110,7 @@ void CollectLights(FLevelLocals* Level)
float RazeXR_GetFOV(); float RazeXR_GetFOV();
void VR_GetMove(float *joy_forward, float *joy_side, float *hmd_forward, float *hmd_side, float *up, void VR_GetMove(float *joy_forward, float *joy_side, float *hmd_forward, float *hmd_side, float *up,
float *yaw, float *pitch, float *roll); float *yaw, float *pitch, float *roll);
void RazeXR_setUseScreenLayer(bool use);
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// //
@ -213,6 +216,15 @@ void RenderViewpoint(FRenderViewpoint& mainvp, IntRect* bounds, float fov, float
// Set up the view point. // Set up the view point.
// //
//=========================================================================== //===========================================================================
void lerpValue(float gameVal, float &vrVal)
{
float diff = gameVal - vrVal;
if (diff < -360.f)
diff += 360.f;
if (diff > 360.f)
diff -= 360.f;
vrVal += (diff / 2.0f);
}
FRenderViewpoint SetupViewpoint(DCoreActor* cam, const DVector3& position, int sectnum, const DRotator& angles, float fov = -1) FRenderViewpoint SetupViewpoint(DCoreActor* cam, const DVector3& position, int sectnum, const DRotator& angles, float fov = -1)
{ {
@ -220,10 +232,10 @@ FRenderViewpoint SetupViewpoint(DCoreActor* cam, const DVector3& position, int s
VR_GetMove(&dummy, &dummy, &dummy, &dummy, &dummy, &yaw, &pitch, &roll); VR_GetMove(&dummy, &dummy, &dummy, &dummy, &dummy, &yaw, &pitch, &roll);
//Special handling for Duke's security cameras //Special handling for Duke's security cameras
bool renderingSecurityCamera = isDuke() && (cam && cam->spr.cstat & CSTAT_SPRITE_INVISIBLE); bool renderingRemoteCamera = isDuke() && (cam && cam->spr.cstat & CSTAT_SPRITE_INVISIBLE);
//Only do the following if not rendering a camera tex //Only do the following if not rendering a camera tex
if (!renderingSecurityCamera) if (!renderingRemoteCamera)
{ {
//Yaw //Yaw
float hmdYawDeltaDegrees; float hmdYawDeltaDegrees;
@ -233,6 +245,14 @@ FRenderViewpoint SetupViewpoint(DCoreActor* cam, const DVector3& position, int s
previousHmdYaw = yaw; previousHmdYaw = yaw;
} }
//Pitch
float hmdPitchDeltaDegrees;
{
static float previousHmdPitch = pitch;
hmdPitchDeltaDegrees = pitch - previousHmdPitch;
previousHmdPitch = pitch;
}
if (gamestate == GS_LEVEL) if (gamestate == GS_LEVEL)
{ {
// Special frame-yaw-resync code // Special frame-yaw-resync code
@ -240,17 +260,22 @@ FRenderViewpoint SetupViewpoint(DCoreActor* cam, const DVector3& position, int s
// our "vrYaw" back to match it, doing the full amount on a frame causes it to glitch // our "vrYaw" back to match it, doing the full amount on a frame causes it to glitch
// but smoothly transitioning to it means the user doesn't notice and we should never be out // but smoothly transitioning to it means the user doesn't notice and we should never be out
// of sync with the game's yaw for very long // of sync with the game's yaw for very long
{ lerpValue((float) (-90.f + angles.Yaw.Degrees()), vrYaw);
float diff = (float) (-90.f + angles.Yaw.Degrees()) - vrYaw;
if (diff < -360.f)
diff += 360.f;
if (diff > 360.f)
diff -= 360.f;
vrYaw += (diff / 2.0f);
}
//And now apply the delta of hmd movement for this frame // And now apply the delta of hmd movement for this frame
vrYaw -= hmdYawDeltaDegrees; vrYaw -= hmdYawDeltaDegrees;
// And do the same for pitch so the game _can_ override the pitch if
// the user allows it
if (vr_allowPitchOverride)
{
lerpValue((float) (angles.Pitch.Degrees()), vrPitch);
vrPitch += hmdPitchDeltaDegrees;
}
else
{
vrPitch = pitch;
}
} }
} }
@ -259,16 +284,23 @@ FRenderViewpoint SetupViewpoint(DCoreActor* cam, const DVector3& position, int s
r_viewpoint.SectNums = nullptr; r_viewpoint.SectNums = nullptr;
r_viewpoint.SectCount = sectnum; r_viewpoint.SectCount = sectnum;
r_viewpoint.Pos = { position.X, -position.Y, -position.Z }; r_viewpoint.Pos = { position.X, -position.Y, -position.Z };
if (renderingSecurityCamera) if (renderingRemoteCamera)
{ {
r_viewpoint.HWAngles.Yaw = FAngle::fromDeg(-90.f + (float)angles.Yaw.Degrees()); r_viewpoint.HWAngles.Yaw = FAngle::fromDeg(-90.f + (float)angles.Yaw.Degrees());
r_viewpoint.HWAngles.Pitch = FAngle::fromDeg((float)angles.Pitch.Degrees());
r_viewpoint.HWAngles.Roll = FAngle::fromDeg((float)angles.Roll.Degrees());
if (fov != -1)
{
RazeXR_setUseScreenLayer(true);
}
} }
else else
{ {
r_viewpoint.HWAngles.Yaw = FAngle::fromDeg(vrYaw); r_viewpoint.HWAngles.Yaw = FAngle::fromDeg(vrYaw);
r_viewpoint.HWAngles.Pitch = FAngle::fromDeg(vrPitch);
r_viewpoint.HWAngles.Roll = FAngle::fromDeg(roll);
} }
r_viewpoint.HWAngles.Pitch = FAngle::fromDeg(pitch);
r_viewpoint.HWAngles.Roll = FAngle::fromDeg(roll);
r_viewpoint.FieldOfView = FAngle::fromDeg((float)RazeXR_GetFOV()); r_viewpoint.FieldOfView = FAngle::fromDeg((float)RazeXR_GetFOV());
r_viewpoint.RotAngle = angles.Yaw.BAMs(); r_viewpoint.RotAngle = angles.Yaw.BAMs();
double FocalTangent = tan(r_viewpoint.FieldOfView.Radians() / 2); double FocalTangent = tan(r_viewpoint.FieldOfView.Radians() / 2);

View file

@ -557,11 +557,16 @@ OptionMenu "VROptionsMenu" protected
Slider "Height Adjust", "vr_height_adjust", 0.0, 1.0, 0.1 Slider "Height Adjust", "vr_height_adjust", 0.0, 1.0, 0.1
StaticText "" StaticText ""
Option "Positional Tracking", "vr_positional_tracking", "YesNo" Option "Positional Tracking", "vr_positional_tracking", "YesNo"
Option "Allow Pitch Override*", "vr_allowPitchOverride", "YesNo"
Option "6DoF Weapons", "vr_6dof_weapons", "YesNo" Option "6DoF Weapons", "vr_6dof_weapons", "YesNo"
Slider "Weapon Pitch Adjust", "vr_weaponPitchAdjust", 0.0, 90.0, 5 Slider "Weapon Pitch Adjust", "vr_weaponPitchAdjust", 0.0, 90.0, 5
Slider "Weapon Yaw Adjust", "vr_weaponYawAdjust", -10.0, 10.0, 1 Slider "Weapon Yaw Adjust", "vr_weaponYawAdjust", -10.0, 10.0, 1
Option "VR Crosshair", "vr_6dof_crosshair", "YesNo" Option "VR Crosshair", "vr_6dof_crosshair", "YesNo"
StaticText ""
StaticText "*Allows the game to override the pitch the user is looking at"
StaticText "in some scenarios"
StaticText "" StaticText ""
StaticText "HUD" StaticText "HUD"
StaticText "" StaticText ""