use std::collections::HashMap;
use cgmath::Point2;
use winit::{event::MouseButton, keyboard::KeyCode};
use crate::inputs::winit_input::EngineInput;
pub mod winit_input;
#[derive(Default)]
pub struct Inputs {
raw_inputs: Vec<EngineInput>,
mouse_position: Option<Point2<f32>>,
mouse_scroll_delta: Option<Point2<f32>>,
key_codes: HashMap<KeyCode, bool>,
keys_just_pressed: Vec<KeyCode>,
keys_just_released: Vec<KeyCode>,
mouse_buttons: HashMap<MouseButton, bool>,
mouse_buttons_just_pressed: Vec<MouseButton>,
mouse_buttons_just_released: Vec<MouseButton>
}
impl Inputs {
pub fn new() -> Self { Self::default() }
pub fn handle_input(&mut self, input: EngineInput) {
match input {
EngineInput::MouseMove(position) => { self.mouse_position = Some(position); },
EngineInput::MouseButton(button, state) => {
match state {
winit::event::ElementState::Pressed => {
self.mouse_buttons.insert(button, true);
self.mouse_buttons_just_pressed.push(button);
},
winit::event::ElementState::Released => {
self.mouse_buttons.insert(button, false);
self.mouse_buttons_just_released.push(button);
}
}
},
EngineInput::MouseWheel(delta) => {
let delta = match delta {
winit::event::MouseScrollDelta::LineDelta(x, y) => Point2 { x: x * 12.0, y: y * 12.0 },
winit::event::MouseScrollDelta::PixelDelta(position) => Point2 { x: position.x as f32, y: position.y as f32 }
};
self.mouse_scroll_delta = Some(delta);
},
EngineInput::KeyInput(key, state) => {
match state {
winit::event::ElementState::Pressed => {
self.key_codes.insert(key, true);
self.keys_just_pressed.push(key);
},
winit::event::ElementState::Released => {
self.key_codes.insert(key, false);
self.keys_just_released.push(key);
}
}
},
};
self.raw_inputs.push(input);
}
pub fn reset(&mut self) {
self.mouse_scroll_delta = None;
self.raw_inputs.clear();
self.mouse_buttons_just_pressed.clear();
self.mouse_buttons_just_released.clear();
self.keys_just_pressed.clear();
self.keys_just_released.clear();
}
pub fn raw_inputs(&self) -> &Vec<EngineInput> { &self.raw_inputs }
pub fn mouse_buttons_pressed(&self) -> Vec<&MouseButton> { self.mouse_buttons.iter().filter(|a| *a.1).map(|a| a.0).collect() }
pub fn mouse_buttons_just_pressed(&self) -> &Vec<MouseButton> { &self.mouse_buttons_just_pressed }
pub fn mouse_buttons_just_released(&self) -> &Vec<MouseButton> { &self.mouse_buttons_just_released }
pub fn keys_pressed(&self) -> Vec<&KeyCode> { self.key_codes.iter().filter(|a| *a.1).map(|a| a.0).collect() }
pub fn keys_just_pressed(&self) -> &Vec<KeyCode> { &self.keys_just_pressed }
pub fn keys_just_released(&self) -> &Vec<KeyCode> { &self.keys_just_released }
pub fn mouse_position(&self) -> Option<&Point2<f32>> { self.mouse_position.as_ref() }
pub fn mouse_scroll_delta(&self) -> &Point2<f32> { self.mouse_scroll_delta.as_ref().unwrap_or(&Point2 { x: 0.0, y: 0.0 }) }
pub fn is_key_down(&self, key: &KeyCode) -> bool { *self.key_codes.get(key).unwrap_or(&false) }
pub fn is_mouse_button_down(&self, button: &MouseButton) -> bool { *self.mouse_buttons.get(button).unwrap_or(&false) }
pub fn key_just_pressed(&self, key: &KeyCode) -> bool { self.keys_just_pressed.contains(key) }
pub fn key_just_released(&self, key: &KeyCode) -> bool { self.keys_just_released.contains(key) }
pub fn mouse_button_just_pressed(&self, button: &MouseButton) -> bool { self.mouse_buttons_just_pressed.contains(button) }
pub fn mouse_button_just_released(&self, button: &MouseButton) -> bool { self.mouse_buttons_just_released.contains(button) }
}