notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

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 }