notedeck

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

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:
Mcrates/notedeck_nostrverse/src/lib.rs | 36++++++++++++++++++++++++++++--------
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) {