@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.
- package/CHANGELOG.md +186 -0
- package/README.md +147 -157
- package/dist/api/engine.d.ts +106 -83
- package/dist/api/export-3mf.d.ts +2 -0
- package/dist/api/export-glb.d.ts +2 -0
- package/dist/api/export-stl.d.ts +2 -0
- package/dist/api/export.d.ts +160 -0
- package/dist/api/geometry.d.ts +250 -461
- package/dist/api/index.d.ts +470 -445
- package/dist/api/mesh.d.ts +489 -0
- package/dist/api/text.d.ts +1 -1
- package/dist/docs/guides/concepts.md +32 -495
- package/dist/docs/guides/fonts.md +14 -13
- package/dist/docs/guides/fundamentals.md +30 -29
- package/dist/docs/guides/generation.md +84 -64
- package/dist/docs/guides/geometry-values.md +193 -0
- package/dist/docs/guides/hosting.md +147 -48
- package/dist/docs/guides/profiles-and-extrusion.md +252 -0
- package/dist/docs/guides/recipes.md +33 -769
- package/dist/docs/guides/resolution-and-inspection.md +133 -0
- package/dist/docs/guides/solid-joins.md +126 -0
- package/dist/docs/guides/standalone-model.md +8 -7
- package/dist/docs/guides/svg-and-text.md +215 -0
- package/dist/docs/guides/sweeps-and-lofts.md +179 -0
- package/dist/docs/guides/transforms-and-placement.md +313 -0
- package/dist/docs/manifest.json +3224 -4430
- package/dist/docs/reference/engine/GenerationOptions.md +12 -5
- package/dist/docs/reference/engine/GeometryResource.md +19 -13
- package/dist/docs/reference/engine/ModelDependencies.md +9 -3
- package/dist/docs/reference/engine/ModelEngine.md +33 -24
- package/dist/docs/reference/engine/ModelEngineOptions.md +13 -2
- package/dist/docs/reference/engine/ModelPart.md +114 -0
- package/dist/docs/reference/engine/ModelResult.md +181 -0
- package/dist/docs/reference/engine/ModelRunArguments.md +34 -0
- package/dist/docs/reference/engine/ModelRunOptions.md +110 -0
- package/dist/docs/reference/engine/ModelSession.md +22 -16
- package/dist/docs/reference/engine/SessionOptions.md +21 -10
- package/dist/docs/reference/engine/categories/host-lifecycle.md +20 -15
- package/dist/docs/reference/engine/checkModel.md +49 -0
- package/dist/docs/reference/engine/createModelEngine.md +11 -13
- package/dist/docs/reference/engine/defaultModelingLimits.md +15 -2
- package/dist/docs/reference/engine/modelingWasmUrl.md +7 -1
- package/dist/docs/reference/engine.md +8 -15
- package/dist/docs/reference/export/Export3mfOptions.md +24 -0
- package/dist/docs/reference/export/ExportDiagnostic.md +59 -0
- package/dist/docs/reference/export/ExportFormat.md +25 -0
- package/dist/docs/reference/export/ExportGeometry.md +39 -0
- package/dist/docs/reference/export/ExportGlbOptions.md +118 -0
- package/dist/docs/reference/export/ExportLimits.md +83 -0
- package/dist/docs/reference/export/ExportMaterial.md +47 -0
- package/dist/docs/reference/export/ExportOptions.md +94 -0
- package/dist/docs/reference/export/ExportPart.md +88 -0
- package/dist/docs/reference/export/ExportReport.md +82 -0
- package/dist/docs/reference/export/ExportSink.md +39 -0
- package/dist/docs/reference/export/ExportStlOptions.md +24 -0
- package/dist/docs/reference/export/ExportedFile.md +110 -0
- package/dist/docs/reference/export/categories/mesh-serialization.md +47 -0
- package/dist/docs/reference/export/defaultExportLimits.md +20 -0
- package/dist/docs/reference/export/export3mf.md +64 -0
- package/dist/docs/reference/export/exportGlb.md +68 -0
- package/dist/docs/reference/export/exportStl.md +64 -0
- package/dist/docs/reference/export/write3mf.md +71 -0
- package/dist/docs/reference/export/writeGlb.md +75 -0
- package/dist/docs/reference/export/writeStl.md +71 -0
- package/dist/docs/reference/export.md +21 -0
- package/dist/docs/reference/geometry/AcmeThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/AlignedCircularSegmentsOptions.md +7 -1
- package/dist/docs/reference/geometry/Anchor3-type.md +13 -3
- package/dist/docs/reference/geometry/ArcCurve2.md +8 -2
- package/dist/docs/reference/geometry/ArcCurve3.md +8 -2
- package/dist/docs/reference/geometry/AttachOptions.md +13 -3
- package/dist/docs/reference/geometry/AxisAngleRotation3.md +9 -3
- package/dist/docs/reference/geometry/Bevel.md +32 -0
- package/dist/docs/reference/geometry/BevelSize.md +28 -0
- package/dist/docs/reference/geometry/Bounds2-type.md +18 -4
- package/dist/docs/reference/geometry/Bounds2Data.md +22 -4
- package/dist/docs/reference/geometry/Bounds2Input.md +18 -4
- package/dist/docs/reference/geometry/Bounds2Options.md +61 -11
- package/dist/docs/reference/geometry/Bounds3-type.md +18 -4
- package/dist/docs/reference/geometry/Bounds3Data.md +18 -4
- package/dist/docs/reference/geometry/Bounds3Input.md +18 -4
- package/dist/docs/reference/geometry/Bounds3Options.md +61 -11
- package/dist/docs/reference/geometry/BoundsFit2.md +10 -4
- package/dist/docs/reference/geometry/BoundsFit3.md +10 -4
- package/dist/docs/reference/geometry/BoundsFitOptions.md +10 -4
- package/dist/docs/reference/geometry/BoxAnchorFace.md +9 -3
- package/dist/docs/reference/geometry/BoxAnchorOptions.md +12 -6
- package/dist/docs/reference/geometry/BoxEdge.md +11 -1
- package/dist/docs/reference/geometry/BoxEdgeSelection.md +11 -1
- package/dist/docs/reference/geometry/BoxEdgeTreatments.md +11 -1
- package/dist/docs/reference/geometry/BoxOptions.md +13 -3
- package/dist/docs/reference/geometry/ButtressPressureFlankSide.md +16 -2
- package/dist/docs/reference/geometry/ButtressThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/ChamferedEdgeTreatment.md +11 -1
- package/dist/docs/reference/geometry/CircleContourOptions.md +12 -2
- package/dist/docs/reference/geometry/CircularPrimitiveOptions.md +15 -3
- package/dist/docs/reference/geometry/CircularResolutionOptions.md +7 -1
- package/dist/docs/reference/geometry/CircularSampling.md +7 -1
- package/dist/docs/reference/geometry/CircularSamplingOptions.md +7 -1
- package/dist/docs/reference/geometry/ClearanceHoleDimensions.md +8 -2
- package/dist/docs/reference/geometry/ClearanceHoleFit.md +8 -2
- package/dist/docs/reference/geometry/CompensatedThreadDiameters.md +8 -2
- package/dist/docs/reference/geometry/Contour.md +12 -2
- package/dist/docs/reference/geometry/ContourCurve.md +8 -2
- package/dist/docs/reference/geometry/ContourPoint.md +8 -2
- package/dist/docs/reference/geometry/ContourSegment.md +8 -2
- package/dist/docs/reference/geometry/CorrespondingComponent.md +12 -2
- package/dist/docs/reference/geometry/CorrespondingContour.md +12 -2
- package/dist/docs/reference/geometry/CorrespondingProfile.md +12 -2
- package/dist/docs/reference/geometry/CorrespondingProfileStation.md +12 -2
- package/dist/docs/reference/geometry/CubicBezierCurve2.md +8 -2
- package/dist/docs/reference/geometry/CubicBezierCurve3.md +8 -2
- package/dist/docs/reference/geometry/Curve2.md +8 -2
- package/dist/docs/reference/geometry/Curve3.md +8 -2
- package/dist/docs/reference/geometry/CurveSamplingOptions.md +16 -2
- package/dist/docs/reference/geometry/CustomThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/CylinderAnchorFace.md +9 -3
- package/dist/docs/reference/geometry/CylinderAnchorOptions.md +11 -5
- package/dist/docs/reference/geometry/CylinderOptions.md +11 -1
- package/dist/docs/reference/geometry/CylindricalGearDimensions.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearMeshKind.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearOutlineOptions.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearPairDimensions.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearPairMotionOptions.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearPairMotionReport.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearPairSpec.md +8 -2
- package/dist/docs/reference/geometry/CylindricalGearSpec.md +8 -2
- package/dist/docs/reference/geometry/DEFAULT_GEOMETRY_TOLERANCE.md +7 -1
- package/dist/docs/reference/geometry/EdgeTreatment.md +11 -1
- package/dist/docs/reference/geometry/EllipseContourOptions.md +14 -4
- package/dist/docs/reference/geometry/EndTreatments.md +12 -2
- package/dist/docs/reference/{model/ExtrudeOptions.md → geometry/ExtrudeMeshOptions.md} +30 -26
- package/dist/docs/reference/geometry/ExtrudeOptions.md +29 -11
- package/dist/docs/reference/geometry/ExtrusionSamplingOptions.md +18 -4
- package/dist/docs/reference/geometry/FittedTextLayout.md +8 -2
- package/dist/docs/reference/geometry/Frame3.md +16 -2
- package/dist/docs/reference/geometry/GeometryError.md +11 -1
- package/dist/docs/reference/geometry/GeometryErrorCode.md +11 -1
- package/dist/docs/reference/geometry/GeometryErrorContext.md +11 -1
- package/dist/docs/reference/geometry/GeometryResolution.md +15 -1
- package/dist/docs/reference/geometry/GeometrySamplingLimits.md +16 -2
- package/dist/docs/reference/geometry/GeometryToleranceOptions.md +15 -1
- package/dist/docs/reference/geometry/GridPatternOptions.md +12 -2
- package/dist/docs/reference/geometry/HeightfieldMeshLimits.md +12 -2
- package/dist/docs/reference/geometry/HeightfieldOptions.md +18 -3
- package/dist/docs/reference/geometry/HeightfieldPreflight.md +12 -2
- package/dist/docs/reference/geometry/IDENTITY_TRANSFORM3.md +9 -3
- package/dist/docs/reference/geometry/ImmutableBuffer-type.md +110 -0
- package/dist/docs/reference/geometry/ImmutableTriangleMesh.md +57 -0
- package/dist/docs/reference/geometry/InternalThreadCutterOptions.md +63 -84
- package/dist/docs/reference/geometry/KnuckleHingeBaseSpec.md +12 -2
- package/dist/docs/reference/geometry/KnuckleHingeDimensions.md +8 -2
- package/dist/docs/reference/geometry/KnuckleHingeInterval.md +8 -2
- package/dist/docs/reference/geometry/KnuckleHingeSamplingOptions.md +12 -2
- package/dist/docs/reference/geometry/KnuckleHingeSpec.md +12 -2
- package/dist/docs/reference/geometry/LineCurve2.md +8 -2
- package/dist/docs/reference/geometry/LineCurve3.md +8 -2
- package/dist/docs/reference/geometry/LinearPatternOptions.md +12 -2
- package/dist/docs/reference/geometry/LoftCorrespondence.md +16 -2
- package/dist/docs/reference/geometry/LoftMeshStation.md +12 -2
- package/dist/docs/reference/geometry/LoftOptions.md +18 -4
- package/dist/docs/reference/geometry/LoftPlacement.md +16 -2
- package/dist/docs/reference/geometry/METRIC_FASTENER_STANDARDS.md +8 -2
- package/dist/docs/reference/geometry/MatchProfilesOptions.md +12 -2
- package/dist/docs/reference/geometry/MetricFastenerSize.md +8 -2
- package/dist/docs/reference/geometry/MetricFastenerStandard.md +8 -2
- package/dist/docs/reference/geometry/MetricHexNutDimensions.md +8 -2
- package/dist/docs/reference/geometry/MetricSocketCapHeadDimensions.md +8 -2
- package/dist/docs/reference/geometry/ModelingLimits.md +19 -1
- package/dist/docs/reference/geometry/NumericArray.md +28 -0
- package/dist/docs/reference/geometry/PRINTABLE_THREAD_FIT_POLICIES.md +8 -2
- package/dist/docs/reference/geometry/Path2-type.md +16 -2
- package/dist/docs/reference/geometry/Path2Data.md +16 -2
- package/dist/docs/reference/geometry/Path2Input.md +16 -2
- package/dist/docs/reference/geometry/Path3-type.md +16 -2
- package/dist/docs/reference/geometry/Path3Data.md +16 -2
- package/dist/docs/reference/geometry/Path3Input.md +16 -2
- package/dist/docs/reference/geometry/PathFrame.md +8 -2
- package/dist/docs/reference/geometry/PathLocation.md +16 -2
- package/dist/docs/reference/geometry/PathNormalGuide.md +16 -2
- package/dist/docs/reference/geometry/PathOptions.md +12 -2
- package/dist/docs/reference/geometry/PathPatternOptions.md +12 -2
- package/dist/docs/reference/geometry/PathPlacement.md +8 -2
- package/dist/docs/reference/geometry/PathResamplingOptions.md +16 -2
- package/dist/docs/reference/geometry/Pivot2Options.md +17 -3
- package/dist/docs/reference/geometry/Pivot3Options.md +17 -3
- package/dist/docs/reference/geometry/PlanarMeshOptimizationFallbackReason.md +12 -2
- package/dist/docs/reference/geometry/PlanarMeshOptimizationOptions.md +12 -2
- package/dist/docs/reference/geometry/PlanarMeshOptimizationResult.md +12 -2
- package/dist/docs/reference/geometry/PlanarPatchQuality.md +12 -2
- package/dist/docs/reference/geometry/PolygonData.md +12 -2
- package/dist/docs/reference/geometry/PolylineResamplingOptions.md +8 -2
- package/dist/docs/reference/geometry/PrimitiveAttachment.md +11 -3
- package/dist/docs/reference/geometry/PrimitiveAttachmentOptions.md +11 -1
- package/dist/docs/reference/geometry/PrintableThreadFit.md +12 -2
- package/dist/docs/reference/geometry/PrintableThreadFitPolicy.md +12 -2
- package/dist/docs/reference/geometry/Profile.md +8 -2
- package/dist/docs/reference/geometry/ProfileComponent2.md +12 -2
- package/dist/docs/reference/geometry/ProfileContour2.md +12 -2
- package/dist/docs/reference/geometry/ProfileSpan2.md +12 -2
- package/dist/docs/reference/geometry/ProfiledEdgeTreatment.md +11 -1
- package/dist/docs/reference/geometry/RackPitchDimensions.md +8 -2
- package/dist/docs/reference/geometry/RackPitchSpec.md +8 -2
- package/dist/docs/reference/geometry/RadialPatternOptions.md +12 -2
- package/dist/docs/reference/geometry/RadialSizing.md +11 -1
- package/dist/docs/reference/geometry/RadialSizingOptions.md +11 -1
- package/dist/docs/reference/geometry/RectangleContourOptions.md +14 -4
- package/dist/docs/reference/geometry/RectangleCornerTreatment.md +12 -2
- package/dist/docs/reference/geometry/RectangleCornerTreatments.md +12 -2
- package/dist/docs/reference/geometry/RectangleProfileOptions.md +10 -4
- package/dist/docs/reference/geometry/RegionData.md +12 -2
- package/dist/docs/reference/geometry/RegularPolygonContourOptions.md +8 -2
- package/dist/docs/reference/geometry/ResolvedGeometryTolerance.md +7 -1
- package/dist/docs/reference/geometry/RevolveOptions.md +17 -3
- package/dist/docs/reference/geometry/RoundedEdgeTreatment.md +11 -1
- package/dist/docs/reference/geometry/RowLayoutOptions.md +10 -4
- package/dist/docs/reference/geometry/SampleContourOptions.md +8 -2
- package/dist/docs/reference/geometry/SampleHelixOptions.md +8 -2
- package/dist/docs/reference/geometry/SampleSideProfileOptions.md +8 -2
- package/dist/docs/reference/geometry/SampledCurve2.md +8 -2
- package/dist/docs/reference/geometry/SampledCurve3.md +8 -2
- package/dist/docs/reference/geometry/SampledThreadHelices.md +8 -2
- package/dist/docs/reference/geometry/SideProfileCurve.md +8 -2
- package/dist/docs/reference/geometry/SideProfilePoint.md +8 -2
- package/dist/docs/reference/geometry/SideProfileSegment.md +8 -2
- package/dist/docs/reference/geometry/SmoothEdgeTreatment.md +11 -1
- package/dist/docs/reference/geometry/SolidMeshValidationOptions.md +12 -2
- package/dist/docs/reference/geometry/SphereOptions.md +11 -1
- package/dist/docs/reference/geometry/SquareThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/StarContourOptions.md +84 -0
- package/dist/docs/reference/geometry/StrokeCap.md +12 -2
- package/dist/docs/reference/geometry/StrokeJoin.md +12 -2
- package/dist/docs/reference/geometry/StrokeOptions.md +12 -2
- package/dist/docs/reference/geometry/SvgImportOptions.md +8 -2
- package/dist/docs/reference/geometry/SvgRegionPreflight.md +8 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightGeometryMetrics.md +8 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightRepairs.md +8 -2
- package/dist/docs/reference/geometry/SvgRegionPreflightSourceMetrics.md +8 -2
- package/dist/docs/reference/geometry/SweepOptions.md +16 -2
- package/dist/docs/reference/geometry/SweepOrientation.md +16 -2
- package/dist/docs/reference/geometry/ThreadBevelOptions.md +18 -31
- package/dist/docs/reference/geometry/ThreadCircularSegmentsOptions.md +8 -2
- package/dist/docs/reference/geometry/ThreadCompensationOptions.md +8 -2
- package/dist/docs/reference/geometry/ThreadEndStyle.md +16 -2
- package/dist/docs/reference/geometry/ThreadEndTreatmentOptions.md +16 -2
- package/dist/docs/reference/geometry/ThreadHandedness.md +16 -2
- package/dist/docs/reference/geometry/ThreadHelixOptions.md +8 -2
- package/dist/docs/reference/geometry/ThreadLeadInEnvelope.md +16 -2
- package/dist/docs/reference/geometry/ThreadLeadInShape.md +16 -2
- package/dist/docs/reference/geometry/ThreadProfile-type.md +17 -3
- package/dist/docs/reference/geometry/ThreadProfileBaseSpec.md +16 -2
- package/dist/docs/reference/geometry/ThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/{HelicalThreadRidgeMeshOptions.md → ThreadRidgeOptions.md} +19 -5
- package/dist/docs/reference/geometry/ThreadRole.md +8 -2
- package/dist/docs/reference/geometry/{HelicalThreadSolidMeshOptions.md → ThreadSolidOptions.md} +29 -66
- package/dist/docs/reference/geometry/{HelicalThreadSolidMeshPreflight.md → ThreadSolidPreflight.md} +17 -3
- package/dist/docs/reference/geometry/ThreadedNutOptions.md +86 -87
- package/dist/docs/reference/geometry/ThreadedNutPreflight.md +29 -7
- package/dist/docs/reference/geometry/ThreadedNutShape.md +12 -2
- package/dist/docs/reference/geometry/ThreadedRodOptions.md +63 -84
- package/dist/docs/reference/geometry/TorusOptions.md +11 -1
- package/dist/docs/reference/geometry/Transform2-type.md +17 -3
- package/dist/docs/reference/geometry/Transform2Data.md +17 -3
- package/dist/docs/reference/geometry/Transform2Input.md +17 -3
- package/dist/docs/reference/geometry/Transform3-type.md +17 -3
- package/dist/docs/reference/geometry/Transform3Data.md +17 -3
- package/dist/docs/reference/geometry/Transform3Input.md +17 -3
- package/dist/docs/reference/geometry/TrapezoidalThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/TriangleMesh.md +19 -6
- package/dist/docs/reference/geometry/TriangleMeshAnalysis.md +25 -5
- package/dist/docs/reference/geometry/TriangleMeshAnalysisOptions.md +13 -3
- package/dist/docs/reference/geometry/TriangleMeshInput.md +29 -0
- package/dist/docs/reference/geometry/TriangleMeshMeasurements.md +16 -2
- package/dist/docs/reference/geometry/TriangleMeshQualityOptions.md +12 -2
- package/dist/docs/reference/geometry/TriangleMeshQualityReport.md +12 -2
- package/dist/docs/reference/geometry/TriangleMeshSignature.md +14 -4
- package/dist/docs/reference/geometry/TriangleMeshSignatureOptions.md +12 -2
- package/dist/docs/reference/geometry/TriangleMeshSignatureTolerances.md +12 -2
- package/dist/docs/reference/geometry/TriangleMeshTopologyAnalysis.md +145 -0
- package/dist/docs/reference/geometry/TriangleMeshValidationOptions.md +12 -2
- package/dist/docs/reference/geometry/TriangularThreadProfileSpec.md +16 -2
- package/dist/docs/reference/geometry/TubeOptions.md +20 -86
- package/dist/docs/reference/geometry/Vector2-type.md +17 -3
- package/dist/docs/reference/geometry/Vector2Data.md +21 -3
- package/dist/docs/reference/geometry/Vector2Input.md +17 -3
- package/dist/docs/reference/geometry/Vector3-type.md +17 -3
- package/dist/docs/reference/geometry/Vector3Data.md +17 -3
- package/dist/docs/reference/geometry/Vector3Input.md +17 -3
- package/dist/docs/reference/geometry/VectorTextArcBaseline.md +12 -2
- package/dist/docs/reference/geometry/VectorTextLayout.md +16 -2
- package/dist/docs/reference/geometry/VectorTextLayoutOptions.md +14 -4
- package/dist/docs/reference/geometry/VectorTextMetrics.md +16 -2
- package/dist/docs/reference/geometry/VectorTextOptions.md +12 -2
- package/dist/docs/reference/geometry/add2.md +9 -3
- package/dist/docs/reference/geometry/add3.md +9 -3
- package/dist/docs/reference/geometry/anchor3.md +9 -3
- package/dist/docs/reference/geometry/anchorFrame3.md +8 -2
- package/dist/docs/reference/geometry/applyTransformDirection3.md +9 -3
- package/dist/docs/reference/geometry/applyTransformPoint3.md +9 -3
- package/dist/docs/reference/geometry/attachmentTransform3.md +9 -3
- package/dist/docs/reference/geometry/bounds2.md +18 -8
- package/dist/docs/reference/geometry/bounds3.md +18 -8
- package/dist/docs/reference/geometry/boundsCenter.md +10 -4
- package/dist/docs/reference/geometry/boundsSize.md +10 -4
- package/dist/docs/reference/geometry/boxAnchor3.md +11 -5
- package/dist/docs/reference/geometry/categories/bounds-layout.md +6 -6
- package/dist/docs/reference/geometry/categories/curves-paths.md +3 -3
- package/dist/docs/reference/geometry/categories/mechanical.md +9 -11
- package/dist/docs/reference/geometry/categories/meshes.md +20 -33
- package/dist/docs/reference/geometry/categories/pattern-placement.md +3 -3
- package/dist/docs/reference/geometry/categories/primitive-options.md +4 -4
- package/dist/docs/reference/geometry/categories/profiles-regions.md +6 -5
- package/dist/docs/reference/geometry/categories/resolution-errors.md +3 -3
- package/dist/docs/reference/geometry/categories/transforms-math.md +5 -4
- package/dist/docs/reference/geometry/categories/vector-import.md +4 -4
- package/dist/docs/reference/geometry/circleContour.md +8 -2
- package/dist/docs/reference/geometry/closeToAxis.md +8 -2
- package/dist/docs/reference/geometry/compensateThreadDiameters.md +8 -2
- package/dist/docs/reference/geometry/compensateThreadProfileAxially.md +8 -2
- package/dist/docs/reference/geometry/compensateThreadProfileForFaceting.md +8 -2
- package/dist/docs/reference/geometry/composeTransform3.md +9 -3
- package/dist/docs/reference/geometry/computeClosedParallelTransportFrames.md +8 -2
- package/dist/docs/reference/geometry/computeParallelTransportFrames.md +8 -2
- package/dist/docs/reference/geometry/contourContainsPoint.md +8 -2
- package/dist/docs/reference/geometry/cross2.md +9 -3
- package/dist/docs/reference/geometry/cross3.md +9 -3
- package/dist/docs/reference/geometry/cylinderAnchor3.md +10 -4
- package/dist/docs/reference/geometry/defaultGeometrySamplingLimits.md +8 -2
- package/dist/docs/reference/geometry/distance2.md +9 -3
- package/dist/docs/reference/geometry/distance3.md +9 -3
- package/dist/docs/reference/geometry/distributeAlongPath.md +8 -2
- package/dist/docs/reference/geometry/dot2.md +9 -3
- package/dist/docs/reference/geometry/dot3.md +9 -3
- package/dist/docs/reference/geometry/ellipseContour.md +8 -2
- package/dist/docs/reference/geometry/eulerTransform3.md +9 -3
- package/dist/docs/reference/geometry/fitBounds.md +10 -4
- package/dist/docs/reference/geometry/fitTextLayout.md +8 -2
- package/dist/docs/reference/geometry/frameTransform3.md +9 -3
- package/dist/docs/reference/geometry/getMetricClearanceHoleDiameter.md +8 -2
- package/dist/docs/reference/geometry/getMetricFastenerStandard.md +8 -2
- package/dist/docs/reference/geometry/gridPatternTransforms.md +8 -2
- package/dist/docs/reference/{model → geometry}/immutableBuffer.md +13 -2
- package/dist/docs/reference/geometry/inverseTransform3.md +9 -3
- package/dist/docs/reference/geometry/isGeometryError.md +11 -1
- package/dist/docs/reference/geometry/layoutRow.md +10 -4
- package/dist/docs/reference/geometry/length2.md +9 -3
- package/dist/docs/reference/geometry/length3.md +9 -3
- package/dist/docs/reference/geometry/lerp2.md +9 -3
- package/dist/docs/reference/geometry/lerp3.md +9 -3
- package/dist/docs/reference/geometry/linearPatternTransforms.md +8 -2
- package/dist/docs/reference/geometry/matchProfiles.md +8 -2
- package/dist/docs/reference/geometry/measureInternalCylindricalGearPairMotion.md +8 -2
- package/dist/docs/reference/geometry/minimumCylindricalGearToothCountWithoutUndercut.md +8 -2
- package/dist/docs/reference/geometry/normalize2.md +9 -3
- package/dist/docs/reference/geometry/normalize3.md +9 -3
- package/dist/docs/reference/geometry/normalizeContour.md +8 -2
- package/dist/docs/reference/geometry/normalizePolygon.md +8 -2
- package/dist/docs/reference/geometry/normalizeRegion.md +8 -2
- package/dist/docs/reference/geometry/path2.md +12 -2
- package/dist/docs/reference/geometry/path3.md +12 -2
- package/dist/docs/reference/geometry/pathPatternTransforms.md +8 -2
- package/dist/docs/reference/geometry/preflightInternalThreadCutter.md +25 -26
- package/dist/docs/reference/geometry/preflightSvgRegion.md +8 -2
- package/dist/docs/reference/geometry/preflightThreadedNut.md +31 -27
- package/dist/docs/reference/geometry/preflightThreadedRod.md +25 -26
- package/dist/docs/reference/geometry/projectOntoPlane3.md +9 -3
- package/dist/docs/reference/geometry/radialPatternTransforms.md +8 -2
- package/dist/docs/reference/geometry/rectangleContour.md +17 -6
- package/dist/docs/reference/geometry/rectangleProfile.md +9 -3
- package/dist/docs/reference/geometry/regionArea.md +8 -2
- package/dist/docs/reference/geometry/regionBounds.md +8 -2
- package/dist/docs/reference/geometry/regularPolygonContour.md +9 -3
- package/dist/docs/reference/geometry/resamplePolyline2.md +8 -2
- package/dist/docs/reference/geometry/resamplePolyline3.md +8 -2
- package/dist/docs/reference/geometry/resolveAlignedCircularSegments.md +7 -1
- package/dist/docs/reference/geometry/resolveArcSegments.md +7 -1
- package/dist/docs/reference/geometry/resolveCircularSampling.md +7 -1
- package/dist/docs/reference/geometry/resolveCircularSegments.md +7 -1
- package/dist/docs/reference/geometry/resolveCylindricalGear.md +8 -2
- package/dist/docs/reference/geometry/resolveCylindricalGearPair.md +8 -2
- package/dist/docs/reference/geometry/resolveExtrusionDivisions.md +8 -2
- package/dist/docs/reference/geometry/resolveGeometrySamplingLimits.md +8 -2
- package/dist/docs/reference/geometry/resolveGeometryTolerance.md +7 -1
- package/dist/docs/reference/geometry/resolveKnuckleHinge.md +8 -2
- package/dist/docs/reference/geometry/resolvePrintableThreadFitPolicy.md +8 -2
- package/dist/docs/reference/geometry/resolveRackPitch.md +8 -2
- package/dist/docs/reference/geometry/resolveThreadCircularSegments.md +8 -2
- package/dist/docs/reference/geometry/rotate2.md +9 -3
- package/dist/docs/reference/geometry/rotationTransform3.md +9 -3
- package/dist/docs/reference/geometry/roundClosedPolylinePath.md +8 -2
- package/dist/docs/reference/geometry/sampleContour.md +8 -2
- package/dist/docs/reference/geometry/sampleCurve2.md +8 -2
- package/dist/docs/reference/geometry/sampleCurve3.md +8 -2
- package/dist/docs/reference/geometry/sampleCylindricalGearOutline.md +8 -2
- package/dist/docs/reference/geometry/sampleHelix.md +8 -2
- package/dist/docs/reference/geometry/sampleInternalCylindricalGearSpaceOutline.md +8 -2
- package/dist/docs/reference/geometry/sampleRackToothPath.md +8 -2
- package/dist/docs/reference/geometry/sampleSideProfile.md +8 -2
- package/dist/docs/reference/geometry/sampleTextContours.md +8 -2
- package/dist/docs/reference/geometry/sampleThreadHelices.md +8 -2
- package/dist/docs/reference/geometry/scale2.md +9 -3
- package/dist/docs/reference/geometry/scale3.md +9 -3
- package/dist/docs/reference/geometry/scaleTransform3.md +9 -3
- package/dist/docs/reference/geometry/signedContourArea.md +8 -2
- package/dist/docs/reference/geometry/starContour.md +24 -16
- package/dist/docs/reference/geometry/strokeRegionData.md +8 -2
- package/dist/docs/reference/geometry/subtract2.md +9 -3
- package/dist/docs/reference/geometry/subtract3.md +9 -3
- package/dist/docs/reference/geometry/threadProfile.md +8 -2
- package/dist/docs/reference/geometry/transform2.md +13 -3
- package/dist/docs/reference/geometry/transform3.md +13 -3
- package/dist/docs/reference/geometry/transformDeterminant3.md +9 -3
- package/dist/docs/reference/geometry/transformRegionData.md +8 -2
- package/dist/docs/reference/geometry/translationTransform3.md +9 -3
- package/dist/docs/reference/geometry/triangulateContour.md +8 -2
- package/dist/docs/reference/geometry/validateRigidTransform3.md +41 -0
- package/dist/docs/reference/geometry/validateTransform3.md +9 -3
- package/dist/docs/reference/geometry/vector2.md +13 -3
- package/dist/docs/reference/geometry/vector3.md +13 -3
- package/dist/docs/reference/geometry.md +10 -10
- package/dist/docs/reference/mesh/MeshRenderOptions.md +28 -0
- package/dist/docs/reference/mesh/RenderMesh.md +68 -0
- package/dist/docs/reference/mesh/analyze.md +102 -0
- package/dist/docs/reference/mesh/analyzeQuality.md +62 -0
- package/dist/docs/reference/mesh/bounds.md +45 -0
- package/dist/docs/reference/mesh/categories/operations.md +57 -0
- package/dist/docs/reference/mesh/centroid.md +45 -0
- package/dist/docs/reference/mesh/extrude.md +79 -0
- package/dist/docs/reference/mesh/heightfield.md +57 -0
- package/dist/docs/reference/mesh/immutable.md +51 -0
- package/dist/docs/reference/mesh/join.md +47 -0
- package/dist/docs/reference/mesh/loft.md +83 -0
- package/dist/docs/reference/mesh/optimizePlanarPatches.md +102 -0
- package/dist/docs/reference/mesh/preflightHeightfield.md +48 -0
- package/dist/docs/reference/mesh/preflightThreadSolid.md +96 -0
- package/dist/docs/reference/mesh/render.md +57 -0
- package/dist/docs/reference/mesh/reverse.md +41 -0
- package/dist/docs/reference/{geometry/revolveMesh.md → mesh/revolve.md} +23 -17
- package/dist/docs/reference/mesh/signature.md +70 -0
- package/dist/docs/reference/mesh/sweep.md +92 -0
- package/dist/docs/reference/mesh/threadRidge.md +78 -0
- package/dist/docs/reference/mesh/threadSolid.md +96 -0
- package/dist/docs/reference/mesh/transform.md +53 -0
- package/dist/docs/reference/mesh/validate.md +75 -0
- package/dist/docs/reference/{geometry/validateSolidMesh.md → mesh/validateSolid.md} +23 -11
- package/dist/docs/reference/mesh.md +21 -0
- package/dist/docs/reference/model/CircleOptions.md +13 -7
- package/dist/docs/reference/model/DiagnosticOptions.md +21 -1
- package/dist/docs/reference/model/EllipseOptions.md +13 -7
- package/dist/docs/reference/model/GenerateCallback.md +11 -5
- package/dist/docs/reference/model/GenerateContext.md +26 -99
- package/dist/docs/reference/model/GenerationDiagnostic.md +19 -1
- package/dist/docs/reference/model/GenerationError.md +8 -2
- package/dist/docs/reference/model/HoleCutterOptions.md +17 -10
- package/dist/docs/reference/model/HoleCutterOverrun.md +10 -3
- package/dist/docs/reference/model/HoleCutterRecess.md +10 -3
- package/dist/docs/reference/model/HullOptions.md +13 -6
- package/dist/docs/reference/model/ImmutableValue.md +26 -0
- package/dist/docs/reference/model/ImplicitOptions.md +12 -6
- package/dist/docs/reference/model/JoinOptions.md +76 -0
- package/dist/docs/reference/model/JoinTransition.md +54 -0
- package/dist/docs/reference/model/KnuckleHinge-type.md +9 -3
- package/dist/docs/reference/model/KnuckleHingeHalfOptions.md +7 -1
- package/dist/docs/reference/model/KnuckleHingeOptions.md +10 -4
- package/dist/docs/reference/model/KnuckleHingeWeb.md +7 -1
- package/dist/docs/reference/model/LoftStation.md +16 -9
- package/dist/docs/reference/model/Memo.md +54 -0
- package/dist/docs/reference/model/ModelProgram.md +8 -2
- package/dist/docs/reference/model/PartDeclaration.md +87 -0
- package/dist/docs/reference/model/PartGeometry.md +10 -4
- package/dist/docs/reference/model/PartOptions.md +16 -22
- package/dist/docs/reference/model/PatternSource.md +10 -4
- package/dist/docs/reference/model/PlaneOptions.md +11 -4
- package/dist/docs/reference/model/PolygonOptions.md +20 -14
- package/dist/docs/reference/model/Profile.md +10 -4
- package/dist/docs/reference/model/RectangleOptions.md +28 -22
- package/dist/docs/reference/model/RegularPolygonOptions.md +13 -7
- package/dist/docs/reference/model/Section.md +196 -77
- package/dist/docs/reference/model/SectionHullOptions.md +13 -6
- package/dist/docs/reference/model/SectionInspection.md +12 -18
- package/dist/docs/reference/model/SectionOffsetJoin.md +10 -4
- package/dist/docs/reference/model/SectionOffsetOptions.md +12 -6
- package/dist/docs/reference/model/Solid.md +339 -54
- package/dist/docs/reference/model/SolidInspection.md +12 -18
- package/dist/docs/reference/model/SolidSegmentHit.md +14 -4
- package/dist/docs/reference/model/StarOptions.md +53 -25
- package/dist/docs/reference/model/SvgOrigin.md +10 -4
- package/dist/docs/reference/model/SvgPathSectionOptions.md +14 -8
- package/dist/docs/reference/model/SvgSectionOptions.md +16 -10
- package/dist/docs/reference/model/TextSectionOptions.md +14 -8
- package/dist/docs/reference/model/box.md +18 -11
- package/dist/docs/reference/model/categories/boolean-operations.md +13 -11
- package/dist/docs/reference/model/categories/bounded-surfaces.md +1 -7
- package/dist/docs/reference/model/categories/explicit-profiles.md +1 -14
- package/dist/docs/reference/model/categories/extrude-revolve-sweep.md +11 -23
- package/dist/docs/reference/model/categories/generation.md +10 -15
- package/dist/docs/reference/model/categories/hinges.md +1 -4
- package/dist/docs/reference/model/categories/mesh-inspection.md +14 -9
- package/dist/docs/reference/model/categories/primitives.md +8 -24
- package/dist/docs/reference/model/categories/sections.md +6 -16
- package/dist/docs/reference/model/categories/threads.md +3 -30
- package/dist/docs/reference/model/categories/transforms-placement.md +5 -35
- package/dist/docs/reference/model/circle.md +10 -4
- package/dist/docs/reference/model/cylinder.md +13 -6
- package/dist/docs/reference/model/ellipse.md +10 -4
- package/dist/docs/reference/model/extrude.md +28 -20
- package/dist/docs/reference/model/generate.md +10 -4
- package/dist/docs/reference/model/gridPattern.md +15 -9
- package/dist/docs/reference/model/heightfield.md +10 -4
- package/dist/docs/reference/model/holeCutter.md +21 -4
- package/dist/docs/reference/model/hull.md +9 -2
- package/dist/docs/reference/model/implicit.md +9 -3
- package/dist/docs/reference/model/internalThreadCutter.md +31 -33
- package/dist/docs/reference/model/intersect.md +11 -4
- package/dist/docs/reference/model/join.md +89 -0
- package/dist/docs/reference/model/knuckleHinge.md +8 -2
- package/dist/docs/reference/model/linearPattern.md +15 -9
- package/dist/docs/reference/model/loft.md +36 -28
- package/dist/docs/reference/model/matchProfiles.md +14 -8
- package/dist/docs/reference/model/minkowskiSum.md +9 -2
- package/dist/docs/reference/model/pathPattern.md +25 -19
- package/dist/docs/reference/model/polygon.md +13 -7
- package/dist/docs/reference/model/preflightInternalThreadCutter.md +33 -35
- package/dist/docs/reference/model/preflightThreadedNut.md +43 -40
- package/dist/docs/reference/model/preflightThreadedRod.md +33 -35
- package/dist/docs/reference/model/radialPattern.md +15 -9
- package/dist/docs/reference/model/rectangle.md +14 -8
- package/dist/docs/reference/model/regularPolygon.md +10 -4
- package/dist/docs/reference/model/revolve.md +25 -17
- package/dist/docs/reference/model/solidFromMesh.md +16 -9
- package/dist/docs/reference/model/sphere.md +13 -6
- package/dist/docs/reference/model/star.md +17 -11
- package/dist/docs/reference/model/stroke.md +21 -15
- package/dist/docs/reference/model/svgPathSection.md +12 -6
- package/dist/docs/reference/model/svgSection.md +13 -7
- package/dist/docs/reference/model/sweep.md +29 -21
- package/dist/docs/reference/model/textSection.md +15 -9
- package/dist/docs/reference/model/threadRidge.md +21 -15
- package/dist/docs/reference/model/threadedNut.md +41 -38
- package/dist/docs/reference/model/threadedRod.md +31 -33
- package/dist/docs/reference/model/torus.md +20 -13
- package/dist/docs/reference/model/tube.md +13 -41
- package/dist/docs/reference/model/union.md +11 -4
- package/dist/docs/reference/model.md +11 -20
- package/dist/docs/reference/text/MAX_VECTOR_FONT_BYTES.md +8 -2
- package/dist/docs/reference/text/VectorFont.md +39 -33
- package/dist/docs/reference/text/VectorFontOptions.md +7 -1
- package/dist/docs/reference/text/categories/font-preparation.md +3 -15
- package/dist/docs/reference/text/prepareVectorFont.md +7 -1
- package/dist/docs/reference/text.md +4 -4
- package/dist/engine/execution.js +10 -6
- package/dist/engine/finalization.js +2 -74
- package/dist/engine/index.js +24 -30
- package/dist/engine/model-parts.js +8 -0
- package/dist/engine/model-summary.js +5 -5
- package/dist/engine/native/construction-mesh.js +41 -0
- package/dist/engine/native/index.js +1 -1
- package/dist/engine/native/material-components.js +5 -54
- package/dist/engine/native/mesh-observation.js +55 -0
- package/dist/engine/native/operations.js +0 -7
- package/dist/engine/native/regions.js +2 -1
- package/dist/engine/native/scoped-primitives.js +5 -4
- package/dist/engine/native/threads.js +14 -14
- package/dist/engine/{construction-operations.js → operations/construction.js} +25 -23
- package/dist/engine/{modeling-context.js → operations/context.js} +12 -10
- package/dist/engine/{operation-environment.js → operations/environment.js} +2 -2
- package/dist/engine/{extrusion-finishing.js → operations/extrusion-finishing.js} +23 -22
- package/dist/engine/{hole-cutter-operation.js → operations/hole-cutter.js} +3 -3
- package/dist/engine/{inspection-operations.js → operations/inspection.js} +6 -6
- package/dist/engine/operations/join-collar-profile.js +120 -0
- package/dist/engine/operations/join.js +508 -0
- package/dist/engine/{knuckle-hinge-operation.js → operations/knuckle-hinge.js} +4 -4
- package/dist/engine/{loft-operations.js → operations/loft.js} +13 -12
- package/dist/engine/{mechanical-operations.js → operations/mechanical.js} +2 -2
- package/dist/engine/{pattern-operations.js → operations/patterns.js} +4 -4
- package/dist/engine/{primitive-anchors.js → operations/primitives/anchors.js} +9 -4
- package/dist/engine/{primitive-operations.js → operations/primitives/construction.js} +18 -19
- package/dist/engine/{primitive-correspondence.js → operations/primitives/correspondence.js} +4 -4
- package/dist/engine/{profile-mesh.js → operations/primitives/profile-mesh.js} +12 -12
- package/dist/engine/{primitive-profiles.js → operations/primitives/profiles.js} +7 -7
- package/dist/engine/{section-operations.js → operations/sections.js} +8 -8
- package/dist/engine/{transform-operations.js → operations/transforms.js} +8 -8
- package/dist/engine/placement.js +3 -4
- package/dist/engine/recipe-realization.js +2 -2
- package/dist/engine/{deferred-context.js → session/deferred-context.js} +4 -4
- package/dist/engine/session/dependencies.js +93 -0
- package/dist/engine/session/graph.js +428 -0
- package/dist/engine/{session-native.js → session/native-cache.js} +2 -2
- package/dist/engine/{session.js → session/session.js} +20 -14
- package/dist/engine/{session-snapshot.js → session/snapshot-cache.js} +30 -60
- package/dist/export/3mf.js +190 -0
- package/dist/export/capture.js +178 -0
- package/dist/export/glb.js +209 -0
- package/dist/export/index.js +5 -0
- package/dist/export/limits.js +18 -0
- package/dist/export/stl.js +105 -0
- package/dist/export/types.js +1 -0
- package/dist/export/writer.js +54 -0
- package/dist/geometry/anchors.js +4 -11
- package/dist/geometry/bounds-value.js +22 -12
- package/dist/geometry/heightfield.js +10 -12
- package/dist/{model → geometry}/immutable-buffer.js +31 -12
- package/dist/geometry/index.js +16 -22
- package/dist/geometry/join-geometry.js +839 -0
- package/dist/geometry/loft/loft.js +11 -6
- package/dist/geometry/mechanical/index.js +5 -5
- package/dist/geometry/mechanical/threads/bevel.js +24 -0
- package/dist/geometry/mechanical/{threads.js → threads/fit.js} +4 -4
- package/dist/geometry/mechanical/{thread-helices.js → threads/helices.js} +3 -3
- package/dist/geometry/mechanical/{thread-mesh-plan.js → threads/mesh-plan.js} +38 -53
- package/dist/geometry/mechanical/{thread-mesh.js → threads/mesh.js} +9 -9
- package/dist/geometry/mechanical/{thread-profiles.js → threads/profiles.js} +3 -3
- package/dist/geometry/mechanical/{thread-solids.js → threads/solids.js} +58 -89
- package/dist/geometry/mechanical/{thread-surface.js → threads/surface.js} +7 -8
- package/dist/geometry/mesh/mesh-centroid.js +3 -2
- package/dist/geometry/mesh/mesh-planar.js +27 -8
- package/dist/geometry/mesh/mesh-quality.js +2 -1
- package/dist/geometry/mesh/mesh-render.js +205 -0
- package/dist/geometry/mesh/mesh-signature.js +7 -6
- package/dist/geometry/mesh/mesh-solid-intersections.js +43 -17
- package/dist/geometry/mesh/mesh-solid.js +8 -5
- package/dist/geometry/mesh/mesh-types.js +1 -0
- package/dist/geometry/mesh/mesh.js +13 -22
- package/dist/geometry/mesh-api.js +15 -0
- package/dist/geometry/primitive-resolvers.js +42 -14
- package/dist/geometry/profiles/primitives/circle.js +19 -0
- package/dist/geometry/profiles/{shapes.js → primitives/ellipse.js} +6 -10
- package/dist/geometry/profiles/{rectangle.js → primitives/rectangle.js} +14 -12
- package/dist/geometry/profiles/primitives/regular-polygon.js +33 -0
- package/dist/geometry/profiles/primitives/star.js +28 -0
- package/dist/geometry/region-offset.js +278 -0
- package/dist/geometry/regions.js +11 -1
- package/dist/geometry/revolve/revolve-mesh.js +1 -1
- package/dist/geometry/{svg-import.js → svg/import.js} +10 -10
- package/dist/geometry/sweeps/sweep-mesh.js +1 -1
- package/dist/geometry/transform3.js +29 -0
- package/dist/index.js +2 -1
- package/dist/model/diagnostic-path.js +26 -0
- package/dist/model/execution-binding.js +3 -3
- package/dist/model/generation.js +9 -3
- package/dist/model/geometry-recipes.js +1 -1
- package/dist/model/immutable-generation-data.js +45 -14
- package/dist/model/join.js +1 -0
- package/dist/model/operations.js +34 -144
- package/dist/model/recipe-declaration.js +7 -2
- package/dist/model/shape-handles.js +31 -7
- package/dist/text/index.js +1 -1
- package/package.json +38 -11
- package/dist/docs/reference/engine/Export3mfOptions.md +0 -29
- package/dist/docs/reference/engine/ExportMeshPart.md +0 -65
- package/dist/docs/reference/engine/ModelSnapshot.md +0 -184
- package/dist/docs/reference/engine/SnapshotPart.md +0 -133
- package/dist/docs/reference/engine/validateModel.md +0 -48
- package/dist/docs/reference/geometry/ThreadedNutBevel.md +0 -14
- package/dist/docs/reference/geometry/analyzeTriangleMesh.md +0 -61
- package/dist/docs/reference/geometry/analyzeTriangleMeshQuality.md +0 -56
- package/dist/docs/reference/geometry/computeTriangleMeshCentroid.md +0 -39
- package/dist/docs/reference/geometry/computeTriangleMeshSignature.md +0 -64
- package/dist/docs/reference/geometry/extrudeMesh.md +0 -77
- package/dist/docs/reference/geometry/heightfieldMesh.md +0 -52
- package/dist/docs/reference/geometry/helicalThreadRidgeMesh.md +0 -72
- package/dist/docs/reference/geometry/helicalThreadSolidMesh.md +0 -106
- package/dist/docs/reference/geometry/joinTriangleMeshes.md +0 -40
- package/dist/docs/reference/geometry/loftMesh.md +0 -77
- package/dist/docs/reference/geometry/meshBounds.md +0 -39
- package/dist/docs/reference/geometry/optimizePlanarPatches.md +0 -95
- package/dist/docs/reference/geometry/preflightHeightfield.md +0 -43
- package/dist/docs/reference/geometry/preflightHelicalThreadSolidMesh.md +0 -105
- package/dist/docs/reference/geometry/reverseTriangleMesh.md +0 -34
- package/dist/docs/reference/geometry/sweepMesh.md +0 -86
- package/dist/docs/reference/geometry/transformTriangleMesh.md +0 -46
- package/dist/docs/reference/geometry/validateTriangleMesh.md +0 -63
- package/dist/docs/reference/model/Anchor3.md +0 -55
- package/dist/docs/reference/model/AttachOptions.md +0 -69
- package/dist/docs/reference/model/Bounds2-type.md +0 -125
- package/dist/docs/reference/model/Bounds2Data.md +0 -44
- package/dist/docs/reference/model/Bounds2Input.md +0 -19
- package/dist/docs/reference/model/Bounds2Options.md +0 -70
- package/dist/docs/reference/model/Bounds3-type.md +0 -125
- package/dist/docs/reference/model/Bounds3Data.md +0 -44
- package/dist/docs/reference/model/Bounds3Input.md +0 -19
- package/dist/docs/reference/model/Bounds3Options.md +0 -70
- package/dist/docs/reference/model/BoxEdge.md +0 -15
- package/dist/docs/reference/model/BoxEdgeSelection.md +0 -19
- package/dist/docs/reference/model/BoxEdgeTreatments.md +0 -20
- package/dist/docs/reference/model/BoxOptions.md +0 -92
- package/dist/docs/reference/model/ChamferedEdgeTreatment.md +0 -35
- package/dist/docs/reference/model/CircleContourOptions.md +0 -21
- package/dist/docs/reference/model/CircularPrimitiveOptions.md +0 -64
- package/dist/docs/reference/model/Computed.md +0 -40
- package/dist/docs/reference/model/ComputedValue.md +0 -24
- package/dist/docs/reference/model/Contour.md +0 -24
- package/dist/docs/reference/model/CorrespondingComponent.md +0 -46
- package/dist/docs/reference/model/CorrespondingContour.md +0 -46
- package/dist/docs/reference/model/CorrespondingProfile.md +0 -22
- package/dist/docs/reference/model/CorrespondingProfileStation.md +0 -27
- package/dist/docs/reference/model/CylinderOptions.md +0 -58
- package/dist/docs/reference/model/EdgeTreatment.md +0 -22
- package/dist/docs/reference/model/EllipseContourOptions.md +0 -21
- package/dist/docs/reference/model/EndTreatments.md +0 -39
- package/dist/docs/reference/model/FinalizedModel.md +0 -131
- package/dist/docs/reference/model/FinalizedPart.md +0 -87
- package/dist/docs/reference/model/Frame3.md +0 -63
- package/dist/docs/reference/model/GeneratedPart.md +0 -97
- package/dist/docs/reference/model/GeometryResolution.md +0 -70
- package/dist/docs/reference/model/GeometrySamplingLimits.md +0 -62
- package/dist/docs/reference/model/GeometryToleranceOptions.md +0 -46
- package/dist/docs/reference/model/GridPatternOptions.md +0 -50
- package/dist/docs/reference/model/HeightfieldOptions.md +0 -67
- package/dist/docs/reference/model/HelicalThreadRidgeMeshOptions.md +0 -141
- package/dist/docs/reference/model/HelicalThreadSolidMeshPreflight.md +0 -59
- package/dist/docs/reference/model/ImmutableBuffer-type.md +0 -84
- package/dist/docs/reference/model/ImmutableTriangleMesh.md +0 -38
- package/dist/docs/reference/model/InternalThreadCutterOptions.md +0 -246
- package/dist/docs/reference/model/KnuckleHingeBaseSpec.md +0 -77
- package/dist/docs/reference/model/KnuckleHingeSamplingOptions.md +0 -47
- package/dist/docs/reference/model/KnuckleHingeSpec.md +0 -18
- package/dist/docs/reference/model/LinearPatternOptions.md +0 -39
- package/dist/docs/reference/model/LoftCorrespondence.md +0 -27
- package/dist/docs/reference/model/LoftOptions.md +0 -91
- package/dist/docs/reference/model/LoftPlacement.md +0 -73
- package/dist/docs/reference/model/MatchProfilesOptions.md +0 -35
- package/dist/docs/reference/model/ModelingLimits.md +0 -126
- package/dist/docs/reference/model/NumericArray.md +0 -14
- package/dist/docs/reference/model/Path2-type.md +0 -196
- package/dist/docs/reference/model/Path2Data.md +0 -50
- package/dist/docs/reference/model/Path2Input.md +0 -20
- package/dist/docs/reference/model/Path3-type.md +0 -196
- package/dist/docs/reference/model/Path3Data.md +0 -50
- package/dist/docs/reference/model/Path3Input.md +0 -20
- package/dist/docs/reference/model/PathLocation.md +0 -69
- package/dist/docs/reference/model/PathNormalGuide.md +0 -46
- package/dist/docs/reference/model/PathOptions.md +0 -38
- package/dist/docs/reference/model/PathPatternOptions.md +0 -48
- package/dist/docs/reference/model/PathResamplingOptions.md +0 -83
- package/dist/docs/reference/model/Pivot2Options.md +0 -28
- package/dist/docs/reference/model/Pivot3Options.md +0 -28
- package/dist/docs/reference/model/PolygonData.md +0 -44
- package/dist/docs/reference/model/PrimitiveAttachment.md +0 -41
- package/dist/docs/reference/model/PrimitiveAttachmentOptions.md +0 -110
- package/dist/docs/reference/model/PrintableThreadFit.md +0 -15
- package/dist/docs/reference/model/PrintableThreadFitPolicy.md +0 -51
- package/dist/docs/reference/model/ProfileComponent2.md +0 -46
- package/dist/docs/reference/model/ProfileContour2.md +0 -36
- package/dist/docs/reference/model/ProfileSpan2.md +0 -47
- package/dist/docs/reference/model/ProfiledEdgeTreatment.md +0 -41
- package/dist/docs/reference/model/RadialPatternOptions.md +0 -59
- package/dist/docs/reference/model/RadialSizing.md +0 -15
- package/dist/docs/reference/model/RadialSizingOptions.md +0 -40
- package/dist/docs/reference/model/RectangleContourOptions.md +0 -72
- package/dist/docs/reference/model/RectangleCornerTreatment.md +0 -40
- package/dist/docs/reference/model/RectangleCornerTreatments.md +0 -20
- package/dist/docs/reference/model/RegionData.md +0 -19
- package/dist/docs/reference/model/RevolveOptions.md +0 -94
- package/dist/docs/reference/model/RoundedEdgeTreatment.md +0 -96
- package/dist/docs/reference/model/SmoothEdgeTreatment.md +0 -76
- package/dist/docs/reference/model/SphereOptions.md +0 -20
- package/dist/docs/reference/model/StrokeCap.md +0 -16
- package/dist/docs/reference/model/StrokeJoin.md +0 -16
- package/dist/docs/reference/model/StrokeOptions.md +0 -91
- package/dist/docs/reference/model/SweepOptions.md +0 -116
- package/dist/docs/reference/model/SweepOrientation.md +0 -116
- package/dist/docs/reference/model/ThreadEndStyle.md +0 -15
- package/dist/docs/reference/model/ThreadEndTreatmentOptions.md +0 -118
- package/dist/docs/reference/model/ThreadHandedness.md +0 -15
- package/dist/docs/reference/model/ThreadLeadInEnvelope.md +0 -15
- package/dist/docs/reference/model/ThreadLeadInShape.md +0 -15
- package/dist/docs/reference/model/ThreadProfile.md +0 -87
- package/dist/docs/reference/model/ThreadRidgeOptions.md +0 -19
- package/dist/docs/reference/model/ThreadedNutBevel.md +0 -15
- package/dist/docs/reference/model/ThreadedNutOptions.md +0 -274
- package/dist/docs/reference/model/ThreadedNutPreflight.md +0 -99
- package/dist/docs/reference/model/ThreadedNutShape.md +0 -15
- package/dist/docs/reference/model/ThreadedRodOptions.md +0 -246
- package/dist/docs/reference/model/TorusOptions.md +0 -110
- package/dist/docs/reference/model/Transform2-type.md +0 -257
- package/dist/docs/reference/model/Transform2Data.md +0 -16
- package/dist/docs/reference/model/Transform2Input.md +0 -21
- package/dist/docs/reference/model/Transform3-type.md +0 -297
- package/dist/docs/reference/model/Transform3Data.md +0 -19
- package/dist/docs/reference/model/Transform3Input.md +0 -21
- package/dist/docs/reference/model/TriangleMesh.md +0 -42
- package/dist/docs/reference/model/TriangleMeshAnalysis.md +0 -123
- package/dist/docs/reference/model/TriangleMeshMeasurements.md +0 -79
- package/dist/docs/reference/model/TubeOptions.md +0 -143
- package/dist/docs/reference/model/Vector2-type.md +0 -271
- package/dist/docs/reference/model/Vector2Data.md +0 -15
- package/dist/docs/reference/model/Vector2Input.md +0 -21
- package/dist/docs/reference/model/Vector3-type.md +0 -283
- package/dist/docs/reference/model/Vector3Data.md +0 -15
- package/dist/docs/reference/model/Vector3Input.md +0 -21
- package/dist/docs/reference/model/VectorTextLayout.md +0 -40
- package/dist/docs/reference/model/VectorTextMetrics.md +0 -100
- package/dist/docs/reference/model/anchor.md +0 -47
- package/dist/docs/reference/model/bounds2.md +0 -37
- package/dist/docs/reference/model/bounds3.md +0 -37
- package/dist/docs/reference/model/castSegment.md +0 -40
- package/dist/docs/reference/model/categories/bounds.md +0 -38
- package/dist/docs/reference/model/categories/contracts.md +0 -18
- package/dist/docs/reference/model/categories/core-values-errors.md +0 -30
- package/dist/docs/reference/model/categories/inspection.md +0 -29
- package/dist/docs/reference/model/categories/paths.md +0 -41
- package/dist/docs/reference/model/categories/resolution.md +0 -20
- package/dist/docs/reference/model/components.md +0 -71
- package/dist/docs/reference/model/compose.md +0 -31
- package/dist/docs/reference/model/distance.md +0 -45
- package/dist/docs/reference/model/immutableMesh.md +0 -44
- package/dist/docs/reference/model/inspectSection.md +0 -38
- package/dist/docs/reference/model/inspectSolid.md +0 -38
- package/dist/docs/reference/model/isEmpty.md +0 -39
- package/dist/docs/reference/model/path2.md +0 -54
- package/dist/docs/reference/model/path3.md +0 -49
- package/dist/docs/reference/model/split.md +0 -54
- package/dist/docs/reference/model/splitByPlane.md +0 -66
- package/dist/docs/reference/model/transform2.md +0 -46
- package/dist/docs/reference/model/transform3.md +0 -48
- package/dist/docs/reference/model/vector2.md +0 -40
- package/dist/docs/reference/model/vector3.md +0 -47
- package/dist/docs/reference/text/Bounds2Data.md +0 -34
- package/dist/docs/reference/text/Vector2Data.md +0 -7
- package/dist/docs/reference/text/VectorTextArcBaseline.md +0 -53
- package/dist/docs/reference/text/VectorTextLayout.md +0 -34
- package/dist/docs/reference/text/VectorTextLayoutOptions.md +0 -111
- package/dist/docs/reference/text/VectorTextMetrics.md +0 -94
- package/dist/docs/reference/text/VectorTextOptions.md +0 -50
- package/dist/engine/export-3mf.js +0 -116
- package/dist/engine/model-dependencies.js +0 -46
- package/dist/engine/session-graph.js +0 -449
- package/dist/geometry/profiles/profiles.js +0 -71
- /package/dist/engine/{primitive-profile-types.js → operations/primitives/profile-types.js} +0 -0
- /package/dist/{engine → geometry/mesh}/mesh-view-cache.js +0 -0
- /package/dist/geometry/profiles/{matched.js → match-profiles.js} +0 -0
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { immutableMeshView } from "../immutable-buffer.js";
|
|
2
3
|
import { analyzeTriangleMesh } from "./mesh.js";
|
|
3
4
|
/**
|
|
4
5
|
* Computes the uniform-density volume centroid of an oriented closed solid, including cavity shells.
|
|
5
6
|
*
|
|
6
7
|
* Coordinates are millimetres. Indexed closure and positive aggregate volume are required; callers
|
|
7
|
-
* may use
|
|
8
|
+
* may use mesh.validateSolid first when geometric intersections and shell orientation are untrusted.
|
|
8
9
|
* Fresh mutable input is inspected on every call, and buffers are never changed.
|
|
9
10
|
*
|
|
10
11
|
* @param mesh - Consistently oriented closed mesh with positive enclosed volume.
|
|
11
12
|
* @returns A fresh immutable XYZ volume centroid.
|
|
12
13
|
*/
|
|
13
14
|
export function computeTriangleMeshCentroid(mesh) {
|
|
14
|
-
const source =
|
|
15
|
+
const source = immutableMeshView(mesh);
|
|
15
16
|
const facts = analyzeTriangleMesh(source, { requireClosed: true });
|
|
16
17
|
if (!(facts.signedVolume > 0))
|
|
17
18
|
throw new GeometryError("INVALID_TOPOLOGY", "A volume centroid requires positive oriented volume.", { operation: "computeTriangleMeshCentroid" });
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { immutableMeshView, isImmutableBuffer } from "../immutable-buffer.js";
|
|
2
3
|
import { buildTriangleMeshQualityAnalysis, } from "./mesh-quality.js";
|
|
3
4
|
const DEFAULT_MAXIMUM_FLIP_ATTEMPTS = 1_000_000;
|
|
4
5
|
const DEFAULT_MAXIMUM_PATCH_TRIANGLE_COUNT = 50_000;
|
|
@@ -165,19 +166,37 @@ const fallbackReasonForCandidate = (before, after, boundaryEdgeKeys) => {
|
|
|
165
166
|
* The operation changes indices only: it never moves, adds, welds, or removes vertices; never
|
|
166
167
|
* crosses a coplanar-patch boundary; and never changes the face count. Each accepted flip improves
|
|
167
168
|
* a deterministic ordering of triangle angles, aspect ratio, diagonal locality, and local
|
|
168
|
-
* incidence/valence concentration. Unsupported input or a failed final integrity check
|
|
169
|
-
*
|
|
169
|
+
* incidence/valence concentration. Unsupported input or a failed final integrity check preserves the
|
|
170
|
+
* original raw mesh object. Immutable inputs produce owned raw output buffers, including unchanged
|
|
171
|
+
* results. Malformed buffers and the configured analysis complexity limit throw.
|
|
170
172
|
*
|
|
171
173
|
* @param mesh - Closed, consistently wound indexed triangle mesh in arbitrary consistent units.
|
|
172
174
|
* @param options - Patch eligibility, numeric tolerance, and deterministic work bounds.
|
|
173
175
|
* @returns Optimized connectivity and before/after diagnostics, or an unchanged safe fallback.
|
|
174
176
|
*/
|
|
175
177
|
export function optimizePlanarPatches(mesh, options = {}) {
|
|
176
|
-
const
|
|
178
|
+
const { positions, indices } = mesh;
|
|
179
|
+
const immutable = isImmutableBuffer(positions) || isImmutableBuffer(indices);
|
|
180
|
+
const source = immutableMeshView({ positions, indices });
|
|
181
|
+
const result = optimizePlanarMesh(source, options);
|
|
182
|
+
// Raw numerical outputs may alias caller-owned raw inputs, never immutable private storage.
|
|
183
|
+
return !immutable
|
|
184
|
+
? result.changed
|
|
185
|
+
? result
|
|
186
|
+
: { ...result, mesh: mesh }
|
|
187
|
+
: {
|
|
188
|
+
...result,
|
|
189
|
+
mesh: {
|
|
190
|
+
positions: new Float32Array(result.mesh.positions),
|
|
191
|
+
indices: new Uint32Array(result.mesh.indices),
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function optimizePlanarMesh(source, options) {
|
|
177
196
|
const resolved = resolveOptions(options);
|
|
178
197
|
const before = buildTriangleMeshQualityAnalysis(source, options);
|
|
179
198
|
if (!before.report.isClosedOrientedManifold) {
|
|
180
|
-
return unchangedResult(
|
|
199
|
+
return unchangedResult(source, before.report, 0, false, "input-not-closed-oriented-manifold");
|
|
181
200
|
}
|
|
182
201
|
const selectedPatchIds = new Set();
|
|
183
202
|
const boundaryEdgeKeys = new Set();
|
|
@@ -199,7 +218,7 @@ export function optimizePlanarPatches(mesh, options = {}) {
|
|
|
199
218
|
boundaryEdgeKeys.add(key);
|
|
200
219
|
}
|
|
201
220
|
if (selectedPatchIds.size === 0) {
|
|
202
|
-
return unchangedResult(
|
|
221
|
+
return unchangedResult(source, before.report, skippedPatchCount, budgetExhausted);
|
|
203
222
|
}
|
|
204
223
|
const triangles = before.faces.map(({ vertices }) => [...vertices]);
|
|
205
224
|
const edges = new Map();
|
|
@@ -226,7 +245,7 @@ export function optimizePlanarPatches(mesh, options = {}) {
|
|
|
226
245
|
const maxFlipAttempts = resolved.maxFlipAttempts ??
|
|
227
246
|
Math.min(DEFAULT_MAXIMUM_FLIP_ATTEMPTS, initialEdges.length * ATTEMPTS_PER_INITIAL_EDGE);
|
|
228
247
|
if (maxFlipAttempts === 0) {
|
|
229
|
-
return unchangedResult(
|
|
248
|
+
return unchangedResult(source, before.report, skippedPatchCount, budgetExhausted);
|
|
230
249
|
}
|
|
231
250
|
const queue = initialEdges.map(({ key }) => key);
|
|
232
251
|
const queued = new Set(queue);
|
|
@@ -382,7 +401,7 @@ export function optimizePlanarPatches(mesh, options = {}) {
|
|
|
382
401
|
if (queueOffset < queue.length)
|
|
383
402
|
budgetExhausted = true;
|
|
384
403
|
if (flipCount === 0) {
|
|
385
|
-
return unchangedResult(
|
|
404
|
+
return unchangedResult(source, before.report, skippedPatchCount, budgetExhausted);
|
|
386
405
|
}
|
|
387
406
|
const indices = new Uint32Array(source.indices.length);
|
|
388
407
|
for (let faceIndex = 0; faceIndex < triangles.length; faceIndex += 1) {
|
|
@@ -392,7 +411,7 @@ export function optimizePlanarPatches(mesh, options = {}) {
|
|
|
392
411
|
const after = buildTriangleMeshQualityAnalysis(candidate, options);
|
|
393
412
|
const fallbackReason = fallbackReasonForCandidate(before, after, boundaryEdgeKeys);
|
|
394
413
|
if (fallbackReason !== undefined) {
|
|
395
|
-
return unchangedResult(
|
|
414
|
+
return unchangedResult(source, before.report, skippedPatchCount, budgetExhausted, fallbackReason);
|
|
396
415
|
}
|
|
397
416
|
return {
|
|
398
417
|
after: after.report,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { immutableMeshView } from "../immutable-buffer.js";
|
|
2
3
|
import { resolveGeometryTolerance, } from "../tolerance.js";
|
|
3
4
|
const DEFAULT_MAXIMUM_TRIANGLE_COUNT = 200_000;
|
|
4
5
|
const FLOAT32_EPSILON = 2 ** -23;
|
|
@@ -235,7 +236,7 @@ const buildPatchAnalysis = (faces, edges, faceIndices, id) => {
|
|
|
235
236
|
};
|
|
236
237
|
/** @internal */
|
|
237
238
|
export function buildTriangleMeshQualityAnalysis(mesh, options = {}) {
|
|
238
|
-
const source =
|
|
239
|
+
const source = immutableMeshView(mesh);
|
|
239
240
|
const maxTriangles = positiveInteger(options.maxTriangles ?? DEFAULT_MAXIMUM_TRIANGLE_COUNT, "Maximum analyzed triangle count");
|
|
240
241
|
structurallyValidateMesh(source, maxTriangles);
|
|
241
242
|
const { bounds, extent } = meshBoundsAndExtent(source.positions);
|
|
@@ -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
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { immutableMeshView } from "../immutable-buffer.js";
|
|
2
3
|
import { analyzeTriangleMesh, validateTriangleMesh } from "./mesh.js";
|
|
3
4
|
const DEFAULT_POSITION_TOLERANCE = 1e-5;
|
|
4
5
|
const DEFAULT_VOLUME_TOLERANCE = 1e-4;
|
|
@@ -68,10 +69,10 @@ const hashCanonicalKeys = (header, groups) => {
|
|
|
68
69
|
* @param mesh - Closed oriented mesh to measure without mutation.
|
|
69
70
|
* @param options - Absolute quantization and complexity limits.
|
|
70
71
|
* @returns Compact counts, bounds, volume, topology, tolerances, and canonical fingerprint.
|
|
71
|
-
* @throws
|
|
72
|
+
* @throws `GeometryError` When validation, topology, tolerance, or complexity checks fail.
|
|
72
73
|
*/
|
|
73
74
|
export function computeTriangleMeshSignature(mesh, options = {}) {
|
|
74
|
-
const source =
|
|
75
|
+
const source = immutableMeshView(mesh);
|
|
75
76
|
const maxTriangles = options.maxTriangles ?? DEFAULT_MAXIMUM_TRIANGLE_COUNT;
|
|
76
77
|
if (!Number.isSafeInteger(maxTriangles) || maxTriangles <= 0) {
|
|
77
78
|
throw new GeometryError("INVALID_ARGUMENT", "maxTriangles must be a positive safe integer.", {
|
|
@@ -92,14 +93,14 @@ export function computeTriangleMeshSignature(mesh, options = {}) {
|
|
|
92
93
|
const positionTolerance = validatePositiveTolerance(options.positionTolerance ?? DEFAULT_POSITION_TOLERANCE, "positionTolerance");
|
|
93
94
|
const volumeTolerance = validatePositiveTolerance(options.volumeTolerance ?? DEFAULT_VOLUME_TOLERANCE, "volumeTolerance");
|
|
94
95
|
const measured = analyzeTriangleMesh(source, { requireClosed: true, includeTopology: true });
|
|
95
|
-
const
|
|
96
|
+
const shellCount = measured.shellCount;
|
|
96
97
|
const edgeCount = measured.edgeCount;
|
|
97
98
|
const eulerCharacteristic = measured.vertexCount - edgeCount + measured.triangleCount;
|
|
98
|
-
const twiceGenus =
|
|
99
|
+
const twiceGenus = shellCount * 2 - eulerCharacteristic;
|
|
99
100
|
if (twiceGenus < 0 || twiceGenus % 2 !== 0) {
|
|
100
101
|
throw new GeometryError("INVALID_TOPOLOGY", "Closed mesh topology does not describe orientable vertex-manifold components.", {
|
|
101
102
|
operation: "computeTriangleMeshSignature",
|
|
102
|
-
details: {
|
|
103
|
+
details: { shellCount, edgeCount, eulerCharacteristic },
|
|
103
104
|
});
|
|
104
105
|
}
|
|
105
106
|
const coordinateKeys = Array.from({ length: measured.vertexCount }, (_, vertex) => coordinateKey(source.positions, vertex, positionTolerance));
|
|
@@ -127,7 +128,7 @@ export function computeTriangleMeshSignature(mesh, options = {}) {
|
|
|
127
128
|
});
|
|
128
129
|
return Object.freeze({
|
|
129
130
|
bounds: quantizeBounds(measured.bounds),
|
|
130
|
-
|
|
131
|
+
shellCount,
|
|
131
132
|
fingerprint: hashCanonicalKeys(`${measured.vertexCount}|${measured.triangleCount}|${positionTolerance}`, [vertexKeys, triangleKeys]),
|
|
132
133
|
genus: twiceGenus / 2,
|
|
133
134
|
signedVolume: quantizedScalar(measured.signedVolume, volumeTolerance, "Signed volume"),
|
|
@@ -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
|
-
|
|
45
|
+
if (points.every((a, index) => {
|
|
35
46
|
const b = points[(index + 1) % 3];
|
|
36
|
-
return sign * turn(a, b, p) >=
|
|
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 >=
|
|
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
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
91
|
-
|
|
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;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { immutableMeshView } from "../immutable-buffer.js";
|
|
2
3
|
import { resolveGeometryTolerance } from "../tolerance.js";
|
|
3
4
|
import { IndexedMeshEdgeTable } from "./mesh-edge-table.js";
|
|
4
5
|
import { prepareSolidTriangle, trianglesIntersectBeyondSharedBoundary, triangleSolidAngle, } from "./mesh-solid-intersections.js";
|
|
@@ -51,9 +52,7 @@ function validationWork(mesh, options) {
|
|
|
51
52
|
}
|
|
52
53
|
/** @internal Fresh measurements precede one adjacency traversal for closure, fans, and shells. */
|
|
53
54
|
export function analyzeSolidMesh(mesh, options = {}) {
|
|
54
|
-
const source = typeof mesh === "object" && mesh !== null
|
|
55
|
-
? { positions: mesh.positions, indices: mesh.indices }
|
|
56
|
-
: mesh;
|
|
55
|
+
const source = typeof mesh === "object" && mesh !== null ? immutableMeshView(mesh) : mesh;
|
|
57
56
|
const work = validationWork(source, options);
|
|
58
57
|
const measurements = analyzeTriangleMesh(source, {
|
|
59
58
|
...(options.tolerance === undefined ? {} : { tolerance: options.tolerance }),
|
|
@@ -173,7 +172,8 @@ function checkSolidGeometry(mesh, facts, options, { count, maxTests }) {
|
|
|
173
172
|
min[axis] = Math.min(min[axis], bounds[order[index] * 6 + axis]);
|
|
174
173
|
max[axis] = Math.max(max[axis], bounds[order[index] * 6 + axis + 3]);
|
|
175
174
|
}
|
|
176
|
-
|
|
175
|
+
// Small leaves avoid an 8x8 cross-product of false candidates on thin sampled surfaces.
|
|
176
|
+
if (end - start <= 4)
|
|
177
177
|
return { start, end, min, max };
|
|
178
178
|
let axis = 0;
|
|
179
179
|
for (let index = 1; index < 3; index++)
|
|
@@ -220,7 +220,10 @@ function checkSolidGeometry(mesh, facts, options, { count, maxTests }) {
|
|
|
220
220
|
visit(a.children[1], a.children[1]);
|
|
221
221
|
return;
|
|
222
222
|
}
|
|
223
|
-
|
|
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)) {
|
|
224
227
|
visit(a.children[0], b);
|
|
225
228
|
visit(a.children[1], b);
|
|
226
229
|
return;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { GeometryError } from "../errors.js";
|
|
2
|
+
import { immutableMeshView } from "../immutable-buffer.js";
|
|
2
3
|
import { writeMeshVertex } from "../numeric.js";
|
|
3
4
|
import { resolveGeometryTolerance } from "../tolerance.js";
|
|
4
5
|
import { readTransformMatrix } from "../transform-matrix.js";
|
|
5
6
|
import { transformDeterminant3, validateTransform3 } from "../transform3.js";
|
|
6
7
|
import { IndexedMeshEdgeTable } from "./mesh-edge-table.js";
|
|
7
8
|
function inspectTriangleMesh(mesh, options = {}, mode = "validate", topology = false) {
|
|
8
|
-
//
|
|
9
|
-
const source =
|
|
9
|
+
// Normalize immutable storage and read raw input accessors once before traversal.
|
|
10
|
+
const source = immutableMeshView(mesh);
|
|
10
11
|
const measurements = mode === "measure";
|
|
11
12
|
if (!(source.positions instanceof Float32Array) || !(source.indices instanceof Uint32Array)) {
|
|
12
13
|
throw new GeometryError("INVALID_MESH", "Triangle meshes require Float32Array positions and Uint32Array indices.");
|
|
@@ -43,7 +44,7 @@ function inspectTriangleMesh(mesh, options = {}, mode = "validate", topology = f
|
|
|
43
44
|
const parents = topology ? new Int32Array(triangleCount) : null;
|
|
44
45
|
const ranks = topology ? new Uint8Array(triangleCount) : null;
|
|
45
46
|
const referenced = topology ? new Uint8Array(vertexCount) : null;
|
|
46
|
-
let
|
|
47
|
+
let shellCount = 0;
|
|
47
48
|
const root = (triangle) => {
|
|
48
49
|
let current = triangle;
|
|
49
50
|
while (parents[current] !== current)
|
|
@@ -64,7 +65,7 @@ function inspectTriangleMesh(mesh, options = {}, mode = "validate", topology = f
|
|
|
64
65
|
parents[right] = left;
|
|
65
66
|
if (ranks[left] === ranks[right])
|
|
66
67
|
ranks[left] = ranks[left] + 1;
|
|
67
|
-
|
|
68
|
+
shellCount -= 1;
|
|
68
69
|
};
|
|
69
70
|
let edgeCount = 0;
|
|
70
71
|
const addEdge = (a, b, triangle) => {
|
|
@@ -113,7 +114,7 @@ function inspectTriangleMesh(mesh, options = {}, mode = "validate", topology = f
|
|
|
113
114
|
const triangle = offset / 3;
|
|
114
115
|
parents[triangle] = triangle;
|
|
115
116
|
referenced[a] = referenced[b] = referenced[c] = 1;
|
|
116
|
-
|
|
117
|
+
shellCount += 1;
|
|
117
118
|
}
|
|
118
119
|
if (edges !== null) {
|
|
119
120
|
addEdge(a, b, offset / 3);
|
|
@@ -143,19 +144,9 @@ function inspectTriangleMesh(mesh, options = {}, mode = "validate", topology = f
|
|
|
143
144
|
surfaceArea: surfaceArea + areaCorrection,
|
|
144
145
|
triangleCount,
|
|
145
146
|
vertexCount,
|
|
146
|
-
...(topology ? {
|
|
147
|
+
...(topology ? { shellCount, edgeCount } : {}),
|
|
147
148
|
});
|
|
148
149
|
}
|
|
149
|
-
/**
|
|
150
|
-
* Validates and measures a mesh in one position and one triangle traversal.
|
|
151
|
-
*
|
|
152
|
-
* Bounds, area in square model units and signed volume in cubic model units are computed without
|
|
153
|
-
* copying or changing the input buffers. Volume is meaningful for consistently wound closed
|
|
154
|
-
* geometry; `requireClosed` checks oriented edge closure. Optional indexed topology counts require
|
|
155
|
-
* every position vertex to be referenced and do not establish freedom from self-intersections.
|
|
156
|
-
* Results and nested bounds are immutable snapshots. Caller-owned mutable meshes are freshly
|
|
157
|
-
* inspected on every call, never cached.
|
|
158
|
-
*/
|
|
159
150
|
export function analyzeTriangleMesh(mesh, options = {}) {
|
|
160
151
|
return inspectTriangleMesh(mesh, options, "measure", options.includeTopology ?? false);
|
|
161
152
|
}
|
|
@@ -169,7 +160,7 @@ export function analyzeTriangleMesh(mesh, options = {}) {
|
|
|
169
160
|
* @param mesh - Mesh to inspect.
|
|
170
161
|
* @param options - Empty-mesh, topology, and tolerance policy.
|
|
171
162
|
* @returns The original mesh after successful validation.
|
|
172
|
-
* @throws
|
|
163
|
+
* @throws `GeometryError` When any requested invariant fails.
|
|
173
164
|
*/
|
|
174
165
|
export function validateTriangleMesh(mesh, options = {}) {
|
|
175
166
|
inspectTriangleMesh(mesh, options);
|
|
@@ -180,7 +171,7 @@ export function validateTriangleMesh(mesh, options = {}) {
|
|
|
180
171
|
*
|
|
181
172
|
* @param mesh - Mesh whose finite complete vertices will be measured.
|
|
182
173
|
* @returns Fresh immutable minimum and maximum XYZ tuples.
|
|
183
|
-
* @throws
|
|
174
|
+
* @throws `GeometryError` When the mesh is structurally invalid.
|
|
184
175
|
*/
|
|
185
176
|
export const meshBounds = (mesh) => {
|
|
186
177
|
return inspectTriangleMesh(mesh, {}, "bounds");
|
|
@@ -192,10 +183,10 @@ export const meshBounds = (mesh) => {
|
|
|
192
183
|
*
|
|
193
184
|
* @param meshes - One or more meshes to concatenate.
|
|
194
185
|
* @returns Fresh typed arrays with indices offset to their source vertex ranges.
|
|
195
|
-
* @throws
|
|
186
|
+
* @throws `GeometryError` When no mesh is supplied or an input is invalid.
|
|
196
187
|
*/
|
|
197
188
|
export function joinTriangleMeshes(meshes) {
|
|
198
|
-
const sources = meshes.map((
|
|
189
|
+
const sources = meshes.map((mesh) => immutableMeshView(mesh));
|
|
199
190
|
if (sources.length === 0) {
|
|
200
191
|
throw new GeometryError("INVALID_ARGUMENT", "Joining meshes requires at least one mesh.");
|
|
201
192
|
}
|
|
@@ -228,7 +219,7 @@ export function joinTriangleMeshes(meshes) {
|
|
|
228
219
|
* @returns Fresh position and index buffers; the input remains unchanged.
|
|
229
220
|
*/
|
|
230
221
|
export function reverseTriangleMesh(mesh) {
|
|
231
|
-
const source =
|
|
222
|
+
const source = immutableMeshView(mesh);
|
|
232
223
|
validateTriangleMesh(source);
|
|
233
224
|
const indices = new Uint32Array(source.indices);
|
|
234
225
|
for (let offset = 0; offset < indices.length; offset += 3) {
|
|
@@ -249,7 +240,7 @@ export function reverseTriangleMesh(mesh) {
|
|
|
249
240
|
* @returns A mesh with fresh transformed positions and copied or reversed indices.
|
|
250
241
|
*/
|
|
251
242
|
export function transformTriangleMesh(mesh, placement) {
|
|
252
|
-
const source =
|
|
243
|
+
const source = immutableMeshView(mesh);
|
|
253
244
|
validateTriangleMesh(source);
|
|
254
245
|
const transform = readTransformMatrix(placement, 3);
|
|
255
246
|
validateTransform3(transform);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Pure triangle mesh construction, processing, and inspection without a host engine. */
|
|
2
|
+
export { extrudeMesh as extrude, loftMesh as loft } from "./loft/loft.js";
|
|
3
|
+
export { revolveMesh as revolve } from "./revolve/revolve-mesh.js";
|
|
4
|
+
export { sweepMesh as sweep } from "./sweeps/sweep-mesh.js";
|
|
5
|
+
export { heightfieldMesh as heightfield, preflightHeightfield } from "./heightfield.js";
|
|
6
|
+
export { threadRidgeMesh as threadRidge, threadSolidMesh as threadSolid, } from "./mechanical/threads/mesh.js";
|
|
7
|
+
export { preflightThreadSolidMesh as preflightThreadSolid } from "./mechanical/threads/mesh-plan.js";
|
|
8
|
+
export { transformTriangleMesh as transform, joinTriangleMeshes as join, reverseTriangleMesh as reverse, meshBounds as bounds, analyzeTriangleMesh as analyze, validateTriangleMesh as validate, } from "./mesh/mesh.js";
|
|
9
|
+
export { computeTriangleMeshCentroid as centroid } from "./mesh/mesh-centroid.js";
|
|
10
|
+
export { analyzeTriangleMeshQuality as analyzeQuality } from "./mesh/mesh-quality.js";
|
|
11
|
+
export { computeTriangleMeshSignature as signature } from "./mesh/mesh-signature.js";
|
|
12
|
+
export { validateSolidMesh as validateSolid } from "./mesh/mesh-solid.js";
|
|
13
|
+
export { renderMesh as render } from "./mesh/mesh-render.js";
|
|
14
|
+
export { optimizePlanarPatches } from "./mesh/mesh-planar.js";
|
|
15
|
+
export { immutableMesh as immutable } from "./immutable-buffer.js";
|