Use improved game yaw resync logic

should never go out of sync with the game yaw again (not for more than a few frames anyway)
This commit is contained in:
Simon 2023-06-25 10:08:40 +01:00
parent 95b2303bad
commit 727103b565
6 changed files with 25 additions and 35 deletions

View file

@ -47,6 +47,7 @@ extern vec3_t hmdPosition;
extern vec3_t hmdOrigin; extern vec3_t hmdOrigin;
extern vec3_t hmdorientation; extern vec3_t hmdorientation;
extern vec3_t weaponangles; extern vec3_t weaponangles;
extern vec3_t rawcontrollerangles; // angles unadjusted by weapon adjustment cvars
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,
@ -76,7 +77,7 @@ CVAR(Bool, vr_move_use_offhand, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
CVAR(Bool, vr_teleport, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) 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, 5.0f, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CVAR(Float, vr_weaponYawAdjust, 0.0f, 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)
@ -241,10 +242,10 @@ void VRMode::AdjustViewport(DFrameBuffer *screen) const
screen->mScreenViewport.left = (int)(screen->mScreenViewport.left * mHorizontalViewportScale); screen->mScreenViewport.left = (int)(screen->mScreenViewport.left * mHorizontalViewportScale);
} }
extern float gameYaw; extern float vrYaw;
float getViewpointYaw() float getViewpointYaw()
{ {
return gameYaw; return vrYaw;
} }
VSMatrix VREyeInfo::GetHUDProjection(int width, int height) const VSMatrix VREyeInfo::GetHUDProjection(int width, int height) const
@ -351,14 +352,14 @@ VSMatrix VREyeInfo::GetPlayerSpriteProjection(int width, int height) const
// Right-handed // Right-handed
new_projection.rotate(weaponangles[YAW] - hmdorientation[YAW], 0, 1, 0); new_projection.rotate(weaponangles[YAW] - hmdorientation[YAW], 0, 1, 0);
new_projection.rotate(weaponangles[PITCH], 1, 0, 0); new_projection.rotate(weaponangles[PITCH], 1, 0, 0);
new_projection.rotate(weaponangles[ROLL], 0, 0, 1); new_projection.rotate(rawcontrollerangles[ROLL], 0, 0, 1);
} }
else else
{ {
// Left-handed // Left-handed
new_projection.rotate(180.0f + weaponangles[YAW] - hmdorientation[YAW], 0, 1, 0); new_projection.rotate(180.0f + weaponangles[YAW] - hmdorientation[YAW], 0, 1, 0);
new_projection.rotate(-weaponangles[PITCH], 1, 0, 0); new_projection.rotate(-weaponangles[PITCH], 1, 0, 0);
new_projection.rotate(-weaponangles[ROLL], 0, 0, 1); new_projection.rotate(-rawcontrollerangles[ROLL], 0, 0, 1);
} }
float weapon_scale = 0.6f; float weapon_scale = 0.6f;

View file

@ -108,7 +108,6 @@ void resetTurnHeldAmt()
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);
extern int resyncVRYawWithGame;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
@ -357,12 +356,6 @@ void PlayerAngles::doViewPitch(const bool canslopetilt, const bool climbing)
void PlayerAngles::doViewYaw(InputPacket* const input) void PlayerAngles::doViewYaw(InputPacket* const input)
{ {
if (ViewAngles.Yaw.Degrees() != 0.0f ||
ViewAngles.Roll.Degrees() != 0.0f)
{
resyncVRYawWithGame = 1;
}
// Process angle return to zeros. // Process angle return to zeros.
scaletozero(ViewAngles.Yaw, YAW_LOOKRETURN); scaletozero(ViewAngles.Yaw, YAW_LOOKRETURN);
scaletozero(ViewAngles.Roll, YAW_LOOKRETURN); scaletozero(ViewAngles.Roll, YAW_LOOKRETURN);

View file

@ -56,8 +56,7 @@
EXTERN_CVAR(Bool, cl_capfps) EXTERN_CVAR(Bool, cl_capfps)
extern int resyncVRYawWithGame; extern float vrYaw;
extern float gameYaw;
PalEntry GlobalMapFog; PalEntry GlobalMapFog;
float GlobalFogDensity = 350.f; float GlobalFogDensity = 350.f;
@ -236,17 +235,24 @@ FRenderViewpoint SetupViewpoint(DCoreActor* cam, const DVector3& position, int s
if (gamestate == GS_LEVEL) if (gamestate == GS_LEVEL)
{ {
gameYaw -= hmdYawDeltaDegrees; // Special frame-yaw-resync code
} // Basically, if the game code changes the player's yaw, then we need to gradually resync
// 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
// of sync with the game's yaw for very long
{
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);
}
if (gamestate == GS_LEVEL && resyncVRYawWithGame) //And now apply the delta of hmd movement for this frame
{ vrYaw -= hmdYawDeltaDegrees;
if (resyncVRYawWithGame > 0)
gameYaw = (float) (-90.f + angles.Yaw.Degrees());
resyncVRYawWithGame--;
} }
} }
FRenderViewpoint r_viewpoint{}; FRenderViewpoint r_viewpoint{};
r_viewpoint.CameraActor = cam; r_viewpoint.CameraActor = cam;
@ -259,7 +265,7 @@ FRenderViewpoint SetupViewpoint(DCoreActor* cam, const DVector3& position, int s
} }
else else
{ {
r_viewpoint.HWAngles.Yaw = FAngle::fromDeg(gameYaw); r_viewpoint.HWAngles.Yaw = FAngle::fromDeg(vrYaw);
} }
r_viewpoint.HWAngles.Pitch = FAngle::fromDeg(pitch); r_viewpoint.HWAngles.Pitch = FAngle::fromDeg(pitch);
r_viewpoint.HWAngles.Roll = FAngle::fromDeg(roll); r_viewpoint.HWAngles.Roll = FAngle::fromDeg(roll);

View file

@ -44,7 +44,7 @@ const char *GetVersionString();
#define VERSIONSTR "1.7pre" #define VERSIONSTR "1.7pre"
#define RAZEXR_VERSIONSTR "RazeXR 0.2.4" #define RAZEXR_VERSIONSTR "RazeXR 0.2.5"
// 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

View file

@ -39,8 +39,6 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
#include "misc.h" #include "misc.h"
#include "weapon.h" #include "weapon.h"
extern int resyncVRYawWithGame;
BEGIN_SW_NS BEGIN_SW_NS
DVector2 DoTrack(SECTOR_OBJECT* sop, short locktics); DVector2 DoTrack(SECTOR_OBJECT* sop, short locktics);
@ -1519,12 +1517,6 @@ void MovePlayer(PLAYER* pp, SECTOR_OBJECT* sop, const DVector2& move)
// Last known angle is now adjusted by the delta angle // Last known angle is now adjusted by the delta angle
pp->RevolveAng = deltaangle(pp->RevolveDeltaAng, pp->actor->spr.Angles.Yaw); pp->RevolveAng = deltaangle(pp->RevolveDeltaAng, pp->actor->spr.Angles.Yaw);
//A VR thing..
if (pp->RevolveAng.Degrees() != 0.0)
{
resyncVRYawWithGame = 1;
}
} }
// increment Players delta angle // increment Players delta angle

View file

@ -81,8 +81,6 @@ pad_a +open
pad_y +jump pad_y +jump
rtrigger +attack rtrigger +attack
ltrigger +altattack ltrigger +altattack
lshoulder weapprev
rshoulder weapnext
dpadleft invprev dpadleft invprev
dpadright invnext dpadright invnext
dpaddown invuse dpaddown invuse