This repository has been archived on 2026-08-27. You can view files and clone it, but cannot push or open issues or pull requests.
gopher64-netplay/src/ui/input.rs
Logan McNaughton 2e4a23c315 Initial Commit
2023-10-04 14:33:17 -06:00

57 lines
2.6 KiB
Rust

use crate::ui;
pub const MAX_AXIS_VALUE: f64 = 85.0;
pub fn bound_axis(x: &mut f64, y: &mut f64) {
let radius = 95.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));
// If the distance is greater than the radius, scale the coordinates
if distance > radius {
let scale_factor = radius / distance;
*x *= scale_factor;
*y *= scale_factor;
}
}
pub fn get(ui: &mut ui::Ui, _channel: usize) -> u32 {
let context = ui.sdl_context.as_mut().unwrap();
let events = context.event_pump().unwrap();
let keyboard_state = events.keyboard_state();
let mut keys = 0;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::D) as u32) << 0;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::A) as u32) << 1;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::S) as u32) << 2;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::W) as u32) << 3;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::Return) as u32) << 4;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::Z) as u32) << 5;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::LCtrl) as u32) << 6;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::LShift) as u32) << 7;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::L) as u32) << 8;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::J) as u32) << 9;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::K) as u32) << 10;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::I) as u32) << 11;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::C) as u32) << 12;
keys |= (keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::X) as u32) << 13;
let mut x: f64 = 0.0;
let mut y: f64 = 0.0;
if keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::Left) {
x = -MAX_AXIS_VALUE
} else if keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::Right) {
x = MAX_AXIS_VALUE
}
if keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::Down) {
y = -MAX_AXIS_VALUE
} else if keyboard_state.is_scancode_pressed(sdl2::keyboard::Scancode::Up) {
y = MAX_AXIS_VALUE
}
bound_axis(&mut x, &mut y);
keys |= (x.round() as i8 as u32) << 16;
keys |= (y.round() as i8 as u32) << 24;
return keys;
}