Commit Graph

267 Commits

Author SHA1 Message Date
lillith 2b6bcd6ac3 port: surface tessellation splits, iso boundaries and CSI leaf driver
Co-Authored-By: OpenAI Codex <noreply@openai.com>
2026-10-13 12:42:52 +02:00
bherbruck 137c37477d merge main into unit/curve.curve_p5
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero

# Conflicts:
#	crates/solidcore/src/curve/curve/p8.rs
#	plan/findings.md
2026-10-13 03:56:35 -04:00
bherbruck 1b28e30440 curve.curve_p5: fix gaps exposed by the wiring (ellipse conversion out-param, curve solution handles in the p3/p7 runners, analytic handle of GlobalPointSolveSTEP, uninitialised branch slot in the p7 harness)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 03:56:12 -04:00
bherbruck 6953740a0a merge main into unit/surface.surface_cache_p1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 03:38:54 -04:00
bherbruck 8ce76d29a1 surface.surface_cache_p1: port SmSurfaceCache part 1
SmSurfaceCache object and simple queries, SmBezierAux2d/SmBezierPatch node data
with lazily built polar boxes, SmPatchBoundaryBoundingPlanes, SmAltSrfCache,
sm_ComputeBezierApproximation, ComputeSizeTolerances, GetCorners, BuildTreeTop,
FindUnmarkedLeafNode, GetConnectedRegion, MarkFaceContainment,
GetSurfaceContinuity, GetIsoBoundaryCurves, sm_CullArray; shim, ffi, difftest
runner and fixtures (872 cases, 709 pass bit-identical, 163 deferred).

Wired UNPORTED(surface.surface_cache_p1): SmTree::GetOwnerObject of surface
trees (Tree::set_owner_surface), sm_GetOriginalSurface; retagged the stubs that
need the cache's patch data from a bare tree to surface.surface_cache_p3 and
smsurf_GetSurfaceCache paths to surface.surface_p1 (CacheMakeOrValidate).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 03:38:51 -04:00
bherbruck f2cd29de5b curve.curve_p5: port SmCurve part 5 (CrvsCleanup, RemoveDuplicateCurves, EvaluateSTEPPoint, CacheMakeOrValidate, IsArc, IsDomainBoundary, IsPeriodic, Length, LocalPropertyAnalysis, sm_FindAdditionalCpGuess, seam test, SmCCIntersectENFO/SmFindCCNormalENFO::Evaluate); shim, ffi, difftest runner and fixtures; wire curve_p5 stubs
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 03:25:50 -04:00
bherbruck c0a12a306b merge main into unit/surface.curve_bounded_surface 2026-10-13 03:23:48 -04:00
bherbruck 99b6bb4205 surface.curve_bounded_surface: port SmCurveBoundedSurface
SurfaceKind::CurveBounded with the evaluation overrides passed along to the
basis surface, base-class defaults for the rest of the SmSurface dispatch,
type queries, operator==, SetContext and ReadFromDB (wired into
Surface::read_from_db, which now takes the kernel for the boundary curve
readers). C++ shim, ffi wrapper, difftest runner and fixtures: 535 cases,
359 pass, 176 deferred (surface_p1/p3/p5/p7).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 03:23:48 -04:00
bherbruck f047f93dfe merge main into unit/curve.composite_curve_p2 2026-10-13 03:10:35 -04:00
bherbruck c404b8690a curve.composite_curve_p2: port SmCompositeCurve part 2 (offsetters, bow ties, MakeCompositeNurb, ReadFromDB)
Wires the UNPORTED(curve.composite_curve_p2) SmCompositeCurve::ReadFromDB stub in
Curve::read_from_db. difftest: 661 cases, 361 pass, 300 deferred on curve.curve_p5.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 03:10:35 -04:00
bherbruck cacda102a8 merge main into unit/surface.surface_p2
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero

# Conflicts:
#	plan/findings.md
2026-10-13 02:50:48 -04:00
bherbruck 98fc6392bf surface.surface_p2: C++ shim, ffi, difftest runner and fixtures; tangent field difftest uses a real bilinear surface; findings
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 02:50:34 -04:00
bherbruck 5db9b99596 merge main into unit/curve.composite_curve_p1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 02:38:55 -04:00
bherbruck a459137888 curve.composite_curve_p1: port SmCompositeCurve part 1; SmCompositeCurve joins Curve as CurveKind::Composite
Port the composite curve object and segment records (constructors, copy,
operator==, GetCurveSegment, GetCanonical, IsClosed, type queries), the
overrides GetNaturalInterval, GetKnots, CalculateBoundingBox,
ApproximateCurve (with sm_convert_to_BSplineCurves) and Transform, the
statics ComputeProjectedLoopOrientation and BuildCompositesFromCurves
(with sm_FlushCrv), the file-static sm_CreateCorner, sm_CurveClassify and
break-list helpers, and the type queries of SmCompositeCurveRegion,
SmCompositeCurveSegment and SmOffsetMapAttribute.

Difftest: 3093 cases (93 fixture + 3000 generated), 2781 pass
bit-identical, 312 deferred (curve.curve_p5: AssertValid of the joined
approximation, corner/classify solves); 30k-seed run clean; --perturb
SENSITIVE. Upstream out-of-bounds reads recorded in plan/findings.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 02:38:52 -04:00
bherbruck f52937476c merge main into unit/primitive.api_curves
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 02:07:34 -04:00
bherbruck c2cc897169 port: primitive.api_curves (SM_API curve constructors)
Port SmApiCurves.cpp (SmApiCreateLineSegment, SmApiCreateLine, both
SmApiCreateCircle overloads, SmApiCreateEllipse, SmApiCreateArc,
SmApiCreateHelix, SmApiCreateRectangle, SmApiCreateRegularPolygon,
SmApiCreateCurve, SmApiCreateCanonicalCurve) to primitive::api_curves,
with C++ shim, ffi wrapper, difftest runner and upstream-test fixtures.
difftest: 1629 cases (129 fixture + 1500 generated), 0 deferred, PASS;
perturb SENSITIVE.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 02:07:34 -04:00
bherbruck afa1f672be merge: curve.curve_p8
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 01:56:27 -04:00
bherbruck 5b5c0c3279 merge main into unit/curve.ellipse_p1
Resolve CurveKind dispatch with the merged parabola and curve-on-surface
kinds; thread &Kernel through the curve-on-surface, bounding-box and
planarity paths that can reach an ellipse's polar converter.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 01:52:31 -04:00
bherbruck 4b9b39234d merge main into unit/curve.curve_p8
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 01:48:33 -04:00
bherbruck 804ea85c53 curve.curve_p8: port SmCurve::GlobalCurveIntersect
Shim, ffi wrapper, difftest runner (58 fixture cases from the SM_API
rectangle/polygon and reversed-line-join inputs plus edge cases, 3000
generated). Wires the UNPORTED(curve.curve_p8) stub in
nurbs::b_spline_curve::p3 (TrimGap).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 01:48:33 -04:00
bherbruck c0c3d7aaa9 merge main into unit/curve.ellipse_p1
Wire UNPORTED(curve.ellipse_p1) SmCurve::GlobalCoincidenceChecker of
ellipses (curve.curve_p6 landed); dispatch the ellipse in curve_p6's
GlobalPointSolveSTEP, bounding box and deform overrides.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 01:40:41 -04:00
bherbruck ae177df281 merge main into unit/curve.crv_on_surf
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 01:39:58 -04:00
bherbruck d7f2ccc7d7 curve.crv_on_surf: port SmCrvOnSurf (CurveKind::CrvOnSurf), shim, ffi, difftest runner and fixtures; wire SmCurve::ReadFromDB and SmTangentField's base read; ApproximateCurve/DropPoint/CalculateBoundingBox dispatch to the override; findings
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 01:36:30 -04:00
bherbruck 2a5baebd0e merge main into unit/curve.parabola
Picks up curve.curve_p7; findings.md takes both sides. curve.parabola
difftest is now green (3044 cases, 0 deferred) with GlobalPointSolve wired.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 01:33:33 -04:00
bherbruck 84ee06270f merge main into unit/curve.parabola
Resolve CurveKind dispatch: Parabola joins main's Line, Hyperbola, Iso,
Projected, Offset and CrvInVolume variants and runs the SmBSplineCurve
methods on its base wherever main routes Hyperbola to its base (tessellate,
is_line, is_linear, is_degenerate, bounding box, curve cache NURB, deform,
curve max distance, Line::join_with). GlobalPointSolveSTEP now calls the
ported SmCurve::GlobalPointSolve (curve.curve_p1) and is dispatched from
Curve::global_point_solve_step; ReadFromDB(PARABOLA_TYPE) runs inside the
nesting guard.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 01:29:47 -04:00
bherbruck b644e303ed curve.ellipse_p1: port SmEllipse/SmCircle/SmPolarConversion part 1; SmEllipse joins Curve as CurveKind::Ellipse
Port MakeNurb (owner-aware), ConvertTo2D, ConvertTFromNURBSToSTEP,
AdjustSTEPInterval, GlobalPointSolveSTEP, JoinWith, Notify,
ReverseParameterization, Trim, Copy, CreateCanonical, AssertValid,
ReadFromDB, the SmCircle class (constructors, CreateCanonical, IsArc,
CreateSimpleOffset, AssertValid, ReadFromDB) and SmPolarConversion
ConvertToPolarParameter, IsCurrent, AssertValid, ReadFromDB.

Wire UNPORTED(curve.ellipse_p1) stubs: Curve::read_from_db for ellipses
and circles, the ellipse global point solve in IntersectWith*,
CreateAnalyticCurve's SmCircle and CreateSurfOfRevolution's sweep circle.
Thread &Kernel through the Curve methods whose ellipse override rebuilds
the polar converter. Difftest: 2028 cases, 132 deferred (curve.curve_p5).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 01:29:46 -04:00
bherbruck f0305804e1 curve.curve_p7: port SmCCIGlobalSolver::LocalSolve and SmCurve::GlobalPropertyAnalysis
Co-port sm_FindAdditionalCcTangentGuess (curve.curve_p5); wire UNPORTED(curve.curve_p7)
in curve.curve_p2 (CciGlobalSolver::local_solve) and nurbs.b_spline_curve_p3
(AssertValid's GlobalPropertyAnalysis). Shim, ffi, difftest runner, fixtures, findings.
Difftest partial: 3027 cases, 1716 pass, 1311 deferred (curve.curve_p5).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 01:20:18 -04:00
bherbruck d47eb82300 merge main into unit/curve.curve_p6 2026-10-13 00:33:43 -04:00
bherbruck a2af7f42c3 curve.curve_p6: port SmCurve part 6 (CalculateBoundingBox + dispatch, IsPlanar, DropPoint, GlobalPointSolveSTEP dispatch, CurveMaxDistanceBetween, Simple/GlobalCoincidenceChecker, DeformToEndPointTargets); shim, ffi, difftest runner, fixtures
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 00:33:41 -04:00
bherbruck 79a1430c48 curve.curve_p1: port SmCurve part 1 (GlobalPointSolve, SmCPGlobalSolver::LocalSolve, ApproximateCurve, TessellateByBisection, Tessellate, ClassifyIntersectingRangeSolution, sm_TestSpanAccuracy, sm_RefineCCSolutions); co-port IsLine dispatch and CacheMakeOrValidate's cache build; wire curve_p1 stubs
Difftest: 3083 cases, all non-deferred bit-identical, 590 deferred on
curve.curve_p5; --perturb SENSITIVE; 12,083-case run clean.

SolutionObject gains a default natural_interval() so IdenticalSolutions can
read a curve object's parameter interval, as upstream does.

Wired: nurbs.b_spline_curve_p1 TessellateByBisection (now green),
b_spline_curve_p2 ApproximateCurve, hyperbola GlobalPointSolveSTEP,
ellipse IntersectWithLine's line solve; the ellipse's own GlobalPointSolve
now waits on curve.ellipse_p1.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-13 00:32:35 -04:00
bherbruck 787d1725b7 merge main into unit/curve.curve_p3
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero

# Conflicts:
#	plan/findings.md
2026-10-12 23:54:56 -04:00
bherbruck 3ccf0cf85b curve.curve_p3: port SmCurve part 3 (ComputeCrvsNormal, CrvsFixGaps, FindParameterAtArcLength, LocalPointSolve/LocalCurveSolve/LocalCurveIntersect, SmCurvePropertyGS::LocalSolve, SmFindPCExtremaEFO, SmBestLineFitENFO); co-port SmCurve::IsLinear; wire curve_p3 stubs
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 23:54:45 -04:00
bherbruck fb40bd2e02 merge main into unit/surface.b_spline_volume
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 23:26:34 -04:00
bherbruck 08e0e0a872 merge main into unit/surface.b_spline_volume
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 23:24:10 -04:00
bherbruck fe2cfb5b39 surface.b_spline_volume: port SmBSplineVolume (USE_VOLUMES-less build) with shim, ffi, difftest runner and fixtures
BSplineVolume holds the NURBS record as VolumeKind::BSpline; the volume base
dispatches GetNaturalParamDomain, Copy, operator==, EvaluateSimple,
InvEvaluateGuessPointSimple, IsBoundedSimple and TransformSimple to it. The
SmBSplineVolume UNPORTED stub now only covers the surface.b_spline_volume_n_lib
overrides. difftest 2333 cases (333 fixture + 2000 generated), 0 deferred,
bit-identical; 30k-seed run clean; --perturb SENSITIVE.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 23:21:57 -04:00
bherbruck d8a9957bd9 merge main into unit/surface.twist_volume
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 23:21:13 -04:00
bherbruck a812067d47 surface.twist_volume: port SmTwistVolume, shim, ffi, difftest; wire twist overrides into SmVolume
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 23:20:49 -04:00
bherbruck a502bffff8 merge main into unit/curve.curve_p4
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero

# Conflicts:
#	plan/findings.md
2026-10-12 23:15:20 -04:00
bherbruck ea0d2bb315 curve.curve_p4: port SmCurve part 4 (chaining, closed/degenerate tests, polar box, AssertValid, analytic intersect, solver helpers, curve evaluator objects); wire SmCurve::IsDegenerate/IsClosed/AssertValid into the B-spline curve
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 23:15:01 -04:00
bherbruck a1c5402e57 merge main into unit/surface.volume_p1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 22:56:23 -04:00
bherbruck 47758968de surface.volume_p1: port SmVolume base class, lifts and ConcatEvals
Volume (kind enum: plain SmVolume, SmTransform, stand-ins for the unported
B-spline/bend/unbend/twist volumes) with orient and next maps: compound
Evaluate/Map/Orient through the chain rule, domain predicates, Transform,
copies, equality, discontinuities, SmFindPVIntersectENFO and the
smvol_Lift*Derivative / smvol_ConcatEvals helpers. Shim, ffi, runner and
886 fixture cases; difftest partial (2886 cases, 99 deferred on
surface.twist_volume / surface.unbend_volume), max_rel_err 0.

Wired UNPORTED(surface.volume_p1) stubs: curve.crv_in_volume now uses the
real Volume (deferred 604 -> 208), geom.transform IsKindOf and
SmDiscontinuities3d::Init (deferred 256 -> 3), geom.tol
GetScaledZero(const SmVolume&).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 22:56:19 -04:00
bherbruck e4a719906c merge main into unit/curve.ellipse_p2
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 22:42:36 -04:00
bherbruck 6d75c7ef69 curve.ellipse_p2: port SmEllipse part 2 and SmPolarConversion; wire Line::intersect_with_ellipse
Ellipse object, polar conversion table set-up and angle/NURB conversion, STEP
evaluation/inversion, DropPointFast, circle/circle and circle/line intersectors,
transform and queries; constructor and MakeNurb co-ported from curve.ellipse_p1.
C++ shim, ffi, difftest runner (102 fixtures + 2000 generated): 1767 pass
bit-identical, 335 deferred (curve.curve_p1, curve.curve_p5, curve.curve_p6,
curve.ellipse_p1). UNPORTED(curve.ellipse_p2) in curve.line wired: Line's
IntersectWithEllipse now takes an Ellipse.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 22:42:20 -04:00
bherbruck 57c446de1f merge main into unit/nurbs.b_spline_surface_p2 2026-10-12 22:29:24 -04:00
bherbruck 0184ffe6cf nurbs.b_spline_surface_p2: port SmBSplineSurface part 2 with shim, ffi, difftest
Iso curves, surfaces of revolution, spheres from arcs, trimmed planes from
ruled surfaces, control point access/editing, SetCanonical, CopySubPatch,
SplitAt, SwapUV, AdjustSTEPUVDomain and the back-edge stubs. difftest:
763 cases, 702 pass, 61 deferred, max_rel_err 0.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 22:29:24 -04:00
bherbruck 9e28271b06 merge main into unit/curve.line (curve.crv_in_volume, style batch 5)
curve.iso_curve report: 285 -> 221 deferred (SmLine in CreateUVIsoLine).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 22:13:38 -04:00
bherbruck 67d5dcd7a3 merge main into unit/curve.crv_in_volume 2026-10-12 22:08:07 -04:00
bherbruck 8df01425a3 merge main into unit/curve.crv_in_volume
CrvInVolume arms beside the new Iso/Offset kinds; OffsetCurve::approx_eq propagates
the fallible Curve::approx_eq (runners updated).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 22:08:05 -04:00
bherbruck f6d78ae4d6 merge main into unit/curve.line (nurbs.b_spline_surface_n_lib_p2)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 22:07:43 -04:00
bherbruck 57e4ef5ea7 merge main into unit/curve.line (curve.offset_curve)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V8ohWGLCzFPoZriCeSSero
2026-10-12 22:07:32 -04:00