diff --git a/Projects/Android/jni/RTCWVR/VrClientInfo.h b/Projects/Android/jni/RTCWVR/VrClientInfo.h index af7b57c..985d13d 100644 --- a/Projects/Android/jni/RTCWVR/VrClientInfo.h +++ b/Projects/Android/jni/RTCWVR/VrClientInfo.h @@ -30,6 +30,10 @@ typedef struct { qboolean scopeready; // Scope can be engaged qboolean scopedweapon; // Weapon supports scope + qboolean velocitytriggered; // Weapon attack triggered by velocity (knife) + + + vec3_t offhandangles; vec3_t offhandoffset; } vr_client_info_t; diff --git a/Projects/Android/jni/RTCWVR/VrInput.h b/Projects/Android/jni/RTCWVR/VrInput.h index 6d3fd27..4d729a7 100644 --- a/Projects/Android/jni/RTCWVR/VrInput.h +++ b/Projects/Android/jni/RTCWVR/VrInput.h @@ -7,7 +7,8 @@ //New control scheme definitions to be defined L1VR_SurfaceView.c enumeration enum control_scheme; -#define SCOPE_ENGAGE_DISTANCE 0.3 +#define SCOPE_ENGAGE_DISTANCE 0.3 +#define VELOCITY_TRIGGER 2.0 ovrInputStateTrackedRemote leftTrackedRemoteState_old; ovrInputStateTrackedRemote leftTrackedRemoteState_new; diff --git a/Projects/Android/jni/RTCWVR/VrInputDefault.c b/Projects/Android/jni/RTCWVR/VrInputDefault.c index b2102a4..e7b79ad 100644 --- a/Projects/Android/jni/RTCWVR/VrInputDefault.c +++ b/Projects/Android/jni/RTCWVR/VrInputDefault.c @@ -162,6 +162,22 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, vr.weaponoffset[2] = pDominantTracking->HeadPose.Pose.Position.z - vr.hmdposition[2]; vr.weaponoffset_timestamp = Sys_Milliseconds( ); + //Does weapon velocity trigger attack (knife) and is it fast enough + if (vr.velocitytriggered) + { + static qboolean fired = qfalse; + float velocity = sqrtf(powf(pDominantTracking->HeadPose.LinearVelocity.x, 2) + + powf(pDominantTracking->HeadPose.LinearVelocity.y, 2) + + powf(pDominantTracking->HeadPose.LinearVelocity.z, 2)); + + ALOGV(" Velocity: %f", velocity); + + if (fired != (velocity > VELOCITY_TRIGGER)) { + sendButtonAction("+attack", (velocity > VELOCITY_TRIGGER)); + fired = (velocity > VELOCITY_TRIGGER); + } + } + if (vr.weapon_stabilised) { float z = pOffTracking->HeadPose.Pose.Position.z - pDominantTracking->HeadPose.Pose.Position.z; @@ -287,7 +303,8 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew, else { //Fire Primary - if ((pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger) != + if (!vr.velocitytriggered && // Don't fire velocity triggered weapons + (pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger) != (pDominantTrackedRemoteOld->Buttons & ovrButton_Trigger)) { firingPrimary = (pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger); diff --git a/Projects/Android/jni/rtcw/Android.mk b/Projects/Android/jni/rtcw/Android.mk index 129173e..014c7cd 100644 --- a/Projects/Android/jni/rtcw/Android.mk +++ b/Projects/Android/jni/rtcw/Android.mk @@ -2,10 +2,8 @@ RTCW_BASE_CFLAGS = \ -fsigned-char \ - -march=armv7-a -mfloat-abi=softfp \ - -DNDEBUG -DNDEBUG -Ofast -fomit-frame-pointer -ffast-math -fno-strict-aliasing -fstrength-reduce -ftree-vectorize -fsingle-precision-constant \ - -pipe -DPANDORA -DHAVE_GLES -DARM -DC_ONLY \ - -DAUTOAIM + -Ofast -fomit-frame-pointer -ffast-math -fno-strict-aliasing -fstrength-reduce -ftree-vectorize -fsingle-precision-constant \ + -pipe -DPANDORA -DHAVE_GLES -DARM -DC_ONLY #-DNEON -mfpu=neon diff --git a/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c b/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c index 4518426..cac2f1e 100644 --- a/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c +++ b/Projects/Android/jni/rtcw/src/cgame/cg_weapons.c @@ -3223,6 +3223,28 @@ void CG_AddViewWeapon( playerState_t *ps ) { // add the foot CG_AddPlayerFoot( &hand, ps, &cg.predictedPlayerEntity ); + + //Set some important flags based on the current weapon + switch ( ps->weapon ) { + case WP_KNIFE: + cgVR->velocitytriggered = qtrue; + cgVR->scopedweapon = qfalse; + break; + case WP_GARAND: + case WP_SNIPERRIFLE: + case WP_MAUSER: + case WP_SNOOPERSCOPE: + case WP_FG42: + case WP_FG42SCOPE: + cgVR->velocitytriggered = qfalse; + cgVR->scopedweapon = qtrue; + break; + default: + cgVR->velocitytriggered = qfalse; + cgVR->scopedweapon = qfalse; + break; + } + cg.predictedPlayerEntity.lastWeaponClientFrame = cg.clientFrame; } @@ -4003,20 +4025,6 @@ void CG_FinishWeaponChange( int lastweap, int newweap ) { } } - switch ( newweap ) { - case WP_GARAND: - case WP_SNIPERRIFLE: - case WP_MAUSER: - case WP_SNOOPERSCOPE: - case WP_FG42: - case WP_FG42SCOPE: - cgVR->scopedweapon = qtrue; - break; - default: - cgVR->scopedweapon = qfalse; - break; - } - cg.weaponSelect = newweap; } diff --git a/Projects/Android/jni/rtcw/src/game/bg_pmove.c b/Projects/Android/jni/rtcw/src/game/bg_pmove.c index dbb3fb7..1bf2e5d 100644 --- a/Projects/Android/jni/rtcw/src/game/bg_pmove.c +++ b/Projects/Android/jni/rtcw/src/game/bg_pmove.c @@ -3303,6 +3303,9 @@ if ( pm->ps->weapon == WP_AKIMBO ) { } switch ( pm->ps->weapon ) { +case WP_KNIFE: + //Play no animation for the knife (as it is physical stabby stabby) + break; case WP_MAUSER: case WP_GRENADE_LAUNCHER: case WP_GRENADE_PINEAPPLE: