diff --git a/src/core/input/virtual_input.rs b/src/core/input/virtual_input.rs index 26ac882..50dcb11 100644 --- a/src/core/input/virtual_input.rs +++ b/src/core/input/virtual_input.rs @@ -1,6 +1,6 @@ use std::{collections::HashMap, sync::Arc}; -use egui_winit_vulkano::egui::mutex::Mutex; +use egui_winit_vulkano::egui::mutex::RwLock; use winit::{ event::{AxisId, ElementState, MouseButton}, keyboard::PhysicalKey, @@ -14,14 +14,14 @@ use super::{ #[derive(Default)] pub struct VirtualInput { // Global states - states: HashMap>>, + states: HashMap>>, // Per kind of input states to keep complexity low during state updates - states_by_key: HashMap>>>, - mouse_move_states: Vec>>, - mouse_wheel_states: Vec>>, - mouse_button_states: HashMap>>>, - axis_states: HashMap>>>, + states_by_key: HashMap>>>, + mouse_move_states: Vec>>, + mouse_wheel_states: Vec>>, + mouse_button_states: HashMap>>>, + axis_states: HashMap>>>, } impl std::fmt::Debug for VirtualInput { @@ -29,7 +29,7 @@ impl std::fmt::Debug for VirtualInput { let mut debug = f.debug_struct("VirtualInput"); for (name, state) in &self.states { - debug.field(name, &state.lock().value); + debug.field(name, &state.read().value); } debug.finish() @@ -40,18 +40,18 @@ impl VirtualInput { pub fn get_state(&self, value_name: &str) -> f32 { self.states .get(value_name) - .map(|state| state.lock().value) + .map(|state| state.read().value) .unwrap_or(0.0) } pub fn add_bindings(&mut self, value_name: String, new_bindings: Vec) { - let state = - self.states - .entry(value_name) - .or_insert(Arc::new(Mutex::new(VirtualInputState { - value: 0.0, - bindings: Vec::new(), - }))); + let state = self + .states + .entry(value_name) + .or_insert(Arc::new(RwLock::new(VirtualInputState { + value: 0.0, + bindings: Vec::new(), + }))); for binding in &new_bindings { match binding { @@ -83,7 +83,7 @@ impl VirtualInput { } state - .lock() + .write() .bindings .extend(new_bindings.iter().map(|b| VirtualBindingState { value: 0.0, @@ -96,7 +96,7 @@ impl VirtualInput { if let Some(states) = states { for state in states { - let mut state = state.lock(); + let mut state = state.write(); state.update_from_key(key, key_state); } } @@ -104,14 +104,14 @@ impl VirtualInput { pub(super) fn update_mouse_move_binding(&mut self, delta: &glam::Vec2) { for state in &mut self.mouse_move_states { - let mut state = state.lock(); + let mut state = state.write(); state.update_from_mouse(delta); } } pub(super) fn update_mouse_wheel_binding(&mut self, delta: &glam::Vec2) { for state in &mut self.mouse_wheel_states { - let mut state = state.lock(); + let mut state = state.write(); state.update_from_mouse_wheel(delta); } } @@ -125,7 +125,7 @@ impl VirtualInput { if let Some(states) = states { for state in states { - let mut state = state.lock(); + let mut state = state.write(); state.update_from_mouse_button(button, button_state); } } @@ -136,7 +136,7 @@ impl VirtualInput { if let Some(states) = states { for state in states { - let mut state = state.lock(); + let mut state = state.write(); state.update_from_axis(axis, axis_state); } }