egui.rs (2024B)
1 use std::sync::Arc; 2 use std::sync::Mutex; 3 4 use crate::Renderer; 5 6 #[derive(Clone)] 7 pub struct EguiRenderer { 8 pub renderer: Arc<Mutex<Renderer>>, 9 } 10 11 /// Marker type for the egui paint callback that renders the full scene. 12 #[derive(Copy, Clone)] 13 pub struct SceneRender; 14 15 #[cfg(feature = "egui")] 16 impl EguiRenderer { 17 pub fn new(rs: &egui_wgpu::RenderState, size: (u32, u32)) -> Self { 18 let renderer = Renderer::new(&rs.device, &rs.queue, rs.target_format, size); 19 let egui_renderer = Self { 20 renderer: Arc::new(Mutex::new(renderer)), 21 }; 22 23 rs.renderer 24 .write() 25 .callback_resources 26 .insert(egui_renderer.clone()); 27 28 egui_renderer 29 } 30 } 31 32 #[cfg(feature = "egui")] 33 impl egui_wgpu::CallbackTrait for SceneRender { 34 fn prepare( 35 &self, 36 device: &wgpu::Device, 37 queue: &wgpu::Queue, 38 _screen_descriptor: &egui_wgpu::ScreenDescriptor, 39 _egui_encoder: &mut wgpu::CommandEncoder, 40 resources: &mut egui_wgpu::CallbackResources, 41 ) -> Vec<wgpu::CommandBuffer> { 42 let egui_renderer: &EguiRenderer = resources.get().unwrap(); 43 44 let mut renderer = egui_renderer.renderer.lock().unwrap(); 45 46 renderer.resize(device); 47 renderer.update(); 48 renderer.prepare(queue); 49 50 // Render shadow depth pass into a separate command buffer 51 // that executes before the main egui render pass. 52 let mut encoder = 53 device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); 54 renderer.render_shadow(&mut encoder); 55 56 vec![encoder.finish()] 57 } 58 59 fn paint( 60 &self, 61 _info: egui::PaintCallbackInfo, 62 render_pass: &mut wgpu::RenderPass<'_>, 63 resources: &egui_wgpu::CallbackResources, 64 ) { 65 let egui_renderer: &EguiRenderer = resources.get().unwrap(); 66 67 egui_renderer 68 .renderer 69 .lock() 70 .unwrap() 71 .render_pass(render_pass) 72 } 73 }