mod backend;
pub mod builder;
pub mod draw;
pub mod info;
pub mod painter;
pub mod settings;
pub mod vertex;
pub use winit;
use builder::Builder;
use info::Info;
use winit::{
event::*,
event_loop::{ControlFlow, EventLoop},
window::WindowBuilder,
};
use self::{backend::State, painter::Painter};
#[derive(Default)]
pub enum EventResult {
#[default]
Unhandled,
Handled,
Exit,
}
pub trait App {
fn init(&mut self, _builder: &mut Builder) {}
fn render(&mut self, painter: &mut Painter, builder: &mut Builder, info: &Info);
fn event(&mut self, event: &WindowEvent) -> EventResult;
fn update(&mut self, builder: &mut Builder, info: &Info);
fn run(self, settings: settings::RunSettings)
where
Self: Sized + 'static,
{
let event_loop = EventLoop::new();
self.run_with_event_loop(event_loop, settings);
}
fn run_with_event_loop(mut self, event_loop: EventLoop<()>, settings: settings::RunSettings)
where
Self: Sized + 'static,
{
let window = WindowBuilder::new().build(&event_loop).unwrap();
window.set_title(settings.title);
let mut state: State = pollster::block_on(State::new(window, &mut self));
event_loop.run(move |event, _, control_flow| match event {
Event::RedrawRequested(window_id) if window_id == state.window().id() => {
state.update(&mut self);
match state.render(&mut self) {
Ok(_) => {}
Err(wgpu::SurfaceError::Lost) => state.resize(state.size),
Err(wgpu::SurfaceError::OutOfMemory) => *control_flow = ControlFlow::Exit,
Err(e) => eprintln!("{:?}", e),
}
}
Event::MainEventsCleared => {
if !settings.continuous {
control_flow.set_wait();
}
state.window().request_redraw();
}
Event::WindowEvent {
ref event,
window_id,
} if window_id == state.window().id() => match state.event(&mut self, event) {
EventResult::Unhandled => match event {
WindowEvent::CloseRequested => {
*control_flow = ControlFlow::Exit;
}
WindowEvent::Resized(physical_size) => {
state.resize(*physical_size);
}
WindowEvent::ScaleFactorChanged { new_inner_size, .. } => {
state.resize(**new_inner_size);
}
_ => {}
},
EventResult::Handled => {}
EventResult::Exit => *control_flow = ControlFlow::Exit,
},
Event::Resumed => {
state.create_surface();
}
Event::Suspended => {}
_ => {}
});
}
}