use std::num::NonZeroU32;
pub mod painter;
pub use painter::*;
pub struct EguiWgpu {
run_output: crate::EguiRunOutput,
viewport_id: egui::ViewportId,
pub ctx: egui::Context,
pub state: crate::State,
pub painter: painter::Painter,
pub window: sdl2::video::Window,
}
impl EguiWgpu {
pub async fn new(window: sdl2::video::Window) -> Self {
let ctx = egui::Context::default();
let viewport_id = egui::ViewportId::ROOT;
let state = crate::State::new(&window, ctx.clone(), viewport_id);
let run_output = crate::EguiRunOutput::default();
let config = egui_wgpu::WgpuConfiguration::default();
let mut painter = painter::Painter::new(ctx.clone(), config, 1, None, true, false).await;
unsafe {
painter.set_window(viewport_id, &window).await.unwrap();
}
Self {
window,
ctx,
painter,
state,
run_output,
viewport_id,
}
}
#[inline]
pub fn on_event(&mut self, event: &sdl2::event::Event) -> crate::EventResponse {
match event {
sdl2::event::Event::Window {
window_id,
win_event:
sdl2::event::WindowEvent::Resized(w, h)
| sdl2::event::WindowEvent::SizeChanged(w, h),
..
} if *window_id == self.window.id() && *w > 0 && *h > 0 => {
let w = NonZeroU32::new(*w as u32).unwrap();
let h = NonZeroU32::new(*h as u32).unwrap();
self.painter.on_window_resized(self.viewport_id, w, h);
}
_ => {}
}
self.state.on_event(&self.window, event)
}
#[inline]
pub fn run(&mut self, run_ui: impl FnMut(&egui::Context)) {
self.run_output.update(&self.ctx, &mut self.state, run_ui);
}
pub fn paint(&mut self, clear_color: [f32; 4]) {
let pixels_per_point = self.run_output.pixels_per_point;
let (textures_delta, shapes) = self.run_output.take();
let clipped_primitives = self.ctx.tessellate(shapes, pixels_per_point);
self.painter.paint_and_update_textures(
self.viewport_id,
pixels_per_point,
clear_color,
&clipped_primitives,
&textures_delta,
Vec::with_capacity(0),
);
}
}