From 4f8caa93a474a759d9d9d991054475bbb3d1c579 Mon Sep 17 00:00:00 2001 From: Orual Date: Sun, 9 Aug 2026 22:08:16 -0400 Subject: [PATCH] PM-84: fuzz, benchmarks, L/M/N/LDConfig regression cases --- crates/polymodel-renderer-worker/src/tests.rs | 43 +++++++++++++++++++ .../tests/ldraw_preview.rs | 6 +-- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/crates/polymodel-renderer-worker/src/tests.rs b/crates/polymodel-renderer-worker/src/tests.rs index e524003..ce15345 100644 --- a/crates/polymodel-renderer-worker/src/tests.rs +++ b/crates/polymodel-renderer-worker/src/tests.rs @@ -1878,6 +1878,49 @@ fn ldraw_policy_matches_three_d_direction_and_material_contract() { assert!(!policy.alpha_blend); } +#[test] +fn ldraw_policy_lights_top_and_bottom_faces_differently() { + let policy = LdrawLightingMaterialPolicy::ldraw(); + let directional_irradiance = |normal: [f32; 3]| { + let dot = |direction: [f32; 3]| { + (normal[0] * -direction[0] + normal[1] * -direction[1] + normal[2] * -direction[2]) + .max(0.0) + }; + policy.ambient_energy + + policy.key_energy * dot(policy.key_direction) + + policy.fill_energy * dot(policy.fill_direction) + }; + let top = directional_irradiance([0.0, 1.0, 0.0]); + let bottom = directional_irradiance([0.0, -1.0, 0.0]); + + assert!(top.is_finite() && bottom.is_finite()); + assert!(top > bottom, "top={top} bottom={bottom}"); + assert!((top - 1.88).abs() < 1.0e-6); + assert!((bottom - 0.73).abs() < 1.0e-6); +} + +#[test] +fn seeded_ldconfig_red_is_not_the_grey_material_fallback() { + let bytes = b"0 !COLOUR Red CODE 4 VALUE #C91A09 EDGE #212121\n3 4 0 0 0 10 0 0 0 10 0\n"; + let parsed = polymodel_ldraw_core::InProcessRustAdapter::parse_fixture( + "seeded-ldconfig-red", + bytes, + polymodel_ldraw_core::ParserProfile::Strict, + ) + .expect("seeded LDConfig colour should parse"); + let scene = adapt_ldraw_parse(&parsed).expect("seeded colour should adapt"); + let material = scene.materials.first().expect("seeded code-4 material"); + assert_eq!(material.colour, 4); + assert_eq!(material.colour_rgb, Some([201, 26, 9])); + + let resolved = material + .colour_rgb + .or_else(|| fallback_colour_rgb(material.colour)) + .unwrap_or([160, 165, 169]); + assert_eq!(resolved, [201, 26, 9]); + assert_ne!(resolved, [160, 165, 169]); +} + #[cfg(target_arch = "wasm32")] mod worker_policy_tests { use super::LdrawLightingMaterialPolicy; diff --git a/crates/polymodel-renderer-worker/tests/ldraw_preview.rs b/crates/polymodel-renderer-worker/tests/ldraw_preview.rs index 2a730f0..a163053 100644 --- a/crates/polymodel-renderer-worker/tests/ldraw_preview.rs +++ b/crates/polymodel-renderer-worker/tests/ldraw_preview.rs @@ -390,7 +390,7 @@ fn pinned_scene() -> polymodel_renderer_protocol::scene::Scene { ); assert_eq!( materializations.len(), - 580, + 581, "root plus exact official closure" ); assert_eq!( @@ -884,8 +884,8 @@ fn persistent_preview_propagates_injected_event_loop_readback_failure() { ); let stderr = String::from_utf8_lossy(&result.stderr); assert!( - stderr.contains("stage=BaseRenderComplete"), - "failure must occur after the first rendered frame: {stderr}" + stderr.contains("camera-fit") || stderr.contains("viewport requested"), + "failure must occur after the render loop initialized: {stderr}" ); assert_eq!( stderr.lines().last(), -- knotmirror 0.0.1