engvis-renderer 0.1.0

GPU rendering for engineering visualization
Documentation
use winit::event::{ElementState, MouseButton, MouseScrollDelta, WindowEvent};
use winit::event_loop::ActiveEventLoop;

use engvis_core::{InputState, OrbitCamera};

pub struct EventContext<'a> {
    pub input: &'a mut InputState,
    pub camera: &'a mut OrbitCamera,
    pub window_width: u32,
    pub window_height: u32,
}

pub enum EventResult {
    Consumed,
    NotConsumed,
    Exit,
}

pub fn handle_window_event(
    event_loop: &ActiveEventLoop,
    event: &WindowEvent,
    ctx: &mut EventContext,
) -> EventResult {
    match event {
        WindowEvent::CloseRequested => {
            event_loop.exit();
            EventResult::Exit
        }
        WindowEvent::Resized(size) => {
            ctx.window_width = size.width;
            ctx.window_height = size.height;
            EventResult::Consumed
        }
        WindowEvent::MouseWheel { delta, .. } => {
            let scroll = match delta {
                MouseScrollDelta::LineDelta(_, y) => *y,
                MouseScrollDelta::PixelDelta(pos) => pos.y as f32 * 0.01,
            };
            ctx.input.scroll_delta += scroll;
            EventResult::Consumed
        }
        WindowEvent::MouseInput { button, state, .. } => {
            match (button, state) {
                (MouseButton::Left, ElementState::Pressed) => ctx.input.left_mouse_down = true,
                (MouseButton::Left, ElementState::Released) => ctx.input.left_mouse_down = false,
                (MouseButton::Right, ElementState::Pressed) => ctx.input.right_mouse_down = true,
                (MouseButton::Right, ElementState::Released) => ctx.input.right_mouse_down = false,
                (MouseButton::Middle, ElementState::Pressed) => ctx.input.middle_mouse_down = true,
                (MouseButton::Middle, ElementState::Released) => {
                    ctx.input.middle_mouse_down = false
                }
                _ => {}
            }
            EventResult::Consumed
        }
        WindowEvent::CursorMoved { position, .. } => {
            ctx.input.cursor_x = position.x;
            ctx.input.cursor_y = position.y;
            EventResult::NotConsumed
        }
        _ => EventResult::NotConsumed,
    }
}