Repository navigation
wire: IntersectInsertRelate into Boolean2D (primitive_creation_p1) and the PiecewiseMerge runner (merge_p3) - #738
Merged
bherbruck merged 5 commits intoOct 24, 2026
Conversation
…ge runner Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…4's kernel adapter SmPrimitiveCreation::Boolean2D's local SmTopologyIntersector is now a KernelManifoldIntersector over the two arenas: IntersectInsertRelate, GetCommonEdges/GetCommonVertices, Relate, GetOtherMate/GetBrepMate and DeleteFaces all go through the one retained mate store, notifying under the caller's identities. The primitive_creation_p1 op-6 runner now builds its operands as the shim does (SmBrep with its infinite region, CreateFaceFromSurface faces instead of bare face records) and, on success, both sides record the result's counts and geometry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Family 4 now constructs the merge as the shim's MergeAccess does and uses that engine's intersector as m_vTI for every PiecewiseMerge stage: IntersectInsertRelate, the mate clearing, SetSubset (by surface identity), the wire/lamina controls, RegisterExistingSSI/ClearExistingSSI and ProcessWiresAndShellVertices, so ManifoldBoolean sees the same mates. The pool's stand-in TopologyIntersector and its empty-relations wire processing are gone. The kernel adapter exposes the piecewise controls it already had (clear_relationships, wire edges, SSI registration) plus two getters. Boolean2D's unit tests (merge p3 and primitive p1) asserted the old IntersectInsertRelate stub; on their bare face records the intersector now runs and copying an unrelated face stops at its missing face use, which they now assert. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Wires
SmTopologyIntersector::IntersectInsertRelate(and the rest ofm_vTI) into the two places that still stubbed it.MergeCoincidentSurfacesinboolean.merge_p1is left to #728.Changes
SmPrimitiveCreation::Boolean2D(primitive/primitive_creation/p1/boolean.rs)IntersectInsertRelateandDeleteFacesstubs and thePlanarIntersectionsstand-in are gone.SmTopologyIntersectoris merge p4'sKernelManifoldIntersectorover the two arenas, with the explicit tolerances (SM_ZONE_TO_APPROXTOL3D, 20 degrees).GetCommonEdges/GetCommonVertices,Relate,GetOtherMate/GetBrepMateandDeleteFacesall use the adapter's single mate store. The B-reps are mutated in place, with no copies.key_offor both operands, and the face copies go through the adapter's records.primitive.primitive_creation_p1op-6 runner and shimSmBrep(SM_USE_DEFAULT, ...)with its infinite region, and realCreateFaceFromSurfacefaces. Before, they were bare face records with no loops or face uses.primitive_record).boolean.merge_p3runner, family 4 (PiecewiseMerge)MergeAccessdoes.m_vTIfor every stage:IntersectInsertRelate, the mate clearing,SetSubset(by surface identity), the wire/lamina controls,RegisterExistingSSI/ClearExistingSSIandProcessWiresAndShellVertices.ManifoldBooleantherefore sees the same mates.TopologyIntersector<PoolRef>and its empty-relations wire processing are removed.Unit tests
Difftest (main 5351487 -> this branch merged with main 76f27c3)
SmVertex::GetPoint,SmFace::PointClassify, the B-rep mutable owning context and the face handle of a surface. Those are dispatch gaps inside the boolean, not this wiring.CoverCoincidentSurface, before the intersector. There,STEPInversionof a face-owned surface reachesGlobalPointSolve's trimmed-cache point test (SmFace::PointClassify,surface/surface/p4.rs), which has no face context on that path. Upstream classifies against the face there, so these cases cannot compare until that path gets a face-tested variant.Local gate
cargo fmt --check;clippy --workspace --all-targets -D warnings(with and withoutdifftest/cpp);cargo test -p solidcore(2099 lib tests);cargo check -p solidcore --target wasm32-unknown-unknown;--unit boolean.merge_p3;--unit primitive.primitive_creation_p1; the difftest crate's unit tests ran on CI.🤖 Generated with Claude Code