From cccb079d639efcdb6a78ae38bcc3b2d267d7bd60 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Sun, 24 Aug 2025 00:05:03 +0200 Subject: [PATCH] cleanup deadzone code (#558) --- src/ui/input.rs | 93 +++++++++++++++++++++---------------------------- 1 file changed, 39 insertions(+), 54 deletions(-) diff --git a/src/ui/input.rs b/src/ui/input.rs index 76a9e4e..f6d061f 100644 --- a/src/ui/input.rs +++ b/src/ui/input.rs @@ -42,7 +42,7 @@ pub struct InputData { } fn bound_axis(x: &mut f64, y: &mut f64) { - let radius = 95.0; // this is roughly the maxium diagonal distance of the controller + let radius = f64::sqrt(70.0 * 70.0 + 70.0 * 70.0); // this is roughly the maxium diagonal distance of the controller // Calculate the distance from the origin (0, 0) let distance = f64::sqrt((*x) * (*x) + (*y) * (*y)); @@ -55,10 +55,27 @@ fn bound_axis(x: &mut f64, y: &mut f64) { } } +fn apply_deadzone(x: &mut f64, y: &mut f64, deadzone: i32) { + let axis_deadzone = MAX_AXIS_VALUE * (deadzone as f64 / 100.0); + + // Calculate the distance from the origin (0, 0) + let distance = f64::sqrt((*x) * (*x) + (*y) * (*y)); + + if distance <= axis_deadzone { + *x = 0.0; + *y = 0.0; + return; + } + + let new_distance = + (distance - axis_deadzone) * MAX_AXIS_VALUE / (MAX_AXIS_VALUE - axis_deadzone); + *x = *x / distance * new_distance; + *y = *y / distance * new_distance; +} + fn set_axis_from_joystick( profile: &ui::config::InputProfile, joystick: *mut sdl3_sys::joystick::SDL_Joystick, - deadzone: i16, ) -> (f64, f64) { let mut x = 0.0; let mut y = 0.0; @@ -66,48 +83,32 @@ fn set_axis_from_joystick( let axis_position = unsafe { sdl3_sys::joystick::SDL_GetJoystickAxis(joystick, profile.joystick_axis[AXIS_LEFT].id) }; - if axis_position.saturating_abs() > deadzone - && axis_position as isize * profile.joystick_axis[AXIS_LEFT].axis as isize > 0 - { - x = (axis_position.saturating_abs() - deadzone) as f64 * MAX_AXIS_VALUE - / (i16::MAX - deadzone) as f64; - x *= profile.joystick_axis[AXIS_LEFT].axis as f64; + if axis_position as isize * profile.joystick_axis[AXIS_LEFT].axis as isize > 0 { + x = axis_position as f64 * MAX_AXIS_VALUE / i16::MAX as f64; } } if profile.joystick_axis[AXIS_RIGHT].enabled { let axis_position = unsafe { sdl3_sys::joystick::SDL_GetJoystickAxis(joystick, profile.joystick_axis[AXIS_RIGHT].id) }; - if axis_position.saturating_abs() > deadzone - && axis_position as isize * profile.joystick_axis[AXIS_RIGHT].axis as isize > 0 - { - x = (axis_position.saturating_abs() - deadzone) as f64 * MAX_AXIS_VALUE - / (i16::MAX - deadzone) as f64; - x *= profile.joystick_axis[AXIS_RIGHT].axis as f64; + if axis_position as isize * profile.joystick_axis[AXIS_RIGHT].axis as isize > 0 { + x = axis_position as f64 * MAX_AXIS_VALUE / i16::MAX as f64; } } if profile.joystick_axis[AXIS_DOWN].enabled { let axis_position = unsafe { sdl3_sys::joystick::SDL_GetJoystickAxis(joystick, profile.joystick_axis[AXIS_DOWN].id) }; - if axis_position.saturating_abs() > deadzone - && axis_position as isize * profile.joystick_axis[AXIS_DOWN].axis as isize > 0 - { - y = (axis_position.saturating_abs() - deadzone) as f64 * MAX_AXIS_VALUE - / (i16::MAX - deadzone) as f64; - y *= (profile.joystick_axis[AXIS_DOWN].axis as f64).neg(); + if axis_position as isize * profile.joystick_axis[AXIS_DOWN].axis as isize > 0 { + y = (axis_position as f64 * MAX_AXIS_VALUE / i16::MAX as f64).neg(); } } if profile.joystick_axis[AXIS_UP].enabled { let axis_position = unsafe { sdl3_sys::joystick::SDL_GetJoystickAxis(joystick, profile.joystick_axis[AXIS_UP].id) }; - if axis_position.saturating_abs() > deadzone - && axis_position as isize * profile.joystick_axis[AXIS_UP].axis as isize > 0 - { - y = (axis_position.saturating_abs() - deadzone) as f64 * MAX_AXIS_VALUE - / (i16::MAX - deadzone) as f64; - y *= (profile.joystick_axis[AXIS_UP].axis as f64).neg(); + if axis_position as isize * profile.joystick_axis[AXIS_UP].axis as isize > 0 { + y = (axis_position as f64 * MAX_AXIS_VALUE / i16::MAX as f64).neg(); } } (x, y) @@ -149,7 +150,6 @@ fn get_button_from_i32(button: i32) -> sdl3_sys::gamepad::SDL_GamepadButton { fn set_axis_from_controller( profile: &ui::config::InputProfile, controller: *mut sdl3_sys::gamepad::SDL_Gamepad, - deadzone: i16, ) -> (f64, f64) { let mut x = 0.0; let mut y = 0.0; @@ -160,12 +160,8 @@ fn set_axis_from_controller( get_axis_from_i32(profile.controller_axis[AXIS_LEFT].id), ) }; - if axis_position.saturating_abs() > deadzone - && axis_position as isize * profile.controller_axis[AXIS_LEFT].axis as isize > 0 - { - x = (axis_position.saturating_abs() - deadzone) as f64 * MAX_AXIS_VALUE - / (i16::MAX - deadzone) as f64; - x *= profile.controller_axis[AXIS_LEFT].axis as f64; + if axis_position as isize * profile.controller_axis[AXIS_LEFT].axis as isize > 0 { + x = axis_position as f64 * MAX_AXIS_VALUE / i16::MAX as f64; } } if profile.controller_axis[AXIS_RIGHT].enabled { @@ -175,12 +171,8 @@ fn set_axis_from_controller( get_axis_from_i32(profile.controller_axis[AXIS_RIGHT].id), ) }; - if axis_position.saturating_abs() > deadzone - && axis_position as isize * profile.controller_axis[AXIS_RIGHT].axis as isize > 0 - { - x = (axis_position.saturating_abs() - deadzone) as f64 * MAX_AXIS_VALUE - / (i16::MAX - deadzone) as f64; - x *= profile.controller_axis[AXIS_RIGHT].axis as f64; + if axis_position as isize * profile.controller_axis[AXIS_RIGHT].axis as isize > 0 { + x = axis_position as f64 * MAX_AXIS_VALUE / i16::MAX as f64; } } if profile.controller_axis[AXIS_DOWN].enabled { @@ -190,12 +182,8 @@ fn set_axis_from_controller( get_axis_from_i32(profile.controller_axis[AXIS_DOWN].id), ) }; - if axis_position.saturating_abs() > deadzone - && axis_position as isize * profile.controller_axis[AXIS_DOWN].axis as isize > 0 - { - y = (axis_position.saturating_abs() - deadzone) as f64 * MAX_AXIS_VALUE - / (i16::MAX - deadzone) as f64; - y *= (profile.controller_axis[AXIS_DOWN].axis as f64).neg(); + if axis_position as isize * profile.controller_axis[AXIS_DOWN].axis as isize > 0 { + y = (axis_position as f64 * MAX_AXIS_VALUE / i16::MAX as f64).neg(); } } if profile.controller_axis[AXIS_UP].enabled { @@ -205,12 +193,8 @@ fn set_axis_from_controller( get_axis_from_i32(profile.controller_axis[AXIS_UP].id), ) }; - if axis_position.saturating_abs() > deadzone - && axis_position as isize * profile.controller_axis[AXIS_UP].axis as isize > 0 - { - y = (axis_position.saturating_abs() - deadzone) as f64 * MAX_AXIS_VALUE - / (i16::MAX - deadzone) as f64; - y *= (profile.controller_axis[AXIS_UP].axis as f64).neg(); + if axis_position as isize * profile.controller_axis[AXIS_UP].axis as isize > 0 { + y = (axis_position as f64 * MAX_AXIS_VALUE / i16::MAX as f64).neg(); } } (x, y) @@ -444,11 +428,12 @@ pub fn get(ui: &ui::Ui, channel: usize) -> InputData { (x, y) = set_axis_from_keys(profile, ui.input.keyboard_state); } - let deadzone = (i16::MAX as i32 * profile.deadzone / 100) as i16; if !controller.is_null() { - (x, y) = set_axis_from_controller(profile, controller, deadzone) + (x, y) = set_axis_from_controller(profile, controller); + apply_deadzone(&mut x, &mut y, profile.deadzone); } else if !joystick.is_null() { - (x, y) = set_axis_from_joystick(profile, joystick, deadzone) + (x, y) = set_axis_from_joystick(profile, joystick); + apply_deadzone(&mut x, &mut y, profile.deadzone); } bound_axis(&mut x, &mut y);