pub mod painter;
pub use painter::*;
use sdl2::render::{Canvas, RenderTarget};
use sdl2::surface::{Surface, SurfaceContext};
use sdl2::video::{Window, WindowContext};
pub struct EguiCanvas<C = WindowContext> {
run_output: crate::EguiRunOutput,
pub ctx: egui::Context,
pub state: crate::State,
pub painter: Painter<C>,
}
impl EguiCanvas<WindowContext> {
pub fn new(canvas: &Canvas<Window>) -> Self {
Self::assemble(canvas.window(), Painter::new(canvas))
}
#[inline]
pub fn on_event(
&mut self,
canvas: &Canvas<Window>,
event: &sdl2::event::Event,
) -> crate::EventResponse {
self.state.on_event(canvas.window(), event)
}
}
impl<'s> EguiCanvas<SurfaceContext<'s>> {
pub fn for_surface(window: &Window, canvas: &Canvas<Surface<'s>>) -> Self {
Self::assemble(window, Painter::for_surface(canvas))
}
}
impl<C> EguiCanvas<C> {
fn assemble(window: &Window, painter: Painter<C>) -> Self {
let ctx = egui::Context::default();
let mut state = crate::State::new(window, ctx.clone(), egui::ViewportId::ROOT);
state.set_max_texture_side(painter.max_texture_side());
Self {
ctx,
painter,
state,
run_output: crate::EguiRunOutput::default(),
}
}
#[inline]
pub fn on_window_event(
&mut self,
window: &Window,
event: &sdl2::event::Event,
) -> crate::EventResponse {
self.state.on_event(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);
}
#[inline]
pub fn run_ui(&mut self, run_ui: impl FnMut(&mut egui::Ui)) {
self.run_output
.update_ui(&self.ctx, &mut self.state, run_ui);
}
#[inline]
pub fn repaint_delay(&self) -> std::time::Duration {
self.run_output.repaint_delay
}
pub fn paint<T: RenderTarget<Context = C>>(&mut self, canvas: &mut Canvas<T>) {
let pixels_per_point = self.run_output.pixels_per_point;
let (mut textures_delta, shapes) = self.run_output.take();
let clipped_primitives = self.ctx.tessellate(shapes, pixels_per_point);
if let Err(e) = self.painter.paint_and_update_textures(
canvas,
pixels_per_point,
&mut textures_delta,
clipped_primitives,
) {
log::error!("Failed to paint: {e}");
}
}
pub fn destroy(&mut self) {
self.painter.destroy();
}
}