forgecad 0.9.14 → 0.9.16

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 (239) hide show
  1. package/LICENSE +6 -4
  2. package/README.md +8 -4
  3. package/dist/assets/{AdminPage-eWGs2K6H.js → AdminPage-CXvls4-J.js} +2 -2
  4. package/dist/assets/{BenchmarkPage-CTrLKfpo.js → BenchmarkPage-B27zk8xL.js} +4 -15
  5. package/dist/assets/{BlogPage-5nPesyds.js → BlogPage-CMAVvgQL.js} +2 -2
  6. package/dist/assets/{DocsPage-C4Y3nbYc.js → DocsPage-knf4I4h7.js} +9 -3
  7. package/dist/assets/EditorApp-BHMQlJ-D.js +14686 -0
  8. package/dist/assets/{EditorApp-BAnckbsk.css → EditorApp-BpjZgzk0.css} +846 -0
  9. package/dist/assets/{EmbedViewer-C8fB4n5U.js → EmbedViewer-D7ZGlFjx.js} +3 -3
  10. package/dist/assets/{LandingPageProofDriven-jSz0LaMM.js → LandingPageProofDriven-CnevhTE8.js} +36 -38
  11. package/dist/assets/LegalPage-BPTUmqeg.js +39 -0
  12. package/dist/assets/LegalPage-BRlScr9A.css +91 -0
  13. package/dist/assets/{PricingPage-B83B90zh.js → PricingPage-B0D4goG_.js} +19 -19
  14. package/dist/assets/{PricingPage-BMedqFef.css → PricingPage-BPF6HKyO.css} +25 -0
  15. package/dist/assets/{SettingsPage-DY889pcu.js → SettingsPage-CFF-UgjI.js} +2 -2
  16. package/dist/assets/app-CE3sYcV7.css +3890 -0
  17. package/dist/assets/{app-bEww1ic4.js → app-T0pDcSX4.js} +3382 -1069
  18. package/dist/assets/cli/{render-Cho2uKG_.js → render-C5pcIISc.js} +477 -29
  19. package/dist/assets/{constructionHistoryWorker-HYwzJY4m.js → constructionHistoryWorker-Ba2Hm58b.js} +928 -243
  20. package/dist/assets/{evalWorker-CjQwJSE-.js → evalWorker-vkx310U2.js} +8883 -6040
  21. package/dist/assets/{forgecad_geometry-CH2nvuLA.js → forgecad_geometry-Dgceylq9.js} +43 -1
  22. package/dist/assets/forgecad_geometry_bg-dD4RNQF1.wasm +0 -0
  23. package/dist/assets/{inspectWorker-DeRnMVv1.js → inspectWorker-BuTJDVX6.js} +1179 -273
  24. package/dist/assets/{javascript-70-4uGcz.js → javascript-1kQXfVaz.js} +1 -1
  25. package/dist/assets/{targets-D6PWsv6X.js → jointPose-B_Cgedn9.js} +71 -3
  26. package/dist/assets/landing-proof-driven-DiGqdtWa.js +18 -0
  27. package/dist/assets/{landing-proof-driven-oFYW6mjz.css → landing-proof-driven-ORyigZ6p.css} +13 -7
  28. package/dist/assets/legalContent-ZfFGMmi4.js +251 -0
  29. package/dist/assets/{manifold-rmfAcdwF.js → manifold-BWgsjmAM.js} +1 -1
  30. package/dist/assets/{manifold-uRzgk5O8.js → manifold-D6IFSkhH.js} +2 -2
  31. package/dist/assets/{manifold-CG9Fokx-.js → manifold-rZexZI0G.js} +1 -1
  32. package/dist/assets/{reportWorker-4cW_ZpoS.js → reportWorker-0AGij1Ru.js} +8659 -12771
  33. package/dist/assets/{scalar-sampling-budget-CfDiFvh7.js → scalar-sampling-budget-J5cuzxT1.js} +8050 -6203
  34. package/dist/assets/{scanProxyWorker-Bs2TDgLw.js → scanProxyWorker-Vl4Wxa1y.js} +50 -6
  35. package/dist/assets/{solver-DuJAO8S6.js → solver-BZ9LPTHs.js} +1 -1
  36. package/dist/assets/solver_bg-DAHZJ_rw.wasm +0 -0
  37. package/dist/assets/{vendor-react-Da3A2QmU.js → vendor-react-6j1Kke-Y.js} +6 -5
  38. package/dist/cli/render.html +1 -1
  39. package/dist/docs/index.html +2 -2
  40. package/dist/docs-raw/AI/ai-native-cad.md +50 -0
  41. package/dist/docs-raw/AI/usage.md +5 -12
  42. package/dist/docs-raw/CLI.md +34 -10
  43. package/dist/docs-raw/component-model.md +27 -11
  44. package/dist/docs-raw/generated/assembly.md +374 -187
  45. package/dist/docs-raw/generated/concepts.md +245 -237
  46. package/dist/docs-raw/generated/core.md +283 -6
  47. package/dist/docs-raw/generated/curves.md +274 -361
  48. package/dist/docs-raw/generated/lib.md +9 -19
  49. package/dist/docs-raw/generated/output.md +29 -4
  50. package/dist/docs-raw/generated/runtime-names.md +49 -0
  51. package/dist/docs-raw/generated/sdf.md +31 -0
  52. package/dist/docs-raw/generated/sheet-metal.md +9 -0
  53. package/dist/docs-raw/generated/sketch.md +44 -1
  54. package/dist/docs-raw/generated/viewport.md +11 -3
  55. package/dist/docs-raw/guides/coordinate-system.md +20 -16
  56. package/dist/docs-raw/guides/geometry-conventions.md +2 -2
  57. package/dist/docs-raw/guides/inspection-bundles.md +2 -1
  58. package/dist/docs-raw/guides/joint-design.md +24 -0
  59. package/dist/docs-raw/guides/positioning.md +13 -3
  60. package/dist/docs-raw/legal/privacy.md +63 -0
  61. package/dist/docs-raw/legal/software-license.md +55 -0
  62. package/dist/docs-raw/legal/terms.md +87 -0
  63. package/dist/docs-raw/skills/forgecad-3d-reconstruction.md +1 -1
  64. package/dist/docs-raw/skills/forgecad-blockout-model.md +1 -1
  65. package/dist/docs-raw/skills/forgecad-component-model.md +11 -2
  66. package/dist/docs-raw/skills/forgecad-high-level-spec.md +1 -1
  67. package/dist/docs-raw/skills/forgecad-image-replicator.md +8 -8
  68. package/dist/docs-raw/skills/forgecad-lld.md +1 -1
  69. package/dist/docs-raw/skills/forgecad-make-a-model.md +40 -39
  70. package/dist/docs-raw/skills/forgecad-model-grader.md +2 -2
  71. package/dist/docs-raw/skills/forgecad-prepare-prompt.md +2 -2
  72. package/dist/docs-raw/skills/forgecad-project.md +3 -1
  73. package/dist/docs-raw/skills/forgecad-reconstruction-benchmark.md +1 -1
  74. package/dist/docs-raw/skills/forgecad-render-inspect.md +4 -2
  75. package/dist/docs-raw/skills/forgecad-visual-spec.md +1 -1
  76. package/dist/docs-raw/skills/forgecad.md +4 -3
  77. package/dist/docs-raw/welcome.md +2 -0
  78. package/dist/index.html +40 -12
  79. package/dist/llms.txt +8 -0
  80. package/dist/site.webmanifest +1 -1
  81. package/dist/sitemap.xml +49 -13
  82. package/dist-cli/{check-compiler-U5SOPN7X.js → check-compiler-SYQ2PWOB.js} +1 -2
  83. package/dist-cli/{check-query-propagation-XOKNSSYU.js → check-query-propagation-HIAGV62W.js} +1 -2
  84. package/dist-cli/{chunk-EXWGNL6K.js → chunk-SPZE3DUY.js} +20659 -17930
  85. package/dist-cli/forgecad.js +3568 -1250
  86. package/dist-cli/{forgecad_geometry-GYVNKPIE.js → forgecad_geometry-QOQIIP53.js} +42 -1
  87. package/dist-cli/forgecad_geometry_bg.wasm +0 -0
  88. package/dist-cli/{solver-46FFSK2U.js → solver-OK4HECRH.js} +0 -1
  89. package/dist-cli/solver_bg.wasm +0 -0
  90. package/dist-skill/CONTEXT.md +1192 -725
  91. package/dist-skill/SKILL.md +3 -2
  92. package/dist-skill/docs/API/core/concepts.md +64 -1
  93. package/dist-skill/docs/CLI.md +34 -10
  94. package/dist-skill/docs/generated/assembly.md +339 -213
  95. package/dist-skill/docs/generated/core.md +283 -6
  96. package/dist-skill/docs/generated/curves.md +272 -362
  97. package/dist-skill/docs/generated/lib.md +9 -19
  98. package/dist-skill/docs/generated/output.md +29 -4
  99. package/dist-skill/docs/generated/runtime-names.md +40 -0
  100. package/dist-skill/docs/generated/sdf.md +31 -0
  101. package/dist-skill/docs/generated/sheet-metal.md +9 -0
  102. package/dist-skill/docs/generated/sketch.md +44 -2
  103. package/dist-skill/docs/generated/viewport.md +2 -87
  104. package/dist-skill/docs/guides/coordinate-system.md +20 -16
  105. package/dist-skill/docs/guides/geometry-conventions.md +2 -2
  106. package/dist-skill/docs/guides/inspection-bundles.md +2 -1
  107. package/dist-skill/docs/guides/joint-design.md +24 -0
  108. package/dist-skill/docs/guides/positioning.md +13 -3
  109. package/dist-skill/library/forgecad-component-model/SKILL.md +10 -1
  110. package/dist-skill/library/forgecad-image-replicator/SKILL.md +6 -6
  111. package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.py +166 -0
  112. package/dist-skill/library/forgecad-make-a-model/SKILL.md +39 -38
  113. package/dist-skill/library/forgecad-model-grader/SKILL.md +1 -1
  114. package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +1 -1
  115. package/dist-skill/library/forgecad-project/SKILL.md +2 -0
  116. package/dist-skill/library/forgecad-render-inspect/SKILL.md +3 -1
  117. package/examples/api/assembly-kinematics-foundation.forge.js +65 -0
  118. package/examples/api/assembly-kinematics-four-bar.forge.js +115 -0
  119. package/examples/api/assembly-kinematics-limb.forge.js +116 -0
  120. package/examples/api/connector-frame-rig-chain.forge.js +102 -0
  121. package/examples/api/exact-sheet-shell-assembly.forge.js +0 -2
  122. package/examples/api/exact-surface-studio.forge.js +6 -8
  123. package/examples/api/helix-basics.forge.js +8 -8
  124. package/examples/api/lean-foundations/README.md +12 -0
  125. package/examples/api/lean-foundations/curve-blend-exact.forge.js +22 -0
  126. package/examples/api/lean-foundations/curve-fit-interpolation.forge.js +18 -0
  127. package/examples/api/lean-foundations/curve-helix-canonicalization.forge.js +27 -0
  128. package/examples/api/lean-foundations/curve-route-canonicalization.forge.js +16 -0
  129. package/examples/api/lean-foundations/curve-trim-reverse.forge.js +24 -0
  130. package/examples/api/lean-foundations/exact-curve-arc.forge.js +36 -0
  131. package/examples/api/mixed-edge-finishes-proof.forge.js +8 -11
  132. package/examples/api/route3d-elbow.forge.js +71 -0
  133. package/examples/api/transition-curves.forge.js +44 -15
  134. package/examples/api/variable-sweep-test.forge.js +3 -1
  135. package/examples/api/y-blend-corner-showcase.forge.js +0 -2
  136. package/examples/generative/coral-vase.forge.js +1 -1
  137. package/examples/nurbs-tube.forge.js +1 -1
  138. package/package.json +17 -13
  139. package/dist/assets/EditorApp-lXv53A1m.js +0 -13610
  140. package/dist/assets/app-CsHnaBWt.css +0 -1789
  141. package/dist/assets/forgecad_geometry_bg-C5_E9Oa9.wasm +0 -0
  142. package/dist/assets/solver_bg-CWvv4lnN.wasm +0 -0
  143. package/dist/docs-raw/API/README.md +0 -16
  144. package/dist/docs-raw/API/core/concepts.md +0 -118
  145. package/dist/docs-raw/INDEX.md +0 -138
  146. package/dist/docs-raw/RELEASING.md +0 -87
  147. package/dist/docs-raw/agent-native-api.md +0 -27
  148. package/dist/docs-raw/beta-deployment.md +0 -304
  149. package/dist/docs-raw/beta-operations.md +0 -325
  150. package/dist/docs-raw/blueprint-first.md +0 -145
  151. package/dist/docs-raw/cli-monetization.md +0 -112
  152. package/dist/docs-raw/coding-best-practices.md +0 -120
  153. package/dist/docs-raw/coding.md +0 -340
  154. package/dist/docs-raw/deployment.md +0 -374
  155. package/dist/docs-raw/guides/skill-maintenance.md +0 -161
  156. package/dist/docs-raw/guides/surface-members.md +0 -82
  157. package/dist/docs-raw/harbor-cli.md +0 -854
  158. package/dist/docs-raw/internals/backend-vocabulary.md +0 -35
  159. package/dist/docs-raw/internals/compiler.md +0 -307
  160. package/dist/docs-raw/internals/constraint-solver-quality.md +0 -161
  161. package/dist/docs-raw/internals/constraint-solver.md +0 -176
  162. package/dist/docs-raw/internals/shape-from-slices.md +0 -152
  163. package/dist/docs-raw/internals/sketch-2d-pipeline.md +0 -108
  164. package/dist/docs-raw/platform/admin.md +0 -45
  165. package/dist/docs-raw/platform/architecture.md +0 -82
  166. package/dist/docs-raw/platform/auth.md +0 -139
  167. package/dist/docs-raw/platform/email.md +0 -67
  168. package/dist/docs-raw/platform/google-oauth-setup.md +0 -88
  169. package/dist/docs-raw/platform/observability.md +0 -197
  170. package/dist/docs-raw/platform/projects.md +0 -111
  171. package/dist/docs-raw/platform/sharing.md +0 -90
  172. package/dist/docs-raw/product/README.md +0 -39
  173. package/dist/docs-raw/product/api-as-product-language.md +0 -13
  174. package/dist/docs-raw/product/business-model.md +0 -15
  175. package/dist/docs-raw/product/competitive-positioning.md +0 -17
  176. package/dist/docs-raw/product/creative-manufacturing.md +0 -15
  177. package/dist/docs-raw/product/founder-story.md +0 -11
  178. package/dist/docs-raw/product/manufacturing-workflows.md +0 -15
  179. package/dist/docs-raw/product/onboarding-first-experience.md +0 -256
  180. package/dist/docs-raw/product/product-loop.md +0 -17
  181. package/dist/docs-raw/product/strategic-decisions.md +0 -22
  182. package/dist/docs-raw/product/user-outreach-email-templates.md +0 -161
  183. package/dist/docs-raw/product/user-segments.md +0 -15
  184. package/dist/docs-raw/product/vision.md +0 -26
  185. package/dist/docs-raw/rl-environments.md +0 -350
  186. package/dist/docs-raw/runbook.md +0 -611
  187. package/dist-cli/check-compiler-U5SOPN7X.js.map +0 -1
  188. package/dist-cli/check-query-propagation-XOKNSSYU.js.map +0 -1
  189. package/dist-cli/chunk-EXWGNL6K.js.map +0 -1
  190. package/dist-cli/forgecad.js.map +0 -1
  191. package/dist-cli/forgecad_geometry-GYVNKPIE.js.map +0 -1
  192. package/dist-cli/solver-46FFSK2U.js.map +0 -1
  193. package/dist-skill/SKILL-dev.md +0 -145
  194. package/dist-skill/docs-dev/API/core/concepts.md +0 -118
  195. package/dist-skill/docs-dev/CLI.md +0 -677
  196. package/dist-skill/docs-dev/agent-native-api.md +0 -27
  197. package/dist-skill/docs-dev/blueprint-first.md +0 -145
  198. package/dist-skill/docs-dev/coding-best-practices.md +0 -120
  199. package/dist-skill/docs-dev/coding.md +0 -340
  200. package/dist-skill/docs-dev/component-model.md +0 -164
  201. package/dist-skill/docs-dev/generated/assembly.md +0 -794
  202. package/dist-skill/docs-dev/generated/core.md +0 -2117
  203. package/dist-skill/docs-dev/generated/curves.md +0 -2583
  204. package/dist-skill/docs-dev/generated/lib.md +0 -169
  205. package/dist-skill/docs-dev/generated/output.md +0 -247
  206. package/dist-skill/docs-dev/generated/sdf.md +0 -446
  207. package/dist-skill/docs-dev/generated/sheet-metal.md +0 -504
  208. package/dist-skill/docs-dev/generated/sketch.md +0 -1811
  209. package/dist-skill/docs-dev/generated/viewport.md +0 -585
  210. package/dist-skill/docs-dev/generated/wood.md +0 -108
  211. package/dist-skill/docs-dev/guides/coordinate-system.md +0 -46
  212. package/dist-skill/docs-dev/guides/geometry-conventions.md +0 -52
  213. package/dist-skill/docs-dev/guides/inspection-bundles.md +0 -485
  214. package/dist-skill/docs-dev/guides/joint-design.md +0 -78
  215. package/dist-skill/docs-dev/guides/modeling-recipes.md +0 -78
  216. package/dist-skill/docs-dev/guides/positioning.md +0 -161
  217. package/dist-skill/docs-dev/guides/skill-maintenance.md +0 -161
  218. package/dist-skill/docs-dev/internals/backend-vocabulary.md +0 -35
  219. package/dist-skill/docs-dev/internals/compiler.md +0 -307
  220. package/dist-skill/docs-dev/internals/constraint-solver-quality.md +0 -161
  221. package/dist-skill/docs-dev/internals/constraint-solver.md +0 -176
  222. package/dist-skill/docs-dev/internals/sketch-2d-pipeline.md +0 -108
  223. package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.mjs +0 -289
  224. package/examples/api/bolted-service-cover.forge.js +0 -17
  225. package/examples/api/cable-gland-anchor.forge.js +0 -14
  226. package/examples/api/captured-cartridge-guide.forge.js +0 -14
  227. package/examples/api/captured-linear-slide.forge.js +0 -13
  228. package/examples/api/clevis-pin-joint.forge.js +0 -13
  229. package/examples/api/datum-enclosure.forge.js +0 -16
  230. package/examples/api/hose-barb-port.forge.js +0 -14
  231. package/examples/api/knuckled-hinge-assembly.forge.js +0 -15
  232. package/examples/api/living-hinge-cover.forge.js +0 -14
  233. package/examples/api/pcb-terminal-block.forge.js +0 -22
  234. package/examples/api/pinned-lever-pivot-stack.forge.js +0 -14
  235. package/examples/api/retained-shaft-knob-stack.forge.js +0 -15
  236. package/examples/api/routed-tube-clip.forge.js +0 -15
  237. package/examples/api/seated-bearing-stack.forge.js +0 -30
  238. package/examples/api/snap-latch-cover.forge.js +0 -14
  239. package/examples/api/thumb-screw-clamp.forge.js +0 -15
@@ -7569,14 +7569,16 @@ function createScanProxyGeometry(source, options = {}) {
7569
7569
  addLookup(lookup, shell, "shell");
7570
7570
  addLookup(lookup, hiddenInterior, "core");
7571
7571
  const shellMesh = buildCellGeometry(shell, "shell", spec, lookup);
7572
+ const cellCenters = buildCellCenterGeometry(shell, spec);
7572
7573
  const coreMesh = { geometry: null, faces: 0 };
7573
7574
  const signalMesh = { geometry: null, faces: 0 };
7574
7575
  applyOutputMatrix(shellMesh.geometry, options.outputMatrix);
7576
+ applyOutputMatrix(cellCenters, options.outputMatrix);
7575
7577
  applyOutputMatrix(coreMesh.geometry, options.outputMatrix);
7576
7578
  applyOutputMatrix(signalMesh.geometry, options.outputMatrix);
7577
7579
  const sourceBytes = options.sourceBytes ?? scanProxySourceBytes(source);
7578
7580
  const proxyTriangles = (shellMesh.faces + coreMesh.faces + signalMesh.faces) * 2;
7579
- const proxyBytes = geometryBytes(shellMesh.geometry) + geometryBytes(coreMesh.geometry) + geometryBytes(signalMesh.geometry);
7581
+ const proxyBytes = geometryBytes(shellMesh.geometry) + geometryBytes(coreMesh.geometry) + geometryBytes(signalMesh.geometry) + geometryBytes(cellCenters);
7580
7582
  const isTriangleLighter = proxyTriangles < sourceTriangles;
7581
7583
  const isByteLighter = proxyBytes < sourceBytes;
7582
7584
  return {
@@ -7585,7 +7587,9 @@ function createScanProxyGeometry(source, options = {}) {
7585
7587
  core: coreMesh.geometry,
7586
7588
  signal: signalMesh.geometry
7587
7589
  },
7590
+ cellCenters,
7588
7591
  cellSize: spec.cellSize,
7592
+ grid: scanProxyGridFromSpec(spec),
7589
7593
  cells: {
7590
7594
  shell: shell.size,
7591
7595
  core: 0,
@@ -7627,15 +7631,18 @@ function scanProxyPayloadTransferables(payload) {
7627
7631
  const transferables = [];
7628
7632
  for (const layer of Object.values(payload.geometries)) {
7629
7633
  if (!layer) continue;
7630
- transferables.push(layer.positions.buffer, layer.normals.buffer);
7634
+ transferables.push(layer.positions.buffer, layer.normals.buffer, layer.cells.buffer);
7631
7635
  }
7636
+ if (payload.cellCenters) transferables.push(payload.cellCenters.positions.buffer);
7632
7637
  return transferables;
7633
7638
  }
7634
7639
  function disposeScanProxyGeometry(proxy) {
7640
+ var _a;
7635
7641
  if (!proxy) return;
7636
7642
  for (const geometry of Object.values(proxy.geometries)) {
7637
7643
  geometry == null ? void 0 : geometry.dispose();
7638
7644
  }
7645
+ (_a = proxy.cellCenters) == null ? void 0 : _a.dispose();
7639
7646
  }
7640
7647
  function scanProxyGeometryToPayload(proxy) {
7641
7648
  return {
@@ -7644,22 +7651,50 @@ function scanProxyGeometryToPayload(proxy) {
7644
7651
  core: layerPayloadFromGeometry(proxy.geometries.core),
7645
7652
  signal: layerPayloadFromGeometry(proxy.geometries.signal)
7646
7653
  },
7654
+ cellCenters: pointPayloadFromGeometry(proxy.cellCenters),
7647
7655
  cellSize: proxy.cellSize,
7656
+ grid: proxy.grid,
7648
7657
  cells: proxy.cells,
7649
7658
  faces: proxy.faces,
7650
7659
  telemetry: proxy.telemetry
7651
7660
  };
7652
7661
  }
7662
+ function pointPayloadFromGeometry(geometry) {
7663
+ if (!geometry) return null;
7664
+ const positions = geometry.getAttribute("position");
7665
+ if (!positions) return null;
7666
+ return {
7667
+ positions: positions.array
7668
+ };
7669
+ }
7653
7670
  function layerPayloadFromGeometry(geometry) {
7654
7671
  if (!geometry) return null;
7655
7672
  const positions = geometry.getAttribute("position");
7656
7673
  const normals = geometry.getAttribute("normal");
7657
- if (!positions || !normals) return null;
7674
+ const cells = geometry.getAttribute("scanCell");
7675
+ if (!positions || !normals || !cells) return null;
7658
7676
  return {
7659
7677
  positions: positions.array,
7660
- normals: normals.array
7678
+ normals: normals.array,
7679
+ cells: cells.array
7661
7680
  };
7662
7681
  }
7682
+ function buildCellCenterGeometry(cells, spec) {
7683
+ if (cells.size === 0) return null;
7684
+ const positions = new Float32Array(cells.size * 3);
7685
+ let index = 0;
7686
+ for (const cell of cells.values()) {
7687
+ const center = cellCenter(cell, spec);
7688
+ positions[index] = center.x;
7689
+ positions[index + 1] = center.y;
7690
+ positions[index + 2] = center.z;
7691
+ index += 3;
7692
+ }
7693
+ const geometry = new BufferGeometry();
7694
+ geometry.setAttribute("position", new BufferAttribute(positions, 3));
7695
+ geometry.computeBoundingSphere();
7696
+ return geometry;
7697
+ }
7663
7698
  function sampleShellCells(source, position, triangleCount, spec, sourceMatrix) {
7664
7699
  const shell = /* @__PURE__ */ new Map();
7665
7700
  const index = source.index;
@@ -7748,6 +7783,7 @@ function buildCellGeometry(cells, material, spec, lookup) {
7748
7783
  if (cells.size === 0) return { geometry: null, faces: 0 };
7749
7784
  const positions = [];
7750
7785
  const normals = [];
7786
+ const cellCoords = [];
7751
7787
  let faces = 0;
7752
7788
  for (const cell of cells.values()) {
7753
7789
  for (const dir of FACE_DIRS) {
@@ -7755,7 +7791,7 @@ function buildCellGeometry(cells, material, spec, lookup) {
7755
7791
  const neighborMaterial = lookup.get(neighborKey);
7756
7792
  if (neighborMaterial === material) continue;
7757
7793
  if (neighborMaterial && neighborMaterial !== "shell") continue;
7758
- addFace(positions, normals, cell, dir, spec);
7794
+ addFace(positions, normals, cellCoords, cell, dir, spec);
7759
7795
  faces += 1;
7760
7796
  }
7761
7797
  }
@@ -7763,10 +7799,11 @@ function buildCellGeometry(cells, material, spec, lookup) {
7763
7799
  const geometry = new BufferGeometry();
7764
7800
  geometry.setAttribute("position", new Float32BufferAttribute(positions, 3));
7765
7801
  geometry.setAttribute("normal", new Float32BufferAttribute(normals, 3));
7802
+ geometry.setAttribute("scanCell", new Float32BufferAttribute(cellCoords, 3));
7766
7803
  geometry.computeBoundingSphere();
7767
7804
  return { geometry, faces };
7768
7805
  }
7769
- function addFace(positions, normals, cell, dir, spec) {
7806
+ function addFace(positions, normals, cellCoords, cell, dir, spec) {
7770
7807
  const half = (spec.cellSize - scanProxyCellGap(spec.cellSize)) / 2;
7771
7808
  const center = cellCenter(cell, spec);
7772
7809
  const normal = new Vector3(dir.normal[0], dir.normal[1], dir.normal[2]);
@@ -7784,6 +7821,7 @@ function addFace(positions, normals, cell, dir, spec) {
7784
7821
  for (const point of pts) {
7785
7822
  positions.push(point.x, point.y, point.z);
7786
7823
  normals.push(normal.x, normal.y, normal.z);
7824
+ cellCoords.push(cell.ix, cell.iy, cell.iz);
7787
7825
  }
7788
7826
  }
7789
7827
  function boundsForPosition(position, matrix) {
@@ -7868,6 +7906,12 @@ function cellCenter(cell, spec) {
7868
7906
  spec.min.z + (cell.iz + 0.5) * spec.cellSize
7869
7907
  );
7870
7908
  }
7909
+ function scanProxyGridFromSpec(spec) {
7910
+ return {
7911
+ cellSize: spec.cellSize,
7912
+ origin: [spec.min.x, spec.min.y, spec.min.z]
7913
+ };
7914
+ }
7871
7915
  function clampCellIndex(index, count) {
7872
7916
  return Math.max(0, Math.min(count - 1, index));
7873
7917
  }
@@ -328,7 +328,7 @@ async function __wbg_init(module_or_path) {
328
328
  }
329
329
  }
330
330
  if (module_or_path === void 0) {
331
- module_or_path = new URL("/assets/solver_bg-CWvv4lnN.wasm", import.meta.url);
331
+ module_or_path = new URL("/assets/solver_bg-DAHZJ_rw.wasm", import.meta.url);
332
332
  }
333
333
  const imports = __wbg_get_imports();
334
334
  if (typeof module_or_path === "string" || typeof Request === "function" && module_or_path instanceof Request || typeof URL === "function" && module_or_path instanceof URL) {
@@ -15171,12 +15171,13 @@ export {
15171
15171
  reactDomExports as d,
15172
15172
  useSearchParams as e,
15173
15173
  useNavigate as f,
15174
- Routes as g,
15175
- Route as h,
15176
- getDefaultExportFromCjs as i,
15174
+ useLocation as g,
15175
+ Routes as h,
15176
+ Route as i,
15177
15177
  jsxRuntimeExports as j,
15178
- getAugmentedNamespace as k,
15179
- commonjsGlobal as l,
15178
+ getDefaultExportFromCjs as k,
15179
+ getAugmentedNamespace as l,
15180
+ commonjsGlobal as m,
15180
15181
  reactExports as r,
15181
15182
  schedulerExports as s,
15182
15183
  useParams as u
@@ -1,6 +1,6 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
- <head><title>ForgeCAD Headless Render</title> <script type="module" crossorigin src="/assets/cli/render-Cho2uKG_.js"></script>
3
+ <head><title>ForgeCAD Headless Render</title> <script type="module" crossorigin src="/assets/cli/render-C5pcIISc.js"></script>
4
4
  </head>
5
5
  <body>
6
6
  <canvas id="canvas" width="1024" height="1024"></canvas>