1use winit::{
2 event::*,
3 event_loop::{ControlFlow, EventLoop},
4 window::WindowBuilder,
5};
6use crate::renderer::Renderer;
7
8pub struct App {
9 pub renderer: Renderer,
10 event_loop: EventLoop<()>,
11 window: winit::window::Window,
12}
13
14impl App {
15 pub async fn new() -> Self {
16 env_logger::init();
17 let event_loop = EventLoop::new().unwrap();
18 let window = WindowBuilder::new().build(&event_loop).unwrap();
19
20 let renderer = Renderer::new(&window).await;
21
22 Self {
23 renderer,
24 event_loop,
25 window,
26 }
27 }
28
29 pub fn run(mut self) {
30 self.event_loop.run(move |event, elwt| {
31 match event {
32 Event::WindowEvent {
33 ref event,
34 window_id,
35 } if window_id == self.window.id() => match event {
36 WindowEvent::CloseRequested
37 | WindowEvent::KeyboardInput {
38 event:
39 KeyEvent {
40 state: ElementState::Pressed,
41 physical_key: winit::keyboard::PhysicalKey::Code(winit::keyboard::KeyCode::Escape),
42 ..
43 },
44 ..
45 } => elwt.exit(),
46 WindowEvent::Resized(physical_size) => {
47 self.renderer.resize(*physical_size);
48 }
49 WindowEvent::RedrawRequested => {
50 match self.renderer.render() {
51 Ok(_) => {}
52 Err(wgpu::SurfaceError::Lost) => self.renderer.resize(self.renderer.size),
53 Err(wgpu::SurfaceError::OutOfMemory) => elwt.exit(),
54 Err(e) => eprintln!("{:?}", e),
55 }
56 }
57 _ => {}
58 },
59 Event::AboutToWait => {
60 self.window.request_redraw();
61 }
62 _ => {}
63 }
64 }).unwrap();
65 }
66}