Tune touch gesture distance; Improve use interaction in 3rd person.

This commit is contained in:
Petr Bartos 2023-04-08 22:49:28 +02:00
parent 260d501776
commit d121206f83
4 changed files with 62 additions and 32 deletions

View file

@ -1349,11 +1349,12 @@ void ClientImpacts( gentity_t *ent, pmove_t *pm ) {
} }
// Use triggers seems to have bigger "front" boundaries // Use triggers seems to have bigger "front" boundaries allowing
// (with longer range player often reaches behind them // user to trigger them from distance while it is possible to reach
// not activating them at all) // through them when standing near. To ballance this, move hand
const float TOUCH_DISTANCE = 1.0f; // origin a bit back
const vec3_t TOUCH_RANGE = { 4, 4, 4 }; const float TOUCH_OFFSET = -10.0f;
const vec3_t TOUCH_RANGE = { 4, 4, 4 };
void G_TouchTriggersWithHand( bool offHand, gentity_t *ent, vec3_t src, vec3_t vf ) { void G_TouchTriggersWithHand( bool offHand, gentity_t *ent, vec3_t src, vec3_t vf ) {
vec3_t dest, mins, maxs; vec3_t dest, mins, maxs;
@ -1364,7 +1365,7 @@ void G_TouchTriggersWithHand( bool offHand, gentity_t *ent, vec3_t src, vec3_t v
memset (touched, qfalse, sizeof(touched) ); memset (touched, qfalse, sizeof(touched) );
VectorMA( src, TOUCH_DISTANCE, vf, dest ); VectorMA( src, TOUCH_OFFSET, vf, dest );
VectorSubtract( dest, TOUCH_RANGE, mins ); VectorSubtract( dest, TOUCH_RANGE, mins );
VectorAdd( dest, TOUCH_RANGE, maxs ); VectorAdd( dest, TOUCH_RANGE, maxs );

View file

@ -1669,12 +1669,15 @@ qboolean CanUseInfrontOf(gentity_t *ent)
return qfalse; return qfalse;
} }
bool thirdPersonActive = gi.cvar("cg_thirdPerson", "0", CVAR_TEMP)->integer;
if (thirdPersonActive) {
VectorCopy(ent->currentOrigin, src);
AngleVectors(ent->currentAngles, vf, NULL, NULL);
} else {
VectorCopy( ent->client->renderInfo.eyePoint, src );
AngleVectors( ent->client->ps.viewangles, vf, NULL, NULL );
}
//FIXME: this does not match where the new accurate crosshair aims...
//cg.refdef.vieworg, basically
VectorCopy( ent->client->renderInfo.eyePoint, src );
AngleVectors( ent->client->ps.viewangles, vf, NULL, NULL );
//extend to find end of use trace //extend to find end of use trace
VectorMA( src, USE_DISTANCE, vf, dest ); VectorMA( src, USE_DISTANCE, vf, dest );
@ -1757,7 +1760,10 @@ Try and use an entity in the world, directly ahead of us
*/ */
#define USE_DISTANCE_BUTTON 64.0f #define USE_DISTANCE_BUTTON 64.0f
#define USE_DISTANCE_GESTURE 16.0f #define USE_DISTANCE_GESTURE 26.0f
// Move controller origin a bit back to prevent reach
// through usable entities when use gesture is active
#define USE_OFFSET -10.0f
void TryUse_Internal( bool offHand, gentity_t *ent, vec3_t src, vec3_t vf ) void TryUse_Internal( bool offHand, gentity_t *ent, vec3_t src, vec3_t vf )
{ {
@ -1769,7 +1775,9 @@ void TryUse_Internal( bool offHand, gentity_t *ent, vec3_t src, vec3_t vf )
bool thirdPersonActive = gi.cvar("cg_thirdPerson", "0", CVAR_TEMP)->integer; bool thirdPersonActive = gi.cvar("cg_thirdPerson", "0", CVAR_TEMP)->integer;
bool useGestureEnabled = gi.cvar("vr_gesture_triggered_use", "1", CVAR_ARCHIVE)->integer; // defined in VrCvars.h bool useGestureEnabled = gi.cvar("vr_gesture_triggered_use", "1", CVAR_ARCHIVE)->integer; // defined in VrCvars.h
bool useGestureAllowed = useGestureEnabled && !thirdPersonActive; bool useGestureAllowed = useGestureEnabled && !thirdPersonActive;
float useOffset = useGestureAllowed ? USE_OFFSET : 0.0f;
float useDistance = useGestureAllowed ? USE_DISTANCE_GESTURE : USE_DISTANCE_BUTTON; float useDistance = useGestureAllowed ? USE_DISTANCE_GESTURE : USE_DISTANCE_BUTTON;
VectorMA( src, useOffset, vf, src );
VectorMA( src, useDistance, vf, dest ); VectorMA( src, useDistance, vf, dest );
//Trace ahead to find a valid target //Trace ahead to find a valid target
@ -1863,10 +1871,16 @@ void TryUse( gentity_t *ent ) {
bool thirdPersonActive = gi.cvar("cg_thirdPerson", "0", CVAR_TEMP)->integer; bool thirdPersonActive = gi.cvar("cg_thirdPerson", "0", CVAR_TEMP)->integer;
vec3_t src, angles, vf; vec3_t src, angles, vf;
if (ent->client->ps.clientNum == 0 && !thirdPersonActive) { if (ent->client->ps.clientNum == 0) {
BG_CalculateVRWeaponPosition(src, angles); if (thirdPersonActive) {
AngleVectors( angles, vf, NULL, NULL ); VectorCopy(ent->currentOrigin, src);
TryUse_Internal(false, ent, src, vf); AngleVectors(ent->currentAngles, vf, NULL, NULL);
TryUse_Internal(false, ent, src, vf);
} else {
BG_CalculateVRWeaponPosition(src, angles);
AngleVectors( angles, vf, NULL, NULL );
TryUse_Internal(false, ent, src, vf);
}
} else { } else {
VectorCopy(ent->client->renderInfo.eyePoint, src); VectorCopy(ent->client->renderInfo.eyePoint, src);
AngleVectors(ent->client->ps.viewangles, vf, NULL, NULL); AngleVectors(ent->client->ps.viewangles, vf, NULL, NULL);

View file

@ -819,11 +819,12 @@ void ClientImpacts( gentity_t *ent, pmove_t *pm ) {
} }
// Use triggers seems to have bigger "front" boundaries // Use triggers seems to have bigger "front" boundaries allowing
// (with longer range player often reaches behind them // user to trigger them from distance while it is possible to reach
// not activating them at all) // through them when standing near. To ballance this, move hand
const float TOUCH_DISTANCE = 1.0f; // origin a bit back
const vec3_t TOUCH_RANGE = { 4, 4, 4 }; const float TOUCH_OFFSET = -10.0f;
const vec3_t TOUCH_RANGE = { 4, 4, 4 };
void G_TouchTriggersWithHand( bool offHand, gentity_t *ent, vec3_t src, vec3_t vf ) { void G_TouchTriggersWithHand( bool offHand, gentity_t *ent, vec3_t src, vec3_t vf ) {
vec3_t dest, mins, maxs; vec3_t dest, mins, maxs;
@ -834,7 +835,7 @@ void G_TouchTriggersWithHand( bool offHand, gentity_t *ent, vec3_t src, vec3_t v
memset (touched, qfalse, sizeof(touched) ); memset (touched, qfalse, sizeof(touched) );
VectorMA( src, TOUCH_DISTANCE, vf, dest ); VectorMA( src, TOUCH_OFFSET, vf, dest );
VectorSubtract( dest, TOUCH_RANGE, mins ); VectorSubtract( dest, TOUCH_RANGE, mins );
VectorAdd( dest, TOUCH_RANGE, maxs ); VectorAdd( dest, TOUCH_RANGE, maxs );

View file

@ -1442,12 +1442,15 @@ qboolean CanUseInfrontOf(gentity_t *ent)
return qfalse; return qfalse;
} }
bool thirdPersonActive = gi.cvar("cg_thirdPerson", "0", CVAR_TEMP)->integer;
if (thirdPersonActive) {
VectorCopy(ent->currentOrigin, src);
AngleVectors(ent->currentAngles, vf, NULL, NULL);
} else {
VectorCopy( ent->client->renderInfo.eyePoint, src );
AngleVectors( ent->client->ps.viewangles, vf, NULL, NULL );
}
//FIXME: this does not match where the new accurate crosshair aims...
//cg.refdef.vieworg, basically
VectorCopy( ent->client->renderInfo.eyePoint, src );
AngleVectors( ent->client->ps.viewangles, vf, NULL, NULL );
//extend to find end of use trace //extend to find end of use trace
VectorMA( src, USE_DISTANCE, vf, dest ); VectorMA( src, USE_DISTANCE, vf, dest );
@ -1523,7 +1526,10 @@ Try and use an entity in the world, directly ahead of us
*/ */
#define USE_DISTANCE_BUTTON 64.0f #define USE_DISTANCE_BUTTON 64.0f
#define USE_DISTANCE_GESTURE 16.0f #define USE_DISTANCE_GESTURE 26.0f
// Move controller origin a bit back to prevent reach
// through usable entities when use gesture is active
#define USE_OFFSET -10.0f
void TryUse_Internal( bool offHand, gentity_t *ent, vec3_t src, vec3_t vf ) { void TryUse_Internal( bool offHand, gentity_t *ent, vec3_t src, vec3_t vf ) {
gentity_t *target; gentity_t *target;
@ -1534,7 +1540,9 @@ void TryUse_Internal( bool offHand, gentity_t *ent, vec3_t src, vec3_t vf ) {
bool thirdPersonActive = gi.cvar("cg_thirdPerson", "0", CVAR_TEMP)->integer; bool thirdPersonActive = gi.cvar("cg_thirdPerson", "0", CVAR_TEMP)->integer;
bool useGestureEnabled = gi.cvar("vr_gesture_triggered_use", "1", CVAR_ARCHIVE)->integer; // defined in VrCvars.h bool useGestureEnabled = gi.cvar("vr_gesture_triggered_use", "1", CVAR_ARCHIVE)->integer; // defined in VrCvars.h
bool useGestureAllowed = useGestureEnabled && !thirdPersonActive; bool useGestureAllowed = useGestureEnabled && !thirdPersonActive;
float useOffset = useGestureAllowed ? USE_OFFSET : 0.0f;
float useDistance = useGestureAllowed ? USE_DISTANCE_GESTURE : USE_DISTANCE_BUTTON; float useDistance = useGestureAllowed ? USE_DISTANCE_GESTURE : USE_DISTANCE_BUTTON;
VectorMA( src, useOffset, vf, src );
VectorMA( src, useDistance, vf, dest ); VectorMA( src, useDistance, vf, dest );
//Trace ahead to find a valid target //Trace ahead to find a valid target
@ -1609,10 +1617,16 @@ void TryUse( gentity_t *ent ) {
bool thirdPersonActive = gi.cvar("cg_thirdPerson", "0", CVAR_TEMP)->integer; bool thirdPersonActive = gi.cvar("cg_thirdPerson", "0", CVAR_TEMP)->integer;
vec3_t src, angles, vf; vec3_t src, angles, vf;
if (ent->client->ps.clientNum == 0 && !thirdPersonActive) { if (ent->client->ps.clientNum == 0) {
BG_CalculateVRWeaponPosition(src, angles); if (thirdPersonActive) {
AngleVectors( angles, vf, NULL, NULL ); VectorCopy(ent->currentOrigin, src);
TryUse_Internal(false, ent, src, vf); AngleVectors(ent->currentAngles, vf, NULL, NULL);
TryUse_Internal(false, ent, src, vf);
} else {
BG_CalculateVRWeaponPosition(src, angles);
AngleVectors( angles, vf, NULL, NULL );
TryUse_Internal(false, ent, src, vf);
}
} else { } else {
VectorCopy(ent->client->renderInfo.eyePoint, src); VectorCopy(ent->client->renderInfo.eyePoint, src);
AngleVectors(ent->client->ps.viewangles, vf, NULL, NULL); AngleVectors(ent->client->ps.viewangles, vf, NULL, NULL);