tx2_core/
app.rs

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}