1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
use std::time::{Duration, Instant}; use anyhow::Result; use winit::dpi::LogicalSize; use winit::event::Event; use winit::event_loop::{ControlFlow, EventLoop}; use winit::window::WindowBuilder; use super::{Handler, Settings, Sketch}; use crate::render::Graphics; pub fn run<H: 'static + Handler>(settings: Settings) -> Result<()> { wgpu_subscriber::initialize_default_subscriber(None); let mut builder = WindowBuilder::new() .with_inner_size(LogicalSize::new(settings.size.width, settings.size.height)) .with_decorations(settings.decorations); if let Some(title) = settings.title { builder = builder.with_title(title); } let event_loop = EventLoop::new(); let window = builder.build(&event_loop)?; let mut sketch = Sketch::new(window, settings); let mut handler = H::setup(&mut sketch); let mut last_draw_time = Instant::now(); let mut frame_delay = Duration::default(); event_loop.run(move |event, _, control_flow| { match event { Event::MainEventsCleared => { if sketch.framerate_dirty { if let Some(fps) = sketch.framerate { frame_delay = Duration::from_secs(1) / fps; } sketch.framerate_dirty = false; } let delta = last_draw_time.elapsed(); let draw = match sketch.framerate { Some(_) => delta >= frame_delay, None => true, }; if draw { sketch.window.request_redraw(); } }, Event::RedrawRequested(..) => { let mut gfx = Graphics::new(sketch.get_clear_color()); handler.draw(&mut sketch, &mut gfx); sketch.renderer.render(gfx).unwrap(); last_draw_time = Instant::now(); }, Event::LoopDestroyed => { handler.quit(); }, Event::WindowEvent { event, .. } => sketch.handle_event(&mut handler, event), _ => {}, } if sketch.has_stopped() { *control_flow = ControlFlow::Exit; } }) }