Skip to main content

engvis_renderer/
event.rs

1use winit::event::{ElementState, MouseButton, MouseScrollDelta, WindowEvent};
2use winit::event_loop::ActiveEventLoop;
3
4use engvis_core::{InputState, OrbitCamera};
5
6pub struct EventContext<'a> {
7    pub input: &'a mut InputState,
8    pub camera: &'a mut OrbitCamera,
9    pub window_width: u32,
10    pub window_height: u32,
11}
12
13pub enum EventResult {
14    Consumed,
15    NotConsumed,
16    Exit,
17}
18
19pub fn handle_window_event(
20    event_loop: &ActiveEventLoop,
21    event: &WindowEvent,
22    ctx: &mut EventContext,
23) -> EventResult {
24    match event {
25        WindowEvent::CloseRequested => {
26            event_loop.exit();
27            EventResult::Exit
28        }
29        WindowEvent::Resized(size) => {
30            ctx.window_width = size.width;
31            ctx.window_height = size.height;
32            EventResult::Consumed
33        }
34        WindowEvent::MouseWheel { delta, .. } => {
35            let scroll = match delta {
36                MouseScrollDelta::LineDelta(_, y) => *y,
37                MouseScrollDelta::PixelDelta(pos) => pos.y as f32 * 0.01,
38            };
39            ctx.input.scroll_delta += scroll;
40            EventResult::Consumed
41        }
42        WindowEvent::MouseInput { button, state, .. } => {
43            match (button, state) {
44                (MouseButton::Left, ElementState::Pressed) => ctx.input.left_mouse_down = true,
45                (MouseButton::Left, ElementState::Released) => ctx.input.left_mouse_down = false,
46                (MouseButton::Right, ElementState::Pressed) => ctx.input.right_mouse_down = true,
47                (MouseButton::Right, ElementState::Released) => ctx.input.right_mouse_down = false,
48                (MouseButton::Middle, ElementState::Pressed) => ctx.input.middle_mouse_down = true,
49                (MouseButton::Middle, ElementState::Released) => {
50                    ctx.input.middle_mouse_down = false
51                }
52                _ => {}
53            }
54            EventResult::Consumed
55        }
56        WindowEvent::CursorMoved { position, .. } => {
57            ctx.input.cursor_x = position.x;
58            ctx.input.cursor_y = position.y;
59            EventResult::NotConsumed
60        }
61        _ => EventResult::NotConsumed,
62    }
63}