cleanup deadzone code (#558)

This commit is contained in:
Logan McNaughton 2025-08-24 00:05:03 +02:00 committed by GitHub
parent c52b680753
commit cccb079d63
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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);