use render_engine::{RenderEngine, RenderEngineInput};
use log::warn;
use winit::{window::WindowBuilder, event_loop::{EventLoop, ControlFlow}, event::{Event, WindowEvent}};
pub mod files;
pub mod pipelines;
pub mod primitives;
pub mod textures;
pub mod render_engine;
pub mod resources;
#[rustfmt::skip]
pub const OPENGL_TO_WGPU_MATRIX: cgmath::Matrix4<f32> = cgmath::Matrix4::new(
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 0.5, 0.5,
0.0, 0.0, 0.0, 1.0,
);
pub trait RenderEngineApp {
fn create(engine: &mut RenderEngine) -> Self;
fn input(&mut self, engine: &mut RenderEngine, input: RenderEngineInput);
fn update(&mut self, engine: &mut RenderEngine);
fn render(&mut self, engine: &mut RenderEngine, view: &wgpu::TextureView, encoder: &mut wgpu::CommandEncoder);
fn exit(&mut self, engine: &mut RenderEngine);
}
pub async fn run_app<T: RenderEngineApp + 'static>() {
env_logger::init();
let event_loop = EventLoop::new();
let window = WindowBuilder::new().build(&event_loop).unwrap();
let mut engine = RenderEngine::new(window).await;
let mut app = Box::new(T::create(&mut engine));
event_loop.run(move |event, _, flow| {
match event {
Event::WindowEvent { window_id, ref event } => {
if window_id != engine.window.id() { return }
if engine.input(&mut app, event) { return }
match event {
WindowEvent::CloseRequested => *flow = ControlFlow::Exit,
WindowEvent::Resized(size) => engine.resize(*size),
WindowEvent::ScaleFactorChanged { new_inner_size, .. } => engine.resize(**new_inner_size),
_ => {}
}
},
Event::MainEventsCleared => engine.window().request_redraw(),
Event::RedrawRequested(window_id) => {
if window_id != engine.window.id() { return }
app.update(&mut engine);
match engine.render(&mut app) {
Ok(_) => {}
Err(wgpu::SurfaceError::Lost) => engine.resize(engine.size),
Err(wgpu::SurfaceError::OutOfMemory) => *flow = ControlFlow::Exit,
Err(e) => eprintln!("{:?}", e),
}
},
Event::LoopDestroyed => app.exit(&mut engine),
_ => warn!("Unhandled global event {:?}", event)
}
})
}