use crate::error::Result;
use crate::raw_input::common::{RawInputData, RawInputProvider};
use crate::state::advanced::AdvancedInputState;
pub struct InputSystemManager {
raw_input_provider: Box<dyn RawInputProvider>,
input_state: AdvancedInputState,
}
impl InputSystemManager {
pub fn new(raw_input_provider: Box<dyn RawInputProvider>) -> Result<Self> {
let mut provider = raw_input_provider;
provider.initialize()?;
Ok(Self {
raw_input_provider: provider,
input_state: AdvancedInputState::new(),
})
}
pub fn poll_and_update(&mut self, frame: u32) -> Result<()> {
while let Some(raw_data) = self.raw_input_provider.poll()? {
self.feed_raw_input(&raw_data, frame);
}
Ok(())
}
fn feed_raw_input(&mut self, raw_data: &RawInputData, frame: u32) {
let timestamp = self.input_state.time;
for (key, &is_pressed) in &raw_data.keys {
if is_pressed {
self.input_state.keyboard.press(*key, timestamp, frame);
} else {
self.input_state.keyboard.release(*key, frame);
}
}
for (button, &is_pressed) in &raw_data.mouse_buttons {
if is_pressed {
self.input_state.mouse.button_press(*button, frame);
} else {
self.input_state.mouse.button_release(*button, frame);
}
}
let (dx, dy) = raw_data.mouse_delta;
self.input_state.mouse.move_rel(dx as f32, dy as f32);
}
pub fn end_frame(&mut self, delta_time_ms: f32) {
self.input_state.end_frame(delta_time_ms);
}
pub fn state(&self) -> &AdvancedInputState {
&self.input_state
}
pub fn state_mut(&mut self) -> &mut AdvancedInputState {
&mut self.input_state
}
pub fn shutdown(mut self) -> Result<()> {
self.raw_input_provider.shutdown()
}
}
pub struct ReactionPlugin;
impl ReactionPlugin {
}