From 998410de56d14e94d99267b2968ccf3e1d501de0 Mon Sep 17 00:00:00 2001 From: bherbruck Date: Thu, 8 Oct 2026 18:12:30 +0000 Subject: [PATCH] Debug builds mesh seam faces and closed edges (vendored meshalgo) Three step_in tests and two split tests failed in debug builds only: truck's debug_new asserts simple loops and two distinct end vertices, but faces whose loop runs a seam edge both ways and full-circle edges on one vertex are valid. Meshed faces and edges are now built unchecked. ci (release) was unaffected; the kernel tests pass in debug and release. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01AS5Tn3xieewUSg3uxrMVdL --- vendor/README.md | 3 +++ vendor/truck-meshalgo/src/tessellation/triangulation.rs | 8 +++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/vendor/README.md b/vendor/README.md index 7e8cf09c..229a7e85 100644 --- a/vendor/README.md +++ b/vendor/README.md @@ -34,6 +34,9 @@ Changes: ## truck-meshalgo 0.4.0 (Apache-2.0, © RICOS Co. Ltd., https://github.com/ricosjp/truck) Changes: +- `tessellation/triangulation.rs`: meshed faces and edges are built unchecked: faces whose loop + runs along a seam edge both ways and closed edges (a full circle on one vertex) are valid, + but the debug-build checks rejected them (debug builds could not mesh them). - `tessellation/triangulation.rs`: parameter searches that land outside a surface's bounded, non-periodic domain are rejected (a hinted B-spline search can run off and extrapolate to thousands of parameter units, and meshing that grid never finishes); the last-resort nearest diff --git a/vendor/truck-meshalgo/src/tessellation/triangulation.rs b/vendor/truck-meshalgo/src/tessellation/triangulation.rs index ff259840..13fe3a43 100644 --- a/vendor/truck-meshalgo/src/tessellation/triangulation.rs +++ b/vendor/truck-meshalgo/src/tessellation/triangulation.rs @@ -111,7 +111,7 @@ where let v1 = vmap.get(&edge.absolute_back().id()).unwrap(); let curve = edge.curve(); let poly = bounded_polyline(&curve, curve.range_tuple(), tol); - (id, Edge::debug_new(v0, v1, poly)) + (id, Edge::new_unchecked(v0, v1, poly)) }) .collect(); let create_edge = |edge: &Edge| -> Edge<_, _> { @@ -161,7 +161,7 @@ where let v1 = vmap.entry_or_insert(vb).clone(); let curve = edge.curve(); let poly = bounded_polyline(&curve, curve.range_tuple(), tol); - Edge::debug_new(&v0, &v1, poly) + Edge::new_unchecked(&v0, &v1, poly) }, ); let mut create_edge = move |edge: &'a Edge| -> Edge<_, _> { @@ -260,7 +260,9 @@ fn shell_create_polygon( let boundary = PolyBoundary::new(preboundary?, &surface, tol); Some(trimming_tessellation(surface, &boundary, tol, cap)) })(); - let mut new_face = Face::debug_new(wires, polygon); + // SolveCraft: faces with seam edges (a loop running along an edge both ways, as STEP + // writes cylinders) are valid here; `debug_new` asserts simple loops in debug builds. + let mut new_face = Face::new_unchecked(wires, polygon); if !orientation { new_face.invert(); }