More virtual stock stuff

This commit is contained in:
Simon 2020-08-31 15:02:33 +01:00
parent f0d839b38f
commit 62eef448fc
10 changed files with 88 additions and 33 deletions

View file

@ -1340,8 +1340,8 @@ void RTCWVR_Init()
vr.backpackitemactive = 0; vr.backpackitemactive = 0;
vr.visible_hud = qtrue; vr.visible_hud = qtrue;
vr.dualwield = qfalse; vr.dualwield = qfalse;
vr.vstock_weapon = qfalse; vr.ironsight_lock_weapon = qfalse;
vr.vstock_engaged = qfalse; vr.ironsight_lock_engaged = qfalse;
//Clear teleport stuff //Clear teleport stuff
vr.teleportexecute = qfalse; vr.teleportexecute = qfalse;

View file

@ -44,9 +44,10 @@ typedef struct {
qboolean detachablescope; // Scope can be detached from weapon qboolean detachablescope; // Scope can be detached from weapon
//Virtual Stock stuff //Virtual Stock stuff
qboolean vstock_weapon; // Weapon has a stock that can be used "vitually" qboolean ironsight_lock_weapon; // Weapon can be used with ironsight lock mode
qboolean vstock_engaged; // Virtual Stock is engaged qboolean ironsight_lock_engaged; // Ironsight Lock is engaged
vec3_t vstock_weapon_offset; // The offset of the fixed primary hand when Virtual Stock is engaged (set by cgame Weapon code) vec3_t ironsight_lock_offset; // The weapon offset location when iron sight lock is engaged (set by cgame Weapon code)
vec3_t vstock_shoulder; // The pivot point (shoulder) when classic virtual stock is used (instead of the dominant controller)
qboolean hasbinoculars; qboolean hasbinoculars;

View file

@ -44,7 +44,7 @@ void HandleInput_WeaponAlign( ovrInputStateTrackedRemote *pDominantTrackedRemote
int domButton1, int domButton2, int offButton1, int offButton2 ); int domButton1, int domButton2, int offButton1, int offButton2 );
void CalculateShoulderPosition();
void updateScopeAngles(); void updateScopeAngles();
#endif //vrinput_h #endif //vrinput_h

View file

@ -122,6 +122,20 @@ void acquireTrackedRemotesData(const ovrMobile *Ovr, double displayTime) {//The
} }
} }
void CalculateShoulderPosition()
{
VectorCopy(vr.hmdposition, vr.vstock_shoulder);
//Adjust to shoulder location for when vstock was engaged
vr.vstock_shoulder[1] -= 0.25f;
//This bit might be overkill
/*
vec2_t xy;
rotateAboutOrigin(0.25f, 0.0f, - vr.hmdorientation[YAW], xy);
vr.vstock_shoulder[0] += xy[0];
vr.vstock_shoulder[1] += xy[1];
*/
}
//YAW: Left increase, Right decrease //YAW: Left increase, Right decrease
void updateScopeAngles() void updateScopeAngles()
@ -129,14 +143,14 @@ void updateScopeAngles()
//Bit of a hack, but use weapon orientation / position for view when scope is engaged //Bit of a hack, but use weapon orientation / position for view when scope is engaged
static vec3_t currentScopeAngles; static vec3_t currentScopeAngles;
static vec3_t lastScopeAngles; static vec3_t lastScopeAngles;
if (vr.scopeengaged || vr.vstock_engaged) if (vr.scopeengaged || vr.ironsight_lock_engaged)
{ {
if (vr.vstock_engaged) if (vr.ironsight_lock_engaged)
{ {
//Copy weapon offset X //Copy weapon offset X
vr.calculated_weaponoffset[0] = vr.vstock_weapon_offset[1]; vr.calculated_weaponoffset[0] = vr.ironsight_lock_offset[1];
vr.calculated_weaponoffset[1] = vr.vstock_weapon_offset[2]; vr.calculated_weaponoffset[1] = vr.ironsight_lock_offset[2];
vr.calculated_weaponoffset[2] = vr.vstock_weapon_offset[0]; vr.calculated_weaponoffset[2] = vr.ironsight_lock_offset[0];
} }
else else
{ {

View file

@ -173,12 +173,26 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
if (distance < (STABILISATION_DISTANCE / 2.0f)) if (distance < (STABILISATION_DISTANCE / 2.0f))
{ {
stabilised = qtrue; stabilised = qtrue;
if (vr.weapon_stabilised != stabilised) {
// blip to let user know they are stabilised
RTCWVR_Vibrate(100, 0, 0.4);
RTCWVR_Vibrate(100, 1, 0.4);
}
} }
} }
else if ((pOffTrackedRemoteNew->Buttons & ovrButton_GripTrigger) && (distance < STABILISATION_DISTANCE)) else if ((pOffTrackedRemoteNew->Buttons & ovrButton_GripTrigger) && (distance < STABILISATION_DISTANCE))
{ {
stabilised = qtrue; stabilised = qtrue;
} }
//Recalculate shoulder position if required
if (vr.weapon_stabilised != stabilised &&
vr_virtual_stock->integer == 1 &&
(pOffTrackedRemoteNew->Buttons & ovrButton_GripTrigger))
{
CalculateShoulderPosition();
}
vr.weapon_stabilised = stabilised; vr.weapon_stabilised = stabilised;
//Engage scope / virtual stock if conditions are right //Engage scope / virtual stock if conditions are right
@ -198,11 +212,11 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
} }
} }
//Engage scope / virtual stock if conditions are right //Engage scope / virtual stock (iron sight lock) if conditions are right
qboolean vstockReady = vr.weapon_stabilised && (distanceToHMD < VSTOCK_ENGAGE_DISTANCE) && qboolean vstockReady = vr.weapon_stabilised && (distanceToHMD < VSTOCK_ENGAGE_DISTANCE) &&
(vr.vstock_weapon && vr_virtual_stock->integer > 0); (vr.ironsight_lock_weapon && vr_virtual_stock->integer >= 2);
if (vstockReady != vr.vstock_engaged) { if (vstockReady != vr.ironsight_lock_engaged) {
vr.vstock_engaged = vstockReady; vr.ironsight_lock_engaged = vstockReady;
//Resync on either transition //Resync on either transition
RTCWVR_ResyncClientYawWithGameYaw(); RTCWVR_ResyncClientYawWithGameYaw();
@ -247,8 +261,14 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
vr.current_weaponoffset[2] = pWeapon->HeadPose.Pose.Position.z - vr.hmdposition[2]; vr.current_weaponoffset[2] = pWeapon->HeadPose.Pose.Position.z - vr.hmdposition[2];
vr.current_weaponoffset_timestamp = Sys_Milliseconds( ); vr.current_weaponoffset_timestamp = Sys_Milliseconds( );
//Lerp (stabilises pistol) - Won't have any effect on any other weapons //Lerp (stabilises pistol)
VectorLerp(vr.weaponoffset_history[1], (vr.pistol && vr.weapon_stabilised) ? 0.25f : 1.0f, vr.current_weaponoffset, vr.calculated_weaponoffset); if (vr.pistol && vr.weapon_stabilised)
{
//First update current weapon offset with average of the two controller positions
VectorLerp(vr.offhandoffset, 0.5f, vr.current_weaponoffset, vr.current_weaponoffset);
//Now lerp with previous position to smooth it out
VectorLerp(vr.weaponoffset_history[0], 0.5f, vr.current_weaponoffset, vr.calculated_weaponoffset);
}
//Does weapon velocity trigger attack (knife) and is it fast enough //Does weapon velocity trigger attack (knife) and is it fast enough
static qboolean velocityTriggeredAttack = false; static qboolean velocityTriggeredAttack = false;
@ -278,7 +298,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
//Don't do this for pistols //Don't do this for pistols
if (!vr.pistol && (vr.weapon_stabilised || vr.dualwield)) if (!vr.pistol && (vr.weapon_stabilised || vr.dualwield))
{ {
if (vr.scopeengaged || vr.vstock_engaged) if (vr.scopeengaged || vr.ironsight_lock_engaged)
{ {
float x = pOff->HeadPose.Pose.Position.x - vr.hmdposition[0]; float x = pOff->HeadPose.Pose.Position.x - vr.hmdposition[0];
float y = pOff->HeadPose.Pose.Position.y - (vr.hmdposition[1] - 0.1f); // Use a point lower float y = pOff->HeadPose.Pose.Position.y - (vr.hmdposition[1] - 0.1f); // Use a point lower
@ -289,7 +309,21 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
VectorSet(vr.weaponangles, -degrees(atanf(y / zxDist)), VectorSet(vr.weaponangles, -degrees(atanf(y / zxDist)),
-degrees(atan2f(x, -z)), 0); -degrees(atan2f(x, -z)), 0);
} }
} else { }
else if (vr_virtual_stock->integer == 1) // Classic Virtual Stock
{
float x = pOff->HeadPose.Pose.Position.x - vr.vstock_shoulder[0];
float y = pOff->HeadPose.Pose.Position.y - vr.vstock_shoulder[1];
float z = pOff->HeadPose.Pose.Position.z - vr.vstock_shoulder[2];
float zxDist = length(x, z);
if (zxDist != 0.0f && z != 0.0f) {
VectorSet(vr.weaponangles, -degrees(atanf(y / zxDist)),
-degrees(atan2f(x, -z)), 0); // No roll on virtual stock
}
}
else
{
float x = pOff->HeadPose.Pose.Position.x - pWeapon->HeadPose.Pose.Position.x; float x = pOff->HeadPose.Pose.Position.x - pWeapon->HeadPose.Pose.Position.x;
float y = pOff->HeadPose.Pose.Position.y - pWeapon->HeadPose.Pose.Position.y; float y = pOff->HeadPose.Pose.Position.y - pWeapon->HeadPose.Pose.Position.y;
float z = pOff->HeadPose.Pose.Position.z - pWeapon->HeadPose.Pose.Position.z; float z = pOff->HeadPose.Pose.Position.z - pWeapon->HeadPose.Pose.Position.z;
@ -659,6 +693,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
} }
RTCWVR_ResyncClientYawWithGameYaw(); RTCWVR_ResyncClientYawWithGameYaw();
CalculateShoulderPosition();
} }
} else if (pPrimaryJoystick->x < 0.3f) { } else if (pPrimaryJoystick->x < 0.3f) {
increaseSnap = true; increaseSnap = true;
@ -681,6 +716,7 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
} }
RTCWVR_ResyncClientYawWithGameYaw(); RTCWVR_ResyncClientYawWithGameYaw();
CalculateShoulderPosition();
} }
} else if (pPrimaryJoystick->x > -0.3f) { } else if (pPrimaryJoystick->x > -0.3f) {
decreaseSnap = true; decreaseSnap = true;

View file

@ -3685,7 +3685,8 @@ void CG_DrawActive( int stereoView ) {
int vr_cinematic_stereo = trap_Cvar_VariableIntegerValue( "vr_cinematic_stereo"); int vr_cinematic_stereo = trap_Cvar_VariableIntegerValue( "vr_cinematic_stereo");
if ( !cgVR->scopeengaged && if ( !cgVR->scopeengaged &&
(!cg.cameraMode || (cg.cameraMode && vr_cinematic_stereo)) && (!cg.cameraMode || (cg.cameraMode && vr_cinematic_stereo)) &&
!cgVR->vstock_engaged) { !(cgVR->ironsight_lock_engaged && vStock == 2))
{
VectorMA( cg.refdef.vieworg, -separation, cg.refdef.viewaxis[1], cg.refdef.vieworg ); VectorMA( cg.refdef.vieworg, -separation, cg.refdef.viewaxis[1], cg.refdef.vieworg );
} }

View file

@ -2091,7 +2091,7 @@ static float CG_CalculateWeaponPositionAndScale( playerState_t *ps, vec3_t origi
&(adjust[PITCH]), &(adjust[YAW]), &(adjust[ROLL])); &(adjust[PITCH]), &(adjust[YAW]), &(adjust[ROLL]));
VectorScale(temp_offset, scale, offset); VectorScale(temp_offset, scale, offset);
if (cgVR->vstock_engaged) { if (cgVR->ironsight_lock_engaged) {
adjust[YAW] += virtualStockOffsets[ps->weapon][0]; adjust[YAW] += virtualStockOffsets[ps->weapon][0];
} }
@ -3666,14 +3666,14 @@ void CG_AddViewWeapon( playerState_t *ps ) {
case WP_KNIFE: case WP_KNIFE:
cgVR->velocitytriggered = qtrue; cgVR->velocitytriggered = qtrue;
cgVR->scopedweapon = qfalse; cgVR->scopedweapon = qfalse;
cgVR->vstock_weapon = qfalse; cgVR->ironsight_lock_weapon = qfalse;
break; break;
case WP_LUGER: case WP_LUGER:
case WP_SILENCER: case WP_SILENCER:
case WP_COLT: case WP_COLT:
cgVR->velocitytriggered = qfalse; cgVR->velocitytriggered = qfalse;
cgVR->scopedweapon = qfalse; cgVR->scopedweapon = qfalse;
cgVR->vstock_weapon = qfalse; cgVR->ironsight_lock_weapon = qfalse;
cgVR->pistol = qtrue; cgVR->pistol = qtrue;
break; break;
case WP_FG42: case WP_FG42:
@ -3681,13 +3681,14 @@ void CG_AddViewWeapon( playerState_t *ps ) {
cgVR->velocitytriggered = qfalse; cgVR->velocitytriggered = qfalse;
cgVR->scopedweapon = qtrue; cgVR->scopedweapon = qtrue;
cgVR->detachablescope = qtrue; cgVR->detachablescope = qtrue;
cgVR->vstock_weapon = cgVR->scopedetached; // only available when not scoped cgVR->ironsight_lock_weapon = cgVR->scopedetached; // only available when not scoped
break; break;
case WP_THOMPSON: case WP_THOMPSON:
case WP_STEN: case WP_STEN:
case WP_MP40:
cgVR->velocitytriggered = qfalse; cgVR->velocitytriggered = qfalse;
cgVR->scopedweapon = qfalse; cgVR->scopedweapon = qfalse;
cgVR->vstock_weapon = qtrue; // only available when not scoped cgVR->ironsight_lock_weapon = qtrue; // only available when not scoped
break; break;
case WP_GARAND: case WP_GARAND:
case WP_SNOOPERSCOPE: case WP_SNOOPERSCOPE:
@ -3697,18 +3698,19 @@ void CG_AddViewWeapon( playerState_t *ps ) {
cgVR->scopedweapon = qtrue; cgVR->scopedweapon = qtrue;
cgVR->scopedetached = qfalse; cgVR->scopedetached = qfalse;
cgVR->detachablescope = qfalse; cgVR->detachablescope = qfalse;
cgVR->vstock_weapon = qfalse; cgVR->ironsight_lock_weapon = qfalse;
break; break;
default: default:
cgVR->velocitytriggered = qfalse; cgVR->velocitytriggered = qfalse;
cgVR->scopedweapon = qfalse; cgVR->scopedweapon = qfalse;
cgVR->vstock_weapon = qfalse; cgVR->ironsight_lock_weapon = qfalse;
break; break;
} }
int controlScheme = trap_Cvar_VariableIntegerValue("vr_control_scheme");
int vStock = trap_Cvar_VariableIntegerValue("vr_virtual_stock"); int vStock = trap_Cvar_VariableIntegerValue("vr_virtual_stock");
if (vStock) { if (vStock >= 2) {
float multiplier = (vStock == 1 ? -1.0f : 1.0f); float multiplier = (controlScheme == 0 ? -1.0f : 1.0f);
vec3_t offset; vec3_t offset;
VectorClear(offset); VectorClear(offset);
@ -3720,11 +3722,12 @@ void CG_AddViewWeapon( playerState_t *ps ) {
vec3_t forward, right, up; vec3_t forward, right, up;
AngleVectors(orientation, forward, right, up); AngleVectors(orientation, forward, right, up);
//VectorMA(offset, (cg_stereoSeparation.value / 2.0f) * multiplier, right, offset); if (vStock == 3)
VectorMA(offset, (cg_stereoSeparation.value / 2.0f) * multiplier, right, offset);
VectorMA(offset, virtualStockOffsets[ps->weapon][1], up, offset); VectorMA(offset, virtualStockOffsets[ps->weapon][1], up, offset);
VectorMA(offset, virtualStockOffsets[ps->weapon][2], forward, offset); VectorMA(offset, virtualStockOffsets[ps->weapon][2], forward, offset);
VectorCopy(offset, cgVR->vstock_weapon_offset); VectorCopy(offset, cgVR->ironsight_lock_offset);
} }
// add everything onto the hand // add everything onto the hand

View file

@ -280,7 +280,7 @@ itemDef
text "Virtual Stock:" text "Virtual Stock:"
type ITEM_TYPE_MULTI type ITEM_TYPE_MULTI
cvar "vr_virtual_stock" cvar "vr_virtual_stock"
cvarFloatList {"Off" 0 "Enabled (Right Eye)" 1 "Enabled (Left Eye)" 2 } cvarFloatList {"Off" 0 "Classic" 1 "Ironsight Lock (Mono)" 2 "Ironsight Lock (Stereo)" 3 }
rect 82 165 290 12 rect 82 165 290 12
textalign ITEM_ALIGN_RIGHT textalign ITEM_ALIGN_RIGHT
textalignx 142 textalignx 142

View file

@ -253,7 +253,7 @@ itemDef
text "Virtual Stock:" text "Virtual Stock:"
type ITEM_TYPE_MULTI type ITEM_TYPE_MULTI
cvar "vr_virtual_stock" cvar "vr_virtual_stock"
cvarFloatList {"Off" 0 "Enabled (Right Eye)" 1 "Enabled (Left Eye)" 2 } cvarFloatList {"Off" 0 "Classic" 1 "Ironsight Lock (Mono)" 2 "Ironsight Lock (Stereo)" 3 }
rect 82 165 290 12 rect 82 165 290 12
textalign ITEM_ALIGN_RIGHT textalign ITEM_ALIGN_RIGHT
textalignx 142 textalignx 142

Binary file not shown.