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