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 ;
2023-10-08 17:16:22 +00:00
vr . visible_hud = vr_draw_hud - > integer ;
2023-10-12 18:58:59 +00:00
vr . vrIrlCrouchEnabled = vr_irl_crouch_enabled - > integer ! = 0 ;
vr . vrIrlCrouchToStandRatio = vr_irl_crouch_to_stand_ratio - > value ;
2020-07-20 18:56:58 +00:00
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 ;
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 ) ;
2023-10-08 15:09:41 +00:00
qboolean addRecoil = vr . pistol & & ( vr . weaponid ! = WP_AKIMBO | | vr . akimboFire ) ;
rotation [ PITCH ] = vr_weapon_pitchadjust - > value + ( addRecoil ? vr . weapon_recoil : 0.0f ) ; // Our hacked recoil effect
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 ) ;
2023-10-08 15:09:41 +00:00
ALOGV ( " weaponangles_last: %f, %f, %f " , vr . weaponangles_last [ 0 ] , vr . weaponangles_last [ 1 ] , vr . weaponangles_last [ 2 ] ) ;
2020-07-05 09:49:07 +00:00
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 ) ;
2023-10-08 15:09:41 +00:00
qboolean addRecoil_off = vr . pistol & & ( vr . weaponid ! = WP_AKIMBO | | ! vr . akimboFire ) ;
rotation_off [ PITCH ] = vr_weapon_pitchadjust - > value + ( addRecoil_off ? vr . weapon_recoil : 0.0f ) ; // Our hacked recoil effect
QuatToYawPitchRoll ( pOff - > HeadPose . Pose . Orientation , rotation_off , vr . offhandweaponangles ) ;
2022-02-25 16:13:07 +00:00
VectorSubtract ( vr . offhandangles_last , vr . offhandangles , vr . offhandangles_delta ) ;
VectorCopy ( vr . offhandangles , vr . offhandangles_last ) ;
2023-10-08 15:09:41 +00:00
vr . weapon_recoil * = 0.8f ; // quick reduction on synthetic recoil
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-10-04 18:40:06 +00:00
if ( vr . toggleMainMenu ) { // Menu toggled via wheel selector
vr . toggleMainMenu = qfalse ;
Sys_QueEvent ( 0 , SE_KEY , K_ESCAPE , qtrue , 0 , NULL ) ;
}
2020-06-10 18:20:11 +00:00
2023-03-20 21:39:58 +00:00
static float menuYaw = 0 ;
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 ;
2023-10-04 18:40:06 +00:00
if ( controlsLeftHanded = = vr . menu_right_handed ) {
2023-03-20 21:39:58 +00:00
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 ) ) {
2023-10-04 18:40:06 +00:00
vr . menu_right_handed = ! vr . menu_right_handed ;
2023-10-14 14:54:59 +00:00
RTCWVR_Vibrate ( 40 , vr . menu_right_handed ? 1 : 0 , 0.5 ) ;
2023-03-20 21:39:58 +00:00
}
} 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 ) ) {
2023-10-04 18:40:06 +00:00
vr . menu_right_handed = ! vr . menu_right_handed ;
2023-10-14 14:54:59 +00:00
RTCWVR_Vibrate ( 40 , vr . menu_right_handed ? 1 : 0 , 0.5 ) ;
2023-03-20 21:39:58 +00:00
}
}
2023-10-14 14:54:59 +00:00
if ( vr_menu_item_touched - > integer ) {
RTCWVR_Vibrate ( 40 , vr . menu_right_handed ? 1 : 0 , 0.5 ) ;
Cvar_SetValue ( " vr_menu_item_touched " , 0 ) ;
}
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 ;
2023-10-04 18:40:06 +00:00
qboolean binocularsactive = ( vr . hasbinoculars & & ( vr . backpackitemactive = = 3 | | vr . binocularsActive ) & &
2020-07-15 22:16:44 +00:00
( 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
2023-10-08 15:09:41 +00:00
if ( vr . weapon_stabilised )
2020-06-10 18:20:11 +00:00
{
2023-10-08 15:09:41 +00:00
if ( vr . scopeengaged | | vr_virtual_stock - > integer = = 1 )
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 ) {
2023-10-08 15:09:41 +00:00
VectorSet ( vr . weaponangles , - degrees ( atanf ( y / zxDist ) ) ,
- degrees ( atan2f ( x , - z ) ) , vr . weaponangles [ ROLL ] / 2.0f ) ; //Dampen roll on stabilised weapon
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 ( ) ;
2023-10-04 18:40:06 +00:00
} else if ( ! handInBackpack & & ! vr . backpackitemactive & & ! vr . mountedgun & & ! vr . scopeengaged & & ! vr . weapon_stabilised & &
( GetTimeInMilliSeconds ( ) - dominantGripPushTime ) > vr_reloadtimeoutms - > integer ) {
vr . wheelSelectorEnabled = true ;
2020-07-15 22:16:44 +00:00
}
}
else
{
2023-10-04 18:40:06 +00:00
if ( vr . wheelSelectorEnabled ) {
vr . wheelSelectorEnabled = false ;
sendButtonActionSimple ( " wheelselectorselect " ) ;
}
else if ( vr . backpackitemactive = = 1 ) {
2020-07-15 22:16:44 +00:00
//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
2023-10-08 17:16:22 +00:00
//Fire Primary
if ( vr . backpackitemactive ! = 3 & & ! vr . binocularsActive & & // Can't fire while holding binoculars
! vr . velocitytriggered & & // Don't fire velocity triggered weapons
( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ! =
( pDominantTrackedRemoteOld - > Buttons & ovrButton_Trigger ) ) {
ALOGV ( " **WEAPON EVENT** Not Grip Pushed %sattack " , ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ? " + " : " - " ) ;
qboolean firing = ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ;
if ( vr . weaponid = = WP_AKIMBO ) {
if ( firing ) {
vr . akimboTriggerState | = ACTIVE_WEAPON_HAND ;
sendButtonAction ( " +attack " , firing ) ;
} else {
vr . akimboTriggerState & = ~ ACTIVE_WEAPON_HAND ;
if ( ! vr . akimboTriggerState ) { // Stop firing only if we are not still firing with off-hand weapon
2023-10-08 15:09:41 +00:00
sendButtonAction ( " +attack " , firing ) ;
}
2020-07-14 17:56:03 +00:00
}
2023-10-08 17:16:22 +00:00
} else {
vr . akimboTriggerState = 0 ;
sendButtonAction ( " +attack " , firing ) ;
2020-07-01 22:49:41 +00:00
}
}
2023-10-08 17:16:22 +00:00
else if ( binocularsactive ) // trigger can zoom-in binoculars, remove from face to reset
2020-07-01 22:49:41 +00:00
{
2023-10-08 17:16:22 +00:00
static qboolean zoomin = true ;
if ( pDominantTrackedRemoteNew - > Buttons & ovrButton_Trigger ) {
sendButtonActionSimple ( zoomin ? " weapnext " : " weapprev " ) ;
} else if ( pDominantTrackedRemoteOld - > Buttons & ovrButton_Trigger )
2020-07-28 20:31:28 +00:00
{
2023-10-08 17:16:22 +00:00
zoomin = ! zoomin ;
2020-07-28 20:31:28 +00:00
}
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 ) ) ;
2023-10-12 18:58:59 +00:00
// Reset max height for IRL crouch
vr . maxHeight = 0 ;
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 ;
2023-10-04 18:40:06 +00:00
if ( ! vr . wheelSelectorEnabled & & 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
{
2023-10-04 18:40:06 +00:00
vr . binocularsActive = false ;
2020-07-15 22:16:44 +00:00
sendButtonActionSimple ( " weapprev " ) ;
2020-06-10 18:20:11 +00:00
}
else
{
2023-10-04 18:40:06 +00:00
vr . binocularsActive = false ;
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 ;
2023-10-04 18:40:06 +00:00
static qboolean startUseItemNextFrame = false ;
if ( vr . useHoldableItem ) // Item toggled via wheel selector
{
startUseItemNextFrame = true ;
vr . useHoldableItem = false ;
}
if ( startUseItemNextFrame )
{
Cbuf_AddText ( " +useitem \n " ) ;
startUseItemNextFrame = qfalse ;
stopUseItemNextFrame = qtrue ;
}
2020-08-10 17:50:42 +00:00
if ( stopUseItemNextFrame )
{
Cbuf_AddText ( " -useitem \n " ) ;
stopUseItemNextFrame = false ;
}
2023-10-08 17:16:22 +00:00
// Detach scopes, draw akimbo
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 ) ) {
2023-10-08 17:16:22 +00:00
if ( ! vr . scopedweapon ) {
ALOGV ( " **WEAPON EVENT** weapalt " ) ;
sendButtonActionSimple ( " weapalt " ) ;
} else if ( vr . detachablescope ) {
//See if we are able to detach the scope
ALOGV ( " **WEAPON EVENT** weapdetachscope " ) ;
sendButtonActionSimple ( " weapdetachscope " ) ;
2020-07-06 22:09:20 +00:00
}
2020-07-03 22:26:33 +00:00
}
2020-06-10 18:20:11 +00:00
}
2023-10-08 17:16:22 +00:00
// Notebook
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 ) ) {
2023-10-08 17:16:22 +00:00
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
2023-10-08 17:16:22 +00:00
if ( ! vr . teleportenabled | | vr . weaponid = = WP_AKIMBO )
2020-07-20 18:56:58 +00:00
{
2023-10-08 15:09:41 +00:00
if ( vr . weaponid = = WP_AKIMBO & & vr . backpackitemactive ! = 3 & & ! vr . binocularsActive ) {
// Fire off-hand weapon
if ( ( pOffTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ! = ( pOffTrackedRemoteOld - > Buttons & ovrButton_Trigger ) ) {
ALOGV ( " **WEAPON EVENT** Off-hand trigger %sattack " , ( pOffTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ? " + " : " - " ) ;
qboolean firing = ( pOffTrackedRemoteNew - > Buttons & ovrButton_Trigger ) ;
if ( firing ) {
vr . akimboTriggerState | = ACTIVE_OFF_HAND ;
sendButtonAction ( " +attack " , firing ) ;
} else {
vr . akimboTriggerState & = ~ ACTIVE_OFF_HAND ;
if ( ! vr . akimboTriggerState ) { // Stop firing only if we are not still firing with main weapon
sendButtonAction ( " +attack " , firing ) ;
}
}
}
2023-10-14 09:36:54 +00:00
// When holding off-hand weapon, run (or teleport) with left grip
if ( ! vr . teleportenabled ) {
handleTrackedControllerButton ( pOffTrackedRemoteNew , pOffTrackedRemoteOld , ovrButton_GripTrigger , K_SHIFT ) ;
} else {
if ( pOffTrackedRemoteNew - > Buttons & ovrButton_GripTrigger ) {
vr . teleportseek = qtrue ;
} else if ( vr . teleportseek ) {
vr . teleportseek = qfalse ;
vr . teleportexecute = vr . teleportready ;
vr . teleportready = qfalse ;
}
}
2023-10-08 15:09:41 +00:00
} else {
if ( vr . akimboTriggerState ) {
// Akimbo no longer active, stop attacking
vr . akimboTriggerState = 0 ;
sendButtonAction ( " +attack " , qfalse ) ;
}
// Run
handleTrackedControllerButton ( pOffTrackedRemoteNew , pOffTrackedRemoteOld , ovrButton_Trigger , K_SHIFT ) ;
}
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 ;
}
2023-10-04 18:40:06 +00:00
if ( vr . wheelSelectorEnabled ) {
static int wheelSelectorSwitched = false ;
if ( between ( 0.8f , pPrimaryJoystick - > x , 1.0f ) | | between ( - 1.0f , pPrimaryJoystick - > x , - 0.8f ) ) {
if ( ! wheelSelectorSwitched ) {
if ( between ( 0.8f , pPrimaryJoystick - > x , 1.0f ) ) {
sendButtonActionSimple ( " wheelselectornext " ) ;
} else {
sendButtonActionSimple ( " wheelselectorprev " ) ;
}
wheelSelectorSwitched = true ;
2020-07-23 18:23:29 +00:00
}
2023-10-04 18:40:06 +00:00
} else {
wheelSelectorSwitched = false ;
2020-06-10 18:20:11 +00:00
}
2023-10-04 18:40:06 +00:00
} else {
//No snap turn when using mounted gun
static int syncCount = 0 ;
static int increaseSnap = true ;
if ( ! vr . mountedgun & & ! vr . scopeengaged ) {
if ( pPrimaryJoystick - > x > 0.7f ) {
if ( increaseSnap ) {
float turnAngle = vr_turn_mode - > integer ? ( vr_turn_angle - > value / 9.0f ) : vr_turn_angle - > value ;
snapTurn - = turnAngle ;
if ( vr_turn_mode - > integer = = 0 ) {
increaseSnap = false ;
}
if ( snapTurn < - 180.0f ) {
snapTurn + = 360.f ;
}
RTCWVR_ResyncClientYawWithGameYaw ( ) ;
}
} else if ( pPrimaryJoystick - > x < 0.3f ) {
increaseSnap = true ;
}
2020-06-10 18:20:11 +00:00
2023-10-04 18:40:06 +00:00
static int decreaseSnap = true ;
if ( pPrimaryJoystick - > x < - 0.7f ) {
if ( decreaseSnap ) {
2020-08-13 14:43:50 +00:00
2023-10-04 18:40:06 +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
2023-10-04 18:40:06 +00:00
//If snap turn configured for less than 10 degrees
if ( vr_turn_mode - > integer = = 0 ) {
decreaseSnap = false ;
}
2020-07-23 18:23:29 +00:00
2023-10-04 18:40:06 +00:00
if ( snapTurn > 180.0f ) {
snapTurn - = 360.f ;
}
2020-06-10 18:20:11 +00:00
2023-10-04 18:40:06 +00:00
RTCWVR_ResyncClientYawWithGameYaw ( ) ;
}
} else if ( pPrimaryJoystick - > x > - 0.3f ) {
decreaseSnap = true ;
2020-07-23 18:23:29 +00:00
}
}
2023-10-04 18:40:06 +00:00
else {
if ( fabs ( pPrimaryJoystick - > x ) > 0.5f ) {
if ( increaseSnap )
{
RTCWVR_ResyncClientYawWithGameYaw ( ) ;
}
increaseSnap = false ;
}
else
2020-06-10 18:20:11 +00:00
{
2023-10-04 18:40:06 +00:00
increaseSnap = true ;
2020-06-10 18:20:11 +00:00
}
2020-07-23 18:23:29 +00:00
}
}
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 " ) ;
2023-10-04 18:40:06 +00:00
bool gestureUseAllowed = ! vr . weapon_stabilised & & ! vr . mountedgun & & ! vr . scopeengaged & & ! vr . wheelSelectorEnabled & & ! thirdPersonActive ;
2023-09-27 14:13:08 +00:00
// 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 ) ) {
2023-10-08 15:09:41 +00:00
if ( ! ( vr . useGestureState & ACTIVE_OFF_HAND ) ) {
2023-09-27 14:13:08 +00:00
sendButtonAction ( " +activate2 " , true ) ;
}
2023-10-08 15:09:41 +00:00
vr . useGestureState | = ACTIVE_OFF_HAND ;
2023-09-27 14:13:08 +00:00
} else {
2023-10-08 15:09:41 +00:00
if ( vr . useGestureState & ACTIVE_OFF_HAND ) {
2023-09-27 14:13:08 +00:00
sendButtonAction ( " +activate2 " , false ) ;
}
2023-10-08 15:09:41 +00:00
vr . useGestureState & = ~ ACTIVE_OFF_HAND ;
2023-09-27 14:13:08 +00:00
}
// 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 ) ) {
2023-10-08 15:09:41 +00:00
if ( ! ( vr . useGestureState & ACTIVE_WEAPON_HAND ) ) {
2023-09-27 14:13:08 +00:00
sendButtonAction ( " +activate " , true ) ;
}
2023-10-08 15:09:41 +00:00
vr . useGestureState | = ACTIVE_WEAPON_HAND ;
2023-09-27 14:13:08 +00:00
} else {
2023-10-08 15:09:41 +00:00
if ( vr . useGestureState & ACTIVE_WEAPON_HAND ) {
2023-09-27 14:13:08 +00:00
sendButtonAction ( " +activate " , false ) ;
}
2023-10-08 15:09:41 +00:00
vr . useGestureState & = ~ ACTIVE_WEAPON_HAND ;
2023-09-27 14:13:08 +00:00
}
} else {
2023-10-08 15:09:41 +00:00
if ( vr . useGestureState & ACTIVE_OFF_HAND ) {
2023-09-27 14:13:08 +00:00
sendButtonAction ( " +activate2 " , false ) ;
}
2023-10-08 15:09:41 +00:00
if ( vr . useGestureState & ACTIVE_WEAPON_HAND ) {
2023-09-27 14:13:08 +00:00
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
}