Moving a body transforms its intersection-curve edges, and truck-geometry 0.5.0 scales each curve's tolerance by the operator norm of the matrix. matext4cgmath 0.1.0 computes it from eigenvalues through a quartic whose Newton refinement loops while the residual is above a tolerance and never gives up. For a translation matrix all four eigenvalues are 1, and near that quadruple root the iteration can cycle forever (about one translation in eight of the boolean retries' shifts, by a scan of sizes 0.1-2000 mm). matext4cgmath is vendored with both Newton loops stopped after 100 steps (vendor/README.md, ATTRIBUTION.md). truck master no longer computes the norm in transform_by, so the vendored copy can go once a truck release after 0.5.0 is adopted. Tests: moving_a_body_with_an_intersection_curve_edge_ends (kernel) cuts a cylinder with a tilted box and moves the result by one of the shifts that hung (hangs on main). examples/regressions/oblique_cut_of_cylinder_hang.json is the variant of the oblique cut that hung the app; it hangs on main, and since the previous commit it passes without reaching the shifted retries, so it is replayed by the engine test as a scenario only. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Vendored third-party crates
Copies of third-party crates that SolveCraft builds with local fixes, wired in with
[patch.crates-io] in the workspace Cargo.toml. They keep their own licence; changed lines
are marked SolveCraft: in the source.
truck-shapeops 0.4.0 (Apache-2.0, © RICOS Co. Ltd., https://github.com/ricosjp/truck)
Changes:
transversal/integrate/mod.rs: mesh both shells withrobust_triangulation(faces made by earlier booleans have boundaries that lie on their surface only within tolerance).transversal/divide_face/mod.rs: when projecting a loop onto a face's surface, fall back to the nearest parameter when the exact search fails (intersection curves are approximations).transversal/integrate/mod.rs: the result's shells and faces keep the order of the shell they come from (truck's connected components followed hash order of face addresses, so a boolean's faces came out in a different order on every run).lib.rs:tr!reports where an operation gives up whenSHAPEOPS_TRACEis set; compiler warnings no longer fail the build.
truck-stepio 0.3.0 (Apache-2.0, © RICOS Co. Ltd., https://github.com/ricosjp/truck)
Only the writer (out) is used; SolveCraft reads STEP with its own reader.
Changes:
out/geometry.rs: anINTERSECTION_CURVE's second surface was written at the first surface's entity index, so every boolean-made edge produced duplicate entity ids.out/geometry.rs: surfaces of revolution carry the rightsame_sensefor inverted and mirrored revolutions (ISO 10303-42 parameterises them by angle then profile, so their normal is the opposite of truck's; a mirroring transform reverses it again), and the modeling-surface wrapper passes the revolution's sense through instead of alwaystrue.lib.rs: compiler warnings no longer fail the build. Example and test targets are dropped (their sources are not vendored).
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 search is clamped into the domain.tessellation/triangulation.rs, bounded work (hostile files must not hang): edge polylines and surface grids come from our own bounded divisions (at most 20 000 points per edge, a grid budget per face shared out of 10 million points per shell, 24 refinement rounds; a point that does not evaluate counts as flat instead of recursing). Surface grids refine only the direction that bends, and a ruling left undivided gets cells comparable to the other direction (long triangles from a trim loop to the grid's far ends cut through cylinders).lib.rs: compiler warnings no longer fail the build. Example, test and bench targets are dropped (their sources are not vendored).
matext4cgmath 0.1.0 (Apache-2.0, © RICOS Co. Ltd., https://github.com/ricosjp/matext4cgmath)
truck-geometry uses it for a matrix's operator norm (an intersection curve scales its tolerance by it whenever it is moved).
Changes:
solver.rs: the Newton refinement of cubic and quartic roots stops after 100 steps. Near a double root it could cycle forever: moving a body whose edges a boolean made (the retries move both bodies and the result back) hung the app.lib.rs: compiler warnings no longer fail the build. Test targets are dropped (their sources are not vendored).