Make viewing with joystick framerate-independent

otherwise looking around is faster with higher framerates, that sucks,
especially with unstable framerates (on RPi)
This commit is contained in:
Daniel Gibson 2017-12-02 18:54:26 +01:00
parent e429356bd3
commit c3d3e9fc76
1 changed files with 14 additions and 7 deletions

View File

@ -70,9 +70,9 @@ static int old_mouse_x, old_mouse_y;
static qboolean mlooking; static qboolean mlooking;
#if SDL_VERSION_ATLEAST(2, 0, 0) #if SDL_VERSION_ATLEAST(2, 0, 0)
static int joystick_yaw, joystick_pitch; static float joystick_yaw, joystick_pitch;
static int joystick_forwardmove, joystick_sidemove; static float joystick_forwardmove, joystick_sidemove;
static int joystick_up; static float joystick_up;
static int back_button_id = -1; static int back_button_id = -1;
static char last_hat = SDL_HAT_CENTERED; static char last_hat = SDL_HAT_CENTERED;
static qboolean left_trigger = false; static qboolean left_trigger = false;
@ -594,13 +594,14 @@ IN_Update(void)
if (strcmp(direction_type, "sidemove") == 0) if (strcmp(direction_type, "sidemove") == 0)
{ {
joystick_sidemove = axis_value * joy_sidesensitivity->value; joystick_sidemove = axis_value * joy_sidesensitivity->value;
joystick_sidemove *= cl_sidespeed->value; // We need to be twice faster because with joystic we run...
joystick_sidemove *= cl_sidespeed->value * 2.0f;
} }
else if (strcmp(direction_type, "forwardmove") == 0) else if (strcmp(direction_type, "forwardmove") == 0)
{ {
joystick_forwardmove = axis_value * joy_forwardsensitivity->value; joystick_forwardmove = axis_value * joy_forwardsensitivity->value;
// We need to be twice faster because with joystic we run... // We need to be twice faster because with joystic we run...
joystick_forwardmove *= cl_forwardspeed->value * 2; joystick_forwardmove *= cl_forwardspeed->value * 2.0f;
} }
else if (strcmp(direction_type, "yaw") == 0) else if (strcmp(direction_type, "yaw") == 0)
{ {
@ -788,14 +789,20 @@ IN_Move(usercmd_t *cmd)
} }
#if SDL_VERSION_ATLEAST(2, 0, 0) #if SDL_VERSION_ATLEAST(2, 0, 0)
// to make the the viewangles changes independent of framerate
// we need to scale with frametime (assuming the configured values are for 60hz)
// 1/32768 is to normalize the input values from SDL (they're between -32768 and 32768 and we want -1 to 1)
// (for movement this is not needed, as those are absolute values independent of framerate)
float joyViewFactor = (1.0f/32768.0f) * (cls.rframetime/0.01666f);
if (joystick_yaw) if (joystick_yaw)
{ {
cl.viewangles[YAW] -= (m_yaw->value * joystick_yaw) / 32768; cl.viewangles[YAW] -= (m_yaw->value * joystick_yaw) * joyViewFactor;
} }
if(joystick_pitch) if(joystick_pitch)
{ {
cl.viewangles[PITCH] += (m_pitch->value * joystick_pitch) / 32768; cl.viewangles[PITCH] += (m_pitch->value * joystick_pitch) * joyViewFactor;
} }
if (joystick_forwardmove) if (joystick_forwardmove)