@metamesh/modeling 0.18.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 (843) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +73 -57
  3. package/dist/api/engine.d.ts +7 -47
  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 +7 -7
  9. package/dist/api/index.d.ts +85 -35
  10. package/dist/api/mesh.d.ts +35 -6
  11. package/dist/docs/guides/concepts.md +32 -535
  12. package/dist/docs/guides/fonts.md +4 -4
  13. package/dist/docs/guides/generation.md +52 -45
  14. package/dist/docs/guides/geometry-values.md +193 -0
  15. package/dist/docs/guides/hosting.md +53 -30
  16. package/dist/docs/guides/profiles-and-extrusion.md +252 -0
  17. package/dist/docs/guides/recipes.md +33 -780
  18. package/dist/docs/guides/resolution-and-inspection.md +133 -0
  19. package/dist/docs/guides/solid-joins.md +126 -0
  20. package/dist/docs/guides/standalone-model.md +1 -1
  21. package/dist/docs/guides/svg-and-text.md +215 -0
  22. package/dist/docs/guides/sweeps-and-lofts.md +179 -0
  23. package/dist/docs/guides/transforms-and-placement.md +313 -0
  24. package/dist/docs/manifest.json +2818 -5862
  25. package/dist/docs/reference/engine/GenerationOptions.md +10 -4
  26. package/dist/docs/reference/engine/GeometryResource.md +8 -2
  27. package/dist/docs/reference/engine/ModelDependencies.md +9 -3
  28. package/dist/docs/reference/engine/ModelEngine.md +9 -3
  29. package/dist/docs/reference/engine/ModelEngineOptions.md +9 -3
  30. package/dist/docs/reference/engine/ModelPart.md +9 -3
  31. package/dist/docs/reference/engine/ModelResult.md +8 -2
  32. package/dist/docs/reference/engine/ModelRunArguments.md +7 -1
  33. package/dist/docs/reference/engine/ModelRunOptions.md +10 -4
  34. package/dist/docs/reference/engine/ModelSession.md +7 -1
  35. package/dist/docs/reference/engine/SessionOptions.md +10 -4
  36. package/dist/docs/reference/engine/categories/host-lifecycle.md +3 -8
  37. package/dist/docs/reference/engine/checkModel.md +7 -1
  38. package/dist/docs/reference/engine/createModelEngine.md +10 -3
  39. package/dist/docs/reference/engine/defaultModelingLimits.md +9 -3
  40. package/dist/docs/reference/engine/modelingWasmUrl.md +7 -1
  41. package/dist/docs/reference/engine.md +7 -7
  42. package/dist/docs/reference/export/Export3mfOptions.md +24 -0
  43. package/dist/docs/reference/export/ExportDiagnostic.md +59 -0
  44. package/dist/docs/reference/export/ExportFormat.md +25 -0
  45. package/dist/docs/reference/export/ExportGeometry.md +39 -0
  46. package/dist/docs/reference/export/ExportGlbOptions.md +118 -0
  47. package/dist/docs/reference/export/ExportLimits.md +83 -0
  48. package/dist/docs/reference/export/ExportMaterial.md +47 -0
  49. package/dist/docs/reference/export/ExportOptions.md +94 -0
  50. package/dist/docs/reference/export/ExportPart.md +88 -0
  51. package/dist/docs/reference/export/ExportReport.md +82 -0
  52. package/dist/docs/reference/export/ExportSink.md +39 -0
  53. package/dist/docs/reference/export/ExportStlOptions.md +24 -0
  54. package/dist/docs/reference/export/ExportedFile.md +110 -0
  55. package/dist/docs/reference/export/categories/mesh-serialization.md +47 -0
  56. package/dist/docs/reference/export/defaultExportLimits.md +20 -0
  57. package/dist/docs/reference/export/export3mf.md +64 -0
  58. package/dist/docs/reference/export/exportGlb.md +68 -0
  59. package/dist/docs/reference/export/exportStl.md +64 -0
  60. package/dist/docs/reference/export/write3mf.md +71 -0
  61. package/dist/docs/reference/export/writeGlb.md +75 -0
  62. package/dist/docs/reference/export/writeStl.md +71 -0
  63. package/dist/docs/reference/export.md +21 -0
  64. package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +16 -2
  65. package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +7 -1
  66. package/dist/docs/reference/geometry/Anchor3-type.md +13 -3
  67. package/dist/docs/reference/geometry/ArcCurve2.md +8 -2
  68. package/dist/docs/reference/geometry/ArcCurve3.md +8 -2
  69. package/dist/docs/reference/geometry/AttachOptions.md +13 -3
  70. package/dist/docs/reference/geometry/AxisAngleRotation3.md +9 -3
  71. package/dist/docs/reference/geometry/Bevel.md +16 -2
  72. package/dist/docs/reference/geometry/BevelSize.md +16 -2
  73. package/dist/docs/reference/geometry/Bounds2-type.md +18 -4
  74. package/dist/docs/reference/geometry/Bounds2Data.md +22 -4
  75. package/dist/docs/reference/geometry/Bounds2Input.md +18 -4
  76. package/dist/docs/reference/geometry/Bounds2Options.md +14 -4
  77. package/dist/docs/reference/geometry/Bounds3-type.md +18 -4
  78. package/dist/docs/reference/geometry/Bounds3Data.md +18 -4
  79. package/dist/docs/reference/geometry/Bounds3Input.md +18 -4
  80. package/dist/docs/reference/geometry/Bounds3Options.md +14 -4
  81. package/dist/docs/reference/geometry/BoundsFit2.md +10 -4
  82. package/dist/docs/reference/geometry/BoundsFit3.md +10 -4
  83. package/dist/docs/reference/geometry/BoundsFitOptions.md +10 -4
  84. package/dist/docs/reference/geometry/BoxAnchorFace.md +9 -3
  85. package/dist/docs/reference/geometry/BoxAnchorOptions.md +9 -3
  86. package/dist/docs/reference/geometry/BoxEdge.md +11 -1
  87. package/dist/docs/reference/geometry/BoxEdgeSelection.md +11 -1
  88. package/dist/docs/reference/geometry/BoxEdgeTreatments.md +11 -1
  89. package/dist/docs/reference/geometry/BoxOptions.md +11 -1
  90. package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +16 -2
  91. package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +16 -2
  92. package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +11 -1
  93. package/dist/docs/reference/geometry/CircleContourOptions.md +12 -2
  94. package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +15 -1
  95. package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -1
  96. package/dist/docs/reference/geometry/CircularSampling.md +7 -1
  97. package/dist/docs/reference/geometry/CircularSamplingOptions.md +7 -1
  98. package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +8 -2
  99. package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -2
  100. package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +8 -2
  101. package/dist/docs/reference/geometry/Contour.md +12 -2
  102. package/dist/docs/reference/geometry/ContourCurve.md +8 -2
  103. package/dist/docs/reference/geometry/ContourPoint.md +8 -2
  104. package/dist/docs/reference/geometry/ContourSegment.md +8 -2
  105. package/dist/docs/reference/geometry/CorrespondingComponent.md +12 -2
  106. package/dist/docs/reference/geometry/CorrespondingContour.md +12 -2
  107. package/dist/docs/reference/geometry/CorrespondingProfile.md +12 -2
  108. package/dist/docs/reference/geometry/CorrespondingProfileStation.md +12 -2
  109. package/dist/docs/reference/geometry/CubicBezierCurve2.md +8 -2
  110. package/dist/docs/reference/geometry/CubicBezierCurve3.md +8 -2
  111. package/dist/docs/reference/geometry/Curve2.md +8 -2
  112. package/dist/docs/reference/geometry/Curve3.md +8 -2
  113. package/dist/docs/reference/geometry/CurveSamplingOptions.md +16 -2
  114. package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +16 -2
  115. package/dist/docs/reference/geometry/CylinderAnchorFace.md +9 -3
  116. package/dist/docs/reference/geometry/CylinderAnchorOptions.md +9 -3
  117. package/dist/docs/reference/geometry/CylinderOptions.md +11 -1
  118. package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -2
  119. package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -2
  120. package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +8 -2
  121. package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +8 -2
  122. package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +8 -2
  123. package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +8 -2
  124. package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +8 -2
  125. package/dist/docs/reference/geometry/CylindricalGearSpec.md +8 -2
  126. package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +7 -1
  127. package/dist/docs/reference/geometry/EdgeTreatment.md +11 -1
  128. package/dist/docs/reference/geometry/EllipseContourOptions.md +12 -2
  129. package/dist/docs/reference/geometry/EndTreatments.md +12 -2
  130. package/dist/docs/reference/geometry/ExtrudeMeshOptions.md +16 -2
  131. package/dist/docs/reference/geometry/ExtrudeOptions.md +13 -3
  132. package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +16 -2
  133. package/dist/docs/reference/geometry/FittedTextLayout.md +8 -2
  134. package/dist/docs/reference/geometry/Frame3.md +16 -2
  135. package/dist/docs/reference/geometry/GeometryError.md +11 -1
  136. package/dist/docs/reference/geometry/GeometryErrorCode.md +11 -1
  137. package/dist/docs/reference/geometry/GeometryErrorContext.md +11 -1
  138. package/dist/docs/reference/geometry/GeometryResolution.md +15 -1
  139. package/dist/docs/reference/geometry/GeometrySamplingLimits.md +16 -2
  140. package/dist/docs/reference/geometry/GeometryToleranceOptions.md +15 -1
  141. package/dist/docs/reference/geometry/GridPatternOptions.md +12 -2
  142. package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +12 -2
  143. package/dist/docs/reference/geometry/HeightfieldOptions.md +16 -2
  144. package/dist/docs/reference/geometry/HeightfieldPreflight.md +12 -2
  145. package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +9 -3
  146. package/dist/docs/reference/geometry/ImmutableBuffer-type.md +16 -14
  147. package/dist/docs/reference/geometry/ImmutableTriangleMesh.md +17 -3
  148. package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +12 -2
  149. package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +12 -2
  150. package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +8 -2
  151. package/dist/docs/reference/geometry/KnuckleHingeInterval.md +8 -2
  152. package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +12 -2
  153. package/dist/docs/reference/geometry/KnuckleHingeSpec.md +12 -2
  154. package/dist/docs/reference/geometry/LineCurve2.md +8 -2
  155. package/dist/docs/reference/geometry/LineCurve3.md +8 -2
  156. package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -2
  157. package/dist/docs/reference/geometry/LoftCorrespondence.md +16 -2
  158. package/dist/docs/reference/geometry/LoftMeshStation.md +12 -2
  159. package/dist/docs/reference/geometry/LoftOptions.md +16 -2
  160. package/dist/docs/reference/geometry/LoftPlacement.md +16 -2
  161. package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +8 -2
  162. package/dist/docs/reference/geometry/MatchProfilesOptions.md +12 -2
  163. package/dist/docs/reference/geometry/MetricFastenerSize.md +8 -2
  164. package/dist/docs/reference/geometry/MetricFastenerStandard.md +8 -2
  165. package/dist/docs/reference/geometry/MetricHexNutDimensions.md +8 -2
  166. package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +8 -2
  167. package/dist/docs/reference/geometry/ModelingLimits.md +19 -1
  168. package/dist/docs/reference/geometry/NumericArray.md +16 -2
  169. package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +8 -2
  170. package/dist/docs/reference/geometry/Path2-type.md +16 -2
  171. package/dist/docs/reference/geometry/Path2Data.md +16 -2
  172. package/dist/docs/reference/geometry/Path2Input.md +16 -2
  173. package/dist/docs/reference/geometry/Path3-type.md +16 -2
  174. package/dist/docs/reference/geometry/Path3Data.md +16 -2
  175. package/dist/docs/reference/geometry/Path3Input.md +16 -2
  176. package/dist/docs/reference/geometry/PathFrame.md +8 -2
  177. package/dist/docs/reference/geometry/PathLocation.md +16 -2
  178. package/dist/docs/reference/geometry/PathNormalGuide.md +16 -2
  179. package/dist/docs/reference/geometry/PathOptions.md +12 -2
  180. package/dist/docs/reference/geometry/PathPatternOptions.md +12 -2
  181. package/dist/docs/reference/geometry/PathPlacement.md +8 -2
  182. package/dist/docs/reference/geometry/PathResamplingOptions.md +16 -2
  183. package/dist/docs/reference/geometry/Pivot2Options.md +17 -3
  184. package/dist/docs/reference/geometry/Pivot3Options.md +17 -3
  185. package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +12 -2
  186. package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +12 -2
  187. package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +12 -2
  188. package/dist/docs/reference/geometry/PlanarPatchQuality.md +12 -2
  189. package/dist/docs/reference/geometry/PolygonData.md +12 -2
  190. package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -2
  191. package/dist/docs/reference/geometry/PrimitiveAttachment.md +11 -1
  192. package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +11 -1
  193. package/dist/docs/reference/geometry/PrintableThreadFit.md +12 -2
  194. package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +12 -2
  195. package/dist/docs/reference/geometry/Profile.md +8 -2
  196. package/dist/docs/reference/geometry/ProfileComponent2.md +12 -2
  197. package/dist/docs/reference/geometry/ProfileContour2.md +12 -2
  198. package/dist/docs/reference/geometry/ProfileSpan2.md +12 -2
  199. package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +11 -1
  200. package/dist/docs/reference/geometry/RackPitchDimensions.md +8 -2
  201. package/dist/docs/reference/geometry/RackPitchSpec.md +8 -2
  202. package/dist/docs/reference/geometry/RadialPatternOptions.md +12 -2
  203. package/dist/docs/reference/geometry/RadialSizing.md +11 -1
  204. package/dist/docs/reference/geometry/RadialSizingOptions.md +11 -1
  205. package/dist/docs/reference/geometry/RectangleContourOptions.md +12 -2
  206. package/dist/docs/reference/geometry/RectangleCornerTreatment.md +12 -2
  207. package/dist/docs/reference/geometry/RectangleCornerTreatments.md +12 -2
  208. package/dist/docs/reference/geometry/RectangleProfileOptions.md +8 -2
  209. package/dist/docs/reference/geometry/RegionData.md +12 -2
  210. package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +8 -2
  211. package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +7 -1
  212. package/dist/docs/reference/geometry/RevolveOptions.md +16 -2
  213. package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +11 -1
  214. package/dist/docs/reference/geometry/RowLayoutOptions.md +10 -4
  215. package/dist/docs/reference/geometry/SampleContourOptions.md +8 -2
  216. package/dist/docs/reference/geometry/SampleHelixOptions.md +8 -2
  217. package/dist/docs/reference/geometry/SampleSideProfileOptions.md +8 -2
  218. package/dist/docs/reference/geometry/SampledCurve2.md +8 -2
  219. package/dist/docs/reference/geometry/SampledCurve3.md +8 -2
  220. package/dist/docs/reference/geometry/SampledThreadHelices.md +8 -2
  221. package/dist/docs/reference/geometry/SideProfileCurve.md +8 -2
  222. package/dist/docs/reference/geometry/SideProfilePoint.md +8 -2
  223. package/dist/docs/reference/geometry/SideProfileSegment.md +8 -2
  224. package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +11 -1
  225. package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +12 -2
  226. package/dist/docs/reference/geometry/SphereOptions.md +11 -1
  227. package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +16 -2
  228. package/dist/docs/reference/geometry/StarContourOptions.md +12 -2
  229. package/dist/docs/reference/geometry/StrokeCap.md +12 -2
  230. package/dist/docs/reference/geometry/StrokeJoin.md +12 -2
  231. package/dist/docs/reference/geometry/StrokeOptions.md +12 -2
  232. package/dist/docs/reference/geometry/SvgImportOptions.md +8 -2
  233. package/dist/docs/reference/geometry/SvgRegionPreflight.md +8 -2
  234. package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +8 -2
  235. package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +8 -2
  236. package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +8 -2
  237. package/dist/docs/reference/geometry/SweepOptions.md +16 -2
  238. package/dist/docs/reference/geometry/SweepOrientation.md +16 -2
  239. package/dist/docs/reference/geometry/ThreadBevelOptions.md +12 -2
  240. package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +8 -2
  241. package/dist/docs/reference/geometry/ThreadCompensationOptions.md +8 -2
  242. package/dist/docs/reference/geometry/ThreadEndStyle.md +16 -2
  243. package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +16 -2
  244. package/dist/docs/reference/geometry/ThreadHandedness.md +16 -2
  245. package/dist/docs/reference/geometry/ThreadHelixOptions.md +8 -2
  246. package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +16 -2
  247. package/dist/docs/reference/geometry/ThreadLeadInShape.md +16 -2
  248. package/dist/docs/reference/geometry/ThreadProfile-type.md +16 -2
  249. package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +16 -2
  250. package/dist/docs/reference/geometry/ThreadProfileSpec.md +16 -2
  251. package/dist/docs/reference/geometry/ThreadRidgeOptions.md +16 -2
  252. package/dist/docs/reference/geometry/ThreadRole.md +8 -2
  253. package/dist/docs/reference/geometry/ThreadSolidOptions.md +12 -2
  254. package/dist/docs/reference/geometry/ThreadSolidPreflight.md +16 -2
  255. package/dist/docs/reference/geometry/ThreadedNutOptions.md +12 -2
  256. package/dist/docs/reference/geometry/ThreadedNutPreflight.md +12 -2
  257. package/dist/docs/reference/geometry/ThreadedNutShape.md +12 -2
  258. package/dist/docs/reference/geometry/ThreadedRodOptions.md +12 -2
  259. package/dist/docs/reference/geometry/TorusOptions.md +11 -1
  260. package/dist/docs/reference/geometry/Transform2-type.md +17 -3
  261. package/dist/docs/reference/geometry/Transform2Data.md +17 -3
  262. package/dist/docs/reference/geometry/Transform2Input.md +17 -3
  263. package/dist/docs/reference/geometry/Transform3-type.md +17 -3
  264. package/dist/docs/reference/geometry/Transform3Data.md +17 -3
  265. package/dist/docs/reference/geometry/Transform3Input.md +17 -3
  266. package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +16 -2
  267. package/dist/docs/reference/geometry/TriangleMesh.md +20 -2
  268. package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +16 -2
  269. package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +12 -2
  270. package/dist/docs/reference/geometry/TriangleMeshInput.md +12 -2
  271. package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +16 -2
  272. package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +12 -2
  273. package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +12 -2
  274. package/dist/docs/reference/geometry/TriangleMeshSignature.md +12 -2
  275. package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +12 -2
  276. package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +12 -2
  277. package/dist/docs/reference/geometry/TriangleMeshTopologyAnalysis.md +16 -2
  278. package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +12 -2
  279. package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +16 -2
  280. package/dist/docs/reference/geometry/TubeOptions.md +11 -1
  281. package/dist/docs/reference/geometry/Vector2-type.md +17 -3
  282. package/dist/docs/reference/geometry/Vector2Data.md +21 -3
  283. package/dist/docs/reference/geometry/Vector2Input.md +17 -3
  284. package/dist/docs/reference/geometry/Vector3-type.md +17 -3
  285. package/dist/docs/reference/geometry/Vector3Data.md +17 -3
  286. package/dist/docs/reference/geometry/Vector3Input.md +17 -3
  287. package/dist/docs/reference/geometry/VectorTextArcBaseline.md +12 -2
  288. package/dist/docs/reference/geometry/VectorTextLayout.md +16 -2
  289. package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +12 -2
  290. package/dist/docs/reference/geometry/VectorTextMetrics.md +16 -2
  291. package/dist/docs/reference/geometry/VectorTextOptions.md +12 -2
  292. package/dist/docs/reference/geometry/add2.md +9 -3
  293. package/dist/docs/reference/geometry/add3.md +9 -3
  294. package/dist/docs/reference/geometry/anchor3.md +9 -3
  295. package/dist/docs/reference/geometry/anchorFrame3.md +8 -2
  296. package/dist/docs/reference/geometry/applyTransformDirection3.md +9 -3
  297. package/dist/docs/reference/geometry/applyTransformPoint3.md +9 -3
  298. package/dist/docs/reference/geometry/attachmentTransform3.md +9 -3
  299. package/dist/docs/reference/geometry/bounds2.md +16 -6
  300. package/dist/docs/reference/geometry/bounds3.md +16 -6
  301. package/dist/docs/reference/geometry/boundsCenter.md +10 -4
  302. package/dist/docs/reference/geometry/boundsSize.md +10 -4
  303. package/dist/docs/reference/geometry/boxAnchor3.md +9 -3
  304. package/dist/docs/reference/geometry/categories/bounds-layout.md +4 -4
  305. package/dist/docs/reference/geometry/categories/curves-paths.md +2 -2
  306. package/dist/docs/reference/geometry/categories/mechanical.md +2 -2
  307. package/dist/docs/reference/geometry/categories/meshes.md +3 -3
  308. package/dist/docs/reference/geometry/categories/pattern-placement.md +2 -2
  309. package/dist/docs/reference/geometry/categories/primitive-options.md +2 -2
  310. package/dist/docs/reference/geometry/categories/profiles-regions.md +2 -2
  311. package/dist/docs/reference/geometry/categories/resolution-errors.md +1 -1
  312. package/dist/docs/reference/geometry/categories/transforms-math.md +3 -3
  313. package/dist/docs/reference/geometry/categories/vector-import.md +2 -2
  314. package/dist/docs/reference/geometry/circleContour.md +8 -2
  315. package/dist/docs/reference/geometry/closeToAxis.md +8 -2
  316. package/dist/docs/reference/geometry/compensateThreadDiameters.md +8 -2
  317. package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +8 -2
  318. package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +8 -2
  319. package/dist/docs/reference/geometry/composeTransform3.md +9 -3
  320. package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +8 -2
  321. package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -2
  322. package/dist/docs/reference/geometry/contourContainsPoint.md +8 -2
  323. package/dist/docs/reference/geometry/cross2.md +9 -3
  324. package/dist/docs/reference/geometry/cross3.md +9 -3
  325. package/dist/docs/reference/geometry/cylinderAnchor3.md +9 -3
  326. package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +8 -2
  327. package/dist/docs/reference/geometry/distance2.md +9 -3
  328. package/dist/docs/reference/geometry/distance3.md +9 -3
  329. package/dist/docs/reference/geometry/distributeAlongPath.md +8 -2
  330. package/dist/docs/reference/geometry/dot2.md +9 -3
  331. package/dist/docs/reference/geometry/dot3.md +9 -3
  332. package/dist/docs/reference/geometry/ellipseContour.md +8 -2
  333. package/dist/docs/reference/geometry/eulerTransform3.md +9 -3
  334. package/dist/docs/reference/geometry/fitBounds.md +10 -4
  335. package/dist/docs/reference/geometry/fitTextLayout.md +8 -2
  336. package/dist/docs/reference/geometry/frameTransform3.md +9 -3
  337. package/dist/docs/reference/geometry/getMetricClearanceHoleDiameter.md +8 -2
  338. package/dist/docs/reference/geometry/getMetricFastenerStandard.md +8 -2
  339. package/dist/docs/reference/geometry/gridPatternTransforms.md +8 -2
  340. package/dist/docs/reference/geometry/immutableBuffer.md +12 -2
  341. package/dist/docs/reference/geometry/inverseTransform3.md +9 -3
  342. package/dist/docs/reference/geometry/isGeometryError.md +11 -1
  343. package/dist/docs/reference/geometry/layoutRow.md +10 -4
  344. package/dist/docs/reference/geometry/length2.md +9 -3
  345. package/dist/docs/reference/geometry/length3.md +9 -3
  346. package/dist/docs/reference/geometry/lerp2.md +9 -3
  347. package/dist/docs/reference/geometry/lerp3.md +9 -3
  348. package/dist/docs/reference/geometry/linearPatternTransforms.md +8 -2
  349. package/dist/docs/reference/geometry/matchProfiles.md +8 -2
  350. package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +8 -2
  351. package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +8 -2
  352. package/dist/docs/reference/geometry/normalize2.md +9 -3
  353. package/dist/docs/reference/geometry/normalize3.md +9 -3
  354. package/dist/docs/reference/geometry/normalizeContour.md +8 -2
  355. package/dist/docs/reference/geometry/normalizePolygon.md +8 -2
  356. package/dist/docs/reference/geometry/normalizeRegion.md +8 -2
  357. package/dist/docs/reference/geometry/path2.md +12 -2
  358. package/dist/docs/reference/geometry/path3.md +12 -2
  359. package/dist/docs/reference/geometry/pathPatternTransforms.md +8 -2
  360. package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +8 -2
  361. package/dist/docs/reference/geometry/preflightSvgRegion.md +8 -2
  362. package/dist/docs/reference/geometry/preflightThreadedNut.md +8 -2
  363. package/dist/docs/reference/geometry/preflightThreadedRod.md +8 -2
  364. package/dist/docs/reference/geometry/projectOntoPlane3.md +9 -3
  365. package/dist/docs/reference/geometry/radialPatternTransforms.md +8 -2
  366. package/dist/docs/reference/geometry/rectangleContour.md +8 -2
  367. package/dist/docs/reference/geometry/rectangleProfile.md +8 -2
  368. package/dist/docs/reference/geometry/regionArea.md +8 -2
  369. package/dist/docs/reference/geometry/regionBounds.md +8 -2
  370. package/dist/docs/reference/geometry/regularPolygonContour.md +8 -2
  371. package/dist/docs/reference/geometry/resamplePolyline2.md +8 -2
  372. package/dist/docs/reference/geometry/resamplePolyline3.md +8 -2
  373. package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +7 -1
  374. package/dist/docs/reference/geometry/resolveArcSegments.md +7 -1
  375. package/dist/docs/reference/geometry/resolveCircularSampling.md +7 -1
  376. package/dist/docs/reference/geometry/resolveCircularSegments.md +7 -1
  377. package/dist/docs/reference/geometry/resolveCylindricalGear.md +8 -2
  378. package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +8 -2
  379. package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +8 -2
  380. package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +8 -2
  381. package/dist/docs/reference/geometry/resolveGeometryTolerance.md +7 -1
  382. package/dist/docs/reference/geometry/resolveKnuckleHinge.md +8 -2
  383. package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +8 -2
  384. package/dist/docs/reference/geometry/resolveRackPitch.md +8 -2
  385. package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -2
  386. package/dist/docs/reference/geometry/rotate2.md +9 -3
  387. package/dist/docs/reference/geometry/rotationTransform3.md +9 -3
  388. package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -2
  389. package/dist/docs/reference/geometry/sampleContour.md +8 -2
  390. package/dist/docs/reference/geometry/sampleCurve2.md +8 -2
  391. package/dist/docs/reference/geometry/sampleCurve3.md +8 -2
  392. package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +8 -2
  393. package/dist/docs/reference/geometry/sampleHelix.md +8 -2
  394. package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +8 -2
  395. package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -2
  396. package/dist/docs/reference/geometry/sampleSideProfile.md +8 -2
  397. package/dist/docs/reference/geometry/sampleTextContours.md +8 -2
  398. package/dist/docs/reference/geometry/sampleThreadHelices.md +8 -2
  399. package/dist/docs/reference/geometry/scale2.md +9 -3
  400. package/dist/docs/reference/geometry/scale3.md +9 -3
  401. package/dist/docs/reference/geometry/scaleTransform3.md +9 -3
  402. package/dist/docs/reference/geometry/signedContourArea.md +8 -2
  403. package/dist/docs/reference/geometry/starContour.md +8 -2
  404. package/dist/docs/reference/geometry/strokeRegionData.md +8 -2
  405. package/dist/docs/reference/geometry/subtract2.md +9 -3
  406. package/dist/docs/reference/geometry/subtract3.md +9 -3
  407. package/dist/docs/reference/geometry/threadProfile.md +8 -2
  408. package/dist/docs/reference/geometry/transform2.md +13 -3
  409. package/dist/docs/reference/geometry/transform3.md +13 -3
  410. package/dist/docs/reference/geometry/transformDeterminant3.md +9 -3
  411. package/dist/docs/reference/geometry/transformRegionData.md +8 -2
  412. package/dist/docs/reference/geometry/translationTransform3.md +9 -3
  413. package/dist/docs/reference/geometry/triangulateContour.md +8 -2
  414. package/dist/docs/reference/geometry/validateRigidTransform3.md +9 -3
  415. package/dist/docs/reference/geometry/validateTransform3.md +9 -3
  416. package/dist/docs/reference/geometry/vector2.md +13 -3
  417. package/dist/docs/reference/geometry/vector3.md +13 -3
  418. package/dist/docs/reference/geometry.md +2 -2
  419. package/dist/docs/reference/mesh/MeshRenderOptions.md +28 -0
  420. package/dist/docs/reference/mesh/RenderMesh.md +68 -0
  421. package/dist/docs/reference/mesh/analyze.md +12 -6
  422. package/dist/docs/reference/mesh/analyzeQuality.md +11 -5
  423. package/dist/docs/reference/mesh/bounds.md +10 -4
  424. package/dist/docs/reference/mesh/categories/operations.md +5 -95
  425. package/dist/docs/reference/mesh/centroid.md +10 -4
  426. package/dist/docs/reference/mesh/extrude.md +11 -5
  427. package/dist/docs/reference/mesh/heightfield.md +11 -5
  428. package/dist/docs/reference/mesh/immutable.md +13 -9
  429. package/dist/docs/reference/mesh/join.md +10 -4
  430. package/dist/docs/reference/mesh/loft.md +11 -5
  431. package/dist/docs/reference/mesh/optimizePlanarPatches.md +11 -5
  432. package/dist/docs/reference/mesh/preflightHeightfield.md +11 -5
  433. package/dist/docs/reference/mesh/preflightThreadSolid.md +10 -4
  434. package/dist/docs/reference/mesh/render.md +57 -0
  435. package/dist/docs/reference/mesh/reverse.md +10 -4
  436. package/dist/docs/reference/mesh/revolve.md +11 -5
  437. package/dist/docs/reference/mesh/signature.md +11 -5
  438. package/dist/docs/reference/mesh/sweep.md +12 -6
  439. package/dist/docs/reference/mesh/threadRidge.md +10 -4
  440. package/dist/docs/reference/mesh/threadSolid.md +10 -4
  441. package/dist/docs/reference/mesh/transform.md +11 -5
  442. package/dist/docs/reference/mesh/validate.md +10 -4
  443. package/dist/docs/reference/mesh/validateSolid.md +10 -4
  444. package/dist/docs/reference/mesh.md +1 -1
  445. package/dist/docs/reference/model/CircleOptions.md +13 -7
  446. package/dist/docs/reference/model/DiagnosticOptions.md +7 -1
  447. package/dist/docs/reference/model/EllipseOptions.md +13 -7
  448. package/dist/docs/reference/model/GenerateCallback.md +7 -1
  449. package/dist/docs/reference/model/GenerateContext.md +14 -39
  450. package/dist/docs/reference/model/GenerationDiagnostic.md +7 -1
  451. package/dist/docs/reference/model/GenerationError.md +8 -2
  452. package/dist/docs/reference/model/HoleCutterOptions.md +17 -10
  453. package/dist/docs/reference/model/HoleCutterOverrun.md +10 -3
  454. package/dist/docs/reference/model/HoleCutterRecess.md +10 -3
  455. package/dist/docs/reference/model/HullOptions.md +13 -6
  456. package/dist/docs/reference/model/ImmutableValue.md +7 -1
  457. package/dist/docs/reference/model/ImplicitOptions.md +12 -6
  458. package/dist/docs/reference/model/JoinOptions.md +76 -0
  459. package/dist/docs/reference/model/JoinTransition.md +54 -0
  460. package/dist/docs/reference/model/KnuckleHinge-type.md +9 -3
  461. package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +7 -1
  462. package/dist/docs/reference/model/KnuckleHingeOptions.md +10 -4
  463. package/dist/docs/reference/model/KnuckleHingeWeb.md +7 -1
  464. package/dist/docs/reference/model/LoftStation.md +16 -9
  465. package/dist/docs/reference/model/Memo.md +54 -0
  466. package/dist/docs/reference/model/ModelProgram.md +7 -1
  467. package/dist/docs/reference/model/PartDeclaration.md +11 -6
  468. package/dist/docs/reference/model/PartGeometry.md +10 -4
  469. package/dist/docs/reference/model/PartOptions.md +11 -6
  470. package/dist/docs/reference/model/PatternSource.md +10 -4
  471. package/dist/docs/reference/model/PlaneOptions.md +11 -4
  472. package/dist/docs/reference/model/PolygonOptions.md +20 -14
  473. package/dist/docs/reference/model/Profile.md +10 -4
  474. package/dist/docs/reference/model/RectangleOptions.md +28 -22
  475. package/dist/docs/reference/model/RegularPolygonOptions.md +13 -7
  476. package/dist/docs/reference/model/Section.md +68 -74
  477. package/dist/docs/reference/model/SectionHullOptions.md +13 -6
  478. package/dist/docs/reference/model/SectionInspection.md +10 -4
  479. package/dist/docs/reference/model/SectionOffsetJoin.md +10 -4
  480. package/dist/docs/reference/model/SectionOffsetOptions.md +12 -6
  481. package/dist/docs/reference/model/Solid.md +101 -53
  482. package/dist/docs/reference/model/SolidInspection.md +10 -4
  483. package/dist/docs/reference/model/SolidSegmentHit.md +11 -5
  484. package/dist/docs/reference/model/StarOptions.md +24 -18
  485. package/dist/docs/reference/model/SvgOrigin.md +10 -4
  486. package/dist/docs/reference/model/SvgPathSectionOptions.md +14 -8
  487. package/dist/docs/reference/model/SvgSectionOptions.md +16 -10
  488. package/dist/docs/reference/model/TextSectionOptions.md +14 -8
  489. package/dist/docs/reference/model/box.md +18 -11
  490. package/dist/docs/reference/model/categories/boolean-operations.md +8 -2
  491. package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -7
  492. package/dist/docs/reference/model/categories/explicit-profiles.md +1 -14
  493. package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +6 -20
  494. package/dist/docs/reference/model/categories/generation.md +5 -10
  495. package/dist/docs/reference/model/categories/hinges.md +1 -4
  496. package/dist/docs/reference/model/categories/mesh-inspection.md +2 -6
  497. package/dist/docs/reference/model/categories/primitives.md +5 -21
  498. package/dist/docs/reference/model/categories/sections.md +4 -15
  499. package/dist/docs/reference/model/categories/threads.md +2 -39
  500. package/dist/docs/reference/model/categories/transforms-placement.md +4 -33
  501. package/dist/docs/reference/model/circle.md +10 -4
  502. package/dist/docs/reference/model/cylinder.md +13 -6
  503. package/dist/docs/reference/model/ellipse.md +10 -4
  504. package/dist/docs/reference/model/extrude.md +26 -19
  505. package/dist/docs/reference/model/generate.md +8 -2
  506. package/dist/docs/reference/model/gridPattern.md +15 -9
  507. package/dist/docs/reference/model/heightfield.md +10 -4
  508. package/dist/docs/reference/model/holeCutter.md +10 -3
  509. package/dist/docs/reference/model/hull.md +9 -2
  510. package/dist/docs/reference/model/implicit.md +9 -3
  511. package/dist/docs/reference/model/internalThreadCutter.md +23 -17
  512. package/dist/docs/reference/model/intersect.md +9 -2
  513. package/dist/docs/reference/model/join.md +89 -0
  514. package/dist/docs/reference/model/knuckleHinge.md +7 -1
  515. package/dist/docs/reference/model/linearPattern.md +15 -9
  516. package/dist/docs/reference/model/loft.md +31 -24
  517. package/dist/docs/reference/model/matchProfiles.md +14 -8
  518. package/dist/docs/reference/model/minkowskiSum.md +9 -2
  519. package/dist/docs/reference/model/pathPattern.md +25 -19
  520. package/dist/docs/reference/model/polygon.md +13 -7
  521. package/dist/docs/reference/model/preflightInternalThreadCutter.md +25 -19
  522. package/dist/docs/reference/model/preflightThreadedNut.md +29 -23
  523. package/dist/docs/reference/model/preflightThreadedRod.md +25 -19
  524. package/dist/docs/reference/model/radialPattern.md +15 -9
  525. package/dist/docs/reference/model/rectangle.md +14 -8
  526. package/dist/docs/reference/model/regularPolygon.md +10 -4
  527. package/dist/docs/reference/model/revolve.md +22 -15
  528. package/dist/docs/reference/model/solidFromMesh.md +12 -6
  529. package/dist/docs/reference/model/sphere.md +13 -6
  530. package/dist/docs/reference/model/star.md +12 -6
  531. package/dist/docs/reference/model/stroke.md +21 -15
  532. package/dist/docs/reference/model/svgPathSection.md +12 -6
  533. package/dist/docs/reference/model/svgSection.md +13 -7
  534. package/dist/docs/reference/model/sweep.md +27 -20
  535. package/dist/docs/reference/model/textSection.md +15 -9
  536. package/dist/docs/reference/model/threadRidge.md +21 -15
  537. package/dist/docs/reference/model/threadedNut.md +27 -21
  538. package/dist/docs/reference/model/threadedRod.md +23 -17
  539. package/dist/docs/reference/model/torus.md +20 -13
  540. package/dist/docs/reference/model/tube.md +13 -6
  541. package/dist/docs/reference/model/union.md +9 -2
  542. package/dist/docs/reference/model.md +3 -8
  543. package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +7 -1
  544. package/dist/docs/reference/text/VectorFont.md +39 -33
  545. package/dist/docs/reference/text/VectorFontOptions.md +7 -1
  546. package/dist/docs/reference/text/categories/font-preparation.md +1 -13
  547. package/dist/docs/reference/text/prepareVectorFont.md +7 -1
  548. package/dist/docs/reference/text.md +1 -1
  549. package/dist/engine/finalization.js +2 -74
  550. package/dist/engine/index.js +2 -2
  551. package/dist/engine/native/construction-mesh.js +41 -0
  552. package/dist/engine/native/material-components.js +2 -51
  553. package/dist/engine/native/mesh-observation.js +55 -0
  554. package/dist/engine/native/regions.js +2 -1
  555. package/dist/engine/operations/context.js +2 -0
  556. package/dist/engine/operations/extrusion-finishing.js +17 -16
  557. package/dist/engine/operations/join-collar-profile.js +120 -0
  558. package/dist/engine/operations/join.js +508 -0
  559. package/dist/engine/recipe-realization.js +1 -1
  560. package/dist/engine/session/dependencies.js +89 -42
  561. package/dist/engine/session/graph.js +319 -342
  562. package/dist/engine/session/native-cache.js +1 -1
  563. package/dist/engine/session/session.js +5 -5
  564. package/dist/engine/session/snapshot-cache.js +2 -2
  565. package/dist/export/3mf.js +190 -0
  566. package/dist/export/capture.js +178 -0
  567. package/dist/export/glb.js +209 -0
  568. package/dist/export/index.js +5 -0
  569. package/dist/export/limits.js +18 -0
  570. package/dist/export/stl.js +105 -0
  571. package/dist/export/types.js +1 -0
  572. package/dist/export/writer.js +54 -0
  573. package/dist/geometry/bounds-value.js +4 -4
  574. package/dist/geometry/immutable-buffer.js +4 -6
  575. package/dist/geometry/join-geometry.js +839 -0
  576. package/dist/geometry/mesh/mesh-render.js +205 -0
  577. package/dist/geometry/mesh/mesh-solid-intersections.js +43 -17
  578. package/dist/geometry/mesh/mesh-solid.js +6 -2
  579. package/dist/geometry/mesh-api.js +1 -0
  580. package/dist/geometry/region-offset.js +278 -0
  581. package/dist/geometry/regions.js +11 -1
  582. package/dist/model/execution-binding.js +3 -3
  583. package/dist/model/generation.js +2 -2
  584. package/dist/model/immutable-generation-data.js +13 -13
  585. package/dist/model/join.js +1 -0
  586. package/dist/model/operations.js +20 -0
  587. package/dist/model/recipe-declaration.js +1 -0
  588. package/dist/model/shape-handles.js +1 -0
  589. package/package.json +18 -1
  590. package/dist/docs/reference/engine/Export3mfOptions.md +0 -46
  591. package/dist/docs/reference/engine/ExportMeshPart.md +0 -31
  592. package/dist/docs/reference/engine/ModelingLimits.md +0 -121
  593. package/dist/docs/reference/engine/export3mf.md +0 -55
  594. package/dist/docs/reference/mesh/AcmeThreadProfileSpec.md +0 -79
  595. package/dist/docs/reference/mesh/Bevel.md +0 -18
  596. package/dist/docs/reference/mesh/BevelSize.md +0 -14
  597. package/dist/docs/reference/mesh/Bounds2.md +0 -125
  598. package/dist/docs/reference/mesh/Bounds2Data.md +0 -43
  599. package/dist/docs/reference/mesh/Bounds2Input.md +0 -19
  600. package/dist/docs/reference/mesh/Bounds3.md +0 -125
  601. package/dist/docs/reference/mesh/Bounds3Data.md +0 -43
  602. package/dist/docs/reference/mesh/Bounds3Input.md +0 -19
  603. package/dist/docs/reference/mesh/ButtressPressureFlankSide.md +0 -14
  604. package/dist/docs/reference/mesh/ButtressThreadProfileSpec.md +0 -97
  605. package/dist/docs/reference/mesh/CircularPrimitiveOptions.md +0 -60
  606. package/dist/docs/reference/mesh/CurveSamplingOptions.md +0 -69
  607. package/dist/docs/reference/mesh/CustomThreadProfileSpec.md +0 -77
  608. package/dist/docs/reference/mesh/ExtrudeMeshOptions.md +0 -129
  609. package/dist/docs/reference/mesh/ExtrusionSamplingOptions.md +0 -81
  610. package/dist/docs/reference/mesh/Frame3.md +0 -62
  611. package/dist/docs/reference/mesh/GeometryResolution.md +0 -74
  612. package/dist/docs/reference/mesh/GeometrySamplingLimits.md +0 -66
  613. package/dist/docs/reference/mesh/GeometryToleranceOptions.md +0 -46
  614. package/dist/docs/reference/mesh/HeightfieldMeshLimits.md +0 -18
  615. package/dist/docs/reference/mesh/HeightfieldOptions.md +0 -72
  616. package/dist/docs/reference/mesh/HeightfieldPreflight.md +0 -58
  617. package/dist/docs/reference/mesh/ImmutableBuffer.md +0 -108
  618. package/dist/docs/reference/mesh/ImmutableTriangleMesh.md +0 -43
  619. package/dist/docs/reference/mesh/LoftCorrespondence.md +0 -24
  620. package/dist/docs/reference/mesh/LoftMeshStation.md +0 -31
  621. package/dist/docs/reference/mesh/LoftOptions.md +0 -88
  622. package/dist/docs/reference/mesh/LoftPlacement.md +0 -70
  623. package/dist/docs/reference/mesh/ModelingLimits.md +0 -130
  624. package/dist/docs/reference/mesh/NumericArray.md +0 -14
  625. package/dist/docs/reference/mesh/Path2.md +0 -197
  626. package/dist/docs/reference/mesh/Path2Data.md +0 -50
  627. package/dist/docs/reference/mesh/Path2Input.md +0 -20
  628. package/dist/docs/reference/mesh/Path3.md +0 -197
  629. package/dist/docs/reference/mesh/Path3Data.md +0 -50
  630. package/dist/docs/reference/mesh/Path3Input.md +0 -20
  631. package/dist/docs/reference/mesh/PathLocation.md +0 -69
  632. package/dist/docs/reference/mesh/PathNormalGuide.md +0 -43
  633. package/dist/docs/reference/mesh/PathResamplingOptions.md +0 -84
  634. package/dist/docs/reference/mesh/Pivot2Options.md +0 -26
  635. package/dist/docs/reference/mesh/Pivot3Options.md +0 -26
  636. package/dist/docs/reference/mesh/PlanarMeshOptimizationFallbackReason.md +0 -14
  637. package/dist/docs/reference/mesh/PlanarMeshOptimizationOptions.md +0 -160
  638. package/dist/docs/reference/mesh/PlanarMeshOptimizationResult.md +0 -124
  639. package/dist/docs/reference/mesh/PlanarPatchQuality.md +0 -194
  640. package/dist/docs/reference/mesh/RevolveOptions.md +0 -91
  641. package/dist/docs/reference/mesh/SolidMeshValidationOptions.md +0 -38
  642. package/dist/docs/reference/mesh/SquareThreadProfileSpec.md +0 -79
  643. package/dist/docs/reference/mesh/SweepOptions.md +0 -113
  644. package/dist/docs/reference/mesh/SweepOrientation.md +0 -113
  645. package/dist/docs/reference/mesh/ThreadEndStyle.md +0 -14
  646. package/dist/docs/reference/mesh/ThreadEndTreatmentOptions.md +0 -117
  647. package/dist/docs/reference/mesh/ThreadHandedness.md +0 -14
  648. package/dist/docs/reference/mesh/ThreadLeadInEnvelope.md +0 -14
  649. package/dist/docs/reference/mesh/ThreadLeadInShape.md +0 -14
  650. package/dist/docs/reference/mesh/ThreadProfile.md +0 -86
  651. package/dist/docs/reference/mesh/ThreadProfileBaseSpec.md +0 -53
  652. package/dist/docs/reference/mesh/ThreadProfileSpec.md +0 -23
  653. package/dist/docs/reference/mesh/ThreadRidgeOptions.md +0 -145
  654. package/dist/docs/reference/mesh/ThreadSolidOptions.md +0 -222
  655. package/dist/docs/reference/mesh/ThreadSolidPreflight.md +0 -58
  656. package/dist/docs/reference/mesh/Transform2.md +0 -256
  657. package/dist/docs/reference/mesh/Transform2Data.md +0 -14
  658. package/dist/docs/reference/mesh/Transform2Input.md +0 -19
  659. package/dist/docs/reference/mesh/Transform3.md +0 -296
  660. package/dist/docs/reference/mesh/Transform3Data.md +0 -17
  661. package/dist/docs/reference/mesh/Transform3Input.md +0 -19
  662. package/dist/docs/reference/mesh/TrapezoidalThreadProfileSpec.md +0 -96
  663. package/dist/docs/reference/mesh/TriangleMesh.md +0 -34
  664. package/dist/docs/reference/mesh/TriangleMeshAnalysis.md +0 -129
  665. package/dist/docs/reference/mesh/TriangleMeshAnalysisOptions.md +0 -79
  666. package/dist/docs/reference/mesh/TriangleMeshInput.md +0 -19
  667. package/dist/docs/reference/mesh/TriangleMeshMeasurements.md +0 -79
  668. package/dist/docs/reference/mesh/TriangleMeshQualityOptions.md +0 -43
  669. package/dist/docs/reference/mesh/TriangleMeshQualityReport.md +0 -194
  670. package/dist/docs/reference/mesh/TriangleMeshSignature.md +0 -111
  671. package/dist/docs/reference/mesh/TriangleMeshSignatureOptions.md +0 -46
  672. package/dist/docs/reference/mesh/TriangleMeshSignatureTolerances.md +0 -34
  673. package/dist/docs/reference/mesh/TriangleMeshTopologyAnalysis.md +0 -131
  674. package/dist/docs/reference/mesh/TriangleMeshValidationOptions.md +0 -55
  675. package/dist/docs/reference/mesh/TriangularThreadProfileSpec.md +0 -95
  676. package/dist/docs/reference/mesh/Vector2.md +0 -270
  677. package/dist/docs/reference/mesh/Vector2Data.md +0 -14
  678. package/dist/docs/reference/mesh/Vector2Input.md +0 -19
  679. package/dist/docs/reference/mesh/Vector3.md +0 -282
  680. package/dist/docs/reference/mesh/Vector3Data.md +0 -14
  681. package/dist/docs/reference/mesh/Vector3Input.md +0 -19
  682. package/dist/docs/reference/model/AcmeThreadProfileSpec.md +0 -80
  683. package/dist/docs/reference/model/Anchor3.md +0 -55
  684. package/dist/docs/reference/model/AttachOptions.md +0 -69
  685. package/dist/docs/reference/model/Bevel.md +0 -19
  686. package/dist/docs/reference/model/BevelSize.md +0 -15
  687. package/dist/docs/reference/model/Bounds2-type.md +0 -125
  688. package/dist/docs/reference/model/Bounds2Data.md +0 -44
  689. package/dist/docs/reference/model/Bounds2Input.md +0 -19
  690. package/dist/docs/reference/model/Bounds2Options.md +0 -110
  691. package/dist/docs/reference/model/Bounds3-type.md +0 -125
  692. package/dist/docs/reference/model/Bounds3Data.md +0 -44
  693. package/dist/docs/reference/model/Bounds3Input.md +0 -19
  694. package/dist/docs/reference/model/Bounds3Options.md +0 -110
  695. package/dist/docs/reference/model/BoxEdge.md +0 -15
  696. package/dist/docs/reference/model/BoxEdgeSelection.md +0 -19
  697. package/dist/docs/reference/model/BoxEdgeTreatments.md +0 -20
  698. package/dist/docs/reference/model/BoxOptions.md +0 -92
  699. package/dist/docs/reference/model/ButtressPressureFlankSide.md +0 -15
  700. package/dist/docs/reference/model/ButtressThreadProfileSpec.md +0 -98
  701. package/dist/docs/reference/model/ChamferedEdgeTreatment.md +0 -35
  702. package/dist/docs/reference/model/CircleContourOptions.md +0 -21
  703. package/dist/docs/reference/model/CircularPrimitiveOptions.md +0 -62
  704. package/dist/docs/reference/model/Computed.md +0 -44
  705. package/dist/docs/reference/model/ComputedValue.md +0 -24
  706. package/dist/docs/reference/model/Contour.md +0 -24
  707. package/dist/docs/reference/model/CorrespondingComponent.md +0 -46
  708. package/dist/docs/reference/model/CorrespondingContour.md +0 -46
  709. package/dist/docs/reference/model/CorrespondingProfile.md +0 -22
  710. package/dist/docs/reference/model/CorrespondingProfileStation.md +0 -27
  711. package/dist/docs/reference/model/CurveSamplingOptions.md +0 -68
  712. package/dist/docs/reference/model/CustomThreadProfileSpec.md +0 -78
  713. package/dist/docs/reference/model/CylinderOptions.md +0 -58
  714. package/dist/docs/reference/model/EdgeTreatment.md +0 -22
  715. package/dist/docs/reference/model/EllipseContourOptions.md +0 -21
  716. package/dist/docs/reference/model/EndTreatments.md +0 -39
  717. package/dist/docs/reference/model/ExtrudeMeshOptions.md +0 -133
  718. package/dist/docs/reference/model/ExtrudeOptions.md +0 -149
  719. package/dist/docs/reference/model/ExtrusionSamplingOptions.md +0 -84
  720. package/dist/docs/reference/model/Frame3.md +0 -63
  721. package/dist/docs/reference/model/GeometryError.md +0 -102
  722. package/dist/docs/reference/model/GeometryErrorCode.md +0 -15
  723. package/dist/docs/reference/model/GeometryErrorContext.md +0 -35
  724. package/dist/docs/reference/model/GeometryResolution.md +0 -70
  725. package/dist/docs/reference/model/GeometrySamplingLimits.md +0 -62
  726. package/dist/docs/reference/model/GeometryToleranceOptions.md +0 -46
  727. package/dist/docs/reference/model/GridPatternOptions.md +0 -50
  728. package/dist/docs/reference/model/HeightfieldOptions.md +0 -68
  729. package/dist/docs/reference/model/ImmutableBuffer-type.md +0 -108
  730. package/dist/docs/reference/model/ImmutableTriangleMesh.md +0 -43
  731. package/dist/docs/reference/model/InternalThreadCutterOptions.md +0 -216
  732. package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +0 -77
  733. package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +0 -47
  734. package/dist/docs/reference/model/KnuckleHingeSpec.md +0 -18
  735. package/dist/docs/reference/model/LinearPatternOptions.md +0 -39
  736. package/dist/docs/reference/model/LoftCorrespondence.md +0 -27
  737. package/dist/docs/reference/model/LoftOptions.md +0 -91
  738. package/dist/docs/reference/model/LoftPlacement.md +0 -73
  739. package/dist/docs/reference/model/MatchProfilesOptions.md +0 -35
  740. package/dist/docs/reference/model/ModelingLimits.md +0 -126
  741. package/dist/docs/reference/model/NumericArray.md +0 -14
  742. package/dist/docs/reference/model/Path2-type.md +0 -196
  743. package/dist/docs/reference/model/Path2Data.md +0 -50
  744. package/dist/docs/reference/model/Path2Input.md +0 -20
  745. package/dist/docs/reference/model/Path3-type.md +0 -196
  746. package/dist/docs/reference/model/Path3Data.md +0 -50
  747. package/dist/docs/reference/model/Path3Input.md +0 -20
  748. package/dist/docs/reference/model/PathLocation.md +0 -69
  749. package/dist/docs/reference/model/PathNormalGuide.md +0 -46
  750. package/dist/docs/reference/model/PathOptions.md +0 -38
  751. package/dist/docs/reference/model/PathPatternOptions.md +0 -48
  752. package/dist/docs/reference/model/PathResamplingOptions.md +0 -84
  753. package/dist/docs/reference/model/Pivot2Options.md +0 -28
  754. package/dist/docs/reference/model/Pivot3Options.md +0 -28
  755. package/dist/docs/reference/model/PolygonData.md +0 -44
  756. package/dist/docs/reference/model/PrimitiveAttachment.md +0 -39
  757. package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +0 -110
  758. package/dist/docs/reference/model/PrintableThreadFit.md +0 -15
  759. package/dist/docs/reference/model/PrintableThreadFitPolicy.md +0 -51
  760. package/dist/docs/reference/model/ProfileComponent2.md +0 -46
  761. package/dist/docs/reference/model/ProfileContour2.md +0 -36
  762. package/dist/docs/reference/model/ProfileSpan2.md +0 -47
  763. package/dist/docs/reference/model/ProfiledEdgeTreatment.md +0 -41
  764. package/dist/docs/reference/model/RadialPatternOptions.md +0 -59
  765. package/dist/docs/reference/model/RadialSizing.md +0 -15
  766. package/dist/docs/reference/model/RadialSizingOptions.md +0 -40
  767. package/dist/docs/reference/model/RectangleContourOptions.md +0 -72
  768. package/dist/docs/reference/model/RectangleCornerTreatment.md +0 -40
  769. package/dist/docs/reference/model/RectangleCornerTreatments.md +0 -20
  770. package/dist/docs/reference/model/RegionData.md +0 -19
  771. package/dist/docs/reference/model/RevolveOptions.md +0 -94
  772. package/dist/docs/reference/model/RoundedEdgeTreatment.md +0 -96
  773. package/dist/docs/reference/model/SmoothEdgeTreatment.md +0 -76
  774. package/dist/docs/reference/model/SphereOptions.md +0 -20
  775. package/dist/docs/reference/model/SquareThreadProfileSpec.md +0 -80
  776. package/dist/docs/reference/model/StarContourOptions.md +0 -81
  777. package/dist/docs/reference/model/StrokeCap.md +0 -16
  778. package/dist/docs/reference/model/StrokeJoin.md +0 -16
  779. package/dist/docs/reference/model/StrokeOptions.md +0 -91
  780. package/dist/docs/reference/model/SweepOptions.md +0 -116
  781. package/dist/docs/reference/model/SweepOrientation.md +0 -116
  782. package/dist/docs/reference/model/ThreadBevelOptions.md +0 -35
  783. package/dist/docs/reference/model/ThreadEndStyle.md +0 -15
  784. package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +0 -118
  785. package/dist/docs/reference/model/ThreadHandedness.md +0 -15
  786. package/dist/docs/reference/model/ThreadLeadInEnvelope.md +0 -15
  787. package/dist/docs/reference/model/ThreadLeadInShape.md +0 -15
  788. package/dist/docs/reference/model/ThreadProfile.md +0 -87
  789. package/dist/docs/reference/model/ThreadProfileBaseSpec.md +0 -54
  790. package/dist/docs/reference/model/ThreadProfileSpec.md +0 -24
  791. package/dist/docs/reference/model/ThreadRidgeOptions.md +0 -141
  792. package/dist/docs/reference/model/ThreadSolidPreflight.md +0 -59
  793. package/dist/docs/reference/model/ThreadedNutOptions.md +0 -263
  794. package/dist/docs/reference/model/ThreadedNutPreflight.md +0 -111
  795. package/dist/docs/reference/model/ThreadedNutShape.md +0 -15
  796. package/dist/docs/reference/model/ThreadedRodOptions.md +0 -216
  797. package/dist/docs/reference/model/TorusOptions.md +0 -110
  798. package/dist/docs/reference/model/Transform2-type.md +0 -257
  799. package/dist/docs/reference/model/Transform2Data.md +0 -16
  800. package/dist/docs/reference/model/Transform2Input.md +0 -21
  801. package/dist/docs/reference/model/Transform3-type.md +0 -297
  802. package/dist/docs/reference/model/Transform3Data.md +0 -19
  803. package/dist/docs/reference/model/Transform3Input.md +0 -21
  804. package/dist/docs/reference/model/TrapezoidalThreadProfileSpec.md +0 -97
  805. package/dist/docs/reference/model/TriangleMesh.md +0 -34
  806. package/dist/docs/reference/model/TriangleMeshAnalysis.md +0 -129
  807. package/dist/docs/reference/model/TriangleMeshMeasurements.md +0 -79
  808. package/dist/docs/reference/model/TriangleMeshTopologyAnalysis.md +0 -131
  809. package/dist/docs/reference/model/TriangularThreadProfileSpec.md +0 -96
  810. package/dist/docs/reference/model/TubeOptions.md +0 -67
  811. package/dist/docs/reference/model/Vector2-type.md +0 -271
  812. package/dist/docs/reference/model/Vector2Data.md +0 -15
  813. package/dist/docs/reference/model/Vector2Input.md +0 -21
  814. package/dist/docs/reference/model/Vector3-type.md +0 -283
  815. package/dist/docs/reference/model/Vector3Data.md +0 -15
  816. package/dist/docs/reference/model/Vector3Input.md +0 -21
  817. package/dist/docs/reference/model/VectorTextLayout.md +0 -40
  818. package/dist/docs/reference/model/VectorTextMetrics.md +0 -100
  819. package/dist/docs/reference/model/bounds2.md +0 -37
  820. package/dist/docs/reference/model/bounds3.md +0 -37
  821. package/dist/docs/reference/model/categories/bounds.md +0 -38
  822. package/dist/docs/reference/model/categories/contracts.md +0 -16
  823. package/dist/docs/reference/model/categories/core-values-errors.md +0 -44
  824. package/dist/docs/reference/model/categories/paths.md +0 -42
  825. package/dist/docs/reference/model/categories/resolution.md +0 -20
  826. package/dist/docs/reference/model/immutableBuffer.md +0 -49
  827. package/dist/docs/reference/model/isGeometryError.md +0 -34
  828. package/dist/docs/reference/model/path2.md +0 -54
  829. package/dist/docs/reference/model/path3.md +0 -49
  830. package/dist/docs/reference/model/transform2.md +0 -46
  831. package/dist/docs/reference/model/transform3.md +0 -48
  832. package/dist/docs/reference/model/vector2.md +0 -40
  833. package/dist/docs/reference/model/vector3.md +0 -47
  834. package/dist/docs/reference/text/Bounds2Data.md +0 -34
  835. package/dist/docs/reference/text/Vector2Data.md +0 -7
  836. package/dist/docs/reference/text/VectorTextArcBaseline.md +0 -53
  837. package/dist/docs/reference/text/VectorTextLayout.md +0 -34
  838. package/dist/docs/reference/text/VectorTextLayoutOptions.md +0 -111
  839. package/dist/docs/reference/text/VectorTextMetrics.md +0 -94
  840. package/dist/docs/reference/text/VectorTextOptions.md +0 -50
  841. package/dist/engine/export-3mf.js +0 -23
  842. package/dist/engine/serialize-3mf.js +0 -116
  843. /package/dist/{engine → geometry/mesh}/mesh-view-cache.js +0 -0
@@ -0,0 +1,205 @@
1
+ import { GeometryError } from "../errors.js";
2
+ import { immutableMeshView } from "../immutable-buffer.js";
3
+ import { validateTriangleMesh } from "./mesh.js";
4
+ const MAX_NORMAL_COMPARISONS = 50_000_000;
5
+ function tableCapacity(count) {
6
+ let capacity = 16;
7
+ while (capacity < count * 2)
8
+ capacity *= 2;
9
+ if (capacity > 0x8000_0000)
10
+ throw new GeometryError("COMPLEXITY_LIMIT", "Render mesh exceeds hash table capacity.");
11
+ return capacity;
12
+ }
13
+ /**
14
+ * Builds crease-aware render buffers without moving or merging distinct positions.
15
+ * Face normals are averaged only at exactly coincident positions within the crease angle.
16
+ * Returns owned buffers; every triangle retains its coordinates, order and winding.
17
+ * Pathological vertex fans exceeding 50 million normal comparisons reject with a complexity error.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * import * as mesh from "@metamesh/modeling/geometry/mesh";
22
+ * const surface = mesh.heightfield({ size: [10, 10], segments: [2, 2], height: () => 0 });
23
+ * const rendered = mesh.render(surface);
24
+ * // rendered.positions and rendered.normals can be passed to a renderer or GLB writer.
25
+ * ```
26
+ */
27
+ export function renderMesh(input, options = {}) {
28
+ const angle = options.creaseAngle ?? 20;
29
+ if (!Number.isFinite(angle) || angle < 0 || angle > 180)
30
+ throw new GeometryError("INVALID_ARGUMENT", "Crease angle must be from 0 through 180 degrees.", {
31
+ operation: "renderMesh",
32
+ });
33
+ validateTriangleMesh(input);
34
+ const { positions, indices } = immutableMeshView(input);
35
+ const vertexCount = positions.length / 3;
36
+ const cornerCount = indices.length;
37
+ const faceCount = cornerCount / 3;
38
+ const positionBits = new Uint32Array(positions.buffer, positions.byteOffset, positions.length);
39
+ const faceNormals = new Float64Array(cornerCount);
40
+ for (let face = 0; face < faceCount; face += 1) {
41
+ const offset = face * 3;
42
+ const a = indices[offset] * 3;
43
+ const b = indices[offset + 1] * 3;
44
+ const c = indices[offset + 2] * 3;
45
+ const ux = positions[b] - positions[a];
46
+ const uy = positions[b + 1] - positions[a + 1];
47
+ const uz = positions[b + 2] - positions[a + 2];
48
+ const vx = positions[c] - positions[a];
49
+ const vy = positions[c + 1] - positions[a + 1];
50
+ const vz = positions[c + 2] - positions[a + 2];
51
+ const nx = uy * vz - uz * vy;
52
+ const ny = uz * vx - ux * vz;
53
+ const nz = ux * vy - uy * vx;
54
+ const inverseLength = 1 / Math.hypot(nx, ny, nz);
55
+ faceNormals[offset] = nx * inverseLength;
56
+ faceNormals[offset + 1] = ny * inverseLength;
57
+ faceNormals[offset + 2] = nz * inverseLength;
58
+ }
59
+ // Position identity is exact. In particular, no tolerance can collapse a thin physical gap.
60
+ const positionIds = new Uint32Array(vertexCount);
61
+ const representatives = new Uint32Array(vertexCount);
62
+ const positionTable = new Uint32Array(tableCapacity(vertexCount));
63
+ const positionMask = positionTable.length - 1;
64
+ let uniquePositions = 0;
65
+ const positionHash = (offset) => Math.imul(positions[offset] === 0 ? 0 : positionBits[offset], 73_856_093) ^
66
+ Math.imul(positions[offset + 1] === 0 ? 0 : positionBits[offset + 1], 19_349_663) ^
67
+ Math.imul(positions[offset + 2] === 0 ? 0 : positionBits[offset + 2], 83_492_791);
68
+ for (let vertex = 0; vertex < vertexCount; vertex += 1) {
69
+ const offset = vertex * 3;
70
+ let slot = positionHash(offset) & positionMask;
71
+ while (positionTable[slot] !== 0) {
72
+ const id = positionTable[slot] - 1;
73
+ const other = representatives[id] * 3;
74
+ if (positions[offset] === positions[other] &&
75
+ positions[offset + 1] === positions[other + 1] &&
76
+ positions[offset + 2] === positions[other + 2])
77
+ break;
78
+ slot = (slot + 1) & positionMask;
79
+ }
80
+ if (positionTable[slot] === 0) {
81
+ representatives[uniquePositions] = vertex;
82
+ positionTable[slot] = ++uniquePositions;
83
+ }
84
+ positionIds[vertex] = positionTable[slot] - 1;
85
+ }
86
+ const bucketOffsets = new Uint32Array(uniquePositions + 1);
87
+ for (const vertex of indices)
88
+ bucketOffsets[positionIds[vertex] + 1] += 1;
89
+ let comparisons = 0;
90
+ for (let id = 0; id < uniquePositions; id += 1) {
91
+ const count = bucketOffsets[id + 1];
92
+ comparisons += count * count;
93
+ if (angle !== 0 && comparisons > MAX_NORMAL_COMPARISONS)
94
+ throw new GeometryError("COMPLEXITY_LIMIT", "Render mesh exceeds the normal comparison work limit.", { operation: "renderMesh", details: { maxNormalComparisons: MAX_NORMAL_COMPARISONS } });
95
+ bucketOffsets[id + 1] = count + bucketOffsets[id];
96
+ }
97
+ const bucketFaces = new Uint32Array(cornerCount);
98
+ const cursors = bucketOffsets.slice(0, uniquePositions);
99
+ for (let corner = 0; corner < cornerCount; corner += 1) {
100
+ const id = positionIds[indices[corner]];
101
+ bucketFaces[cursors[id]] = Math.floor(corner / 3);
102
+ cursors[id] += 1;
103
+ }
104
+ let capacity = Math.min(cornerCount, Math.max(16, vertexCount));
105
+ let renderPositions = new Float32Array(capacity * 3);
106
+ let renderNormals = new Float32Array(capacity * 3);
107
+ let renderPositionBits = new Uint32Array(renderPositions.buffer);
108
+ let renderNormalBits = new Uint32Array(renderNormals.buffer);
109
+ let renderTable = new Uint32Array(tableCapacity(capacity));
110
+ let renderMask = renderTable.length - 1;
111
+ const renderedIndices = new Uint32Array(cornerCount);
112
+ const candidateNormal = new Float32Array(3);
113
+ const normalBits = new Uint32Array(candidateNormal.buffer);
114
+ let renderedCount = 0;
115
+ const creaseDot = Math.cos((angle * Math.PI) / 180);
116
+ const renderHash = (offset) => {
117
+ return (Math.imul(renderPositions[offset] === 0 ? 0 : renderPositionBits[offset], 73_856_093) ^
118
+ Math.imul(renderPositions[offset + 1] === 0 ? 0 : renderPositionBits[offset + 1], 19_349_663) ^
119
+ Math.imul(renderPositions[offset + 2] === 0 ? 0 : renderPositionBits[offset + 2], 83_492_791) ^
120
+ Math.imul(renderNormals[offset] === 0 ? 0 : renderNormalBits[offset], 49_979_687) ^
121
+ Math.imul(renderNormals[offset + 1] === 0 ? 0 : renderNormalBits[offset + 1], 67_867_967) ^
122
+ Math.imul(renderNormals[offset + 2] === 0 ? 0 : renderNormalBits[offset + 2], 86_028_121));
123
+ };
124
+ for (let corner = 0; corner < cornerCount; corner += 1) {
125
+ const faceOffset = Math.floor(corner / 3) * 3;
126
+ const nx = faceNormals[faceOffset];
127
+ const ny = faceNormals[faceOffset + 1];
128
+ const nz = faceNormals[faceOffset + 2];
129
+ const positionOffset = indices[corner] * 3;
130
+ let sumX = nx, sumY = ny, sumZ = nz;
131
+ if (angle !== 0) {
132
+ sumX = 0;
133
+ sumY = 0;
134
+ sumZ = 0;
135
+ const id = positionIds[indices[corner]];
136
+ for (let k = bucketOffsets[id]; k < bucketOffsets[id + 1]; k += 1) {
137
+ const other = bucketFaces[k] * 3;
138
+ const ox = faceNormals[other];
139
+ const oy = faceNormals[other + 1];
140
+ const oz = faceNormals[other + 2];
141
+ if (other === faceOffset || nx * ox + ny * oy + nz * oz >= creaseDot) {
142
+ sumX += ox;
143
+ sumY += oy;
144
+ sumZ += oz;
145
+ }
146
+ }
147
+ }
148
+ const length = Math.hypot(sumX, sumY, sumZ);
149
+ candidateNormal[0] = length > 1e-12 ? sumX / length : nx;
150
+ candidateNormal[1] = length > 1e-12 ? sumY / length : ny;
151
+ candidateNormal[2] = length > 1e-12 ? sumZ / length : nz;
152
+ const hash = positionHash(positionOffset) ^
153
+ Math.imul(candidateNormal[0] === 0 ? 0 : normalBits[0], 49_979_687) ^
154
+ Math.imul(candidateNormal[1] === 0 ? 0 : normalBits[1], 67_867_967) ^
155
+ Math.imul(candidateNormal[2] === 0 ? 0 : normalBits[2], 86_028_121);
156
+ let slot = hash & renderMask;
157
+ while (renderTable[slot] !== 0) {
158
+ const offset = (renderTable[slot] - 1) * 3;
159
+ if (renderPositions[offset] === positions[positionOffset] &&
160
+ renderPositions[offset + 1] === positions[positionOffset + 1] &&
161
+ renderPositions[offset + 2] === positions[positionOffset + 2] &&
162
+ renderNormals[offset] === candidateNormal[0] &&
163
+ renderNormals[offset + 1] === candidateNormal[1] &&
164
+ renderNormals[offset + 2] === candidateNormal[2])
165
+ break;
166
+ slot = (slot + 1) & renderMask;
167
+ }
168
+ if (renderTable[slot] === 0) {
169
+ if (renderedCount === capacity) {
170
+ capacity = Math.min(cornerCount, capacity * 2);
171
+ const grownPositions = new Float32Array(capacity * 3);
172
+ const grownNormals = new Float32Array(capacity * 3);
173
+ grownPositions.set(renderPositions);
174
+ grownNormals.set(renderNormals);
175
+ renderPositions = grownPositions;
176
+ renderNormals = grownNormals;
177
+ renderPositionBits = new Uint32Array(renderPositions.buffer);
178
+ renderNormalBits = new Uint32Array(renderNormals.buffer);
179
+ renderTable = new Uint32Array(tableCapacity(capacity));
180
+ renderMask = renderTable.length - 1;
181
+ for (let index = 0; index < renderedCount; index += 1) {
182
+ let target = renderHash(index * 3) & renderMask;
183
+ while (renderTable[target] !== 0)
184
+ target = (target + 1) & renderMask;
185
+ renderTable[target] = index + 1;
186
+ }
187
+ slot = hash & renderMask;
188
+ while (renderTable[slot] !== 0)
189
+ slot = (slot + 1) & renderMask;
190
+ }
191
+ const offset = renderedCount * 3;
192
+ renderPositions[offset] = positions[positionOffset];
193
+ renderPositions[offset + 1] = positions[positionOffset + 1];
194
+ renderPositions[offset + 2] = positions[positionOffset + 2];
195
+ renderNormals.set(candidateNormal, offset);
196
+ renderTable[slot] = ++renderedCount;
197
+ }
198
+ renderedIndices[corner] = renderTable[slot] - 1;
199
+ }
200
+ return {
201
+ positions: renderPositions.slice(0, renderedCount * 3),
202
+ normals: renderNormals.slice(0, renderedCount * 3),
203
+ indices: renderedIndices,
204
+ };
205
+ }
@@ -28,13 +28,26 @@ const dominantAxis = (value) => {
28
28
  axis = index;
29
29
  return axis;
30
30
  };
31
+ /** Returns the actual nearby segment point; offset half-planes overexpand acute corners. */
32
+ function nearbySegmentPoint(point, a, b, epsilon) {
33
+ const dx = b[0] - a[0], dy = b[1] - a[1], dz = b[2] - a[2];
34
+ const lengthSquared = dx * dx + dy * dy + dz * dz;
35
+ const fraction = lengthSquared === 0
36
+ ? 0
37
+ : Math.max(0, Math.min(1, ((point[0] - a[0]) * dx + (point[1] - a[1]) * dy + (point[2] - a[2]) * dz) /
38
+ lengthSquared));
39
+ const x = a[0] + fraction * dx, y = a[1] + fraction * dy, z = a[2] + fraction * dz;
40
+ return Math.hypot(point[0] - x, point[1] - y, point[2] - z) <= epsilon ? [x, y, z] : undefined;
41
+ }
31
42
  function inside(point, triangle, direction, epsilon) {
32
43
  const axis = dominantAxis(direction), p = project(point, axis), points = triangle.map((vertex) => project(vertex, axis));
33
44
  const sign = Math.sign(turn(points[0], points[1], points[2]));
34
- return points.every((a, index) => {
45
+ if (points.every((a, index) => {
35
46
  const b = points[(index + 1) % 3];
36
- return sign * turn(a, b, p) >= -epsilon * Math.hypot(b[0] - a[0], b[1] - a[1]);
37
- });
47
+ return sign * turn(a, b, p) >= 0;
48
+ }))
49
+ return true;
50
+ return triangle.some((a, index) => nearbySegmentPoint(point, a, triangle[(index + 1) % 3], epsilon) !== undefined);
38
51
  }
39
52
  function onSharedBoundary(point, shared, epsilon) {
40
53
  if (shared.some((vertex) => distance(point, vertex) <= epsilon))
@@ -53,13 +66,12 @@ function coplanarIntersection(first, second, direction, shared, epsilon) {
53
66
  let polygon = [...first];
54
67
  for (let edge = 0; edge < 3 && polygon.length > 0; edge++) {
55
68
  const a = clip[edge], b = clip[(edge + 1) % 3];
56
- const tolerance = epsilon * Math.hypot(b[0] - a[0], b[1] - a[1]);
57
69
  const signed = (point) => sign * turn(a, b, project(point, axis));
58
70
  const next = [];
59
71
  for (let index = 0; index < polygon.length; index++) {
60
72
  const start = polygon[index], end = polygon[(index + 1) % polygon.length];
61
73
  const d0 = signed(start), d1 = signed(end);
62
- const in0 = d0 >= -tolerance, in1 = d1 >= -tolerance;
74
+ const in0 = d0 >= 0, in1 = d1 >= 0;
63
75
  if (in0)
64
76
  next.push(start);
65
77
  if (in0 !== in1) {
@@ -73,22 +85,36 @@ function coplanarIntersection(first, second, direction, shared, epsilon) {
73
85
  }
74
86
  polygon = next;
75
87
  }
76
- if (polygon.length === 0)
77
- return false;
78
- const origin = project(polygon[0], axis);
79
- let area = 0;
80
- for (let index = 1; index + 1 < polygon.length; index++)
81
- area += turn(origin, project(polygon[index], axis), project(polygon[index + 1], axis));
82
- const scale = Math.max(...first.map((point, index) => distance(point, first[(index + 1) % 3])));
83
- if (Math.abs(area) > epsilon * scale)
84
- return true;
85
- return polygon.some((point) => !onSharedBoundary(point, shared, epsilon));
88
+ if (polygon.length > 0) {
89
+ const origin = project(polygon[0], axis);
90
+ let area = 0;
91
+ for (let index = 1; index + 1 < polygon.length; index++)
92
+ area += turn(origin, project(polygon[index], axis), project(polygon[index + 1], axis));
93
+ const scale = Math.max(...first.map((point, index) => distance(point, first[(index + 1) % 3])));
94
+ if (Math.abs(area) > epsilon * scale)
95
+ return true;
96
+ if (polygon.some((point) => !onSharedBoundary(point, shared, epsilon)))
97
+ return true;
98
+ }
99
+ // A distance tolerance rounds a triangle's corners. Clipping against independently offset
100
+ // support lines instead creates long miters and can report contact many epsilons away.
101
+ const nearbyContact = (source, target) => source.some((point) => target.some((a, index) => {
102
+ const closest = nearbySegmentPoint(point, a, target[(index + 1) % 3], epsilon);
103
+ return (closest !== undefined &&
104
+ (!onSharedBoundary(point, shared, epsilon) || !onSharedBoundary(closest, shared, epsilon)));
105
+ }));
106
+ return nearbyContact(first, second) || nearbyContact(second, first);
86
107
  }
87
108
  /** @internal Detects contact beyond a permitted indexed vertex or edge, without welding. */
88
109
  export function trianglesIntersectBeyondSharedBoundary(firstGeometry, secondGeometry, shared, epsilon) {
89
110
  const first = firstGeometry.points, second = secondGeometry.points, n0 = firstGeometry.normal, n1 = secondGeometry.normal;
90
- const distances0 = first.map((point) => dot(n1, subtract(point, second[0])));
91
- const distances1 = second.map((point) => dot(n0, subtract(point, first[0])));
111
+ // Indexed shared vertices lie exactly on both planes. Dot-product cancellation must not
112
+ // turn that known zero into a false crossing along a nearly coplanar edge.
113
+ const planeDistance = (point, n, origin) => shared.some((vertex) => vertex.every((value, axis) => value === point[axis]))
114
+ ? 0
115
+ : dot(n, subtract(point, origin));
116
+ const distances0 = first.map((point) => planeDistance(point, n1, second[0]));
117
+ const distances1 = second.map((point) => planeDistance(point, n0, first[0]));
92
118
  const separated = (values) => values.every((value) => value > epsilon) || values.every((value) => value < -epsilon);
93
119
  if (separated(distances0) || separated(distances1))
94
120
  return false;
@@ -172,7 +172,8 @@ function checkSolidGeometry(mesh, facts, options, { count, maxTests }) {
172
172
  min[axis] = Math.min(min[axis], bounds[order[index] * 6 + axis]);
173
173
  max[axis] = Math.max(max[axis], bounds[order[index] * 6 + axis + 3]);
174
174
  }
175
- if (end - start <= 8)
175
+ // Small leaves avoid an 8x8 cross-product of false candidates on thin sampled surfaces.
176
+ if (end - start <= 4)
176
177
  return { start, end, min, max };
177
178
  let axis = 0;
178
179
  for (let index = 1; index < 3; index++)
@@ -219,7 +220,10 @@ function checkSolidGeometry(mesh, facts, options, { count, maxTests }) {
219
220
  visit(a.children[1], a.children[1]);
220
221
  return;
221
222
  }
222
- if (a.children !== undefined) {
223
+ // Narrow both sides of a candidate pair instead of descending one entire subtree
224
+ // against a broad node on the other side of the thin sampled surface.
225
+ if (a.children !== undefined &&
226
+ (b.children === undefined || a.end - a.start >= b.end - b.start)) {
223
227
  visit(a.children[0], b);
224
228
  visit(a.children[1], b);
225
229
  return;
@@ -10,5 +10,6 @@ export { computeTriangleMeshCentroid as centroid } from "./mesh/mesh-centroid.js
10
10
  export { analyzeTriangleMeshQuality as analyzeQuality } from "./mesh/mesh-quality.js";
11
11
  export { computeTriangleMeshSignature as signature } from "./mesh/mesh-signature.js";
12
12
  export { validateSolidMesh as validateSolid } from "./mesh/mesh-solid.js";
13
+ export { renderMesh as render } from "./mesh/mesh-render.js";
13
14
  export { optimizePlanarPatches } from "./mesh/mesh-planar.js";
14
15
  export { immutableMesh as immutable } from "./immutable-buffer.js";
@@ -0,0 +1,278 @@
1
+ import { GeometryError } from "./errors.js";
2
+ import { resolveModelingLimits } from "./model-limits.js";
3
+ import { normalizeRegionWithWork, signedContourArea } from "./regions.js";
4
+ import { assertSamplingCount } from "./sampling-limits.js";
5
+ import { resolveGeometryTolerance } from "./tolerance.js";
6
+ const maximumWork = 2_000_000;
7
+ const cross = (a, b) => a[0] * b[1] - a[1] * b[0];
8
+ const dot = (a, b) => a[0] * b[0] + a[1] * b[1];
9
+ const difference = (a, b) => [a[0] - b[0], a[1] - b[1]];
10
+ /**
11
+ * Plans parallel-edge offsets of every material boundary, preserving logical slots and seams.
12
+ * Positive distance contracts material; negative distance expands it. The range includes zero.
13
+ * Boundary events are excluded throughout the interval, not only at generated mesh stations.
14
+ * @internal
15
+ */
16
+ export function planRegionOffsets(profile, range, operation, overrides = {}) {
17
+ const fail = (code, message, boundary) => {
18
+ throw new GeometryError(code, message, {
19
+ operation,
20
+ ...(boundary === undefined ? {} : { details: { boundary } }),
21
+ });
22
+ };
23
+ if (!Array.isArray(range) || range.length !== 2 || range.some((value) => !Number.isFinite(value)))
24
+ fail("NON_FINITE_VALUE", "Offset bounds must be a finite distance pair.");
25
+ if (range[0] > 0 || range[1] < 0 || range[0] > range[1])
26
+ fail("INVALID_ARGUMENT", "Offset bounds must be ordered and include zero.");
27
+ range = [range[0], range[1]];
28
+ if (!Array.isArray(profile?.components) || profile.components.length === 0)
29
+ fail("DEGENERATE_GEOMETRY", "Finishing requires a nonempty filled profile.");
30
+ const limits = resolveModelingLimits(overrides);
31
+ let logicalCount = 0;
32
+ const identity = (value) => typeof value === "string" && /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value) && value.length <= 64;
33
+ const prepare = (source) => {
34
+ if (typeof source !== "object" ||
35
+ source === null ||
36
+ !identity(source.id) ||
37
+ !Array.isArray(source.points) ||
38
+ !Array.isArray(source.spans) ||
39
+ source.points.length !== source.spans.length ||
40
+ source.spans.some((span) => !identity(span)))
41
+ fail("INVALID_TOPOLOGY", "Offset contours require identified points and paired span slots.");
42
+ logicalCount += source.points.length;
43
+ assertSamplingCount(logicalCount, operation, limits.maxProfilePoints);
44
+ if (logicalCount * 176 > limits.maxBytes)
45
+ fail("COMPLEXITY_LIMIT", "Offset planning exceeds the configured intermediate byte ceiling.");
46
+ const points = [];
47
+ const slots = [];
48
+ for (const point of source.points) {
49
+ if (!Array.isArray(point) ||
50
+ point.length !== 2 ||
51
+ point.some((value) => !Number.isFinite(value)))
52
+ fail("NON_FINITE_VALUE", "Offset contours require finite XY points.", source.id);
53
+ const previous = points.at(-1);
54
+ if (previous === undefined || previous[0] !== point[0] || previous[1] !== point[1])
55
+ points.push(Object.freeze([point[0], point[1]]));
56
+ slots.push(points.length - 1);
57
+ }
58
+ if (points.length > 1 &&
59
+ points[0][0] === points.at(-1)[0] &&
60
+ points[0][1] === points.at(-1)[1]) {
61
+ const last = points.length - 1;
62
+ points.pop();
63
+ for (let index = 0; index < slots.length; index++)
64
+ if (slots[index] === last)
65
+ slots[index] = 0;
66
+ }
67
+ if (points.length < 3)
68
+ fail("DEGENERATE_GEOMETRY", "An offset boundary needs three physical vertices.", source.id);
69
+ const directions = points.map((point, index) => {
70
+ const delta = difference(points[(index + 1) % points.length], point);
71
+ const length = Math.hypot(...delta);
72
+ if (!(length > 0) || !Number.isFinite(length))
73
+ fail("DEGENERATE_GEOMETRY", "Offset edges require finite positive length.", source.id);
74
+ return [delta[0] / length, delta[1] / length];
75
+ });
76
+ const motion = directions.map((edge, index) => {
77
+ const previous = directions[(index + directions.length - 1) % directions.length];
78
+ const denominator = 1 + dot(previous, edge);
79
+ if (!(denominator > Number.EPSILON * 8))
80
+ fail("DEGENERATE_GEOMETRY", "Offset boundaries cannot backtrack.", source.id);
81
+ const result = [
82
+ (-previous[1] - edge[1]) / denominator,
83
+ (previous[0] + edge[0]) / denominator,
84
+ ];
85
+ if (!result.every(Number.isFinite))
86
+ fail("NON_FINITE_VALUE", "Offset corner motion exceeds numeric precision.", source.id);
87
+ return Object.freeze(result);
88
+ });
89
+ // A logical point on a straight run follows the run's corresponding edge
90
+ // fraction. A normal-only velocity could let a nearby moving corner overtake it.
91
+ const corners = directions.flatMap((edge, index) => {
92
+ const previous = directions[(index + directions.length - 1) % directions.length];
93
+ return Math.abs(cross(previous, edge)) > Number.EPSILON * 32 ? [index] : [];
94
+ });
95
+ if (corners.length < 3)
96
+ fail("DEGENERATE_GEOMETRY", "Offset boundaries need three resolved corners.", source.id);
97
+ for (let corner = 0; corner < corners.length; corner++) {
98
+ const first = corners[corner], last = corners[(corner + 1) % corners.length];
99
+ const start = points[first], end = points[last];
100
+ const delta = difference(end, start), squaredLength = dot(delta, delta);
101
+ for (let index = (first + 1) % points.length; index !== last; index = (index + 1) % points.length) {
102
+ const fraction = dot(difference(points[index], start), delta) / squaredLength;
103
+ motion[index] = Object.freeze([
104
+ motion[first][0] + (motion[last][0] - motion[first][0]) * fraction,
105
+ motion[first][1] + (motion[last][1] - motion[first][1]) * fraction,
106
+ ]);
107
+ }
108
+ }
109
+ return Object.freeze({
110
+ id: source.id,
111
+ spans: Object.freeze([...source.spans]),
112
+ slots: Object.freeze(slots),
113
+ points: Object.freeze(points),
114
+ motion: Object.freeze(motion),
115
+ });
116
+ };
117
+ const componentIds = new Set();
118
+ const components = profile.components.map((component) => {
119
+ if (typeof component !== "object" ||
120
+ component === null ||
121
+ !identity(component.id) ||
122
+ componentIds.has(component.id) ||
123
+ !Array.isArray(component.holes))
124
+ fail("INVALID_TOPOLOGY", "Offset components require unique identities and explicit holes.");
125
+ componentIds.add(component.id);
126
+ const outer = prepare(component.outer);
127
+ const holes = component.holes.map(prepare);
128
+ const ids = new Set([outer.id]);
129
+ for (const hole of holes) {
130
+ if (ids.has(hole.id))
131
+ fail("INVALID_TOPOLOGY", "Offset contour identities must be unique.");
132
+ ids.add(hole.id);
133
+ }
134
+ if (signedContourArea(outer.points) <= 0 ||
135
+ holes.some((hole) => signedContourArea(hole.points) >= 0))
136
+ fail("INVALID_TOPOLOGY", "Offset outer contours must be CCW and holes clockwise.");
137
+ return { id: component.id, outer, holes };
138
+ });
139
+ const initial = normalizeRegionWithWork(components.map((component) => ({
140
+ outer: component.outer.points,
141
+ holes: component.holes.map((hole) => hole.points),
142
+ })));
143
+ const contours = components.flatMap((component) => [component.outer, ...component.holes]);
144
+ const allPoints = contours.flatMap((contour) => contour.points);
145
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
146
+ for (const [x, y] of allPoints) {
147
+ minX = Math.min(minX, x);
148
+ minY = Math.min(minY, y);
149
+ maxX = Math.max(maxX, x);
150
+ maxY = Math.max(maxY, y);
151
+ }
152
+ const tolerance = resolveGeometryTolerance(Math.max(maxX - minX, maxY - minY));
153
+ const epsilon = Math.max(tolerance.linear, Number.EPSILON * 16 * Math.max(Math.abs(minX), Math.abs(maxX), Math.abs(minY), Math.abs(maxY)));
154
+ const pointAt = (point, velocity, distance) => distance === 0 ? point : [point[0] + distance * velocity[0], point[1] + distance * velocity[1]];
155
+ const edges = contours.flatMap((contour) => contour.points.map((a, index) => {
156
+ const next = (index + 1) % contour.points.length;
157
+ const b = contour.points[next], av = contour.motion[index], bv = contour.motion[next];
158
+ const delta = difference(b, a), length = Math.hypot(...delta);
159
+ const direction = [delta[0] / length, delta[1] / length];
160
+ const lengthSlope = dot(difference(bv, av), direction);
161
+ for (const distance of range) {
162
+ if (!(length + lengthSlope * distance > epsilon))
163
+ fail("DEGENERATE_GEOMETRY", "Treatment offset collapses or reverses a contour edge.", contour.id);
164
+ }
165
+ const endpoints = [
166
+ pointAt(a, av, range[0]),
167
+ pointAt(a, av, range[1]),
168
+ pointAt(b, bv, range[0]),
169
+ pointAt(b, bv, range[1]),
170
+ ];
171
+ if (endpoints.some((point) => point.some((value) => !Number.isFinite(value))))
172
+ fail("NON_FINITE_VALUE", "Offset coordinates exceed numeric precision.", contour.id);
173
+ return {
174
+ contour,
175
+ index,
176
+ a,
177
+ b,
178
+ av,
179
+ bv,
180
+ direction,
181
+ length,
182
+ lengthSlope,
183
+ minX: Math.min(...endpoints.map((point) => point[0])) - epsilon,
184
+ maxX: Math.max(...endpoints.map((point) => point[0])) + epsilon,
185
+ minY: Math.min(...endpoints.map((point) => point[1])) - epsilon,
186
+ maxY: Math.max(...endpoints.map((point) => point[1])) + epsilon,
187
+ };
188
+ }));
189
+ // Intersect affine inequalities c + slope*d >= 0 over the complete distance interval.
190
+ const intersect = (bounds, constant, slope) => {
191
+ if (slope === 0)
192
+ return constant >= 0;
193
+ const root = -constant / slope;
194
+ if (slope > 0)
195
+ bounds[0] = Math.max(bounds[0], root);
196
+ else
197
+ bounds[1] = Math.min(bounds[1], root);
198
+ return bounds[0] <= bounds[1];
199
+ };
200
+ const collide = (a, b) => {
201
+ const bounds = [range[0], range[1]];
202
+ const delta = difference(b.a, a.a), deltaSlope = difference(b.av, a.av);
203
+ const determinant = cross(a.direction, b.direction);
204
+ if (Math.abs(determinant) > tolerance.angular) {
205
+ const alongA = cross(delta, b.direction) / determinant;
206
+ const alongASlope = cross(deltaSlope, b.direction) / determinant;
207
+ const alongB = cross(delta, a.direction) / determinant;
208
+ const alongBSlope = cross(deltaSlope, a.direction) / determinant;
209
+ const slack = epsilon / Math.abs(determinant);
210
+ return (intersect(bounds, alongA + slack, alongASlope) &&
211
+ intersect(bounds, a.length - alongA + slack, a.lengthSlope - alongASlope) &&
212
+ intersect(bounds, alongB + slack, alongBSlope) &&
213
+ intersect(bounds, b.length - alongB + slack, b.lengthSlope - alongBSlope));
214
+ }
215
+ // Near-parallel support lines need both line coincidence and tangential overlap.
216
+ const distance = cross(a.direction, delta), distanceSlope = cross(a.direction, deltaSlope);
217
+ const longest = Math.max(a.length + a.lengthSlope * range[0], a.length + a.lengthSlope * range[1], b.length + b.lengthSlope * range[0], b.length + b.lengthSlope * range[1]);
218
+ const slack = epsilon + Math.abs(determinant) * longest;
219
+ if (!intersect(bounds, slack - distance, -distanceSlope) ||
220
+ !intersect(bounds, slack + distance, distanceSlope))
221
+ return false;
222
+ const same = dot(a.direction, b.direction) >= 0;
223
+ const lowPoint = same ? b.a : b.b, lowVelocity = same ? b.av : b.bv;
224
+ const highPoint = same ? b.b : b.a, highVelocity = same ? b.bv : b.av;
225
+ const low = dot(difference(lowPoint, a.a), a.direction);
226
+ const lowSlope = dot(difference(lowVelocity, a.av), a.direction);
227
+ const high = dot(difference(highPoint, a.a), a.direction);
228
+ const highSlope = dot(difference(highVelocity, a.av), a.direction);
229
+ return (intersect(bounds, high + epsilon, highSlope) &&
230
+ intersect(bounds, a.length - low + epsilon, a.lengthSlope - lowSlope));
231
+ };
232
+ edges.sort((a, b) => a.minX - b.minX || a.minY - b.minY);
233
+ const active = [];
234
+ let workCount = initial.workCount;
235
+ for (const current of edges) {
236
+ let retained = 0;
237
+ for (const candidate of active) {
238
+ if (++workCount > maximumWork)
239
+ fail("COMPLEXITY_LIMIT", "Offset validation exceeds the 2000000 candidate-work ceiling.");
240
+ if (candidate.maxX < current.minX)
241
+ continue;
242
+ active[retained++] = candidate;
243
+ if (candidate.maxY < current.minY || current.maxY < candidate.minY)
244
+ continue;
245
+ if (candidate.contour === current.contour &&
246
+ ((candidate.index + 1) % current.contour.points.length === current.index ||
247
+ (current.index + 1) % current.contour.points.length === candidate.index))
248
+ continue;
249
+ if (collide(candidate, current))
250
+ fail("SELF_INTERSECTION", "Treatment offsets make source boundaries contact or intersect.", current.contour.id);
251
+ }
252
+ active.length = retained;
253
+ active.push(current);
254
+ }
255
+ const magnification = contours.reduce((maximum, contour) => contour.motion.reduce((maximum, motion) => Math.max(maximum, Math.hypot(...motion)), maximum), 1);
256
+ const contourAt = (contour, distance) => ({
257
+ id: contour.id,
258
+ spans: contour.spans,
259
+ points: Object.freeze(contour.slots.map((slot) => Object.freeze(pointAt(contour.points[slot], contour.motion[slot], distance)))),
260
+ });
261
+ return Object.freeze({
262
+ magnification,
263
+ workCount,
264
+ profileAt(distance) {
265
+ if (!Number.isFinite(distance))
266
+ fail("NON_FINITE_VALUE", "Offset distance must be finite.");
267
+ if (distance < range[0] || distance > range[1])
268
+ fail("INVALID_ARGUMENT", "Offset distance is outside the validated interval.");
269
+ return Object.freeze({
270
+ components: Object.freeze(components.map((component) => Object.freeze({
271
+ id: component.id,
272
+ outer: Object.freeze(contourAt(component.outer, distance)),
273
+ holes: Object.freeze(component.holes.map((hole) => Object.freeze(contourAt(hole, distance)))),
274
+ }))),
275
+ });
276
+ },
277
+ });
278
+ }
@@ -274,6 +274,17 @@ const normalizePolygonWithBudget = (polygon, tolerance, budget) => {
274
274
  * Previously validated immutable results may be returned unchanged under the same tolerance policy.
275
275
  */
276
276
  export function normalizeRegion(region, tolerance = {}) {
277
+ return normalizeRegionWithWork(region, tolerance).region;
278
+ }
279
+ /** @internal Shares normalization's bounded predicate work with a containing operation. */
280
+ export function normalizeRegionWithWork(region, tolerance = {}) {
281
+ const budget = { candidates: 0 };
282
+ return {
283
+ region: normalizeRegionWithBudget(region, tolerance, budget),
284
+ workCount: budget.candidates,
285
+ };
286
+ }
287
+ function normalizeRegionWithBudget(region, tolerance, budget) {
277
288
  const policy = resolveGeometryTolerance(1, tolerance);
278
289
  if (samePolicy(normalizedRegions.get(region), policy))
279
290
  return region;
@@ -282,7 +293,6 @@ export function normalizeRegion(region, tolerance = {}) {
282
293
  throw new GeometryError("INVALID_TOPOLOGY", "Region polygons must not contain missing entries.");
283
294
  }
284
295
  }
285
- const budget = { candidates: 0 };
286
296
  const polygons = region.map((polygon) => normalizePolygonWithBudget(polygon, policy, budget));
287
297
  const containsFilledPoint = (polygon, point) => contourContainsPoint(polygon.outer, point) &&
288
298
  !polygon.holes.some((hole) => contourContainsPoint(hole, point));
@@ -1,7 +1,7 @@
1
1
  import { GeometryError } from "../geometry/errors.js";
2
2
  // One protocol key lets locally bundled operation wrappers resolve the host's execution
3
3
  // without depending on package instances, class identity, or initializing a native runtime.
4
- const executionKey = Symbol.for("@metamesh/modeling/execution/11");
4
+ const executionKey = Symbol.for("@metamesh/modeling/execution/12");
5
5
  const bindings = globalThis;
6
6
  /** Internal host binding. Executable callbacks are synchronous and may not nest executions. */
7
7
  export function bindModelContext(context, build) {
@@ -10,7 +10,7 @@ export function bindModelContext(context, build) {
10
10
  operation: "build",
11
11
  });
12
12
  }
13
- bindings[executionKey] = { version: 11, context };
13
+ bindings[executionKey] = { version: 12, context };
14
14
  try {
15
15
  return build();
16
16
  }
@@ -31,5 +31,5 @@ export function currentModelContext(operation) {
31
31
  /** Reads an optional binding without initializing an engine or creating ambient authoring state. */
32
32
  export function activeModelContext() {
33
33
  const binding = bindings[executionKey];
34
- return binding?.version === 11 ? binding.context : undefined;
34
+ return binding?.version === 12 ? binding.context : undefined;
35
35
  }