2020-06-10 18:20:11 +00:00
/************************************************************************************
Filename : VrInputDefault . c
Content : Handles default controller input
Created : August 2019
Authors : Simon Brown
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2020-08-24 22:23:04 +00:00
# include "../../../../../../VrApi/Include/VrApi.h"
# include "../../../../../../VrApi/Include/VrApi_Helpers.h"
# include "../../../../../../VrApi/Include/VrApi_SystemUtils.h"
# include "../../../../../../VrApi/Include/VrApi_Input.h"
# include "../../../../../../VrApi/Include/VrApi_Types.h"
2020-07-10 21:46:52 +00:00
# include <android/keycodes.h>
2020-06-10 18:20:11 +00:00
# include "VrInput.h"
# include "VrCvars.h"
2020-08-23 16:58:43 +00:00
# include <src/qcommon/qcommon.h>
# include <src/client/client.h>
2020-08-24 22:23:04 +00:00
2020-07-19 14:41:27 +00:00
# define WP_AKIMBO 20
2020-07-20 18:56:58 +00:00
void SV_Trace ( trace_t * results , const vec3_t start , const vec3_t mins , const vec3_t maxs , const vec3_t end , int passEntityNum , int contentmask , int capsule ) ;
2020-06-30 23:03:19 +00:00
2021-05-01 05:56:52 +00:00
void RTCWVR_HapticEvent ( const char * event , int position , int flags , int intensity , float angle , float yHeight ) ;
2022-01-07 22:34:14 +00:00
static inline float AngleBetweenVectors ( const vec3_t a , const vec3_t b )
{
return degrees ( acosf ( DotProduct ( a , b ) / ( VectorLength ( a ) * VectorLength ( b ) ) ) ) ;
}
2021-07-15 22:54:51 +00:00
void HandleInput_Default ( ovrInputStateGamepad * pFootTrackingNew , ovrInputStateGamepad * pFootTrackingOld ,
ovrInputStateTrackedRemote * pDominantTrackedRemoteNew , ovrInputStateTrackedRemote * pDominantTrackedRemoteOld , ovrTracking * pDominantTracking ,
2020-06-10 18:20:11 +00:00
ovrInputStateTrackedRemote * pOffTrackedRemoteNew , ovrInputStateTrackedRemote * pOffTrackedRemoteOld , ovrTracking * pOffTracking ,
int domButton1 , int domButton2 , int offButton1 , int offButton2 )
{
//Ensure handedness is set correctly
2020-08-02 14:24:06 +00:00
vr . right_handed = vr_control_scheme - > value < 10 | |
vr_control_scheme - > value = = 99 ; // Always right-handed for weapon calibration
2020-06-10 18:20:11 +00:00
2020-07-20 18:56:58 +00:00
vr . teleportenabled = vr_teleport - > integer ! = 0 ;
2020-06-10 18:20:11 +00:00
static qboolean dominantGripPushed = false ;
static float dominantGripPushTime = 0.0f ;
2020-07-01 22:49:41 +00:00
static bool canUseBackpack = false ;
2022-01-07 22:34:14 +00:00
static bool canUseQuickSave = false ;
2020-07-01 22:49:41 +00:00
2020-07-05 09:49:07 +00:00
//Need this for the touch screen
2020-07-19 14:41:27 +00:00
ovrTracking * pWeapon = pDominantTracking ;
ovrTracking * pOff = pOffTracking ;
if ( vr . weaponid = = WP_AKIMBO & &
2020-07-19 21:39:17 +00:00
! vr . right_handed & &
! RTCWVR_useScreenLayer ( ) )
2020-07-19 14:41:27 +00:00
{
//Revert to same weapon controls as right-handed if using akimbo
pWeapon = pOffTracking ;
pOff = pDominantTracking ;
}
2020-08-23 16:58:43 +00:00
//All this to allow stick and button switching!
2020-08-16 17:31:46 +00:00
ovrVector2f * pPrimaryJoystick ;
ovrVector2f * pSecondaryJoystick ;
2020-08-23 16:58:43 +00:00
uint32_t primaryButtonsNew ;
uint32_t primaryButtonsOld ;
uint32_t secondaryButtonsNew ;
uint32_t secondaryButtonsOld ;
int primaryButton1 ;
int primaryButton2 ;
int secondaryButton1 ;
int secondaryButton2 ;
2020-08-16 17:31:46 +00:00
if ( vr_switch_sticks - > integer )
{
2020-08-23 16:58:43 +00:00
//
// This will switch the joystick and A/B/X/Y button functions only
// Move, Strafe, Turn, Jump, Crouch, Notepad, HUD mode, Weapon Switch
2020-08-16 17:31:46 +00:00
pSecondaryJoystick = & pDominantTrackedRemoteNew - > Joystick ;
pPrimaryJoystick = & pOffTrackedRemoteNew - > Joystick ;
2020-08-23 16:58:43 +00:00
secondaryButtonsNew = pDominantTrackedRemoteNew - > Buttons ;
secondaryButtonsOld = pDominantTrackedRemoteOld - > Buttons ;
primaryButtonsNew = pOffTrackedRemoteNew - > Buttons ;
primaryButtonsOld = pOffTrackedRemoteOld - > Buttons ;
primaryButton1 = offButton1 ;
primaryButton2 = offButton2 ;
secondaryButton1 = domButton1 ;
secondaryButton2 = domButton2 ;
2020-08-16 17:31:46 +00:00
}
else
{
pPrimaryJoystick = & pDominantTrackedRemoteNew - > Joystick ;
pSecondaryJoystick = & pOffTrackedRemoteNew - > Joystick ;
2020-08-23 16:58:43 +00:00
primaryButtonsNew = pDominantTrackedRemoteNew - > Buttons ;
primaryButtonsOld = pDominantTrackedRemoteOld - > Buttons ;
secondaryButtonsNew = pOffTrackedRemoteNew - > Buttons ;
secondaryButtonsOld = pOffTrackedRemoteOld - > Buttons ;
primaryButton1 = domButton1 ;
primaryButton2 = domButton2 ;
secondaryButton1 = offButton1 ;
secondaryButton2 = offButton2 ;
2020-08-16 17:31:46 +00:00
}
2020-07-05 09:49:07 +00:00
{
//Set gun angles - We need to calculate all those we might need (including adjustments) for the client to then take its pick
vec3_t rotation = { 0 } ;
2023-09-27 14:13:08 +00:00
rotation [ PITCH ] = - 25 ;
QuatToYawPitchRoll ( pDominantTracking - > HeadPose . Pose . Orientation , rotation , vr . dominanthandangles ) ;
2020-07-21 21:34:22 +00:00
rotation [ PITCH ] = 30 ;
2020-07-19 14:41:27 +00:00
QuatToYawPitchRoll ( pWeapon - > HeadPose . Pose . Orientation , rotation , vr . weaponangles_knife ) ;
2020-09-02 21:54:08 +00:00
rotation [ PITCH ] = vr_weapon_pitchadjust - > value +
2020-09-03 18:17:44 +00:00
( vr . pistol ? vr . weapon_recoil : 0.0f ) ; // Our hacked recoil effect
vr . weapon_recoil * = 0.8f ; // quick reduction on synthetic recoil
2020-07-19 14:41:27 +00:00
QuatToYawPitchRoll ( pWeapon - > HeadPose . Pose . Orientation , rotation , vr . weaponangles ) ;
2020-07-05 09:49:07 +00:00
VectorSubtract ( vr . weaponangles_last , vr . weaponangles , vr . weaponangles_delta ) ;
VectorCopy ( vr . weaponangles , vr . weaponangles_last ) ;
ALOGV ( " weaponangles_last: %f, %f, %f " ,
vr . weaponangles_last [ 0 ] , vr . weaponangles_last [ 1 ] , vr . weaponangles_last [ 2 ] ) ;
2022-02-25 16:13:07 +00:00
//GB Also set offhand angles just in case we want to use those.
vec3_t rotation_off = { 0 } ;
2023-09-27 14:13:08 +00:00
rotation_off [ PITCH ] = - 25 ;
2022-02-25 16:13:07 +00:00
QuatToYawPitchRoll ( pOff - > HeadPose . Pose . Orientation , rotation_off , vr . offhandangles ) ;
VectorSubtract ( vr . offhandangles_last , vr . offhandangles , vr . offhandangles_delta ) ;
VectorCopy ( vr . offhandangles , vr . offhandangles_last ) ;
2020-07-05 09:49:07 +00:00
}
2020-07-01 22:49:41 +00:00
//Menu button
2020-06-10 18:20:11 +00:00
handleTrackedControllerButton ( & leftTrackedRemoteState_new , & leftTrackedRemoteState_old , ovrButton_Enter , K_ESCAPE ) ;
2023-03-20 21:39:58 +00:00
static float menuYaw = 0 ;
static bool switchedMenuControls = qfalse ;
2020-07-01 22:49:41 +00:00
if ( RTCWVR_useScreenLayer ( ) )
2020-06-10 18:20:11 +00:00
{
2023-03-20 21:39:58 +00:00
bool controlsLeftHanded = vr_control_scheme - > integer > = 10 ;
if ( ( controlsLeftHanded & & ! switchedMenuControls ) | | ( ! controlsLeftHanded & & switchedMenuControls ) ) {
interactWithTouchScreen ( menuYaw , vr . offhandangles ) ;
handleTrackedControllerButton ( pOffTrackedRemoteNew , pOffTrackedRemoteOld , offButton1 , K_MOUSE1 ) ;
handleTrackedControllerButton ( pOffTrackedRemoteNew , pOffTrackedRemoteOld , ovrButton_Trigger , K_MOUSE1 ) ;
handleTrackedControllerButton ( pOffTrackedRemoteNew , pOffTrackedRemoteOld , offButton2 , K_ESCAPE ) ;
if ( ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ! = ( pDominantTrackedRemoteOld - > Buttons & ovrButton_Trigger ) & & ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ) {
switchedMenuControls = ! switchedMenuControls ;
}
} else {
2023-09-27 14:13:08 +00:00
interactWithTouchScreen ( menuYaw , vr . dominanthandangles ) ;
2023-03-20 21:39:58 +00:00
handleTrackedControllerButton ( pDominantTrackedRemoteNew , pDominantTrackedRemoteOld , domButton1 , K_MOUSE1 ) ;
handleTrackedControllerButton ( pDominantTrackedRemoteNew , pDominantTrackedRemoteOld , ovrButton_Trigger , K_MOUSE1 ) ;
handleTrackedControllerButton ( pDominantTrackedRemoteNew , pDominantTrackedRemoteOld , domButton2 , K_ESCAPE ) ;
if ( ( pOffTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ! = ( pOffTrackedRemoteOld - > Buttons & ovrButton_Trigger ) & & ( pOffTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ) {
switchedMenuControls = ! switchedMenuControls ;
}
}
2020-06-10 18:20:11 +00:00
}
2020-06-30 23:03:19 +00:00
else
2020-06-10 18:20:11 +00:00
{
2023-03-20 21:39:58 +00:00
menuYaw = vr . hmdorientation [ YAW ] ;
2020-07-03 22:26:33 +00:00
2020-07-19 14:41:27 +00:00
float distance = sqrtf ( powf ( pOff - > HeadPose . Pose . Position . x - pWeapon - > HeadPose . Pose . Position . x , 2 ) +
powf ( pOff - > HeadPose . Pose . Position . y - pWeapon - > HeadPose . Pose . Position . y , 2 ) +
powf ( pOff - > HeadPose . Pose . Position . z - pWeapon - > HeadPose . Pose . Position . z , 2 ) ) ;
2020-06-10 18:20:11 +00:00
2020-07-19 14:41:27 +00:00
float distanceToHMD = sqrtf ( powf ( vr . hmdposition [ 0 ] - pWeapon - > HeadPose . Pose . Position . x , 2 ) +
powf ( vr . hmdposition [ 1 ] - pWeapon - > HeadPose . Pose . Position . y , 2 ) +
powf ( vr . hmdposition [ 2 ] - pWeapon - > HeadPose . Pose . Position . z , 2 ) ) ;
2020-07-09 22:53:06 +00:00
2022-02-25 16:13:07 +00:00
float distanceToHMDOff = sqrtf ( powf ( vr . hmdposition [ 0 ] - pOff - > HeadPose . Pose . Position . x , 2 ) +
powf ( vr . hmdposition [ 1 ] - pOff - > HeadPose . Pose . Position . y , 2 ) +
powf ( vr . hmdposition [ 2 ] - pOff - > HeadPose . Pose . Position . z , 2 ) ) ;
float controllerYawHeading = 0.0f ;
2020-06-10 18:20:11 +00:00
//Turn on weapon stabilisation?
2020-08-26 09:01:48 +00:00
qboolean stabilised = qfalse ;
2020-09-01 18:27:10 +00:00
if ( ! vr . pistol & & // Don't stabilise pistols
( pOffTrackedRemoteNew - > Buttons & ovrButton_GripTrigger ) & & ( distance < STABILISATION_DISTANCE ) )
2020-08-26 09:01:48 +00:00
{
stabilised = qtrue ;
}
2020-08-31 14:02:33 +00:00
2020-08-26 09:01:48 +00:00
vr . weapon_stabilised = stabilised ;
2020-06-10 18:20:11 +00:00
2020-08-24 22:23:04 +00:00
//Engage scope / virtual stock if conditions are right
2020-07-28 21:58:16 +00:00
qboolean scopeready = vr . weapon_stabilised & & ( distanceToHMD < SCOPE_ENGAGE_DISTANCE ) ;
2020-08-24 22:23:04 +00:00
static qboolean lastScopeReady = qfalse ;
if ( scopeready ! = lastScopeReady ) {
2020-07-16 21:57:01 +00:00
if ( vr . scopedweapon & & ! vr . scopedetached ) {
if ( ! vr . scopeengaged & & scopeready ) {
ALOGV ( " **WEAPON EVENT** trigger scope mode " ) ;
sendButtonActionSimple ( " weapalt " ) ;
2020-08-02 14:24:06 +00:00
}
else if ( vr . scopeengaged & & ! scopeready ) {
ALOGV ( " **WEAPON EVENT** disable scope mode " ) ;
2020-07-16 21:57:01 +00:00
sendButtonActionSimple ( " weapalt " ) ;
}
2020-08-24 22:23:04 +00:00
lastScopeReady = scopeready ;
2020-07-14 17:56:03 +00:00
}
2020-07-09 22:53:06 +00:00
}
2022-02-25 16:13:07 +00:00
//ALOGV("**GB WEAPON ACTIVE** %i",vr.weaponid);
if ( ! scopeready & & vr . weaponid > = 15 & & vr . weaponid < = 17 )
{
lastScopeReady = false ;
ALOGV ( " **WEAPON EVENT** disable scope mode forced " ) ;
sendButtonActionSimple ( " weapalt " ) ;
}
2020-08-31 14:02:33 +00:00
//Engage scope / virtual stock (iron sight lock) if conditions are right
2020-08-02 14:24:06 +00:00
static qboolean scopeEngaged = qfalse ;
if ( scopeEngaged ! = vr . scopeengaged )
{
scopeEngaged = vr . scopeengaged ;
//Resync on either transition
RTCWVR_ResyncClientYawWithGameYaw ( ) ;
}
2020-07-15 22:16:44 +00:00
static qboolean binocularstate = qfalse ;
qboolean binocularsactive = ( vr . hasbinoculars & & vr . backpackitemactive = = 3 & &
( distanceToHMD < BINOCULAR_ENGAGE_DISTANCE ) & &
( pDominantTracking - > Status & ( VRAPI_TRACKING_STATUS_POSITION_TRACKED | VRAPI_TRACKING_STATUS_POSITION_VALID ) ) ) ;
if ( binocularstate ! = binocularsactive )
{
//Engage scope if conditions are right
binocularstate = binocularsactive ;
sendButtonAction ( " +zoom " , binocularstate ) ;
}
2020-06-10 18:20:11 +00:00
//dominant hand stuff first
{
2020-07-11 23:08:29 +00:00
//Record recent weapon position for trajectory based stuff
for ( int i = ( NUM_WEAPON_SAMPLES - 1 ) ; i ! = 0 ; - - i )
{
VectorCopy ( vr . weaponoffset_history [ i - 1 ] , vr . weaponoffset_history [ i ] ) ;
vr . weaponoffset_history_timestamp [ i ] = vr . weaponoffset_history_timestamp [ i - 1 ] ;
}
2020-08-26 09:01:48 +00:00
VectorCopy ( vr . current_weaponoffset , vr . weaponoffset_history [ 0 ] ) ;
vr . weaponoffset_history_timestamp [ 0 ] = vr . current_weaponoffset_timestamp ;
2020-07-11 23:08:29 +00:00
2020-06-10 18:20:11 +00:00
///Weapon location relative to view
2020-08-26 09:01:48 +00:00
vr . current_weaponoffset [ 0 ] = pWeapon - > HeadPose . Pose . Position . x - vr . hmdposition [ 0 ] ;
vr . current_weaponoffset [ 1 ] = pWeapon - > HeadPose . Pose . Position . y - vr . hmdposition [ 1 ] ;
vr . current_weaponoffset [ 2 ] = pWeapon - > HeadPose . Pose . Position . z - vr . hmdposition [ 2 ] ;
vr . current_weaponoffset_timestamp = Sys_Milliseconds ( ) ;
2020-09-01 18:27:10 +00:00
//Just copy to calculated offset, used to use this in case we wanted to apply any modifiers, but don't any more
VectorCopy ( vr . current_weaponoffset , vr . calculated_weaponoffset ) ;
2020-06-10 18:20:11 +00:00
2020-07-12 15:04:26 +00:00
//Does weapon velocity trigger attack (knife) and is it fast enough
2020-07-21 18:11:39 +00:00
static qboolean velocityTriggeredAttack = false ;
2020-07-12 15:04:26 +00:00
if ( vr . velocitytriggered )
{
static qboolean fired = qfalse ;
2020-07-19 14:41:27 +00:00
float velocity = sqrtf ( powf ( pWeapon - > HeadPose . LinearVelocity . x , 2 ) +
powf ( pWeapon - > HeadPose . LinearVelocity . y , 2 ) +
powf ( pWeapon - > HeadPose . LinearVelocity . z , 2 ) ) ;
2020-07-12 15:04:26 +00:00
2020-07-21 18:11:39 +00:00
velocityTriggeredAttack = ( velocity > VELOCITY_TRIGGER ) ;
2020-07-12 15:04:26 +00:00
2020-07-21 18:11:39 +00:00
if ( fired ! = velocityTriggeredAttack ) {
ALOGV ( " **WEAPON EVENT** veocity triggered %s " , velocityTriggeredAttack ? " +attack " : " -attack " ) ;
sendButtonAction ( " +attack " , velocityTriggeredAttack ) ;
fired = velocityTriggeredAttack ;
2020-07-12 15:04:26 +00:00
}
}
2020-07-21 18:11:39 +00:00
else if ( velocityTriggeredAttack )
{
//send a stop attack as we have an unfinished velocity attack
velocityTriggeredAttack = qfalse ;
ALOGV ( " **WEAPON EVENT** veocity triggered -attack " ) ;
sendButtonAction ( " +attack " , velocityTriggeredAttack ) ;
}
2020-07-12 15:04:26 +00:00
2020-09-01 18:27:10 +00:00
if ( vr . weapon_stabilised | | vr . dualwield )
2020-06-10 18:20:11 +00:00
{
2020-09-01 18:27:10 +00:00
if ( vr . scopeengaged | | ( vr_virtual_stock - > integer = = 1 & & // Classic Virtual Stock
! vr . dualwield ) )
2020-08-24 22:23:04 +00:00
{
2020-09-01 18:27:10 +00:00
//offset to the appropriate eye a little bit
vec2_t xy ;
rotateAboutOrigin ( Cvar_VariableValue ( " cg_stereoSeparation " ) / 2.0f , 0.0f , - vr . hmdorientation [ YAW ] , xy ) ;
float x = pOff - > HeadPose . Pose . Position . x - ( vr . hmdposition [ 0 ] + xy [ 0 ] ) ;
2020-08-26 09:01:48 +00:00
float y = pOff - > HeadPose . Pose . Position . y - ( vr . hmdposition [ 1 ] - 0.1f ) ; // Use a point lower
2020-09-01 18:27:10 +00:00
float z = pOff - > HeadPose . Pose . Position . z - ( vr . hmdposition [ 2 ] + xy [ 1 ] ) ;
2020-08-24 22:23:04 +00:00
float zxDist = length ( x , z ) ;
if ( zxDist ! = 0.0f & & z ! = 0.0f ) {
2020-07-16 22:52:04 +00:00
VectorSet ( vr . weaponangles , - degrees ( atanf ( y / zxDist ) ) ,
2020-08-24 22:23:04 +00:00
- degrees ( atan2f ( x , - z ) ) , 0 ) ;
}
2020-08-31 14:02:33 +00:00
}
else
{
2020-08-24 22:23:04 +00:00
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 z = pOff - > HeadPose . Pose . Position . z - pWeapon - > HeadPose . Pose . Position . z ;
float zxDist = length ( x , z ) ;
if ( zxDist ! = 0.0f & & z ! = 0.0f ) {
if ( vr . dualwield ) {
//SUPER FUDGE
VectorSet ( vr . weaponangles , vr . weaponangles [ PITCH ] ,
- 90.0f - degrees ( atan2f ( x , - z ) ) , degrees ( atanf ( y / zxDist ) ) ) ;
}
else
{
VectorSet ( vr . weaponangles , - degrees ( atanf ( y / zxDist ) ) ,
2020-08-26 09:01:48 +00:00
- degrees ( atan2f ( x , - z ) ) , vr . weaponangles [ ROLL ] / 2.0f ) ; //Dampen roll on stabilised weapon
2020-08-24 22:23:04 +00:00
}
2020-07-16 22:52:04 +00:00
}
2020-06-10 18:20:11 +00:00
}
}
2020-07-01 22:49:41 +00:00
static bool finishReloadNextFrame = false ;
if ( finishReloadNextFrame )
{
2020-07-16 21:57:01 +00:00
ALOGV ( " **WEAPON EVENT** -reload " ) ;
2020-07-01 22:49:41 +00:00
sendButtonActionSimple ( " -reload " ) ;
finishReloadNextFrame = false ;
}
2022-01-07 22:34:14 +00:00
// Calculate if player tries to reach backpack
bool handInBackpack = false ;
bool bpDistToHMDOk = false , bpWeaponHeightOk = false , bpWeaponAngleOk = false , bpHmdToWeaponAngleOk = false ;
vec3_t hmdForwardXY = { } , weaponForwardXY = { } ;
float weaponToDownAngle = 0 , hmdToWeaponDotProduct = 0 ;
static vec3_t downVector = { 0.0 , 0.0 , - 1.0 } ;
bool bpTrackOk = pOffTracking - > Status & VRAPI_TRACKING_STATUS_POSITION_TRACKED ; // 1) Position must be tracked
if ( bpTrackOk & & ( bpDistToHMDOk = distanceToHMD > = 0.2 & & distanceToHMD < = 0.35 ) // 2) Weapon-to-HMD distance must be within <0.2-0.35> range
& & ( bpWeaponHeightOk = vr . current_weaponoffset [ 1 ] > = - 0.10 & & vr . current_weaponoffset [ 1 ] < = 0.10 ) ) // 3) Weapon height in relation to HMD must be within <-0.10, 0.10> range
{
2022-01-07 23:18:43 +00:00
AngleVectors ( vr . hmdorientation , hmdForwardXY , NULL , NULL ) ;
AngleVectors ( vr . weaponangles , weaponForwardXY , NULL , NULL ) ;
2022-01-07 22:34:14 +00:00
float weaponToDownAngle = AngleBetweenVectors ( downVector , weaponForwardXY ) ;
// 4) Angle between weapon forward vector and a down vector must be within 80-140 degrees
if ( bpWeaponAngleOk = weaponToDownAngle > = 80.0 & & weaponToDownAngle < = 140.0 )
{
hmdForwardXY [ 2 ] = 0 ;
2022-01-07 23:18:43 +00:00
VectorNormalize ( hmdForwardXY ) ;
2022-01-07 22:34:14 +00:00
weaponForwardXY [ 2 ] = 0 ;
2022-01-07 23:18:43 +00:00
VectorNormalize ( weaponForwardXY ) ;
2022-01-07 22:34:14 +00:00
hmdToWeaponDotProduct = DotProduct ( hmdForwardXY , weaponForwardXY ) ;
// 5) HMD and weapon forward on XY plane must go in opposite directions (i.e. dot product < 0)
handInBackpack = bpHmdToWeaponAngleOk = hmdToWeaponDotProduct < 0 ;
}
}
// Uncomment to debug backpack reaching
/*
ALOGV ( " Backpack> Dist: %f | WpnToDownAngle: %f | WpnOffs: %f %f %f \n HmdWpnDot: %f | HmdFwdXY: %f %f | WpnFwdXY: %f %f \n TrackOk: %i, DistOk: %i, HeightOk: %i, WpnAngleOk: %i, HmdWpnDotOk: %i " ,
distanceToHMD , weaponToDownAngle , vr . current_weaponoffset [ 0 ] , vr . current_weaponoffset [ 1 ] , vr . current_weaponoffset [ 2 ] ,
hmdToWeaponDotProduct , hmdForwardXY [ 0 ] , hmdForwardXY [ 1 ] , weaponForwardXY [ 0 ] , weaponForwardXY [ 1 ] ,
bpTrackOk , bpDistToHMDOk , bpWeaponHeightOk , bpWeaponAngleOk , bpHmdToWeaponAngleOk ) ;
*/
2022-02-25 16:13:07 +00:00
//off-hand stuff (done here as I reference it in the save state thing
{
vr . offhandoffset [ 0 ] = pOff - > HeadPose . Pose . Position . x - vr . hmdposition [ 0 ] ;
vr . offhandoffset [ 1 ] = pOff - > HeadPose . Pose . Position . y - vr . hmdposition [ 1 ] ;
vr . offhandoffset [ 2 ] = pOff - > HeadPose . Pose . Position . z - vr . hmdposition [ 2 ] ;
vec3_t rotation = { 0 } ;
2023-09-27 14:13:08 +00:00
rotation [ PITCH ] = - 25 ;
2022-02-25 16:13:07 +00:00
QuatToYawPitchRoll ( pOff - > HeadPose . Pose . Orientation , rotation , vr . offhandangles ) ;
if ( vr_walkdirection - > value = = 0 ) {
controllerYawHeading = vr . offhandangles [ YAW ] - vr . hmdorientation [ YAW ] ;
}
else
{
controllerYawHeading = 0.0f ;
}
2022-01-07 22:34:14 +00:00
}
2022-02-25 16:13:07 +00:00
// Use off hand as well to trigger save condition
canUseQuickSave = false ;
bool bpOffhandDistToHMDOk = false , bpOffhandHeightOk = false , bpOffhandAngleOk = false , bpHmdToOffhandAngleOk = false ;
vec3_t offhandForwardXY = { } ;
float hmdToOffhandDotProduct = 0 ;
float offhandToDownAngle = 0 ;
if ( bpTrackOk & & ( bpOffhandDistToHMDOk = distanceToHMDOff > = 0.2 & & distanceToHMDOff < = 0.35 ) // 2) Off-to-HMD distance must be within <0.2-0.35> range
& & ( bpOffhandHeightOk = vr . offhandoffset [ 1 ] > = - 0.10 & & vr . offhandoffset [ 1 ] < = 0.10 ) ) // 3) Offhand height in relation to HMD must be within <-0.10, 0.10> range
{
//Need to do this again as might not have done it above and cant be bothered to refactor
AngleVectors ( vr . hmdorientation , hmdForwardXY , NULL , NULL ) ;
AngleVectors ( vr . offhandangles , offhandForwardXY , NULL , NULL ) ;
offhandToDownAngle = AngleBetweenVectors ( downVector , offhandForwardXY ) ;
// 4) Angle between weapon forward vector and a down vector must be within 80-140 degrees
if ( bpOffhandAngleOk = offhandToDownAngle > = 80.0 & & offhandToDownAngle < = 140.0 )
{
hmdForwardXY [ 2 ] = 0 ;
VectorNormalize ( hmdForwardXY ) ;
offhandForwardXY [ 2 ] = 0 ;
VectorNormalize ( offhandForwardXY ) ;
hmdToOffhandDotProduct = DotProduct ( hmdForwardXY , offhandForwardXY ) ;
// 5) HMD and weapon forward on XY plane must go in opposite directions (i.e. dot product < 0)
canUseQuickSave = bpHmdToOffhandAngleOk = hmdToOffhandDotProduct < 0 ;
}
}
// Uncomment to debug offhand reaching
ALOGV ( " Quick Save> Dist: %f | OffHandToDownAngle: %f | HandOffs: %f %f %f \n HmdHandDot: %f | HmdFwdXY: %f %f | WpnFwdXY: %f %f \n TrackOk: %i, DistOk: %i, HeightOk: %i, HnadAngleOk: %i, HmdHandDotOk: %i " ,
distanceToHMDOff , offhandToDownAngle , vr . offhandoffset [ 0 ] , vr . offhandoffset [ 1 ] , vr . offhandoffset [ 2 ] ,
hmdToOffhandDotProduct , hmdForwardXY [ 0 ] , hmdForwardXY [ 1 ] , offhandForwardXY [ 0 ] , offhandForwardXY [ 1 ] ,
bpTrackOk , bpOffhandDistToHMDOk , bpOffhandHeightOk , bpOffhandAngleOk , bpHmdToOffhandAngleOk ) ;
// Check quicksave
if ( canUseQuickSave ) {
2022-01-07 22:34:14 +00:00
int channel = ( vr_control_scheme - > integer > = 10 ) ? 1 : 0 ;
RTCWVR_Vibrate ( 40 , channel , 0.5 ) ; // vibrate to let user know they can switch
if ( ( ( pOffTrackedRemoteNew - > Buttons & offButton1 ) ! =
( pOffTrackedRemoteOld - > Buttons & offButton1 ) ) & &
( pOffTrackedRemoteNew - > Buttons & offButton1 ) ) {
sendButtonActionSimple ( " savegame quicksave " ) ;
}
if ( ( ( pOffTrackedRemoteNew - > Buttons & offButton2 ) ! =
( pOffTrackedRemoteOld - > Buttons & offButton2 ) ) & &
( pOffTrackedRemoteNew - > Buttons & offButton2 ) ) {
sendButtonActionSimple ( " loadgame quicksave " ) ;
}
}
if ( ! handInBackpack ) {
2020-07-01 22:49:41 +00:00
canUseBackpack = false ;
}
2020-07-15 22:16:44 +00:00
else if ( ! canUseBackpack & & vr . backpackitemactive = = 0 ) {
2020-07-01 22:49:41 +00:00
int channel = ( vr_control_scheme - > integer > = 10 ) ? 0 : 1 ;
2020-07-06 22:09:20 +00:00
RTCWVR_Vibrate ( 40 , channel , 0.5 ) ; // vibrate to let user know they can switch
2020-07-01 22:49:41 +00:00
canUseBackpack = true ;
}
2020-07-15 22:16:44 +00:00
dominantGripPushed = ( pDominantTrackedRemoteNew - > Buttons &
ovrButton_GripTrigger ) ! = 0 ;
bool dominantButton1Pushed = ( pDominantTrackedRemoteNew - > Buttons &
domButton1 ) ! = 0 ;
bool dominantButton2Pushed = ( pDominantTrackedRemoteNew - > Buttons &
domButton2 ) ! = 0 ;
if ( ! canUseBackpack )
{
if ( dominantGripPushed ) {
if ( dominantGripPushTime = = 0 ) {
dominantGripPushTime = GetTimeInMilliSeconds ( ) ;
}
}
else
{
if ( vr . backpackitemactive = = 1 ) {
//Restores last used weapon if possible
char buffer [ 32 ] ;
sprintf ( buffer , " weapon %i " , vr . lastweaponid ) ;
sendButtonActionSimple ( buffer ) ;
vr . backpackitemactive = 0 ;
}
else if ( ( GetTimeInMilliSeconds ( ) - dominantGripPushTime ) <
vr_reloadtimeoutms - > integer ) {
sendButtonActionSimple ( " +reload " ) ;
finishReloadNextFrame = true ;
}
dominantGripPushTime = 0 ;
}
2020-06-10 18:20:11 +00:00
2020-07-15 22:16:44 +00:00
if ( ! dominantButton1Pushed & & vr . backpackitemactive = = 2 )
{
char buffer [ 32 ] ;
sprintf ( buffer , " weapon %i " , vr . lastweaponid ) ;
sendButtonActionSimple ( buffer ) ;
vr . backpackitemactive = 0 ;
}
2020-07-01 22:49:41 +00:00
2020-07-15 22:16:44 +00:00
if ( ! dominantButton2Pushed & & vr . backpackitemactive = = 3 )
2020-07-01 22:49:41 +00:00
{
2020-07-15 22:16:44 +00:00
vr . backpackitemactive = 0 ;
}
} else {
if ( vr . backpackitemactive = = 0 ) {
if ( dominantGripPushed ) {
vr . lastweaponid = vr . weaponid ;
//Initiate grenade from backpack mode
sendButtonActionSimple ( " weaponbank 6 " ) ;
int channel = ( vr_control_scheme - > integer > = 10 ) ? 0 : 1 ;
RTCWVR_Vibrate ( 80 , channel , 0.8 ) ; // vibrate to let user know they switched
vr . backpackitemactive = 1 ;
}
else if ( dominantButton1Pushed )
{
vr . lastweaponid = vr . weaponid ;
//Initiate knife from backpack mode
sendButtonActionSimple ( " weapon 1 " ) ;
int channel = ( vr_control_scheme - > integer > = 10 ) ? 0 : 1 ;
RTCWVR_Vibrate ( 80 , channel , 0.8 ) ; // vibrate to let user know they switched
vr . backpackitemactive = 2 ;
}
else if ( dominantButton2Pushed & & vr . hasbinoculars )
{
int channel = ( vr_control_scheme - > integer > = 10 ) ? 0 : 1 ;
RTCWVR_Vibrate ( 80 , channel , 0.8 ) ; // vibrate to let user know they switched
vr . backpackitemactive = 3 ;
2020-07-01 22:49:41 +00:00
}
}
2020-06-10 18:20:11 +00:00
}
}
2022-02-25 16:13:07 +00:00
2020-06-10 18:20:11 +00:00
//Right-hand specific stuff
{
//This section corrects for the fact that the controller actually controls direction of movement, but we want to move relative to the direction the
//player is facing for positional tracking
2020-09-29 19:58:49 +00:00
//Positional movement speed correction for when we are not hitting target framerate
static double lastframetime = 0 ;
2021-04-20 20:10:50 +00:00
int refresh = GetRefresh ( ) ;
2020-09-29 19:58:49 +00:00
double newframetime = GetTimeInMilliSeconds ( ) ;
2021-04-20 20:10:50 +00:00
float multiplier = ( float ) ( ( 1000.0 / refresh ) / ( newframetime - lastframetime ) ) ;
2020-09-29 19:58:49 +00:00
lastframetime = newframetime ;
2020-06-10 18:20:11 +00:00
vec2_t v ;
2021-04-20 20:10:50 +00:00
float factor = ( refresh / 72.0F ) * vr_positional_factor - > value ; // adjust positional factor based on refresh rate
rotateAboutOrigin ( - vr . hmdposition_delta [ 0 ] * factor * multiplier ,
vr . hmdposition_delta [ 2 ] * factor * multiplier , - vr . hmdorientation [ YAW ] , v ) ;
2020-06-10 18:20:11 +00:00
positional_movementSideways = v [ 0 ] ;
positional_movementForward = v [ 1 ] ;
ALOGV ( " positional_movementSideways: %f, positional_movementForward: %f " ,
positional_movementSideways ,
positional_movementForward ) ;
//Jump (B Button)
2020-07-15 22:16:44 +00:00
if ( vr . backpackitemactive ! = 2 & & ! canUseBackpack ) {
2020-08-23 16:58:43 +00:00
if ( ( primaryButtonsNew & primaryButton2 ) ! = ( primaryButtonsOld & primaryButton2 ) )
{
Sys_QueEvent ( 0 , SE_KEY , K_SPACE , ( primaryButtonsNew & primaryButton2 ) ! = 0 , 0 , NULL ) ;
}
2020-07-15 22:16:44 +00:00
}
2020-06-10 18:20:11 +00:00
2020-07-01 22:49:41 +00:00
2021-07-15 22:54:51 +00:00
2020-06-10 18:20:11 +00:00
//We need to record if we have started firing primary so that releasing trigger will stop firing, if user has pushed grip
//in meantime, then it wouldn't stop the gun firing and it would get stuck
2020-07-16 21:57:01 +00:00
static qboolean firing = false ;
if ( dominantGripPushed & & vr . backpackitemactive = = 0 )
2020-07-01 22:49:41 +00:00
{
2020-07-14 17:56:03 +00:00
if ( ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ! =
2020-07-09 22:53:06 +00:00
( pDominantTrackedRemoteOld - > Buttons & ovrButton_Trigger ) )
{
2020-07-14 17:56:03 +00:00
if ( ! vr . scopedweapon ) {
if ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) {
2020-07-16 21:57:01 +00:00
ALOGV ( " **WEAPON EVENT** weapalt " ) ;
2020-07-14 17:56:03 +00:00
sendButtonActionSimple ( " weapalt " ) ;
}
2020-07-16 21:57:01 +00:00
else if ( firing )
{
//no longer firing
firing = qfalse ;
ALOGV ( " **WEAPON EVENT** Grip Pushed %sattack " , ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ? " + " : " - " ) ;
sendButtonAction ( " +attack " , firing ) ;
}
2020-07-14 17:56:03 +00:00
}
else if ( vr . detachablescope )
{
if ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) {
//See if we are able to detach the scope
2020-07-16 21:57:01 +00:00
ALOGV ( " **WEAPON EVENT** weapdetachscope " ) ;
2020-07-14 17:56:03 +00:00
sendButtonActionSimple ( " weapdetachscope " ) ;
}
}
else
{
//Just ignore grip and fire
2020-07-16 21:57:01 +00:00
firing = ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ;
ALOGV ( " **WEAPON EVENT** Grip Pushed %sattack " , ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ? " + " : " - " ) ;
sendButtonAction ( " +attack " , firing ) ;
2020-07-14 17:56:03 +00:00
}
2020-07-01 22:49:41 +00:00
}
}
else
{
//Fire Primary
2020-07-15 22:16:44 +00:00
if ( vr . backpackitemactive ! = 3 & & // Can't fire while holding binoculars
! vr . velocitytriggered & & // Don't fire velocity triggered weapons
2020-07-12 15:04:26 +00:00
( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ! =
2020-07-01 22:49:41 +00:00
( pDominantTrackedRemoteOld - > Buttons & ovrButton_Trigger ) ) {
2020-06-10 18:20:11 +00:00
2020-07-16 21:57:01 +00:00
ALOGV ( " **WEAPON EVENT** Not Grip Pushed %sattack " , ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ? " + " : " - " ) ;
firing = ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ;
sendButtonAction ( " +attack " , firing ) ;
2020-07-01 22:49:41 +00:00
}
2020-07-28 20:31:28 +00:00
else if ( binocularsactive ) // trigger can zoom-in binoculars, remove from face to reset
{
static qboolean zoomin = true ;
if ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) {
sendButtonActionSimple ( zoomin ? " weapnext " : " weapprev " ) ;
} else if ( pDominantTrackedRemoteOld - > Buttons & ovrButton_Trigger )
{
zoomin = ! zoomin ;
}
}
2020-07-01 22:49:41 +00:00
}
2020-06-10 18:20:11 +00:00
2020-08-23 16:58:43 +00:00
//Duck
2020-07-15 22:16:44 +00:00
if ( vr . backpackitemactive ! = 2 & &
! canUseBackpack & &
2020-08-23 16:58:43 +00:00
( primaryButtonsNew & primaryButton1 ) ! =
( primaryButtonsOld & primaryButton1 ) ) {
sendButtonAction ( " +movedown " , ( primaryButtonsNew & primaryButton1 ) ) ;
2020-06-10 18:20:11 +00:00
}
2020-08-23 16:58:43 +00:00
//Weapon Chooser
2020-06-10 18:20:11 +00:00
static qboolean itemSwitched = false ;
2020-08-16 17:31:46 +00:00
if ( between ( - 0.2f , pPrimaryJoystick - > x , 0.2f ) & &
( between ( 0.8f , pPrimaryJoystick - > y , 1.0f ) | |
between ( - 1.0f , pPrimaryJoystick - > y , - 0.8f ) ) )
2020-06-10 18:20:11 +00:00
{
if ( ! itemSwitched ) {
2020-08-16 17:31:46 +00:00
if ( between ( 0.8f , pPrimaryJoystick - > y , 1.0f ) )
2020-06-10 18:20:11 +00:00
{
2020-07-15 22:16:44 +00:00
sendButtonActionSimple ( " weapprev " ) ;
2020-06-10 18:20:11 +00:00
}
else
{
2020-07-15 22:16:44 +00:00
sendButtonActionSimple ( " weapnext " ) ;
2020-06-10 18:20:11 +00:00
}
itemSwitched = true ;
}
} else {
itemSwitched = false ;
}
}
{
2020-07-01 22:49:41 +00:00
//"Use" (open doors etc)
if ( ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Joystick ) ! =
( pDominantTrackedRemoteOld - > Buttons & ovrButton_Joystick ) ) {
2020-07-20 18:56:58 +00:00
sendButtonAction ( " +activate " ,
( pDominantTrackedRemoteNew - > Buttons & ovrButton_Joystick ) ? 1 : 0 ) ;
2020-07-01 22:49:41 +00:00
}
2020-07-20 18:56:58 +00:00
//Apply a filter and quadratic scaler so small movements are easier to make
2020-08-16 17:31:46 +00:00
float dist = length ( pSecondaryJoystick - > x , pSecondaryJoystick - > y ) ;
2020-07-20 18:56:58 +00:00
float nlf = nonLinearFilter ( dist ) ;
2021-07-15 22:54:51 +00:00
float x = ( nlf * pSecondaryJoystick - > x ) + pFootTrackingNew - > LeftJoystick . x ;
float y = ( nlf * pSecondaryJoystick - > y ) - pFootTrackingNew - > LeftJoystick . y ;
2020-06-10 18:20:11 +00:00
2020-07-14 17:56:03 +00:00
vr . player_moving = ( fabs ( x ) + fabs ( y ) ) > 0.05f ;
2020-06-10 18:20:11 +00:00
2020-07-20 18:56:58 +00:00
//Adjust to be off-hand controller oriented
2020-06-10 18:20:11 +00:00
vec2_t v ;
rotateAboutOrigin ( x , y , controllerYawHeading , v ) ;
2020-08-01 10:57:35 +00:00
//Move a lot slower if scope is engaged
remote_movementSideways = v [ 0 ] * ( vr . scopeengaged ? 0.3f : 1.0f ) * vr_movement_multiplier - > value ;
remote_movementForward = v [ 1 ] * ( vr . scopeengaged ? 0.3f : 1.0f ) * vr_movement_multiplier - > value ;
2020-06-10 18:20:11 +00:00
ALOGV ( " remote_movementSideways: %f, remote_movementForward: %f " ,
remote_movementSideways ,
remote_movementForward ) ;
2020-07-06 22:09:20 +00:00
2020-08-10 17:50:42 +00:00
static qboolean stopUseItemNextFrame = false ;
if ( stopUseItemNextFrame )
{
Cbuf_AddText ( " -useitem \n " ) ;
stopUseItemNextFrame = false ;
}
2020-07-03 22:26:33 +00:00
if ( ! canUseQuickSave ) {
2020-08-23 16:58:43 +00:00
if ( ( ( secondaryButtonsNew & secondaryButton1 ) ! =
( secondaryButtonsOld & secondaryButton1 ) ) & &
( secondaryButtonsNew & secondaryButton1 ) ) {
2020-07-06 22:09:20 +00:00
if ( dominantGripPushed ) {
2020-08-10 17:50:42 +00:00
Cbuf_AddText ( " +useitem \n " ) ;
stopUseItemNextFrame = qtrue ;
2020-07-06 22:09:20 +00:00
} else {
2020-07-15 22:16:44 +00:00
vr . visible_hud = ! vr . visible_hud ;
2020-07-06 22:09:20 +00:00
}
2020-07-03 22:26:33 +00:00
}
2020-06-10 18:20:11 +00:00
}
2020-08-10 17:50:42 +00:00
//notebook or select "item"
2020-07-03 22:26:33 +00:00
if ( ! canUseQuickSave ) {
2020-08-23 16:58:43 +00:00
if ( ( ( secondaryButtonsNew & secondaryButton2 ) ! =
( secondaryButtonsOld & secondaryButton2 ) ) & &
( secondaryButtonsNew & secondaryButton2 ) ) {
2020-08-10 17:50:42 +00:00
if ( dominantGripPushed ) {
sendButtonActionSimple ( " itemprev " ) ;
} else {
sendButtonActionSimple ( " notebook " ) ;
}
2020-07-03 22:26:33 +00:00
}
2020-07-01 22:49:41 +00:00
}
2020-06-10 18:20:11 +00:00
2020-07-01 22:49:41 +00:00
2020-07-06 22:09:20 +00:00
//Kick!
if ( ( pOffTrackedRemoteNew - > Buttons & ovrButton_Joystick ) ! =
( pOffTrackedRemoteOld - > Buttons & ovrButton_Joystick ) ) {
sendButtonAction ( " +kick " , ( pOffTrackedRemoteNew - > Buttons & ovrButton_Joystick ) ) ;
2020-06-10 18:20:11 +00:00
}
//We need to record if we have started firing primary so that releasing trigger will stop definitely firing, if user has pushed grip
//in meantime, then it wouldn't stop the gun firing and it would get stuck
2020-07-20 18:56:58 +00:00
if ( ! vr . teleportenabled )
{
//Run
handleTrackedControllerButton ( pOffTrackedRemoteNew ,
pOffTrackedRemoteOld ,
ovrButton_Trigger , K_SHIFT ) ;
2021-07-15 22:54:51 +00:00
2020-07-20 18:56:58 +00:00
} else {
if ( pOffTrackedRemoteNew - > Buttons & ovrButton_Trigger )
{
vr . teleportseek = qtrue ;
}
else if ( vr . teleportseek )
{
vr . teleportseek = qfalse ;
vr . teleportexecute = vr . teleportready ;
vr . teleportready = qfalse ;
}
}
2020-06-10 18:20:11 +00:00
2020-07-23 18:23:29 +00:00
//Resync Yaw on mounted gun transition
static int usingMountedGun = false ;
if ( vr . mountedgun ! = usingMountedGun )
{
resyncClientYawWithGameYaw = 10 ; // HACK
usingMountedGun = vr . mountedgun ;
}
//No snap turn when using mounted gun
2020-09-29 19:58:49 +00:00
static int syncCount = 0 ;
2020-06-10 18:20:11 +00:00
static int increaseSnap = true ;
2020-07-25 14:54:44 +00:00
if ( ! vr . mountedgun & & ! vr . scopeengaged ) {
2020-08-16 17:31:46 +00:00
if ( pPrimaryJoystick - > x > 0.7f ) {
2020-07-23 18:23:29 +00:00
if ( increaseSnap ) {
2020-08-13 14:43:50 +00:00
float turnAngle = vr_turn_mode - > integer ? ( vr_turn_angle - > value / 9.0f ) : vr_turn_angle - > value ;
snapTurn - = turnAngle ;
if ( vr_turn_mode - > integer = = 0 ) {
2020-07-23 18:23:29 +00:00
increaseSnap = false ;
}
2020-06-10 18:20:11 +00:00
2020-07-23 18:23:29 +00:00
if ( snapTurn < - 180.0f ) {
snapTurn + = 360.f ;
}
2020-07-03 22:26:33 +00:00
2020-07-23 18:23:29 +00:00
RTCWVR_ResyncClientYawWithGameYaw ( ) ;
}
2020-08-16 17:31:46 +00:00
} else if ( pPrimaryJoystick - > x < 0.3f ) {
2020-07-23 18:23:29 +00:00
increaseSnap = true ;
2020-06-10 18:20:11 +00:00
}
2020-07-23 18:23:29 +00:00
static int decreaseSnap = true ;
2020-08-16 17:31:46 +00:00
if ( pPrimaryJoystick - > x < - 0.7f ) {
2020-07-23 18:23:29 +00:00
if ( decreaseSnap ) {
2020-08-13 14:43:50 +00:00
float turnAngle = vr_turn_mode - > integer ? ( vr_turn_angle - > value / 9.0f ) : vr_turn_angle - > value ;
snapTurn + = turnAngle ;
2020-06-10 18:20:11 +00:00
2020-07-23 18:23:29 +00:00
//If snap turn configured for less than 10 degrees
2020-08-13 14:43:50 +00:00
if ( vr_turn_mode - > integer = = 0 ) {
2020-07-23 18:23:29 +00:00
decreaseSnap = false ;
}
if ( snapTurn > 180.0f ) {
snapTurn - = 360.f ;
}
2020-06-10 18:20:11 +00:00
2020-07-23 18:23:29 +00:00
RTCWVR_ResyncClientYawWithGameYaw ( ) ;
}
2020-08-16 17:31:46 +00:00
} else if ( pPrimaryJoystick - > x > - 0.3f ) {
2020-07-23 18:23:29 +00:00
decreaseSnap = true ;
}
}
else {
2020-08-16 17:31:46 +00:00
if ( fabs ( pPrimaryJoystick - > x ) > 0.5f ) {
2020-07-23 18:23:29 +00:00
if ( increaseSnap )
2020-06-10 18:20:11 +00:00
{
2020-07-23 18:23:29 +00:00
RTCWVR_ResyncClientYawWithGameYaw ( ) ;
2020-06-10 18:20:11 +00:00
}
2020-07-23 18:23:29 +00:00
increaseSnap = false ;
}
else
{
increaseSnap = true ;
}
}
2020-06-10 18:20:11 +00:00
}
2020-07-09 22:53:06 +00:00
2020-07-10 20:58:40 +00:00
updateScopeAngles ( ) ;
2020-06-10 18:20:11 +00:00
}
2023-09-27 14:13:08 +00:00
// Process "use" gesture
if ( vr_gesture_triggered_use - > integer ) {
int thirdPersonActive = Cvar_VariableIntegerValue ( " cg_thirdPerson " ) ;
bool gestureUseAllowed = ! vr . weapon_stabilised & & ! vr . mountedgun & & ! vr . scopeengaged & & ! thirdPersonActive ;
// Off-hand gesture
float distanceToBody = sqrt ( vr . offhandoffset [ 0 ] * vr . offhandoffset [ 0 ] + vr . offhandoffset [ 2 ] * vr . offhandoffset [ 2 ] ) ;
if ( gestureUseAllowed & & ( distanceToBody > vr_use_gesture_boundary - > value ) ) {
if ( ! ( vr . useGestureState & USE_GESTURE_OFF_HAND ) ) {
sendButtonAction ( " +activate2 " , true ) ;
}
vr . useGestureState | = USE_GESTURE_OFF_HAND ;
} else {
if ( vr . useGestureState & USE_GESTURE_OFF_HAND ) {
sendButtonAction ( " +activate2 " , false ) ;
}
vr . useGestureState & = ~ USE_GESTURE_OFF_HAND ;
}
// Weapon-hand gesture
distanceToBody = sqrt ( vr . current_weaponoffset [ 0 ] * vr . current_weaponoffset [ 0 ] + vr . current_weaponoffset [ 2 ] * vr . current_weaponoffset [ 2 ] ) ;
if ( gestureUseAllowed & & ( distanceToBody > vr_use_gesture_boundary - > value ) ) {
if ( ! ( vr . useGestureState & USE_GESTURE_WEAPON_HAND ) ) {
sendButtonAction ( " +activate " , true ) ;
}
vr . useGestureState | = USE_GESTURE_WEAPON_HAND ;
} else {
if ( vr . useGestureState & USE_GESTURE_WEAPON_HAND ) {
sendButtonAction ( " +activate " , false ) ;
}
vr . useGestureState & = ~ USE_GESTURE_WEAPON_HAND ;
}
} else {
if ( vr . useGestureState & USE_GESTURE_OFF_HAND ) {
sendButtonAction ( " +activate2 " , false ) ;
}
if ( vr . useGestureState & USE_GESTURE_WEAPON_HAND ) {
sendButtonAction ( " +activate " , false ) ;
}
vr . useGestureState = 0 ;
}
2020-06-10 18:20:11 +00:00
//Save state
rightTrackedRemoteState_old = rightTrackedRemoteState_new ;
leftTrackedRemoteState_old = leftTrackedRemoteState_new ;
2022-01-07 23:18:43 +00:00
}