From dd9309541fd2aba7baea28bf8e8346799d71e832 Mon Sep 17 00:00:00 2001 From: Orual Date: Mon, 10 Aug 2026 11:08:59 -0400 Subject: [PATCH] PM-84: eliminate redundant clones in BFS closure paths --- crates/polymodel-ldraw-core/src/mpd.rs | 27 ++++++++---- crates/polymodel-renderer-worker/src/lib.rs | 21 ++++----- src/appview/ldraw.rs | 48 ++++++++++----------- 3 files changed, 51 insertions(+), 45 deletions(-) diff --git a/crates/polymodel-ldraw-core/src/mpd.rs b/crates/polymodel-ldraw-core/src/mpd.rs index bd7787b..7ff357b 100644 --- a/crates/polymodel-ldraw-core/src/mpd.rs +++ b/crates/polymodel-ldraw-core/src/mpd.rs @@ -356,12 +356,14 @@ impl ResourceClosure { } pub fn from_inspection( - inspection: &CompoundSourceInspection, + inspection: &mut CompoundSourceInspection, current_path: &NormalizedPath, current_root: RootId, ) -> Self { + let references = std::mem::take(&mut inspection.references); + let texmap_references = std::mem::take(&mut inspection.texmap_references); let mut dependencies = Vec::new(); - for texture in inspection.texmap_references() { + for texture in &texmap_references { let source = texture.source.clone(); let texture_path = |name: &str| { let normalized = name.replace('\\', "/"); @@ -400,7 +402,7 @@ impl ResourceClosure { let _ = current_path; let _ = current_root; Self { - include_references: inspection.references.clone(), + include_references: references, dependencies, resolved: Vec::new(), needs_ldconfig: true, @@ -440,12 +442,15 @@ fn extract_texmap_references_from_files( for file in files { let source = NormalizedPath::new(file.name.as_ref()).unwrap_or_else(|_| current_path.clone()); - let fallback_available = file.lines.iter().any(|line| { - line.line_type == Some(LineType::Zero) + let file_reference_start = references.len(); + let mut fallback_available = false; + for line in &file.lines { + if line.line_type == Some(LineType::Zero) && line.tokens.get(1).map(|token| token.kind) == Some(TokenKind::Texmap) && line.tokens.get(2).map(|token| token.kind) == Some(TokenKind::Fallback) - }); - for line in &file.lines { + { + fallback_available = true; + } if line.line_type != Some(LineType::Zero) || line.tokens.get(1).map(|token| token.kind) != Some(TokenKind::Texmap) || !matches!( @@ -491,6 +496,9 @@ fn extract_texmap_references_from_files( references.push(reference); } } + for reference in &mut references[file_reference_start..] { + reference.fallback_available = fallback_available; + } } references } @@ -801,9 +809,10 @@ mod tests { fn resource_closure_tracks_texmap_assets_and_fallback_policy() { let bytes = b"0 !TEXMAP START PLANAR 0 0 0 1 0 0 0 1 0 sticker.png GLOSSMAP gloss.png\n3 16 0 0 0 1 0 0 0 1 0\n0 !TEXMAP END\n"; let source = NormalizedPath::new("models/root.ldr").unwrap(); - let inspection = inspect_compound_source(bytes, &source, RootId::UploadedLdraw) + let mut inspection = inspect_compound_source(bytes, &source, RootId::UploadedLdraw) .expect("valid TEXMAP source"); - let closure = ResourceClosure::from_inspection(&inspection, &source, RootId::UploadedLdraw); + let closure = + ResourceClosure::from_inspection(&mut inspection, &source, RootId::UploadedLdraw); assert_eq!(closure.dependencies.len(), 2); assert_eq!(closure.dependencies[0].kind, ResourceKind::TexmapAlbedo); assert_eq!( diff --git a/crates/polymodel-renderer-worker/src/lib.rs b/crates/polymodel-renderer-worker/src/lib.rs index b6e0983..0659d75 100644 --- a/crates/polymodel-renderer-worker/src/lib.rs +++ b/crates/polymodel-renderer-worker/src/lib.rs @@ -2112,21 +2112,22 @@ pub fn official_materializations( .map_err(|error| { RendererError::ParseMessage(format!("inspect {}: {error}", current.path.as_str())) })?; - let source_keys = inspection.source_keys.clone(); + let mut inspection = inspection; + let source_keys = std::mem::take(&mut inspection.source_keys); let has_virtual_files = inspection.has_virtual_files; let inspection_closure = polymodel_ldraw_core::ResourceClosure::from_inspection( - &inspection, + &mut inspection, ¤t.path, current.key.resolved_root, ); - resource_closure - .include_references - .extend(inspection_closure.include_references.iter().cloned()); - resource_closure - .dependencies - .extend(inspection_closure.dependencies.iter().cloned()); - resource_closure.needs_ldconfig |= inspection_closure.needs_ldconfig; - let references = inspection_closure.include_references.clone(); + let polymodel_ldraw_core::ResourceClosure { + include_references: references, + dependencies, + needs_ldconfig, + .. + } = inspection_closure; + resource_closure.dependencies.extend(dependencies); + resource_closure.needs_ldconfig |= needs_ldconfig; for reference in references { if reference.target_virtual_file { continue; diff --git a/src/appview/ldraw.rs b/src/appview/ldraw.rs index 091b04d..8ba9eb4 100644 --- a/src/appview/ldraw.rs +++ b/src/appview/ldraw.rs @@ -475,7 +475,8 @@ async fn build_model_load_bundle(state: AppState, uri: AtUri) -> AppResult AppResult>(); + let needs_ldconfig = resource_closure.needs_ldconfig; + if needs_ldconfig { + auxiliary_dependencies.push(polymodel_ldraw_core::ResourceDependency { + kind: polymodel_ldraw_core::ResourceKind::LdConfig, + path: polymodel_ldraw_core::NormalizedPath::new("LDConfig.ldr") + .map_err(|_| invalid_request("invalid LDConfig path"))?, + source: polymodel_ldraw_core::NormalizedPath::new(current_path.as_str()) + .map_err(|_| invalid_request("invalid bundled source path"))?, + root: polymodel_ldraw_core::RootId::OfficialLibrary, + required: false, + fallback_available: true, + }); + } resolved_closure .dependencies .extend(resource_closure.dependencies.iter().cloned()); - resolved_closure.needs_ldconfig |= resource_closure.needs_ldconfig; - let references = resource_closure.include_references.clone(); + resolved_closure.needs_ldconfig |= needs_ldconfig; + let references = resource_closure.include_references; let source = match &node { BundleNode::Db(_) => "projection", BundleNode::Official(_) => "official-library", @@ -699,25 +714,6 @@ async fn build_model_load_bundle(state: AppState, uri: AtUri) -> AppResult>(); - if resource_closure.needs_ldconfig { - auxiliary_dependencies.push(polymodel_ldraw_core::ResourceDependency { - kind: polymodel_ldraw_core::ResourceKind::LdConfig, - path: polymodel_ldraw_core::NormalizedPath::new("LDConfig.ldr") - .map_err(|_| invalid_request("invalid LDConfig path"))?, - source: polymodel_ldraw_core::NormalizedPath::new(current_path.as_str()) - .map_err(|_| invalid_request("invalid bundled source path"))?, - root: polymodel_ldraw_core::RootId::OfficialLibrary, - required: false, - fallback_available: true, - }); - } for dependency in auxiliary_dependencies { let Some(directory) = libdir else { break; -- knotmirror 0.0.1