Adds the three helpers to sc_sm.h, copied from the per-shim copies they
replace, and switches 19 shims to the shared flg/put_mat/put_vec/put_ivl/st/
put_dom. Shims touched by open PRs are left alone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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
- BuildTree on an SmPlane / SmSurfOfRevolution face makes the missing NURB
first, as upstream's GetOrCreateGwNurbPointer does (the top node had a zero
uv domain on plane faces).
- Shim, FFI validator and runner build a bounded SmPlane (surface kind 1);
12% of generated cases use one. 48 adversarial review fixtures added.
- difftest poly_of: fix clippy needless_pass_by_value / indexing_slicing.
- get_tree reports errors under its own operation path.
difftest: 676 cases, 665 bit-identical, 0 failed, 11 deferred
(intersect.curve_class_p4); --perturb 665/665 detected.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm
Ports SmTessSrfCache (TestAgainstTolerances with silhouette retest,
BuildTreeWithSubdivision, BuildTree, ImplantUVSegment, MarkFaceContainment),
the surface tessellation drivers and SmPolyToEUVUAttr; wires the
UNPORTED(query.tess) subdivision-surface split in SurfaceCache::SubdivideNode,
adds a TestAgainstTolerances dispatch hook to SubdivideToTolerances/BuildTree,
plus shim, ffi, difftest runner and fixtures.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BY8UpXKuMci15rAWGXsbsm