@metamesh/modeling 0.17.0 → 0.19.0

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 (832) hide show
  1. package/CHANGELOG.md +186 -0
  2. package/README.md +147 -157
  3. package/dist/api/engine.d.ts +106 -83
  4. package/dist/api/export-3mf.d.ts +2 -0
  5. package/dist/api/export-glb.d.ts +2 -0
  6. package/dist/api/export-stl.d.ts +2 -0
  7. package/dist/api/export.d.ts +160 -0
  8. package/dist/api/geometry.d.ts +250 -461
  9. package/dist/api/index.d.ts +470 -445
  10. package/dist/api/mesh.d.ts +489 -0
  11. package/dist/api/text.d.ts +1 -1
  12. package/dist/docs/guides/concepts.md +32 -495
  13. package/dist/docs/guides/fonts.md +14 -13
  14. package/dist/docs/guides/fundamentals.md +30 -29
  15. package/dist/docs/guides/generation.md +84 -64
  16. package/dist/docs/guides/geometry-values.md +193 -0
  17. package/dist/docs/guides/hosting.md +147 -48
  18. package/dist/docs/guides/profiles-and-extrusion.md +252 -0
  19. package/dist/docs/guides/recipes.md +33 -769
  20. package/dist/docs/guides/resolution-and-inspection.md +133 -0
  21. package/dist/docs/guides/solid-joins.md +126 -0
  22. package/dist/docs/guides/standalone-model.md +8 -7
  23. package/dist/docs/guides/svg-and-text.md +215 -0
  24. package/dist/docs/guides/sweeps-and-lofts.md +179 -0
  25. package/dist/docs/guides/transforms-and-placement.md +313 -0
  26. package/dist/docs/manifest.json +3224 -4430
  27. package/dist/docs/reference/engine/GenerationOptions.md +12 -5
  28. package/dist/docs/reference/engine/GeometryResource.md +19 -13
  29. package/dist/docs/reference/engine/ModelDependencies.md +9 -3
  30. package/dist/docs/reference/engine/ModelEngine.md +33 -24
  31. package/dist/docs/reference/engine/ModelEngineOptions.md +13 -2
  32. package/dist/docs/reference/engine/ModelPart.md +114 -0
  33. package/dist/docs/reference/engine/ModelResult.md +181 -0
  34. package/dist/docs/reference/engine/ModelRunArguments.md +34 -0
  35. package/dist/docs/reference/engine/ModelRunOptions.md +110 -0
  36. package/dist/docs/reference/engine/ModelSession.md +22 -16
  37. package/dist/docs/reference/engine/SessionOptions.md +21 -10
  38. package/dist/docs/reference/engine/categories/host-lifecycle.md +20 -15
  39. package/dist/docs/reference/engine/checkModel.md +49 -0
  40. package/dist/docs/reference/engine/createModelEngine.md +11 -13
  41. package/dist/docs/reference/engine/defaultModelingLimits.md +15 -2
  42. package/dist/docs/reference/engine/modelingWasmUrl.md +7 -1
  43. package/dist/docs/reference/engine.md +8 -15
  44. package/dist/docs/reference/export/Export3mfOptions.md +24 -0
  45. package/dist/docs/reference/export/ExportDiagnostic.md +59 -0
  46. package/dist/docs/reference/export/ExportFormat.md +25 -0
  47. package/dist/docs/reference/export/ExportGeometry.md +39 -0
  48. package/dist/docs/reference/export/ExportGlbOptions.md +118 -0
  49. package/dist/docs/reference/export/ExportLimits.md +83 -0
  50. package/dist/docs/reference/export/ExportMaterial.md +47 -0
  51. package/dist/docs/reference/export/ExportOptions.md +94 -0
  52. package/dist/docs/reference/export/ExportPart.md +88 -0
  53. package/dist/docs/reference/export/ExportReport.md +82 -0
  54. package/dist/docs/reference/export/ExportSink.md +39 -0
  55. package/dist/docs/reference/export/ExportStlOptions.md +24 -0
  56. package/dist/docs/reference/export/ExportedFile.md +110 -0
  57. package/dist/docs/reference/export/categories/mesh-serialization.md +47 -0
  58. package/dist/docs/reference/export/defaultExportLimits.md +20 -0
  59. package/dist/docs/reference/export/export3mf.md +64 -0
  60. package/dist/docs/reference/export/exportGlb.md +68 -0
  61. package/dist/docs/reference/export/exportStl.md +64 -0
  62. package/dist/docs/reference/export/write3mf.md +71 -0
  63. package/dist/docs/reference/export/writeGlb.md +75 -0
  64. package/dist/docs/reference/export/writeStl.md +71 -0
  65. package/dist/docs/reference/export.md +21 -0
  66. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +16 -2
  67. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +7 -1
  68. package/dist/docs/reference/geometry/Anchor3-type.md +13 -3
  69. package/dist/docs/reference/geometry/ArcCurve2.md +8 -2
  70. package/dist/docs/reference/geometry/ArcCurve3.md +8 -2
  71. package/dist/docs/reference/geometry/AttachOptions.md +13 -3
  72. package/dist/docs/reference/geometry/AxisAngleRotation3.md +9 -3
  73. package/dist/docs/reference/geometry/Bevel.md +32 -0
  74. package/dist/docs/reference/geometry/BevelSize.md +28 -0
  75. package/dist/docs/reference/geometry/Bounds2-type.md +18 -4
  76. package/dist/docs/reference/geometry/Bounds2Data.md +22 -4
  77. package/dist/docs/reference/geometry/Bounds2Input.md +18 -4
  78. package/dist/docs/reference/geometry/Bounds2Options.md +61 -11
  79. package/dist/docs/reference/geometry/Bounds3-type.md +18 -4
  80. package/dist/docs/reference/geometry/Bounds3Data.md +18 -4
  81. package/dist/docs/reference/geometry/Bounds3Input.md +18 -4
  82. package/dist/docs/reference/geometry/Bounds3Options.md +61 -11
  83. package/dist/docs/reference/geometry/BoundsFit2.md +10 -4
  84. package/dist/docs/reference/geometry/BoundsFit3.md +10 -4
  85. package/dist/docs/reference/geometry/BoundsFitOptions.md +10 -4
  86. package/dist/docs/reference/geometry/BoxAnchorFace.md +9 -3
  87. package/dist/docs/reference/geometry/BoxAnchorOptions.md +12 -6
  88. package/dist/docs/reference/geometry/BoxEdge.md +11 -1
  89. package/dist/docs/reference/geometry/BoxEdgeSelection.md +11 -1
  90. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +11 -1
  91. package/dist/docs/reference/geometry/BoxOptions.md +13 -3
  92. package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +16 -2
  93. package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +16 -2
  94. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +11 -1
  95. package/dist/docs/reference/geometry/CircleContourOptions.md +12 -2
  96. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +15 -3
  97. package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -1
  98. package/dist/docs/reference/geometry/CircularSampling.md +7 -1
  99. package/dist/docs/reference/geometry/CircularSamplingOptions.md +7 -1
  100. package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +8 -2
  101. package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -2
  102. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +8 -2
  103. package/dist/docs/reference/geometry/Contour.md +12 -2
  104. package/dist/docs/reference/geometry/ContourCurve.md +8 -2
  105. package/dist/docs/reference/geometry/ContourPoint.md +8 -2
  106. package/dist/docs/reference/geometry/ContourSegment.md +8 -2
  107. package/dist/docs/reference/geometry/CorrespondingComponent.md +12 -2
  108. package/dist/docs/reference/geometry/CorrespondingContour.md +12 -2
  109. package/dist/docs/reference/geometry/CorrespondingProfile.md +12 -2
  110. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +12 -2
  111. package/dist/docs/reference/geometry/CubicBezierCurve2.md +8 -2
  112. package/dist/docs/reference/geometry/CubicBezierCurve3.md +8 -2
  113. package/dist/docs/reference/geometry/Curve2.md +8 -2
  114. package/dist/docs/reference/geometry/Curve3.md +8 -2
  115. package/dist/docs/reference/geometry/CurveSamplingOptions.md +16 -2
  116. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +16 -2
  117. package/dist/docs/reference/geometry/CylinderAnchorFace.md +9 -3
  118. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +11 -5
  119. package/dist/docs/reference/geometry/CylinderOptions.md +11 -1
  120. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -2
  121. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -2
  122. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +8 -2
  123. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +8 -2
  124. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +8 -2
  125. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +8 -2
  126. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +8 -2
  127. package/dist/docs/reference/geometry/CylindricalGearSpec.md +8 -2
  128. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +7 -1
  129. package/dist/docs/reference/geometry/EdgeTreatment.md +11 -1
  130. package/dist/docs/reference/geometry/EllipseContourOptions.md +14 -4
  131. package/dist/docs/reference/geometry/EndTreatments.md +12 -2
  132. package/dist/docs/reference/{model/ExtrudeOptions.md → geometry/ExtrudeMeshOptions.md} +30 -26
  133. package/dist/docs/reference/geometry/ExtrudeOptions.md +29 -11
  134. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +18 -4
  135. package/dist/docs/reference/geometry/FittedTextLayout.md +8 -2
  136. package/dist/docs/reference/geometry/Frame3.md +16 -2
  137. package/dist/docs/reference/geometry/GeometryError.md +11 -1
  138. package/dist/docs/reference/geometry/GeometryErrorCode.md +11 -1
  139. package/dist/docs/reference/geometry/GeometryErrorContext.md +11 -1
  140. package/dist/docs/reference/geometry/GeometryResolution.md +15 -1
  141. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +16 -2
  142. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +15 -1
  143. package/dist/docs/reference/geometry/GridPatternOptions.md +12 -2
  144. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +12 -2
  145. package/dist/docs/reference/geometry/HeightfieldOptions.md +18 -3
  146. package/dist/docs/reference/geometry/HeightfieldPreflight.md +12 -2
  147. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +9 -3
  148. package/dist/docs/reference/geometry/ImmutableBuffer-type.md +110 -0
  149. package/dist/docs/reference/geometry/ImmutableTriangleMesh.md +57 -0
  150. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +63 -84
  151. package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +12 -2
  152. package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +8 -2
  153. package/dist/docs/reference/geometry/KnuckleHingeInterval.md +8 -2
  154. package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +12 -2
  155. package/dist/docs/reference/geometry/KnuckleHingeSpec.md +12 -2
  156. package/dist/docs/reference/geometry/LineCurve2.md +8 -2
  157. package/dist/docs/reference/geometry/LineCurve3.md +8 -2
  158. package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -2
  159. package/dist/docs/reference/geometry/LoftCorrespondence.md +16 -2
  160. package/dist/docs/reference/geometry/LoftMeshStation.md +12 -2
  161. package/dist/docs/reference/geometry/LoftOptions.md +18 -4
  162. package/dist/docs/reference/geometry/LoftPlacement.md +16 -2
  163. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +8 -2
  164. package/dist/docs/reference/geometry/MatchProfilesOptions.md +12 -2
  165. package/dist/docs/reference/geometry/MetricFastenerSize.md +8 -2
  166. package/dist/docs/reference/geometry/MetricFastenerStandard.md +8 -2
  167. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +8 -2
  168. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +8 -2
  169. package/dist/docs/reference/geometry/ModelingLimits.md +19 -1
  170. package/dist/docs/reference/geometry/NumericArray.md +28 -0
  171. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +8 -2
  172. package/dist/docs/reference/geometry/Path2-type.md +16 -2
  173. package/dist/docs/reference/geometry/Path2Data.md +16 -2
  174. package/dist/docs/reference/geometry/Path2Input.md +16 -2
  175. package/dist/docs/reference/geometry/Path3-type.md +16 -2
  176. package/dist/docs/reference/geometry/Path3Data.md +16 -2
  177. package/dist/docs/reference/geometry/Path3Input.md +16 -2
  178. package/dist/docs/reference/geometry/PathFrame.md +8 -2
  179. package/dist/docs/reference/geometry/PathLocation.md +16 -2
  180. package/dist/docs/reference/geometry/PathNormalGuide.md +16 -2
  181. package/dist/docs/reference/geometry/PathOptions.md +12 -2
  182. package/dist/docs/reference/geometry/PathPatternOptions.md +12 -2
  183. package/dist/docs/reference/geometry/PathPlacement.md +8 -2
  184. package/dist/docs/reference/geometry/PathResamplingOptions.md +16 -2
  185. package/dist/docs/reference/geometry/Pivot2Options.md +17 -3
  186. package/dist/docs/reference/geometry/Pivot3Options.md +17 -3
  187. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +12 -2
  188. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +12 -2
  189. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +12 -2
  190. package/dist/docs/reference/geometry/PlanarPatchQuality.md +12 -2
  191. package/dist/docs/reference/geometry/PolygonData.md +12 -2
  192. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -2
  193. package/dist/docs/reference/geometry/PrimitiveAttachment.md +11 -3
  194. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +11 -1
  195. package/dist/docs/reference/geometry/PrintableThreadFit.md +12 -2
  196. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +12 -2
  197. package/dist/docs/reference/geometry/Profile.md +8 -2
  198. package/dist/docs/reference/geometry/ProfileComponent2.md +12 -2
  199. package/dist/docs/reference/geometry/ProfileContour2.md +12 -2
  200. package/dist/docs/reference/geometry/ProfileSpan2.md +12 -2
  201. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +11 -1
  202. package/dist/docs/reference/geometry/RackPitchDimensions.md +8 -2
  203. package/dist/docs/reference/geometry/RackPitchSpec.md +8 -2
  204. package/dist/docs/reference/geometry/RadialPatternOptions.md +12 -2
  205. package/dist/docs/reference/geometry/RadialSizing.md +11 -1
  206. package/dist/docs/reference/geometry/RadialSizingOptions.md +11 -1
  207. package/dist/docs/reference/geometry/RectangleContourOptions.md +14 -4
  208. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +12 -2
  209. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +12 -2
  210. package/dist/docs/reference/geometry/RectangleProfileOptions.md +10 -4
  211. package/dist/docs/reference/geometry/RegionData.md +12 -2
  212. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +8 -2
  213. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +7 -1
  214. package/dist/docs/reference/geometry/RevolveOptions.md +17 -3
  215. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +11 -1
  216. package/dist/docs/reference/geometry/RowLayoutOptions.md +10 -4
  217. package/dist/docs/reference/geometry/SampleContourOptions.md +8 -2
  218. package/dist/docs/reference/geometry/SampleHelixOptions.md +8 -2
  219. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +8 -2
  220. package/dist/docs/reference/geometry/SampledCurve2.md +8 -2
  221. package/dist/docs/reference/geometry/SampledCurve3.md +8 -2
  222. package/dist/docs/reference/geometry/SampledThreadHelices.md +8 -2
  223. package/dist/docs/reference/geometry/SideProfileCurve.md +8 -2
  224. package/dist/docs/reference/geometry/SideProfilePoint.md +8 -2
  225. package/dist/docs/reference/geometry/SideProfileSegment.md +8 -2
  226. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +11 -1
  227. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +12 -2
  228. package/dist/docs/reference/geometry/SphereOptions.md +11 -1
  229. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +16 -2
  230. package/dist/docs/reference/geometry/StarContourOptions.md +84 -0
  231. package/dist/docs/reference/geometry/StrokeCap.md +12 -2
  232. package/dist/docs/reference/geometry/StrokeJoin.md +12 -2
  233. package/dist/docs/reference/geometry/StrokeOptions.md +12 -2
  234. package/dist/docs/reference/geometry/SvgImportOptions.md +8 -2
  235. package/dist/docs/reference/geometry/SvgRegionPreflight.md +8 -2
  236. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +8 -2
  237. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +8 -2
  238. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +8 -2
  239. package/dist/docs/reference/geometry/SweepOptions.md +16 -2
  240. package/dist/docs/reference/geometry/SweepOrientation.md +16 -2
  241. package/dist/docs/reference/geometry/ThreadBevelOptions.md +18 -31
  242. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +8 -2
  243. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +8 -2
  244. package/dist/docs/reference/geometry/ThreadEndStyle.md +16 -2
  245. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +16 -2
  246. package/dist/docs/reference/geometry/ThreadHandedness.md +16 -2
  247. package/dist/docs/reference/geometry/ThreadHelixOptions.md +8 -2
  248. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +16 -2
  249. package/dist/docs/reference/geometry/ThreadLeadInShape.md +16 -2
  250. package/dist/docs/reference/geometry/ThreadProfile-type.md +17 -3
  251. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +16 -2
  252. package/dist/docs/reference/geometry/ThreadProfileSpec.md +16 -2
  253. package/dist/docs/reference/geometry/{HelicalThreadRidgeMeshOptions.md → ThreadRidgeOptions.md} +19 -5
  254. package/dist/docs/reference/geometry/ThreadRole.md +8 -2
  255. package/dist/docs/reference/geometry/{HelicalThreadSolidMeshOptions.md → ThreadSolidOptions.md} +29 -66
  256. package/dist/docs/reference/geometry/{HelicalThreadSolidMeshPreflight.md → ThreadSolidPreflight.md} +17 -3
  257. package/dist/docs/reference/geometry/ThreadedNutOptions.md +86 -87
  258. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +29 -7
  259. package/dist/docs/reference/geometry/ThreadedNutShape.md +12 -2
  260. package/dist/docs/reference/geometry/ThreadedRodOptions.md +63 -84
  261. package/dist/docs/reference/geometry/TorusOptions.md +11 -1
  262. package/dist/docs/reference/geometry/Transform2-type.md +17 -3
  263. package/dist/docs/reference/geometry/Transform2Data.md +17 -3
  264. package/dist/docs/reference/geometry/Transform2Input.md +17 -3
  265. package/dist/docs/reference/geometry/Transform3-type.md +17 -3
  266. package/dist/docs/reference/geometry/Transform3Data.md +17 -3
  267. package/dist/docs/reference/geometry/Transform3Input.md +17 -3
  268. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +16 -2
  269. package/dist/docs/reference/geometry/TriangleMesh.md +19 -6
  270. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +25 -5
  271. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +13 -3
  272. package/dist/docs/reference/geometry/TriangleMeshInput.md +29 -0
  273. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +16 -2
  274. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +12 -2
  275. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +12 -2
  276. package/dist/docs/reference/geometry/TriangleMeshSignature.md +14 -4
  277. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +12 -2
  278. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +12 -2
  279. package/dist/docs/reference/geometry/TriangleMeshTopologyAnalysis.md +145 -0
  280. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +12 -2
  281. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +16 -2
  282. package/dist/docs/reference/geometry/TubeOptions.md +20 -86
  283. package/dist/docs/reference/geometry/Vector2-type.md +17 -3
  284. package/dist/docs/reference/geometry/Vector2Data.md +21 -3
  285. package/dist/docs/reference/geometry/Vector2Input.md +17 -3
  286. package/dist/docs/reference/geometry/Vector3-type.md +17 -3
  287. package/dist/docs/reference/geometry/Vector3Data.md +17 -3
  288. package/dist/docs/reference/geometry/Vector3Input.md +17 -3
  289. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +12 -2
  290. package/dist/docs/reference/geometry/VectorTextLayout.md +16 -2
  291. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +14 -4
  292. package/dist/docs/reference/geometry/VectorTextMetrics.md +16 -2
  293. package/dist/docs/reference/geometry/VectorTextOptions.md +12 -2
  294. package/dist/docs/reference/geometry/add2.md +9 -3
  295. package/dist/docs/reference/geometry/add3.md +9 -3
  296. package/dist/docs/reference/geometry/anchor3.md +9 -3
  297. package/dist/docs/reference/geometry/anchorFrame3.md +8 -2
  298. package/dist/docs/reference/geometry/applyTransformDirection3.md +9 -3
  299. package/dist/docs/reference/geometry/applyTransformPoint3.md +9 -3
  300. package/dist/docs/reference/geometry/attachmentTransform3.md +9 -3
  301. package/dist/docs/reference/geometry/bounds2.md +18 -8
  302. package/dist/docs/reference/geometry/bounds3.md +18 -8
  303. package/dist/docs/reference/geometry/boundsCenter.md +10 -4
  304. package/dist/docs/reference/geometry/boundsSize.md +10 -4
  305. package/dist/docs/reference/geometry/boxAnchor3.md +11 -5
  306. package/dist/docs/reference/geometry/categories/bounds-layout.md +6 -6
  307. package/dist/docs/reference/geometry/categories/curves-paths.md +3 -3
  308. package/dist/docs/reference/geometry/categories/mechanical.md +9 -11
  309. package/dist/docs/reference/geometry/categories/meshes.md +20 -33
  310. package/dist/docs/reference/geometry/categories/pattern-placement.md +3 -3
  311. package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
  312. package/dist/docs/reference/geometry/categories/profiles-regions.md +6 -5
  313. package/dist/docs/reference/geometry/categories/resolution-errors.md +3 -3
  314. package/dist/docs/reference/geometry/categories/transforms-math.md +5 -4
  315. package/dist/docs/reference/geometry/categories/vector-import.md +4 -4
  316. package/dist/docs/reference/geometry/circleContour.md +8 -2
  317. package/dist/docs/reference/geometry/closeToAxis.md +8 -2
  318. package/dist/docs/reference/geometry/compensateThreadDiameters.md +8 -2
  319. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +8 -2
  320. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +8 -2
  321. package/dist/docs/reference/geometry/composeTransform3.md +9 -3
  322. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +8 -2
  323. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -2
  324. package/dist/docs/reference/geometry/contourContainsPoint.md +8 -2
  325. package/dist/docs/reference/geometry/cross2.md +9 -3
  326. package/dist/docs/reference/geometry/cross3.md +9 -3
  327. package/dist/docs/reference/geometry/cylinderAnchor3.md +10 -4
  328. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +8 -2
  329. package/dist/docs/reference/geometry/distance2.md +9 -3
  330. package/dist/docs/reference/geometry/distance3.md +9 -3
  331. package/dist/docs/reference/geometry/distributeAlongPath.md +8 -2
  332. package/dist/docs/reference/geometry/dot2.md +9 -3
  333. package/dist/docs/reference/geometry/dot3.md +9 -3
  334. package/dist/docs/reference/geometry/ellipseContour.md +8 -2
  335. package/dist/docs/reference/geometry/eulerTransform3.md +9 -3
  336. package/dist/docs/reference/geometry/fitBounds.md +10 -4
  337. package/dist/docs/reference/geometry/fitTextLayout.md +8 -2
  338. package/dist/docs/reference/geometry/frameTransform3.md +9 -3
  339. package/dist/docs/reference/geometry/getMetricClearanceHoleDiameter.md +8 -2
  340. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +8 -2
  341. package/dist/docs/reference/geometry/gridPatternTransforms.md +8 -2
  342. package/dist/docs/reference/{model → geometry}/immutableBuffer.md +13 -2
  343. package/dist/docs/reference/geometry/inverseTransform3.md +9 -3
  344. package/dist/docs/reference/geometry/isGeometryError.md +11 -1
  345. package/dist/docs/reference/geometry/layoutRow.md +10 -4
  346. package/dist/docs/reference/geometry/length2.md +9 -3
  347. package/dist/docs/reference/geometry/length3.md +9 -3
  348. package/dist/docs/reference/geometry/lerp2.md +9 -3
  349. package/dist/docs/reference/geometry/lerp3.md +9 -3
  350. package/dist/docs/reference/geometry/linearPatternTransforms.md +8 -2
  351. package/dist/docs/reference/geometry/matchProfiles.md +8 -2
  352. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +8 -2
  353. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +8 -2
  354. package/dist/docs/reference/geometry/normalize2.md +9 -3
  355. package/dist/docs/reference/geometry/normalize3.md +9 -3
  356. package/dist/docs/reference/geometry/normalizeContour.md +8 -2
  357. package/dist/docs/reference/geometry/normalizePolygon.md +8 -2
  358. package/dist/docs/reference/geometry/normalizeRegion.md +8 -2
  359. package/dist/docs/reference/geometry/path2.md +12 -2
  360. package/dist/docs/reference/geometry/path3.md +12 -2
  361. package/dist/docs/reference/geometry/pathPatternTransforms.md +8 -2
  362. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +25 -26
  363. package/dist/docs/reference/geometry/preflightSvgRegion.md +8 -2
  364. package/dist/docs/reference/geometry/preflightThreadedNut.md +31 -27
  365. package/dist/docs/reference/geometry/preflightThreadedRod.md +25 -26
  366. package/dist/docs/reference/geometry/projectOntoPlane3.md +9 -3
  367. package/dist/docs/reference/geometry/radialPatternTransforms.md +8 -2
  368. package/dist/docs/reference/geometry/rectangleContour.md +17 -6
  369. package/dist/docs/reference/geometry/rectangleProfile.md +9 -3
  370. package/dist/docs/reference/geometry/regionArea.md +8 -2
  371. package/dist/docs/reference/geometry/regionBounds.md +8 -2
  372. package/dist/docs/reference/geometry/regularPolygonContour.md +9 -3
  373. package/dist/docs/reference/geometry/resamplePolyline2.md +8 -2
  374. package/dist/docs/reference/geometry/resamplePolyline3.md +8 -2
  375. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +7 -1
  376. package/dist/docs/reference/geometry/resolveArcSegments.md +7 -1
  377. package/dist/docs/reference/geometry/resolveCircularSampling.md +7 -1
  378. package/dist/docs/reference/geometry/resolveCircularSegments.md +7 -1
  379. package/dist/docs/reference/geometry/resolveCylindricalGear.md +8 -2
  380. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +8 -2
  381. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +8 -2
  382. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +8 -2
  383. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +7 -1
  384. package/dist/docs/reference/geometry/resolveKnuckleHinge.md +8 -2
  385. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +8 -2
  386. package/dist/docs/reference/geometry/resolveRackPitch.md +8 -2
  387. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -2
  388. package/dist/docs/reference/geometry/rotate2.md +9 -3
  389. package/dist/docs/reference/geometry/rotationTransform3.md +9 -3
  390. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -2
  391. package/dist/docs/reference/geometry/sampleContour.md +8 -2
  392. package/dist/docs/reference/geometry/sampleCurve2.md +8 -2
  393. package/dist/docs/reference/geometry/sampleCurve3.md +8 -2
  394. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +8 -2
  395. package/dist/docs/reference/geometry/sampleHelix.md +8 -2
  396. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +8 -2
  397. package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -2
  398. package/dist/docs/reference/geometry/sampleSideProfile.md +8 -2
  399. package/dist/docs/reference/geometry/sampleTextContours.md +8 -2
  400. package/dist/docs/reference/geometry/sampleThreadHelices.md +8 -2
  401. package/dist/docs/reference/geometry/scale2.md +9 -3
  402. package/dist/docs/reference/geometry/scale3.md +9 -3
  403. package/dist/docs/reference/geometry/scaleTransform3.md +9 -3
  404. package/dist/docs/reference/geometry/signedContourArea.md +8 -2
  405. package/dist/docs/reference/geometry/starContour.md +24 -16
  406. package/dist/docs/reference/geometry/strokeRegionData.md +8 -2
  407. package/dist/docs/reference/geometry/subtract2.md +9 -3
  408. package/dist/docs/reference/geometry/subtract3.md +9 -3
  409. package/dist/docs/reference/geometry/threadProfile.md +8 -2
  410. package/dist/docs/reference/geometry/transform2.md +13 -3
  411. package/dist/docs/reference/geometry/transform3.md +13 -3
  412. package/dist/docs/reference/geometry/transformDeterminant3.md +9 -3
  413. package/dist/docs/reference/geometry/transformRegionData.md +8 -2
  414. package/dist/docs/reference/geometry/translationTransform3.md +9 -3
  415. package/dist/docs/reference/geometry/triangulateContour.md +8 -2
  416. package/dist/docs/reference/geometry/validateRigidTransform3.md +41 -0
  417. package/dist/docs/reference/geometry/validateTransform3.md +9 -3
  418. package/dist/docs/reference/geometry/vector2.md +13 -3
  419. package/dist/docs/reference/geometry/vector3.md +13 -3
  420. package/dist/docs/reference/geometry.md +10 -10
  421. package/dist/docs/reference/mesh/MeshRenderOptions.md +28 -0
  422. package/dist/docs/reference/mesh/RenderMesh.md +68 -0
  423. package/dist/docs/reference/mesh/analyze.md +102 -0
  424. package/dist/docs/reference/mesh/analyzeQuality.md +62 -0
  425. package/dist/docs/reference/mesh/bounds.md +45 -0
  426. package/dist/docs/reference/mesh/categories/operations.md +57 -0
  427. package/dist/docs/reference/mesh/centroid.md +45 -0
  428. package/dist/docs/reference/mesh/extrude.md +79 -0
  429. package/dist/docs/reference/mesh/heightfield.md +57 -0
  430. package/dist/docs/reference/mesh/immutable.md +51 -0
  431. package/dist/docs/reference/mesh/join.md +47 -0
  432. package/dist/docs/reference/mesh/loft.md +83 -0
  433. package/dist/docs/reference/mesh/optimizePlanarPatches.md +102 -0
  434. package/dist/docs/reference/mesh/preflightHeightfield.md +48 -0
  435. package/dist/docs/reference/mesh/preflightThreadSolid.md +96 -0
  436. package/dist/docs/reference/mesh/render.md +57 -0
  437. package/dist/docs/reference/mesh/reverse.md +41 -0
  438. package/dist/docs/reference/{geometry/revolveMesh.md → mesh/revolve.md} +23 -17
  439. package/dist/docs/reference/mesh/signature.md +70 -0
  440. package/dist/docs/reference/mesh/sweep.md +92 -0
  441. package/dist/docs/reference/mesh/threadRidge.md +78 -0
  442. package/dist/docs/reference/mesh/threadSolid.md +96 -0
  443. package/dist/docs/reference/mesh/transform.md +53 -0
  444. package/dist/docs/reference/mesh/validate.md +75 -0
  445. package/dist/docs/reference/{geometry/validateSolidMesh.md → mesh/validateSolid.md} +23 -11
  446. package/dist/docs/reference/mesh.md +21 -0
  447. package/dist/docs/reference/model/CircleOptions.md +13 -7
  448. package/dist/docs/reference/model/DiagnosticOptions.md +21 -1
  449. package/dist/docs/reference/model/EllipseOptions.md +13 -7
  450. package/dist/docs/reference/model/GenerateCallback.md +11 -5
  451. package/dist/docs/reference/model/GenerateContext.md +26 -99
  452. package/dist/docs/reference/model/GenerationDiagnostic.md +19 -1
  453. package/dist/docs/reference/model/GenerationError.md +8 -2
  454. package/dist/docs/reference/model/HoleCutterOptions.md +17 -10
  455. package/dist/docs/reference/model/HoleCutterOverrun.md +10 -3
  456. package/dist/docs/reference/model/HoleCutterRecess.md +10 -3
  457. package/dist/docs/reference/model/HullOptions.md +13 -6
  458. package/dist/docs/reference/model/ImmutableValue.md +26 -0
  459. package/dist/docs/reference/model/ImplicitOptions.md +12 -6
  460. package/dist/docs/reference/model/JoinOptions.md +76 -0
  461. package/dist/docs/reference/model/JoinTransition.md +54 -0
  462. package/dist/docs/reference/model/KnuckleHinge-type.md +9 -3
  463. package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +7 -1
  464. package/dist/docs/reference/model/KnuckleHingeOptions.md +10 -4
  465. package/dist/docs/reference/model/KnuckleHingeWeb.md +7 -1
  466. package/dist/docs/reference/model/LoftStation.md +16 -9
  467. package/dist/docs/reference/model/Memo.md +54 -0
  468. package/dist/docs/reference/model/ModelProgram.md +8 -2
  469. package/dist/docs/reference/model/PartDeclaration.md +87 -0
  470. package/dist/docs/reference/model/PartGeometry.md +10 -4
  471. package/dist/docs/reference/model/PartOptions.md +16 -22
  472. package/dist/docs/reference/model/PatternSource.md +10 -4
  473. package/dist/docs/reference/model/PlaneOptions.md +11 -4
  474. package/dist/docs/reference/model/PolygonOptions.md +20 -14
  475. package/dist/docs/reference/model/Profile.md +10 -4
  476. package/dist/docs/reference/model/RectangleOptions.md +28 -22
  477. package/dist/docs/reference/model/RegularPolygonOptions.md +13 -7
  478. package/dist/docs/reference/model/Section.md +196 -77
  479. package/dist/docs/reference/model/SectionHullOptions.md +13 -6
  480. package/dist/docs/reference/model/SectionInspection.md +12 -18
  481. package/dist/docs/reference/model/SectionOffsetJoin.md +10 -4
  482. package/dist/docs/reference/model/SectionOffsetOptions.md +12 -6
  483. package/dist/docs/reference/model/Solid.md +339 -54
  484. package/dist/docs/reference/model/SolidInspection.md +12 -18
  485. package/dist/docs/reference/model/SolidSegmentHit.md +14 -4
  486. package/dist/docs/reference/model/StarOptions.md +53 -25
  487. package/dist/docs/reference/model/SvgOrigin.md +10 -4
  488. package/dist/docs/reference/model/SvgPathSectionOptions.md +14 -8
  489. package/dist/docs/reference/model/SvgSectionOptions.md +16 -10
  490. package/dist/docs/reference/model/TextSectionOptions.md +14 -8
  491. package/dist/docs/reference/model/box.md +18 -11
  492. package/dist/docs/reference/model/categories/boolean-operations.md +13 -11
  493. package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -7
  494. package/dist/docs/reference/model/categories/explicit-profiles.md +1 -14
  495. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +11 -23
  496. package/dist/docs/reference/model/categories/generation.md +10 -15
  497. package/dist/docs/reference/model/categories/hinges.md +1 -4
  498. package/dist/docs/reference/model/categories/mesh-inspection.md +14 -9
  499. package/dist/docs/reference/model/categories/primitives.md +8 -24
  500. package/dist/docs/reference/model/categories/sections.md +6 -16
  501. package/dist/docs/reference/model/categories/threads.md +3 -30
  502. package/dist/docs/reference/model/categories/transforms-placement.md +5 -35
  503. package/dist/docs/reference/model/circle.md +10 -4
  504. package/dist/docs/reference/model/cylinder.md +13 -6
  505. package/dist/docs/reference/model/ellipse.md +10 -4
  506. package/dist/docs/reference/model/extrude.md +28 -20
  507. package/dist/docs/reference/model/generate.md +10 -4
  508. package/dist/docs/reference/model/gridPattern.md +15 -9
  509. package/dist/docs/reference/model/heightfield.md +10 -4
  510. package/dist/docs/reference/model/holeCutter.md +21 -4
  511. package/dist/docs/reference/model/hull.md +9 -2
  512. package/dist/docs/reference/model/implicit.md +9 -3
  513. package/dist/docs/reference/model/internalThreadCutter.md +31 -33
  514. package/dist/docs/reference/model/intersect.md +11 -4
  515. package/dist/docs/reference/model/join.md +89 -0
  516. package/dist/docs/reference/model/knuckleHinge.md +8 -2
  517. package/dist/docs/reference/model/linearPattern.md +15 -9
  518. package/dist/docs/reference/model/loft.md +36 -28
  519. package/dist/docs/reference/model/matchProfiles.md +14 -8
  520. package/dist/docs/reference/model/minkowskiSum.md +9 -2
  521. package/dist/docs/reference/model/pathPattern.md +25 -19
  522. package/dist/docs/reference/model/polygon.md +13 -7
  523. package/dist/docs/reference/model/preflightInternalThreadCutter.md +33 -35
  524. package/dist/docs/reference/model/preflightThreadedNut.md +43 -40
  525. package/dist/docs/reference/model/preflightThreadedRod.md +33 -35
  526. package/dist/docs/reference/model/radialPattern.md +15 -9
  527. package/dist/docs/reference/model/rectangle.md +14 -8
  528. package/dist/docs/reference/model/regularPolygon.md +10 -4
  529. package/dist/docs/reference/model/revolve.md +25 -17
  530. package/dist/docs/reference/model/solidFromMesh.md +16 -9
  531. package/dist/docs/reference/model/sphere.md +13 -6
  532. package/dist/docs/reference/model/star.md +17 -11
  533. package/dist/docs/reference/model/stroke.md +21 -15
  534. package/dist/docs/reference/model/svgPathSection.md +12 -6
  535. package/dist/docs/reference/model/svgSection.md +13 -7
  536. package/dist/docs/reference/model/sweep.md +29 -21
  537. package/dist/docs/reference/model/textSection.md +15 -9
  538. package/dist/docs/reference/model/threadRidge.md +21 -15
  539. package/dist/docs/reference/model/threadedNut.md +41 -38
  540. package/dist/docs/reference/model/threadedRod.md +31 -33
  541. package/dist/docs/reference/model/torus.md +20 -13
  542. package/dist/docs/reference/model/tube.md +13 -41
  543. package/dist/docs/reference/model/union.md +11 -4
  544. package/dist/docs/reference/model.md +11 -20
  545. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +8 -2
  546. package/dist/docs/reference/text/VectorFont.md +39 -33
  547. package/dist/docs/reference/text/VectorFontOptions.md +7 -1
  548. package/dist/docs/reference/text/categories/font-preparation.md +3 -15
  549. package/dist/docs/reference/text/prepareVectorFont.md +7 -1
  550. package/dist/docs/reference/text.md +4 -4
  551. package/dist/engine/execution.js +10 -6
  552. package/dist/engine/finalization.js +2 -74
  553. package/dist/engine/index.js +24 -30
  554. package/dist/engine/model-parts.js +8 -0
  555. package/dist/engine/model-summary.js +5 -5
  556. package/dist/engine/native/construction-mesh.js +41 -0
  557. package/dist/engine/native/index.js +1 -1
  558. package/dist/engine/native/material-components.js +5 -54
  559. package/dist/engine/native/mesh-observation.js +55 -0
  560. package/dist/engine/native/operations.js +0 -7
  561. package/dist/engine/native/regions.js +2 -1
  562. package/dist/engine/native/scoped-primitives.js +5 -4
  563. package/dist/engine/native/threads.js +14 -14
  564. package/dist/engine/{construction-operations.js → operations/construction.js} +25 -23
  565. package/dist/engine/{modeling-context.js → operations/context.js} +12 -10
  566. package/dist/engine/{operation-environment.js → operations/environment.js} +2 -2
  567. package/dist/engine/{extrusion-finishing.js → operations/extrusion-finishing.js} +23 -22
  568. package/dist/engine/{hole-cutter-operation.js → operations/hole-cutter.js} +3 -3
  569. package/dist/engine/{inspection-operations.js → operations/inspection.js} +6 -6
  570. package/dist/engine/operations/join-collar-profile.js +120 -0
  571. package/dist/engine/operations/join.js +508 -0
  572. package/dist/engine/{knuckle-hinge-operation.js → operations/knuckle-hinge.js} +4 -4
  573. package/dist/engine/{loft-operations.js → operations/loft.js} +13 -12
  574. package/dist/engine/{mechanical-operations.js → operations/mechanical.js} +2 -2
  575. package/dist/engine/{pattern-operations.js → operations/patterns.js} +4 -4
  576. package/dist/engine/{primitive-anchors.js → operations/primitives/anchors.js} +9 -4
  577. package/dist/engine/{primitive-operations.js → operations/primitives/construction.js} +18 -19
  578. package/dist/engine/{primitive-correspondence.js → operations/primitives/correspondence.js} +4 -4
  579. package/dist/engine/{profile-mesh.js → operations/primitives/profile-mesh.js} +12 -12
  580. package/dist/engine/{primitive-profiles.js → operations/primitives/profiles.js} +7 -7
  581. package/dist/engine/{section-operations.js → operations/sections.js} +8 -8
  582. package/dist/engine/{transform-operations.js → operations/transforms.js} +8 -8
  583. package/dist/engine/placement.js +3 -4
  584. package/dist/engine/recipe-realization.js +2 -2
  585. package/dist/engine/{deferred-context.js → session/deferred-context.js} +4 -4
  586. package/dist/engine/session/dependencies.js +93 -0
  587. package/dist/engine/session/graph.js +428 -0
  588. package/dist/engine/{session-native.js → session/native-cache.js} +2 -2
  589. package/dist/engine/{session.js → session/session.js} +20 -14
  590. package/dist/engine/{session-snapshot.js → session/snapshot-cache.js} +30 -60
  591. package/dist/export/3mf.js +190 -0
  592. package/dist/export/capture.js +178 -0
  593. package/dist/export/glb.js +209 -0
  594. package/dist/export/index.js +5 -0
  595. package/dist/export/limits.js +18 -0
  596. package/dist/export/stl.js +105 -0
  597. package/dist/export/types.js +1 -0
  598. package/dist/export/writer.js +54 -0
  599. package/dist/geometry/anchors.js +4 -11
  600. package/dist/geometry/bounds-value.js +22 -12
  601. package/dist/geometry/heightfield.js +10 -12
  602. package/dist/{model → geometry}/immutable-buffer.js +31 -12
  603. package/dist/geometry/index.js +16 -22
  604. package/dist/geometry/join-geometry.js +839 -0
  605. package/dist/geometry/loft/loft.js +11 -6
  606. package/dist/geometry/mechanical/index.js +5 -5
  607. package/dist/geometry/mechanical/threads/bevel.js +24 -0
  608. package/dist/geometry/mechanical/{threads.js → threads/fit.js} +4 -4
  609. package/dist/geometry/mechanical/{thread-helices.js → threads/helices.js} +3 -3
  610. package/dist/geometry/mechanical/{thread-mesh-plan.js → threads/mesh-plan.js} +38 -53
  611. package/dist/geometry/mechanical/{thread-mesh.js → threads/mesh.js} +9 -9
  612. package/dist/geometry/mechanical/{thread-profiles.js → threads/profiles.js} +3 -3
  613. package/dist/geometry/mechanical/{thread-solids.js → threads/solids.js} +58 -89
  614. package/dist/geometry/mechanical/{thread-surface.js → threads/surface.js} +7 -8
  615. package/dist/geometry/mesh/mesh-centroid.js +3 -2
  616. package/dist/geometry/mesh/mesh-planar.js +27 -8
  617. package/dist/geometry/mesh/mesh-quality.js +2 -1
  618. package/dist/geometry/mesh/mesh-render.js +205 -0
  619. package/dist/geometry/mesh/mesh-signature.js +7 -6
  620. package/dist/geometry/mesh/mesh-solid-intersections.js +43 -17
  621. package/dist/geometry/mesh/mesh-solid.js +8 -5
  622. package/dist/geometry/mesh/mesh-types.js +1 -0
  623. package/dist/geometry/mesh/mesh.js +13 -22
  624. package/dist/geometry/mesh-api.js +15 -0
  625. package/dist/geometry/primitive-resolvers.js +42 -14
  626. package/dist/geometry/profiles/primitives/circle.js +19 -0
  627. package/dist/geometry/profiles/{shapes.js → primitives/ellipse.js} +6 -10
  628. package/dist/geometry/profiles/{rectangle.js → primitives/rectangle.js} +14 -12
  629. package/dist/geometry/profiles/primitives/regular-polygon.js +33 -0
  630. package/dist/geometry/profiles/primitives/star.js +28 -0
  631. package/dist/geometry/region-offset.js +278 -0
  632. package/dist/geometry/regions.js +11 -1
  633. package/dist/geometry/revolve/revolve-mesh.js +1 -1
  634. package/dist/geometry/{svg-import.js → svg/import.js} +10 -10
  635. package/dist/geometry/sweeps/sweep-mesh.js +1 -1
  636. package/dist/geometry/transform3.js +29 -0
  637. package/dist/index.js +2 -1
  638. package/dist/model/diagnostic-path.js +26 -0
  639. package/dist/model/execution-binding.js +3 -3
  640. package/dist/model/generation.js +9 -3
  641. package/dist/model/geometry-recipes.js +1 -1
  642. package/dist/model/immutable-generation-data.js +45 -14
  643. package/dist/model/join.js +1 -0
  644. package/dist/model/operations.js +34 -144
  645. package/dist/model/recipe-declaration.js +7 -2
  646. package/dist/model/shape-handles.js +31 -7
  647. package/dist/text/index.js +1 -1
  648. package/package.json +38 -11
  649. package/dist/docs/reference/engine/Export3mfOptions.md +0 -29
  650. package/dist/docs/reference/engine/ExportMeshPart.md +0 -65
  651. package/dist/docs/reference/engine/ModelSnapshot.md +0 -184
  652. package/dist/docs/reference/engine/SnapshotPart.md +0 -133
  653. package/dist/docs/reference/engine/validateModel.md +0 -48
  654. package/dist/docs/reference/geometry/ThreadedNutBevel.md +0 -14
  655. package/dist/docs/reference/geometry/analyzeTriangleMesh.md +0 -61
  656. package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +0 -56
  657. package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +0 -39
  658. package/dist/docs/reference/geometry/computeTriangleMeshSignature.md +0 -64
  659. package/dist/docs/reference/geometry/extrudeMesh.md +0 -77
  660. package/dist/docs/reference/geometry/heightfieldMesh.md +0 -52
  661. package/dist/docs/reference/geometry/helicalThreadRidgeMesh.md +0 -72
  662. package/dist/docs/reference/geometry/helicalThreadSolidMesh.md +0 -106
  663. package/dist/docs/reference/geometry/joinTriangleMeshes.md +0 -40
  664. package/dist/docs/reference/geometry/loftMesh.md +0 -77
  665. package/dist/docs/reference/geometry/meshBounds.md +0 -39
  666. package/dist/docs/reference/geometry/optimizePlanarPatches.md +0 -95
  667. package/dist/docs/reference/geometry/preflightHeightfield.md +0 -43
  668. package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +0 -105
  669. package/dist/docs/reference/geometry/reverseTriangleMesh.md +0 -34
  670. package/dist/docs/reference/geometry/sweepMesh.md +0 -86
  671. package/dist/docs/reference/geometry/transformTriangleMesh.md +0 -46
  672. package/dist/docs/reference/geometry/validateTriangleMesh.md +0 -63
  673. package/dist/docs/reference/model/Anchor3.md +0 -55
  674. package/dist/docs/reference/model/AttachOptions.md +0 -69
  675. package/dist/docs/reference/model/Bounds2-type.md +0 -125
  676. package/dist/docs/reference/model/Bounds2Data.md +0 -44
  677. package/dist/docs/reference/model/Bounds2Input.md +0 -19
  678. package/dist/docs/reference/model/Bounds2Options.md +0 -70
  679. package/dist/docs/reference/model/Bounds3-type.md +0 -125
  680. package/dist/docs/reference/model/Bounds3Data.md +0 -44
  681. package/dist/docs/reference/model/Bounds3Input.md +0 -19
  682. package/dist/docs/reference/model/Bounds3Options.md +0 -70
  683. package/dist/docs/reference/model/BoxEdge.md +0 -15
  684. package/dist/docs/reference/model/BoxEdgeSelection.md +0 -19
  685. package/dist/docs/reference/model/BoxEdgeTreatments.md +0 -20
  686. package/dist/docs/reference/model/BoxOptions.md +0 -92
  687. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +0 -35
  688. package/dist/docs/reference/model/CircleContourOptions.md +0 -21
  689. package/dist/docs/reference/model/CircularPrimitiveOptions.md +0 -64
  690. package/dist/docs/reference/model/Computed.md +0 -40
  691. package/dist/docs/reference/model/ComputedValue.md +0 -24
  692. package/dist/docs/reference/model/Contour.md +0 -24
  693. package/dist/docs/reference/model/CorrespondingComponent.md +0 -46
  694. package/dist/docs/reference/model/CorrespondingContour.md +0 -46
  695. package/dist/docs/reference/model/CorrespondingProfile.md +0 -22
  696. package/dist/docs/reference/model/CorrespondingProfileStation.md +0 -27
  697. package/dist/docs/reference/model/CylinderOptions.md +0 -58
  698. package/dist/docs/reference/model/EdgeTreatment.md +0 -22
  699. package/dist/docs/reference/model/EllipseContourOptions.md +0 -21
  700. package/dist/docs/reference/model/EndTreatments.md +0 -39
  701. package/dist/docs/reference/model/FinalizedModel.md +0 -131
  702. package/dist/docs/reference/model/FinalizedPart.md +0 -87
  703. package/dist/docs/reference/model/Frame3.md +0 -63
  704. package/dist/docs/reference/model/GeneratedPart.md +0 -97
  705. package/dist/docs/reference/model/GeometryResolution.md +0 -70
  706. package/dist/docs/reference/model/GeometrySamplingLimits.md +0 -62
  707. package/dist/docs/reference/model/GeometryToleranceOptions.md +0 -46
  708. package/dist/docs/reference/model/GridPatternOptions.md +0 -50
  709. package/dist/docs/reference/model/HeightfieldOptions.md +0 -67
  710. package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +0 -141
  711. package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +0 -59
  712. package/dist/docs/reference/model/ImmutableBuffer-type.md +0 -84
  713. package/dist/docs/reference/model/ImmutableTriangleMesh.md +0 -38
  714. package/dist/docs/reference/model/InternalThreadCutterOptions.md +0 -246
  715. package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +0 -77
  716. package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +0 -47
  717. package/dist/docs/reference/model/KnuckleHingeSpec.md +0 -18
  718. package/dist/docs/reference/model/LinearPatternOptions.md +0 -39
  719. package/dist/docs/reference/model/LoftCorrespondence.md +0 -27
  720. package/dist/docs/reference/model/LoftOptions.md +0 -91
  721. package/dist/docs/reference/model/LoftPlacement.md +0 -73
  722. package/dist/docs/reference/model/MatchProfilesOptions.md +0 -35
  723. package/dist/docs/reference/model/ModelingLimits.md +0 -126
  724. package/dist/docs/reference/model/NumericArray.md +0 -14
  725. package/dist/docs/reference/model/Path2-type.md +0 -196
  726. package/dist/docs/reference/model/Path2Data.md +0 -50
  727. package/dist/docs/reference/model/Path2Input.md +0 -20
  728. package/dist/docs/reference/model/Path3-type.md +0 -196
  729. package/dist/docs/reference/model/Path3Data.md +0 -50
  730. package/dist/docs/reference/model/Path3Input.md +0 -20
  731. package/dist/docs/reference/model/PathLocation.md +0 -69
  732. package/dist/docs/reference/model/PathNormalGuide.md +0 -46
  733. package/dist/docs/reference/model/PathOptions.md +0 -38
  734. package/dist/docs/reference/model/PathPatternOptions.md +0 -48
  735. package/dist/docs/reference/model/PathResamplingOptions.md +0 -83
  736. package/dist/docs/reference/model/Pivot2Options.md +0 -28
  737. package/dist/docs/reference/model/Pivot3Options.md +0 -28
  738. package/dist/docs/reference/model/PolygonData.md +0 -44
  739. package/dist/docs/reference/model/PrimitiveAttachment.md +0 -41
  740. package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +0 -110
  741. package/dist/docs/reference/model/PrintableThreadFit.md +0 -15
  742. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +0 -51
  743. package/dist/docs/reference/model/ProfileComponent2.md +0 -46
  744. package/dist/docs/reference/model/ProfileContour2.md +0 -36
  745. package/dist/docs/reference/model/ProfileSpan2.md +0 -47
  746. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +0 -41
  747. package/dist/docs/reference/model/RadialPatternOptions.md +0 -59
  748. package/dist/docs/reference/model/RadialSizing.md +0 -15
  749. package/dist/docs/reference/model/RadialSizingOptions.md +0 -40
  750. package/dist/docs/reference/model/RectangleContourOptions.md +0 -72
  751. package/dist/docs/reference/model/RectangleCornerTreatment.md +0 -40
  752. package/dist/docs/reference/model/RectangleCornerTreatments.md +0 -20
  753. package/dist/docs/reference/model/RegionData.md +0 -19
  754. package/dist/docs/reference/model/RevolveOptions.md +0 -94
  755. package/dist/docs/reference/model/RoundedEdgeTreatment.md +0 -96
  756. package/dist/docs/reference/model/SmoothEdgeTreatment.md +0 -76
  757. package/dist/docs/reference/model/SphereOptions.md +0 -20
  758. package/dist/docs/reference/model/StrokeCap.md +0 -16
  759. package/dist/docs/reference/model/StrokeJoin.md +0 -16
  760. package/dist/docs/reference/model/StrokeOptions.md +0 -91
  761. package/dist/docs/reference/model/SweepOptions.md +0 -116
  762. package/dist/docs/reference/model/SweepOrientation.md +0 -116
  763. package/dist/docs/reference/model/ThreadEndStyle.md +0 -15
  764. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +0 -118
  765. package/dist/docs/reference/model/ThreadHandedness.md +0 -15
  766. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +0 -15
  767. package/dist/docs/reference/model/ThreadLeadInShape.md +0 -15
  768. package/dist/docs/reference/model/ThreadProfile.md +0 -87
  769. package/dist/docs/reference/model/ThreadRidgeOptions.md +0 -19
  770. package/dist/docs/reference/model/ThreadedNutBevel.md +0 -15
  771. package/dist/docs/reference/model/ThreadedNutOptions.md +0 -274
  772. package/dist/docs/reference/model/ThreadedNutPreflight.md +0 -99
  773. package/dist/docs/reference/model/ThreadedNutShape.md +0 -15
  774. package/dist/docs/reference/model/ThreadedRodOptions.md +0 -246
  775. package/dist/docs/reference/model/TorusOptions.md +0 -110
  776. package/dist/docs/reference/model/Transform2-type.md +0 -257
  777. package/dist/docs/reference/model/Transform2Data.md +0 -16
  778. package/dist/docs/reference/model/Transform2Input.md +0 -21
  779. package/dist/docs/reference/model/Transform3-type.md +0 -297
  780. package/dist/docs/reference/model/Transform3Data.md +0 -19
  781. package/dist/docs/reference/model/Transform3Input.md +0 -21
  782. package/dist/docs/reference/model/TriangleMesh.md +0 -42
  783. package/dist/docs/reference/model/TriangleMeshAnalysis.md +0 -123
  784. package/dist/docs/reference/model/TriangleMeshMeasurements.md +0 -79
  785. package/dist/docs/reference/model/TubeOptions.md +0 -143
  786. package/dist/docs/reference/model/Vector2-type.md +0 -271
  787. package/dist/docs/reference/model/Vector2Data.md +0 -15
  788. package/dist/docs/reference/model/Vector2Input.md +0 -21
  789. package/dist/docs/reference/model/Vector3-type.md +0 -283
  790. package/dist/docs/reference/model/Vector3Data.md +0 -15
  791. package/dist/docs/reference/model/Vector3Input.md +0 -21
  792. package/dist/docs/reference/model/VectorTextLayout.md +0 -40
  793. package/dist/docs/reference/model/VectorTextMetrics.md +0 -100
  794. package/dist/docs/reference/model/anchor.md +0 -47
  795. package/dist/docs/reference/model/bounds2.md +0 -37
  796. package/dist/docs/reference/model/bounds3.md +0 -37
  797. package/dist/docs/reference/model/castSegment.md +0 -40
  798. package/dist/docs/reference/model/categories/bounds.md +0 -38
  799. package/dist/docs/reference/model/categories/contracts.md +0 -18
  800. package/dist/docs/reference/model/categories/core-values-errors.md +0 -30
  801. package/dist/docs/reference/model/categories/inspection.md +0 -29
  802. package/dist/docs/reference/model/categories/paths.md +0 -41
  803. package/dist/docs/reference/model/categories/resolution.md +0 -20
  804. package/dist/docs/reference/model/components.md +0 -71
  805. package/dist/docs/reference/model/compose.md +0 -31
  806. package/dist/docs/reference/model/distance.md +0 -45
  807. package/dist/docs/reference/model/immutableMesh.md +0 -44
  808. package/dist/docs/reference/model/inspectSection.md +0 -38
  809. package/dist/docs/reference/model/inspectSolid.md +0 -38
  810. package/dist/docs/reference/model/isEmpty.md +0 -39
  811. package/dist/docs/reference/model/path2.md +0 -54
  812. package/dist/docs/reference/model/path3.md +0 -49
  813. package/dist/docs/reference/model/split.md +0 -54
  814. package/dist/docs/reference/model/splitByPlane.md +0 -66
  815. package/dist/docs/reference/model/transform2.md +0 -46
  816. package/dist/docs/reference/model/transform3.md +0 -48
  817. package/dist/docs/reference/model/vector2.md +0 -40
  818. package/dist/docs/reference/model/vector3.md +0 -47
  819. package/dist/docs/reference/text/Bounds2Data.md +0 -34
  820. package/dist/docs/reference/text/Vector2Data.md +0 -7
  821. package/dist/docs/reference/text/VectorTextArcBaseline.md +0 -53
  822. package/dist/docs/reference/text/VectorTextLayout.md +0 -34
  823. package/dist/docs/reference/text/VectorTextLayoutOptions.md +0 -111
  824. package/dist/docs/reference/text/VectorTextMetrics.md +0 -94
  825. package/dist/docs/reference/text/VectorTextOptions.md +0 -50
  826. package/dist/engine/export-3mf.js +0 -116
  827. package/dist/engine/model-dependencies.js +0 -46
  828. package/dist/engine/session-graph.js +0 -449
  829. package/dist/geometry/profiles/profiles.js +0 -71
  830. /package/dist/engine/{primitive-profile-types.js → operations/primitives/profile-types.js} +0 -0
  831. /package/dist/{engine → geometry/mesh}/mesh-view-cache.js +0 -0
  832. /package/dist/geometry/profiles/{matched.js → match-profiles.js} +0 -0
@@ -0,0 +1,209 @@
1
+ import { GeometryError } from "../geometry/errors.js";
2
+ import { renderMesh } from "../geometry/mesh/mesh-render.js";
3
+ import { captureExport } from "./capture.js";
4
+ import { collectExport, createExportWriter } from "./writer.js";
5
+ const alignedLength = (length) => Math.ceil(length / 4) * 4;
6
+ const linearChannel = (value) => value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;
7
+ function baseColor(color) {
8
+ return [
9
+ linearChannel(Number.parseInt(color.slice(1, 3), 16) / 255),
10
+ linearChannel(Number.parseInt(color.slice(3, 5), 16) / 255),
11
+ linearChannel(Number.parseInt(color.slice(5, 7), 16) / 255),
12
+ 1,
13
+ ];
14
+ }
15
+ /**
16
+ * Serializes captured local meshes as uncompressed glTF 2.0 binary, in metres and Y-up.
17
+ * Preserves named parts, placement, shared geometry and display appearance. Authored normals take
18
+ * precedence over crease-aware shading; no engine, renderer or optional compression codec is loaded.
19
+ */
20
+ export function exportGlb(parts, options = {}) {
21
+ return collectExport((sink) => writeGlb(parts, sink, options));
22
+ }
23
+ /**
24
+ * Writes owned GLB chunks with backpressure, cancellation and explicit output limits.
25
+ * Plans accessor and container lengths before writing, then emits bounded binary chunks.
26
+ * Hosts own sink completion, scheduling and recovery after a partially written failure.
27
+ */
28
+ export async function writeGlb(parts, sink, options = {}) {
29
+ const captured = captureExport(parts, options, "glb");
30
+ const creaseAngle = options.creaseAngle ?? 20;
31
+ if (!Number.isFinite(creaseAngle) || creaseAngle < 0 || creaseAngle > 180)
32
+ throw new GeometryError("INVALID_ARGUMENT", "Crease angle must be from 0 through 180 degrees.", {
33
+ operation: "exportGlb",
34
+ });
35
+ const writer = createExportWriter(captured, sink, "glb");
36
+ const accessors = [];
37
+ const bufferViews = [];
38
+ const attributes = [];
39
+ const materials = [];
40
+ const meshes = [];
41
+ const nodes = [];
42
+ const geometryAccessors = new Map();
43
+ const materialIndices = new Map();
44
+ const meshIndices = new Map();
45
+ let binaryLength = 0;
46
+ let lastYield = performance.now();
47
+ const addAttribute = (data, componentType, type, bounds) => {
48
+ const byteLength = data.length * (componentType === 5123 ? 2 : 4);
49
+ const bufferView = bufferViews.length;
50
+ bufferViews.push({
51
+ buffer: 0,
52
+ byteOffset: binaryLength,
53
+ byteLength,
54
+ target: type === "SCALAR" ? 34963 : 34962,
55
+ });
56
+ binaryLength += alignedLength(byteLength);
57
+ if (binaryLength > captured.limits.maxOutputBytes || binaryLength >= 0x1_0000_0000)
58
+ throw new GeometryError("COMPLEXITY_LIMIT", "GLB binary data exceeds the output limits.", {
59
+ operation: "exportGlb",
60
+ });
61
+ attributes.push({ data, componentType, byteLength });
62
+ const accessor = accessors.length;
63
+ accessors.push({
64
+ bufferView,
65
+ componentType,
66
+ count: data.length / (type === "VEC3" ? 3 : 1),
67
+ type,
68
+ ...bounds,
69
+ });
70
+ return accessor;
71
+ };
72
+ for (const part of captured.parts) {
73
+ captured.signal?.throwIfAborted();
74
+ let geometry = geometryAccessors.get(part.geometry);
75
+ if (geometry === undefined) {
76
+ const rendered = part.geometry.normals === undefined
77
+ ? renderMesh(part.geometry, { creaseAngle })
78
+ : { ...part.geometry, normals: part.geometry.normals };
79
+ const min = [Infinity, Infinity, Infinity];
80
+ const max = [-Infinity, -Infinity, -Infinity];
81
+ for (let index = 0; index < rendered.positions.length; index += 3)
82
+ for (let axis = 0; axis < 3; axis += 1) {
83
+ min[axis] = Math.min(min[axis], rendered.positions[index + axis]);
84
+ max[axis] = Math.max(max[axis], rendered.positions[index + axis]);
85
+ }
86
+ const position = addAttribute(rendered.positions, 5126, "VEC3", { min, max });
87
+ const normal = addAttribute(rendered.normals, 5126, "VEC3");
88
+ let maximumIndex = 0;
89
+ for (const index of rendered.indices)
90
+ maximumIndex = Math.max(maximumIndex, index);
91
+ // glTF reserves the component type's largest integer for primitive restart.
92
+ const indices = addAttribute(rendered.indices, maximumIndex < 65_535 ? 5123 : 5125, "SCALAR");
93
+ geometry = { position, normal, indices };
94
+ geometryAccessors.set(part.geometry, geometry);
95
+ }
96
+ const color = part.color ?? "#ffffff";
97
+ const materialKey = `${part.materialId ?? ""}:${color.toLowerCase()}`;
98
+ let material = materialIndices.get(materialKey);
99
+ if (material === undefined) {
100
+ material = materials.length;
101
+ materials.push({
102
+ ...(part.materialId === undefined
103
+ ? {}
104
+ : { name: part.materialId, extras: { materialId: part.materialId } }),
105
+ pbrMetallicRoughness: {
106
+ baseColorFactor: baseColor(color),
107
+ metallicFactor: 0,
108
+ roughnessFactor: 1,
109
+ },
110
+ });
111
+ materialIndices.set(materialKey, material);
112
+ }
113
+ const meshKey = `${geometry.position}:${material}`;
114
+ let mesh = meshIndices.get(meshKey);
115
+ if (mesh === undefined) {
116
+ mesh = meshes.length;
117
+ meshes.push({
118
+ primitives: [
119
+ {
120
+ attributes: { POSITION: geometry.position, NORMAL: geometry.normal },
121
+ indices: geometry.indices,
122
+ material,
123
+ },
124
+ ],
125
+ });
126
+ meshIndices.set(meshKey, mesh);
127
+ }
128
+ const transform = part.transform;
129
+ const matrix = Array.from({ length: 16 }, (_, index) => transform[(index % 4) * 4 + Math.floor(index / 4)]);
130
+ nodes.push({ name: part.id, mesh, matrix });
131
+ if (performance.now() - lastYield >= 16) {
132
+ await new Promise((resolve) => setTimeout(resolve, 0));
133
+ lastYield = performance.now();
134
+ }
135
+ }
136
+ captured.signal?.throwIfAborted();
137
+ const rootNode = nodes.length;
138
+ nodes.push({
139
+ name: captured.name,
140
+ // Column-major matrix: x'=x/1000, y'=z/1000, z'=-y/1000.
141
+ matrix: [0.001, 0, 0, 0, 0, 0, -0.001, 0, 0, 0.001, 0, 0, 0, 0, 0, 1],
142
+ children: Array.from({ length: rootNode }, (_, index) => index),
143
+ });
144
+ const json = new TextEncoder().encode(JSON.stringify({
145
+ asset: { version: "2.0", generator: "MetaMesh" },
146
+ scene: 0,
147
+ scenes: [{ name: captured.name, nodes: [rootNode] }],
148
+ nodes,
149
+ meshes,
150
+ materials,
151
+ accessors,
152
+ bufferViews,
153
+ buffers: [{ byteLength: binaryLength }],
154
+ }));
155
+ const paddedJsonLength = alignedLength(json.byteLength);
156
+ const fileLength = 12 + 8 + paddedJsonLength + 8 + binaryLength;
157
+ if (fileLength >= 0x1_0000_0000 || fileLength > captured.limits.maxOutputBytes)
158
+ throw new GeometryError("COMPLEXITY_LIMIT", "GLB container exceeds the output limits.", {
159
+ operation: "exportGlb",
160
+ });
161
+ const header = new Uint8Array(20);
162
+ const headerView = new DataView(header.buffer);
163
+ headerView.setUint32(0, 0x46546c67, true);
164
+ headerView.setUint32(4, 2, true);
165
+ headerView.setUint32(8, fileLength, true);
166
+ headerView.setUint32(12, paddedJsonLength, true);
167
+ headerView.setUint32(16, 0x4e4f534a, true);
168
+ await writer.write(header);
169
+ const paddedJson = new Uint8Array(paddedJsonLength).fill(0x20);
170
+ paddedJson.set(json);
171
+ for (let start = 0; start < paddedJson.length; start += 65_536)
172
+ await writer.write(paddedJson.slice(start, start + 65_536));
173
+ const binaryHeader = new Uint8Array(8);
174
+ const binaryHeaderView = new DataView(binaryHeader.buffer);
175
+ binaryHeaderView.setUint32(0, binaryLength, true);
176
+ binaryHeaderView.setUint32(4, 0x004e4942, true);
177
+ await writer.write(binaryHeader);
178
+ for (const attribute of attributes) {
179
+ const width = attribute.componentType === 5123 ? 2 : 4;
180
+ const elementsPerChunk = 65_536 / width;
181
+ for (let start = 0; start < attribute.data.length; start += elementsPerChunk) {
182
+ const count = Math.min(elementsPerChunk, attribute.data.length - start);
183
+ const chunk = new Uint8Array(count * width);
184
+ const view = new DataView(chunk.buffer);
185
+ for (let index = 0; index < count; index += 1) {
186
+ const value = attribute.data[start + index];
187
+ if (attribute.componentType === 5126)
188
+ view.setFloat32(index * width, value, true);
189
+ else if (attribute.componentType === 5123)
190
+ view.setUint16(index * width, value, true);
191
+ else
192
+ view.setUint32(index * width, value, true);
193
+ }
194
+ await writer.write(chunk);
195
+ }
196
+ const padding = alignedLength(attribute.byteLength) - attribute.byteLength;
197
+ if (padding > 0)
198
+ await writer.write(new Uint8Array(padding));
199
+ }
200
+ const diagnostics = [];
201
+ const assigned = captured.parts.filter((part) => part.materialId !== undefined);
202
+ if (assigned.length > 0)
203
+ diagnostics.push({
204
+ code: "MATERIAL_ASSIGNMENTS_DROPPED",
205
+ message: "GLB preserves material identities as metadata and appearance, without print material assignment semantics.",
206
+ partIds: assigned.map((part) => part.id),
207
+ });
208
+ return writer.report(diagnostics);
209
+ }
@@ -0,0 +1,5 @@
1
+ /** Runtime-independent completed-mesh export. All input coordinates are millimetres, right-handed, and Z-up. @packageDocumentation */
2
+ export { export3mf, write3mf } from "./3mf.js";
3
+ export { exportStl, writeStl } from "./stl.js";
4
+ export { exportGlb, writeGlb } from "./glb.js";
5
+ export { defaultExportLimits } from "./limits.js";
@@ -0,0 +1,18 @@
1
+ import { GeometryError } from "../geometry/errors.js";
2
+ /** Default standalone export policy: 64 parts, one million vertices, two million triangles, 96 MiB input, 512 MiB output. */
3
+ export const defaultExportLimits = Object.freeze({
4
+ maxParts: 64,
5
+ maxVertices: 1_000_000,
6
+ maxTriangles: 2_000_000,
7
+ maxBytes: 96 * 1024 * 1024,
8
+ maxOutputBytes: 512 * 1024 * 1024,
9
+ });
10
+ export function resolveExportLimits(overrides = {}) {
11
+ if (typeof overrides !== "object" || overrides === null || Array.isArray(overrides))
12
+ throw new GeometryError("INVALID_ARGUMENT", "Export limits must be an object.");
13
+ const limits = { ...defaultExportLimits, ...overrides };
14
+ for (const key of Object.keys(defaultExportLimits))
15
+ if (!Number.isSafeInteger(limits[key]) || limits[key] < 1)
16
+ throw new GeometryError("INVALID_ARGUMENT", `${key} must be a positive safe integer.`);
17
+ return Object.freeze(limits);
18
+ }
@@ -0,0 +1,105 @@
1
+ import { GeometryError } from "../geometry/errors.js";
2
+ import { captureExport } from "./capture.js";
3
+ import { collectExport, createExportWriter } from "./writer.js";
4
+ const TRIANGLES_PER_CHUNK = 1_024;
5
+ /**
6
+ * Serializes a captured model as binary STL in millimetres and Z-up coordinates.
7
+ * Placement is baked into triangles. Diagnostics describe dropped names, appearance and materials.
8
+ * Mutable input is captured before the first await; no engine or renderer is needed.
9
+ */
10
+ export function exportStl(parts, options = {}) {
11
+ return collectExport((sink) => writeStl(parts, sink, options));
12
+ }
13
+ /**
14
+ * Writes owned binary STL chunks to a sink, awaiting backpressure after each bounded chunk.
15
+ * The host owns sink completion and recovery after failure. Honors cancellation and output limits.
16
+ */
17
+ export async function writeStl(parts, sink, options = {}) {
18
+ const captured = captureExport(parts, options, "stl");
19
+ const writer = createExportWriter(captured, sink, "stl");
20
+ const triangleCount = captured.parts.reduce((total, part) => total + part.geometry.indices.length / 3, 0);
21
+ const byteLength = 84 + triangleCount * 50;
22
+ if (triangleCount >= 0x1_0000_0000 || byteLength > captured.limits.maxOutputBytes)
23
+ throw new GeometryError("COMPLEXITY_LIMIT", "Binary STL exceeds the output limits.", {
24
+ operation: "exportStl",
25
+ });
26
+ const header = new Uint8Array(84);
27
+ header.set(new TextEncoder().encode(`MetaMesh ${captured.name}`).subarray(0, 80));
28
+ new DataView(header.buffer).setUint32(80, triangleCount, true);
29
+ await writer.write(header);
30
+ let chunk = new Uint8Array(Math.min(TRIANGLES_PER_CHUNK, triangleCount) * 50);
31
+ let view = new DataView(chunk.buffer);
32
+ let writtenTriangles = 0;
33
+ let chunkTriangles = 0;
34
+ const triangle = new Float32Array(9);
35
+ for (const part of captured.parts) {
36
+ const { positions, indices } = part.geometry;
37
+ const matrix = part.transform;
38
+ for (let offset = 0; offset < indices.length; offset += 3) {
39
+ for (let corner = 0; corner < 3; corner += 1) {
40
+ const index = indices[offset + corner] * 3;
41
+ const x = positions[index];
42
+ const y = positions[index + 1];
43
+ const z = positions[index + 2];
44
+ for (let axis = 0; axis < 3; axis += 1) {
45
+ const row = axis * 4;
46
+ const value = Math.fround(matrix[row] * x + matrix[row + 1] * y + matrix[row + 2] * z + matrix[row + 3]);
47
+ if (!Number.isFinite(value))
48
+ throw new GeometryError("NON_FINITE_VALUE", "Placed STL positions must fit finite Float32 coordinates.", { operation: "exportStl" });
49
+ triangle[corner * 3 + axis] = value;
50
+ }
51
+ }
52
+ const ux = triangle[3] - triangle[0];
53
+ const uy = triangle[4] - triangle[1];
54
+ const uz = triangle[5] - triangle[2];
55
+ const vx = triangle[6] - triangle[0];
56
+ const vy = triangle[7] - triangle[1];
57
+ const vz = triangle[8] - triangle[2];
58
+ const nx = uy * vz - uz * vy;
59
+ const ny = uz * vx - ux * vz;
60
+ const nz = ux * vy - uy * vx;
61
+ const length = Math.hypot(nx, ny, nz);
62
+ if (length === 0)
63
+ throw new GeometryError("DEGENERATE_GEOMETRY", "Placed STL triangles must retain nonzero area in Float32 coordinates.", { operation: "exportStl" });
64
+ const target = chunkTriangles * 50;
65
+ view.setFloat32(target, nx === 0 ? 0 : nx / length, true);
66
+ view.setFloat32(target + 4, ny === 0 ? 0 : ny / length, true);
67
+ view.setFloat32(target + 8, nz === 0 ? 0 : nz / length, true);
68
+ for (let index = 0; index < 9; index += 1)
69
+ view.setFloat32(target + 12 + index * 4, triangle[index], true);
70
+ view.setUint16(target + 48, 0, true);
71
+ chunkTriangles += 1;
72
+ writtenTriangles += 1;
73
+ if (chunkTriangles * 50 === chunk.byteLength) {
74
+ await writer.write(chunk);
75
+ chunkTriangles = 0;
76
+ if (writtenTriangles < triangleCount) {
77
+ chunk = new Uint8Array(Math.min(TRIANGLES_PER_CHUNK, triangleCount - writtenTriangles) * 50);
78
+ view = new DataView(chunk.buffer);
79
+ }
80
+ }
81
+ }
82
+ }
83
+ const diagnostics = [
84
+ {
85
+ code: "PART_NAMES_DROPPED",
86
+ message: "Binary STL stores triangles without semantic part names.",
87
+ partIds: captured.parts.map((part) => part.id),
88
+ },
89
+ ];
90
+ const colored = captured.parts.filter((part) => part.color !== undefined);
91
+ if (colored.length > 0)
92
+ diagnostics.push({
93
+ code: "APPEARANCE_DROPPED",
94
+ message: "Portable binary STL does not preserve display colors.",
95
+ partIds: colored.map((part) => part.id),
96
+ });
97
+ const assigned = captured.parts.filter((part) => part.materialId !== undefined);
98
+ if (assigned.length > 0)
99
+ diagnostics.push({
100
+ code: "MATERIAL_ASSIGNMENTS_DROPPED",
101
+ message: "Binary STL does not preserve print material assignments.",
102
+ partIds: assigned.map((part) => part.id),
103
+ });
104
+ return writer.report(diagnostics);
105
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,54 @@
1
+ import { GeometryError } from "../geometry/errors.js";
2
+ const mediaTypes = {
3
+ "3mf": "model/3mf",
4
+ stl: "model/stl",
5
+ glb: "model/gltf-binary",
6
+ };
7
+ /** Shared output accounting and backpressure. Input resources are never passed to the host sink. */
8
+ export function createExportWriter(captured, sink, format) {
9
+ if (typeof sink !== "function")
10
+ throw new TypeError("An export sink must be a function.");
11
+ let byteLength = 0;
12
+ let lastYield = performance.now();
13
+ return {
14
+ async write(chunk) {
15
+ captured.signal?.throwIfAborted();
16
+ const chunkLength = chunk.byteLength;
17
+ if (byteLength + chunkLength > captured.limits.maxOutputBytes)
18
+ throw new GeometryError("COMPLEXITY_LIMIT", "Encoded export exceeds maxOutputBytes.", {
19
+ operation: `export${format}`,
20
+ });
21
+ await sink(chunk);
22
+ // The sink owns this chunk and may transfer/detach its buffer before resolving.
23
+ byteLength += chunkLength;
24
+ // Yield to the host's task queue so a Worker can receive cancellation while writing.
25
+ if (performance.now() - lastYield >= 16) {
26
+ await new Promise((resolve) => setTimeout(resolve, 0));
27
+ lastYield = performance.now();
28
+ }
29
+ captured.signal?.throwIfAborted();
30
+ },
31
+ report(diagnostics = []) {
32
+ return Object.freeze({
33
+ mediaType: mediaTypes[format],
34
+ extension: format,
35
+ byteLength,
36
+ diagnostics: Object.freeze([...diagnostics]),
37
+ });
38
+ },
39
+ };
40
+ }
41
+ /** Buffered convenience over the same streaming implementation; allocation is bounded by the writer's output ceiling. */
42
+ export async function collectExport(write) {
43
+ const chunks = [];
44
+ const report = await write((chunk) => {
45
+ chunks.push(chunk);
46
+ });
47
+ const bytes = new Uint8Array(report.byteLength);
48
+ let offset = 0;
49
+ for (const chunk of chunks) {
50
+ bytes.set(chunk, offset);
51
+ offset += chunk.byteLength;
52
+ }
53
+ return Object.freeze({ ...report, bytes });
54
+ }
@@ -32,11 +32,7 @@ const boxFaces = {
32
32
  const primitiveAnchorOrigin = (options, operation) => {
33
33
  if (options.center !== undefined && typeof options.center !== "boolean")
34
34
  throw new GeometryError("INVALID_ARGUMENT", "center must be boolean.", { operation });
35
- const origin = options.origin === undefined ? [0, 0, 0] : options.origin;
36
- if (!Array.isArray(origin) || origin.length !== 3)
37
- throw new GeometryError("INVALID_ARGUMENT", "origin must be an exact XYZ tuple.", {
38
- operation,
39
- });
35
+ const origin = options.origin === undefined ? [0, 0, 0] : vector3Data(options.origin);
40
36
  for (let axis = 0; axis < 3; axis++)
41
37
  if (!Number.isFinite(origin[axis]))
42
38
  throw new GeometryError("NON_FINITE_VALUE", "Anchor origin must be finite.", { operation });
@@ -54,12 +50,9 @@ export function boxAnchor3(options) {
54
50
  const operation = "boxAnchor3";
55
51
  assertAnchorOptions(options, operation);
56
52
  const origin = primitiveAnchorOrigin(options, operation);
57
- if (typeof options.size !== "number" &&
58
- (!Array.isArray(options.size) || options.size.length !== 3))
59
- throw new GeometryError("INVALID_ARGUMENT", "Box anchor size must be a number or XYZ tuple.", {
60
- operation,
61
- });
62
- const size = typeof options.size === "number" ? [options.size, options.size, options.size] : options.size;
53
+ const size = typeof options.size === "number"
54
+ ? [options.size, options.size, options.size]
55
+ : vector3Data(options.size);
63
56
  for (let axis = 0; axis < 3; axis++)
64
57
  if (!Number.isFinite(size[axis]) || size[axis] <= 0)
65
58
  throw new GeometryError("INVALID_ARGUMENT", "Box anchor dimensions must be positive.", {
@@ -1,7 +1,7 @@
1
1
  import { boundsCenter, boundsSize, containsBounds, validateBounds } from "./bounds.js";
2
- import { GeometryError } from "./errors.js";
2
+ import { GeometryError, isGeometryError } from "./errors.js";
3
3
  import { immutableMathClass } from "./math/immutable-value.js";
4
- import { vector2, vector3 } from "./math/vector-value.js";
4
+ import { vector2, vector2Data, vector3, vector3Data, } from "./math/vector-value.js";
5
5
  function fail(dimension, message) {
6
6
  throw new GeometryError("INVALID_ARGUMENT", message, { operation: `bounds${dimension}` });
7
7
  }
@@ -9,18 +9,28 @@ function snapshot(input, dimension) {
9
9
  if (typeof input !== "object" || input === null || Array.isArray(input))
10
10
  fail(dimension, "Bounds require extrema or size.");
11
11
  const { size, center } = input;
12
+ const coordinates = (value) => {
13
+ try {
14
+ return dimension === 2
15
+ ? vector2Data(value)
16
+ : vector3Data(value);
17
+ }
18
+ catch (error) {
19
+ if (isGeometryError(error) && error.code === "INVALID_ARGUMENT")
20
+ fail(dimension, `Bounds require matching ${dimension}D vectors or coordinate tuples.`);
21
+ throw error;
22
+ }
23
+ };
12
24
  let min, max;
13
25
  // Existing immutable bounds expose size()/center(); only a size value selects construction.
14
26
  if ("size" in input && typeof size !== "function") {
15
27
  if ("min" in input || "max" in input)
16
28
  fail(dimension, "Supply size or min/max, never both.");
17
- if (!Array.isArray(size) || size.length !== dimension)
18
- fail(dimension, `Size requires ${dimension}D coordinates.`);
19
29
  if (center !== undefined && typeof center !== "boolean")
20
30
  fail(dimension, "center must be boolean.");
21
- const coordinates = size;
31
+ const sizeCoordinates = coordinates(size);
22
32
  const dimensions = Array.from({ length: dimension }, (_, axis) => {
23
- const value = coordinates[axis];
33
+ const value = sizeCoordinates[axis];
24
34
  if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
25
35
  fail(dimension, "Size must be finite and nonnegative.");
26
36
  return value;
@@ -33,8 +43,8 @@ function snapshot(input, dimension) {
33
43
  if (center !== undefined && typeof center !== "function")
34
44
  fail(dimension, "center requires size construction.");
35
45
  const extrema = input;
36
- min = extrema.min;
37
- max = extrema.max;
46
+ min = coordinates(extrema.min);
47
+ max = coordinates(extrema.max);
38
48
  }
39
49
  if (!Array.isArray(min) ||
40
50
  !Array.isArray(max) ||
@@ -101,8 +111,8 @@ const SpatialBounds = /* @__PURE__ */ immutableMathClass(class SpatialBounds {
101
111
  * Zero extents are valid. Invalid dimensions, nonfinite coordinates, reversed bounds and
102
112
  * overflowing extents throw `INVALID_ARGUMENT` GeometryError. Use `toData()` for plain records.
103
113
  * Size construction centers on the origin unless `center` is false. Size and extrema are exclusive.
104
- * Compiled Generator packages passing these values to host recipes or computed data require
105
- * runtime 9.0.0 or newer in major 9.
114
+ * Compiled Generator packages passing these values to host recipes or memo data require
115
+ * the current Modeling runtime.
106
116
  */
107
117
  export function bounds2(input) {
108
118
  return new PlanarBounds(snapshot(input, 2));
@@ -113,8 +123,8 @@ export function bounds2(input) {
113
123
  * Zero extents are valid. Invalid dimensions, nonfinite coordinates, reversed bounds and
114
124
  * overflowing extents throw `INVALID_ARGUMENT` GeometryError. Use `toData()` for plain records.
115
125
  * Size construction centers on the origin unless `center` is false. Size and extrema are exclusive.
116
- * Compiled Generator packages passing these values to host recipes or computed data require
117
- * runtime 9.0.0 or newer in major 9.
126
+ * Compiled Generator packages passing these values to host recipes or memo data require
127
+ * the current Modeling runtime.
118
128
  */
119
129
  export function bounds3(input) {
120
130
  return new SpatialBounds(snapshot(input, 3));
@@ -1,4 +1,5 @@
1
1
  import { GeometryError } from "./errors.js";
2
+ import { vector2Data } from "./math/vector-value.js";
2
3
  import { validateTriangleMesh } from "./mesh/mesh.js";
3
4
  import { assertMeshAllocationWithinLimits, resolveModelingLimits, } from "./model-limits.js";
4
5
  import { writeMeshVertex } from "./numeric.js";
@@ -33,21 +34,18 @@ function planHeightfield(options, limits) {
33
34
  yAt = (index) => coordinates.y[index];
34
35
  }
35
36
  else {
36
- if (!Array.isArray(options.size) ||
37
- options.size.length !== 2 ||
38
- !options.size.every((value) => Number.isFinite(value) && value > 0) ||
37
+ const size = vector2Data(options.size);
38
+ const origin = options.origin === undefined ? undefined : vector2Data(options.origin);
39
+ if (!size.every((value) => Number.isFinite(value) && value > 0) ||
39
40
  !Array.isArray(options.segments) ||
40
41
  options.segments.length !== 2 ||
41
42
  !options.segments.every((value) => Number.isSafeInteger(value) && value > 0) ||
42
- (options.origin !== undefined &&
43
- (!Array.isArray(options.origin) ||
44
- options.origin.length !== 2 ||
45
- !options.origin.every(Number.isFinite)))) {
43
+ (origin !== undefined && !origin.every(Number.isFinite))) {
46
44
  throw new GeometryError("INVALID_ARGUMENT", "Uniform heightfields need a finite positive footprint, integer intervals, and finite origin.", { operation });
47
45
  }
48
46
  [x, y] = options.segments;
49
- const [width, depth] = options.size;
50
- const [originX, originY] = options.origin ?? [-width / 2, -depth / 2];
47
+ const [width, depth] = size;
48
+ const [originX, originY] = origin ?? [-width / 2, -depth / 2];
51
49
  xAt = (index) => originX + (width * index) / x;
52
50
  yAt = (index) => originY + (depth * index) / y;
53
51
  }
@@ -84,7 +82,7 @@ function planHeightfield(options, limits) {
84
82
  * Successful preflight leaves height values, Float32 base storage, and generated mesh validity to
85
83
  * construction. `byteCount` covers position and index buffers, not total working memory.
86
84
  *
87
- * @see {@link heightfieldMesh}
85
+ * @see `mesh.heightfield`
88
86
  */
89
87
  export function preflightHeightfield(options, limits = {}) {
90
88
  return planHeightfield(options, limits).facts;
@@ -96,11 +94,11 @@ export function preflightHeightfield(options, limits = {}) {
96
94
  * Top winding is +Z, the base is -Z, and sides face outward. Coordinates and heights must fit
97
95
  * Float32 storage. Explicit axes are captured before sampling; shared wall vertices prevent cracks.
98
96
  *
99
- * @see {@link preflightHeightfield}
97
+ * @see `mesh.preflightHeightfield`
100
98
  *
101
99
  * @example Sample a closed wavy mesh
102
100
  * ```ts
103
- * heightfieldMesh({
101
+ * mesh.heightfield({
104
102
  * size: [30, 20], segments: [24, 16],
105
103
  * height: ([x, y]) => 3 + Math.cos(x / 5) * Math.cos(y / 5),
106
104
  * });
@@ -1,6 +1,7 @@
1
1
  const constructors = { Float32Array, Float64Array, Uint32Array, Uint8Array, Int32Array };
2
- const protocol = Symbol.for("@metamesh/modeling/immutable-buffer/1");
2
+ const protocol = Symbol.for("@metamesh/modeling/immutable-buffer/2");
3
3
  const storage = new WeakMap();
4
+ const ownedBuffers = new WeakMap();
4
5
  const adopted = new WeakMap();
5
6
  /**
6
7
  * Copies numeric data once into private storage. This pure helper needs no active generation.
@@ -10,6 +11,7 @@ const adopted = new WeakMap();
10
11
  * const heights = immutableBuffer(new Float32Array([2, 4, 6]));
11
12
  * const count = heights.length;
12
13
  * const first = heights.at(0);
14
+ * const doubled = Array.from(heights, (height) => height * 2);
13
15
  * const editable = heights.copy();
14
16
  * editable[0] = 8; // heights still contains 2, 4, 6.
15
17
  * ```
@@ -18,8 +20,19 @@ export function immutableBuffer(source) {
18
20
  const entry = Object.entries(constructors).find(([, constructor]) => source instanceof constructor);
19
21
  if (entry === undefined)
20
22
  throw new TypeError("immutableBuffer requires a supported numeric typed array.");
21
- const [kind, constructor] = entry;
23
+ const constructor = entry[1];
22
24
  const owned = new constructor(source);
25
+ return ownImmutableBuffer(owned);
26
+ }
27
+ /** Wraps storage whose exclusive mutable ownership has already been captured by the host. */
28
+ export function ownImmutableBuffer(owned) {
29
+ const previous = ownedBuffers.get(owned);
30
+ if (previous !== undefined)
31
+ return previous;
32
+ const entry = Object.entries(constructors).find(([, constructor]) => owned instanceof constructor);
33
+ if (entry === undefined)
34
+ throw new TypeError("Unsupported owned numeric storage.");
35
+ const [kind, constructor] = entry;
23
36
  const length = owned.length;
24
37
  const result = Object.freeze({
25
38
  [protocol]: kind,
@@ -29,28 +42,28 @@ export function immutableBuffer(source) {
29
42
  return Number.isInteger(offset) && offset >= 0 && offset < length ? owned[offset] : undefined;
30
43
  },
31
44
  copy: () => new constructor(owned),
45
+ [Symbol.iterator]: () => owned.values(),
32
46
  });
33
47
  storage.set(result, owned);
48
+ ownedBuffers.set(owned, result);
34
49
  return result;
35
50
  }
36
51
  /**
37
52
  * Copies mesh buffers into immutable data; geometric validation still occurs when modeling or finalizing.
38
53
  * @example
39
54
  * ```ts
40
- * import { generate, immutableMesh } from "@metamesh/modeling";
41
- * import { heightfieldMesh } from "@metamesh/modeling/geometry";
42
- * const model = generate(({ computed, part }) => {
43
- * const surface = computed("surface", () => immutableMesh(heightfieldMesh({
44
- * size: [10, 10], segments: [8, 8], height: () => 2,
45
- * })));
46
- * return [part("surface", surface)];
47
- * });
55
+ * import { generate } from "@metamesh/modeling";
56
+ * import * as mesh from "@metamesh/modeling/geometry/mesh";
57
+ * const buildSurface = () => mesh.immutable(mesh.heightfield({
58
+ * size: [10, 10], segments: [8, 8], height: () => 2,
59
+ * }));
60
+ * const model = generate(({ memo, part }) => part("surface", memo(buildSurface)));
48
61
  * ```
49
62
  */
50
63
  export function immutableMesh(mesh) {
51
64
  const { positions, indices } = mesh;
52
65
  if (!(positions instanceof Float32Array) || !(indices instanceof Uint32Array))
53
- throw new TypeError("immutableMesh requires Float32 positions and Uint32 indices.");
66
+ throw new TypeError("mesh.immutable requires Float32 positions and Uint32 indices.");
54
67
  return Object.freeze({
55
68
  positions: immutableBuffer(positions),
56
69
  indices: immutableBuffer(indices),
@@ -75,7 +88,8 @@ export function isImmutableBuffer(value) {
75
88
  Number.isSafeInteger(length) &&
76
89
  length >= 0 &&
77
90
  typeof field("at") === "function" &&
78
- typeof field("copy") === "function");
91
+ typeof field("copy") === "function" &&
92
+ typeof field(Symbol.iterator) === "function");
79
93
  }
80
94
  /** Adopts separately bundled factories once, copying before trusting their storage or methods. */
81
95
  export function adoptImmutableBuffer(buffer) {
@@ -104,6 +118,11 @@ export function immutableBufferView(buffer) {
104
118
  /** Normalizes trusted modeling/finalization inputs without copying or exposing storage publicly. */
105
119
  export function immutableMeshView(mesh) {
106
120
  const { positions, indices } = mesh;
121
+ if (positions instanceof Float32Array &&
122
+ indices instanceof Uint32Array &&
123
+ Object.getOwnPropertyDescriptor(mesh, "positions")?.value === positions &&
124
+ Object.getOwnPropertyDescriptor(mesh, "indices")?.value === indices)
125
+ return mesh;
107
126
  return {
108
127
  positions: isImmutableBuffer(positions) ? immutableBufferView(positions) : positions,
109
128
  indices: isImmutableBuffer(indices) ? immutableBufferView(indices) : indices,