use saturating abs for deadzone (#557)

This commit is contained in:
Logan McNaughton 2025-08-23 22:52:04 +02:00 committed by GitHub
parent 8799650245
commit c52b680753
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -58,7 +58,7 @@ fn bound_axis(x: &mut f64, y: &mut f64) {
fn set_axis_from_joystick(
profile: &ui::config::InputProfile,
joystick: *mut sdl3_sys::joystick::SDL_Joystick,
deadzone: u16,
deadzone: i16,
) -> (f64, f64) {
let mut x = 0.0;
let mut y = 0.0;
@ -66,11 +66,11 @@ fn set_axis_from_joystick(
let axis_position = unsafe {
sdl3_sys::joystick::SDL_GetJoystickAxis(joystick, profile.joystick_axis[AXIS_LEFT].id)
};
if axis_position.unsigned_abs() > deadzone
if axis_position.saturating_abs() > deadzone
&& axis_position as isize * profile.joystick_axis[AXIS_LEFT].axis as isize > 0
{
x = (axis_position.unsigned_abs() - deadzone) as f64 * MAX_AXIS_VALUE
/ (i16::MAX as u16 - deadzone) as f64;
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;
}
}
@ -78,11 +78,11 @@ fn set_axis_from_joystick(
let axis_position = unsafe {
sdl3_sys::joystick::SDL_GetJoystickAxis(joystick, profile.joystick_axis[AXIS_RIGHT].id)
};
if axis_position.unsigned_abs() > deadzone
if axis_position.saturating_abs() > deadzone
&& axis_position as isize * profile.joystick_axis[AXIS_RIGHT].axis as isize > 0
{
x = (axis_position.unsigned_abs() - deadzone) as f64 * MAX_AXIS_VALUE
/ (i16::MAX as u16 - deadzone) as f64;
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;
}
}
@ -90,11 +90,11 @@ fn set_axis_from_joystick(
let axis_position = unsafe {
sdl3_sys::joystick::SDL_GetJoystickAxis(joystick, profile.joystick_axis[AXIS_DOWN].id)
};
if axis_position.unsigned_abs() > deadzone
if axis_position.saturating_abs() > deadzone
&& axis_position as isize * profile.joystick_axis[AXIS_DOWN].axis as isize > 0
{
y = (axis_position.unsigned_abs() - deadzone) as f64 * MAX_AXIS_VALUE
/ (i16::MAX as u16 - deadzone) as f64;
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();
}
}
@ -102,11 +102,11 @@ fn set_axis_from_joystick(
let axis_position = unsafe {
sdl3_sys::joystick::SDL_GetJoystickAxis(joystick, profile.joystick_axis[AXIS_UP].id)
};
if axis_position.unsigned_abs() > deadzone
if axis_position.saturating_abs() > deadzone
&& axis_position as isize * profile.joystick_axis[AXIS_UP].axis as isize > 0
{
y = (axis_position.unsigned_abs() - deadzone) as f64 * MAX_AXIS_VALUE
/ (i16::MAX as u16 - deadzone) as f64;
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();
}
}
@ -149,7 +149,7 @@ 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: u16,
deadzone: i16,
) -> (f64, f64) {
let mut x = 0.0;
let mut y = 0.0;
@ -160,11 +160,11 @@ fn set_axis_from_controller(
get_axis_from_i32(profile.controller_axis[AXIS_LEFT].id),
)
};
if axis_position.unsigned_abs() > deadzone
if axis_position.saturating_abs() > deadzone
&& axis_position as isize * profile.controller_axis[AXIS_LEFT].axis as isize > 0
{
x = (axis_position.unsigned_abs() - deadzone) as f64 * MAX_AXIS_VALUE
/ (i16::MAX as u16 - deadzone) as f64;
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;
}
}
@ -175,11 +175,11 @@ fn set_axis_from_controller(
get_axis_from_i32(profile.controller_axis[AXIS_RIGHT].id),
)
};
if axis_position.unsigned_abs() > deadzone
if axis_position.saturating_abs() > deadzone
&& axis_position as isize * profile.controller_axis[AXIS_RIGHT].axis as isize > 0
{
x = (axis_position.unsigned_abs() - deadzone) as f64 * MAX_AXIS_VALUE
/ (i16::MAX as u16 - deadzone) as f64;
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;
}
}
@ -190,11 +190,11 @@ fn set_axis_from_controller(
get_axis_from_i32(profile.controller_axis[AXIS_DOWN].id),
)
};
if axis_position.unsigned_abs() > deadzone
if axis_position.saturating_abs() > deadzone
&& axis_position as isize * profile.controller_axis[AXIS_DOWN].axis as isize > 0
{
y = (axis_position.unsigned_abs() - deadzone) as f64 * MAX_AXIS_VALUE
/ (i16::MAX as u16 - deadzone) as f64;
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();
}
}
@ -205,11 +205,11 @@ fn set_axis_from_controller(
get_axis_from_i32(profile.controller_axis[AXIS_UP].id),
)
};
if axis_position.unsigned_abs() > deadzone
if axis_position.saturating_abs() > deadzone
&& axis_position as isize * profile.controller_axis[AXIS_UP].axis as isize > 0
{
y = (axis_position.unsigned_abs() - deadzone) as f64 * MAX_AXIS_VALUE
/ (i16::MAX as u16 - deadzone) as f64;
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();
}
}
@ -444,7 +444,7 @@ 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 u16;
let deadzone = (i16::MAX as i32 * profile.deadzone / 100) as i16;
if !controller.is_null() {
(x, y) = set_axis_from_controller(profile, controller, deadzone)
} else if !joystick.is_null() {