use egui::{Context, epaint::Primitive}; use wgpu::{Buffer, BufferDescriptor, BufferUsages, Device, Queue}; pub struct UiRenderer { ctx: Context, } impl UiRenderer { pub fn new(device: &Device) -> Self { let index = device.create_buffer(&BufferDescriptor { label: None, size: 1, usage: BufferUsages::INDEX | BufferUsages::COPY_DST, mapped_at_creation: false, }); let vertex = device.create_buffer(&BufferDescriptor { label: None, size: 1, usage: BufferUsages::VERTEX | BufferUsages::COPY_DST, mapped_at_creation: false, }); Self { ctx: Context::default(), index, vertex, } } pub fn draw(&self, queue: &Queue) { let raw_input = egui::RawInput::default(); let full_output = self.ctx.run(raw_input, |ctx| { egui::CentralPanel::default().show(&ctx, |ui| { ui.label("Hello world!"); if ui.button("Click me").clicked() { // take some action here } }); }); // handle_platform_output(full_output.platform_output); let clipped_primitives = self .ctx .tessellate(full_output.shapes, full_output.pixels_per_point); for p in clipped_primitives { match p.primitive { Primitive::Mesh(mesh) => {} _ => unreachable!(), } } // paint(full_output.textures_delta, clipped_primitives); } }