use std::sync::Arc;
use winit::window::Window;
pub struct EguiIntegration {
pub ctx: egui::Context,
state: egui_winit::State,
renderer: egui_wgpu::Renderer,
}
pub struct EguiFrameOutput {
pub paint_jobs: Vec<egui::ClippedPrimitive>,
pub textures_delta: egui::TexturesDelta,
}
impl EguiIntegration {
pub fn new(
device: &wgpu::Device,
output_format: wgpu::TextureFormat,
window: &Arc<Window>,
) -> Self {
let ctx = egui::Context::default();
let mut visuals = egui::Visuals::dark();
visuals.window_shadow = egui::Shadow::NONE;
visuals.popup_shadow = egui::Shadow::NONE;
ctx.set_style(egui::Style {
visuals,
..Default::default()
});
let state = egui_winit::State::new(
ctx.clone(),
egui::ViewportId::ROOT,
window.as_ref(),
Some(window.scale_factor() as f32),
None,
None,
);
let renderer = egui_wgpu::Renderer::new(
device,
output_format,
None, 1, false, );
Self { ctx, state, renderer }
}
pub fn on_window_event(
&mut self,
window: &Window,
event: &winit::event::WindowEvent,
) -> bool {
let response = self.state.on_window_event(window, event);
response.consumed
}
pub fn begin_frame(&mut self, window: &Window) {
let raw_input = self.state.take_egui_input(window);
self.ctx.begin_pass(raw_input);
}
pub fn end_frame(&mut self, window: &Window) -> EguiFrameOutput {
let full_output = self.ctx.end_pass();
self.state.handle_platform_output(window, full_output.platform_output);
let paint_jobs = self.ctx.tessellate(full_output.shapes, full_output.pixels_per_point);
EguiFrameOutput {
paint_jobs,
textures_delta: full_output.textures_delta,
}
}
pub fn prepare(
&mut self,
device: &wgpu::Device,
queue: &wgpu::Queue,
encoder: &mut wgpu::CommandEncoder,
output: &EguiFrameOutput,
screen_descriptor: &egui_wgpu::ScreenDescriptor,
) {
for (id, image_delta) in &output.textures_delta.set {
self.renderer.update_texture(device, queue, *id, image_delta);
}
self.renderer.update_buffers(
device,
queue,
encoder,
&output.paint_jobs,
screen_descriptor,
);
}
pub fn renderer(&self) -> &egui_wgpu::Renderer {
&self.renderer
}
pub fn cleanup(&mut self, output: &EguiFrameOutput) {
for id in &output.textures_delta.free {
self.renderer.free_texture(id);
}
}
}