pub struct EguiGlow {
run_output: crate::EguiRunOutput,
pub ctx: egui::Context,
pub state: crate::State,
pub painter: egui_glow::Painter,
}
impl EguiGlow {
pub fn new(
window: &sdl2::video::Window,
glow_ctx: std::sync::Arc<glow::Context>,
shader_version: Option<egui_glow::ShaderVersion>,
dithering: bool,
) -> Self {
let painter = egui_glow::Painter::new(glow_ctx, "", shader_version, dithering)
.map_err(|err| {
log::error!("error occurred in initializing painter:\n{err}");
})
.unwrap();
let ctx = egui::Context::default();
let state = crate::State::new(window, ctx.clone(), egui::ViewportId::ROOT);
let run_output = crate::EguiRunOutput::default();
Self {
painter,
run_output,
state,
ctx,
}
}
#[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) {
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);
let screen_size = self.state.get_window_size();
self.painter.paint_and_update_textures(
screen_size.into(),
pixels_per_point,
&clipped_primitives,
&textures_delta,
);
}
#[inline]
pub fn clear(&self, color: [f32; 4]) {
let size = self.state.get_window_size();
self.painter.clear(size.into(), color);
}
pub fn destroy(&mut self) {
self.painter.destroy();
}
}