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 <[email protected]>
Claude-Session: https://claude.ai/code/session_01AS5Tn3xieewUSg3uxrMVdL
This commit is contained in:
bherbruckandClaude Opus 5.5 committed 2026-10-08 19:35:22 +00:00
1 parent 0a6f6c4422
commit 998410de56
2 files changed
+8 -3

No files matched your search

+3
View File
@@ -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
+5 -3
View File
@@ -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<Point3, C>| -> 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<Point3, C>| -> Edge<_, _> {
@@ -260,7 +260,9 @@ fn shell_create_polygon<S: PreMeshableSurface>(
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();
}