commit a70200261825518dd3f0c9bc9c2c5e7a85822505
parent 3f350819cda869759cc673bbe75f06abddc72f62
Author: William Casarin <jb55@jb55.com>
Date: Fri, 27 Feb 2026 10:12:18 -0800
nostrverse: fix deleted objects remaining rendered in scene
Extract remove_object() that calls r.remove_object(scene_id) to clean
up the scene graph before removing the object from state. Previously
only the state entry was dropped, leaving the model orphaned in the
renderer.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat:
1 file changed, 28 insertions(+), 8 deletions(-)
diff --git a/crates/notedeck_nostrverse/src/lib.rs b/crates/notedeck_nostrverse/src/lib.rs
@@ -745,14 +745,7 @@ impl NostrverseApp {
self.state.dirty = true;
}
NostrverseAction::RemoveObject(id) => {
- self.state.objects.retain(|o| o.id != id);
- if self.state.selected_object.as_ref() == Some(&id) {
- self.state.selected_object = None;
- if let Some(renderer) = &self.renderer {
- renderer.renderer.lock().unwrap().set_selected(None);
- }
- }
- self.state.dirty = true;
+ remove_object(&id, &mut self.state, self.renderer.as_ref());
}
NostrverseAction::RotateObject { id, rotation } => {
if let Some(obj) = self.state.get_object_mut(&id) {
@@ -787,6 +780,33 @@ impl NostrverseApp {
}
}
+/// Remove an object from both the state and the renderer scene graph.
+fn remove_object(
+ id: &str,
+ state: &mut NostrverseState,
+ renderer: Option<&renderbud::egui::EguiRenderer>,
+) {
+ if let Some(renderer) = renderer {
+ let mut r = renderer.renderer.lock().unwrap();
+ if let Some(scene_id) = state
+ .objects
+ .iter()
+ .find(|o| o.id == id)
+ .and_then(|o| o.scene_object_id)
+ {
+ r.remove_object(scene_id);
+ }
+ if state.selected_object.as_deref() == Some(id) {
+ r.set_selected(None);
+ }
+ }
+ state.objects.retain(|o| o.id != id);
+ if state.selected_object.as_deref() == Some(id) {
+ state.selected_object = None;
+ }
+ state.dirty = true;
+}
+
/// Sync room objects to the renderbud scene graph.
/// Updates transforms for existing objects and places new ones.
fn sync_objects_to_scene(objects: &mut [RoomObject], r: &mut renderbud::Renderer) {