Resolve conflicts in geom/tol.rs (keep surface.surface_p1's CO-PORTED note and
this unit's classification mappings) and plan/findings.md (keep both).
Handle the new SurfaceKind::SurfOfRevolution (SmBSplineSurface base flag) and
Step variants in out_of_bounds. Wire SmTol::GetZoneTol3d(SmSurface),
smsurf_GetSurfaceCache and SmSurface::ApproximateSize to surface.surface_p1:
2088 cases, 1908 pass, 0 fail, 180 deferred (52 moved to surface.surface_p6).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
All local gates pass against the updated main. Full differential validation
evaluates 134 units: 87 green, 47 partial and zero failed. The three part-9/cache
reports remain byte-identical to their focused and committed reports.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Keep both sides' SurfaceKind arms (Plane overrides from this unit; the
SurfOfRevolution and Step kinds from main). Add the SmPlane::GlobalSurfaceIntersect
SurfOfRevolution case (orders and UV curves swapped, as upstream), which needs
&Kernel on Surface::global_surface_intersect / intersect_with_plane. Wire the
plane box zone tolerance to Surface::face (surface.surface_p1 is partial):
a plane with a face now defers on SmFace::GetTolerance (topology.face_p2).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Use the newly ported revolution surface's virtual iso constructor and B-spline
base. Add 18 direct canonical-cylinder comparisons against the real C++ class.
Refresh cache reports after the upstream dispatch changes and retain explicit
CSI and classification deferrals.
All required local gates pass; full differential validation covers 133 units
with 85 green, 48 partial and zero failed. Part 9 compares 727/778 cases exactly.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Remove the duplicate CSI state, preserve the existing part-1 constructor and
wire its surface/node/point validity helpers. Add 16 real-plane fixtures without
diagonals and refresh differential reports after the main integration.
Part 9 compares 709/760 cases, cache part 2 808/905 and cache part 3 450/600;
all compared values are identical and all remaining deferrals name their owner.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Resolve against surface.surface_p1 (#43) and surface.cone_p1 (#31): keep both
SurfaceKind variants (SurfOfRevolution, Step) in every match, give the
surface of revolution its SmSurface dispatch in surface::surface::p1
(EvaluateSTEP override, inherited SmBSplineSurface bodies), share one
ConvertDomainFromNURBSToSTEP body, and wire the cone's SmSurfOfRevolution
Transform/ReadFromDB back-edges. surface.torus becomes green.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
The problem data (SmSurfacePointSolver), the global solver's helpers
(closure cache, objective, control-net triangle and leg guesses, seam,
stride, extremum and boundary tests) and the local stepper's pieces
(construction, copies, lazy evaluation, clamping, boundary hits, bounds
check, iso-curve drop) of SmSurfacePointSolve.cpp, with the static
control-net helpers.
The shim compiles the upstream file itself (its classes are file-local),
renaming the classes and SmSurface's two point-solve members.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Use EFF_ZERO for default degeneracy checks and forward maximum side lengths,
including negatives, to bisection tessellation. Add boundary, subdomain, tiny-scale
and real analytic plane comparisons, narrow the C++ undefined-count guard, and
wire surface-cache block subdivision with the caller Kernel.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Brings in intersect.topology_solver_p1 (PR #30).
- topology_solver sm_GetFaceSilhouettes: wire the UNPORTED(surface.surface_p1)
stub. It now builds the cache with smsurf_GetSurfaceCache (the 3-argument
port), checks HasCachedCurves(SM_AS_TRIMMED_SILHOUETTE, 10 * tol, 20 deg,
view vector, FALSE), and calls CreateSilhouetteCurves over the face's UV
domain (a non-B-spline surface, a NULL SM_CAST_PTR upstream, is an
error). It then stops at UNPORTED(topology.face_p2):
SmFace::CreateCurvesByTrimming.
- Renumber this unit's upstream issues UB-80/UB-81 to UB-83/UB-84. Main's
surf_of_extrusion_p1 and topology_solver_p1 entries already use UB-80/81.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
- Resolve conflicts: geom::tol test (Base volume now has a box), findings and
upstream-issues (this unit's entries renumbered UB-83, UB-84, WR-62 after main
took UB-78, UB-79, WR-55).
- Dispatch the bend overrides (EvaluateBoundingBoxSimple, GlobalPointSolveSimple,
LocalPointSolveSimple, ReadFromDB); SmBendVolume::ReadFromDB reads the base data;
a bend's Evaluate writes its own image before its next map fails.
- Shim builds default and component bends (kinds 6, 7); generator and
fixtures/surface.volume_p2/bend.json (5014 cases) cover them.
- Bend and unbend ReadDb FFI guards apply the strict text grammar of the base read.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Brings in surface.surf_of_extrusion_p1 (PR #28). Its 56 STEPInversion
deferrals now get past surface.surface_p1 and stop in surface.surface_p4
(GlobalPointSolve, 30) and surface.surface_p5 (LocalPointSolve, 26);
report and note updated, still 1958 pass / 97 deferred / 0 failed.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
surface.torus added the same virtual CreateIsoParametricCurve hook to
SurfOfRevolution; keep main's API (SweepIsoFn, make_nurb_with_sweep_params_using,
rebuild_polar_converter(k, iso)) and drop the cone's duplicate.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Brings in intersect.surface_intersector_p2 (PR #42). Its SurfaceKind
dispatch now covers SmSTEPSurface: IsSingularity takes the base
SmSurface path (no STEP override), and the boundary-plane test's
SM_CAST_PTR(SmBSplineSurface, ..) accepts only B-splines and planes, so a
STEP surface bails out with SM_BR_UNKNOWN as upstream does.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Add SurfaceKind::SurfOfRevolution arms to the matches added on main
(intersect.surface_silhouette EvaluateGeometric / EvaluateNormalSection,
surface.surface_cache_p3 BuildTreeBase).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm