cleanup deadzone code (#558)
This commit is contained in:
parent
c52b680753
commit
cccb079d63
@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user