pub mod prelude;
use int_math::UVec2;
use log::trace;
use std::sync::Arc;
use swamp_render::prelude::{Assets, Gfx};
use swamp_render::Render;
use swamp_wgpu_window::WgpuWindow;
use swamp_window::AppHandler;
use winit::dpi;
use winit::window::Window;
pub trait Application {
fn new(gfx: &mut impl Assets) -> Self;
fn tick(&mut self);
fn render(&mut self, gfx: &mut impl Gfx);
}
pub struct AppInfo<'a, T: Application> {
window: WgpuWindow<'a>,
main_render: Render,
app: T,
}
pub struct App<'a, T: Application> {
app: Option<AppInfo<'a, T>>,
virtual_surface_size: UVec2,
suggested_physical_surface_size: UVec2,
}
impl<'a, T: Application> AppHandler for App<'a, T> {
fn create_window(&mut self, window: Arc<Window>) {
trace!("create window, boot up");
let physical_size = window.inner_size();
let wgpu_window = pollster::block_on(WgpuWindow::new(window)).expect("REASON");
let mut render = Render::new(
Arc::clone(wgpu_window.device()),
Arc::clone(wgpu_window.queue()),
wgpu_window.surface_config().format,
(physical_size.width as u16, physical_size.height as u16).into(),
self.virtual_surface_size,
);
let custom_app = T::new(&mut render);
self.app = Some(AppInfo {
window: wgpu_window,
main_render: render,
app: custom_app,
})
}
fn resized(&mut self, physical_size: dpi::PhysicalSize<u32>) {
trace!("window resized (physical_size: {:?})", physical_size);
if let Some(ref mut info) = self.app {
info.window.resize(physical_size);
info.main_render
.resize((physical_size.width as u16, physical_size.height as u16).into());
}
}
fn min_size(&self) -> (u16, u16) {
(self.virtual_surface_size.x, self.virtual_surface_size.y)
}
fn start_size(&self) -> (u16, u16) {
(
self.suggested_physical_surface_size.x,
self.suggested_physical_surface_size.y,
)
}
fn redraw(&mut self) {
if let Some(ref mut info) = self.app {
info.app.tick(); info.app.render(&mut info.main_render);
info.window
.render(info.main_render.clear_color(), |render_pass, _, _| {
info.main_render.render(render_pass)
})
.expect("TODO: panic message");
}
}
}
impl<'a, T: Application> App<'a, T> {
pub fn run(title: &str, virtual_surface_size: UVec2, suggested_physical_surface_size: UVec2) {
env_logger::init();
let mut app = Self {
app: None,
virtual_surface_size,
suggested_physical_surface_size,
};
let _ = swamp_window::WindowRunner::run_app(&mut app, title);
}
}