use std::time::Instant; use super::state::State; use winit::{ event::*, event_loop::{ControlFlow, EventLoop}, window::WindowBuilder, }; pub async fn run() { let event_loop = EventLoop::new(); let window = WindowBuilder::new().build(&event_loop).unwrap(); let mut state = State::new(&window).await; let mut last_render = Instant::now(); // Event loop event_loop.run(move |event, _, control_flow| { match event { Event::DeviceEvent { ref event, .. } => { state.input(None, Some(event)); } Event::WindowEvent { ref event, window_id, } if window_id == window.id() => { if !state.input(Some(event), None) { match event { WindowEvent::CloseRequested | WindowEvent::KeyboardInput { input: KeyboardInput { state: ElementState::Pressed, virtual_keycode: Some(VirtualKeyCode::Escape), .. }, .. } => *control_flow = ControlFlow::Exit, WindowEvent::Resized(physical_size) => { state.resize(*physical_size); } WindowEvent::ScaleFactorChanged { new_inner_size, .. } => { state.resize(**new_inner_size); } WindowEvent::Focused(focused) => { // window.set_cursor_grab(*focused).unwrap(); window.set_cursor_visible(!*focused); window.set_decorations(!*focused); } _ => {} } } } Event::RedrawRequested(window_id) if window_id == window.id() => { let now = Instant::now(); let dt = now - last_render; last_render = now; state.update(dt); match state.render() { Ok(_) => {} // Reconfigure the surface if lost Err(wgpu::SurfaceError::Lost) => state.resize(state.size), // The system is out of memory, we should probably quit Err(wgpu::SurfaceError::OutOfMemory) => *control_flow = ControlFlow::Exit, // All other errors (Outdated, Timeout) should be resolved by the next frame Err(e) => eprintln!("{:?}", e), } } Event::MainEventsCleared => { // RedrawRequested will only trigger once, unless we manually // request it. window.request_redraw(); } _ => {} } }); }