Some nice changes...

- You can now grab from the backpack:
  - Grip Button - Grenades / Pineapple / Dynamite
  - A Button - Knife
  - B Button - Binoculars (move them to your face to activate)
- Fixed bug with scopes
- Improved HUD and fading
- X button now enables/disables HUD (might change this)
This commit is contained in:
Simon 2020-07-15 23:16:44 +01:00
parent 9bb1435b87
commit 6a1ad59805
10 changed files with 174 additions and 86 deletions

View file

@ -1315,6 +1315,10 @@ void RTCWVR_Init()
//Defaults
vr_control_scheme = Cvar_Get( "vr_control_scheme", "0", CVAR_ARCHIVE);
vr_weapon_test_values = Cvar_Get( "vr_weapon_test_values", "0.0,0.0,0.0,0.0,0.0,0.0,0.0", CVAR_ARCHIVE);
//Set up vr client info
vr.backpackitemactive = 0;
vr.visible_hud = qtrue;
}

View file

@ -8,6 +8,10 @@ typedef struct {
qboolean weapon_stabilised;
qboolean right_handed;
qboolean player_moving;
qboolean visible_hud;
int weaponid;
int lastweaponid;
int backpackitemactive; //0 - nothing, 1 - grenades, 2 - knife, 3 - Binoculars
vec3_t hmdposition;
vec3_t hmdposition_last; // Don't use this, it is just for calculating delta!
@ -32,6 +36,7 @@ typedef struct {
qboolean scopedweapon; // Weapon scope is available
qboolean scopedetached; // Scope has been detached from weapon
qboolean detachablescope; // Scope can be detached from weapon
qboolean hasbinoculars;
qboolean velocitytriggered; // Weapon attack triggered by velocity (knife)

View file

@ -8,6 +8,7 @@
enum control_scheme;
#define SCOPE_ENGAGE_DISTANCE 0.22
#define BINOCULAR_ENGAGE_DISTANCE 0.2
#define VELOCITY_TRIGGER 1.8
ovrInputStateTrackedRemote leftTrackedRemoteState_old;

View file

@ -36,7 +36,6 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
static qboolean dominantGripPushed = false;
static float dominantGripPushTime = 0.0f;
static int grabBackpackWeapon = 0;
static bool canUseBackpack = false;
@ -145,6 +144,17 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
}
}
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);
}
//dominant hand stuff first
{
//Record recent weapon position for trajectory based stuff
@ -200,45 +210,81 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
if (pDominantTracking->Status & (VRAPI_TRACKING_STATUS_POSITION_TRACKED | VRAPI_TRACKING_STATUS_POSITION_VALID)) {
canUseBackpack = false;
}
else if (!canUseBackpack && grabBackpackWeapon == 0) {
else if (!canUseBackpack && vr.backpackitemactive == 0) {
int channel = (vr_control_scheme->integer >= 10) ? 0 : 1;
RTCWVR_Vibrate(40, channel, 0.5); // vibrate to let user know they can switch
canUseBackpack = true;
}
if ((pDominantTrackedRemoteNew->Buttons & ovrButton_GripTrigger) !=
(pDominantTrackedRemoteOld->Buttons & ovrButton_GripTrigger)) {
dominantGripPushed = (pDominantTrackedRemoteNew->Buttons &
ovrButton_GripTrigger) != 0;
bool dominantButton1Pushed = (pDominantTrackedRemoteNew->Buttons &
domButton1) != 0;
bool dominantButton2Pushed = (pDominantTrackedRemoteNew->Buttons &
domButton2) != 0;
dominantGripPushed = (pDominantTrackedRemoteNew->Buttons &
ovrButton_GripTrigger) != 0;
if (grabBackpackWeapon == 0)
{
if (pDominantTracking->Status & (VRAPI_TRACKING_STATUS_POSITION_TRACKED | VRAPI_TRACKING_STATUS_POSITION_VALID)) {
if (dominantGripPushed) {
dominantGripPushTime = GetTimeInMilliSeconds();
} else {
if ((GetTimeInMilliSeconds() - dominantGripPushTime) <
vr_reloadtimeoutms->integer) {
sendButtonActionSimple("+reload");
finishReloadNextFrame = true;
}
}
} else{
if (dominantGripPushed) {
//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
grabBackpackWeapon = 1;
}
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;
}
if (!dominantButton1Pushed && vr.backpackitemactive == 2)
{
char buffer[32];
sprintf(buffer, "weapon %i", vr.lastweaponid);
sendButtonActionSimple(buffer);
vr.backpackitemactive = 0;
}
if (!dominantButton2Pushed && vr.backpackitemactive == 3)
{
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;
}
} else if (grabBackpackWeapon == 1 && !dominantGripPushed) {
//Restores last used weapon if possible
sendButtonActionSimple("weaplastused");
grabBackpackWeapon = 0;
}
}
}
@ -282,14 +328,15 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
positional_movementForward);
//Jump (B Button)
handleTrackedControllerButton(pDominantTrackedRemoteNew,
pDominantTrackedRemoteOld, domButton2, K_SPACE);
if (vr.backpackitemactive != 2 && !canUseBackpack) {
handleTrackedControllerButton(pDominantTrackedRemoteNew,
pDominantTrackedRemoteOld, domButton2, K_SPACE);
}
//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
static bool firingPrimary = false;
if (!firingPrimary && dominantGripPushed && (GetTimeInMilliSeconds() - dominantGripPushTime) > vr_reloadtimeoutms->integer && !grabBackpackWeapon)
if (dominantGripPushed && (GetTimeInMilliSeconds() - dominantGripPushTime) > vr_reloadtimeoutms->integer && vr.backpackitemactive == 0)
{
if ((pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger) !=
(pDominantTrackedRemoteOld->Buttons & ovrButton_Trigger))
@ -309,25 +356,26 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
else
{
//Just ignore grip and fire
firingPrimary = (pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger);
sendButtonAction("+attack", firingPrimary);
sendButtonAction("+attack", (pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger));
}
}
}
else
{
//Fire Primary
if (!vr.velocitytriggered && // Don't fire velocity triggered weapons
if (vr.backpackitemactive != 3 && // Can't fire while holding binoculars
!vr.velocitytriggered && // Don't fire velocity triggered weapons
(pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger) !=
(pDominantTrackedRemoteOld->Buttons & ovrButton_Trigger)) {
firingPrimary = (pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger);
sendButtonAction("+attack", firingPrimary);
sendButtonAction("+attack", (pDominantTrackedRemoteNew->Buttons & ovrButton_Trigger));
}
}
//Duck with A
if ((pDominantTrackedRemoteNew->Buttons & domButton1) !=
if (vr.backpackitemactive != 2 &&
!canUseBackpack &&
(pDominantTrackedRemoteNew->Buttons & domButton1) !=
(pDominantTrackedRemoteOld->Buttons & domButton1) &&
ducked != DUCK_CROUCHED) {
ducked = (pDominantTrackedRemoteNew->Buttons & domButton1) ? DUCK_BUTTON
@ -344,11 +392,11 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
if (!itemSwitched) {
if (between(0.8f, pDominantTrackedRemoteNew->Joystick.y, 1.0f))
{
sendButtonActionSimple("weapnext");
sendButtonActionSimple("weapprev");
}
else
{
sendButtonActionSimple("weapprev");
sendButtonActionSimple("weapnext");
}
itemSwitched = true;
}
@ -371,21 +419,6 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
sendButtonAction("+activate", (pDominantTrackedRemoteNew->Buttons & ovrButton_Joystick) ? 1 : 0);
}
//Laser-sight - not implemented
/*
if ((pDominantTrackedRemoteNew->Buttons & ovrButton_Joystick) !=
(pDominantTrackedRemoteOld->Buttons & ovrButton_Joystick)
&& (pDominantTrackedRemoteNew->Buttons & ovrButton_Joystick)) {
if (vr_lasersight->value != 0.0)
{
// Cvar_ForceSet("vr_lasersight", "0.0");
} else {
// Cvar_ForceSet("vr_lasersight", "1.0");
}
}
*/
//Apply a filter and quadratic scaler so small movements are easier to make
float dist = length(pOffTrackedRemoteNew->Joystick.x, pOffTrackedRemoteNew->Joystick.y);
float nlf = nonLinearFilter(dist);
@ -407,22 +440,24 @@ void HandleInput_Default( ovrInputStateTrackedRemote *pDominantTrackedRemoteNew,
if (!canUseQuickSave) {
if ((pOffTrackedRemoteNew->Buttons & offButton1) !=
(pOffTrackedRemoteOld->Buttons & offButton1)) {
if (((pOffTrackedRemoteNew->Buttons & offButton1) !=
(pOffTrackedRemoteOld->Buttons & offButton1)) &&
(pOffTrackedRemoteNew->Buttons & offButton1)){
if (dominantGripPushed) {
//If cheats enabled, give all weapons/pickups to player
Cbuf_AddText("give all\n");
} else {
sendButtonAction("+zoom", (pOffTrackedRemoteNew->Buttons & offButton1));
vr.visible_hud = !vr.visible_hud;
}
}
}
//notebook
if (!canUseQuickSave) {
if ((pOffTrackedRemoteNew->Buttons & offButton2) !=
(pOffTrackedRemoteOld->Buttons & offButton2)) {
if (((pOffTrackedRemoteNew->Buttons & offButton2) !=
(pOffTrackedRemoteOld->Buttons & offButton2)) &&
(pOffTrackedRemoteNew->Buttons & offButton2)) {
sendButtonActionSimple("notebook");
}
}

View file

@ -37,6 +37,7 @@ If you have questions concerning this license or the applicable additional terms
#define STATUSBARHEIGHT 452
//----(SA) end
extern qboolean fullscreen_override;
extern displayContextDef_t cgDC;
extern vr_client_info_t* cgVR;
menuDef_t *menuScoreboard = NULL;
@ -2896,7 +2897,9 @@ static void CG_DrawFlashFade( void ) {
VectorClear( col );
col[3] = cgs.scrFadeAlphaCurrent;
// CG_FillRect( -10, -10, 650, 490, col );
fullscreen_override = qtrue;
CG_FillRect( 0, 0, 640, 480, col ); // why do a bunch of these extend outside 640x480?
fullscreen_override = qfalse;
}
}
@ -2950,7 +2953,9 @@ static void CG_DrawFlashZoomTransition( void ) {
Vector4Set( color, 0, 0, 0, 1.0f - frac );
}
fullscreen_override = qtrue;
CG_FillRect( -10, -10, 650, 490, color );
fullscreen_override = qfalse;
}
}
@ -2980,7 +2985,9 @@ static void CG_DrawFlashDamage( void ) {
VectorSet( col, 0.2, 0, 0 );
col[3] = 0.7 * ( redFlash / 5.0 );
fullscreen_override = qtrue;
CG_FillRect( -10, -10, 650, 490, col );
fullscreen_override = qfalse;
}
}
@ -3032,7 +3039,9 @@ static void CG_DrawFlashFire( void ) {
col[2] = alpha;
col[3] = alpha;
trap_R_SetColor( col );
fullscreen_override = qtrue;
CG_DrawPic( -10, -10, 650, 490, cgs.media.viewFlashFire[( cg.time / 50 ) % 16] );
fullscreen_override = qfalse;
trap_R_SetColor( NULL );
trap_S_AddLoopingSound( cg.snap->ps.clientNum, cg.snap->ps.origin, vec3_origin, cgs.media.flameSound, (int)( 255.0 * alpha ) );
@ -3079,7 +3088,9 @@ static void CG_DrawFlashLightning( void ) {
shader = cgs.media.viewTeslaDamageEffectShader;
}
fullscreen_override = qtrue;
CG_DrawPic( -10, -10, 650, 490, shader );
fullscreen_override = qfalse;
}
}

View file

@ -31,7 +31,7 @@ If you have questions concerning this license or the applicable additional terms
#include "../../../RTCWVR/VrClientInfo.h"
extern vr_client_info_t* cgVR;
qboolean fullscreen_override = qfalse;
/*
================
CG_AdjustFrom640
@ -59,7 +59,10 @@ void CG_AdjustFrom640( float *x, float *y, float *w, float *h ) {
}
// -NERVE - SMF
if (cg.zoomedScope || cg.zoomedBinoc || cg.viewFade > 0 || ( cg.v_dmg_time > cg.time ) || ( cgs.scrFadeAlphaCurrent > 0.0 ))
if (fullscreen_override
|| cg.zoomedScope || cg.zoomedBinoc || cg.zoomval > 0
|| cg.viewFade > 0 || ( cgs.scrFadeAlphaCurrent > 0.0 )
|| !cgVR->visible_hud)
{
// scale for screen sizes
*x *= cgs.screenXScale;
@ -67,10 +70,10 @@ void CG_AdjustFrom640( float *x, float *y, float *w, float *h ) {
*w *= cgs.screenXScale;
*h *= cgs.screenYScale;
}
else
else // scale to clearly visible portion of VR screen
{
float screenXScale = cgs.screenXScale / 3.0f;
float screenYScale = cgs.screenYScale / 3.0f;
float screenXScale = cgs.screenXScale / 2.75f;
float screenYScale = cgs.screenYScale / 2.75f;
int xoffset = -24;
if (cg.refdef.stereoView == 1) {

View file

@ -34,6 +34,7 @@ If you have questions concerning this license or the applicable additional terms
// It also handles local physics interaction, like fragments bouncing off walls
#include "cg_local.h"
#include "../../../RTCWVR/VrClientInfo.h"
static pmove_t cg_pmove;
@ -42,6 +43,8 @@ static centity_t *cg_solidEntities[MAX_ENTITIES_IN_SNAPSHOT];
static int cg_numTriggerEntities;
static centity_t *cg_triggerEntities[MAX_ENTITIES_IN_SNAPSHOT];
extern vr_client_info_t *cgVR;
/*
====================
CG_BuildSolidList
@ -761,5 +764,8 @@ void CG_PredictPlayerState( void ) {
// fire events and other transition triggered things
CG_TransitionPlayerState( &cg.predictedPlayerState, &oldPlayerState );
//set a flag
cgVR->hasbinoculars = (cg.predictedPlayerState.stats[STAT_KEYS] & ( 1 << INV_BINOCS ));
}

View file

@ -1513,7 +1513,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo
return;
}
if ( cg.weaponSelect == WP_FG42SCOPE || cg.weaponSelect == WP_SNOOPERSCOPE || cg.weaponSelect == WP_SNIPERRIFLE ) {
/* if ( cg.weaponSelect == WP_FG42SCOPE || cg.weaponSelect == WP_SNOOPERSCOPE || cg.weaponSelect == WP_SNIPERRIFLE ) {
float spd;
spd = VectorLength( cg.snap->ps.velocity );
if ( spd > 180.0f ) {
@ -1530,7 +1530,7 @@ void CG_DrawActiveFrame( int serverTime, stereoFrame_t stereoView, qboolean demo
}
}
}
*/
DEBUGTIME
if ( !cg.lightstylesInited ) {

View file

@ -223,6 +223,7 @@ void Matrix4x4_ConvertToEntity( vec4_t *in, vec3_t angles, vec3_t origin )
}
int binocularModel;
int wolfkickModel;
int hWeaponSnd;
int hflakWeaponSnd;
@ -1679,6 +1680,7 @@ void CG_RegisterItemVisuals( int itemNum ) {
itemInfo->registered = qtrue; //----(SA) moved this down after the registerweapon()
binocularModel = trap_R_RegisterModel( "models/powerups/keys/binoculars.md3" );
wolfkickModel = trap_R_RegisterModel( "models/weapons2/foot/v_wolfoot_10f.md3" );
hWeaponSnd = trap_S_RegisterSound( "sound/weapons/mg42/37mm.wav" );
@ -2021,8 +2023,24 @@ static float CG_CalculateWeaponPositionAndScale( playerState_t *ps, vec3_t origi
CG_CenterPrint( cgVR->test_name, SCREEN_HEIGHT * 0.45, SMALLCHAR_WIDTH );
} else {
if (cgVR->backpackitemactive == 3)
{
scale = 0.5f;
VectorSet(offset, 1, -3, 0);
vec3_t adjust;
VectorSet(adjust, 20, 140, 0);
//Adjust angles for weapon models that aren't aligned very well
matrix4x4 m1, m2, m3;
vec3_t zero;
VectorClear(zero);
Matrix4x4_CreateFromEntity(m1, angles, zero, 1.0);
Matrix4x4_CreateFromEntity(m2, adjust, zero, 1.0);
Matrix4x4_Concat(m3, m1, m2);
Matrix4x4_ConvertToEntity(m3, angles, zero);
}
//Now adjust weapon: scale, right, up, forward
if (ps->weapon != 0)
else if (ps->weapon != 0)
{
char cvar_name[64];
Com_sprintf(cvar_name, sizeof(cvar_name), "vr_weapon_adjustment_%i", ps->weapon);
@ -2904,7 +2922,16 @@ void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent
}
if ( ps ) {
gun.hModel = weapon->weaponModel[W_FP_MODEL];
if (cgVR->backpackitemactive == 3)
{
gun.hModel = binocularModel;
CG_PositionEntityOnTag( &gun, parent, "tag_weapon", 0, NULL );
CG_AddWeaponWithPowerups( &gun, 0, ps, cent );
return;
}
else {
gun.hModel = weapon->weaponModel[W_FP_MODEL];
}
} else {
CG_AddProtoWeapons( parent, ps, cent );
// skeletal guys use a different third person weapon (for different tag business)
@ -3429,15 +3456,18 @@ void CG_AddViewWeapon( playerState_t *ps ) {
AnglesToAxis( angles, hand.axis );
if ( cg_gun_frame.integer ) {
if ( cg_gun_frame.integer) {
hand.frame = hand.oldframe = cg_gun_frame.integer;
hand.backlerp = 0;
} else { // get the animation state
CG_WeaponAnimation( ps, weapon, &hand.oldframe, &hand.frame, &hand.backlerp ); //----(SA) changed
}
if (cgVR->backpackitemactive != 3)
{
hand.hModel = weapon->handsModel;
}
hand.hModel = weapon->handsModel;
//Weapon offset debugging
if (weaponDebugging)
{
@ -3483,22 +3513,14 @@ void CG_AddViewWeapon( playerState_t *ps ) {
// add everything onto the hand
CG_AddPlayerWeapon( &hand, ps, &cg.predictedPlayerEntity );
CG_AddPlayerWeapon(&hand, ps, &cg.predictedPlayerEntity);
// Ridah
} // end "if ( ps->weapon > WP_NONE)"
// Rafael
// add the foot
CG_AddPlayerFoot( &hand, ps, &cg.predictedPlayerEntity );
//Add beam
static centity_t beam_entity;
VectorCopy(hand.origin, beam_entity.currentState.pos.trBase); //beam origin
vec3_t forward;
AngleVectors(angles, forward, NULL, NULL);
VectorMA(beam_entity.currentState.pos.trBase, 64, forward, beam_entity.currentState.origin2); //beam end
//Weapon offset debugging
if (weaponDebugging)
{
@ -4305,6 +4327,7 @@ void CG_FinishWeaponChange( int lastweap, int newweap ) {
}
cg.weaponSelect = newweap;
cgVR->weaponid = newweap; //Store in case we use backpack
}
void CG_WeaponDetachScope_f( void ) {

View file

@ -42,7 +42,7 @@ If you have questions concerning this license or the applicable additional terms
// q_shared.h -- included first by ALL program modules.
// A user mod should never modify this file
#define Q3_VERSION "RTCWQuest 0.10.0 (Wolf 1.41)"
#define Q3_VERSION "RTCWQuest 0.11.0 (Wolf 1.41)"
// ver 1.0.0 - release
// ver 1.0.1 - post-release work
// ver 1.1.0 - patch 1 (12/12/01)
@ -220,7 +220,7 @@ void Sys_PumpEvents( void );
#elif defined __axp__
#define CPUSTRING "linux-alpha"
#elif defined ARM
#define CPUSTRING "Oculus Quest"
#define CPUSTRING "ARM"
#else
#define CPUSTRING "linux-other"
#endif