tx2-core 0.1.3

High-performance native ECS engine for cross-platform applications and games
Documentation
use winit::{
    event::*,
    event_loop::{ControlFlow, EventLoop},
    window::WindowBuilder,
};
use crate::renderer::Renderer;

pub struct App {
    pub renderer: Renderer,
    event_loop: EventLoop<()>,
    window: winit::window::Window,
}

impl App {
    pub async fn new() -> Self {
        env_logger::init();
        let event_loop = EventLoop::new().unwrap();
        let window = WindowBuilder::new().build(&event_loop).unwrap();

        let renderer = Renderer::new(&window).await;

        Self {
            renderer,
            event_loop,
            window,
        }
    }

    pub fn run(mut self) {
        self.event_loop.run(move |event, elwt| {
            match event {
                Event::WindowEvent {
                    ref event,
                    window_id,
                } if window_id == self.window.id() => match event {
                    WindowEvent::CloseRequested
                    | WindowEvent::KeyboardInput {
                        event:
                            KeyEvent {
                                state: ElementState::Pressed,
                                physical_key: winit::keyboard::PhysicalKey::Code(winit::keyboard::KeyCode::Escape),
                                ..
                            },
                        ..
                    } => elwt.exit(),
                    WindowEvent::Resized(physical_size) => {
                        self.renderer.resize(*physical_size);
                    }
                    WindowEvent::RedrawRequested => {
                        match self.renderer.render() {
                            Ok(_) => {}
                            Err(wgpu::SurfaceError::Lost) => self.renderer.resize(self.renderer.size),
                            Err(wgpu::SurfaceError::OutOfMemory) => elwt.exit(),
                            Err(e) => eprintln!("{:?}", e),
                        }
                    }
                    _ => {}
                },
                Event::AboutToWait => {
                    self.window.request_redraw();
                }
                _ => {}
            }
        }).unwrap();
    }
}