diff --git a/crates/fj-viewer/src/graphics/renderer.rs b/crates/fj-viewer/src/graphics/renderer.rs index 4bc216ab7..c273b4084 100644 --- a/crates/fj-viewer/src/graphics/renderer.rs +++ b/crates/fj-viewer/src/graphics/renderer.rs @@ -224,6 +224,10 @@ impl Renderer { )); } + pub fn clear_geometry(&mut self) { + self.geometries.clear(); + } + /// Resizes the render surface. /// /// # Arguments diff --git a/crates/fj-viewer/src/viewer.rs b/crates/fj-viewer/src/viewer.rs index b539da5d8..3d8116bac 100644 --- a/crates/fj-viewer/src/viewer.rs +++ b/crates/fj-viewer/src/viewer.rs @@ -130,6 +130,12 @@ impl WindowHandle { window_id: self.id, }); } + + /// # Clear the contents of the window + pub fn clear(&self) { + self.event_loop + .send_event(EventLoopEvent::Clear { window_id: self.id }); + } } #[derive(Clone)] @@ -288,6 +294,22 @@ impl ApplicationHandler for Viewer { window.add_displayable(displayable); } + EventLoopEvent::Clear { window_id } => { + let Some(winit_window_id) = self.id_map.get(&window_id) else { + unreachable!( + "Mappings for all window IDs are created when handling \ + the `Window` event." + ); + }; + let Some(window) = self.windows.get_mut(winit_window_id) else { + unreachable!( + "We never remove any windows, so it's not possible to \ + have a mapping to an ID, but not a window with that ID." + ); + }; + + window.clear(); + } } } } @@ -300,4 +322,7 @@ enum EventLoopEvent { displayable: Displayable, window_id: u64, }, + Clear { + window_id: u64, + }, } diff --git a/crates/fj-viewer/src/window.rs b/crates/fj-viewer/src/window.rs index 7a946fcb2..a54f2e5b3 100644 --- a/crates/fj-viewer/src/window.rs +++ b/crates/fj-viewer/src/window.rs @@ -194,6 +194,11 @@ impl Window { self.should_render = true; } + /// # Clear the geometry displayed in the window + pub fn clear(&mut self) { + self.renderer.clear_geometry(); + } + /// # Draw the window pub fn draw(&mut self) -> bool { let size_is_invalid = { diff --git a/experiments/2025-03-18/src/debug.rs b/experiments/2025-03-18/src/debug.rs index b164d0a44..deb8273cc 100644 --- a/experiments/2025-03-18/src/debug.rs +++ b/experiments/2025-03-18/src/debug.rs @@ -56,6 +56,17 @@ impl DebugWindow { window.display_point(point); } + + #[allow(unused)] // occasionally useful for debugging + pub fn clear(&self) { + let inner = self.inner.lock().unwrap(); + + let DebugWindowInner::Initialized { window } = inner.deref() else { + panic!("Debug window has not been initialized."); + }; + + window.clear(); + } } enum DebugWindowInner {