use std::collections::HashSet;
use winit::event::MouseButton;
use winit::keyboard::KeyCode;
use crate::math::Vec2;
#[derive(Debug, Clone)]
pub struct InputState {
pub(crate) keys_down: HashSet<KeyCode>,
pub(crate) keys_pressed_this_frame: HashSet<KeyCode>,
pub(crate) keys_released_this_frame: HashSet<KeyCode>,
pub(crate) mouse_position: Vec2,
pub(crate) mouse_delta: Vec2,
pub(crate) mouse_buttons_down: HashSet<MouseButton>,
pub(crate) mouse_buttons_pressed_this_frame: HashSet<MouseButton>,
pub(crate) mouse_buttons_released_this_frame: HashSet<MouseButton>,
pub(crate) mouse_wheel_delta: f32,
}
impl InputState {
pub(crate) fn new() -> Self {
Self {
keys_down: HashSet::new(),
keys_pressed_this_frame: HashSet::new(),
keys_released_this_frame: HashSet::new(),
mouse_position: Vec2::zero(),
mouse_delta: Vec2::zero(),
mouse_buttons_down: HashSet::new(),
mouse_buttons_pressed_this_frame: HashSet::new(),
mouse_buttons_released_this_frame: HashSet::new(),
mouse_wheel_delta: 0.0,
}
}
pub fn is_key_down(&self, key: KeyCode) -> bool {
self.keys_down.contains(&key)
}
pub fn is_key_just_pressed(&self, key: KeyCode) -> bool {
self.keys_pressed_this_frame.contains(&key)
}
pub fn is_key_just_released(&self, key: KeyCode) -> bool {
self.keys_released_this_frame.contains(&key)
}
pub fn mouse_position(&self) -> Vec2 {
self.mouse_position
}
pub fn mouse_delta(&self) -> Vec2 {
self.mouse_delta
}
pub fn is_mouse_button_down(&self, button: MouseButton) -> bool {
self.mouse_buttons_down.contains(&button)
}
pub fn is_mouse_button_just_pressed(&self, button: MouseButton) -> bool {
self.mouse_buttons_pressed_this_frame.contains(&button)
}
pub fn is_mouse_button_just_released(&self, button: MouseButton) -> bool {
self.mouse_buttons_released_this_frame.contains(&button)
}
pub fn mouse_wheel_delta(&self) -> f32 {
self.mouse_wheel_delta
}
pub(crate) fn begin_frame(&mut self) {
self.keys_pressed_this_frame.clear();
self.keys_released_this_frame.clear();
self.mouse_buttons_pressed_this_frame.clear();
self.mouse_buttons_released_this_frame.clear();
}
pub(crate) fn end_frame(&mut self) {
self.mouse_delta = Vec2::zero();
self.mouse_wheel_delta = 0.0;
}
}
impl Default for InputState {
fn default() -> Self {
Self::new()
}
}