forgecad 0.9.16 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/dist/assets/{AdminPage-CXvls4-J.js → AdminPage-DcCnj0qo.js} +1 -1
  2. package/dist/assets/{BenchmarkPage-B27zk8xL.js → BenchmarkPage-BVEpJSVk.js} +1 -1
  3. package/dist/assets/{BlogPage-CMAVvgQL.js → BlogPage-DHaGP50_.js} +1 -1
  4. package/dist/assets/{DocsPage-knf4I4h7.js → DocsPage-CDoxHkz8.js} +40 -859
  5. package/dist/assets/EditorApp-BJ0Dloyh.js +16446 -0
  6. package/dist/assets/{EmbedViewer-D7ZGlFjx.js → EmbedViewer-CRKZbY0y.js} +2 -2
  7. package/dist/assets/{LandingPageProofDriven-CnevhTE8.js → LandingPageProofDriven-BxHkYRE7.js} +1 -1
  8. package/dist/assets/{LegalPage-BPTUmqeg.js → LegalPage-B-u6FrVv.js} +1 -1
  9. package/dist/assets/{PricingPage-B0D4goG_.js → PricingPage-CzpZ6-Ce.js} +1 -1
  10. package/dist/assets/{SettingsPage-CFF-UgjI.js → SettingsPage-CIZSSAd0.js} +1 -1
  11. package/dist/assets/{app-CE3sYcV7.css → app-CjsbDlb7.css} +143 -0
  12. package/dist/assets/{app-T0pDcSX4.js → app-DaTMg3nH.js} +1310 -290
  13. package/dist/assets/cli/{render-C5pcIISc.js → render-DPf4AYJK.js} +55 -60
  14. package/dist/assets/{constructionHistoryWorker-Ba2Hm58b.js → constructionHistoryWorker-AwMMWSxg.js} +1103 -349
  15. package/dist/assets/{evalWorker-vkx310U2.js → evalWorker-CjZZWRWW.js} +5209 -2643
  16. package/dist/assets/{inspectWorker-BuTJDVX6.js → inspectWorker-CZsCFtQT.js} +1163 -409
  17. package/dist/assets/{jointPose-B_Cgedn9.js → jointPose-DzQOViQH.js} +1 -1
  18. package/dist/assets/{manifold-BWgsjmAM.js → manifold-BYlzU521.js} +1 -1
  19. package/dist/assets/{manifold-D6IFSkhH.js → manifold-DgXo0T5P.js} +2 -2
  20. package/dist/assets/{manifold-rZexZI0G.js → manifold-K1SkarlQ.js} +1 -1
  21. package/dist/assets/{reportWorker-0AGij1Ru.js → reportWorker-B9nWwSrB.js} +8501 -3393
  22. package/dist/assets/{scalar-sampling-budget-J5cuzxT1.js → scalar-sampling-budget-prBw_s8t.js} +6067 -3479
  23. package/dist/assets/{scanProxyWorker-Vl4Wxa1y.js → scanProxyWorker-2GtDLk-R.js} +1 -1
  24. package/dist/assets/{javascript-1kQXfVaz.js → typescript-DBQ6RN5l.js} +874 -22
  25. package/dist/cli/render.html +1 -1
  26. package/dist/docs/index.html +3 -3
  27. package/dist/docs-raw/AI/usage.md +1 -1
  28. package/dist/docs-raw/CLI.md +77 -240
  29. package/dist/docs-raw/README.md +6 -0
  30. package/dist/docs-raw/component-model.md +17 -150
  31. package/dist/docs-raw/generated/assembly.md +188 -582
  32. package/dist/docs-raw/generated/concepts.md +259 -3501
  33. package/dist/docs-raw/generated/core.md +283 -1250
  34. package/dist/docs-raw/generated/curves.md +387 -1608
  35. package/dist/docs-raw/generated/legacy.md +162 -0
  36. package/dist/docs-raw/generated/lib.md +227 -85
  37. package/dist/docs-raw/generated/output.md +35 -99
  38. package/dist/docs-raw/generated/runtime-names.md +23 -23
  39. package/dist/docs-raw/generated/sdf.md +68 -284
  40. package/dist/docs-raw/generated/sheet-metal.md +68 -335
  41. package/dist/docs-raw/generated/sketch.md +240 -1161
  42. package/dist/docs-raw/generated/viewport.md +75 -316
  43. package/dist/docs-raw/generated/wood.md +21 -49
  44. package/dist/docs-raw/guides/coordinate-system.md +4 -42
  45. package/dist/docs-raw/guides/inspection-bundles.md +44 -442
  46. package/dist/docs-raw/guides/joint-design.md +18 -79
  47. package/dist/docs-raw/guides/positioning.md +21 -143
  48. package/dist/docs-raw/guides/scene-presentation.md +89 -0
  49. package/dist/docs-raw/guides/simready-quickstart.md +171 -0
  50. package/dist/docs-raw/simulation-workflow.md +273 -0
  51. package/dist/docs-raw/skills/forgecad-3d-reconstruction.md +25 -111
  52. package/dist/docs-raw/skills/forgecad-blockout-model.md +20 -117
  53. package/dist/docs-raw/skills/forgecad-component-model.md +23 -107
  54. package/dist/docs-raw/skills/forgecad-high-level-spec.md +47 -155
  55. package/dist/docs-raw/skills/forgecad-image-replicator.md +26 -143
  56. package/dist/docs-raw/skills/forgecad-lld.md +19 -113
  57. package/dist/docs-raw/skills/forgecad-make-a-model.md +112 -532
  58. package/dist/docs-raw/skills/forgecad-model-grader.md +38 -108
  59. package/dist/docs-raw/skills/forgecad-prepare-prompt.md +24 -211
  60. package/dist/docs-raw/skills/forgecad-project.md +13 -131
  61. package/dist/docs-raw/skills/forgecad-reconstruction-benchmark.md +42 -134
  62. package/dist/docs-raw/skills/forgecad-render-inspect.md +27 -174
  63. package/dist/docs-raw/skills/forgecad-visual-spec.md +32 -112
  64. package/dist/docs-raw/skills/forgecad.md +19 -18
  65. package/dist/docs-raw/skills/index.md +2 -0
  66. package/dist/docs-raw/welcome.md +2 -2
  67. package/dist/index.html +2 -2
  68. package/dist/llms.txt +1 -2
  69. package/dist/sitemap.xml +25 -13
  70. package/dist-cli/{check-compiler-SYQ2PWOB.js → check-compiler-II7NLPAB.js} +1 -1
  71. package/dist-cli/{check-query-propagation-HIAGV62W.js → check-query-propagation-7462TR3R.js} +1 -1
  72. package/dist-cli/{chunk-SPZE3DUY.js → chunk-UWTJCGXF.js} +5848 -2915
  73. package/dist-cli/forgecad.js +3496 -703
  74. package/dist-skill/CONTEXT.md +1797 -7963
  75. package/dist-skill/SKILL.md +15 -15
  76. package/dist-skill/docs/API/core/concepts.md +27 -157
  77. package/dist-skill/docs/CLI.md +77 -240
  78. package/dist-skill/docs/generated/assembly.md +182 -532
  79. package/dist-skill/docs/generated/core.md +283 -1250
  80. package/dist-skill/docs/generated/curves.md +387 -1609
  81. package/dist-skill/docs/generated/lib.md +227 -85
  82. package/dist-skill/docs/generated/output.md +35 -99
  83. package/dist-skill/docs/generated/runtime-names.md +16 -21
  84. package/dist-skill/docs/generated/sdf.md +68 -284
  85. package/dist-skill/docs/generated/sheet-metal.md +68 -335
  86. package/dist-skill/docs/generated/sketch.md +240 -1160
  87. package/dist-skill/docs/generated/viewport.md +75 -223
  88. package/dist-skill/docs/generated/wood.md +21 -49
  89. package/dist-skill/docs/guides/coordinate-system.md +4 -42
  90. package/dist-skill/docs/guides/inspection-bundles.md +44 -442
  91. package/dist-skill/docs/guides/joint-design.md +18 -79
  92. package/dist-skill/docs/guides/positioning.md +21 -143
  93. package/dist-skill/docs/guides/scene-presentation.md +89 -0
  94. package/dist-skill/docs/guides/surface-members.md +26 -0
  95. package/dist-skill/library/forgecad-3d-reconstruction/SKILL.md +23 -111
  96. package/dist-skill/library/forgecad-blockout-model/SKILL.md +18 -117
  97. package/dist-skill/library/forgecad-component-model/SKILL.md +21 -107
  98. package/dist-skill/library/forgecad-high-level-spec/SKILL.md +45 -155
  99. package/dist-skill/library/forgecad-image-replicator/SKILL.md +24 -143
  100. package/dist-skill/library/forgecad-lld/SKILL.md +17 -113
  101. package/dist-skill/library/forgecad-make-a-model/SKILL.md +110 -532
  102. package/dist-skill/library/forgecad-model-grader/SKILL.md +36 -108
  103. package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +35 -224
  104. package/dist-skill/library/forgecad-prepare-prompt/references/default-profiles.md +43 -271
  105. package/dist-skill/library/forgecad-prepare-prompt/references/master-prompt.md +30 -99
  106. package/dist-skill/library/forgecad-project/SKILL.md +13 -133
  107. package/dist-skill/library/forgecad-reconstruction-benchmark/SKILL.md +29 -123
  108. package/dist-skill/library/forgecad-render-inspect/SKILL.md +25 -174
  109. package/dist-skill/library/forgecad-visual-spec/SKILL.md +30 -111
  110. package/dist-skill/website/skills/forgecad-3d-reconstruction.md +58 -0
  111. package/dist-skill/website/skills/forgecad-blockout-model.md +49 -0
  112. package/dist-skill/website/skills/forgecad-component-model.md +53 -0
  113. package/dist-skill/website/skills/forgecad-high-level-spec.md +101 -0
  114. package/dist-skill/website/skills/forgecad-image-replicator.md +63 -0
  115. package/dist-skill/website/skills/forgecad-lld.md +41 -0
  116. package/dist-skill/website/skills/forgecad-make-a-model.md +186 -0
  117. package/dist-skill/website/skills/forgecad-model-grader.md +82 -0
  118. package/dist-skill/website/skills/forgecad-prepare-prompt.md +63 -0
  119. package/dist-skill/website/skills/forgecad-project.md +26 -0
  120. package/dist-skill/website/skills/forgecad-reconstruction-benchmark.md +60 -0
  121. package/dist-skill/website/skills/forgecad-render-inspect.md +80 -0
  122. package/dist-skill/website/skills/forgecad-visual-spec.md +71 -0
  123. package/dist-skill/website/skills/forgecad.md +122 -0
  124. package/dist-skill/website/skills/index.md +26 -0
  125. package/examples/api/comparison-imported-sphere-candidate.forge.js +1 -1
  126. package/examples/api/conformal-product-ribbon.forge.js +1 -1
  127. package/examples/api/exact-sheet-shell-assembly.forge.js +1 -1
  128. package/examples/api/extrude-options.forge.js +4 -2
  129. package/examples/api/field-loft-drive-tip.forge.js +40 -0
  130. package/examples/api/guided-loft-olive-oil-bottle.forge.js +1 -1
  131. package/examples/api/highlight-debug.forge.js +10 -10
  132. package/examples/api/mesh-import-slats.forge.js +1 -1
  133. package/examples/api/real-product-curves.forge.js +1 -1
  134. package/examples/api/sculpt-box-circle-booleans.forge.js +1 -1
  135. package/examples/api/sdf-shapes.forge.js +2 -5
  136. package/examples/api/sketch-rounding-strategies.forge.js +6 -6
  137. package/examples/api/surface-member-bottle-cage.forge.js +3 -3
  138. package/examples/api/surface-member-conformal-product-ribbon.forge.js +3 -3
  139. package/examples/api/surface-member-razor-inlay.forge.js +1 -1
  140. package/examples/api/variable-sweep-test.forge.js +3 -3
  141. package/examples/mechanical/airplane-propeller.forge.js +74 -39
  142. package/examples/nurbs-surface.forge.js +1 -1
  143. package/examples/products/iphone.forge.js +1 -1
  144. package/examples/robotics/README.md +46 -0
  145. package/examples/robotics/scout-cam-rover-simready/README.md +119 -0
  146. package/examples/robotics/scout-cam-rover-simready/lib/dims.js +140 -0
  147. package/examples/robotics/scout-cam-rover-simready/main.forge.js +343 -0
  148. package/examples/robotics/scout-cam-rover-simready/parts/body.forge.js +304 -0
  149. package/examples/robotics/scout-cam-rover-simready/parts/chassis.forge.js +320 -0
  150. package/examples/robotics/scout-cam-rover-simready/parts/hardware.forge.js +21 -0
  151. package/examples/robotics/scout-cam-rover-simready/parts/turret.forge.js +70 -0
  152. package/examples/robotics/scout-cam-rover-simready/parts/wheel.forge.js +116 -0
  153. package/examples/robotics/simready-asset-crate.forge.js +79 -0
  154. package/examples/robotics/simready-diff-drive-rover.forge.js +141 -0
  155. package/examples/robotics/simready-parallel-gripper.forge.js +102 -0
  156. package/package.json +1 -1
  157. package/dist/assets/EditorApp-BHMQlJ-D.js +0 -14686
  158. package/dist/docs-raw/guides/geometry-conventions.md +0 -52
  159. package/dist/docs-raw/guides/modeling-recipes.md +0 -78
  160. package/dist-skill/docs/guides/geometry-conventions.md +0 -52
  161. package/dist-skill/docs/guides/modeling-recipes.md +0 -78
  162. package/dist-skill/library/forgecad-visual-spec/references/prompt-template.md +0 -79
@@ -14,27 +14,22 @@ Agents should avoid declaring these names with top-level `const`, `let`, destruc
14
14
  These collision-reserved names are case-sensitive:
15
15
 
16
16
  ```text
17
- activateBackend, Analysis, arcSlot, assembly, Assembly, assemblyInstructions, assemblyPreview, Blend
18
- bom, bomToCsv, boolParam, box, cameraTrajectory, Carrier, chamfer, chamferTrackedEdge
19
- choiceParam, circle, circle2d, Circle2D, circularLayout, circularPattern, circularPattern2d, coalesceEdges
20
- combine, COMMON_KERFS, compareWith, composeChain, connector, console, constrainedSketch, Constraint
21
- Counterbore, Curve, Curve3D, cutPlane, cylinder, degrees, difference, difference2d
22
- dim, dimLine, draft, ellipse, explodeView, faceProfile, fillet, filletCorners
23
- filletTrackedEdge, fingerJoint, flatPanel, flatPart, formatInstructions, Function, gcode, GCodeBuilder
24
- getActiveBackend, global, globalThis, group, highlight, Import, ImportedAssembly, importMesh
25
- importStep, importSvgSketch, initKernel, intersection, intersection2d, intersectWithPlane, joint, jointsView
26
- laserKit, lib, line, Line2D, linearPattern, linearPattern2d, listParam, loadFont
27
- loft, Loft, lookupKerf, mirrorCopy, mock, ngon, NurbsCurve3D, nurbsSurface
28
- NurbsSurface, offsetSolid, param, Param, path, point, Point2D, Points
29
- polygon, polygonVertices, port, Product, ProductHandleBuilder, ProductHandleFeature, ProductPanelBuilder, ProductRibbonBuilder
30
- ProductSkin, ProductSkinBuilder, ProductSpoutBuilder, ProductStationBuilder, ProductSurfaceBuilder, ProductSurfaceRef, projectToPlane, queueMicrotask
31
- radians, rect, Rectangle2D, Ribs, robotExport, roundedRect, Route3D, scene
32
- Sculpt, sdf, SdfShape, selectEdge, selectEdges, self, setActiveBackend, setImmediate
33
- setInterval, setTimeout, Shape, ShapeGroup, sheetMetal, SheetMetalPart, sheetStock, Sketch
34
- sketchToDxf, sketchToSvg, slot, Slot, SolvedAssembly, spec, sphere, spline2d
35
- star, stroke, Surface, SurfaceBody, SurfaceMembers, surfacePatch, sweep, tabSlot
36
- text2d, textWidth, torus, toShape, Transform, union, union2d, variableSweep
37
- verify, viewConfig, Viewport, window, Wood
17
+ activateBackend, Analysis, arcSlot, assembly, Assembly, Blend, bom, box
18
+ cameraTrajectory, Carrier, chamfer, circle2d, Circle2D, circularLayout, circularPattern, circularPattern2d
19
+ coalesceEdges, compareWith, connector, console, constrainedSketch, Curve, Curve3D, cutPlane
20
+ cylinder, difference, difference2d, dim, draft, ellipse, explodeView, faceProfile
21
+ fillet, Function, gcode, GCodeBuilder, getActiveBackend, global, globalThis, group
22
+ Import, ImportedAssembly, initKernel, intersection, intersection2d, intersectWithPlane, joint, Laser
23
+ lib, Line2D, linearPattern, linearPattern2d, loadFont, loft, Loft, mirrorCopy
24
+ mock, ngon, NurbsCurve3D, NurbsSurface, offsetSolid, param, Param, path
25
+ Point2D, Points, polygon, polygonVertices, port, Product, ProductPanelBuilder, ProductRibbonBuilder
26
+ ProductSkin, ProductSkinBuilder, ProductStationBuilder, ProductSurfaceBuilder, ProductSurfaceRef, projectToPlane, queueMicrotask, rect
27
+ Rectangle2D, robotExport, roundedRect, Route3D, scene, Sculpt, sdf, SdfShape
28
+ selectEdge, selectEdges, self, setActiveBackend, setImmediate, setInterval, setTimeout, Shape
29
+ ShapeGroup, sheetMetal, SheetMetalPart, sheetStock, Sim, Sketch, sketchToDxf, sketchToSvg
30
+ slot, SolvedAssembly, spec, sphere, spline2d, stroke, Surface, SurfaceBody
31
+ SurfaceMembers, sweep, text2d, textWidth, torus, toShape, Transform, union
32
+ union2d, variableSweep, verify, Viewport, window, Wood
38
33
  ```
39
34
 
40
35
  `showLabels` is also a runtime global, but it is not part of the top-level collision check. Avoid reusing it unless you intentionally want a local value with that name.
@@ -9,7 +9,7 @@ Signed Distance Field modeling for organic forms, smooth booleans, TPMS lattices
9
9
 
10
10
  ## Contents
11
11
 
12
- - [SDF Materialization](#sdf-materialization) — `toShape`, `combine`
12
+ - [SDF Materialization](#sdf-materialization)
13
13
  - [SdfShape](#sdfshape)
14
14
  - [sdf](#sdf)
15
15
  - [Sculpt](#sculpt)
@@ -18,14 +18,10 @@ Signed Distance Field modeling for organic forms, smooth booleans, TPMS lattices
18
18
 
19
19
  ### SDF Materialization
20
20
 
21
- #### `toShape()` — Materialize one SDF leaf or all SDF leaves in a renderable tree.
21
+ #### `toShape(value: unknown, options?: SdfToShapeOptions): ToShapeTreeResult` — Materialize one SDF leaf or all SDF leaves in a renderable tree.
22
22
 
23
23
  Raw `SdfShape` values become mesh-backed [`Shape`](/docs/core#shape)s. Plain objects and arrays preserve their renderable children as a [`ShapeGroup`](/docs/core#shapegroup) when more than one leaf is found. Non-renderable metadata is ignored for materialization and remains available to callers through normal [`require()`](/docs/core#require) return values.
24
24
 
25
- ```ts
26
- toShape(value: unknown, options?: SdfToShapeOptions): ToShapeTreeResult
27
- ```
28
-
29
25
  **`SdfToShapeOptions`**
30
26
 
31
27
  | Option | Type | Description |
@@ -36,21 +32,11 @@ toShape(value: unknown, options?: SdfToShapeOptions): ToShapeTreeResult
36
32
  | `tolerance?` | `number` | Preferred absolute surface tolerance in millimeters. |
37
33
  | `minFeatureSize?` | `number` | Smallest feature that should survive meshing, in millimeters. |
38
34
  | `simplify?` | `boolean \| "safe"` | Simplification control. `false` disables, `true` and `'safe'` use topology-validated simplification. |
39
- | `maxTriangles?` | `number` | Optional post-extraction triangle budget. |
35
+ | `maxTriangles?` | `number` | Optional post-extraction triangle budget. Fractional values are floored for compatibility. |
40
36
  | `maxGridPoints?` | `number` | Optional pre-extraction grid-point budget. Default is browser-safe. |
41
37
  | `minEdgeLength?` | `number` | Lower clamp for resolved edge length. Default: 0.15mm. |
42
38
  | `diagnostics?` | `boolean` | Log resolved meshing settings and backend extraction timings. |
43
39
 
44
- #### `combine()` — Collapse a tree of SDF leaves into one continuous SDF field.
45
-
46
- This intentionally discards per-leaf color/material identity because the result is one scalar field. Use plain object returns for multi-material SDF preview, and use `combine(...)` only when you want one implicit body.
47
-
48
- ```ts
49
- combine(value: unknown, options?: CombineOptions): SdfShape
50
- ```
51
-
52
- `CombineOptions`: `{ op?: "union" | "intersection" }`
53
-
54
40
  ---
55
41
 
56
42
  ## Classes
@@ -59,288 +45,107 @@ combine(value: unknown, options?: CombineOptions): SdfShape
59
45
 
60
46
  An immutable SDF expression. Supports SDF-specific operations (smooth booleans, domain warps, etc.), can be returned directly for native preview, and converts to a ForgeCAD Shape via `.toShape()` when materialization is needed.
61
47
 
62
- #### `colorHex()` — Display color carried by this implicit leaf.
48
+ #### `get colorHex(): string | undefined` — Display color carried by this implicit leaf.
63
49
 
64
- ```ts
65
- get colorHex(): string | undefined
66
- ```
50
+ #### `get materialProps(): ShapeMaterialProps | undefined` — Display material carried by this implicit leaf.
67
51
 
68
- #### `materialProps()` — Display material carried by this implicit leaf.
52
+ #### `get explicitBounds(): SdfBounds | undefined` — Explicit bounds carried by this implicit leaf, if any.
69
53
 
70
- ```ts
71
- get materialProps(): ShapeMaterialProps | undefined
72
- ```
54
+ #### `clone(): SdfShape` — Clone this SDF expression and its visual metadata.
73
55
 
74
- #### `explicitBounds()` — Explicit bounds carried by this implicit leaf, if any.
56
+ #### `toShape(options?: SdfToShapeOptions): Shape` — Mesh this SDF into a ForgeCAD Shape through ForgeCAD's Surface Nets pipeline. Once converted, the result is a regular Shape — booleans, transforms, export all work.
75
57
 
76
- ```ts
77
- get explicitBounds(): SdfBounds | undefined
78
- ```
58
+ #### `color(value: string | undefined): SdfShape` — Set the display color for this implicit leaf.
79
59
 
80
- #### `clone()` — Clone this SDF expression and its visual metadata.
60
+ #### `material(props: ShapeMaterialProps): SdfShape` — Set PBR display material properties for this implicit leaf.
81
61
 
82
- ```ts
83
- clone(): SdfShape
84
- ```
85
-
86
- #### `toShape()` — Mesh this SDF into a ForgeCAD Shape through ForgeCAD's Surface Nets pipeline. Once converted, the result is a regular Shape — booleans, transforms, export all work.
87
-
88
- ```ts
89
- toShape(options?: SdfToShapeOptions): Shape
90
- ```
62
+ `ShapeMaterialProps` — defined in [core](/docs/core).
91
63
 
92
- #### `color()` — Set the display color for this implicit leaf.
93
-
94
- ```ts
95
- color(value: string | undefined): SdfShape
96
- ```
97
-
98
- #### `material()` — Set PBR display material properties for this implicit leaf.
99
-
100
- ```ts
101
- material(props: ShapeMaterialProps): SdfShape
102
- ```
103
-
104
- **`ShapeMaterialProps`**
105
-
106
- | Option | Type | Description |
107
- |--------|------|-------------|
108
- | `metalness?` | `number` | Metalness factor (0 = dielectric, 1 = metal). Default: 0.05 |
109
- | `roughness?` | `number` | Roughness factor (0 = mirror, 1 = fully diffuse). Default: 0.35 |
110
- | `emissive?` | `string` | Emissive glow color (hex string, e.g. "#ff6b35"). |
111
- | `emissiveIntensity?` | `number` | Emissive intensity multiplier. Default: 1 |
112
- | `opacity?` | `number` | Opacity (0 = fully transparent, 1 = fully opaque). Default: 1 |
113
- | `wireframe?` | `boolean` | Render as wireframe. Default: false |
114
- | `clearcoat?` | `number` | Clearcoat intensity (0–1). Default: 0.1 |
115
- | `clearcoatRoughness?` | `number` | Clearcoat roughness (0–1). Default: 0.4 |
116
- | `transmission?` | `number` | Glass/translucency transmission factor (0–1). Renderer support depends on target. |
117
- | `ior?` | `number` | Index of refraction for transmissive materials. Typical glass is ~1.45. |
118
- | `thickness?` | `number` | Approximate transmissive volume thickness in model units. |
119
- | `specularIntensity?` | `number` | Specular highlight intensity (0–1). |
120
- | `specularColor?` | `string` | Specular highlight tint. |
121
- | `reflectivity?` | `number` | Reflection strength for supported renderers (0–1). |
122
-
123
- #### `bounds()` — Set explicit preview/meshing bounds for this implicit leaf.
124
-
125
- ```ts
126
- bounds(bounds: SdfBounds | [ Vec3, Vec3 ]): SdfShape
127
- ```
64
+ #### `bounds(bounds: SdfBounds | [ Vec3, Vec3 ]): SdfShape` — Set explicit preview/meshing bounds for this implicit leaf.
128
65
 
129
66
  `SdfBounds`: `{ min: Vec3, max: Vec3 }`
130
67
 
131
- #### `at()` — Sculpt-style alias for translate().
132
-
133
- ```ts
134
- at(x: number, y: number, z: number): SdfShape
135
- ```
136
-
137
- #### `move()` — Sculpt-style alias for translate().
138
-
139
- ```ts
140
- move(x: number, y: number, z: number): SdfShape
141
- ```
142
-
143
- #### `spin()` — Sculpt-style alias for rotateZ().
144
-
145
- ```ts
146
- spin(angleDeg: number): SdfShape
147
- ```
148
-
149
- #### `tilt()` — Sculpt-style tilt around X, Y, Z, or a custom axis.
150
-
151
- ```ts
152
- tilt(angleDeg: number, axis?: "x" | "y" | "z" | Vec3): SdfShape
153
- ```
154
-
155
- #### `round()` — Sculpt-style rounded-box helper. Currently applies directly to primitive SDF boxes.
156
-
157
- ```ts
158
- round(radius: number): SdfShape
159
- ```
160
-
161
- #### `blend()` — Sculpt-style smooth blend with another implicit shape.
162
-
163
- ```ts
164
- blend(other: SdfShape, options?: number | { radius?: number; }): SdfShape
165
- ```
166
-
167
- #### `goop()` — Sculpt-style alias for blend().
168
-
169
- ```ts
170
- goop(other: SdfShape, options?: number | { radius?: number; }): SdfShape
171
- ```
172
-
173
- #### `carve()` — Sculpt-style smooth carve/subtract.
174
-
175
- ```ts
176
- carve(other: SdfShape, options?: number | { radius?: number; }): SdfShape
177
- ```
178
-
179
- #### `keep()` — Sculpt-style smooth intersection/keep operation.
180
-
181
- ```ts
182
- keep(other: SdfShape, options?: number | { radius?: number; }): SdfShape
183
- ```
184
-
185
- #### `polish()` — Apply a Sculpt material preset or direct material props.
186
-
187
- ```ts
188
- polish(input?: SculptPolishInput): SdfShape
189
- ```
190
-
191
- #### [`union()`](/docs/core#union) — SDF union (sharp).
192
-
193
- ```ts
194
- union(...others: SdfShape[]): SdfShape
195
- ```
196
-
197
- #### `subtract()` — SDF difference (sharp) — subtracts others from this.
198
-
199
- ```ts
200
- subtract(...others: SdfShape[]): SdfShape
201
- ```
202
-
203
- #### `intersect()` — SDF intersection (sharp).
68
+ #### `at(x: number, y: number, z: number): SdfShape` — Sculpt-style alias for translate().
204
69
 
205
- ```ts
206
- intersect(...others: SdfShape[]): SdfShape
207
- ```
208
-
209
- #### `clipBox()` — Clip this SDF to an explicit box-shaped design space.
70
+ #### `spin(angleDeg: number): SdfShape` — Sculpt-style alias for rotateZ().
210
71
 
211
- ```ts
212
- clipBox(x: number, y: number, z: number): SdfShape
213
- ```
72
+ #### `tilt(angleDeg: number, axis?: "x" | "y" | "z" | Vec3): SdfShape` — Sculpt-style tilt around X, Y, Z, or a custom axis.
214
73
 
215
- #### `fillWith()` — Keep only the material where this shape overlaps another SDF pattern.
74
+ #### `round(radius: number): SdfShape` — Round all edges of a primitive box while preserving its outer dimensions. Sugar over `offset()`: the box is shrunk by `radius` on every side, then dilated back out with `offset(radius)`, which rounds every edge and corner.
216
75
 
217
- ```ts
218
- fillWith(pattern: SdfShape): SdfShape
219
- ```
220
-
221
- #### `fillWithGyroid()` — Keep only the gyroid lattice inside this shape.
222
-
223
- ```ts
224
- fillWithGyroid(options: TpmsOptions): SdfShape
225
- ```
76
+ For any other shape, use `.offset(radius)` directly (note it grows the part by `radius`), or `Sculpt.box(x, y, z, { radius })` for a rounded box.
226
77
 
227
- **`TpmsOptions`**
228
- - `thickness?: number` — Dimensionless field threshold kept for compatibility. Prefer `wallThickness` for approximate millimeter units.
229
- - `wallThickness?: number` — Approximate physical wall thickness in millimeters.
230
- - `tpmsThicknessMode?: TpmsThicknessMode` — Override TPMS thickness interpretation. Defaults to metric when `wallThickness` is used, field-threshold when `thickness` is used.
231
- - Also: `cellSize: number`
78
+ #### `blend(other: SdfShape, options?: number | { radius?: number; }): SdfShape` — Sculpt-style smooth blend with another implicit shape.
232
79
 
233
- #### `fillWithSchwarzP()` Keep only the Schwarz-P lattice inside this shape.
80
+ #### `carve(other: SdfShape, options?: number | { radius?: number; }): SdfShape` — Sculpt-style smooth carve/subtract.
234
81
 
235
- ```ts
236
- fillWithSchwarzP(options: TpmsOptions): SdfShape
237
- ```
238
-
239
- #### `fillWithDiamond()` — Keep only the diamond TPMS lattice inside this shape.
240
-
241
- ```ts
242
- fillWithDiamond(options: TpmsOptions): SdfShape
243
- ```
244
-
245
- #### `fillWithLidinoid()` — Keep only the lidinoid TPMS lattice inside this shape.
246
-
247
- ```ts
248
- fillWithLidinoid(options: TpmsOptions): SdfShape
249
- ```
250
-
251
- #### `smoothUnion()` — Smooth union — blends shapes together with a smooth radius.
252
-
253
- ```ts
254
- smoothUnion(other: SdfShape, radius: number): SdfShape
255
- ```
256
-
257
- #### `smoothSubtract()` — Smooth difference — smoothly carves other from this.
258
-
259
- ```ts
260
- smoothSubtract(other: SdfShape, radius: number): SdfShape
261
- ```
82
+ #### `polish(input?: SculptPolishInput): SdfShape` — Apply a Sculpt material preset or direct material props.
262
83
 
263
- #### `smoothIntersect()` — Smooth intersection — smoothly intersects.
84
+ #### `union(...others: SdfShape[]): SdfShape` — SDF union (sharp).
264
85
 
265
- ```ts
266
- smoothIntersect(other: SdfShape, radius: number): SdfShape
86
+ ```js
87
+ sdf.box(20, 20, 8).union(sdf.cylinder(16, 6), sdf.sphere(7))
267
88
  ```
268
89
 
269
- #### `morph()` — Morph between this shape and another. t=0 this, t=1 → other.
90
+ #### `subtract(...others: SdfShape[]): SdfShape` — SDF difference (sharp) subtracts others from this.
270
91
 
271
- ```ts
272
- morph(other: SdfShape, t: number): SdfShape
273
- ```
92
+ #### `intersect(...others: SdfShape[]): SdfShape` — SDF intersection (sharp). Also the canonical way to fill a body with a lattice or clip an infinite field to a design space:
274
93
 
275
- #### `translate()` — Translate this SDF by the given offsets in millimeters.
94
+ ```js
95
+ // Lattice fill — keep only the gyroid inside the body
96
+ sdf.sphere(18).intersect(sdf.gyroid({ cellSize: 6, wallThickness: 0.8 }))
276
97
 
277
- ```ts
278
- translate(x: number, y: number, z: number): SdfShape
98
+ // Clip an infinite field to a box-shaped design space
99
+ sdf.gyroid({ cellSize: 6, wallThickness: 0.8 }).intersect(sdf.box(40, 25, 16))
279
100
  ```
280
101
 
281
- #### `rotate()` — Rotate around an arbitrary axis through the origin.
102
+ #### `smoothUnion(other: SdfShape, radius: number): SdfShape` — Smooth union blends shapes together with a smooth radius.
282
103
 
283
- ```ts
284
- rotate(axis: [ number, number, number ], angleDeg: number): SdfShape
285
- ```
104
+ #### `smoothSubtract(other: SdfShape, radius: number): SdfShape` — Smooth difference — smoothly carves other from this.
286
105
 
287
- #### `rotateX()` Rotate around the X axis by the given angle in degrees.
106
+ #### `smoothIntersect(other: SdfShape, radius: number): SdfShape` Smooth intersection smoothly intersects.
288
107
 
289
- ```ts
290
- rotateX(angleDeg: number): SdfShape
291
- ```
108
+ #### `morph(other: SdfShape, t: number): SdfShape` — Morph between this shape and another. t=0 → this, t=1 → other.
292
109
 
293
- #### `rotateY()` — Rotate around the Y axis by the given angle in degrees.
110
+ #### `translate(x: number, y: number, z: number): SdfShape` — Translate this SDF by the given offsets in millimeters.
294
111
 
295
- ```ts
296
- rotateY(angleDeg: number): SdfShape
297
- ```
112
+ #### `rotate(axis: Vec3, angleDeg: number): SdfShape` — Rotate around an arbitrary axis through the origin.
298
113
 
299
- #### `rotateZ()` — Rotate around the Z axis by the given angle in degrees.
114
+ #### `rotateX(angleDeg: number): SdfShape` — Rotate around the X axis by the given angle in degrees.
300
115
 
301
- ```ts
302
- rotateZ(angleDeg: number): SdfShape
303
- ```
116
+ #### `rotateY(angleDeg: number): SdfShape` — Rotate around the Y axis by the given angle in degrees.
304
117
 
305
- #### `scale()` — Uniformly scale this SDF around the origin.
118
+ #### `rotateZ(angleDeg: number): SdfShape` — Rotate around the Z axis by the given angle in degrees.
306
119
 
307
- ```ts
308
- scale(factor: number): SdfShape
309
- ```
120
+ #### `scale(factor: number): SdfShape` — Uniformly scale this SDF around the origin.
310
121
 
311
- #### `twist()` — Twist around the Z axis.
122
+ #### `twist(degreesPerUnit: number): SdfShape` — Twist around the Z axis.
312
123
 
313
- ```ts
314
- twist(degreesPerUnit: number): SdfShape
315
- ```
124
+ #### `bend(radius: number): SdfShape` — Bend around the Z axis with given radius.
316
125
 
317
- #### `bend()` — Bend around the Z axis with given radius.
126
+ #### `repeat(spacing: Vec3, count?: Vec3): SdfShape` — Repeat in space. Spacing of 0 on an axis means no repetition. Count of 0 = infinite.
318
127
 
319
- ```ts
320
- bend(radius: number): SdfShape
321
- ```
128
+ #### `circularArray(count: number, offset?: number): SdfShape` — Arrange this SDF in a circular array around the Z axis.
322
129
 
323
- #### `repeat()` Repeat in space. Spacing of 0 on an axis means no repetition. Count of 0 = infinite.
130
+ The source shape is translated by `offset` in +X before arraying. This uses angular domain folding, so evaluation stays O(1): the source SDF is sampled twice no matter how many copies are requested.
324
131
 
325
- ```ts
326
- repeat(spacing: Vec3, count?: Vec3): SdfShape
327
- ```
132
+ #### `shell(thickness: number): SdfShape` — Hollow out, keeping only a shell of given thickness.
328
133
 
329
- #### `circularArray()` — Arrange this SDF in a circular array around the Z axis.
134
+ #### `offset(distance: number): SdfShape` — Offset the distance field by a constant amount in millimeters.
330
135
 
331
- The source shape is translated by `offset` in +X before arraying. This uses angular domain folding, so evaluation stays O(1): the source SDF is sampled twice no matter how many copies are requested.
136
+ Positive `distance` dilates: every surface moves outward by `distance`, which rounds convex edges and corners — and grows the part by `distance`. Negative `distance` erodes: surfaces move inward, shrinking the part and thinning walls. This is the canonical SDF field offset (`d − distance`) and works on ANY implicit shape sharp booleans, TPMS lattices, `sdf.fromFunction()` fields — not just primitives.
332
137
 
333
- ```ts
334
- circularArray(count: number, offset?: number): SdfShape
335
- ```
138
+ Like `shell()`, the result is approximate on fields that are not exact distance fields (for example after `twist()`, `bend()`, or smooth booleans).
336
139
 
337
- #### `shell()` — Hollow out, keeping only a shell of given thickness.
140
+ ```js
141
+ // Round every edge of a sharp union by 2mm (grows the part by 2mm)
142
+ sdf.box(20, 20, 8).union(sdf.cylinder(16, 6)).offset(2)
338
143
 
339
- ```ts
340
- shell(thickness: number): SdfShape
144
+ // Erode a lattice by 0.2mm to compensate printed over-extrusion
145
+ sdf.sphere(18).intersect(sdf.gyroid({ cellSize: 6, wallThickness: 1.2 })).offset(-0.2)
341
146
  ```
342
147
 
343
- #### `displace()` — Displace the surface by a function of position, or by a pattern SdfShape.
148
+ #### `displace(fn: ((x: number, y: number, z: number) => number) | SdfShape, constants?: Record<string, number>): SdfShape` — Displace the surface by a function of position, or by a pattern SdfShape.
344
149
 
345
150
  ```js
346
151
  // Function displacement
@@ -350,11 +155,7 @@ shape.displace((x, y, z) => Math.sin(x) * 0.5)
350
155
  shape.displace(sdf.knurl({ pitch: 2, depth: 0.3 }))
351
156
  ```
352
157
 
353
- ```ts
354
- displace(fn: ((x: number, y: number, z: number) => number) | SdfShape, constants?: Record<string, number>): SdfShape
355
- ```
356
-
357
- #### `surfaceDisplace()` — Displace the surface using a 2D pattern in surface-local UV coordinates.
158
+ #### `surfaceDisplace(pattern: SurfacePattern | ((u: number, v: number) => number), options?: SurfaceDisplaceOptions): SdfShape` — Displace the surface using a 2D pattern in surface-local UV coordinates.
358
159
 
359
160
  Automatically detects the shape's UV parametrization (sphere, cylinder, torus) from the SDF tree. Falls back to triplanar mapping for arbitrary shapes.
360
161
 
@@ -376,19 +177,11 @@ sdf.sphere(27).shell(3)
376
177
  shape.surfaceDisplace((u, v) => -Math.sin(u * 2) * 0.3)
377
178
  ```
378
179
 
379
- ```ts
380
- surfaceDisplace(pattern: SurfacePattern | ((u: number, v: number) => number), options?: SurfaceDisplaceOptions): SdfShape
381
- ```
382
-
383
180
  **`SurfaceDisplaceOptions`**
384
181
  - `uv?: "auto" | "sphere" | "cylinder" | "torus" | "triplanar"` — Override auto-detected UV mode. Default: 'auto' (detects from SDF tree).
385
182
  - `triplanarSharpness?: number` — Triplanar blend sharpness — higher = crisper transitions. Default: 4. Only used in triplanar mode.
386
183
 
387
- #### `onion()` — Create concentric onion layers.
388
-
389
- ```ts
390
- onion(layers: number, thickness: number): SdfShape
391
- ```
184
+ #### `onion(layers: number, thickness: number): SdfShape` — Create concentric onion layers.
392
185
 
393
186
  ---
394
187
 
@@ -398,20 +191,13 @@ onion(layers: number, thickness: number): SdfShape
398
191
 
399
192
  SDF modeling — signed distance field primitives, smooth booleans, TPMS lattices, domain warps, and surface patterns.
400
193
 
401
- Return `SdfShape` values directly from a ForgeCAD script for native raymarch preview. Plain objects and arrays of SDF leaves are renderable too, so object keys become named preview parts.
402
-
403
- Call `.toShape()` or `toShape(...)` only when you need a mesh-backed ForgeCAD Shape for export, mesh booleans, or mixed SDF/manifold projects. All shapes live as a lazy expression tree until that materialization boundary.
404
-
405
- SDF is inherently implicit and sampled, not B-rep/exact geometry. Use it with caution when precision, tolerances, or exact export matter.
194
+ Return `SdfShape` values directly from a script for native raymarch preview; plain objects and arrays of SDF leaves render too (object keys become named preview parts). Shapes live as a lazy expression tree — call `.toShape()` / `toShape(...)` only at the materialization boundary: export, mesh booleans, or mixed SDF/manifold projects.
406
195
 
407
- ```js
408
- return sdf.smoothUnion(sdf.sphere(10), sdf.box(15, 15, 15), { radius: 3 })
409
- .color('#4488cc');
410
- ```
196
+ SDF geometry is implicit and sampled, not B-rep/exact. Use with caution when precision, tolerances, or exact export matter.
411
197
 
412
198
  ```js
413
199
  return {
414
- shell: sdf.sphere(20).shell(2).color('#9be7ff'),
200
+ shell: sdf.smoothUnion(sdf.sphere(10), sdf.box(15, 15, 15), { radius: 3 }).shell(2),
415
201
  core: sdf.gyroid({ cellSize: 6, wallThickness: 0.8 })
416
202
  .intersect(sdf.sphere(18))
417
203
  .color('#ffcf5a'),
@@ -427,14 +213,11 @@ return {
427
213
  - `smoothUnion(a: SdfShape, b: SdfShape, options: { radius: number; }): SdfShape` — Smooth union — blends shapes together with a smooth transition radius.
428
214
  - `smoothDifference(a: SdfShape, b: SdfShape, options: { radius: number; }): SdfShape` — Smooth difference — smoothly subtracts b from a.
429
215
  - `smoothIntersection(a: SdfShape, b: SdfShape, options: { radius: number; }): SdfShape` — Smooth intersection — smoothly intersects a and b.
430
- - `morph(a: SdfShape, b: SdfShape, t: number): SdfShape` — Morph between two SDF shapes. t=0 → a, t=1 → b.
431
216
  - `blend(a: SdfShape, b: SdfShape, fn: (x: number, y: number, z: number) => number, options?: BlendOptions): SdfShape` — Spatially blend between two SDF patterns. The blend function receives (x, y, z) and returns 0..1: 0 = fully pattern `a`, 1 = fully pattern `b`.
432
217
  - `gyroid(options: TpmsOptions): SdfShape` — Gyroid TPMS lattice — the most common lattice for additive manufacturing.
433
218
  - `schwarzP(options: TpmsOptions): SdfShape` — Schwarz-P TPMS lattice — isotropic pore structure.
434
219
  - `diamond(options: TpmsOptions): SdfShape` — Diamond TPMS lattice — stiffest TPMS structure.
435
220
  - `lidinoid(options: TpmsOptions): SdfShape` — Lidinoid TPMS lattice — visually distinct from gyroid, popular in research and art.
436
- - `tpmsBlock(options: TpmsBlockOptions): SdfShape` — TPMS block preset clipped to an explicit design space.
437
- - `withinBox(shape: SdfShape, options: { size: Vec3; }): SdfShape` — Clip an SDF shape to a box-shaped design space.
438
221
  - `noise(options?: NoiseOptions): SdfShape` — 3D Simplex noise field — produces organic, natural-looking displacements.
439
222
  - `voronoi(options?: VoronoiOptions): SdfShape` — 3D Voronoi pattern — organic cellular structures like bone, coral, or soap bubbles.
440
223
  - `honeycomb(options?: HoneycombOptions): SdfShape` — Honeycomb (hexagonal) lattice pattern. Intersect with your shape to apply.
@@ -446,13 +229,16 @@ return {
446
229
  - `weave(options?: WeaveOptions): SdfShape` — Grid lattice pattern — two families of infinite slabs crossing at 90°.
447
230
  - `basketWeave(options?: BasketWeaveOptions): SurfacePattern` — Basket weave surface pattern — threads with over-under crossings in UV space. Returns a SurfacePattern for use with `.surfaceDisplace()`.
448
231
  - `pattern2d(): Pattern2DBuilder` — Create typed, composable 2D surface patterns for `.surfaceDisplace()`.
449
- - `twist(shape: SdfShape, degreesPerUnit: number): SdfShape` — Twist an SDF shape around the Z axis.
450
- - `bend(shape: SdfShape, radius: number): SdfShape` — Bend an SDF shape around the Z axis.
451
- - `repeat(shape: SdfShape, spacing: Vec3, count?: Vec3): SdfShape` — Repeat an SDF shape in space.
452
- - `circularArray(shape: SdfShape, count: number, offset?: number): SdfShape` — Arrange an SDF shape in a circular array around the Z axis with O(1) folded-domain evaluation.
453
232
  - `SurfacePattern: typeof SurfacePattern` — A 2D surface pattern — a heightmap function for use with `.surfaceDisplace()`.
454
233
  - `fromFunction(fn: SdfFunctionSource, options: SdfFunctionOptions): SdfShape` — Create a custom SDF from one expression; shader-safe expressions raymarch directly.
455
- - `Sculpt: { sphere: (radius: number) => SdfShape; box: (x: number, y: number, z: number, options?: SculptBoxOptions) => SdfShape; cylinder: (height: number, radius: number) => SdfShape; disk: (radius: number, thickness?: number) => SdfShape; circle: (radius: number, thickness?: number) => SdfShape; capsule: (height: number, radius: number) => SdfShape; torus: (majorRadius: number, minorRadius: number) => SdfShape; cone: (height: number, radius: number) => SdfShape; tube: (points: SculptPointList, options?: SculptTubeOptions) => SdfShape; curve: (points: SculptPointList, options?: SculptTubeOptions) => SdfShape; path: (points: SculptPointList, options?: SculptTubeOptions) => SdfShape; blend: (first?: SculptBlendInput | SculptBlendOptions, optionsOrShape?: SculptBlendInput | SculptBlendOptions, ...rest: (SculptBlendInput | SculptBlendOptions)[]) => SdfShape; union: (first?: SculptBlendInput, ...rest: SculptBlendInput[]) => SdfShape; carve: (base: SdfShape, cutters: SculptBlendInput, options?: SculptBlendOptions) => SdfShape; keep: (first?: SculptBlendInput | SculptBlendOptions, optionsOrShape?: SculptBlendInput | SculptBlendOptions, ...rest: (SculptBlendInput | SculptBlendOptions)[]) => SdfShape; polish: (shape: SdfShape, input?: SculptPolishInput) => SdfShape; material: (input?: SculptPolishInput) => ShapeMaterialProps & { color?: string; }; look: (preset?: SculptLookPreset) => SceneOptions; knownMaterials: typeof knownSculptMaterialPresets; }` Sculpt-like facade: friendly liquid-modeling verbs backed by the same SDF kernel.
234
+ - `combine(value: unknown, options?: CombineOptions): SdfShape` Collapse a plain object/array tree of SDF leaves into one continuous implicit field. Per-leaf color/material identity is intentionally discarded the result is one scalar field. Use plain object returns for multi-material SDF preview, and `sdf.combine(...)` only when you want one implicit body. Explicit shape lists are covered by `a.union(b, c)`; pass `{ op: 'intersection' }` to intersect instead.
235
+
236
+ ```js
237
+ // Built a part as a named tree for preview, now need one field to shell:
238
+ const parts = { body: sdf.box(40, 30, 12), boss: sdf.cylinder(10, 8) };
239
+ return sdf.combine(parts).shell(1.2);
240
+ ```
241
+ - `Sculpt: { ... }` — Sculpt-like facade: friendly liquid-modeling verbs backed by the same SDF kernel. See [`Sculpt`](#sculpt).
456
242
 
457
243
  ### `Sculpt`
458
244
 
@@ -460,13 +246,11 @@ return {
460
246
  - `box(x: number, y: number, z: number, options?: SculptBoxOptions): SdfShape` — Create a liquid SDF box; pass `{ radius }` for a rounded box.
461
247
  - `cylinder(height: number, radius: number): SdfShape` — Create a liquid SDF cylinder centered at the origin, axis along Z.
462
248
  - `disk(radius: number, thickness?: number): SdfShape` — Create a thin circular disk centered at the origin, axis along Z. Useful as a circular cutter or insert.
463
- - `circle(radius: number, thickness?: number): SdfShape` — Alias for `Sculpt.disk()`.
464
249
  - `capsule(height: number, radius: number): SdfShape` — Create a liquid SDF capsule centered at the origin, axis along Z.
465
250
  - `torus(majorRadius: number, minorRadius: number): SdfShape` — Create a liquid SDF torus lying in the XY plane.
466
251
  - `cone(height: number, radius: number): SdfShape` — Create a liquid SDF cone.
467
252
  - `tube(points: SculptPointList, options?: SculptTubeOptions): SdfShape` — Create a smooth tube through a list of 3D points.
468
253
  - `curve(points: SculptPointList, options?: SculptTubeOptions): SdfShape` — Create a smooth variable-thickness sweep through 3D control points.
469
- - `path(points: SculptPointList, options?: SculptTubeOptions): SdfShape` — Alias for `Sculpt.tube()`; points may use [x, y, z, radius] for variable thickness.
470
254
  - `blend(first?: SculptBlendArg, optionsOrShape?: SculptBlendArg, ...rest: SculptBlendArg[]): SdfShape` — Smoothly blend one or more SDF shapes into a continuous body.
471
255
  - `union(first?: SculptBlendInput, ...rest: SculptBlendInput[]): SdfShape` — Sharply union one or more SDF shapes.
472
256
  - `carve(base: SdfShape, cutters: SculptBlendInput, options?: SculptBlendOptions): SdfShape` — Smoothly subtract one or more cutter shapes from a base shape.