three-stdlib 2.16.0 → 2.16.2
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/BufferGeometryUtils-1a7a235c.js +655 -0
- package/BufferGeometryUtils-971dfde3.js +1 -0
- package/Nodes-4f766d71.js +471 -0
- package/Nodes-9aa16d74.js +1 -0
- package/animation/AnimationClipCreator.cjs.js +1 -0
- package/animation/AnimationClipCreator.js +52 -32
- package/animation/CCDIKSolver.cjs.js +1 -0
- package/animation/CCDIKSolver.js +143 -64
- package/animation/MMDAnimationHelper.cjs.js +1 -0
- package/animation/MMDAnimationHelper.js +341 -150
- package/animation/MMDPhysics.cjs.js +1 -0
- package/animation/MMDPhysics.js +361 -154
- package/cameras/CinematicCamera.cjs.js +1 -0
- package/cameras/CinematicCamera.js +77 -67
- package/controls/ArcballControls.cjs.js +1 -0
- package/controls/ArcballControls.js +1449 -544
- package/controls/DeviceOrientationControls.cjs.js +1 -0
- package/controls/DeviceOrientationControls.js +97 -52
- package/controls/DragControls.cjs.js +1 -0
- package/controls/DragControls.js +187 -85
- package/controls/FirstPersonControls.cjs.js +1 -0
- package/controls/FirstPersonControls.js +193 -123
- package/controls/FlyControls.cjs.js +1 -0
- package/controls/FlyControls.d.ts +5 -4
- package/controls/FlyControls.js +160 -90
- package/controls/OrbitControls.cjs.js +1 -0
- package/controls/OrbitControls.js +481 -232
- package/controls/PointerLockControls.cjs.js +1 -0
- package/controls/PointerLockControls.js +99 -63
- package/controls/TrackballControls.cjs.js +1 -0
- package/controls/TrackballControls.js +383 -211
- package/controls/TransformControls.cjs.js +1 -0
- package/controls/TransformControls.js +782 -575
- package/controls/experimental/CameraControls.cjs.js +1 -0
- package/controls/experimental/CameraControls.js +609 -329
- package/csm/CSM.cjs.js +1 -0
- package/csm/CSM.js +108 -47
- package/csm/CSMFrustum.cjs.js +1 -0
- package/csm/CSMFrustum.js +29 -14
- package/csm/CSMHelper.cjs.js +1 -0
- package/csm/CSMHelper.js +34 -20
- package/csm/CSMShader.cjs.js +1 -0
- package/csm/CSMShader.js +11 -7
- package/curves/CurveExtras.cjs.js +1 -0
- package/curves/CurveExtras.js +115 -73
- package/curves/NURBSCurve.cjs.js +1 -0
- package/curves/NURBSCurve.js +43 -15
- package/curves/NURBSSurface.cjs.js +1 -0
- package/curves/NURBSSurface.js +27 -11
- package/curves/NURBSUtils.cjs.js +1 -0
- package/curves/NURBSUtils.js +203 -54
- package/custom.d.cjs.js +1 -0
- package/{shaders/types.mjs → custom.d.js} +0 -0
- package/deprecated/Geometry.cjs.js +1 -0
- package/deprecated/Geometry.js +486 -191
- package/effects/AnaglyphEffect.cjs.js +1 -0
- package/effects/AnaglyphEffect.js +60 -95
- package/effects/AsciiEffect.cjs.js +1 -0
- package/effects/AsciiEffect.js +110 -80
- package/effects/OutlineEffect.cjs.js +1 -0
- package/effects/OutlineEffect.js +204 -121
- package/effects/ParallaxBarrierEffect.cjs.js +1 -0
- package/effects/ParallaxBarrierEffect.js +38 -39
- package/effects/PeppersGhostEffect.cjs.js +1 -0
- package/effects/PeppersGhostEffect.js +68 -19
- package/effects/StereoEffect.cjs.js +1 -0
- package/effects/StereoEffect.js +16 -12
- package/environments/RoomEnvironment.cjs.js +1 -0
- package/environments/RoomEnvironment.js +47 -52
- package/exporters/ColladaExporter.cjs.js +1 -0
- package/exporters/ColladaExporter.js +241 -115
- package/exporters/DRACOExporter.cjs.js +1 -0
- package/exporters/DRACOExporter.js +121 -67
- package/exporters/GLTFExporter.cjs.js +1 -0
- package/exporters/GLTFExporter.js +1014 -463
- package/exporters/MMDExporter.cjs.js +1 -0
- package/exporters/MMDExporter.js +102 -44
- package/exporters/OBJExporter.cjs.js +1 -0
- package/exporters/OBJExporter.js +140 -78
- package/exporters/PLYExporter.cjs.js +1 -0
- package/exporters/PLYExporter.js +154 -93
- package/exporters/STLExporter.cjs.js +1 -0
- package/exporters/STLExporter.js +81 -30
- package/exporters/USDZExporter.cjs.js +1 -0
- package/exporters/USDZExporter.js +144 -84
- package/geometries/BoxLineGeometry.cjs.js +1 -0
- package/geometries/BoxLineGeometry.js +14 -7
- package/geometries/ConvexGeometry.cjs.js +1 -0
- package/geometries/ConvexGeometry.js +23 -14
- package/geometries/DecalGeometry.cjs.js +1 -0
- package/geometries/DecalGeometry.js +162 -108
- package/geometries/LightningStrike.cjs.js +1 -0
- package/geometries/LightningStrike.js +294 -101
- package/geometries/ParametricGeometries.cjs.js +1 -0
- package/geometries/ParametricGeometries.js +76 -26
- package/geometries/ParametricGeometry.cjs.js +1 -0
- package/geometries/ParametricGeometry.js +48 -24
- package/geometries/RoundedBoxGeometry.cjs.js +1 -0
- package/geometries/RoundedBoxGeometry.js +64 -33
- package/geometries/TeapotGeometry.cjs.js +1 -0
- package/geometries/TeapotGeometry.js +174 -1434
- package/geometries/TextGeometry.cjs.js +1 -0
- package/geometries/TextGeometry.js +17 -9
- package/helpers/LightProbeHelper.cjs.js +1 -0
- package/helpers/LightProbeHelper.js +21 -53
- package/helpers/PositionalAudioHelper.cjs.js +1 -0
- package/helpers/PositionalAudioHelper.js +30 -23
- package/helpers/RectAreaLightHelper.cjs.js +1 -0
- package/helpers/RectAreaLightHelper.js +33 -17
- package/helpers/VertexNormalsHelper.cjs.js +1 -0
- package/helpers/VertexNormalsHelper.js +41 -20
- package/helpers/VertexTangentsHelper.cjs.js +1 -0
- package/helpers/VertexTangentsHelper.js +36 -18
- package/index.cjs.js +1 -0
- package/index.js +333 -969
- package/interactive/InteractiveGroup.cjs.js +1 -0
- package/interactive/InteractiveGroup.d.ts +5 -0
- package/interactive/InteractiveGroup.js +87 -0
- package/interactive/SelectionBox.cjs.js +1 -0
- package/interactive/SelectionBox.js +46 -31
- package/interactive/SelectionHelper.cjs.js +1 -0
- package/interactive/SelectionHelper.js +21 -16
- package/libs/MeshoptDecoder.cjs.js +1 -0
- package/libs/MeshoptDecoder.js +58 -147
- package/libs/MotionControllers.cjs.js +1 -0
- package/libs/MotionControllers.js +208 -66
- package/lights/LightProbeGenerator.cjs.js +1 -0
- package/lights/LightProbeGenerator.js +96 -40
- package/lights/RectAreaLightUniformsLib.cjs.js +1 -0
- package/lights/RectAreaLightUniformsLib.js +9 -32842
- package/lines/Line2.cjs.js +1 -0
- package/lines/Line2.js +12 -9
- package/lines/LineGeometry.cjs.js +1 -0
- package/lines/LineGeometry.js +19 -7
- package/lines/LineMaterial.cjs.js +1 -0
- package/lines/LineMaterial.js +89 -51
- package/lines/LineSegments2.cjs.js +1 -0
- package/lines/LineSegments2.js +165 -56
- package/lines/LineSegmentsGeometry.cjs.js +1 -0
- package/lines/LineSegmentsGeometry.js +71 -29
- package/lines/Wireframe.cjs.js +1 -0
- package/lines/Wireframe.js +29 -15
- package/lines/WireframeGeometry2.cjs.js +1 -0
- package/lines/WireframeGeometry2.js +9 -8
- package/loaders/3DMLoader.cjs.js +1 -0
- package/loaders/3DMLoader.js +469 -234
- package/loaders/3MFLoader.cjs.js +1 -0
- package/loaders/3MFLoader.js +555 -340
- package/loaders/AMFLoader.cjs.js +1 -0
- package/loaders/AMFLoader.js +219 -114
- package/loaders/AssimpLoader.cjs.js +1 -0
- package/loaders/AssimpLoader.js +725 -328
- package/loaders/BVHLoader.cjs.js +1 -0
- package/loaders/BVHLoader.js +200 -94
- package/loaders/BasisTextureLoader.cjs.js +1 -0
- package/loaders/BasisTextureLoader.js +357 -229
- package/loaders/ColladaLoader.cjs.js +1 -0
- package/loaders/ColladaLoader.js +1522 -932
- package/loaders/DDSLoader.cjs.js +1 -0
- package/loaders/DDSLoader.js +108 -42
- package/loaders/DRACOLoader.cjs.js +1 -0
- package/loaders/DRACOLoader.js +210 -103
- package/loaders/EXRLoader.cjs.js +1 -0
- package/loaders/EXRLoader.js +809 -461
- package/loaders/FBXLoader.cjs.js +1 -0
- package/loaders/FBXLoader.js +1397 -842
- package/loaders/FontLoader.cjs.js +1 -0
- package/loaders/FontLoader.js +66 -33
- package/loaders/GCodeLoader.cjs.js +1 -0
- package/loaders/GCodeLoader.js +111 -63
- package/loaders/GLTFLoader.cjs.js +1 -0
- package/loaders/GLTFLoader.js +1484 -771
- package/loaders/HDRCubeTextureLoader.cjs.js +1 -0
- package/loaders/HDRCubeTextureLoader.js +50 -45
- package/loaders/KMZLoader.cjs.js +1 -0
- package/loaders/KMZLoader.js +55 -42
- package/loaders/KTX2Loader.cjs.js +1 -0
- package/loaders/KTX2Loader.js +362 -229
- package/loaders/KTXLoader.cjs.js +1 -0
- package/loaders/KTXLoader.js +99 -37
- package/loaders/LDrawLoader.cjs.js +1 -0
- package/loaders/LDrawLoader.js +746 -313
- package/loaders/LUT3dlLoader.cjs.js +1 -0
- package/loaders/LUT3dlLoader.js +62 -50
- package/loaders/LUTCubeLoader.cjs.js +1 -0
- package/loaders/LUTCubeLoader.js +56 -45
- package/loaders/LWOLoader.cjs.js +1 -0
- package/loaders/LWOLoader.js +339 -227
- package/loaders/LottieLoader.cjs.js +1 -0
- package/loaders/LottieLoader.js +38 -36
- package/loaders/MD2Loader.cjs.js +1 -0
- package/loaders/MD2Loader.js +91 -248
- package/loaders/MDDLoader.cjs.js +1 -0
- package/loaders/MDDLoader.js +45 -25
- package/loaders/MMDLoader.cjs.js +1 -0
- package/loaders/MMDLoader.js +795 -359
- package/loaders/MTLLoader.cjs.js +1 -0
- package/loaders/MTLLoader.js +201 -91
- package/loaders/NRRDLoader.cjs.js +1 -0
- package/loaders/NRRDLoader.js +263 -182
- package/loaders/NodeMaterialLoader.cjs.js +1 -0
- package/loaders/NodeMaterialLoader.js +14 -121
- package/loaders/OBJLoader.cjs.js +1 -0
- package/loaders/OBJLoader.js +283 -161
- package/loaders/PCDLoader.cjs.js +1 -0
- package/loaders/PCDLoader.js +164 -145
- package/loaders/PDBLoader.cjs.js +1 -0
- package/loaders/PDBLoader.js +63 -45
- package/loaders/PLYLoader.cjs.js +1 -0
- package/loaders/PLYLoader.js +203 -106
- package/loaders/PRWMLoader.cjs.js +1 -0
- package/loaders/PRWMLoader.js +110 -73
- package/loaders/PVRLoader.cjs.js +1 -0
- package/loaders/PVRLoader.js +93 -32
- package/loaders/RGBELoader.cjs.js +1 -0
- package/loaders/RGBELoader.js +233 -96
- package/loaders/RGBMLoader.cjs.js +1 -0
- package/loaders/RGBMLoader.js +514 -344
- package/loaders/STLLoader.cjs.js +1 -0
- package/loaders/STLLoader.js +165 -59
- package/loaders/SVGLoader.cjs.js +1 -0
- package/loaders/SVGLoader.js +851 -481
- package/loaders/TDSLoader.cjs.js +1 -0
- package/loaders/TDSLoader.js +527 -137
- package/loaders/TGALoader.cjs.js +1 -0
- package/loaders/TGALoader.js +205 -94
- package/loaders/TTFLoader.cjs.js +1 -0
- package/loaders/TTFLoader.js +79 -58
- package/loaders/TiltLoader.cjs.js +1 -0
- package/loaders/TiltLoader.js +167 -129
- package/loaders/VOXLoader.cjs.js +1 -0
- package/loaders/VOXLoader.js +84 -320
- package/loaders/VRMLLoader.cjs.js +1 -0
- package/loaders/VRMLLoader.js +1268 -786
- package/loaders/VRMLoader.cjs.js +1 -0
- package/loaders/VRMLoader.js +31 -23
- package/loaders/VTKLoader.cjs.js +1 -0
- package/loaders/VTKLoader.js +407 -219
- package/loaders/XLoader.cjs.js +1 -0
- package/loaders/XLoader.js +1259 -1083
- package/loaders/XYZLoader.cjs.js +1 -0
- package/loaders/XYZLoader.js +34 -28
- package/loaders/lwo/IFFParser.cjs.js +1 -0
- package/loaders/lwo/IFFParser.js +492 -238
- package/loaders/lwo/LWO2Parser.cjs.js +1 -0
- package/loaders/lwo/LWO2Parser.js +279 -176
- package/loaders/lwo/LWO3Parser.cjs.js +1 -0
- package/loaders/lwo/LWO3Parser.js +247 -160
- package/math/Capsule.cjs.js +1 -0
- package/math/Capsule.js +43 -56
- package/math/ColorConverter.cjs.js +1 -0
- package/math/ColorConverter.js +32 -18
- package/math/ConvexHull.cjs.js +1 -0
- package/math/ConvexHull.js +357 -97
- package/math/ImprovedNoise.cjs.js +1 -0
- package/math/ImprovedNoise.js +32 -282
- package/math/Lut.cjs.js +1 -0
- package/math/Lut.js +35 -51
- package/math/MeshSurfaceSampler.cjs.js +1 -0
- package/math/MeshSurfaceSampler.js +68 -25
- package/math/OBB.cjs.js +1 -0
- package/math/OBB.js +152 -91
- package/math/Octree.cjs.js +1 -0
- package/math/Octree.js +139 -76
- package/math/SimplexNoise.cjs.js +1 -0
- package/math/SimplexNoise.js +238 -217
- package/misc/ConvexObjectBreaker.cjs.js +1 -0
- package/misc/ConvexObjectBreaker.js +185 -79
- package/misc/GPUComputationRenderer.cjs.js +1 -0
- package/misc/GPUComputationRenderer.js +194 -69
- package/misc/Gyroscope.cjs.js +1 -0
- package/misc/Gyroscope.js +22 -16
- package/misc/MD2Character.cjs.js +1 -0
- package/misc/MD2Character.js +74 -52
- package/misc/MD2CharacterComplex.cjs.js +1 -0
- package/misc/MD2CharacterComplex.js +163 -112
- package/misc/MorphAnimMesh.cjs.js +1 -0
- package/misc/MorphAnimMesh.js +28 -20
- package/misc/MorphBlendMesh.cjs.js +1 -0
- package/misc/MorphBlendMesh.js +69 -45
- package/misc/ProgressiveLightmap.cjs.js +1 -0
- package/misc/ProgressiveLightmap.js +187 -70
- package/misc/RollerCoaster.cjs.js +1 -0
- package/misc/RollerCoaster.js +135 -106
- package/misc/TubePainter.cjs.js +1 -0
- package/misc/TubePainter.js +92 -74
- package/misc/Volume.cjs.js +1 -0
- package/misc/Volume.js +270 -108
- package/misc/VolumeSlice.cjs.js +1 -0
- package/misc/VolumeSlice.js +122 -34
- package/misc/WebGL.cjs.js +1 -0
- package/misc/WebGL.js +34 -37
- package/modifiers/CurveModifier.cjs.js +1 -0
- package/modifiers/CurveModifier.js +151 -46
- package/modifiers/EdgeSplitModifier.cjs.js +1 -0
- package/modifiers/EdgeSplitModifier.js +90 -46
- package/modifiers/SimplifyModifier.cjs.js +1 -0
- package/modifiers/SimplifyModifier.js +202 -77
- package/modifiers/TessellateModifier.cjs.js +1 -0
- package/modifiers/TessellateModifier.js +90 -65
- package/nodes/Nodes.cjs.js +1 -0
- package/nodes/Nodes.js +140 -274
- package/nodes/ShaderNode.cjs.js +1 -0
- package/nodes/ShaderNode.js +196 -296
- package/nodes/accessors/BufferNode.cjs.js +1 -0
- package/nodes/accessors/BufferNode.js +8 -4
- package/nodes/accessors/CameraNode.cjs.js +1 -0
- package/nodes/accessors/CameraNode.js +25 -20
- package/nodes/accessors/CubeTextureNode.cjs.js +1 -0
- package/nodes/accessors/CubeTextureNode.js +26 -14
- package/nodes/accessors/MaterialNode.cjs.js +1 -0
- package/nodes/accessors/MaterialNode.js +53 -43
- package/nodes/accessors/MaterialReferenceNode.cjs.js +1 -0
- package/nodes/accessors/MaterialReferenceNode.js +6 -3
- package/nodes/accessors/ModelNode.cjs.js +1 -0
- package/nodes/accessors/ModelNode.js +5 -3
- package/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
- package/nodes/accessors/ModelViewProjectionNode.js +13 -14
- package/nodes/accessors/NormalNode.cjs.js +1 -0
- package/nodes/accessors/NormalNode.js +39 -40
- package/nodes/accessors/Object3DNode.cjs.js +1 -0
- package/nodes/accessors/Object3DNode.js +50 -40
- package/nodes/accessors/PointUVNode.cjs.js +1 -0
- package/nodes/accessors/PointUVNode.js +9 -5
- package/nodes/accessors/PositionNode.cjs.js +1 -0
- package/nodes/accessors/PositionNode.js +41 -42
- package/nodes/accessors/ReferenceNode.cjs.js +1 -0
- package/nodes/accessors/ReferenceNode.js +17 -10
- package/nodes/accessors/ReflectNode.cjs.js +1 -0
- package/nodes/accessors/ReflectNode.js +26 -23
- package/nodes/accessors/SkinningNode.cjs.js +1 -0
- package/nodes/accessors/SkinningNode.js +48 -46
- package/nodes/accessors/TextureNode.cjs.js +1 -0
- package/nodes/accessors/TextureNode.js +29 -14
- package/nodes/accessors/UVNode.cjs.js +1 -0
- package/nodes/accessors/UVNode.js +11 -5
- package/nodes/core/ArrayUniformNode.cjs.js +1 -0
- package/nodes/core/ArrayUniformNode.js +7 -3
- package/nodes/core/AttributeNode.cjs.js +1 -0
- package/nodes/core/AttributeNode.js +12 -5
- package/nodes/core/BypassNode.cjs.js +1 -0
- package/nodes/core/BypassNode.js +12 -5
- package/nodes/core/CodeNode.cjs.js +1 -0
- package/nodes/core/CodeNode.js +12 -4
- package/nodes/core/ConstNode.cjs.js +1 -0
- package/nodes/core/ConstNode.js +7 -3
- package/nodes/core/ContextNode.cjs.js +1 -0
- package/nodes/core/ContextNode.js +8 -3
- package/nodes/core/ExpressionNode.cjs.js +1 -0
- package/nodes/core/ExpressionNode.js +9 -5
- package/nodes/core/FunctionCallNode.cjs.js +1 -0
- package/nodes/core/FunctionCallNode.js +15 -6
- package/nodes/core/FunctionNode.cjs.js +1 -0
- package/nodes/core/FunctionNode.js +25 -10
- package/nodes/core/InputNode.cjs.js +1 -0
- package/nodes/core/InputNode.js +23 -12
- package/nodes/core/Node.cjs.js +1 -0
- package/nodes/core/Node.js +75 -35
- package/nodes/core/NodeAttribute.cjs.js +1 -0
- package/nodes/core/NodeAttribute.js +4 -2
- package/nodes/core/NodeBuilder.cjs.js +1 -0
- package/nodes/core/NodeBuilder.js +224 -110
- package/nodes/core/NodeCode.cjs.js +1 -0
- package/nodes/core/NodeCode.js +7 -4
- package/nodes/core/NodeFrame.cjs.js +1 -0
- package/nodes/core/NodeFrame.js +12 -9
- package/nodes/core/NodeFunction.cjs.js +1 -0
- package/nodes/core/NodeFunction.js +17 -0
- package/nodes/core/NodeFunctionInput.cjs.js +1 -0
- package/nodes/core/NodeFunctionInput.js +5 -3
- package/nodes/core/NodeKeywords.cjs.js +1 -0
- package/nodes/core/NodeKeywords.js +16 -5
- package/nodes/core/NodeParser.cjs.js +1 -0
- package/nodes/core/NodeParser.js +8 -0
- package/nodes/core/NodeUniform.cjs.js +1 -0
- package/nodes/core/NodeUniform.js +7 -3
- package/nodes/core/NodeUtils.cjs.js +1 -0
- package/nodes/core/NodeUtils.js +43 -39
- package/nodes/core/NodeVar.cjs.js +1 -0
- package/nodes/core/NodeVar.js +4 -2
- package/nodes/core/NodeVary.cjs.js +1 -0
- package/nodes/core/NodeVary.js +4 -2
- package/nodes/core/PropertyNode.cjs.js +1 -0
- package/nodes/core/PropertyNode.js +10 -4
- package/nodes/core/TempNode.cjs.js +1 -0
- package/nodes/core/TempNode.js +11 -5
- package/nodes/core/UniformNode.cjs.js +1 -0
- package/nodes/core/UniformNode.js +10 -4
- package/nodes/core/VarNode.cjs.js +1 -0
- package/nodes/core/VarNode.js +11 -3
- package/nodes/core/VaryNode.cjs.js +1 -0
- package/nodes/core/VaryNode.js +15 -6
- package/nodes/core/constants.cjs.js +1 -0
- package/nodes/core/constants.js +7 -20
- package/nodes/display/ColorSpaceNode.cjs.js +1 -0
- package/nodes/display/ColorSpaceNode.js +38 -34
- package/nodes/display/NormalMapNode.cjs.js +1 -0
- package/nodes/display/NormalMapNode.js +53 -35
- package/nodes/fog/FogNode.cjs.js +1 -0
- package/nodes/fog/FogNode.js +9 -5
- package/nodes/fog/FogRangeNode.cjs.js +1 -0
- package/nodes/fog/FogRangeNode.js +9 -5
- package/nodes/functions/BSDFs.cjs.js +1 -0
- package/nodes/functions/BSDFs.js +118 -61
- package/nodes/functions/PhysicalMaterialFunctions.cjs.js +1 -0
- package/nodes/functions/PhysicalMaterialFunctions.js +57 -0
- package/nodes/lights/LightContextNode.cjs.js +1 -0
- package/nodes/lights/LightContextNode.js +23 -14
- package/nodes/lights/LightNode.cjs.js +1 -0
- package/nodes/lights/LightNode.js +31 -27
- package/nodes/lights/LightsNode.cjs.js +1 -0
- package/nodes/lights/LightsNode.js +28 -9
- package/nodes/loaders/NodeLoader.cjs.js +1 -0
- package/nodes/loaders/NodeLoader.js +42 -27
- package/nodes/loaders/NodeMaterialLoader.cjs.js +1 -0
- package/nodes/loaders/NodeMaterialLoader.js +10 -4
- package/nodes/loaders/NodeObjectLoader.cjs.js +1 -0
- package/nodes/loaders/NodeObjectLoader.js +19 -9
- package/nodes/materials/LineBasicNodeMaterial.cjs.js +1 -0
- package/nodes/materials/LineBasicNodeMaterial.js +10 -5
- package/nodes/materials/Materials.cjs.js +1 -0
- package/nodes/materials/Materials.js +17 -14
- package/nodes/materials/MeshBasicNodeMaterial.cjs.js +1 -0
- package/nodes/materials/MeshBasicNodeMaterial.js +10 -5
- package/nodes/materials/MeshStandardNodeMaterial.cjs.js +1 -0
- package/nodes/materials/MeshStandardNodeMaterial.js +8 -5
- package/nodes/materials/NodeMaterial.cjs.js +1 -0
- package/nodes/materials/NodeMaterial.js +36 -20
- package/nodes/materials/PointsNodeMaterial.cjs.js +1 -0
- package/nodes/materials/PointsNodeMaterial.js +10 -5
- package/nodes/math/CondNode.cjs.js +1 -0
- package/nodes/math/CondNode.js +23 -11
- package/nodes/math/MathNode.cjs.js +1 -0
- package/nodes/math/MathNode.js +142 -98
- package/nodes/math/OperatorNode.cjs.js +1 -0
- package/nodes/math/OperatorNode.js +46 -24
- package/nodes/parsers/GLSLNodeFunction.cjs.js +1 -0
- package/nodes/parsers/GLSLNodeFunction.js +101 -0
- package/nodes/parsers/GLSLNodeParser.cjs.js +1 -0
- package/nodes/parsers/GLSLNodeParser.js +13 -0
- package/nodes/parsers/WGSLNodeFunction.cjs.js +1 -0
- package/nodes/parsers/WGSLNodeFunction.js +71 -0
- package/nodes/parsers/WGSLNodeParser.cjs.js +1 -0
- package/nodes/parsers/WGSLNodeParser.js +13 -0
- package/nodes/procedural/CheckerNode.cjs.js +1 -0
- package/nodes/procedural/CheckerNode.js +19 -13
- package/nodes/utils/ArrayElementNode.cjs.js +1 -0
- package/nodes/utils/ArrayElementNode.js +8 -4
- package/nodes/utils/ConvertNode.cjs.js +1 -0
- package/nodes/utils/ConvertNode.js +8 -3
- package/nodes/utils/JoinNode.cjs.js +1 -0
- package/nodes/utils/JoinNode.js +11 -7
- package/nodes/utils/MatcapUVNode.cjs.js +1 -0
- package/nodes/utils/MatcapUVNode.js +11 -8
- package/nodes/utils/OscNode.cjs.js +1 -0
- package/nodes/utils/OscNode.js +33 -27
- package/nodes/utils/SplitNode.cjs.js +1 -0
- package/nodes/utils/SplitNode.js +20 -6
- package/nodes/utils/SpriteSheetUVNode.cjs.js +1 -0
- package/nodes/utils/SpriteSheetUVNode.js +23 -23
- package/nodes/utils/TimerNode.cjs.js +1 -0
- package/nodes/utils/TimerNode.js +24 -20
- package/objects/GroundProjectedEnv.cjs.js +1 -0
- package/objects/GroundProjectedEnv.js +37 -22
- package/objects/Lensflare.cjs.js +1 -0
- package/objects/Lensflare.js +156 -86
- package/objects/LightningStorm.cjs.js +1 -0
- package/objects/LightningStorm.js +102 -38
- package/objects/MarchingCubes.cjs.js +1 -0
- package/objects/MarchingCubes.js +303 -150
- package/objects/Reflector.cjs.js +1 -0
- package/objects/Reflector.js +72 -50
- package/objects/ReflectorForSSRPass.cjs.js +1 -0
- package/objects/ReflectorForSSRPass.js +131 -80
- package/objects/ReflectorRTT.cjs.js +1 -0
- package/objects/ReflectorRTT.js +7 -6
- package/objects/Refractor.cjs.js +1 -0
- package/objects/Refractor.js +106 -64
- package/objects/ShadowMesh.cjs.js +1 -0
- package/objects/ShadowMesh.js +17 -8
- package/objects/Sky.cjs.js +1 -0
- package/objects/Sky.js +80 -119
- package/objects/Water.cjs.js +1 -0
- package/objects/Water.js +127 -83
- package/objects/Water2.cjs.js +1 -0
- package/objects/Water2.js +108 -72
- package/offscreen/jank.cjs.js +1 -0
- package/offscreen/jank.js +14 -10
- package/offscreen/offscreen.cjs.js +1 -0
- package/offscreen/offscreen.js +5 -4
- package/offscreen/scene.cjs.js +1 -0
- package/offscreen/scene.js +48 -45
- package/package.json +3 -3
- package/physics/AmmoPhysics.cjs.js +1 -0
- package/physics/AmmoPhysics.js +71 -30
- package/postprocessing/AdaptiveToneMappingPass.cjs.js +1 -0
- package/postprocessing/AdaptiveToneMappingPass.js +123 -97
- package/postprocessing/AfterimagePass.cjs.js +1 -0
- package/postprocessing/AfterimagePass.js +49 -28
- package/postprocessing/BloomPass.cjs.js +1 -0
- package/postprocessing/BloomPass.js +69 -43
- package/postprocessing/BokehPass.cjs.js +1 -0
- package/postprocessing/BokehPass.js +69 -39
- package/postprocessing/ClearPass.cjs.js +1 -0
- package/postprocessing/ClearPass.js +25 -10
- package/postprocessing/CubeTexturePass.cjs.js +1 -0
- package/postprocessing/CubeTexturePass.js +27 -28
- package/postprocessing/DotScreenPass.cjs.js +1 -0
- package/postprocessing/DotScreenPass.js +32 -24
- package/postprocessing/EffectComposer.cjs.js +1 -0
- package/postprocessing/EffectComposer.js +86 -39
- package/postprocessing/FilmPass.cjs.js +1 -0
- package/postprocessing/FilmPass.js +30 -25
- package/postprocessing/GlitchPass.cjs.js +1 -0
- package/postprocessing/GlitchPass.js +61 -38
- package/postprocessing/HalftonePass.cjs.js +1 -0
- package/postprocessing/HalftonePass.js +39 -19
- package/postprocessing/LUTPass.cjs.js +1 -0
- package/postprocessing/LUTPass.js +38 -13
- package/postprocessing/MaskPass.cjs.js +1 -0
- package/postprocessing/MaskPass.js +38 -19
- package/postprocessing/OutlinePass.cjs.js +1 -0
- package/postprocessing/OutlinePass.js +277 -135
- package/postprocessing/Pass.cjs.js +1 -0
- package/postprocessing/Pass.js +44 -20
- package/postprocessing/RenderPass.cjs.js +1 -0
- package/postprocessing/RenderPass.js +36 -13
- package/postprocessing/RenderPixelatedPass.cjs.js +1 -0
- package/postprocessing/RenderPixelatedPass.js +58 -44
- package/postprocessing/SAOPass.cjs.js +1 -0
- package/postprocessing/SAOPass.js +189 -154
- package/postprocessing/SMAAPass.cjs.js +1 -0
- package/postprocessing/SMAAPass.js +84 -64
- package/postprocessing/SSAARenderPass.cjs.js +1 -0
- package/postprocessing/SSAARenderPass.js +69 -121
- package/postprocessing/SSAOPass.cjs.js +1 -0
- package/postprocessing/SSAOPass.js +172 -123
- package/postprocessing/SSRPass.cjs.js +1 -0
- package/postprocessing/SSRPass.js +280 -211
- package/postprocessing/SavePass.cjs.js +1 -0
- package/postprocessing/SavePass.js +25 -20
- package/postprocessing/ShaderPass.cjs.js +1 -0
- package/postprocessing/ShaderPass.js +30 -14
- package/postprocessing/TAARenderPass.cjs.js +1 -0
- package/postprocessing/TAARenderPass.js +61 -42
- package/postprocessing/TexturePass.cjs.js +1 -0
- package/postprocessing/TexturePass.js +22 -21
- package/postprocessing/UnrealBloomPass.cjs.js +1 -0
- package/postprocessing/UnrealBloomPass.js +213 -105
- package/renderers/CSS2DRenderer.cjs.js +1 -0
- package/renderers/CSS2DRenderer.js +56 -44
- package/renderers/CSS3DRenderer.cjs.js +1 -0
- package/renderers/CSS3DRenderer.js +86 -53
- package/renderers/Projector.cjs.js +1 -0
- package/renderers/Projector.js +274 -107
- package/renderers/SVGRenderer.cjs.js +1 -0
- package/renderers/SVGRenderer.js +182 -72
- package/renderers/nodes/accessors/CameraNode.cjs.js +1 -0
- package/renderers/nodes/accessors/CameraNode.js +40 -29
- package/renderers/nodes/accessors/ModelNode.cjs.js +1 -0
- package/renderers/nodes/accessors/ModelNode.js +37 -28
- package/renderers/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
- package/renderers/nodes/accessors/ModelViewProjectionNode.js +23 -10
- package/renderers/nodes/accessors/NormalNode.cjs.js +1 -0
- package/renderers/nodes/accessors/NormalNode.js +45 -35
- package/renderers/nodes/accessors/PositionNode.cjs.js +1 -0
- package/renderers/nodes/accessors/PositionNode.js +19 -18
- package/renderers/nodes/accessors/UVNode.cjs.js +1 -0
- package/renderers/nodes/accessors/UVNode.js +10 -5
- package/renderers/nodes/core/AttributeNode.cjs.js +1 -0
- package/renderers/nodes/core/AttributeNode.js +14 -5
- package/renderers/nodes/core/InputNode.cjs.js +1 -0
- package/renderers/nodes/core/InputNode.js +14 -4
- package/renderers/nodes/core/Node.cjs.js +1 -0
- package/renderers/nodes/core/Node.js +17 -7
- package/renderers/nodes/core/NodeAttribute.cjs.js +1 -0
- package/renderers/nodes/core/NodeAttribute.js +6 -3
- package/renderers/nodes/core/NodeBuilder.cjs.js +1 -0
- package/renderers/nodes/core/NodeBuilder.js +154 -87
- package/renderers/nodes/core/NodeFrame.cjs.js +1 -0
- package/renderers/nodes/core/NodeFrame.js +12 -9
- package/renderers/nodes/core/NodeSlot.cjs.js +1 -0
- package/renderers/nodes/core/NodeSlot.js +3 -2
- package/renderers/nodes/core/NodeUniform.cjs.js +1 -0
- package/renderers/nodes/core/NodeUniform.js +9 -4
- package/renderers/nodes/core/NodeVary.cjs.js +1 -0
- package/renderers/nodes/core/NodeVary.js +7 -4
- package/renderers/nodes/core/VaryNode.cjs.js +1 -0
- package/renderers/nodes/core/VaryNode.js +12 -6
- package/renderers/nodes/core/constants.cjs.js +1 -0
- package/renderers/nodes/core/constants.js +13 -16
- package/renderers/nodes/inputs/ColorNode.cjs.js +1 -0
- package/renderers/nodes/inputs/ColorNode.js +11 -5
- package/renderers/nodes/inputs/FloatNode.cjs.js +1 -0
- package/renderers/nodes/inputs/FloatNode.js +11 -5
- package/renderers/nodes/inputs/Matrix3Node.cjs.js +1 -0
- package/renderers/nodes/inputs/Matrix3Node.js +13 -7
- package/renderers/nodes/inputs/Matrix4Node.cjs.js +1 -0
- package/renderers/nodes/inputs/Matrix4Node.js +13 -7
- package/renderers/nodes/inputs/TextureNode.cjs.js +1 -0
- package/renderers/nodes/inputs/TextureNode.js +15 -7
- package/renderers/nodes/inputs/Vector2Node.cjs.js +1 -0
- package/renderers/nodes/inputs/Vector2Node.js +11 -5
- package/renderers/nodes/inputs/Vector3Node.cjs.js +1 -0
- package/renderers/nodes/inputs/Vector3Node.js +13 -7
- package/renderers/nodes/inputs/Vector4Node.cjs.js +1 -0
- package/renderers/nodes/inputs/Vector4Node.js +13 -7
- package/renderers/nodes/math/MathNode.cjs.js +1 -0
- package/renderers/nodes/math/MathNode.js +30 -20
- package/renderers/nodes/math/OperatorNode.cjs.js +1 -0
- package/renderers/nodes/math/OperatorNode.js +20 -4
- package/renderers/nodes/utils/SwitchNode.cjs.js +1 -0
- package/renderers/nodes/utils/SwitchNode.js +9 -4
- package/renderers/nodes/utils/TimerNode.cjs.js +1 -0
- package/renderers/nodes/utils/TimerNode.js +10 -5
- package/renderers/webgpu/WebGPU.cjs.js +1 -0
- package/renderers/webgpu/WebGPU.js +16 -14
- package/renderers/webgpu/WebGPUAttributes.cjs.js +1 -0
- package/renderers/webgpu/WebGPUAttributes.js +23 -16
- package/renderers/webgpu/WebGPUBackground.cjs.js +1 -0
- package/renderers/webgpu/WebGPUBackground.js +30 -13
- package/renderers/webgpu/WebGPUBinding.cjs.js +1 -0
- package/renderers/webgpu/WebGPUBinding.js +7 -4
- package/renderers/webgpu/WebGPUBindings.cjs.js +1 -0
- package/renderers/webgpu/WebGPUBindings.js +57 -21
- package/renderers/webgpu/WebGPUComputePipelines.cjs.js +1 -0
- package/renderers/webgpu/WebGPUComputePipelines.js +25 -14
- package/renderers/webgpu/WebGPUGeometries.cjs.js +1 -0
- package/renderers/webgpu/WebGPUGeometries.js +15 -5
- package/renderers/webgpu/WebGPUInfo.cjs.js +1 -0
- package/renderers/webgpu/WebGPUInfo.js +8 -3
- package/renderers/webgpu/WebGPUObjects.cjs.js +1 -0
- package/renderers/webgpu/WebGPUObjects.js +10 -5
- package/renderers/webgpu/WebGPUProperties.cjs.js +1 -0
- package/renderers/webgpu/WebGPUProperties.js +11 -5
- package/renderers/webgpu/WebGPURenderLists.cjs.js +1 -0
- package/renderers/webgpu/WebGPURenderLists.js +36 -20
- package/renderers/webgpu/WebGPURenderPipelines.cjs.js +1 -0
- package/renderers/webgpu/WebGPURenderPipelines.js +387 -260
- package/renderers/webgpu/WebGPURenderer.cjs.js +1 -0
- package/renderers/webgpu/WebGPURenderer.js +262 -124
- package/renderers/webgpu/WebGPUSampledTexture.cjs.js +1 -0
- package/renderers/webgpu/WebGPUSampledTexture.js +31 -18
- package/renderers/webgpu/WebGPUSampler.cjs.js +1 -0
- package/renderers/webgpu/WebGPUSampler.js +12 -7
- package/renderers/webgpu/WebGPUStorageBuffer.cjs.js +1 -0
- package/renderers/webgpu/WebGPUStorageBuffer.js +12 -7
- package/renderers/webgpu/WebGPUTextureRenderer.cjs.js +1 -0
- package/renderers/webgpu/WebGPUTextureRenderer.js +11 -5
- package/renderers/webgpu/WebGPUTextureUtils.cjs.js +1 -0
- package/renderers/webgpu/WebGPUTextureUtils.js +40 -29
- package/renderers/webgpu/WebGPUTextures.cjs.js +1 -0
- package/renderers/webgpu/WebGPUTextures.js +333 -186
- package/renderers/webgpu/WebGPUUniform.cjs.js +1 -0
- package/renderers/webgpu/WebGPUUniform.js +51 -25
- package/renderers/webgpu/WebGPUUniformsGroup.cjs.js +1 -0
- package/renderers/webgpu/WebGPUUniformsGroup.js +72 -32
- package/renderers/webgpu/constants.cjs.js +1 -0
- package/renderers/webgpu/constants.js +181 -190
- package/renderers/webgpu/nodes/ShaderLib.cjs.js +1 -0
- package/renderers/webgpu/nodes/ShaderLib.js +2 -2
- package/renderers/webgpu/nodes/WebGPUNodeBuilder.cjs.js +1 -0
- package/renderers/webgpu/nodes/WebGPUNodeBuilder.js +124 -53
- package/renderers/webgpu/nodes/WebGPUNodeUniform.cjs.js +1 -0
- package/renderers/webgpu/nodes/WebGPUNodeUniform.js +31 -17
- package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.cjs.js +1 -0
- package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.js +9 -8
- package/renderers/webgpu/nodes/WebGPUNodes.cjs.js +1 -0
- package/renderers/webgpu/nodes/WebGPUNodes.js +45 -7
- package/shaders/ACESFilmicToneMappingShader.cjs.js +1 -0
- package/shaders/ACESFilmicToneMappingShader.js +24 -44
- package/shaders/AfterimageShader.cjs.js +1 -0
- package/shaders/AfterimageShader.js +18 -28
- package/shaders/BasicShader.cjs.js +1 -0
- package/shaders/BasicShader.js +7 -9
- package/shaders/BleachBypassShader.cjs.js +1 -0
- package/shaders/BleachBypassShader.js +15 -31
- package/shaders/BlendShader.cjs.js +1 -0
- package/shaders/BlendShader.js +19 -26
- package/shaders/BokehShader.cjs.js +1 -0
- package/shaders/BokehShader.js +36 -98
- package/shaders/BokehShader2.cjs.js +1 -0
- package/shaders/BokehShader2.js +90 -261
- package/shaders/BrightnessContrastShader.cjs.js +1 -0
- package/shaders/BrightnessContrastShader.js +19 -28
- package/shaders/ColorCorrectionShader.cjs.js +1 -0
- package/shaders/ColorCorrectionShader.js +22 -26
- package/shaders/ColorifyShader.cjs.js +1 -0
- package/shaders/ColorifyShader.js +16 -24
- package/shaders/ConvolutionShader.cjs.js +1 -0
- package/shaders/ConvolutionShader.js +36 -40
- package/shaders/CopyShader.cjs.js +1 -0
- package/shaders/CopyShader.js +13 -21
- package/shaders/DOFMipMapShader.cjs.js +1 -0
- package/shaders/DOFMipMapShader.js +21 -28
- package/shaders/DepthLimitedBlurShader.cjs.js +1 -0
- package/shaders/DepthLimitedBlurShader.js +40 -85
- package/shaders/DigitalGlitch.cjs.js +1 -0
- package/shaders/DigitalGlitch.js +46 -74
- package/shaders/DotScreenShader.cjs.js +1 -0
- package/shaders/DotScreenShader.js +27 -35
- package/shaders/FXAAShader.cjs.js +1 -0
- package/shaders/FXAAShader.js +19 -1094
- package/shaders/FilmShader.cjs.js +1 -0
- package/shaders/FilmShader.js +52 -38
- package/shaders/FocusShader.cjs.js +1 -0
- package/shaders/FocusShader.js +24 -51
- package/shaders/FreiChenShader.cjs.js +1 -0
- package/shaders/FreiChenShader.js +24 -57
- package/shaders/FresnelShader.cjs.js +1 -0
- package/shaders/FresnelShader.js +22 -43
- package/shaders/GammaCorrectionShader.cjs.js +1 -0
- package/shaders/GammaCorrectionShader.js +11 -19
- package/shaders/GodRaysShader.cjs.js +1 -0
- package/shaders/GodRaysShader.js +94 -103
- package/shaders/HalftoneShader.cjs.js +1 -0
- package/shaders/HalftoneShader.js +65 -208
- package/shaders/HorizontalBlurShader.cjs.js +1 -0
- package/shaders/HorizontalBlurShader.js +23 -7
- package/shaders/HorizontalTiltShiftShader.cjs.js +1 -0
- package/shaders/HorizontalTiltShiftShader.js +21 -33
- package/shaders/HueSaturationShader.cjs.js +1 -0
- package/shaders/HueSaturationShader.js +21 -37
- package/shaders/KaleidoShader.cjs.js +1 -0
- package/shaders/KaleidoShader.js +22 -30
- package/shaders/LuminosityHighPassShader.cjs.js +1 -0
- package/shaders/LuminosityHighPassShader.js +27 -33
- package/shaders/LuminosityShader.cjs.js +1 -0
- package/shaders/LuminosityShader.js +11 -21
- package/shaders/MirrorShader.cjs.js +1 -0
- package/shaders/MirrorShader.js +16 -31
- package/shaders/NormalMapShader.cjs.js +1 -0
- package/shaders/NormalMapShader.js +23 -27
- package/shaders/ParallaxShader.cjs.js +1 -0
- package/shaders/ParallaxShader.js +48 -107
- package/shaders/PixelShader.cjs.js +1 -0
- package/shaders/PixelShader.js +16 -24
- package/shaders/RGBShiftShader.cjs.js +1 -0
- package/shaders/RGBShiftShader.js +22 -26
- package/shaders/SAOShader.cjs.js +1 -0
- package/shaders/SAOShader.js +48 -132
- package/shaders/SMAAShader.cjs.js +1 -0
- package/shaders/SMAAShader.js +135 -256
- package/shaders/SSAOShader.cjs.js +1 -0
- package/shaders/SSAOShader.js +81 -153
- package/shaders/SSRShader.cjs.js +1 -0
- package/shaders/SSRShader.js +87 -32
- package/shaders/SepiaShader.cjs.js +1 -0
- package/shaders/SepiaShader.js +15 -25
- package/shaders/SobelOperatorShader.cjs.js +1 -0
- package/shaders/SobelOperatorShader.js +29 -40
- package/shaders/SubsurfaceScatteringShader.cjs.js +1 -0
- package/shaders/SubsurfaceScatteringShader.js +39 -53
- package/shaders/TechnicolorShader.cjs.js +1 -0
- package/shaders/TechnicolorShader.js +13 -20
- package/shaders/ToneMapShader.cjs.js +1 -0
- package/shaders/ToneMapShader.js +28 -44
- package/shaders/ToonShader.cjs.js +1 -0
- package/shaders/ToonShader.js +96 -172
- package/shaders/TriangleBlurShader.cjs.js +1 -0
- package/shaders/TriangleBlurShader.js +23 -32
- package/shaders/UnpackDepthRGBAShader.cjs.js +1 -0
- package/shaders/UnpackDepthRGBAShader.js +14 -22
- package/shaders/VerticalBlurShader.cjs.js +1 -0
- package/shaders/VerticalBlurShader.js +23 -7
- package/shaders/VerticalTiltShiftShader.cjs.js +1 -0
- package/shaders/VerticalTiltShiftShader.js +21 -33
- package/shaders/VignetteShader.cjs.js +1 -0
- package/shaders/VignetteShader.js +28 -24
- package/shaders/VolumeShader.cjs.js +1 -0
- package/shaders/VolumeShader.js +77 -174
- package/shaders/WaterRefractionShader.cjs.js +1 -0
- package/shaders/WaterRefractionShader.js +6 -38
- package/shaders/types.cjs.js +1 -0
- package/shaders/types.js +1 -1
- package/textures/FlakesTexture.cjs.js +1 -0
- package/textures/FlakesTexture.js +10 -8
- package/types/helpers.cjs.js +1 -0
- package/types/helpers.js +2 -3
- package/types/shared.cjs.js +1 -0
- package/types/shared.js +1 -0
- package/types/utils.cjs.js +1 -0
- package/types/utils.js +1 -0
- package/utils/BufferGeometryUtils.cjs.js +1 -0
- package/utils/BufferGeometryUtils.js +325 -251
- package/utils/GeometryCompressionUtils.cjs.js +1 -0
- package/utils/GeometryCompressionUtils.js +239 -241
- package/utils/GeometryUtils.cjs.js +1 -0
- package/utils/GeometryUtils.js +94 -41
- package/utils/LDrawUtils.cjs.js +1 -0
- package/utils/LDrawUtils.d.ts +5 -0
- package/utils/LDrawUtils.js +144 -0
- package/utils/RoughnessMipmapper.cjs.js +1 -0
- package/utils/RoughnessMipmapper.js +82 -38
- package/utils/SceneUtils.cjs.js +1 -0
- package/utils/SceneUtils.js +20 -15
- package/utils/ShadowMapViewer.cjs.js +1 -0
- package/utils/ShadowMapViewer.js +95 -49
- package/utils/SkeletonUtils.cjs.js +1 -0
- package/utils/SkeletonUtils.js +165 -74
- package/utils/UVsDebug.cjs.js +1 -0
- package/utils/UVsDebug.js +62 -32
- package/utils/WorkerPool.cjs.js +1 -0
- package/utils/WorkerPool.js +33 -13
- package/webxr/ARButton.cjs.js +1 -0
- package/webxr/ARButton.js +98 -72
- package/webxr/OculusHandModel.cjs.js +1 -0
- package/webxr/OculusHandModel.js +37 -18
- package/webxr/OculusHandPointerModel.cjs.js +1 -0
- package/webxr/OculusHandPointerModel.js +80 -58
- package/webxr/Text2D.cjs.js +1 -0
- package/webxr/Text2D.js +19 -37
- package/webxr/VRButton.cjs.js +1 -0
- package/webxr/VRButton.js +90 -59
- package/webxr/XRControllerModelFactory.cjs.js +1 -0
- package/webxr/XRControllerModelFactory.js +116 -58
- package/webxr/XREstimatedLight.cjs.js +1 -0
- package/webxr/XREstimatedLight.js +66 -39
- package/webxr/XRHandMeshModel.cjs.js +1 -0
- package/webxr/XRHandMeshModel.js +29 -40
- package/webxr/XRHandModelFactory.cjs.js +1 -0
- package/webxr/XRHandModelFactory.js +31 -28
- package/webxr/XRHandPrimitiveModel.cjs.js +1 -0
- package/webxr/XRHandPrimitiveModel.js +27 -41
- package/animation/AnimationClipCreator.mjs +0 -57
- package/animation/CCDIKSolver.mjs +0 -223
- package/animation/MMDAnimationHelper.mjs +0 -514
- package/animation/MMDPhysics.mjs +0 -769
- package/cameras/CinematicCamera.mjs +0 -129
- package/controls/ArcballControls.mjs +0 -1737
- package/controls/DeviceOrientationControls.mjs +0 -74
- package/controls/DragControls.mjs +0 -172
- package/controls/FirstPersonControls.mjs +0 -220
- package/controls/FlyControls.mjs +0 -239
- package/controls/OrbitControls.mjs +0 -731
- package/controls/PointerLockControls.mjs +0 -88
- package/controls/TrackballControls.mjs +0 -481
- package/controls/TransformControls.mjs +0 -1068
- package/controls/experimental/CameraControls.mjs +0 -673
- package/csm/CSM.mjs +0 -244
- package/csm/CSMFrustum.mjs +0 -75
- package/csm/CSMHelper.mjs +0 -114
- package/csm/CSMShader.mjs +0 -251
- package/curves/CurveExtras.mjs +0 -224
- package/curves/NURBSCurve.mjs +0 -35
- package/curves/NURBSSurface.mjs +0 -28
- package/curves/NURBSUtils.mjs +0 -226
- package/deprecated/Geometry.mjs +0 -966
- package/effects/AnaglyphEffect.mjs +0 -120
- package/effects/AsciiEffect.mjs +0 -173
- package/effects/OutlineEffect.mjs +0 -295
- package/effects/ParallaxBarrierEffect.mjs +0 -64
- package/effects/PeppersGhostEffect.mjs +0 -85
- package/effects/StereoEffect.mjs +0 -32
- package/environments/RoomEnvironment.mjs +0 -78
- package/exporters/ColladaExporter.mjs +0 -299
- package/exporters/DRACOExporter.mjs +0 -132
- package/exporters/GLTFExporter.mjs +0 -1381
- package/exporters/MMDExporter.mjs +0 -102
- package/exporters/OBJExporter.mjs +0 -166
- package/exporters/PLYExporter.mjs +0 -278
- package/exporters/STLExporter.mjs +0 -129
- package/exporters/USDZExporter.mjs +0 -328
- package/geometries/BoxLineGeometry.mjs +0 -45
- package/geometries/ConvexGeometry.mjs +0 -29
- package/geometries/DecalGeometry.mjs +0 -184
- package/geometries/LightningStrike.mjs +0 -547
- package/geometries/ParametricGeometries.mjs +0 -129
- package/geometries/ParametricGeometry.mjs +0 -63
- package/geometries/RoundedBoxGeometry.mjs +0 -91
- package/geometries/TeapotGeometry.mjs +0 -1557
- package/geometries/TextGeometry.mjs +0 -23
- package/helpers/LightProbeHelper.mjs +0 -72
- package/helpers/PositionalAudioHelper.mjs +0 -68
- package/helpers/RectAreaLightHelper.mjs +0 -44
- package/helpers/VertexNormalsHelper.mjs +0 -54
- package/helpers/VertexTangentsHelper.mjs +0 -45
- package/index.mjs +0 -969
- package/interactive/SelectionBox.mjs +0 -137
- package/interactive/SelectionHelper.mjs +0 -54
- package/libs/MeshoptDecoder.mjs +0 -210
- package/libs/MotionControllers.mjs +0 -261
- package/lights/LightProbeGenerator.mjs +0 -145
- package/lights/RectAreaLightUniformsLib.mjs +0 -32842
- package/lines/Line2.mjs +0 -13
- package/lines/LineGeometry.mjs +0 -44
- package/lines/LineMaterial.mjs +0 -539
- package/lines/LineSegments2.mjs +0 -202
- package/lines/LineSegmentsGeometry.mjs +0 -124
- package/lines/Wireframe.mjs +0 -31
- package/lines/WireframeGeometry2.mjs +0 -13
- package/loaders/3DMLoader.mjs +0 -802
- package/loaders/3MFLoader.mjs +0 -837
- package/loaders/AMFLoader.mjs +0 -284
- package/loaders/AssimpLoader.mjs +0 -1396
- package/loaders/BVHLoader.mjs +0 -207
- package/loaders/BasisTextureLoader.mjs +0 -474
- package/loaders/ColladaLoader.mjs +0 -2403
- package/loaders/DDSLoader.mjs +0 -148
- package/loaders/DRACOLoader.mjs +0 -340
- package/loaders/EXRLoader.mjs +0 -1351
- package/loaders/FBXLoader.mjs +0 -2362
- package/loaders/FontLoader.mjs +0 -111
- package/loaders/GCodeLoader.mjs +0 -141
- package/loaders/GLTFLoader.mjs +0 -2316
- package/loaders/HDRCubeTextureLoader.mjs +0 -77
- package/loaders/KMZLoader.mjs +0 -75
- package/loaders/KTX2Loader.mjs +0 -427
- package/loaders/KTXLoader.mjs +0 -87
- package/loaders/LDrawLoader.mjs +0 -1409
- package/loaders/LUT3dlLoader.mjs +0 -100
- package/loaders/LUTCubeLoader.mjs +0 -104
- package/loaders/LWOLoader.mjs +0 -625
- package/loaders/LottieLoader.mjs +0 -47
- package/loaders/MD2Loader.mjs +0 -359
- package/loaders/MDDLoader.mjs +0 -58
- package/loaders/MMDLoader.mjs +0 -998
- package/loaders/MTLLoader.mjs +0 -280
- package/loaders/NRRDLoader.mjs +0 -401
- package/loaders/NodeMaterialLoader.mjs +0 -146
- package/loaders/OBJLoader.mjs +0 -487
- package/loaders/PCDLoader.mjs +0 -248
- package/loaders/PDBLoader.mjs +0 -246
- package/loaders/PLYLoader.mjs +0 -317
- package/loaders/PRWMLoader.mjs +0 -160
- package/loaders/PVRLoader.mjs +0 -131
- package/loaders/RGBELoader.mjs +0 -244
- package/loaders/RGBMLoader.mjs +0 -998
- package/loaders/STLLoader.mjs +0 -190
- package/loaders/SVGLoader.mjs +0 -1709
- package/loaders/TDSLoader.mjs +0 -480
- package/loaders/TGALoader.mjs +0 -285
- package/loaders/TTFLoader.mjs +0 -131
- package/loaders/TiltLoader.mjs +0 -373
- package/loaders/VOXLoader.mjs +0 -431
- package/loaders/VRMLLoader.mjs +0 -2093
- package/loaders/VRMLoader.mjs +0 -38
- package/loaders/VTKLoader.mjs +0 -646
- package/loaders/XLoader.mjs +0 -1258
- package/loaders/XYZLoader.mjs +0 -60
- package/loaders/lwo/IFFParser.mjs +0 -697
- package/loaders/lwo/LWO2Parser.mjs +0 -327
- package/loaders/lwo/LWO3Parser.mjs +0 -298
- package/math/Capsule.mjs +0 -100
- package/math/ColorConverter.mjs +0 -51
- package/math/ConvexHull.mjs +0 -574
- package/math/ImprovedNoise.mjs +0 -302
- package/math/Lut.mjs +0 -135
- package/math/MeshSurfaceSampler.mjs +0 -107
- package/math/OBB.mjs +0 -235
- package/math/Octree.mjs +0 -278
- package/math/SimplexNoise.mjs +0 -425
- package/misc/ConvexObjectBreaker.mjs +0 -292
- package/misc/GPUComputationRenderer.mjs +0 -171
- package/misc/Gyroscope.mjs +0 -35
- package/misc/MD2Character.mjs +0 -162
- package/misc/MD2CharacterComplex.mjs +0 -328
- package/misc/MorphAnimMesh.mjs +0 -40
- package/misc/MorphBlendMesh.mjs +0 -179
- package/misc/ProgressiveLightmap.mjs +0 -166
- package/misc/RollerCoaster.mjs +0 -346
- package/misc/TubePainter.mjs +0 -123
- package/misc/Volume.mjs +0 -244
- package/misc/VolumeSlice.mjs +0 -106
- package/misc/WebGL.mjs +0 -74
- package/modifiers/CurveModifier.mjs +0 -182
- package/modifiers/EdgeSplitModifier.mjs +0 -162
- package/modifiers/SimplifyModifier.mjs +0 -282
- package/modifiers/TessellateModifier.mjs +0 -206
- package/nodes/Nodes.mjs +0 -400
- package/nodes/ShaderNode.mjs +0 -408
- package/nodes/accessors/BufferNode.mjs +0 -15
- package/nodes/accessors/CameraNode.mjs +0 -44
- package/nodes/accessors/CubeTextureNode.mjs +0 -42
- package/nodes/accessors/MaterialNode.mjs +0 -71
- package/nodes/accessors/MaterialReferenceNode.mjs +0 -14
- package/nodes/accessors/ModelNode.mjs +0 -9
- package/nodes/accessors/ModelViewProjectionNode.mjs +0 -24
- package/nodes/accessors/NormalNode.mjs +0 -62
- package/nodes/accessors/Object3DNode.mjs +0 -76
- package/nodes/accessors/PointUVNode.mjs +0 -13
- package/nodes/accessors/PositionNode.mjs +0 -65
- package/nodes/accessors/ReferenceNode.mjs +0 -37
- package/nodes/accessors/ReflectNode.mjs +0 -43
- package/nodes/accessors/SkinningNode.mjs +0 -58
- package/nodes/accessors/TextureNode.mjs +0 -54
- package/nodes/accessors/UVNode.mjs +0 -23
- package/nodes/core/ArrayUniformNode.mjs +0 -14
- package/nodes/core/AttributeNode.mjs +0 -30
- package/nodes/core/BypassNode.mjs +0 -22
- package/nodes/core/CodeNode.mjs +0 -28
- package/nodes/core/ConstNode.mjs +0 -14
- package/nodes/core/ContextNode.mjs +0 -22
- package/nodes/core/ExpressionNode.mjs +0 -19
- package/nodes/core/FunctionCallNode.mjs +0 -37
- package/nodes/core/FunctionNode.mjs +0 -56
- package/nodes/core/InputNode.mjs +0 -38
- package/nodes/core/Node.mjs +0 -139
- package/nodes/core/NodeAttribute.mjs +0 -10
- package/nodes/core/NodeBuilder.mjs +0 -395
- package/nodes/core/NodeCode.mjs +0 -11
- package/nodes/core/NodeFrame.mjs +0 -35
- package/nodes/core/NodeFunctionInput.mjs +0 -13
- package/nodes/core/NodeKeywords.mjs +0 -44
- package/nodes/core/NodeUniform.mjs +0 -18
- package/nodes/core/NodeUtils.mjs +0 -57
- package/nodes/core/NodeVar.mjs +0 -10
- package/nodes/core/NodeVary.mjs +0 -10
- package/nodes/core/PropertyNode.mjs +0 -21
- package/nodes/core/TempNode.mjs +0 -25
- package/nodes/core/UniformNode.mjs +0 -23
- package/nodes/core/VarNode.mjs +0 -31
- package/nodes/core/VaryNode.mjs +0 -30
- package/nodes/core/constants.mjs +0 -24
- package/nodes/display/ColorSpaceNode.mjs +0 -63
- package/nodes/display/NormalMapNode.mjs +0 -54
- package/nodes/fog/FogNode.mjs +0 -15
- package/nodes/fog/FogRangeNode.mjs +0 -17
- package/nodes/functions/BSDFs.mjs +0 -64
- package/nodes/lights/LightContextNode.mjs +0 -35
- package/nodes/lights/LightNode.mjs +0 -58
- package/nodes/lights/LightsNode.mjs +0 -59
- package/nodes/loaders/NodeLoader.mjs +0 -66
- package/nodes/loaders/NodeMaterialLoader.mjs +0 -24
- package/nodes/loaders/NodeObjectLoader.mjs +0 -40
- package/nodes/materials/LineBasicNodeMaterial.mjs +0 -27
- package/nodes/materials/Materials.mjs +0 -28
- package/nodes/materials/MeshBasicNodeMaterial.mjs +0 -28
- package/nodes/materials/MeshStandardNodeMaterial.mjs +0 -41
- package/nodes/materials/NodeMaterial.mjs +0 -64
- package/nodes/materials/PointsNodeMaterial.mjs +0 -30
- package/nodes/math/CondNode.mjs +0 -38
- package/nodes/math/MathNode.mjs +0 -163
- package/nodes/math/OperatorNode.mjs +0 -103
- package/nodes/procedural/CheckerNode.mjs +0 -21
- package/nodes/utils/ArrayElementNode.mjs +0 -19
- package/nodes/utils/ConvertNode.mjs +0 -25
- package/nodes/utils/JoinNode.mjs +0 -26
- package/nodes/utils/MatcapUVNode.mjs +0 -16
- package/nodes/utils/OscNode.mjs +0 -50
- package/nodes/utils/SplitNode.mjs +0 -45
- package/nodes/utils/SpriteSheetUVNode.mjs +0 -40
- package/nodes/utils/TimerNode.mjs +0 -44
- package/objects/GroundProjectedEnv.mjs +0 -130
- package/objects/Lensflare.mjs +0 -262
- package/objects/LightningStorm.mjs +0 -110
- package/objects/MarchingCubes.mjs +0 -457
- package/objects/Reflector.mjs +0 -166
- package/objects/ReflectorForSSRPass.mjs +0 -247
- package/objects/ReflectorRTT.mjs +0 -10
- package/objects/Refractor.mjs +0 -178
- package/objects/ShadowMesh.mjs +0 -41
- package/objects/Sky.mjs +0 -124
- package/objects/Water.mjs +0 -235
- package/objects/Water2.mjs +0 -252
- package/offscreen/jank.mjs +0 -27
- package/offscreen/offscreen.mjs +0 -5
- package/offscreen/scene.mjs +0 -52
- package/physics/AmmoPhysics.mjs +0 -165
- package/postprocessing/AdaptiveToneMappingPass.mjs +0 -221
- package/postprocessing/AfterimagePass.mjs +0 -55
- package/postprocessing/BloomPass.mjs +0 -90
- package/postprocessing/BokehPass.mjs +0 -76
- package/postprocessing/ClearPass.mjs +0 -27
- package/postprocessing/CubeTexturePass.mjs +0 -49
- package/postprocessing/DotScreenPass.mjs +0 -40
- package/postprocessing/EffectComposer.mjs +0 -139
- package/postprocessing/FilmPass.mjs +0 -42
- package/postprocessing/GlitchPass.mjs +0 -75
- package/postprocessing/HalftonePass.mjs +0 -44
- package/postprocessing/LUTPass.mjs +0 -136
- package/postprocessing/MaskPass.mjs +0 -60
- package/postprocessing/OutlinePass.mjs +0 -438
- package/postprocessing/Pass.mjs +0 -37
- package/postprocessing/RenderPass.mjs +0 -48
- package/postprocessing/RenderPixelatedPass.mjs +0 -199
- package/postprocessing/SAOPass.mjs +0 -282
- package/postprocessing/SMAAPass.mjs +0 -112
- package/postprocessing/SSAARenderPass.mjs +0 -170
- package/postprocessing/SSAOPass.mjs +0 -265
- package/postprocessing/SSRPass.mjs +0 -432
- package/postprocessing/SavePass.mjs +0 -37
- package/postprocessing/ShaderPass.mjs +0 -39
- package/postprocessing/TAARenderPass.mjs +0 -88
- package/postprocessing/TexturePass.mjs +0 -39
- package/postprocessing/UnrealBloomPass.mjs +0 -220
- package/renderers/CSS2DRenderer.mjs +0 -112
- package/renderers/CSS3DRenderer.mjs +0 -133
- package/renderers/Projector.mjs +0 -511
- package/renderers/SVGRenderer.mjs +0 -306
- package/renderers/nodes/accessors/CameraNode.mjs +0 -63
- package/renderers/nodes/accessors/ModelNode.mjs +0 -61
- package/renderers/nodes/accessors/ModelViewProjectionNode.mjs +0 -21
- package/renderers/nodes/accessors/NormalNode.mjs +0 -61
- package/renderers/nodes/accessors/PositionNode.mjs +0 -30
- package/renderers/nodes/accessors/UVNode.mjs +0 -13
- package/renderers/nodes/core/AttributeNode.mjs +0 -35
- package/renderers/nodes/core/InputNode.mjs +0 -31
- package/renderers/nodes/core/Node.mjs +0 -34
- package/renderers/nodes/core/NodeAttribute.mjs +0 -10
- package/renderers/nodes/core/NodeBuilder.mjs +0 -243
- package/renderers/nodes/core/NodeFrame.mjs +0 -35
- package/renderers/nodes/core/NodeSlot.mjs +0 -10
- package/renderers/nodes/core/NodeUniform.mjs +0 -18
- package/renderers/nodes/core/NodeVary.mjs +0 -11
- package/renderers/nodes/core/VaryNode.mjs +0 -22
- package/renderers/nodes/core/constants.mjs +0 -22
- package/renderers/nodes/inputs/ColorNode.mjs +0 -11
- package/renderers/nodes/inputs/FloatNode.mjs +0 -11
- package/renderers/nodes/inputs/Matrix3Node.mjs +0 -12
- package/renderers/nodes/inputs/Matrix4Node.mjs +0 -12
- package/renderers/nodes/inputs/TextureNode.mjs +0 -20
- package/renderers/nodes/inputs/Vector2Node.mjs +0 -11
- package/renderers/nodes/inputs/Vector3Node.mjs +0 -12
- package/renderers/nodes/inputs/Vector4Node.mjs +0 -12
- package/renderers/nodes/math/MathNode.mjs +0 -55
- package/renderers/nodes/math/OperatorNode.mjs +0 -42
- package/renderers/nodes/utils/SwitchNode.mjs +0 -20
- package/renderers/nodes/utils/TimerNode.mjs +0 -14
- package/renderers/webgpu/WebGPU.mjs +0 -24
- package/renderers/webgpu/WebGPUAttributes.mjs +0 -69
- package/renderers/webgpu/WebGPUBackground.mjs +0 -61
- package/renderers/webgpu/WebGPUBinding.mjs +0 -14
- package/renderers/webgpu/WebGPUBindings.mjs +0 -155
- package/renderers/webgpu/WebGPUComputePipelines.mjs +0 -44
- package/renderers/webgpu/WebGPUGeometries.mjs +0 -41
- package/renderers/webgpu/WebGPUInfo.mjs +0 -46
- package/renderers/webgpu/WebGPUObjects.mjs +0 -25
- package/renderers/webgpu/WebGPUProperties.mjs +0 -22
- package/renderers/webgpu/WebGPURenderLists.mjs +0 -119
- package/renderers/webgpu/WebGPURenderPipelines.mjs +0 -545
- package/renderers/webgpu/WebGPURenderer.mjs +0 -574
- package/renderers/webgpu/WebGPUSampledTexture.mjs +0 -40
- package/renderers/webgpu/WebGPUSampler.mjs +0 -15
- package/renderers/webgpu/WebGPUStorageBuffer.mjs +0 -15
- package/renderers/webgpu/WebGPUTextureRenderer.mjs +0 -23
- package/renderers/webgpu/WebGPUTextureUtils.mjs +0 -98
- package/renderers/webgpu/WebGPUTextures.mjs +0 -484
- package/renderers/webgpu/WebGPUUniform.mjs +0 -81
- package/renderers/webgpu/WebGPUUniformsGroup.mjs +0 -176
- package/renderers/webgpu/constants.mjs +0 -230
- package/renderers/webgpu/nodes/ShaderLib.mjs +0 -42
- package/renderers/webgpu/nodes/WebGPUNodeBuilder.mjs +0 -165
- package/renderers/webgpu/nodes/WebGPUNodeUniform.mjs +0 -73
- package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.mjs +0 -15
- package/renderers/webgpu/nodes/WebGPUNodes.mjs +0 -40
- package/shaders/ACESFilmicToneMappingShader.mjs +0 -48
- package/shaders/AfterimageShader.mjs +0 -32
- package/shaders/BasicShader.mjs +0 -12
- package/shaders/BleachBypassShader.mjs +0 -35
- package/shaders/BlendShader.mjs +0 -30
- package/shaders/BokehShader.mjs +0 -106
- package/shaders/BokehShader2.mjs +0 -269
- package/shaders/BrightnessContrastShader.mjs +0 -32
- package/shaders/ColorCorrectionShader.mjs +0 -30
- package/shaders/ColorifyShader.mjs +0 -28
- package/shaders/ConvolutionShader.mjs +0 -55
- package/shaders/CopyShader.mjs +0 -25
- package/shaders/DOFMipMapShader.mjs +0 -32
- package/shaders/DepthLimitedBlurShader.mjs +0 -114
- package/shaders/DigitalGlitch.mjs +0 -78
- package/shaders/DotScreenShader.mjs +0 -39
- package/shaders/FXAAShader.mjs +0 -1098
- package/shaders/FilmShader.mjs +0 -42
- package/shaders/FocusShader.mjs +0 -55
- package/shaders/FreiChenShader.mjs +0 -61
- package/shaders/FresnelShader.mjs +0 -47
- package/shaders/GammaCorrectionShader.mjs +0 -23
- package/shaders/GodRaysShader.mjs +0 -146
- package/shaders/HalftoneShader.mjs +0 -212
- package/shaders/HorizontalBlurShader.mjs +0 -43
- package/shaders/HorizontalTiltShiftShader.mjs +0 -37
- package/shaders/HueSaturationShader.mjs +0 -41
- package/shaders/KaleidoShader.mjs +0 -34
- package/shaders/LuminosityHighPassShader.mjs +0 -37
- package/shaders/LuminosityShader.mjs +0 -25
- package/shaders/MirrorShader.mjs +0 -35
- package/shaders/NormalMapShader.mjs +0 -31
- package/shaders/ParallaxShader.mjs +0 -113
- package/shaders/PixelShader.mjs +0 -28
- package/shaders/RGBShiftShader.mjs +0 -30
- package/shaders/SAOShader.mjs +0 -144
- package/shaders/SMAAShader.mjs +0 -272
- package/shaders/SSAOShader.mjs +0 -172
- package/shaders/SSRShader.mjs +0 -324
- package/shaders/SepiaShader.mjs +0 -29
- package/shaders/SobelOperatorShader.mjs +0 -44
- package/shaders/SubsurfaceScatteringShader.mjs +0 -59
- package/shaders/TechnicolorShader.mjs +0 -24
- package/shaders/ToneMapShader.mjs +0 -48
- package/shaders/ToonShader.mjs +0 -188
- package/shaders/TriangleBlurShader.mjs +0 -36
- package/shaders/UnpackDepthRGBAShader.mjs +0 -26
- package/shaders/VerticalBlurShader.mjs +0 -44
- package/shaders/VerticalTiltShiftShader.mjs +0 -37
- package/shaders/VignetteShader.mjs +0 -28
- package/shaders/VolumeShader.mjs +0 -178
- package/shaders/WaterRefractionShader.mjs +0 -57
- package/textures/FlakesTexture.mjs +0 -30
- package/types/helpers.mjs +0 -4
- package/utils/BufferGeometryUtils.mjs +0 -570
- package/utils/GeometryCompressionUtils.mjs +0 -547
- package/utils/GeometryUtils.mjs +0 -108
- package/utils/RoughnessMipmapper.mjs +0 -213
- package/utils/SceneUtils.mjs +0 -36
- package/utils/ShadowMapViewer.mjs +0 -114
- package/utils/SkeletonUtils.mjs +0 -292
- package/utils/UVsDebug.mjs +0 -85
- package/utils/WorkerPool.mjs +0 -62
- package/webxr/ARButton.mjs +0 -119
- package/webxr/OculusHandModel.mjs +0 -71
- package/webxr/OculusHandPointerModel.mjs +0 -207
- package/webxr/Text2D.mjs +0 -31
- package/webxr/VRButton.mjs +0 -105
- package/webxr/XRControllerModelFactory.mjs +0 -146
- package/webxr/XREstimatedLight.mjs +0 -126
- package/webxr/XRHandMeshModel.mjs +0 -73
- package/webxr/XRHandModelFactory.mjs +0 -61
- package/webxr/XRHandPrimitiveModel.mjs +0 -68
package/loaders/SVGLoader.js
CHANGED
|
@@ -1,113 +1,134 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class SVGLoader extends THREE.Loader {
|
|
1
|
+
import { Loader, FileLoader, Matrix3, Vector2, Vector3, ShapeUtils, Box2, Shape, Path, BufferGeometry, Float32BufferAttribute, ShapePath } from 'three';
|
|
2
|
+
|
|
3
|
+
class SVGLoader extends Loader {
|
|
5
4
|
constructor(manager) {
|
|
6
|
-
super(manager);
|
|
7
|
-
|
|
8
|
-
this.
|
|
5
|
+
super(manager); // Default dots per inch
|
|
6
|
+
|
|
7
|
+
this.defaultDPI = 90; // Accepted units: 'mm', 'cm', 'in', 'pt', 'pc', 'px'
|
|
8
|
+
|
|
9
|
+
this.defaultUnit = 'px';
|
|
9
10
|
}
|
|
11
|
+
|
|
10
12
|
load(url, onLoad, onProgress, onError) {
|
|
11
13
|
const scope = this;
|
|
12
|
-
const loader = new
|
|
14
|
+
const loader = new FileLoader(scope.manager);
|
|
13
15
|
loader.setPath(scope.path);
|
|
14
16
|
loader.setRequestHeader(scope.requestHeader);
|
|
15
17
|
loader.setWithCredentials(scope.withCredentials);
|
|
16
|
-
loader.load(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
} else {
|
|
25
|
-
console.error(e);
|
|
26
|
-
}
|
|
27
|
-
scope.manager.itemError(url);
|
|
18
|
+
loader.load(url, function (text) {
|
|
19
|
+
try {
|
|
20
|
+
onLoad(scope.parse(text));
|
|
21
|
+
} catch (e) {
|
|
22
|
+
if (onError) {
|
|
23
|
+
onError(e);
|
|
24
|
+
} else {
|
|
25
|
+
console.error(e);
|
|
28
26
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
);
|
|
27
|
+
|
|
28
|
+
scope.manager.itemError(url);
|
|
29
|
+
}
|
|
30
|
+
}, onProgress, onError);
|
|
33
31
|
}
|
|
32
|
+
|
|
34
33
|
parse(text) {
|
|
35
34
|
const scope = this;
|
|
35
|
+
|
|
36
36
|
function parseNode(node, style) {
|
|
37
|
-
if (node.nodeType !== 1)
|
|
38
|
-
return;
|
|
37
|
+
if (node.nodeType !== 1) return;
|
|
39
38
|
const transform = getNodeTransform(node);
|
|
40
39
|
let traverseChildNodes = true;
|
|
41
40
|
let path = null;
|
|
41
|
+
|
|
42
42
|
switch (node.nodeName) {
|
|
43
|
-
case
|
|
43
|
+
case 'svg':
|
|
44
44
|
break;
|
|
45
|
-
|
|
45
|
+
|
|
46
|
+
case 'style':
|
|
46
47
|
parseCSSStylesheet(node);
|
|
47
48
|
break;
|
|
48
|
-
|
|
49
|
+
|
|
50
|
+
case 'g':
|
|
49
51
|
style = parseStyle(node, style);
|
|
50
52
|
break;
|
|
51
|
-
|
|
53
|
+
|
|
54
|
+
case 'path':
|
|
52
55
|
style = parseStyle(node, style);
|
|
53
|
-
if (node.hasAttribute(
|
|
54
|
-
path = parsePathNode(node);
|
|
56
|
+
if (node.hasAttribute('d')) path = parsePathNode(node);
|
|
55
57
|
break;
|
|
56
|
-
|
|
58
|
+
|
|
59
|
+
case 'rect':
|
|
57
60
|
style = parseStyle(node, style);
|
|
58
61
|
path = parseRectNode(node);
|
|
59
62
|
break;
|
|
60
|
-
|
|
63
|
+
|
|
64
|
+
case 'polygon':
|
|
61
65
|
style = parseStyle(node, style);
|
|
62
66
|
path = parsePolygonNode(node);
|
|
63
67
|
break;
|
|
64
|
-
|
|
68
|
+
|
|
69
|
+
case 'polyline':
|
|
65
70
|
style = parseStyle(node, style);
|
|
66
71
|
path = parsePolylineNode(node);
|
|
67
72
|
break;
|
|
68
|
-
|
|
73
|
+
|
|
74
|
+
case 'circle':
|
|
69
75
|
style = parseStyle(node, style);
|
|
70
76
|
path = parseCircleNode(node);
|
|
71
77
|
break;
|
|
72
|
-
|
|
78
|
+
|
|
79
|
+
case 'ellipse':
|
|
73
80
|
style = parseStyle(node, style);
|
|
74
81
|
path = parseEllipseNode(node);
|
|
75
82
|
break;
|
|
76
|
-
|
|
83
|
+
|
|
84
|
+
case 'line':
|
|
77
85
|
style = parseStyle(node, style);
|
|
78
86
|
path = parseLineNode(node);
|
|
79
87
|
break;
|
|
80
|
-
|
|
88
|
+
|
|
89
|
+
case 'defs':
|
|
81
90
|
traverseChildNodes = false;
|
|
82
91
|
break;
|
|
83
|
-
|
|
92
|
+
|
|
93
|
+
case 'use':
|
|
84
94
|
style = parseStyle(node, style);
|
|
85
95
|
const usedNodeId = node.href.baseVal.substring(1);
|
|
86
96
|
const usedNode = node.viewportElement.getElementById(usedNodeId);
|
|
97
|
+
|
|
87
98
|
if (usedNode) {
|
|
88
99
|
parseNode(usedNode, style);
|
|
89
100
|
} else {
|
|
90
101
|
console.warn("SVGLoader: 'use node' references non-existent node id: " + usedNodeId);
|
|
91
102
|
}
|
|
103
|
+
|
|
92
104
|
break;
|
|
93
|
-
|
|
105
|
+
|
|
94
106
|
}
|
|
107
|
+
|
|
95
108
|
if (path) {
|
|
96
|
-
if (style.fill !==
|
|
109
|
+
if (style.fill !== undefined && style.fill !== 'none') {
|
|
97
110
|
path.color.setStyle(style.fill);
|
|
98
111
|
}
|
|
112
|
+
|
|
99
113
|
transformPath(path, currentTransform);
|
|
100
114
|
paths.push(path);
|
|
101
|
-
path.userData = {
|
|
115
|
+
path.userData = {
|
|
116
|
+
node: node,
|
|
117
|
+
style: style
|
|
118
|
+
};
|
|
102
119
|
}
|
|
120
|
+
|
|
103
121
|
if (traverseChildNodes) {
|
|
104
122
|
const nodes = node.childNodes;
|
|
123
|
+
|
|
105
124
|
for (let i = 0; i < nodes.length; i++) {
|
|
106
125
|
parseNode(nodes[i], style);
|
|
107
126
|
}
|
|
108
127
|
}
|
|
128
|
+
|
|
109
129
|
if (transform) {
|
|
110
130
|
transformStack.pop();
|
|
131
|
+
|
|
111
132
|
if (transformStack.length > 0) {
|
|
112
133
|
currentTransform.copy(transformStack[transformStack.length - 1]);
|
|
113
134
|
} else {
|
|
@@ -115,127 +136,136 @@ class SVGLoader extends THREE.Loader {
|
|
|
115
136
|
}
|
|
116
137
|
}
|
|
117
138
|
}
|
|
139
|
+
|
|
118
140
|
function parsePathNode(node) {
|
|
119
|
-
const path = new
|
|
120
|
-
const point = new
|
|
121
|
-
const control = new
|
|
122
|
-
const firstPoint = new
|
|
141
|
+
const path = new ShapePath();
|
|
142
|
+
const point = new Vector2();
|
|
143
|
+
const control = new Vector2();
|
|
144
|
+
const firstPoint = new Vector2();
|
|
123
145
|
let isFirstPoint = true;
|
|
124
146
|
let doSetFirstPoint = false;
|
|
125
|
-
const d = node.getAttribute(
|
|
147
|
+
const d = node.getAttribute('d'); // console.log( d );
|
|
148
|
+
|
|
126
149
|
const commands = d.match(/[a-df-z][^a-df-z]*/gi);
|
|
150
|
+
|
|
127
151
|
for (let i = 0, l = commands.length; i < l; i++) {
|
|
128
152
|
const command = commands[i];
|
|
129
153
|
const type = command.charAt(0);
|
|
130
|
-
const
|
|
154
|
+
const data = command.substr(1).trim();
|
|
155
|
+
|
|
131
156
|
if (isFirstPoint === true) {
|
|
132
157
|
doSetFirstPoint = true;
|
|
133
158
|
isFirstPoint = false;
|
|
134
159
|
}
|
|
160
|
+
|
|
135
161
|
let numbers;
|
|
162
|
+
|
|
136
163
|
switch (type) {
|
|
137
|
-
case
|
|
138
|
-
numbers = parseFloats(
|
|
164
|
+
case 'M':
|
|
165
|
+
numbers = parseFloats(data);
|
|
166
|
+
|
|
139
167
|
for (let j = 0, jl = numbers.length; j < jl; j += 2) {
|
|
140
168
|
point.x = numbers[j + 0];
|
|
141
169
|
point.y = numbers[j + 1];
|
|
142
170
|
control.x = point.x;
|
|
143
171
|
control.y = point.y;
|
|
172
|
+
|
|
144
173
|
if (j === 0) {
|
|
145
174
|
path.moveTo(point.x, point.y);
|
|
146
175
|
} else {
|
|
147
176
|
path.lineTo(point.x, point.y);
|
|
148
177
|
}
|
|
149
|
-
|
|
150
|
-
|
|
178
|
+
|
|
179
|
+
if (j === 0) firstPoint.copy(point);
|
|
151
180
|
}
|
|
181
|
+
|
|
152
182
|
break;
|
|
153
|
-
|
|
154
|
-
|
|
183
|
+
|
|
184
|
+
case 'H':
|
|
185
|
+
numbers = parseFloats(data);
|
|
186
|
+
|
|
155
187
|
for (let j = 0, jl = numbers.length; j < jl; j++) {
|
|
156
188
|
point.x = numbers[j];
|
|
157
189
|
control.x = point.x;
|
|
158
190
|
control.y = point.y;
|
|
159
191
|
path.lineTo(point.x, point.y);
|
|
160
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
161
|
-
firstPoint.copy(point);
|
|
192
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
162
193
|
}
|
|
194
|
+
|
|
163
195
|
break;
|
|
164
|
-
|
|
165
|
-
|
|
196
|
+
|
|
197
|
+
case 'V':
|
|
198
|
+
numbers = parseFloats(data);
|
|
199
|
+
|
|
166
200
|
for (let j = 0, jl = numbers.length; j < jl; j++) {
|
|
167
201
|
point.y = numbers[j];
|
|
168
202
|
control.x = point.x;
|
|
169
203
|
control.y = point.y;
|
|
170
204
|
path.lineTo(point.x, point.y);
|
|
171
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
172
|
-
firstPoint.copy(point);
|
|
205
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
173
206
|
}
|
|
207
|
+
|
|
174
208
|
break;
|
|
175
|
-
|
|
176
|
-
|
|
209
|
+
|
|
210
|
+
case 'L':
|
|
211
|
+
numbers = parseFloats(data);
|
|
212
|
+
|
|
177
213
|
for (let j = 0, jl = numbers.length; j < jl; j += 2) {
|
|
178
214
|
point.x = numbers[j + 0];
|
|
179
215
|
point.y = numbers[j + 1];
|
|
180
216
|
control.x = point.x;
|
|
181
217
|
control.y = point.y;
|
|
182
218
|
path.lineTo(point.x, point.y);
|
|
183
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
184
|
-
firstPoint.copy(point);
|
|
219
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
185
220
|
}
|
|
221
|
+
|
|
186
222
|
break;
|
|
187
|
-
|
|
188
|
-
|
|
223
|
+
|
|
224
|
+
case 'C':
|
|
225
|
+
numbers = parseFloats(data);
|
|
226
|
+
|
|
189
227
|
for (let j = 0, jl = numbers.length; j < jl; j += 6) {
|
|
190
|
-
path.bezierCurveTo(
|
|
191
|
-
numbers[j + 0],
|
|
192
|
-
numbers[j + 1],
|
|
193
|
-
numbers[j + 2],
|
|
194
|
-
numbers[j + 3],
|
|
195
|
-
numbers[j + 4],
|
|
196
|
-
numbers[j + 5]
|
|
197
|
-
);
|
|
228
|
+
path.bezierCurveTo(numbers[j + 0], numbers[j + 1], numbers[j + 2], numbers[j + 3], numbers[j + 4], numbers[j + 5]);
|
|
198
229
|
control.x = numbers[j + 2];
|
|
199
230
|
control.y = numbers[j + 3];
|
|
200
231
|
point.x = numbers[j + 4];
|
|
201
232
|
point.y = numbers[j + 5];
|
|
202
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
203
|
-
firstPoint.copy(point);
|
|
233
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
204
234
|
}
|
|
235
|
+
|
|
205
236
|
break;
|
|
206
|
-
|
|
207
|
-
|
|
237
|
+
|
|
238
|
+
case 'S':
|
|
239
|
+
numbers = parseFloats(data);
|
|
240
|
+
|
|
208
241
|
for (let j = 0, jl = numbers.length; j < jl; j += 4) {
|
|
209
|
-
path.bezierCurveTo(
|
|
210
|
-
getReflection(point.x, control.x),
|
|
211
|
-
getReflection(point.y, control.y),
|
|
212
|
-
numbers[j + 0],
|
|
213
|
-
numbers[j + 1],
|
|
214
|
-
numbers[j + 2],
|
|
215
|
-
numbers[j + 3]
|
|
216
|
-
);
|
|
242
|
+
path.bezierCurveTo(getReflection(point.x, control.x), getReflection(point.y, control.y), numbers[j + 0], numbers[j + 1], numbers[j + 2], numbers[j + 3]);
|
|
217
243
|
control.x = numbers[j + 0];
|
|
218
244
|
control.y = numbers[j + 1];
|
|
219
245
|
point.x = numbers[j + 2];
|
|
220
246
|
point.y = numbers[j + 3];
|
|
221
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
222
|
-
firstPoint.copy(point);
|
|
247
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
223
248
|
}
|
|
249
|
+
|
|
224
250
|
break;
|
|
225
|
-
|
|
226
|
-
|
|
251
|
+
|
|
252
|
+
case 'Q':
|
|
253
|
+
numbers = parseFloats(data);
|
|
254
|
+
|
|
227
255
|
for (let j = 0, jl = numbers.length; j < jl; j += 4) {
|
|
228
256
|
path.quadraticCurveTo(numbers[j + 0], numbers[j + 1], numbers[j + 2], numbers[j + 3]);
|
|
229
257
|
control.x = numbers[j + 0];
|
|
230
258
|
control.y = numbers[j + 1];
|
|
231
259
|
point.x = numbers[j + 2];
|
|
232
260
|
point.y = numbers[j + 3];
|
|
233
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
234
|
-
firstPoint.copy(point);
|
|
261
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
235
262
|
}
|
|
263
|
+
|
|
236
264
|
break;
|
|
237
|
-
|
|
238
|
-
|
|
265
|
+
|
|
266
|
+
case 'T':
|
|
267
|
+
numbers = parseFloats(data);
|
|
268
|
+
|
|
239
269
|
for (let j = 0, jl = numbers.length; j < jl; j += 2) {
|
|
240
270
|
const rx = getReflection(point.x, control.x);
|
|
241
271
|
const ry = getReflection(point.y, control.y);
|
|
@@ -244,141 +274,133 @@ class SVGLoader extends THREE.Loader {
|
|
|
244
274
|
control.y = ry;
|
|
245
275
|
point.x = numbers[j + 0];
|
|
246
276
|
point.y = numbers[j + 1];
|
|
247
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
248
|
-
firstPoint.copy(point);
|
|
277
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
249
278
|
}
|
|
279
|
+
|
|
250
280
|
break;
|
|
251
|
-
|
|
252
|
-
|
|
281
|
+
|
|
282
|
+
case 'A':
|
|
283
|
+
numbers = parseFloats(data, [3, 4], 7);
|
|
284
|
+
|
|
253
285
|
for (let j = 0, jl = numbers.length; j < jl; j += 7) {
|
|
254
|
-
|
|
255
|
-
|
|
286
|
+
// skip command if start point == end point
|
|
287
|
+
if (numbers[j + 5] == point.x && numbers[j + 6] == point.y) continue;
|
|
256
288
|
const start = point.clone();
|
|
257
289
|
point.x = numbers[j + 5];
|
|
258
290
|
point.y = numbers[j + 6];
|
|
259
291
|
control.x = point.x;
|
|
260
292
|
control.y = point.y;
|
|
261
|
-
parseArcCommand(
|
|
262
|
-
|
|
263
|
-
numbers[j],
|
|
264
|
-
numbers[j + 1],
|
|
265
|
-
numbers[j + 2],
|
|
266
|
-
numbers[j + 3],
|
|
267
|
-
numbers[j + 4],
|
|
268
|
-
start,
|
|
269
|
-
point
|
|
270
|
-
);
|
|
271
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
272
|
-
firstPoint.copy(point);
|
|
293
|
+
parseArcCommand(path, numbers[j], numbers[j + 1], numbers[j + 2], numbers[j + 3], numbers[j + 4], start, point);
|
|
294
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
273
295
|
}
|
|
296
|
+
|
|
274
297
|
break;
|
|
275
|
-
|
|
276
|
-
|
|
298
|
+
|
|
299
|
+
case 'm':
|
|
300
|
+
numbers = parseFloats(data);
|
|
301
|
+
|
|
277
302
|
for (let j = 0, jl = numbers.length; j < jl; j += 2) {
|
|
278
303
|
point.x += numbers[j + 0];
|
|
279
304
|
point.y += numbers[j + 1];
|
|
280
305
|
control.x = point.x;
|
|
281
306
|
control.y = point.y;
|
|
307
|
+
|
|
282
308
|
if (j === 0) {
|
|
283
309
|
path.moveTo(point.x, point.y);
|
|
284
310
|
} else {
|
|
285
311
|
path.lineTo(point.x, point.y);
|
|
286
312
|
}
|
|
287
|
-
|
|
288
|
-
|
|
313
|
+
|
|
314
|
+
if (j === 0) firstPoint.copy(point);
|
|
289
315
|
}
|
|
316
|
+
|
|
290
317
|
break;
|
|
291
|
-
|
|
292
|
-
|
|
318
|
+
|
|
319
|
+
case 'h':
|
|
320
|
+
numbers = parseFloats(data);
|
|
321
|
+
|
|
293
322
|
for (let j = 0, jl = numbers.length; j < jl; j++) {
|
|
294
323
|
point.x += numbers[j];
|
|
295
324
|
control.x = point.x;
|
|
296
325
|
control.y = point.y;
|
|
297
326
|
path.lineTo(point.x, point.y);
|
|
298
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
299
|
-
firstPoint.copy(point);
|
|
327
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
300
328
|
}
|
|
329
|
+
|
|
301
330
|
break;
|
|
302
|
-
|
|
303
|
-
|
|
331
|
+
|
|
332
|
+
case 'v':
|
|
333
|
+
numbers = parseFloats(data);
|
|
334
|
+
|
|
304
335
|
for (let j = 0, jl = numbers.length; j < jl; j++) {
|
|
305
336
|
point.y += numbers[j];
|
|
306
337
|
control.x = point.x;
|
|
307
338
|
control.y = point.y;
|
|
308
339
|
path.lineTo(point.x, point.y);
|
|
309
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
310
|
-
firstPoint.copy(point);
|
|
340
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
311
341
|
}
|
|
342
|
+
|
|
312
343
|
break;
|
|
313
|
-
|
|
314
|
-
|
|
344
|
+
|
|
345
|
+
case 'l':
|
|
346
|
+
numbers = parseFloats(data);
|
|
347
|
+
|
|
315
348
|
for (let j = 0, jl = numbers.length; j < jl; j += 2) {
|
|
316
349
|
point.x += numbers[j + 0];
|
|
317
350
|
point.y += numbers[j + 1];
|
|
318
351
|
control.x = point.x;
|
|
319
352
|
control.y = point.y;
|
|
320
353
|
path.lineTo(point.x, point.y);
|
|
321
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
322
|
-
firstPoint.copy(point);
|
|
354
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
323
355
|
}
|
|
356
|
+
|
|
324
357
|
break;
|
|
325
|
-
|
|
326
|
-
|
|
358
|
+
|
|
359
|
+
case 'c':
|
|
360
|
+
numbers = parseFloats(data);
|
|
361
|
+
|
|
327
362
|
for (let j = 0, jl = numbers.length; j < jl; j += 6) {
|
|
328
|
-
path.bezierCurveTo(
|
|
329
|
-
point.x + numbers[j + 0],
|
|
330
|
-
point.y + numbers[j + 1],
|
|
331
|
-
point.x + numbers[j + 2],
|
|
332
|
-
point.y + numbers[j + 3],
|
|
333
|
-
point.x + numbers[j + 4],
|
|
334
|
-
point.y + numbers[j + 5]
|
|
335
|
-
);
|
|
363
|
+
path.bezierCurveTo(point.x + numbers[j + 0], point.y + numbers[j + 1], point.x + numbers[j + 2], point.y + numbers[j + 3], point.x + numbers[j + 4], point.y + numbers[j + 5]);
|
|
336
364
|
control.x = point.x + numbers[j + 2];
|
|
337
365
|
control.y = point.y + numbers[j + 3];
|
|
338
366
|
point.x += numbers[j + 4];
|
|
339
367
|
point.y += numbers[j + 5];
|
|
340
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
341
|
-
firstPoint.copy(point);
|
|
368
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
342
369
|
}
|
|
370
|
+
|
|
343
371
|
break;
|
|
344
|
-
|
|
345
|
-
|
|
372
|
+
|
|
373
|
+
case 's':
|
|
374
|
+
numbers = parseFloats(data);
|
|
375
|
+
|
|
346
376
|
for (let j = 0, jl = numbers.length; j < jl; j += 4) {
|
|
347
|
-
path.bezierCurveTo(
|
|
348
|
-
getReflection(point.x, control.x),
|
|
349
|
-
getReflection(point.y, control.y),
|
|
350
|
-
point.x + numbers[j + 0],
|
|
351
|
-
point.y + numbers[j + 1],
|
|
352
|
-
point.x + numbers[j + 2],
|
|
353
|
-
point.y + numbers[j + 3]
|
|
354
|
-
);
|
|
377
|
+
path.bezierCurveTo(getReflection(point.x, control.x), getReflection(point.y, control.y), point.x + numbers[j + 0], point.y + numbers[j + 1], point.x + numbers[j + 2], point.y + numbers[j + 3]);
|
|
355
378
|
control.x = point.x + numbers[j + 0];
|
|
356
379
|
control.y = point.y + numbers[j + 1];
|
|
357
380
|
point.x += numbers[j + 2];
|
|
358
381
|
point.y += numbers[j + 3];
|
|
359
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
360
|
-
firstPoint.copy(point);
|
|
382
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
361
383
|
}
|
|
384
|
+
|
|
362
385
|
break;
|
|
363
|
-
|
|
364
|
-
|
|
386
|
+
|
|
387
|
+
case 'q':
|
|
388
|
+
numbers = parseFloats(data);
|
|
389
|
+
|
|
365
390
|
for (let j = 0, jl = numbers.length; j < jl; j += 4) {
|
|
366
|
-
path.quadraticCurveTo(
|
|
367
|
-
point.x + numbers[j + 0],
|
|
368
|
-
point.y + numbers[j + 1],
|
|
369
|
-
point.x + numbers[j + 2],
|
|
370
|
-
point.y + numbers[j + 3]
|
|
371
|
-
);
|
|
391
|
+
path.quadraticCurveTo(point.x + numbers[j + 0], point.y + numbers[j + 1], point.x + numbers[j + 2], point.y + numbers[j + 3]);
|
|
372
392
|
control.x = point.x + numbers[j + 0];
|
|
373
393
|
control.y = point.y + numbers[j + 1];
|
|
374
394
|
point.x += numbers[j + 2];
|
|
375
395
|
point.y += numbers[j + 3];
|
|
376
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
377
|
-
firstPoint.copy(point);
|
|
396
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
378
397
|
}
|
|
398
|
+
|
|
379
399
|
break;
|
|
380
|
-
|
|
381
|
-
|
|
400
|
+
|
|
401
|
+
case 't':
|
|
402
|
+
numbers = parseFloats(data);
|
|
403
|
+
|
|
382
404
|
for (let j = 0, jl = numbers.length; j < jl; j += 2) {
|
|
383
405
|
const rx = getReflection(point.x, control.x);
|
|
384
406
|
const ry = getReflection(point.y, control.y);
|
|
@@ -387,257 +409,325 @@ class SVGLoader extends THREE.Loader {
|
|
|
387
409
|
control.y = ry;
|
|
388
410
|
point.x = point.x + numbers[j + 0];
|
|
389
411
|
point.y = point.y + numbers[j + 1];
|
|
390
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
391
|
-
firstPoint.copy(point);
|
|
412
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
392
413
|
}
|
|
414
|
+
|
|
393
415
|
break;
|
|
394
|
-
|
|
395
|
-
|
|
416
|
+
|
|
417
|
+
case 'a':
|
|
418
|
+
numbers = parseFloats(data, [3, 4], 7);
|
|
419
|
+
|
|
396
420
|
for (let j = 0, jl = numbers.length; j < jl; j += 7) {
|
|
397
|
-
|
|
398
|
-
|
|
421
|
+
// skip command if no displacement
|
|
422
|
+
if (numbers[j + 5] == 0 && numbers[j + 6] == 0) continue;
|
|
399
423
|
const start = point.clone();
|
|
400
424
|
point.x += numbers[j + 5];
|
|
401
425
|
point.y += numbers[j + 6];
|
|
402
426
|
control.x = point.x;
|
|
403
427
|
control.y = point.y;
|
|
404
|
-
parseArcCommand(
|
|
405
|
-
|
|
406
|
-
numbers[j],
|
|
407
|
-
numbers[j + 1],
|
|
408
|
-
numbers[j + 2],
|
|
409
|
-
numbers[j + 3],
|
|
410
|
-
numbers[j + 4],
|
|
411
|
-
start,
|
|
412
|
-
point
|
|
413
|
-
);
|
|
414
|
-
if (j === 0 && doSetFirstPoint === true)
|
|
415
|
-
firstPoint.copy(point);
|
|
428
|
+
parseArcCommand(path, numbers[j], numbers[j + 1], numbers[j + 2], numbers[j + 3], numbers[j + 4], start, point);
|
|
429
|
+
if (j === 0 && doSetFirstPoint === true) firstPoint.copy(point);
|
|
416
430
|
}
|
|
431
|
+
|
|
417
432
|
break;
|
|
418
|
-
|
|
419
|
-
case
|
|
433
|
+
|
|
434
|
+
case 'Z':
|
|
435
|
+
case 'z':
|
|
420
436
|
path.currentPath.autoClose = true;
|
|
437
|
+
|
|
421
438
|
if (path.currentPath.curves.length > 0) {
|
|
439
|
+
// Reset point to beginning of Path
|
|
422
440
|
point.copy(firstPoint);
|
|
423
441
|
path.currentPath.currentPoint.copy(point);
|
|
424
442
|
isFirstPoint = true;
|
|
425
443
|
}
|
|
444
|
+
|
|
426
445
|
break;
|
|
446
|
+
|
|
427
447
|
default:
|
|
428
448
|
console.warn(command);
|
|
429
|
-
}
|
|
449
|
+
} // console.log( type, parseFloats( data ), parseFloats( data ).length )
|
|
450
|
+
|
|
451
|
+
|
|
430
452
|
doSetFirstPoint = false;
|
|
431
453
|
}
|
|
454
|
+
|
|
432
455
|
return path;
|
|
433
456
|
}
|
|
457
|
+
|
|
434
458
|
function parseCSSStylesheet(node) {
|
|
435
|
-
if (!node.sheet || !node.sheet.cssRules || !node.sheet.cssRules.length)
|
|
436
|
-
|
|
459
|
+
if (!node.sheet || !node.sheet.cssRules || !node.sheet.cssRules.length) return;
|
|
460
|
+
|
|
437
461
|
for (let i = 0; i < node.sheet.cssRules.length; i++) {
|
|
438
462
|
const stylesheet = node.sheet.cssRules[i];
|
|
439
|
-
if (stylesheet.type !== 1)
|
|
440
|
-
|
|
441
|
-
|
|
463
|
+
if (stylesheet.type !== 1) continue;
|
|
464
|
+
const selectorList = stylesheet.selectorText.split(/,/gm).filter(Boolean).map(i => i.trim());
|
|
465
|
+
|
|
442
466
|
for (let j = 0; j < selectorList.length; j++) {
|
|
443
467
|
stylesheets[selectorList[j]] = Object.assign(stylesheets[selectorList[j]] || {}, stylesheet.style);
|
|
444
468
|
}
|
|
445
469
|
}
|
|
446
470
|
}
|
|
471
|
+
/**
|
|
472
|
+
* https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
|
|
473
|
+
* https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion
|
|
474
|
+
* From
|
|
475
|
+
* rx ry x-axis-rotation large-arc-flag sweep-flag x y
|
|
476
|
+
* To
|
|
477
|
+
* aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation
|
|
478
|
+
*/
|
|
479
|
+
|
|
480
|
+
|
|
447
481
|
function parseArcCommand(path, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, start, end) {
|
|
448
482
|
if (rx == 0 || ry == 0) {
|
|
483
|
+
// draw a line if either of the radii == 0
|
|
449
484
|
path.lineTo(end.x, end.y);
|
|
450
485
|
return;
|
|
451
486
|
}
|
|
452
|
-
|
|
487
|
+
|
|
488
|
+
x_axis_rotation = x_axis_rotation * Math.PI / 180; // Ensure radii are positive
|
|
489
|
+
|
|
453
490
|
rx = Math.abs(rx);
|
|
454
|
-
ry = Math.abs(ry);
|
|
455
|
-
|
|
456
|
-
const
|
|
491
|
+
ry = Math.abs(ry); // Compute (x1', y1')
|
|
492
|
+
|
|
493
|
+
const dx2 = (start.x - end.x) / 2.0;
|
|
494
|
+
const dy2 = (start.y - end.y) / 2.0;
|
|
457
495
|
const x1p = Math.cos(x_axis_rotation) * dx2 + Math.sin(x_axis_rotation) * dy2;
|
|
458
|
-
const y1p = -Math.sin(x_axis_rotation) * dx2 + Math.cos(x_axis_rotation) * dy2;
|
|
496
|
+
const y1p = -Math.sin(x_axis_rotation) * dx2 + Math.cos(x_axis_rotation) * dy2; // Compute (cx', cy')
|
|
497
|
+
|
|
459
498
|
let rxs = rx * rx;
|
|
460
499
|
let rys = ry * ry;
|
|
461
500
|
const x1ps = x1p * x1p;
|
|
462
|
-
const y1ps = y1p * y1p;
|
|
501
|
+
const y1ps = y1p * y1p; // Ensure radii are large enough
|
|
502
|
+
|
|
463
503
|
const cr = x1ps / rxs + y1ps / rys;
|
|
504
|
+
|
|
464
505
|
if (cr > 1) {
|
|
506
|
+
// scale up rx,ry equally so cr == 1
|
|
465
507
|
const s = Math.sqrt(cr);
|
|
466
508
|
rx = s * rx;
|
|
467
509
|
ry = s * ry;
|
|
468
510
|
rxs = rx * rx;
|
|
469
511
|
rys = ry * ry;
|
|
470
512
|
}
|
|
513
|
+
|
|
471
514
|
const dq = rxs * y1ps + rys * x1ps;
|
|
472
515
|
const pq = (rxs * rys - dq) / dq;
|
|
473
516
|
let q = Math.sqrt(Math.max(0, pq));
|
|
474
|
-
if (large_arc_flag === sweep_flag)
|
|
475
|
-
q = -q;
|
|
517
|
+
if (large_arc_flag === sweep_flag) q = -q;
|
|
476
518
|
const cxp = q * rx * y1p / ry;
|
|
477
|
-
const cyp = -q * ry * x1p / rx;
|
|
519
|
+
const cyp = -q * ry * x1p / rx; // Step 3: Compute (cx, cy) from (cx', cy')
|
|
520
|
+
|
|
478
521
|
const cx = Math.cos(x_axis_rotation) * cxp - Math.sin(x_axis_rotation) * cyp + (start.x + end.x) / 2;
|
|
479
|
-
const cy = Math.sin(x_axis_rotation) * cxp + Math.cos(x_axis_rotation) * cyp + (start.y + end.y) / 2;
|
|
522
|
+
const cy = Math.sin(x_axis_rotation) * cxp + Math.cos(x_axis_rotation) * cyp + (start.y + end.y) / 2; // Step 4: Compute θ1 and Δθ
|
|
523
|
+
|
|
480
524
|
const theta = svgAngle(1, 0, (x1p - cxp) / rx, (y1p - cyp) / ry);
|
|
481
525
|
const delta = svgAngle((x1p - cxp) / rx, (y1p - cyp) / ry, (-x1p - cxp) / rx, (-y1p - cyp) / ry) % (Math.PI * 2);
|
|
482
526
|
path.currentPath.absellipse(cx, cy, rx, ry, theta, theta + delta, sweep_flag === 0, x_axis_rotation);
|
|
483
527
|
}
|
|
528
|
+
|
|
484
529
|
function svgAngle(ux, uy, vx, vy) {
|
|
485
530
|
const dot = ux * vx + uy * vy;
|
|
486
531
|
const len = Math.sqrt(ux * ux + uy * uy) * Math.sqrt(vx * vx + vy * vy);
|
|
487
|
-
let ang = Math.acos(Math.max(-1, Math.min(1, dot / len)));
|
|
488
|
-
|
|
489
|
-
|
|
532
|
+
let ang = Math.acos(Math.max(-1, Math.min(1, dot / len))); // floating point precision, slightly over values appear
|
|
533
|
+
|
|
534
|
+
if (ux * vy - uy * vx < 0) ang = -ang;
|
|
490
535
|
return ang;
|
|
491
536
|
}
|
|
537
|
+
/*
|
|
538
|
+
* According to https://www.w3.org/TR/SVG/shapes.html#RectElementRXAttribute
|
|
539
|
+
* rounded corner should be rendered to elliptical arc, but bezier curve does the job well enough
|
|
540
|
+
*/
|
|
541
|
+
|
|
542
|
+
|
|
492
543
|
function parseRectNode(node) {
|
|
493
|
-
const x = parseFloatWithUnits(node.getAttribute(
|
|
494
|
-
const y = parseFloatWithUnits(node.getAttribute(
|
|
495
|
-
const rx = parseFloatWithUnits(node.getAttribute(
|
|
496
|
-
const ry = parseFloatWithUnits(node.getAttribute(
|
|
497
|
-
const w = parseFloatWithUnits(node.getAttribute(
|
|
498
|
-
const h = parseFloatWithUnits(node.getAttribute(
|
|
544
|
+
const x = parseFloatWithUnits(node.getAttribute('x') || 0);
|
|
545
|
+
const y = parseFloatWithUnits(node.getAttribute('y') || 0);
|
|
546
|
+
const rx = parseFloatWithUnits(node.getAttribute('rx') || node.getAttribute('ry') || 0);
|
|
547
|
+
const ry = parseFloatWithUnits(node.getAttribute('ry') || node.getAttribute('rx') || 0);
|
|
548
|
+
const w = parseFloatWithUnits(node.getAttribute('width'));
|
|
549
|
+
const h = parseFloatWithUnits(node.getAttribute('height')); // Ellipse arc to Bezier approximation Coefficient (Inversed). See:
|
|
550
|
+
// https://spencermortensen.com/articles/bezier-circle/
|
|
551
|
+
|
|
499
552
|
const bci = 1 - 0.551915024494;
|
|
500
|
-
const path = new
|
|
501
|
-
|
|
553
|
+
const path = new ShapePath(); // top left
|
|
554
|
+
|
|
555
|
+
path.moveTo(x + rx, y); // top right
|
|
556
|
+
|
|
502
557
|
path.lineTo(x + w - rx, y);
|
|
558
|
+
|
|
503
559
|
if (rx !== 0 || ry !== 0) {
|
|
504
560
|
path.bezierCurveTo(x + w - rx * bci, y, x + w, y + ry * bci, x + w, y + ry);
|
|
505
|
-
}
|
|
561
|
+
} // bottom right
|
|
562
|
+
|
|
563
|
+
|
|
506
564
|
path.lineTo(x + w, y + h - ry);
|
|
565
|
+
|
|
507
566
|
if (rx !== 0 || ry !== 0) {
|
|
508
567
|
path.bezierCurveTo(x + w, y + h - ry * bci, x + w - rx * bci, y + h, x + w - rx, y + h);
|
|
509
|
-
}
|
|
568
|
+
} // bottom left
|
|
569
|
+
|
|
570
|
+
|
|
510
571
|
path.lineTo(x + rx, y + h);
|
|
572
|
+
|
|
511
573
|
if (rx !== 0 || ry !== 0) {
|
|
512
574
|
path.bezierCurveTo(x + rx * bci, y + h, x, y + h - ry * bci, x, y + h - ry);
|
|
513
|
-
}
|
|
575
|
+
} // back to top left
|
|
576
|
+
|
|
577
|
+
|
|
514
578
|
path.lineTo(x, y + ry);
|
|
579
|
+
|
|
515
580
|
if (rx !== 0 || ry !== 0) {
|
|
516
581
|
path.bezierCurveTo(x, y + ry * bci, x + rx * bci, y, x + rx, y);
|
|
517
582
|
}
|
|
583
|
+
|
|
518
584
|
return path;
|
|
519
585
|
}
|
|
586
|
+
|
|
520
587
|
function parsePolygonNode(node) {
|
|
521
588
|
function iterator(match, a, b) {
|
|
522
589
|
const x = parseFloatWithUnits(a);
|
|
523
590
|
const y = parseFloatWithUnits(b);
|
|
591
|
+
|
|
524
592
|
if (index === 0) {
|
|
525
593
|
path.moveTo(x, y);
|
|
526
594
|
} else {
|
|
527
595
|
path.lineTo(x, y);
|
|
528
596
|
}
|
|
597
|
+
|
|
529
598
|
index++;
|
|
530
599
|
}
|
|
600
|
+
|
|
531
601
|
const regex = /(-?[\d\.?]+)[,|\s](-?[\d\.?]+)/g;
|
|
532
|
-
const path = new
|
|
602
|
+
const path = new ShapePath();
|
|
533
603
|
let index = 0;
|
|
534
|
-
node.getAttribute(
|
|
604
|
+
node.getAttribute('points').replace(regex, iterator);
|
|
535
605
|
path.currentPath.autoClose = true;
|
|
536
606
|
return path;
|
|
537
607
|
}
|
|
608
|
+
|
|
538
609
|
function parsePolylineNode(node) {
|
|
539
610
|
function iterator(match, a, b) {
|
|
540
611
|
const x = parseFloatWithUnits(a);
|
|
541
612
|
const y = parseFloatWithUnits(b);
|
|
613
|
+
|
|
542
614
|
if (index === 0) {
|
|
543
615
|
path.moveTo(x, y);
|
|
544
616
|
} else {
|
|
545
617
|
path.lineTo(x, y);
|
|
546
618
|
}
|
|
619
|
+
|
|
547
620
|
index++;
|
|
548
621
|
}
|
|
622
|
+
|
|
549
623
|
const regex = /(-?[\d\.?]+)[,|\s](-?[\d\.?]+)/g;
|
|
550
|
-
const path = new
|
|
624
|
+
const path = new ShapePath();
|
|
551
625
|
let index = 0;
|
|
552
|
-
node.getAttribute(
|
|
626
|
+
node.getAttribute('points').replace(regex, iterator);
|
|
553
627
|
path.currentPath.autoClose = false;
|
|
554
628
|
return path;
|
|
555
629
|
}
|
|
630
|
+
|
|
556
631
|
function parseCircleNode(node) {
|
|
557
|
-
const x = parseFloatWithUnits(node.getAttribute(
|
|
558
|
-
const y = parseFloatWithUnits(node.getAttribute(
|
|
559
|
-
const r = parseFloatWithUnits(node.getAttribute(
|
|
560
|
-
const subpath = new
|
|
632
|
+
const x = parseFloatWithUnits(node.getAttribute('cx') || 0);
|
|
633
|
+
const y = parseFloatWithUnits(node.getAttribute('cy') || 0);
|
|
634
|
+
const r = parseFloatWithUnits(node.getAttribute('r') || 0);
|
|
635
|
+
const subpath = new Path();
|
|
561
636
|
subpath.absarc(x, y, r, 0, Math.PI * 2);
|
|
562
|
-
const path = new
|
|
637
|
+
const path = new ShapePath();
|
|
563
638
|
path.subPaths.push(subpath);
|
|
564
639
|
return path;
|
|
565
640
|
}
|
|
641
|
+
|
|
566
642
|
function parseEllipseNode(node) {
|
|
567
|
-
const x = parseFloatWithUnits(node.getAttribute(
|
|
568
|
-
const y = parseFloatWithUnits(node.getAttribute(
|
|
569
|
-
const rx = parseFloatWithUnits(node.getAttribute(
|
|
570
|
-
const ry = parseFloatWithUnits(node.getAttribute(
|
|
571
|
-
const subpath = new
|
|
643
|
+
const x = parseFloatWithUnits(node.getAttribute('cx') || 0);
|
|
644
|
+
const y = parseFloatWithUnits(node.getAttribute('cy') || 0);
|
|
645
|
+
const rx = parseFloatWithUnits(node.getAttribute('rx') || 0);
|
|
646
|
+
const ry = parseFloatWithUnits(node.getAttribute('ry') || 0);
|
|
647
|
+
const subpath = new Path();
|
|
572
648
|
subpath.absellipse(x, y, rx, ry, 0, Math.PI * 2);
|
|
573
|
-
const path = new
|
|
649
|
+
const path = new ShapePath();
|
|
574
650
|
path.subPaths.push(subpath);
|
|
575
651
|
return path;
|
|
576
652
|
}
|
|
653
|
+
|
|
577
654
|
function parseLineNode(node) {
|
|
578
|
-
const x1 = parseFloatWithUnits(node.getAttribute(
|
|
579
|
-
const y1 = parseFloatWithUnits(node.getAttribute(
|
|
580
|
-
const x2 = parseFloatWithUnits(node.getAttribute(
|
|
581
|
-
const y2 = parseFloatWithUnits(node.getAttribute(
|
|
582
|
-
const path = new
|
|
655
|
+
const x1 = parseFloatWithUnits(node.getAttribute('x1') || 0);
|
|
656
|
+
const y1 = parseFloatWithUnits(node.getAttribute('y1') || 0);
|
|
657
|
+
const x2 = parseFloatWithUnits(node.getAttribute('x2') || 0);
|
|
658
|
+
const y2 = parseFloatWithUnits(node.getAttribute('y2') || 0);
|
|
659
|
+
const path = new ShapePath();
|
|
583
660
|
path.moveTo(x1, y1);
|
|
584
661
|
path.lineTo(x2, y2);
|
|
585
662
|
path.currentPath.autoClose = false;
|
|
586
663
|
return path;
|
|
587
|
-
}
|
|
664
|
+
} //
|
|
665
|
+
|
|
666
|
+
|
|
588
667
|
function parseStyle(node, style) {
|
|
589
|
-
style = Object.assign({}, style);
|
|
668
|
+
style = Object.assign({}, style); // clone style
|
|
669
|
+
|
|
590
670
|
let stylesheetStyles = {};
|
|
591
|
-
|
|
592
|
-
|
|
671
|
+
|
|
672
|
+
if (node.hasAttribute('class')) {
|
|
673
|
+
const classSelectors = node.getAttribute('class').split(/\s/).filter(Boolean).map(i => i.trim());
|
|
674
|
+
|
|
593
675
|
for (let i = 0; i < classSelectors.length; i++) {
|
|
594
|
-
stylesheetStyles = Object.assign(stylesheetStyles, stylesheets[
|
|
676
|
+
stylesheetStyles = Object.assign(stylesheetStyles, stylesheets['.' + classSelectors[i]]);
|
|
595
677
|
}
|
|
596
678
|
}
|
|
597
|
-
|
|
598
|
-
|
|
679
|
+
|
|
680
|
+
if (node.hasAttribute('id')) {
|
|
681
|
+
stylesheetStyles = Object.assign(stylesheetStyles, stylesheets['#' + node.getAttribute('id')]);
|
|
599
682
|
}
|
|
683
|
+
|
|
600
684
|
function addStyle(svgName, jsName, adjustFunction) {
|
|
601
|
-
if (adjustFunction ===
|
|
685
|
+
if (adjustFunction === undefined) {
|
|
602
686
|
adjustFunction = function copy(v) {
|
|
603
|
-
if (v.startsWith(
|
|
604
|
-
console.warn("SVGLoader: url access in attributes is not implemented.");
|
|
687
|
+
if (v.startsWith('url')) console.warn('SVGLoader: url access in attributes is not implemented.');
|
|
605
688
|
return v;
|
|
606
689
|
};
|
|
607
690
|
}
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
if (stylesheetStyles[svgName])
|
|
611
|
-
|
|
612
|
-
if (node.style && node.style[svgName] !== "")
|
|
613
|
-
style[jsName] = adjustFunction(node.style[svgName]);
|
|
691
|
+
|
|
692
|
+
if (node.hasAttribute(svgName)) style[jsName] = adjustFunction(node.getAttribute(svgName));
|
|
693
|
+
if (stylesheetStyles[svgName]) style[jsName] = adjustFunction(stylesheetStyles[svgName]);
|
|
694
|
+
if (node.style && node.style[svgName] !== '') style[jsName] = adjustFunction(node.style[svgName]);
|
|
614
695
|
}
|
|
696
|
+
|
|
615
697
|
function clamp(v) {
|
|
616
698
|
return Math.max(0, Math.min(1, parseFloatWithUnits(v)));
|
|
617
699
|
}
|
|
700
|
+
|
|
618
701
|
function positive(v) {
|
|
619
702
|
return Math.max(0, parseFloatWithUnits(v));
|
|
620
703
|
}
|
|
621
|
-
|
|
622
|
-
addStyle(
|
|
623
|
-
addStyle(
|
|
624
|
-
addStyle(
|
|
625
|
-
addStyle(
|
|
626
|
-
addStyle(
|
|
627
|
-
addStyle(
|
|
628
|
-
addStyle(
|
|
629
|
-
addStyle(
|
|
630
|
-
addStyle(
|
|
631
|
-
addStyle(
|
|
704
|
+
|
|
705
|
+
addStyle('fill', 'fill');
|
|
706
|
+
addStyle('fill-opacity', 'fillOpacity', clamp);
|
|
707
|
+
addStyle('fill-rule', 'fillRule');
|
|
708
|
+
addStyle('opacity', 'opacity', clamp);
|
|
709
|
+
addStyle('stroke', 'stroke');
|
|
710
|
+
addStyle('stroke-opacity', 'strokeOpacity', clamp);
|
|
711
|
+
addStyle('stroke-width', 'strokeWidth', positive);
|
|
712
|
+
addStyle('stroke-linejoin', 'strokeLineJoin');
|
|
713
|
+
addStyle('stroke-linecap', 'strokeLineCap');
|
|
714
|
+
addStyle('stroke-miterlimit', 'strokeMiterLimit', positive);
|
|
715
|
+
addStyle('visibility', 'visibility');
|
|
632
716
|
return style;
|
|
633
|
-
}
|
|
717
|
+
} // http://www.w3.org/TR/SVG11/implnote.html#PathElementImplementationNotes
|
|
718
|
+
|
|
719
|
+
|
|
634
720
|
function getReflection(a, b) {
|
|
635
721
|
return a - (b - a);
|
|
636
|
-
}
|
|
722
|
+
} // from https://github.com/ppvg/svg-numbers (MIT License)
|
|
723
|
+
|
|
724
|
+
|
|
637
725
|
function parseFloats(input, flags, stride) {
|
|
638
|
-
if (typeof input !==
|
|
639
|
-
throw new TypeError(
|
|
640
|
-
}
|
|
726
|
+
if (typeof input !== 'string') {
|
|
727
|
+
throw new TypeError('Invalid input: ' + typeof input);
|
|
728
|
+
} // Character groups
|
|
729
|
+
|
|
730
|
+
|
|
641
731
|
const RE = {
|
|
642
732
|
SEPARATOR: /[ \t\r\n\,.\-+]/,
|
|
643
733
|
WHITESPACE: /[ \t\r\n]/,
|
|
@@ -647,107 +737,138 @@ class SVGLoader extends THREE.Loader {
|
|
|
647
737
|
COMMA: /,/,
|
|
648
738
|
EXP: /e/i,
|
|
649
739
|
FLAGS: /[01]/
|
|
650
|
-
};
|
|
740
|
+
}; // States
|
|
741
|
+
|
|
651
742
|
const SEP = 0;
|
|
652
743
|
const INT = 1;
|
|
653
744
|
const FLOAT = 2;
|
|
654
745
|
const EXP = 3;
|
|
655
746
|
let state = SEP;
|
|
656
747
|
let seenComma = true;
|
|
657
|
-
let number =
|
|
748
|
+
let number = '',
|
|
749
|
+
exponent = '';
|
|
658
750
|
const result = [];
|
|
659
|
-
|
|
660
|
-
|
|
751
|
+
|
|
752
|
+
function throwSyntaxError(current, i, partial) {
|
|
753
|
+
const error = new SyntaxError('Unexpected character "' + current + '" at index ' + i + '.');
|
|
661
754
|
error.partial = partial;
|
|
662
755
|
throw error;
|
|
663
756
|
}
|
|
757
|
+
|
|
664
758
|
function newNumber() {
|
|
665
|
-
if (number !==
|
|
666
|
-
if (exponent ===
|
|
667
|
-
result.push(Number(number));
|
|
668
|
-
else
|
|
669
|
-
result.push(Number(number) * Math.pow(10, Number(exponent)));
|
|
759
|
+
if (number !== '') {
|
|
760
|
+
if (exponent === '') result.push(Number(number));else result.push(Number(number) * Math.pow(10, Number(exponent)));
|
|
670
761
|
}
|
|
671
|
-
|
|
672
|
-
|
|
762
|
+
|
|
763
|
+
number = '';
|
|
764
|
+
exponent = '';
|
|
673
765
|
}
|
|
766
|
+
|
|
674
767
|
let current;
|
|
675
768
|
const length = input.length;
|
|
769
|
+
|
|
676
770
|
for (let i = 0; i < length; i++) {
|
|
677
|
-
current = input[i];
|
|
771
|
+
current = input[i]; // check for flags
|
|
772
|
+
|
|
678
773
|
if (Array.isArray(flags) && flags.includes(result.length % stride) && RE.FLAGS.test(current)) {
|
|
679
774
|
state = INT;
|
|
680
775
|
number = current;
|
|
681
776
|
newNumber();
|
|
682
777
|
continue;
|
|
683
|
-
}
|
|
778
|
+
} // parse until next number
|
|
779
|
+
|
|
780
|
+
|
|
684
781
|
if (state === SEP) {
|
|
782
|
+
// eat whitespace
|
|
685
783
|
if (RE.WHITESPACE.test(current)) {
|
|
686
784
|
continue;
|
|
687
|
-
}
|
|
785
|
+
} // start new number
|
|
786
|
+
|
|
787
|
+
|
|
688
788
|
if (RE.DIGIT.test(current) || RE.SIGN.test(current)) {
|
|
689
789
|
state = INT;
|
|
690
790
|
number = current;
|
|
691
791
|
continue;
|
|
692
792
|
}
|
|
793
|
+
|
|
693
794
|
if (RE.POINT.test(current)) {
|
|
694
795
|
state = FLOAT;
|
|
695
796
|
number = current;
|
|
696
797
|
continue;
|
|
697
|
-
}
|
|
798
|
+
} // throw on double commas (e.g. "1, , 2")
|
|
799
|
+
|
|
800
|
+
|
|
698
801
|
if (RE.COMMA.test(current)) {
|
|
699
802
|
if (seenComma) {
|
|
700
803
|
throwSyntaxError(current, i, result);
|
|
701
804
|
}
|
|
805
|
+
|
|
702
806
|
seenComma = true;
|
|
703
807
|
}
|
|
704
|
-
}
|
|
808
|
+
} // parse integer part
|
|
809
|
+
|
|
810
|
+
|
|
705
811
|
if (state === INT) {
|
|
706
812
|
if (RE.DIGIT.test(current)) {
|
|
707
813
|
number += current;
|
|
708
814
|
continue;
|
|
709
815
|
}
|
|
816
|
+
|
|
710
817
|
if (RE.POINT.test(current)) {
|
|
711
818
|
number += current;
|
|
712
819
|
state = FLOAT;
|
|
713
820
|
continue;
|
|
714
821
|
}
|
|
822
|
+
|
|
715
823
|
if (RE.EXP.test(current)) {
|
|
716
824
|
state = EXP;
|
|
717
825
|
continue;
|
|
718
|
-
}
|
|
826
|
+
} // throw on double signs ("-+1"), but not on sign as separator ("-1-2")
|
|
827
|
+
|
|
828
|
+
|
|
719
829
|
if (RE.SIGN.test(current) && number.length === 1 && RE.SIGN.test(number[0])) {
|
|
720
830
|
throwSyntaxError(current, i, result);
|
|
721
831
|
}
|
|
722
|
-
}
|
|
832
|
+
} // parse decimal part
|
|
833
|
+
|
|
834
|
+
|
|
723
835
|
if (state === FLOAT) {
|
|
724
836
|
if (RE.DIGIT.test(current)) {
|
|
725
837
|
number += current;
|
|
726
838
|
continue;
|
|
727
839
|
}
|
|
840
|
+
|
|
728
841
|
if (RE.EXP.test(current)) {
|
|
729
842
|
state = EXP;
|
|
730
843
|
continue;
|
|
731
|
-
}
|
|
732
|
-
|
|
844
|
+
} // throw on double decimal points (e.g. "1..2")
|
|
845
|
+
|
|
846
|
+
|
|
847
|
+
if (RE.POINT.test(current) && number[number.length - 1] === '.') {
|
|
733
848
|
throwSyntaxError(current, i, result);
|
|
734
849
|
}
|
|
735
|
-
}
|
|
850
|
+
} // parse exponent part
|
|
851
|
+
|
|
852
|
+
|
|
736
853
|
if (state === EXP) {
|
|
737
854
|
if (RE.DIGIT.test(current)) {
|
|
738
855
|
exponent += current;
|
|
739
856
|
continue;
|
|
740
857
|
}
|
|
858
|
+
|
|
741
859
|
if (RE.SIGN.test(current)) {
|
|
742
|
-
if (exponent ===
|
|
860
|
+
if (exponent === '') {
|
|
743
861
|
exponent += current;
|
|
744
862
|
continue;
|
|
745
863
|
}
|
|
864
|
+
|
|
746
865
|
if (exponent.length === 1 && RE.SIGN.test(exponent)) {
|
|
747
866
|
throwSyntaxError(current, i, result);
|
|
748
867
|
}
|
|
749
868
|
}
|
|
750
|
-
}
|
|
869
|
+
} // end of number
|
|
870
|
+
|
|
871
|
+
|
|
751
872
|
if (RE.WHITESPACE.test(current)) {
|
|
752
873
|
newNumber();
|
|
753
874
|
state = SEP;
|
|
@@ -767,11 +888,16 @@ class SVGLoader extends THREE.Loader {
|
|
|
767
888
|
} else {
|
|
768
889
|
throwSyntaxError(current, i, result);
|
|
769
890
|
}
|
|
770
|
-
}
|
|
891
|
+
} // add the last number found (if any)
|
|
892
|
+
|
|
893
|
+
|
|
771
894
|
newNumber();
|
|
772
895
|
return result;
|
|
773
|
-
}
|
|
774
|
-
|
|
896
|
+
} // Units
|
|
897
|
+
|
|
898
|
+
|
|
899
|
+
const units = ['mm', 'cm', 'in', 'pt', 'pc', 'px']; // Conversion: [ fromUnit ][ toUnit ] (-1 means dpi dependent)
|
|
900
|
+
|
|
775
901
|
const unitConversion = {
|
|
776
902
|
mm: {
|
|
777
903
|
mm: 1,
|
|
@@ -817,11 +943,14 @@ class SVGLoader extends THREE.Loader {
|
|
|
817
943
|
px: 1
|
|
818
944
|
}
|
|
819
945
|
};
|
|
946
|
+
|
|
820
947
|
function parseFloatWithUnits(string) {
|
|
821
|
-
let theUnit =
|
|
822
|
-
|
|
948
|
+
let theUnit = 'px';
|
|
949
|
+
|
|
950
|
+
if (typeof string === 'string' || string instanceof String) {
|
|
823
951
|
for (let i = 0, n = units.length; i < n; i++) {
|
|
824
952
|
const u = units[i];
|
|
953
|
+
|
|
825
954
|
if (string.endsWith(u)) {
|
|
826
955
|
theUnit = u;
|
|
827
956
|
string = string.substring(0, string.length - u.length);
|
|
@@ -829,121 +958,164 @@ class SVGLoader extends THREE.Loader {
|
|
|
829
958
|
}
|
|
830
959
|
}
|
|
831
960
|
}
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
961
|
+
|
|
962
|
+
let scale = undefined;
|
|
963
|
+
|
|
964
|
+
if (theUnit === 'px' && scope.defaultUnit !== 'px') {
|
|
965
|
+
// Conversion scale from pixels to inches, then to default units
|
|
966
|
+
scale = unitConversion['in'][scope.defaultUnit] / scope.defaultDPI;
|
|
835
967
|
} else {
|
|
836
968
|
scale = unitConversion[theUnit][scope.defaultUnit];
|
|
969
|
+
|
|
837
970
|
if (scale < 0) {
|
|
838
|
-
|
|
971
|
+
// Conversion scale to pixels
|
|
972
|
+
scale = unitConversion[theUnit]['in'] * scope.defaultDPI;
|
|
839
973
|
}
|
|
840
974
|
}
|
|
975
|
+
|
|
841
976
|
return scale * parseFloat(string);
|
|
842
|
-
}
|
|
977
|
+
} // Transforms
|
|
978
|
+
|
|
979
|
+
|
|
843
980
|
function getNodeTransform(node) {
|
|
844
|
-
if (!(node.hasAttribute(
|
|
981
|
+
if (!(node.hasAttribute('transform') || node.nodeName === 'use' && (node.hasAttribute('x') || node.hasAttribute('y')))) {
|
|
845
982
|
return null;
|
|
846
983
|
}
|
|
984
|
+
|
|
847
985
|
const transform = parseNodeTransform(node);
|
|
986
|
+
|
|
848
987
|
if (transformStack.length > 0) {
|
|
849
988
|
transform.premultiply(transformStack[transformStack.length - 1]);
|
|
850
989
|
}
|
|
990
|
+
|
|
851
991
|
currentTransform.copy(transform);
|
|
852
992
|
transformStack.push(transform);
|
|
853
993
|
return transform;
|
|
854
994
|
}
|
|
995
|
+
|
|
855
996
|
function parseNodeTransform(node) {
|
|
856
|
-
const transform = new
|
|
857
|
-
const
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
const
|
|
997
|
+
const transform = new Matrix3();
|
|
998
|
+
const currentTransform = tempTransform0;
|
|
999
|
+
|
|
1000
|
+
if (node.nodeName === 'use' && (node.hasAttribute('x') || node.hasAttribute('y'))) {
|
|
1001
|
+
const tx = parseFloatWithUnits(node.getAttribute('x'));
|
|
1002
|
+
const ty = parseFloatWithUnits(node.getAttribute('y'));
|
|
861
1003
|
transform.translate(tx, ty);
|
|
862
1004
|
}
|
|
863
|
-
|
|
864
|
-
|
|
1005
|
+
|
|
1006
|
+
if (node.hasAttribute('transform')) {
|
|
1007
|
+
const transformsTexts = node.getAttribute('transform').split(')');
|
|
1008
|
+
|
|
865
1009
|
for (let tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex--) {
|
|
866
1010
|
const transformText = transformsTexts[tIndex].trim();
|
|
867
|
-
if (transformText ===
|
|
868
|
-
|
|
869
|
-
const openParPos = transformText.indexOf("(");
|
|
1011
|
+
if (transformText === '') continue;
|
|
1012
|
+
const openParPos = transformText.indexOf('(');
|
|
870
1013
|
const closeParPos = transformText.length;
|
|
1014
|
+
|
|
871
1015
|
if (openParPos > 0 && openParPos < closeParPos) {
|
|
872
1016
|
const transformType = transformText.substr(0, openParPos);
|
|
873
1017
|
const array = parseFloats(transformText.substr(openParPos + 1, closeParPos - openParPos - 1));
|
|
874
|
-
|
|
1018
|
+
currentTransform.identity();
|
|
1019
|
+
|
|
875
1020
|
switch (transformType) {
|
|
876
|
-
case
|
|
1021
|
+
case 'translate':
|
|
877
1022
|
if (array.length >= 1) {
|
|
878
1023
|
const tx = array[0];
|
|
879
1024
|
let ty = tx;
|
|
1025
|
+
|
|
880
1026
|
if (array.length >= 2) {
|
|
881
1027
|
ty = array[1];
|
|
882
1028
|
}
|
|
883
|
-
|
|
1029
|
+
|
|
1030
|
+
currentTransform.translate(tx, ty);
|
|
884
1031
|
}
|
|
1032
|
+
|
|
885
1033
|
break;
|
|
886
|
-
|
|
1034
|
+
|
|
1035
|
+
case 'rotate':
|
|
887
1036
|
if (array.length >= 1) {
|
|
888
1037
|
let angle = 0;
|
|
889
1038
|
let cx = 0;
|
|
890
|
-
let cy = 0;
|
|
1039
|
+
let cy = 0; // Angle
|
|
1040
|
+
|
|
891
1041
|
angle = -array[0] * Math.PI / 180;
|
|
1042
|
+
|
|
892
1043
|
if (array.length >= 3) {
|
|
1044
|
+
// Center x, y
|
|
893
1045
|
cx = array[1];
|
|
894
1046
|
cy = array[2];
|
|
895
|
-
}
|
|
1047
|
+
} // Rotate around center (cx, cy)
|
|
1048
|
+
|
|
1049
|
+
|
|
896
1050
|
tempTransform1.identity().translate(-cx, -cy);
|
|
897
1051
|
tempTransform2.identity().rotate(angle);
|
|
898
1052
|
tempTransform3.multiplyMatrices(tempTransform2, tempTransform1);
|
|
899
1053
|
tempTransform1.identity().translate(cx, cy);
|
|
900
|
-
|
|
1054
|
+
currentTransform.multiplyMatrices(tempTransform1, tempTransform3);
|
|
901
1055
|
}
|
|
1056
|
+
|
|
902
1057
|
break;
|
|
903
|
-
|
|
1058
|
+
|
|
1059
|
+
case 'scale':
|
|
904
1060
|
if (array.length >= 1) {
|
|
905
1061
|
const scaleX = array[0];
|
|
906
1062
|
let scaleY = scaleX;
|
|
1063
|
+
|
|
907
1064
|
if (array.length >= 2) {
|
|
908
1065
|
scaleY = array[1];
|
|
909
1066
|
}
|
|
910
|
-
|
|
1067
|
+
|
|
1068
|
+
currentTransform.scale(scaleX, scaleY);
|
|
911
1069
|
}
|
|
1070
|
+
|
|
912
1071
|
break;
|
|
913
|
-
|
|
1072
|
+
|
|
1073
|
+
case 'skewX':
|
|
914
1074
|
if (array.length === 1) {
|
|
915
|
-
|
|
1075
|
+
currentTransform.set(1, Math.tan(array[0] * Math.PI / 180), 0, 0, 1, 0, 0, 0, 1);
|
|
916
1076
|
}
|
|
1077
|
+
|
|
917
1078
|
break;
|
|
918
|
-
|
|
1079
|
+
|
|
1080
|
+
case 'skewY':
|
|
919
1081
|
if (array.length === 1) {
|
|
920
|
-
|
|
1082
|
+
currentTransform.set(1, 0, 0, Math.tan(array[0] * Math.PI / 180), 1, 0, 0, 0, 1);
|
|
921
1083
|
}
|
|
1084
|
+
|
|
922
1085
|
break;
|
|
923
|
-
|
|
1086
|
+
|
|
1087
|
+
case 'matrix':
|
|
924
1088
|
if (array.length === 6) {
|
|
925
|
-
|
|
1089
|
+
currentTransform.set(array[0], array[2], array[4], array[1], array[3], array[5], 0, 0, 1);
|
|
926
1090
|
}
|
|
1091
|
+
|
|
927
1092
|
break;
|
|
928
1093
|
}
|
|
929
1094
|
}
|
|
930
|
-
|
|
1095
|
+
|
|
1096
|
+
transform.premultiply(currentTransform);
|
|
931
1097
|
}
|
|
932
1098
|
}
|
|
1099
|
+
|
|
933
1100
|
return transform;
|
|
934
1101
|
}
|
|
1102
|
+
|
|
935
1103
|
function transformPath(path, m) {
|
|
936
1104
|
function transfVec2(v2) {
|
|
937
1105
|
tempV3.set(v2.x, v2.y, 1).applyMatrix3(m);
|
|
938
1106
|
v2.set(tempV3.x, tempV3.y);
|
|
939
1107
|
}
|
|
1108
|
+
|
|
940
1109
|
const isRotated = isTransformRotated(m);
|
|
941
1110
|
const subPaths = path.subPaths;
|
|
1111
|
+
|
|
942
1112
|
for (let i = 0, n = subPaths.length; i < n; i++) {
|
|
943
1113
|
const subPath = subPaths[i];
|
|
944
1114
|
const curves = subPath.curves;
|
|
1115
|
+
|
|
945
1116
|
for (let j = 0; j < curves.length; j++) {
|
|
946
1117
|
const curve = curves[j];
|
|
1118
|
+
|
|
947
1119
|
if (curve.isLineCurve) {
|
|
948
1120
|
transfVec2(curve.v1);
|
|
949
1121
|
transfVec2(curve.v2);
|
|
@@ -958,8 +1130,9 @@ class SVGLoader extends THREE.Loader {
|
|
|
958
1130
|
transfVec2(curve.v2);
|
|
959
1131
|
} else if (curve.isEllipseCurve) {
|
|
960
1132
|
if (isRotated) {
|
|
961
|
-
console.warn(
|
|
1133
|
+
console.warn('SVGLoader: Elliptic arc or ellipse rotation or skewing is not implemented.');
|
|
962
1134
|
}
|
|
1135
|
+
|
|
963
1136
|
tempV2.set(curve.aX, curve.aY);
|
|
964
1137
|
transfVec2(tempV2);
|
|
965
1138
|
curve.aX = tempV2.x;
|
|
@@ -970,41 +1143,54 @@ class SVGLoader extends THREE.Loader {
|
|
|
970
1143
|
}
|
|
971
1144
|
}
|
|
972
1145
|
}
|
|
1146
|
+
|
|
973
1147
|
function isTransformRotated(m) {
|
|
974
1148
|
return m.elements[1] !== 0 || m.elements[3] !== 0;
|
|
975
1149
|
}
|
|
1150
|
+
|
|
976
1151
|
function getTransformScaleX(m) {
|
|
977
1152
|
const te = m.elements;
|
|
978
1153
|
return Math.sqrt(te[0] * te[0] + te[1] * te[1]);
|
|
979
1154
|
}
|
|
1155
|
+
|
|
980
1156
|
function getTransformScaleY(m) {
|
|
981
1157
|
const te = m.elements;
|
|
982
1158
|
return Math.sqrt(te[3] * te[3] + te[4] * te[4]);
|
|
983
|
-
}
|
|
1159
|
+
} //
|
|
1160
|
+
|
|
1161
|
+
|
|
984
1162
|
const paths = [];
|
|
985
1163
|
const stylesheets = {};
|
|
986
1164
|
const transformStack = [];
|
|
987
|
-
const tempTransform0 = new
|
|
988
|
-
const tempTransform1 = new
|
|
989
|
-
const tempTransform2 = new
|
|
990
|
-
const tempTransform3 = new
|
|
991
|
-
const tempV2 = new
|
|
992
|
-
const tempV3 = new
|
|
993
|
-
const currentTransform = new
|
|
994
|
-
const xml = new DOMParser().parseFromString(text,
|
|
1165
|
+
const tempTransform0 = new Matrix3();
|
|
1166
|
+
const tempTransform1 = new Matrix3();
|
|
1167
|
+
const tempTransform2 = new Matrix3();
|
|
1168
|
+
const tempTransform3 = new Matrix3();
|
|
1169
|
+
const tempV2 = new Vector2();
|
|
1170
|
+
const tempV3 = new Vector3();
|
|
1171
|
+
const currentTransform = new Matrix3();
|
|
1172
|
+
const xml = new DOMParser().parseFromString(text, 'image/svg+xml'); // application/xml
|
|
1173
|
+
|
|
995
1174
|
parseNode(xml.documentElement, {
|
|
996
|
-
fill:
|
|
1175
|
+
fill: '#000',
|
|
997
1176
|
fillOpacity: 1,
|
|
998
1177
|
strokeOpacity: 1,
|
|
999
1178
|
strokeWidth: 1,
|
|
1000
|
-
strokeLineJoin:
|
|
1001
|
-
strokeLineCap:
|
|
1179
|
+
strokeLineJoin: 'miter',
|
|
1180
|
+
strokeLineCap: 'butt',
|
|
1002
1181
|
strokeMiterLimit: 4
|
|
1003
1182
|
});
|
|
1004
|
-
const data = {
|
|
1183
|
+
const data = {
|
|
1184
|
+
paths: paths,
|
|
1185
|
+
xml: xml.documentElement
|
|
1186
|
+
}; // console.log( paths );
|
|
1187
|
+
|
|
1005
1188
|
return data;
|
|
1006
1189
|
}
|
|
1190
|
+
|
|
1007
1191
|
static createShapes(shapePath) {
|
|
1192
|
+
// Param shapePath: a shapepath as returned by the parse function of this class
|
|
1193
|
+
// Returns Shape object
|
|
1008
1194
|
const BIGNUMBER = 999999999;
|
|
1009
1195
|
const IntersectionLocationType = {
|
|
1010
1196
|
ORIGIN: 0,
|
|
@@ -1019,6 +1205,7 @@ class SVGLoader extends THREE.Loader {
|
|
|
1019
1205
|
loc: IntersectionLocationType.ORIGIN,
|
|
1020
1206
|
t: 0
|
|
1021
1207
|
};
|
|
1208
|
+
|
|
1022
1209
|
function findEdgeIntersection(a0, a1, b0, b1) {
|
|
1023
1210
|
const x1 = a0.x;
|
|
1024
1211
|
const x2 = a1.x;
|
|
@@ -1033,104 +1220,150 @@ class SVGLoader extends THREE.Loader {
|
|
|
1033
1220
|
const denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
|
|
1034
1221
|
const t1 = nom1 / denom;
|
|
1035
1222
|
const t2 = nom2 / denom;
|
|
1223
|
+
|
|
1036
1224
|
if (denom === 0 && nom1 !== 0 || t1 <= 0 || t1 >= 1 || t2 < 0 || t2 > 1) {
|
|
1225
|
+
//1. lines are parallel or edges don't intersect
|
|
1037
1226
|
return null;
|
|
1038
1227
|
} else if (nom1 === 0 && denom === 0) {
|
|
1228
|
+
//2. lines are colinear
|
|
1229
|
+
//check if endpoints of edge2 (b0-b1) lies on edge1 (a0-a1)
|
|
1039
1230
|
for (let i = 0; i < 2; i++) {
|
|
1040
|
-
classifyPoint(i === 0 ? b0 : b1, a0, a1);
|
|
1231
|
+
classifyPoint(i === 0 ? b0 : b1, a0, a1); //find position of this endpoints relatively to edge1
|
|
1232
|
+
|
|
1041
1233
|
if (classifyResult.loc == IntersectionLocationType.ORIGIN) {
|
|
1042
1234
|
const point = i === 0 ? b0 : b1;
|
|
1043
|
-
return {
|
|
1235
|
+
return {
|
|
1236
|
+
x: point.x,
|
|
1237
|
+
y: point.y,
|
|
1238
|
+
t: classifyResult.t
|
|
1239
|
+
};
|
|
1044
1240
|
} else if (classifyResult.loc == IntersectionLocationType.BETWEEN) {
|
|
1045
1241
|
const x = +(x1 + classifyResult.t * (x2 - x1)).toPrecision(10);
|
|
1046
1242
|
const y = +(y1 + classifyResult.t * (y2 - y1)).toPrecision(10);
|
|
1047
|
-
return {
|
|
1243
|
+
return {
|
|
1244
|
+
x: x,
|
|
1245
|
+
y: y,
|
|
1246
|
+
t: classifyResult.t
|
|
1247
|
+
};
|
|
1048
1248
|
}
|
|
1049
1249
|
}
|
|
1250
|
+
|
|
1050
1251
|
return null;
|
|
1051
1252
|
} else {
|
|
1253
|
+
//3. edges intersect
|
|
1052
1254
|
for (let i = 0; i < 2; i++) {
|
|
1053
1255
|
classifyPoint(i === 0 ? b0 : b1, a0, a1);
|
|
1256
|
+
|
|
1054
1257
|
if (classifyResult.loc == IntersectionLocationType.ORIGIN) {
|
|
1055
1258
|
const point = i === 0 ? b0 : b1;
|
|
1056
|
-
return {
|
|
1259
|
+
return {
|
|
1260
|
+
x: point.x,
|
|
1261
|
+
y: point.y,
|
|
1262
|
+
t: classifyResult.t
|
|
1263
|
+
};
|
|
1057
1264
|
}
|
|
1058
1265
|
}
|
|
1266
|
+
|
|
1059
1267
|
const x = +(x1 + t1 * (x2 - x1)).toPrecision(10);
|
|
1060
1268
|
const y = +(y1 + t1 * (y2 - y1)).toPrecision(10);
|
|
1061
|
-
return {
|
|
1269
|
+
return {
|
|
1270
|
+
x: x,
|
|
1271
|
+
y: y,
|
|
1272
|
+
t: t1
|
|
1273
|
+
};
|
|
1062
1274
|
}
|
|
1063
1275
|
}
|
|
1276
|
+
|
|
1064
1277
|
function classifyPoint(p, edgeStart, edgeEnd) {
|
|
1065
1278
|
const ax = edgeEnd.x - edgeStart.x;
|
|
1066
1279
|
const ay = edgeEnd.y - edgeStart.y;
|
|
1067
1280
|
const bx = p.x - edgeStart.x;
|
|
1068
1281
|
const by = p.y - edgeStart.y;
|
|
1069
1282
|
const sa = ax * by - bx * ay;
|
|
1283
|
+
|
|
1070
1284
|
if (p.x === edgeStart.x && p.y === edgeStart.y) {
|
|
1071
1285
|
classifyResult.loc = IntersectionLocationType.ORIGIN;
|
|
1072
1286
|
classifyResult.t = 0;
|
|
1073
1287
|
return;
|
|
1074
1288
|
}
|
|
1289
|
+
|
|
1075
1290
|
if (p.x === edgeEnd.x && p.y === edgeEnd.y) {
|
|
1076
1291
|
classifyResult.loc = IntersectionLocationType.DESTINATION;
|
|
1077
1292
|
classifyResult.t = 1;
|
|
1078
1293
|
return;
|
|
1079
1294
|
}
|
|
1295
|
+
|
|
1080
1296
|
if (sa < -Number.EPSILON) {
|
|
1081
1297
|
classifyResult.loc = IntersectionLocationType.LEFT;
|
|
1082
1298
|
return;
|
|
1083
1299
|
}
|
|
1300
|
+
|
|
1084
1301
|
if (sa > Number.EPSILON) {
|
|
1085
1302
|
classifyResult.loc = IntersectionLocationType.RIGHT;
|
|
1086
1303
|
return;
|
|
1087
1304
|
}
|
|
1305
|
+
|
|
1088
1306
|
if (ax * bx < 0 || ay * by < 0) {
|
|
1089
1307
|
classifyResult.loc = IntersectionLocationType.BEHIND;
|
|
1090
1308
|
return;
|
|
1091
1309
|
}
|
|
1310
|
+
|
|
1092
1311
|
if (Math.sqrt(ax * ax + ay * ay) < Math.sqrt(bx * bx + by * by)) {
|
|
1093
1312
|
classifyResult.loc = IntersectionLocationType.BEYOND;
|
|
1094
1313
|
return;
|
|
1095
1314
|
}
|
|
1315
|
+
|
|
1096
1316
|
let t;
|
|
1317
|
+
|
|
1097
1318
|
if (ax !== 0) {
|
|
1098
1319
|
t = bx / ax;
|
|
1099
1320
|
} else {
|
|
1100
1321
|
t = by / ay;
|
|
1101
1322
|
}
|
|
1323
|
+
|
|
1102
1324
|
classifyResult.loc = IntersectionLocationType.BETWEEN;
|
|
1103
1325
|
classifyResult.t = t;
|
|
1104
1326
|
}
|
|
1327
|
+
|
|
1105
1328
|
function getIntersections(path1, path2) {
|
|
1106
1329
|
const intersectionsRaw = [];
|
|
1107
1330
|
const intersections = [];
|
|
1331
|
+
|
|
1108
1332
|
for (let index = 1; index < path1.length; index++) {
|
|
1109
1333
|
const path1EdgeStart = path1[index - 1];
|
|
1110
1334
|
const path1EdgeEnd = path1[index];
|
|
1335
|
+
|
|
1111
1336
|
for (let index2 = 1; index2 < path2.length; index2++) {
|
|
1112
1337
|
const path2EdgeStart = path2[index2 - 1];
|
|
1113
1338
|
const path2EdgeEnd = path2[index2];
|
|
1114
1339
|
const intersection = findEdgeIntersection(path1EdgeStart, path1EdgeEnd, path2EdgeStart, path2EdgeEnd);
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
) === void 0) {
|
|
1340
|
+
|
|
1341
|
+
if (intersection !== null && intersectionsRaw.find(i => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON) === undefined) {
|
|
1118
1342
|
intersectionsRaw.push(intersection);
|
|
1119
|
-
intersections.push(new
|
|
1343
|
+
intersections.push(new Vector2(intersection.x, intersection.y));
|
|
1120
1344
|
}
|
|
1121
1345
|
}
|
|
1122
1346
|
}
|
|
1347
|
+
|
|
1123
1348
|
return intersections;
|
|
1124
1349
|
}
|
|
1350
|
+
|
|
1125
1351
|
function getScanlineIntersections(scanline, boundingBox, paths) {
|
|
1126
|
-
const center = new
|
|
1352
|
+
const center = new Vector2();
|
|
1127
1353
|
boundingBox.getCenter(center);
|
|
1128
1354
|
const allIntersections = [];
|
|
1129
|
-
paths.forEach(
|
|
1355
|
+
paths.forEach(path => {
|
|
1356
|
+
// check if the center of the bounding box is in the bounding box of the paths.
|
|
1357
|
+
// this is a pruning method to limit the search of intersections in paths that can't envelop of the current path.
|
|
1358
|
+
// if a path envelops another path. The center of that oter path, has to be inside the bounding box of the enveloping path.
|
|
1130
1359
|
if (path.boundingBox.containsPoint(center)) {
|
|
1131
1360
|
const intersections = getIntersections(scanline, path.points);
|
|
1132
|
-
intersections.forEach(
|
|
1133
|
-
allIntersections.push({
|
|
1361
|
+
intersections.forEach(p => {
|
|
1362
|
+
allIntersections.push({
|
|
1363
|
+
identifier: path.identifier,
|
|
1364
|
+
isCW: path.isCW,
|
|
1365
|
+
point: p
|
|
1366
|
+
});
|
|
1134
1367
|
});
|
|
1135
1368
|
}
|
|
1136
1369
|
});
|
|
@@ -1139,114 +1372,148 @@ class SVGLoader extends THREE.Loader {
|
|
|
1139
1372
|
});
|
|
1140
1373
|
return allIntersections;
|
|
1141
1374
|
}
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1375
|
+
|
|
1376
|
+
function isHoleTo(simplePath, allPaths, scanlineMinX, scanlineMaxX, _fillRule) {
|
|
1377
|
+
if (_fillRule === null || _fillRule === undefined || _fillRule === '') {
|
|
1378
|
+
_fillRule = 'nonzero';
|
|
1145
1379
|
}
|
|
1146
|
-
|
|
1380
|
+
|
|
1381
|
+
const centerBoundingBox = new Vector2();
|
|
1147
1382
|
simplePath.boundingBox.getCenter(centerBoundingBox);
|
|
1148
|
-
const scanline = [new
|
|
1383
|
+
const scanline = [new Vector2(scanlineMinX, centerBoundingBox.y), new Vector2(scanlineMaxX, centerBoundingBox.y)];
|
|
1149
1384
|
const scanlineIntersections = getScanlineIntersections(scanline, simplePath.boundingBox, allPaths);
|
|
1150
1385
|
scanlineIntersections.sort((i1, i2) => {
|
|
1151
1386
|
return i1.point.x - i2.point.x;
|
|
1152
1387
|
});
|
|
1153
1388
|
const baseIntersections = [];
|
|
1154
1389
|
const otherIntersections = [];
|
|
1155
|
-
scanlineIntersections.forEach(
|
|
1156
|
-
if (
|
|
1157
|
-
baseIntersections.push(
|
|
1390
|
+
scanlineIntersections.forEach(i => {
|
|
1391
|
+
if (i.identifier === simplePath.identifier) {
|
|
1392
|
+
baseIntersections.push(i);
|
|
1158
1393
|
} else {
|
|
1159
|
-
otherIntersections.push(
|
|
1394
|
+
otherIntersections.push(i);
|
|
1160
1395
|
}
|
|
1161
1396
|
});
|
|
1162
|
-
const firstXOfPath = baseIntersections[0].point.x;
|
|
1397
|
+
const firstXOfPath = baseIntersections[0].point.x; // build up the path hierarchy
|
|
1398
|
+
|
|
1163
1399
|
const stack = [];
|
|
1164
1400
|
let i = 0;
|
|
1401
|
+
|
|
1165
1402
|
while (i < otherIntersections.length && otherIntersections[i].point.x < firstXOfPath) {
|
|
1166
1403
|
if (stack.length > 0 && stack[stack.length - 1] === otherIntersections[i].identifier) {
|
|
1167
1404
|
stack.pop();
|
|
1168
1405
|
} else {
|
|
1169
1406
|
stack.push(otherIntersections[i].identifier);
|
|
1170
1407
|
}
|
|
1408
|
+
|
|
1171
1409
|
i++;
|
|
1172
1410
|
}
|
|
1411
|
+
|
|
1173
1412
|
stack.push(simplePath.identifier);
|
|
1174
|
-
|
|
1413
|
+
|
|
1414
|
+
if (_fillRule === 'evenodd') {
|
|
1175
1415
|
const isHole = stack.length % 2 === 0 ? true : false;
|
|
1176
1416
|
const isHoleFor = stack[stack.length - 2];
|
|
1177
|
-
return {
|
|
1178
|
-
|
|
1417
|
+
return {
|
|
1418
|
+
identifier: simplePath.identifier,
|
|
1419
|
+
isHole: isHole,
|
|
1420
|
+
for: isHoleFor
|
|
1421
|
+
};
|
|
1422
|
+
} else if (_fillRule === 'nonzero') {
|
|
1423
|
+
// check if path is a hole by counting the amount of paths with alternating rotations it has to cross.
|
|
1179
1424
|
let isHole = true;
|
|
1180
1425
|
let isHoleFor = null;
|
|
1181
1426
|
let lastCWValue = null;
|
|
1182
|
-
|
|
1183
|
-
|
|
1427
|
+
|
|
1428
|
+
for (let i = 0; i < stack.length; i++) {
|
|
1429
|
+
const identifier = stack[i];
|
|
1430
|
+
|
|
1184
1431
|
if (isHole) {
|
|
1185
|
-
lastCWValue = allPaths[
|
|
1432
|
+
lastCWValue = allPaths[identifier].isCW;
|
|
1186
1433
|
isHole = false;
|
|
1187
|
-
isHoleFor =
|
|
1188
|
-
} else if (lastCWValue !== allPaths[
|
|
1189
|
-
lastCWValue = allPaths[
|
|
1434
|
+
isHoleFor = identifier;
|
|
1435
|
+
} else if (lastCWValue !== allPaths[identifier].isCW) {
|
|
1436
|
+
lastCWValue = allPaths[identifier].isCW;
|
|
1190
1437
|
isHole = true;
|
|
1191
1438
|
}
|
|
1192
1439
|
}
|
|
1193
|
-
|
|
1440
|
+
|
|
1441
|
+
return {
|
|
1442
|
+
identifier: simplePath.identifier,
|
|
1443
|
+
isHole: isHole,
|
|
1444
|
+
for: isHoleFor
|
|
1445
|
+
};
|
|
1194
1446
|
} else {
|
|
1195
1447
|
console.warn('fill-rule: "' + _fillRule + '" is currently not implemented.');
|
|
1196
1448
|
}
|
|
1197
|
-
}
|
|
1449
|
+
} // check for self intersecting paths
|
|
1450
|
+
// TODO
|
|
1451
|
+
// check intersecting paths
|
|
1452
|
+
// TODO
|
|
1453
|
+
// prepare paths for hole detection
|
|
1454
|
+
|
|
1455
|
+
|
|
1198
1456
|
let identifier = 0;
|
|
1199
1457
|
let scanlineMinX = BIGNUMBER;
|
|
1200
1458
|
let scanlineMaxX = -BIGNUMBER;
|
|
1201
|
-
let simplePaths = shapePath.subPaths.map(
|
|
1459
|
+
let simplePaths = shapePath.subPaths.map(p => {
|
|
1202
1460
|
const points = p.getPoints();
|
|
1203
1461
|
let maxY = -BIGNUMBER;
|
|
1204
1462
|
let minY = BIGNUMBER;
|
|
1205
1463
|
let maxX = -BIGNUMBER;
|
|
1206
|
-
let minX = BIGNUMBER;
|
|
1464
|
+
let minX = BIGNUMBER; //points.forEach(p => p.y *= -1);
|
|
1465
|
+
|
|
1207
1466
|
for (let i = 0; i < points.length; i++) {
|
|
1208
|
-
const
|
|
1209
|
-
|
|
1210
|
-
|
|
1467
|
+
const p = points[i];
|
|
1468
|
+
|
|
1469
|
+
if (p.y > maxY) {
|
|
1470
|
+
maxY = p.y;
|
|
1211
1471
|
}
|
|
1212
|
-
|
|
1213
|
-
|
|
1472
|
+
|
|
1473
|
+
if (p.y < minY) {
|
|
1474
|
+
minY = p.y;
|
|
1214
1475
|
}
|
|
1215
|
-
|
|
1216
|
-
|
|
1476
|
+
|
|
1477
|
+
if (p.x > maxX) {
|
|
1478
|
+
maxX = p.x;
|
|
1217
1479
|
}
|
|
1218
|
-
|
|
1219
|
-
|
|
1480
|
+
|
|
1481
|
+
if (p.x < minX) {
|
|
1482
|
+
minX = p.x;
|
|
1220
1483
|
}
|
|
1221
|
-
}
|
|
1484
|
+
} //
|
|
1485
|
+
|
|
1486
|
+
|
|
1222
1487
|
if (scanlineMaxX <= maxX) {
|
|
1223
1488
|
scanlineMaxX = maxX + 1;
|
|
1224
1489
|
}
|
|
1490
|
+
|
|
1225
1491
|
if (scanlineMinX >= minX) {
|
|
1226
1492
|
scanlineMinX = minX - 1;
|
|
1227
1493
|
}
|
|
1494
|
+
|
|
1228
1495
|
return {
|
|
1229
1496
|
curves: p.curves,
|
|
1230
|
-
points,
|
|
1231
|
-
isCW:
|
|
1497
|
+
points: points,
|
|
1498
|
+
isCW: ShapeUtils.isClockWise(points),
|
|
1232
1499
|
identifier: identifier++,
|
|
1233
|
-
boundingBox: new
|
|
1500
|
+
boundingBox: new Box2(new Vector2(minX, minY), new Vector2(maxX, maxY))
|
|
1234
1501
|
};
|
|
1235
1502
|
});
|
|
1236
|
-
simplePaths = simplePaths.filter(
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
);
|
|
1503
|
+
simplePaths = simplePaths.filter(sp => sp.points.length > 1); // check if path is solid or a hole
|
|
1504
|
+
|
|
1505
|
+
const isAHole = simplePaths.map(p => isHoleTo(p, simplePaths, scanlineMinX, scanlineMaxX, shapePath.userData.style.fillRule));
|
|
1240
1506
|
const shapesToReturn = [];
|
|
1241
|
-
simplePaths.forEach(
|
|
1507
|
+
simplePaths.forEach(p => {
|
|
1242
1508
|
const amIAHole = isAHole[p.identifier];
|
|
1509
|
+
|
|
1243
1510
|
if (!amIAHole.isHole) {
|
|
1244
|
-
const shape = new
|
|
1511
|
+
const shape = new Shape();
|
|
1245
1512
|
shape.curves = p.curves;
|
|
1246
|
-
const holes = isAHole.filter(
|
|
1247
|
-
holes.forEach(
|
|
1513
|
+
const holes = isAHole.filter(h => h.isHole && h.for === p.identifier);
|
|
1514
|
+
holes.forEach(h => {
|
|
1248
1515
|
const hole = simplePaths[h.identifier];
|
|
1249
|
-
const path = new
|
|
1516
|
+
const path = new Path();
|
|
1250
1517
|
path.curves = hole.curves;
|
|
1251
1518
|
shape.holes.push(path);
|
|
1252
1519
|
});
|
|
@@ -1255,12 +1522,19 @@ class SVGLoader extends THREE.Loader {
|
|
|
1255
1522
|
});
|
|
1256
1523
|
return shapesToReturn;
|
|
1257
1524
|
}
|
|
1525
|
+
|
|
1258
1526
|
static getStrokeStyle(width, color, lineJoin, lineCap, miterLimit) {
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1527
|
+
// Param width: Stroke width
|
|
1528
|
+
// Param color: As returned by THREE.Color.getStyle()
|
|
1529
|
+
// Param lineJoin: One of "round", "bevel", "miter" or "miter-limit"
|
|
1530
|
+
// Param lineCap: One of "round", "square" or "butt"
|
|
1531
|
+
// Param miterLimit: Maximum join length, in multiples of the "width" parameter (join is truncated if it exceeds that distance)
|
|
1532
|
+
// Returns style object
|
|
1533
|
+
width = width !== undefined ? width : 1;
|
|
1534
|
+
color = color !== undefined ? color : '#000';
|
|
1535
|
+
lineJoin = lineJoin !== undefined ? lineJoin : 'miter';
|
|
1536
|
+
lineCap = lineCap !== undefined ? lineCap : 'butt';
|
|
1537
|
+
miterLimit = miterLimit !== undefined ? miterLimit : 4;
|
|
1264
1538
|
return {
|
|
1265
1539
|
strokeColor: color,
|
|
1266
1540
|
strokeWidth: width,
|
|
@@ -1269,74 +1543,98 @@ class SVGLoader extends THREE.Loader {
|
|
|
1269
1543
|
strokeMiterLimit: miterLimit
|
|
1270
1544
|
};
|
|
1271
1545
|
}
|
|
1546
|
+
|
|
1272
1547
|
static pointsToStroke(points, style, arcDivisions, minDistance) {
|
|
1548
|
+
// Generates a stroke with some witdh around the given path.
|
|
1549
|
+
// The path can be open or closed (last point equals to first point)
|
|
1550
|
+
// Param points: Array of Vector2D (the path). Minimum 2 points.
|
|
1551
|
+
// Param style: Object with SVG properties as returned by SVGLoader.getStrokeStyle(), or SVGLoader.parse() in the path.userData.style object
|
|
1552
|
+
// Params arcDivisions: Arc divisions for round joins and endcaps. (Optional)
|
|
1553
|
+
// Param minDistance: Points closer to this distance will be merged. (Optional)
|
|
1554
|
+
// Returns BufferGeometry with stroke triangles (In plane z = 0). UV coordinates are generated ('u' along path. 'v' across it, from left to right)
|
|
1273
1555
|
const vertices = [];
|
|
1274
1556
|
const normals = [];
|
|
1275
1557
|
const uvs = [];
|
|
1558
|
+
|
|
1276
1559
|
if (SVGLoader.pointsToStrokeWithBuffers(points, style, arcDivisions, minDistance, vertices, normals, uvs) === 0) {
|
|
1277
1560
|
return null;
|
|
1278
1561
|
}
|
|
1279
|
-
|
|
1280
|
-
geometry
|
|
1281
|
-
geometry.setAttribute(
|
|
1282
|
-
geometry.setAttribute(
|
|
1562
|
+
|
|
1563
|
+
const geometry = new BufferGeometry();
|
|
1564
|
+
geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));
|
|
1565
|
+
geometry.setAttribute('normal', new Float32BufferAttribute(normals, 3));
|
|
1566
|
+
geometry.setAttribute('uv', new Float32BufferAttribute(uvs, 2));
|
|
1283
1567
|
return geometry;
|
|
1284
1568
|
}
|
|
1569
|
+
|
|
1285
1570
|
static pointsToStrokeWithBuffers(points, style, arcDivisions, minDistance, vertices, normals, uvs, vertexOffset) {
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
const
|
|
1293
|
-
const
|
|
1294
|
-
const
|
|
1295
|
-
const
|
|
1296
|
-
const
|
|
1297
|
-
const
|
|
1298
|
-
const
|
|
1299
|
-
const
|
|
1300
|
-
const
|
|
1301
|
-
const
|
|
1302
|
-
const
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1571
|
+
// This function can be called to update existing arrays or buffers.
|
|
1572
|
+
// Accepts same parameters as pointsToStroke, plus the buffers and optional offset.
|
|
1573
|
+
// Param vertexOffset: Offset vertices to start writing in the buffers (3 elements/vertex for vertices and normals, and 2 elements/vertex for uvs)
|
|
1574
|
+
// Returns number of written vertices / normals / uvs pairs
|
|
1575
|
+
// if 'vertices' parameter is undefined no triangles will be generated, but the returned vertices count will still be valid (useful to preallocate the buffers)
|
|
1576
|
+
// 'normals' and 'uvs' buffers are optional
|
|
1577
|
+
const tempV2_1 = new Vector2();
|
|
1578
|
+
const tempV2_2 = new Vector2();
|
|
1579
|
+
const tempV2_3 = new Vector2();
|
|
1580
|
+
const tempV2_4 = new Vector2();
|
|
1581
|
+
const tempV2_5 = new Vector2();
|
|
1582
|
+
const tempV2_6 = new Vector2();
|
|
1583
|
+
const tempV2_7 = new Vector2();
|
|
1584
|
+
const lastPointL = new Vector2();
|
|
1585
|
+
const lastPointR = new Vector2();
|
|
1586
|
+
const point0L = new Vector2();
|
|
1587
|
+
const point0R = new Vector2();
|
|
1588
|
+
const currentPointL = new Vector2();
|
|
1589
|
+
const currentPointR = new Vector2();
|
|
1590
|
+
const nextPointL = new Vector2();
|
|
1591
|
+
const nextPointR = new Vector2();
|
|
1592
|
+
const innerPoint = new Vector2();
|
|
1593
|
+
const outerPoint = new Vector2();
|
|
1594
|
+
arcDivisions = arcDivisions !== undefined ? arcDivisions : 12;
|
|
1595
|
+
minDistance = minDistance !== undefined ? minDistance : 0.001;
|
|
1596
|
+
vertexOffset = vertexOffset !== undefined ? vertexOffset : 0; // First ensure there are no duplicated points
|
|
1597
|
+
|
|
1306
1598
|
points = removeDuplicatedPoints(points);
|
|
1307
1599
|
const numPoints = points.length;
|
|
1308
|
-
if (numPoints < 2)
|
|
1309
|
-
return 0;
|
|
1600
|
+
if (numPoints < 2) return 0;
|
|
1310
1601
|
const isClosed = points[0].equals(points[numPoints - 1]);
|
|
1311
1602
|
let currentPoint;
|
|
1312
1603
|
let previousPoint = points[0];
|
|
1313
1604
|
let nextPoint;
|
|
1314
1605
|
const strokeWidth2 = style.strokeWidth / 2;
|
|
1315
1606
|
const deltaU = 1 / (numPoints - 1);
|
|
1316
|
-
let u0 = 0,
|
|
1607
|
+
let u0 = 0,
|
|
1608
|
+
u1;
|
|
1317
1609
|
let innerSideModified;
|
|
1318
1610
|
let joinIsOnLeftSide;
|
|
1319
1611
|
let isMiter;
|
|
1320
1612
|
let initialJoinIsOnLeftSide = false;
|
|
1321
1613
|
let numVertices = 0;
|
|
1322
1614
|
let currentCoordinate = vertexOffset * 3;
|
|
1323
|
-
let currentCoordinateUV = vertexOffset * 2;
|
|
1615
|
+
let currentCoordinateUV = vertexOffset * 2; // Get initial left and right stroke points
|
|
1616
|
+
|
|
1324
1617
|
getNormal(points[0], points[1], tempV2_1).multiplyScalar(strokeWidth2);
|
|
1325
1618
|
lastPointL.copy(points[0]).sub(tempV2_1);
|
|
1326
1619
|
lastPointR.copy(points[0]).add(tempV2_1);
|
|
1327
1620
|
point0L.copy(lastPointL);
|
|
1328
1621
|
point0R.copy(lastPointR);
|
|
1622
|
+
|
|
1329
1623
|
for (let iPoint = 1; iPoint < numPoints; iPoint++) {
|
|
1330
|
-
currentPoint = points[iPoint];
|
|
1624
|
+
currentPoint = points[iPoint]; // Get next point
|
|
1625
|
+
|
|
1331
1626
|
if (iPoint === numPoints - 1) {
|
|
1332
1627
|
if (isClosed) {
|
|
1628
|
+
// Skip duplicated initial point
|
|
1333
1629
|
nextPoint = points[1];
|
|
1334
1630
|
} else {
|
|
1335
|
-
nextPoint =
|
|
1631
|
+
nextPoint = undefined;
|
|
1336
1632
|
}
|
|
1337
1633
|
} else {
|
|
1338
1634
|
nextPoint = points[iPoint + 1];
|
|
1339
|
-
}
|
|
1635
|
+
} // Normal of previous segment in tempV2_1
|
|
1636
|
+
|
|
1637
|
+
|
|
1340
1638
|
const normal1 = tempV2_1;
|
|
1341
1639
|
getNormal(previousPoint, currentPoint, normal1);
|
|
1342
1640
|
tempV2_3.copy(normal1).multiplyScalar(strokeWidth2);
|
|
@@ -1344,22 +1642,27 @@ class SVGLoader extends THREE.Loader {
|
|
|
1344
1642
|
currentPointR.copy(currentPoint).add(tempV2_3);
|
|
1345
1643
|
u1 = u0 + deltaU;
|
|
1346
1644
|
innerSideModified = false;
|
|
1347
|
-
|
|
1645
|
+
|
|
1646
|
+
if (nextPoint !== undefined) {
|
|
1647
|
+
// Normal of next segment in tempV2_2
|
|
1348
1648
|
getNormal(currentPoint, nextPoint, tempV2_2);
|
|
1349
1649
|
tempV2_3.copy(tempV2_2).multiplyScalar(strokeWidth2);
|
|
1350
1650
|
nextPointL.copy(currentPoint).sub(tempV2_3);
|
|
1351
1651
|
nextPointR.copy(currentPoint).add(tempV2_3);
|
|
1352
1652
|
joinIsOnLeftSide = true;
|
|
1353
1653
|
tempV2_3.subVectors(nextPoint, previousPoint);
|
|
1654
|
+
|
|
1354
1655
|
if (normal1.dot(tempV2_3) < 0) {
|
|
1355
1656
|
joinIsOnLeftSide = false;
|
|
1356
1657
|
}
|
|
1357
|
-
|
|
1358
|
-
|
|
1658
|
+
|
|
1659
|
+
if (iPoint === 1) initialJoinIsOnLeftSide = joinIsOnLeftSide;
|
|
1359
1660
|
tempV2_3.subVectors(nextPoint, currentPoint);
|
|
1360
1661
|
tempV2_3.normalize();
|
|
1361
|
-
const dot = Math.abs(normal1.dot(tempV2_3));
|
|
1662
|
+
const dot = Math.abs(normal1.dot(tempV2_3)); // If path is straight, don't create join
|
|
1663
|
+
|
|
1362
1664
|
if (dot !== 0) {
|
|
1665
|
+
// Compute inner and outer segment intersections
|
|
1363
1666
|
const miterSide = strokeWidth2 / dot;
|
|
1364
1667
|
tempV2_3.multiplyScalar(-miterSide);
|
|
1365
1668
|
tempV2_4.subVectors(currentPoint, previousPoint);
|
|
@@ -1370,13 +1673,16 @@ class SVGLoader extends THREE.Loader {
|
|
|
1370
1673
|
tempV2_4.divideScalar(segmentLengthPrev);
|
|
1371
1674
|
tempV2_6.subVectors(nextPoint, currentPoint);
|
|
1372
1675
|
const segmentLengthNext = tempV2_6.length();
|
|
1373
|
-
tempV2_6.divideScalar(segmentLengthNext);
|
|
1676
|
+
tempV2_6.divideScalar(segmentLengthNext); // Check that previous and next segments doesn't overlap with the innerPoint of intersection
|
|
1677
|
+
|
|
1374
1678
|
if (tempV2_4.dot(innerPoint) < segmentLengthPrev && tempV2_6.dot(innerPoint) < segmentLengthNext) {
|
|
1375
1679
|
innerSideModified = true;
|
|
1376
1680
|
}
|
|
1681
|
+
|
|
1377
1682
|
outerPoint.copy(tempV2_5).add(currentPoint);
|
|
1378
1683
|
innerPoint.add(currentPoint);
|
|
1379
1684
|
isMiter = false;
|
|
1685
|
+
|
|
1380
1686
|
if (innerSideModified) {
|
|
1381
1687
|
if (joinIsOnLeftSide) {
|
|
1382
1688
|
nextPointR.copy(innerPoint);
|
|
@@ -1386,30 +1692,41 @@ class SVGLoader extends THREE.Loader {
|
|
|
1386
1692
|
currentPointL.copy(innerPoint);
|
|
1387
1693
|
}
|
|
1388
1694
|
} else {
|
|
1695
|
+
// The segment triangles are generated here if there was overlapping
|
|
1389
1696
|
makeSegmentTriangles();
|
|
1390
1697
|
}
|
|
1698
|
+
|
|
1391
1699
|
switch (style.strokeLineJoin) {
|
|
1392
|
-
case
|
|
1700
|
+
case 'bevel':
|
|
1393
1701
|
makeSegmentWithBevelJoin(joinIsOnLeftSide, innerSideModified, u1);
|
|
1394
1702
|
break;
|
|
1395
|
-
|
|
1396
|
-
|
|
1703
|
+
|
|
1704
|
+
case 'round':
|
|
1705
|
+
// Segment triangles
|
|
1706
|
+
createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide, innerSideModified); // Join triangles
|
|
1707
|
+
|
|
1397
1708
|
if (joinIsOnLeftSide) {
|
|
1398
1709
|
makeCircularSector(currentPoint, currentPointL, nextPointL, u1, 0);
|
|
1399
1710
|
} else {
|
|
1400
1711
|
makeCircularSector(currentPoint, nextPointR, currentPointR, u1, 1);
|
|
1401
1712
|
}
|
|
1713
|
+
|
|
1402
1714
|
break;
|
|
1403
|
-
|
|
1404
|
-
case
|
|
1715
|
+
|
|
1716
|
+
case 'miter':
|
|
1717
|
+
case 'miter-clip':
|
|
1405
1718
|
default:
|
|
1406
1719
|
const miterFraction = strokeWidth2 * style.strokeMiterLimit / miterLength2;
|
|
1720
|
+
|
|
1407
1721
|
if (miterFraction < 1) {
|
|
1408
|
-
|
|
1722
|
+
// The join miter length exceeds the miter limit
|
|
1723
|
+
if (style.strokeLineJoin !== 'miter-clip') {
|
|
1409
1724
|
makeSegmentWithBevelJoin(joinIsOnLeftSide, innerSideModified, u1);
|
|
1410
1725
|
break;
|
|
1411
1726
|
} else {
|
|
1412
|
-
|
|
1727
|
+
// Segment triangles
|
|
1728
|
+
createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide, innerSideModified); // Miter-clip join triangles
|
|
1729
|
+
|
|
1413
1730
|
if (joinIsOnLeftSide) {
|
|
1414
1731
|
tempV2_6.subVectors(outerPoint, currentPointL).multiplyScalar(miterFraction).add(currentPointL);
|
|
1415
1732
|
tempV2_7.subVectors(outerPoint, nextPointL).multiplyScalar(miterFraction).add(nextPointL);
|
|
@@ -1437,7 +1754,9 @@ class SVGLoader extends THREE.Loader {
|
|
|
1437
1754
|
}
|
|
1438
1755
|
}
|
|
1439
1756
|
} else {
|
|
1757
|
+
// Miter join segment triangles
|
|
1440
1758
|
if (innerSideModified) {
|
|
1759
|
+
// Optimized segment + join triangles
|
|
1441
1760
|
if (joinIsOnLeftSide) {
|
|
1442
1761
|
addVertex(lastPointR, u0, 1);
|
|
1443
1762
|
addVertex(lastPointL, u0, 0);
|
|
@@ -1453,12 +1772,14 @@ class SVGLoader extends THREE.Loader {
|
|
|
1453
1772
|
addVertex(innerPoint, u1, 0);
|
|
1454
1773
|
addVertex(outerPoint, u1, 1);
|
|
1455
1774
|
}
|
|
1775
|
+
|
|
1456
1776
|
if (joinIsOnLeftSide) {
|
|
1457
1777
|
nextPointL.copy(outerPoint);
|
|
1458
1778
|
} else {
|
|
1459
1779
|
nextPointR.copy(outerPoint);
|
|
1460
1780
|
}
|
|
1461
1781
|
} else {
|
|
1782
|
+
// Add extra miter join triangles
|
|
1462
1783
|
if (joinIsOnLeftSide) {
|
|
1463
1784
|
addVertex(currentPointL, u1, 0);
|
|
1464
1785
|
addVertex(outerPoint, u1, 0);
|
|
@@ -1475,37 +1796,51 @@ class SVGLoader extends THREE.Loader {
|
|
|
1475
1796
|
addVertex(nextPointR, u1, 1);
|
|
1476
1797
|
}
|
|
1477
1798
|
}
|
|
1799
|
+
|
|
1478
1800
|
isMiter = true;
|
|
1479
1801
|
}
|
|
1802
|
+
|
|
1480
1803
|
break;
|
|
1481
1804
|
}
|
|
1482
1805
|
} else {
|
|
1806
|
+
// The segment triangles are generated here when two consecutive points are collinear
|
|
1483
1807
|
makeSegmentTriangles();
|
|
1484
1808
|
}
|
|
1485
1809
|
} else {
|
|
1810
|
+
// The segment triangles are generated here if it is the ending segment
|
|
1486
1811
|
makeSegmentTriangles();
|
|
1487
1812
|
}
|
|
1813
|
+
|
|
1488
1814
|
if (!isClosed && iPoint === numPoints - 1) {
|
|
1815
|
+
// Start line endcap
|
|
1489
1816
|
addCapGeometry(points[0], point0L, point0R, joinIsOnLeftSide, true, u0);
|
|
1490
|
-
}
|
|
1817
|
+
} // Increment loop variables
|
|
1818
|
+
|
|
1819
|
+
|
|
1491
1820
|
u0 = u1;
|
|
1492
1821
|
previousPoint = currentPoint;
|
|
1493
1822
|
lastPointL.copy(nextPointL);
|
|
1494
1823
|
lastPointR.copy(nextPointR);
|
|
1495
1824
|
}
|
|
1825
|
+
|
|
1496
1826
|
if (!isClosed) {
|
|
1827
|
+
// Ending line endcap
|
|
1497
1828
|
addCapGeometry(currentPoint, currentPointL, currentPointR, joinIsOnLeftSide, false, u1);
|
|
1498
1829
|
} else if (innerSideModified && vertices) {
|
|
1830
|
+
// Modify path first segment vertices to adjust to the segments inner and outer intersections
|
|
1499
1831
|
let lastOuter = outerPoint;
|
|
1500
1832
|
let lastInner = innerPoint;
|
|
1833
|
+
|
|
1501
1834
|
if (initialJoinIsOnLeftSide !== joinIsOnLeftSide) {
|
|
1502
1835
|
lastOuter = innerPoint;
|
|
1503
1836
|
lastInner = outerPoint;
|
|
1504
1837
|
}
|
|
1838
|
+
|
|
1505
1839
|
if (joinIsOnLeftSide) {
|
|
1506
1840
|
if (isMiter || initialJoinIsOnLeftSide) {
|
|
1507
1841
|
lastInner.toArray(vertices, 0 * 3);
|
|
1508
1842
|
lastInner.toArray(vertices, 3 * 3);
|
|
1843
|
+
|
|
1509
1844
|
if (isMiter) {
|
|
1510
1845
|
lastOuter.toArray(vertices, 1 * 3);
|
|
1511
1846
|
}
|
|
@@ -1514,45 +1849,57 @@ class SVGLoader extends THREE.Loader {
|
|
|
1514
1849
|
if (isMiter || !initialJoinIsOnLeftSide) {
|
|
1515
1850
|
lastInner.toArray(vertices, 1 * 3);
|
|
1516
1851
|
lastInner.toArray(vertices, 3 * 3);
|
|
1852
|
+
|
|
1517
1853
|
if (isMiter) {
|
|
1518
1854
|
lastOuter.toArray(vertices, 0 * 3);
|
|
1519
1855
|
}
|
|
1520
1856
|
}
|
|
1521
1857
|
}
|
|
1522
1858
|
}
|
|
1523
|
-
|
|
1859
|
+
|
|
1860
|
+
return numVertices; // -- End of algorithm
|
|
1861
|
+
// -- Functions
|
|
1862
|
+
|
|
1524
1863
|
function getNormal(p1, p2, result) {
|
|
1525
1864
|
result.subVectors(p2, p1);
|
|
1526
1865
|
return result.set(-result.y, result.x).normalize();
|
|
1527
1866
|
}
|
|
1867
|
+
|
|
1528
1868
|
function addVertex(position, u, v) {
|
|
1529
1869
|
if (vertices) {
|
|
1530
1870
|
vertices[currentCoordinate] = position.x;
|
|
1531
1871
|
vertices[currentCoordinate + 1] = position.y;
|
|
1532
1872
|
vertices[currentCoordinate + 2] = 0;
|
|
1873
|
+
|
|
1533
1874
|
if (normals) {
|
|
1534
1875
|
normals[currentCoordinate] = 0;
|
|
1535
1876
|
normals[currentCoordinate + 1] = 0;
|
|
1536
1877
|
normals[currentCoordinate + 2] = 1;
|
|
1537
1878
|
}
|
|
1879
|
+
|
|
1538
1880
|
currentCoordinate += 3;
|
|
1881
|
+
|
|
1539
1882
|
if (uvs) {
|
|
1540
1883
|
uvs[currentCoordinateUV] = u;
|
|
1541
1884
|
uvs[currentCoordinateUV + 1] = v;
|
|
1542
1885
|
currentCoordinateUV += 2;
|
|
1543
1886
|
}
|
|
1544
1887
|
}
|
|
1888
|
+
|
|
1545
1889
|
numVertices += 3;
|
|
1546
1890
|
}
|
|
1891
|
+
|
|
1547
1892
|
function makeCircularSector(center, p1, p2, u, v) {
|
|
1893
|
+
// param p1, p2: Points in the circle arc.
|
|
1894
|
+
// p1 and p2 are in clockwise direction.
|
|
1548
1895
|
tempV2_1.copy(p1).sub(center).normalize();
|
|
1549
1896
|
tempV2_2.copy(p2).sub(center).normalize();
|
|
1550
1897
|
let angle = Math.PI;
|
|
1551
1898
|
const dot = tempV2_1.dot(tempV2_2);
|
|
1552
|
-
if (Math.abs(dot) < 1)
|
|
1553
|
-
angle = Math.abs(Math.acos(dot));
|
|
1899
|
+
if (Math.abs(dot) < 1) angle = Math.abs(Math.acos(dot));
|
|
1554
1900
|
angle /= arcDivisions;
|
|
1555
1901
|
tempV2_3.copy(p1);
|
|
1902
|
+
|
|
1556
1903
|
for (let i = 0, il = arcDivisions - 1; i < il; i++) {
|
|
1557
1904
|
tempV2_4.copy(tempV2_3).rotateAround(center, angle);
|
|
1558
1905
|
addVertex(tempV2_3, u, v);
|
|
@@ -1560,10 +1907,12 @@ class SVGLoader extends THREE.Loader {
|
|
|
1560
1907
|
addVertex(center, u, 0.5);
|
|
1561
1908
|
tempV2_3.copy(tempV2_4);
|
|
1562
1909
|
}
|
|
1910
|
+
|
|
1563
1911
|
addVertex(tempV2_4, u, v);
|
|
1564
1912
|
addVertex(p2, u, v);
|
|
1565
1913
|
addVertex(center, u, 0.5);
|
|
1566
1914
|
}
|
|
1915
|
+
|
|
1567
1916
|
function makeSegmentTriangles() {
|
|
1568
1917
|
addVertex(lastPointR, u0, 1);
|
|
1569
1918
|
addVertex(lastPointL, u0, 0);
|
|
@@ -1572,31 +1921,38 @@ class SVGLoader extends THREE.Loader {
|
|
|
1572
1921
|
addVertex(currentPointL, u1, 1);
|
|
1573
1922
|
addVertex(currentPointR, u1, 0);
|
|
1574
1923
|
}
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1924
|
+
|
|
1925
|
+
function makeSegmentWithBevelJoin(joinIsOnLeftSide, innerSideModified, u) {
|
|
1926
|
+
if (innerSideModified) {
|
|
1927
|
+
// Optimized segment + bevel triangles
|
|
1928
|
+
if (joinIsOnLeftSide) {
|
|
1929
|
+
// Path segments triangles
|
|
1578
1930
|
addVertex(lastPointR, u0, 1);
|
|
1579
1931
|
addVertex(lastPointL, u0, 0);
|
|
1580
1932
|
addVertex(currentPointL, u1, 0);
|
|
1581
1933
|
addVertex(lastPointR, u0, 1);
|
|
1582
1934
|
addVertex(currentPointL, u1, 0);
|
|
1583
|
-
addVertex(innerPoint, u1, 1);
|
|
1935
|
+
addVertex(innerPoint, u1, 1); // Bevel join triangle
|
|
1936
|
+
|
|
1584
1937
|
addVertex(currentPointL, u, 0);
|
|
1585
1938
|
addVertex(nextPointL, u, 0);
|
|
1586
1939
|
addVertex(innerPoint, u, 0.5);
|
|
1587
1940
|
} else {
|
|
1941
|
+
// Path segments triangles
|
|
1588
1942
|
addVertex(lastPointR, u0, 1);
|
|
1589
1943
|
addVertex(lastPointL, u0, 0);
|
|
1590
1944
|
addVertex(currentPointR, u1, 1);
|
|
1591
1945
|
addVertex(lastPointL, u0, 0);
|
|
1592
1946
|
addVertex(innerPoint, u1, 0);
|
|
1593
|
-
addVertex(currentPointR, u1, 1);
|
|
1947
|
+
addVertex(currentPointR, u1, 1); // Bevel join triangle
|
|
1948
|
+
|
|
1594
1949
|
addVertex(currentPointR, u, 1);
|
|
1595
1950
|
addVertex(nextPointR, u, 0);
|
|
1596
1951
|
addVertex(innerPoint, u, 0.5);
|
|
1597
1952
|
}
|
|
1598
1953
|
} else {
|
|
1599
|
-
|
|
1954
|
+
// Bevel join triangle. The segment triangles are done in the main loop
|
|
1955
|
+
if (joinIsOnLeftSide) {
|
|
1600
1956
|
addVertex(currentPointL, u, 0);
|
|
1601
1957
|
addVertex(nextPointL, u, 0);
|
|
1602
1958
|
addVertex(currentPoint, u, 0.5);
|
|
@@ -1607,9 +1963,10 @@ class SVGLoader extends THREE.Loader {
|
|
|
1607
1963
|
}
|
|
1608
1964
|
}
|
|
1609
1965
|
}
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1966
|
+
|
|
1967
|
+
function createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide, innerSideModified) {
|
|
1968
|
+
if (innerSideModified) {
|
|
1969
|
+
if (joinIsOnLeftSide) {
|
|
1613
1970
|
addVertex(lastPointR, u0, 1);
|
|
1614
1971
|
addVertex(lastPointL, u0, 0);
|
|
1615
1972
|
addVertex(currentPointL, u1, 0);
|
|
@@ -1638,22 +1995,28 @@ class SVGLoader extends THREE.Loader {
|
|
|
1638
1995
|
}
|
|
1639
1996
|
}
|
|
1640
1997
|
}
|
|
1641
|
-
|
|
1998
|
+
|
|
1999
|
+
function addCapGeometry(center, p1, p2, joinIsOnLeftSide, start, u) {
|
|
2000
|
+
// param center: End point of the path
|
|
2001
|
+
// param p1, p2: Left and right cap points
|
|
1642
2002
|
switch (style.strokeLineCap) {
|
|
1643
|
-
case
|
|
2003
|
+
case 'round':
|
|
1644
2004
|
if (start) {
|
|
1645
2005
|
makeCircularSector(center, p2, p1, u, 0.5);
|
|
1646
2006
|
} else {
|
|
1647
2007
|
makeCircularSector(center, p1, p2, u, 0.5);
|
|
1648
2008
|
}
|
|
2009
|
+
|
|
1649
2010
|
break;
|
|
1650
|
-
|
|
2011
|
+
|
|
2012
|
+
case 'square':
|
|
1651
2013
|
if (start) {
|
|
1652
2014
|
tempV2_1.subVectors(p1, center);
|
|
1653
2015
|
tempV2_2.set(tempV2_1.y, -tempV2_1.x);
|
|
1654
2016
|
tempV2_3.addVectors(tempV2_1, tempV2_2).add(center);
|
|
1655
|
-
tempV2_4.subVectors(tempV2_2, tempV2_1).add(center);
|
|
1656
|
-
|
|
2017
|
+
tempV2_4.subVectors(tempV2_2, tempV2_1).add(center); // Modify already existing vertices
|
|
2018
|
+
|
|
2019
|
+
if (joinIsOnLeftSide) {
|
|
1657
2020
|
tempV2_3.toArray(vertices, 1 * 3);
|
|
1658
2021
|
tempV2_4.toArray(vertices, 0 * 3);
|
|
1659
2022
|
tempV2_4.toArray(vertices, 3 * 3);
|
|
@@ -1667,8 +2030,9 @@ class SVGLoader extends THREE.Loader {
|
|
|
1667
2030
|
tempV2_2.set(tempV2_1.y, -tempV2_1.x);
|
|
1668
2031
|
tempV2_3.addVectors(tempV2_1, tempV2_2).add(center);
|
|
1669
2032
|
tempV2_4.subVectors(tempV2_2, tempV2_1).add(center);
|
|
1670
|
-
const vl = vertices.length;
|
|
1671
|
-
|
|
2033
|
+
const vl = vertices.length; // Modify already existing vertices
|
|
2034
|
+
|
|
2035
|
+
if (joinIsOnLeftSide) {
|
|
1672
2036
|
tempV2_3.toArray(vertices, vl - 1 * 3);
|
|
1673
2037
|
tempV2_4.toArray(vertices, vl - 2 * 3);
|
|
1674
2038
|
tempV2_4.toArray(vertices, vl - 4 * 3);
|
|
@@ -1678,32 +2042,38 @@ class SVGLoader extends THREE.Loader {
|
|
|
1678
2042
|
tempV2_4.toArray(vertices, vl - 4 * 3);
|
|
1679
2043
|
}
|
|
1680
2044
|
}
|
|
1681
|
-
|
|
1682
|
-
case "butt":
|
|
1683
|
-
default:
|
|
2045
|
+
|
|
1684
2046
|
break;
|
|
1685
2047
|
}
|
|
1686
2048
|
}
|
|
1687
|
-
|
|
2049
|
+
|
|
2050
|
+
function removeDuplicatedPoints(points) {
|
|
2051
|
+
// Creates a new array if necessary with duplicated points removed.
|
|
2052
|
+
// This does not remove duplicated initial and ending points of a closed path.
|
|
1688
2053
|
let dupPoints = false;
|
|
1689
|
-
|
|
1690
|
-
|
|
2054
|
+
|
|
2055
|
+
for (let i = 1, n = points.length - 1; i < n; i++) {
|
|
2056
|
+
if (points[i].distanceTo(points[i + 1]) < minDistance) {
|
|
1691
2057
|
dupPoints = true;
|
|
1692
2058
|
break;
|
|
1693
2059
|
}
|
|
1694
2060
|
}
|
|
1695
|
-
|
|
1696
|
-
|
|
2061
|
+
|
|
2062
|
+
if (!dupPoints) return points;
|
|
1697
2063
|
const newPoints = [];
|
|
1698
|
-
newPoints.push(
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
2064
|
+
newPoints.push(points[0]);
|
|
2065
|
+
|
|
2066
|
+
for (let i = 1, n = points.length - 1; i < n; i++) {
|
|
2067
|
+
if (points[i].distanceTo(points[i + 1]) >= minDistance) {
|
|
2068
|
+
newPoints.push(points[i]);
|
|
1702
2069
|
}
|
|
1703
2070
|
}
|
|
1704
|
-
|
|
2071
|
+
|
|
2072
|
+
newPoints.push(points[points.length - 1]);
|
|
1705
2073
|
return newPoints;
|
|
1706
2074
|
}
|
|
1707
2075
|
}
|
|
2076
|
+
|
|
1708
2077
|
}
|
|
1709
|
-
|
|
2078
|
+
|
|
2079
|
+
export { SVGLoader };
|