use fxhash::{FxHashMap, FxHashSet};
use fyrox_core::algebra::Vector2;
use winit::event::{ButtonId, ElementState};
use winit::keyboard::{KeyCode, PhysicalKey};
#[derive(Default, Clone)]
pub struct Mouse {
pub position: Vector2<f32>,
pub speed: Vector2<f32>,
pub buttons_state: FxHashMap<ButtonId, ElementState>,
pub pressed_buttons: FxHashSet<ButtonId>,
pub released_buttons: FxHashSet<ButtonId>,
}
impl Mouse {
pub const LEFT_BUTTON: ButtonId = 0;
pub const RIGHT_BUTTON: ButtonId = 1;
pub const MIDDLE_BUTTON: ButtonId = 2;
}
#[derive(Default, Clone)]
pub struct Keyboard {
pub keys: FxHashMap<PhysicalKey, ElementState>,
pub pressed_keys: FxHashSet<PhysicalKey>,
pub released_keys: FxHashSet<PhysicalKey>,
}
#[derive(Default, Clone)]
pub struct InputState {
pub mouse: Mouse,
pub keyboard: Keyboard,
}
impl InputState {
#[inline]
pub fn is_key_down(&self, key: KeyCode) -> bool {
self.keyboard
.keys
.get(&PhysicalKey::Code(key))
.is_some_and(|state| *state == ElementState::Pressed)
}
#[inline]
pub fn is_key_pressed(&self, key: KeyCode) -> bool {
self.keyboard.pressed_keys.contains(&PhysicalKey::Code(key))
}
#[inline]
pub fn is_key_released(&self, key: KeyCode) -> bool {
self.keyboard
.released_keys
.contains(&PhysicalKey::Code(key))
}
#[inline]
pub fn is_mouse_button_down(&self, button_id: ButtonId) -> bool {
self.mouse
.buttons_state
.get(&button_id)
.is_some_and(|state| *state == ElementState::Pressed)
}
#[inline]
pub fn is_mouse_button_pressed(&self, button_id: ButtonId) -> bool {
self.mouse.pressed_buttons.contains(&button_id)
}
#[inline]
pub fn is_mouse_button_released(&self, button_id: ButtonId) -> bool {
self.mouse.released_buttons.contains(&button_id)
}
#[inline]
pub fn is_left_mouse_button_down(&self) -> bool {
self.is_mouse_button_down(Mouse::LEFT_BUTTON)
}
#[inline]
pub fn is_right_mouse_button_down(&self) -> bool {
self.is_mouse_button_down(Mouse::RIGHT_BUTTON)
}
#[inline]
pub fn is_middle_mouse_button_down(&self) -> bool {
self.is_mouse_button_down(Mouse::MIDDLE_BUTTON)
}
#[inline]
pub fn is_left_mouse_button_pressed(&self) -> bool {
self.is_mouse_button_pressed(Mouse::LEFT_BUTTON)
}
#[inline]
pub fn is_right_mouse_button_pressed(&self) -> bool {
self.is_mouse_button_pressed(Mouse::RIGHT_BUTTON)
}
#[inline]
pub fn is_middle_mouse_button_pressed(&self) -> bool {
self.is_mouse_button_pressed(Mouse::MIDDLE_BUTTON)
}
#[inline]
pub fn is_left_mouse_button_released(&self) -> bool {
self.is_mouse_button_released(Mouse::LEFT_BUTTON)
}
#[inline]
pub fn is_right_mouse_button_released(&self) -> bool {
self.is_mouse_button_released(Mouse::RIGHT_BUTTON)
}
#[inline]
pub fn is_middle_mouse_button_released(&self) -> bool {
self.is_mouse_button_released(Mouse::MIDDLE_BUTTON)
}
#[inline]
pub fn mouse_speed(&self) -> Vector2<f32> {
self.mouse.speed
}
#[inline]
pub fn mouse_position(&self) -> Vector2<f32> {
self.mouse.position
}
}