diff --git a/editor/src/main.rs b/editor/src/main.rs index dd60289..b55703c 100644 --- a/editor/src/main.rs +++ b/editor/src/main.rs @@ -113,7 +113,7 @@ impl Application { { puffin::profile_scope!("Main render"); - self.render_state.update_viewport(&mut self.viewport); + self.render_state.update_viewport(&mut self.egui_rp, &mut self.viewport); self.render_state.render(); } diff --git a/editor/src/render.rs b/editor/src/render.rs index 626b779..070dc23 100644 --- a/editor/src/render.rs +++ b/editor/src/render.rs @@ -226,9 +226,32 @@ impl RenderState { } } - pub fn update_viewport(&mut self, viewport: &mut ViewportWidget) { + pub fn update_viewport( + &mut self, + egui_rp: &mut egui_wgpu_backend::RenderPass, + widget: &mut ViewportWidget, + ) { let mut store = self.resources.get_mut::().unwrap(); - store.viewport.camera = viewport.flycam.get_camera(); + let mut viewport = &mut store.viewport; + viewport.camera = widget.flycam.get_camera(); + + if viewport.textures.width != widget.width || viewport.textures.height != widget.height { + viewport.textures = OffscreenTextures::new( + &viewport.device, + widget.width, + widget.height, + viewport.output_format, + ); + + egui_rp + .update_egui_texture_from_wgpu_texture( + &viewport.device, + &viewport.textures.output_view, + wgpu::FilterMode::Nearest, + viewport.egui_texture, + ) + .unwrap(); + } } pub fn render(&mut self) { diff --git a/editor/src/ui.rs b/editor/src/ui.rs index 16d2150..9060412 100644 --- a/editor/src/ui.rs +++ b/editor/src/ui.rs @@ -130,6 +130,8 @@ impl UserInterface { pub struct ViewportWidget { pub texture: egui::TextureId, pub flycam: Flycam, + pub width: u32, + pub height: u32, } impl ViewportWidget { @@ -137,6 +139,8 @@ impl ViewportWidget { Self { texture, flycam: Flycam::new(0.002, 10.0, 0.25), + width: 640, + height: 480, } } } @@ -149,6 +153,9 @@ impl egui::Widget for &mut ViewportWidget { let sense = egui::Sense::click_and_drag(); let response = ui.interact(rect, id, sense); + self.width = rect.width().round() as u32; + self.height = rect.height().round() as u32; + use egui::{pos2, Color32, Mesh, Rect, Shape}; let mut mesh = Mesh::with_texture(self.texture); let uv = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0)); @@ -193,8 +200,7 @@ impl egui::Widget for &mut ViewportWidget { self.flycam.defocus(); } - println!("{:#?}", self.flycam); - + self.flycam.resize(self.width, self.height); self.flycam.update(); response