in_sdl.c: lower default controller deadzone to 0.175. refactor a bit, fix clamping of look axis vector length.

git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1297 af15c1b1-3010-417e-b628-4374ebc0bcbd
This commit is contained in:
Eric Wasylishen 2016-03-09 04:42:44 +00:00
parent f8ccd07420
commit 39a6b46713

View file

@ -49,7 +49,7 @@ static cvar_t in_debugkeys = {"in_debugkeys", "0", CVAR_NONE};
#endif #endif
// SDL2 Game Controller cvars // SDL2 Game Controller cvars
cvar_t joy_deadzone = { "joy_deadzone", "0.2", CVAR_NONE }; cvar_t joy_deadzone = { "joy_deadzone", "0.175", CVAR_NONE };
cvar_t joy_deadzone_trigger = { "joy_deadzone_trigger", "0.001", CVAR_NONE }; cvar_t joy_deadzone_trigger = { "joy_deadzone_trigger", "0.001", CVAR_NONE };
cvar_t joy_sensitivity_yaw = { "joy_sensitivity_yaw", "300", CVAR_NONE }; cvar_t joy_sensitivity_yaw = { "joy_sensitivity_yaw", "300", CVAR_NONE };
cvar_t joy_sensitivity_pitch = { "joy_sensitivity_pitch", "150", CVAR_NONE }; cvar_t joy_sensitivity_pitch = { "joy_sensitivity_pitch", "150", CVAR_NONE };
@ -418,20 +418,30 @@ static double joy_emulatedkeytimer[10];
/* /*
================ ================
IN_ApplyEasing IN_AxisMagnitude
assumes axis values are in [-1, 1]. Raises the axis values to the given exponent, keeping signs. Returns the vector length of the given joystick axis
================ ================
*/ */
static joyaxis_t IN_ApplyEasing(joyaxis_t axis, float exponent) static vec_t IN_AxisMagnitude(joyaxis_t axis)
{
vec_t magnitude = sqrtf((axis.x * axis.x) + (axis.y * axis.y));
return magnitude;
}
/*
================
IN_ApplyLookEasing
assumes axis values are in [-1, 1] and the vector magnitude has been clamped at 1.
Raises the axis values to the given exponent, keeping signs.
================
*/
static joyaxis_t IN_ApplyLookEasing(joyaxis_t axis, float exponent)
{ {
joyaxis_t result = {0}; joyaxis_t result = {0};
float magnitude, eased_magnitude; vec_t eased_magnitude;
vec_t magnitude = IN_AxisMagnitude(axis);
magnitude = sqrtf( (axis.x * axis.x) + (axis.y * axis.y) );
if (magnitude > 1)
magnitude = 1;
if (magnitude == 0) if (magnitude == 0)
return result; return result;
@ -466,11 +476,16 @@ static joyaxis_t IN_ApplyMoveEasing(joyaxis_t axis)
return result; return result;
} }
/* /*
================ ================
IN_ApplyDeadzone IN_ApplyDeadzone
in: raw joystick axis values converted to floats in +-1
out: applies a circular deadzone and clamps the magnitude at 1
(my 360 controller is slightly non-circular and the stick travels further on the diagonals)
deadzone is expected to satisfy 0 < deadzone < 1
from https://github.com/jeremiah-sypult/Quakespasm-Rift from https://github.com/jeremiah-sypult/Quakespasm-Rift
and adapted from http://www.third-helix.com/2013/04/12/doing-thumbstick-dead-zones-right.html and adapted from http://www.third-helix.com/2013/04/12/doing-thumbstick-dead-zones-right.html
================ ================
@ -478,23 +493,13 @@ and adapted from http://www.third-helix.com/2013/04/12/doing-thumbstick-dead-zon
static joyaxis_t IN_ApplyDeadzone(joyaxis_t axis, float deadzone) static joyaxis_t IN_ApplyDeadzone(joyaxis_t axis, float deadzone)
{ {
joyaxis_t result = {0}; joyaxis_t result = {0};
float magnitude = sqrtf( (axis.x * axis.x) + (axis.y * axis.y) ); vec_t magnitude = IN_AxisMagnitude(axis);
if ( magnitude < deadzone ) { if ( magnitude > deadzone ) {
result.x = result.y = 0.0f; const vec_t new_magnitude = q_min(1.0, (magnitude - deadzone) / (1.0 - deadzone));
} else { const vec_t scale = new_magnitude / magnitude;
joyaxis_t normalized; result.x = axis.x * scale;
float gradient; result.y = axis.y * scale;
if ( magnitude > 1.0f ) {
magnitude = 1.0f;
}
normalized.x = axis.x / magnitude;
normalized.y = axis.y / magnitude;
gradient = ( (magnitude - deadzone) / (1.0f - deadzone) );
result.x = normalized.x * gradient;
result.y = normalized.y * gradient;
} }
return result; return result;
@ -637,7 +642,8 @@ void IN_JoyMove (usercmd_t *cmd)
{ {
#if defined(USE_SDL2) #if defined(USE_SDL2)
float speed; float speed;
joyaxis_t moveAxis, lookAxis; joyaxis_t moveRaw, moveDeadzone, moveEased;
joyaxis_t lookRaw, lookDeadzone, lookEased;
if (!joy_enable.value) if (!joy_enable.value)
return; return;
@ -645,36 +651,36 @@ void IN_JoyMove (usercmd_t *cmd)
if (!joy_active_controller) if (!joy_active_controller)
return; return;
moveAxis.x = joy_axisstate.axisvalue[SDL_CONTROLLER_AXIS_LEFTX]; moveRaw.x = joy_axisstate.axisvalue[SDL_CONTROLLER_AXIS_LEFTX];
moveAxis.y = joy_axisstate.axisvalue[SDL_CONTROLLER_AXIS_LEFTY]; moveRaw.y = joy_axisstate.axisvalue[SDL_CONTROLLER_AXIS_LEFTY];
lookAxis.x = joy_axisstate.axisvalue[SDL_CONTROLLER_AXIS_RIGHTX]; lookRaw.x = joy_axisstate.axisvalue[SDL_CONTROLLER_AXIS_RIGHTX];
lookAxis.y = joy_axisstate.axisvalue[SDL_CONTROLLER_AXIS_RIGHTY]; lookRaw.y = joy_axisstate.axisvalue[SDL_CONTROLLER_AXIS_RIGHTY];
if (joy_swapmovelook.value) if (joy_swapmovelook.value)
{ {
joyaxis_t temp = moveAxis; joyaxis_t temp = moveRaw;
moveAxis = lookAxis; moveRaw = lookRaw;
lookAxis = temp; lookRaw = temp;
} }
moveAxis = IN_ApplyDeadzone(moveAxis, joy_deadzone.value); moveDeadzone = IN_ApplyDeadzone(moveRaw, joy_deadzone.value);
lookAxis = IN_ApplyDeadzone(lookAxis, joy_deadzone.value); lookDeadzone = IN_ApplyDeadzone(lookRaw, joy_deadzone.value);
moveAxis = IN_ApplyMoveEasing(moveAxis); moveEased = IN_ApplyMoveEasing(moveDeadzone);
lookAxis = IN_ApplyEasing(lookAxis, joy_exponent.value); lookEased = IN_ApplyLookEasing(lookDeadzone, joy_exponent.value);
if (in_speed.state & 1) if (in_speed.state & 1)
speed = cl_movespeedkey.value; speed = cl_movespeedkey.value;
else else
speed = 1; speed = 1;
cmd->sidemove += (cl_sidespeed.value * speed * moveAxis.x); cmd->sidemove += (cl_sidespeed.value * speed * moveEased.x);
cmd->forwardmove -= (cl_forwardspeed.value * speed * moveAxis.y); cmd->forwardmove -= (cl_forwardspeed.value * speed * moveEased.y);
cl.viewangles[YAW] -= lookAxis.x * joy_sensitivity_yaw.value * host_frametime; cl.viewangles[YAW] -= lookEased.x * joy_sensitivity_yaw.value * host_frametime;
cl.viewangles[PITCH] += lookAxis.y * joy_sensitivity_pitch.value * (joy_invert.value ? -1.0 : 1.0) * host_frametime; cl.viewangles[PITCH] += lookEased.y * joy_sensitivity_pitch.value * (joy_invert.value ? -1.0 : 1.0) * host_frametime;
if (lookAxis.x != 0 || lookAxis.y != 0) if (lookEased.x != 0 || lookEased.y != 0)
V_StopPitchDrift(); V_StopPitchDrift();
/* johnfitz -- variable pitch clamping */ /* johnfitz -- variable pitch clamping */