diff --git a/crates/polymodel-renderer-protocol/src/load_state.rs b/crates/polymodel-renderer-protocol/src/load_state.rs index 03708fa..ee7b81e 100644 --- a/crates/polymodel-renderer-protocol/src/load_state.rs +++ b/crates/polymodel-renderer-protocol/src/load_state.rs @@ -237,7 +237,10 @@ impl LoadReducer { } LoadEvent::LoadFailed { error, candidate, .. - } if matches!(self.state, LoadState::Loading(_)) => { + } if matches!( + self.state, + LoadState::Loading(_) | LoadState::Installing(_) + ) => { let disposed = self.take_resources(candidate); self.state = LoadState::Failed(identity.load_epoch, error.code); TransitionResult::committed(self.state.clone(), disposed) diff --git a/crates/polymodel-renderer-worker/src/worker.rs b/crates/polymodel-renderer-worker/src/worker.rs index d5379bf..9a44c6c 100644 --- a/crates/polymodel-renderer-worker/src/worker.rs +++ b/crates/polymodel-renderer-worker/src/worker.rs @@ -529,6 +529,7 @@ fn handle_load_mesh( if st.disposed || namespace != RendererNamespace::Interactive { return; } + let previous_identity = st.load_reducer.current_identity(); let result = st.load_reducer.reduce(LoadEvent::StartLoad { namespace, identity, @@ -548,10 +549,14 @@ fn handle_load_mesh( } st.pending_scene = None; st.needs_render = true; - st.post_event(&RendererEvent::LoadCancelled { - namespace, - identity, - }); + if let Some(previous_identity) = previous_identity + && identity > previous_identity + { + st.post_event(&RendererEvent::LoadCancelled { + namespace, + identity: previous_identity, + }); + } } let state_clone = state.clone();