Upstream's SubdivideByBlock and FindTessellationSplits work on the surface
itself (pAux->mBA_pSurface; SmIsoCurve(*this, ..)); the port split a
copy-constructor copy and built the implicit iso curves over a copy, whose
knot fix-up moves near-coincident knots and so the splits. Use an evaluation
copy and an exact B-spline copy. The runner gains raw_bspline /
raw_curve_bounded surfaces (shim kinds 3 / 4): 4 subdiv_block fixture cases
failed before; with only the subdivide copy fixed the 2 chord cases still
failed (implicit_iso); all pass after. 4 curve-bounded TestAgainstTolerances
cases (compound_copy) agree before and after.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SdcgEtgaA54W2nr8dK1EYp
125 shims carried private copies of the same small helpers (put_vec, st,
nl_status, Rd, dump_crv, read_nurb, ...). Move the most common, byte-identical
form of each into three headers grouped by the upstream API they need, and have
those shims pull them in with `using sc::<name>;`. Shims with a different
variant keep their own copy; files touched by open PRs are left alone.
`the_context()` stays per shim (its function-local SmContext must not be shared).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FBLgPenT24P1dunqnZR1Dj
Adds the Rust port (surface::surface_cache::p2), the C++ shim, the ffi
wrapper, the difftest runner and fixtures. Wires the SmPlane override of
IsSingularity into the surface cache's Bezier approximation (p1).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FsWWaoeGNWKgzeGrF2Pkn5