super-three 0.141.0 → 0.147.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (646) hide show
  1. package/README.md +9 -9
  2. package/build/three.cjs +2441 -1569
  3. package/build/three.js +2441 -1569
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +2847 -1576
  6. package/examples/js/animation/AnimationClipCreator.js +0 -8
  7. package/examples/js/animation/CCDIKSolver.js +50 -67
  8. package/examples/js/animation/MMDAnimationHelper.js +66 -137
  9. package/examples/js/animation/MMDPhysics.js +71 -150
  10. package/examples/js/cameras/CinematicCamera.js +33 -22
  11. package/examples/js/controls/ArcballControls.js +149 -403
  12. package/examples/js/controls/DragControls.js +8 -33
  13. package/examples/js/controls/FirstPersonControls.js +32 -61
  14. package/examples/js/controls/FlyControls.js +29 -63
  15. package/examples/js/controls/OrbitControls.js +125 -103
  16. package/examples/js/controls/PointerLockControls.js +5 -22
  17. package/examples/js/controls/TrackballControls.js +33 -88
  18. package/examples/js/controls/TransformControls.js +101 -182
  19. package/examples/js/csm/CSM.js +4 -39
  20. package/examples/js/csm/CSMFrustum.js +3 -9
  21. package/examples/js/csm/CSMHelper.js +24 -4
  22. package/examples/js/csm/CSMShader.js +2 -6
  23. package/examples/js/curves/CurveExtras.js +27 -27
  24. package/examples/js/curves/NURBSCurve.js +4 -16
  25. package/examples/js/curves/NURBSSurface.js +3 -9
  26. package/examples/js/curves/NURBSUtils.js +8 -45
  27. package/examples/js/effects/AnaglyphEffect.js +6 -20
  28. package/examples/js/effects/AsciiEffect.js +32 -31
  29. package/examples/js/effects/OutlineEffect.js +30 -54
  30. package/examples/js/effects/ParallaxBarrierEffect.js +2 -15
  31. package/examples/js/effects/PeppersGhostEffect.js +14 -41
  32. package/examples/js/effects/StereoEffect.js +2 -6
  33. package/examples/js/environments/RoomEnvironment.js +32 -8
  34. package/examples/js/exporters/ColladaExporter.js +52 -78
  35. package/examples/js/exporters/DRACOExporter.js +22 -34
  36. package/examples/js/exporters/EXRExporter.js +15 -18
  37. package/examples/js/exporters/GLTFExporter.js +168 -345
  38. package/examples/js/exporters/MMDExporter.js +5 -12
  39. package/examples/js/exporters/OBJExporter.js +40 -52
  40. package/examples/js/exporters/PLYExporter.js +50 -57
  41. package/examples/js/exporters/STLExporter.js +5 -14
  42. package/examples/js/exporters/USDZExporter.js +119 -27
  43. package/examples/js/geometries/BoxLineGeometry.js +0 -1
  44. package/examples/js/geometries/ConvexGeometry.js +12 -7
  45. package/examples/js/geometries/DecalGeometry.js +53 -20
  46. package/examples/js/geometries/LightningStrike.js +54 -67
  47. package/examples/js/geometries/ParametricGeometries.js +8 -7
  48. package/examples/js/geometries/ParametricGeometry.js +23 -17
  49. package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
  50. package/examples/js/geometries/TeapotGeometry.js +54 -50
  51. package/examples/js/geometries/TextGeometry.js +6 -4
  52. package/examples/js/helpers/LightProbeHelper.js +1 -2
  53. package/examples/js/helpers/OctreeHelper.js +22 -20
  54. package/examples/js/helpers/PositionalAudioHelper.js +8 -6
  55. package/examples/js/helpers/RectAreaLightHelper.js +6 -7
  56. package/examples/js/helpers/VertexNormalsHelper.js +15 -13
  57. package/examples/js/helpers/VertexTangentsHelper.js +15 -9
  58. package/examples/js/helpers/ViewHelper.js +31 -16
  59. package/examples/js/interactive/HTMLMesh.js +25 -39
  60. package/examples/js/interactive/InteractiveGroup.js +9 -14
  61. package/examples/js/interactive/SelectionBox.js +3 -70
  62. package/examples/js/interactive/SelectionHelper.js +2 -8
  63. package/examples/js/libs/ktx-parse.umd.js +1 -0
  64. package/examples/js/libs/meshopt_decoder.js +98 -32
  65. package/examples/js/lights/LightProbeGenerator.js +32 -39
  66. package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
  67. package/examples/js/lines/LineGeometry.js +3 -5
  68. package/examples/js/lines/LineMaterial.js +4 -11
  69. package/examples/js/lines/LineSegments2.js +40 -89
  70. package/examples/js/lines/LineSegmentsGeometry.js +7 -28
  71. package/examples/js/lines/Wireframe.js +2 -7
  72. package/examples/js/lines/WireframeGeometry2.js +3 -1
  73. package/examples/js/loaders/3DMLoader.js +58 -155
  74. package/examples/js/loaders/3MFLoader.js +72 -106
  75. package/examples/js/loaders/AMFLoader.js +0 -25
  76. package/examples/js/loaders/BVHLoader.js +44 -43
  77. package/examples/js/loaders/BasisTextureLoader.js +16 -46
  78. package/examples/js/loaders/ColladaLoader.js +229 -359
  79. package/examples/js/loaders/DDSLoader.js +24 -25
  80. package/examples/js/loaders/DRACOLoader.js +30 -90
  81. package/examples/js/loaders/EXRLoader.js +69 -177
  82. package/examples/js/loaders/FBXLoader.js +294 -441
  83. package/examples/js/loaders/FontLoader.js +9 -31
  84. package/examples/js/loaders/GCodeLoader.js +15 -16
  85. package/examples/js/loaders/GLTFLoader.js +458 -739
  86. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -17
  87. package/examples/js/loaders/KMZLoader.js +3 -7
  88. package/examples/js/loaders/KTXLoader.js +12 -30
  89. package/examples/js/loaders/LDrawLoader.js +309 -355
  90. package/examples/js/loaders/LUT3dlLoader.js +7 -11
  91. package/examples/js/loaders/LUTCubeLoader.js +0 -8
  92. package/examples/js/loaders/LWOLoader.js +59 -124
  93. package/examples/js/loaders/LogLuvLoader.js +27 -77
  94. package/examples/js/loaders/LottieLoader.js +4 -4
  95. package/examples/js/loaders/MD2Loader.js +26 -27
  96. package/examples/js/loaders/MDDLoader.js +6 -10
  97. package/examples/js/loaders/MMDLoader.js +180 -189
  98. package/examples/js/loaders/MTLLoader.js +18 -47
  99. package/examples/js/loaders/NRRDLoader.js +44 -84
  100. package/examples/js/loaders/OBJLoader.js +56 -77
  101. package/examples/js/loaders/PCDLoader.js +92 -42
  102. package/examples/js/loaders/PDBLoader.js +17 -13
  103. package/examples/js/loaders/PLYLoader.js +65 -51
  104. package/examples/js/loaders/PRWMLoader.js +11 -22
  105. package/examples/js/loaders/PVRLoader.js +7 -16
  106. package/examples/js/loaders/RGBELoader.js +36 -61
  107. package/examples/js/loaders/RGBMLoader.js +26 -87
  108. package/examples/js/loaders/STLLoader.js +20 -27
  109. package/examples/js/loaders/SVGLoader.js +365 -236
  110. package/examples/js/loaders/TDSLoader.js +81 -118
  111. package/examples/js/loaders/TGALoader.js +39 -41
  112. package/examples/js/loaders/TIFFLoader.js +30 -0
  113. package/examples/js/loaders/TTFLoader.js +0 -8
  114. package/examples/js/loaders/TiltLoader.js +14 -15
  115. package/examples/js/loaders/VOXLoader.js +8 -16
  116. package/examples/js/loaders/VRMLLoader.js +266 -354
  117. package/examples/js/loaders/VTKLoader.js +102 -119
  118. package/examples/js/loaders/XYZLoader.js +2 -4
  119. package/examples/js/loaders/lwo/IFFParser.js +55 -136
  120. package/examples/js/loaders/lwo/LWO2Parser.js +39 -89
  121. package/examples/js/loaders/lwo/LWO3Parser.js +38 -79
  122. package/examples/js/materials/MeshGouraudMaterial.js +387 -0
  123. package/examples/js/math/Capsule.js +0 -17
  124. package/examples/js/math/ColorConverter.js +3 -53
  125. package/examples/js/math/ConvexHull.js +185 -141
  126. package/examples/js/math/ImprovedNoise.js +1 -1
  127. package/examples/js/math/Lut.js +8 -15
  128. package/examples/js/math/MeshSurfaceSampler.js +6 -28
  129. package/examples/js/math/OBB.js +90 -49
  130. package/examples/js/math/Octree.js +2 -57
  131. package/examples/js/math/SimplexNoise.js +74 -88
  132. package/examples/js/misc/ConvexObjectBreaker.js +37 -48
  133. package/examples/js/misc/GPUComputationRenderer.js +47 -14
  134. package/examples/js/misc/Gyroscope.js +5 -9
  135. package/examples/js/misc/MD2Character.js +14 -23
  136. package/examples/js/misc/MD2CharacterComplex.js +73 -54
  137. package/examples/js/misc/MorphAnimMesh.js +0 -6
  138. package/examples/js/misc/MorphBlendMesh.js +3 -30
  139. package/examples/js/misc/ProgressiveLightMap.js +47 -43
  140. package/examples/js/misc/RollerCoaster.js +17 -24
  141. package/examples/js/misc/TubePainter.js +18 -12
  142. package/examples/js/misc/Volume.js +173 -194
  143. package/examples/js/misc/VolumeSlice.js +91 -99
  144. package/examples/js/modifiers/CurveModifier.js +19 -21
  145. package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
  146. package/examples/js/modifiers/SimplifyModifier.js +57 -60
  147. package/examples/js/modifiers/TessellateModifier.js +2 -9
  148. package/examples/js/objects/GroundProjectedEnv.js +181 -0
  149. package/examples/js/objects/Lensflare.js +47 -38
  150. package/examples/js/objects/LightningStorm.js +10 -13
  151. package/examples/js/objects/MarchingCubes.js +80 -59
  152. package/examples/js/objects/Reflector.js +31 -22
  153. package/examples/js/objects/ReflectorForSSRPass.js +20 -25
  154. package/examples/js/objects/Refractor.js +61 -33
  155. package/examples/js/objects/ShadowMesh.js +6 -3
  156. package/examples/js/objects/Sky.js +2 -7
  157. package/examples/js/objects/Water.js +23 -18
  158. package/examples/js/objects/Water2.js +20 -19
  159. package/examples/js/physics/AmmoPhysics.js +23 -20
  160. package/examples/js/physics/OimoPhysics.js +19 -17
  161. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
  162. package/examples/js/postprocessing/AfterimagePass.js +19 -12
  163. package/examples/js/postprocessing/BloomPass.js +38 -17
  164. package/examples/js/postprocessing/BokehPass.js +29 -12
  165. package/examples/js/postprocessing/ClearPass.js +1 -6
  166. package/examples/js/postprocessing/CubeTexturePass.js +12 -9
  167. package/examples/js/postprocessing/DotScreenPass.js +7 -5
  168. package/examples/js/postprocessing/EffectComposer.js +25 -32
  169. package/examples/js/postprocessing/FilmPass.js +7 -5
  170. package/examples/js/postprocessing/GlitchPass.js +10 -11
  171. package/examples/js/postprocessing/HalftonePass.js +9 -9
  172. package/examples/js/postprocessing/LUTPass.js +2 -15
  173. package/examples/js/postprocessing/MaskPass.js +20 -17
  174. package/examples/js/postprocessing/OutlinePass.js +49 -38
  175. package/examples/js/postprocessing/Pass.js +11 -14
  176. package/examples/js/postprocessing/RenderPass.js +3 -7
  177. package/examples/js/postprocessing/RenderPixelatedPass.js +215 -0
  178. package/examples/js/postprocessing/SAOPass.js +40 -32
  179. package/examples/js/postprocessing/SMAAPass.js +34 -17
  180. package/examples/js/postprocessing/SSAARenderPass.js +14 -14
  181. package/examples/js/postprocessing/SSAOPass.js +56 -42
  182. package/examples/js/postprocessing/SSRPass.js +78 -61
  183. package/examples/js/postprocessing/SavePass.js +14 -6
  184. package/examples/js/postprocessing/ShaderPass.js +9 -8
  185. package/examples/js/postprocessing/TAARenderPass.js +11 -9
  186. package/examples/js/postprocessing/TexturePass.js +7 -4
  187. package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
  188. package/examples/js/renderers/CSS2DRenderer.js +4 -23
  189. package/examples/js/renderers/CSS3DRenderer.js +5 -26
  190. package/examples/js/renderers/Projector.js +31 -108
  191. package/examples/js/renderers/SVGRenderer.js +4 -50
  192. package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
  193. package/examples/js/shaders/AfterimageShader.js +3 -6
  194. package/examples/js/shaders/BasicShader.js +3 -6
  195. package/examples/js/shaders/BleachBypassShader.js +3 -6
  196. package/examples/js/shaders/BlendShader.js +3 -6
  197. package/examples/js/shaders/BokehShader.js +3 -6
  198. package/examples/js/shaders/BokehShader2.js +4 -13
  199. package/examples/js/shaders/BrightnessContrastShader.js +3 -6
  200. package/examples/js/shaders/ColorCorrectionShader.js +2 -6
  201. package/examples/js/shaders/ColorifyShader.js +2 -6
  202. package/examples/js/shaders/ConvolutionShader.js +5 -10
  203. package/examples/js/shaders/CopyShader.js +3 -6
  204. package/examples/js/shaders/DOFMipMapShader.js +3 -6
  205. package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
  206. package/examples/js/shaders/DigitalGlitch.js +3 -6
  207. package/examples/js/shaders/DotScreenShader.js +2 -6
  208. package/examples/js/shaders/FXAAShader.js +1 -3
  209. package/examples/js/shaders/FilmShader.js +3 -6
  210. package/examples/js/shaders/FocusShader.js +3 -6
  211. package/examples/js/shaders/FreiChenShader.js +2 -6
  212. package/examples/js/shaders/GammaCorrectionShader.js +3 -6
  213. package/examples/js/shaders/GodRaysShader.js +11 -24
  214. package/examples/js/shaders/HalftoneShader.js +3 -6
  215. package/examples/js/shaders/HorizontalBlurShader.js +3 -6
  216. package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
  217. package/examples/js/shaders/HueSaturationShader.js +3 -6
  218. package/examples/js/shaders/KaleidoShader.js +3 -6
  219. package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
  220. package/examples/js/shaders/LuminosityShader.js +4 -7
  221. package/examples/js/shaders/MMDToonShader.js +2 -4
  222. package/examples/js/shaders/MirrorShader.js +3 -6
  223. package/examples/js/shaders/NormalMapShader.js +2 -6
  224. package/examples/js/shaders/RGBShiftShader.js +3 -6
  225. package/examples/js/shaders/SAOShader.js +2 -6
  226. package/examples/js/shaders/SMAAShader.js +6 -18
  227. package/examples/js/shaders/SSAOShader.js +2 -6
  228. package/examples/js/shaders/SSRShader.js +6 -18
  229. package/examples/js/shaders/SepiaShader.js +3 -6
  230. package/examples/js/shaders/SobelOperatorShader.js +2 -6
  231. package/examples/js/shaders/TechnicolorShader.js +3 -6
  232. package/examples/js/shaders/ToneMapShader.js +4 -7
  233. package/examples/js/shaders/ToonShader.js +8 -24
  234. package/examples/js/shaders/TriangleBlurShader.js +2 -6
  235. package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
  236. package/examples/js/shaders/VelocityShader.js +126 -0
  237. package/examples/js/shaders/VerticalBlurShader.js +3 -6
  238. package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
  239. package/examples/js/shaders/VignetteShader.js +3 -6
  240. package/examples/js/shaders/VolumeShader.js +2 -6
  241. package/examples/js/shaders/WaterRefractionShader.js +2 -6
  242. package/examples/js/textures/FlakesTexture.js +0 -1
  243. package/examples/js/utils/BufferGeometryUtils.js +237 -171
  244. package/examples/js/utils/CameraUtils.js +5 -20
  245. package/examples/js/utils/GPUStatsPanel.js +3 -12
  246. package/examples/js/utils/GeometryCompressionUtils.js +19 -44
  247. package/examples/js/utils/GeometryUtils.js +15 -36
  248. package/examples/js/utils/LDrawUtils.js +8 -11
  249. package/examples/js/utils/PackedPhongMaterial.js +6 -4
  250. package/examples/js/utils/SceneUtils.js +109 -14
  251. package/examples/js/utils/ShadowMapViewer.js +17 -14
  252. package/examples/js/utils/SkeletonUtils.js +13 -27
  253. package/examples/js/utils/UVsDebug.js +20 -12
  254. package/examples/js/utils/WorkerPool.js +1 -11
  255. package/examples/jsm/animation/CCDIKSolver.js +27 -3
  256. package/examples/jsm/animation/MMDPhysics.js +28 -22
  257. package/examples/jsm/capabilities/WebGPU.js +3 -1
  258. package/examples/jsm/controls/ArcballControls.js +17 -2
  259. package/examples/jsm/controls/FirstPersonControls.js +20 -27
  260. package/examples/jsm/controls/FlyControls.js +16 -24
  261. package/examples/jsm/controls/OrbitControls.js +44 -9
  262. package/examples/jsm/controls/PointerLockControls.js +0 -7
  263. package/examples/jsm/controls/TrackballControls.js +14 -5
  264. package/examples/jsm/controls/TransformControls.js +18 -16
  265. package/examples/jsm/csm/CSM.js +1 -0
  266. package/examples/jsm/csm/CSMHelper.js +30 -0
  267. package/examples/jsm/effects/AnaglyphEffect.js +2 -2
  268. package/examples/jsm/effects/OutlineEffect.js +4 -25
  269. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -2
  270. package/examples/jsm/effects/PeppersGhostEffect.js +2 -2
  271. package/examples/jsm/effects/StereoEffect.js +2 -2
  272. package/examples/jsm/environments/RoomEnvironment.js +23 -0
  273. package/examples/jsm/exporters/ColladaExporter.js +4 -13
  274. package/examples/jsm/exporters/DRACOExporter.js +0 -13
  275. package/examples/jsm/exporters/GLTFExporter.js +29 -110
  276. package/examples/jsm/exporters/KTX2Exporter.js +29 -29
  277. package/examples/jsm/exporters/OBJExporter.js +0 -18
  278. package/examples/jsm/exporters/PLYExporter.js +14 -22
  279. package/examples/jsm/exporters/STLExporter.js +1 -9
  280. package/examples/jsm/exporters/USDZExporter.js +107 -4
  281. package/examples/jsm/geometries/ConvexGeometry.js +1 -1
  282. package/examples/jsm/geometries/ParametricGeometry.js +0 -6
  283. package/examples/jsm/helpers/OctreeHelper.js +22 -8
  284. package/examples/jsm/helpers/VertexNormalsHelper.js +7 -1
  285. package/examples/jsm/helpers/VertexTangentsHelper.js +7 -0
  286. package/examples/jsm/helpers/ViewHelper.js +24 -0
  287. package/examples/jsm/interactive/HTMLMesh.js +14 -15
  288. package/examples/jsm/interactive/InteractiveGroup.js +4 -2
  289. package/examples/jsm/interactive/SelectionHelper.js +5 -3
  290. package/examples/jsm/libs/flow.module.js +610 -160
  291. package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
  292. package/examples/jsm/libs/meshopt_decoder.module.js +97 -32
  293. package/examples/jsm/libs/utif.module.js +1579 -0
  294. package/examples/jsm/libs/zstddec.module.js +1 -0
  295. package/examples/jsm/lines/LineSegments2.js +4 -0
  296. package/examples/jsm/loaders/3DMLoader.js +1 -2
  297. package/examples/jsm/loaders/ColladaLoader.js +29 -0
  298. package/examples/jsm/loaders/DRACOLoader.js +2 -28
  299. package/examples/jsm/loaders/EXRLoader.js +3 -13
  300. package/examples/jsm/loaders/FBXLoader.js +26 -3
  301. package/examples/jsm/loaders/FontLoader.js +3 -16
  302. package/examples/jsm/loaders/GLTFLoader.js +321 -464
  303. package/examples/jsm/loaders/HDRCubeTextureLoader.js +0 -13
  304. package/examples/jsm/loaders/KTX2Loader.js +254 -53
  305. package/examples/jsm/loaders/LDrawLoader.js +149 -87
  306. package/examples/jsm/loaders/LottieLoader.js +4 -2
  307. package/examples/jsm/loaders/MaterialXLoader.js +728 -0
  308. package/examples/jsm/loaders/OBJLoader.js +6 -14
  309. package/examples/jsm/loaders/PCDLoader.js +60 -14
  310. package/examples/jsm/loaders/PLYLoader.js +71 -19
  311. package/examples/jsm/loaders/RGBELoader.js +1 -1
  312. package/examples/jsm/loaders/SVGLoader.js +231 -17
  313. package/examples/jsm/loaders/TIFFLoader.js +36 -0
  314. package/examples/jsm/loaders/USDZLoader.js +633 -0
  315. package/examples/jsm/loaders/VRMLLoader.js +36 -26
  316. package/examples/jsm/loaders/VTKLoader.js +1 -1
  317. package/examples/jsm/loaders/lwo/LWO2Parser.js +6 -8
  318. package/examples/jsm/loaders/lwo/LWO3Parser.js +6 -8
  319. package/examples/jsm/materials/MeshGouraudMaterial.js +423 -0
  320. package/examples/jsm/math/ColorConverter.js +1 -49
  321. package/examples/jsm/math/ConvexHull.js +4 -4
  322. package/examples/jsm/math/Octree.js +1 -1
  323. package/examples/jsm/misc/GPUComputationRenderer.js +43 -0
  324. package/examples/jsm/misc/Volume.js +169 -171
  325. package/examples/jsm/misc/VolumeSlice.js +78 -80
  326. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  327. package/examples/jsm/node-editor/NodeEditor.js +91 -12
  328. package/examples/jsm/node-editor/accessors/MatcapUVEditor.js +1 -1
  329. package/examples/jsm/node-editor/accessors/NormalEditor.js +1 -1
  330. package/examples/jsm/node-editor/accessors/PositionEditor.js +1 -1
  331. package/examples/jsm/node-editor/accessors/UVEditor.js +1 -1
  332. package/examples/jsm/node-editor/core/BaseNode.js +10 -3
  333. package/examples/jsm/node-editor/display/BlendEditor.js +1 -1
  334. package/examples/jsm/node-editor/display/NormalMapEditor.js +1 -1
  335. package/examples/jsm/node-editor/inputs/ColorEditor.js +1 -1
  336. package/examples/jsm/node-editor/inputs/FloatEditor.js +1 -1
  337. package/examples/jsm/node-editor/inputs/SliderEditor.js +1 -1
  338. package/examples/jsm/node-editor/inputs/TextureEditor.js +1 -1
  339. package/examples/jsm/node-editor/inputs/Vector2Editor.js +1 -1
  340. package/examples/jsm/node-editor/inputs/Vector3Editor.js +1 -1
  341. package/examples/jsm/node-editor/inputs/Vector4Editor.js +1 -1
  342. package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +7 -10
  343. package/examples/jsm/node-editor/materials/PointsMaterialEditor.js +1 -1
  344. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +7 -10
  345. package/examples/jsm/node-editor/math/AngleEditor.js +4 -4
  346. package/examples/jsm/node-editor/math/DotEditor.js +1 -1
  347. package/examples/jsm/node-editor/math/InvertEditor.js +3 -3
  348. package/examples/jsm/node-editor/math/LimiterEditor.js +1 -1
  349. package/examples/jsm/node-editor/math/NormalizeEditor.js +1 -1
  350. package/examples/jsm/node-editor/math/OperatorEditor.js +1 -1
  351. package/examples/jsm/node-editor/math/PowerEditor.js +1 -1
  352. package/examples/jsm/node-editor/math/TrigonometryEditor.js +1 -1
  353. package/examples/jsm/node-editor/procedural/CheckerEditor.js +1 -1
  354. package/examples/jsm/node-editor/scene/MeshEditor.js +11 -8
  355. package/examples/jsm/node-editor/utils/JoinEditor.js +1 -1
  356. package/examples/jsm/node-editor/utils/OscillatorEditor.js +1 -1
  357. package/examples/jsm/node-editor/utils/PreviewEditor.js +7 -3
  358. package/examples/jsm/node-editor/utils/SplitEditor.js +1 -1
  359. package/examples/jsm/node-editor/utils/TimerEditor.js +1 -1
  360. package/examples/jsm/nodes/Nodes.js +70 -13
  361. package/examples/jsm/nodes/accessors/BitangentNode.js +62 -0
  362. package/examples/jsm/nodes/accessors/CubeTextureNode.js +9 -5
  363. package/examples/jsm/nodes/accessors/NormalNode.js +8 -8
  364. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  365. package/examples/jsm/nodes/accessors/PositionNode.js +11 -5
  366. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  367. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +31 -0
  368. package/examples/jsm/nodes/accessors/SkinningNode.js +8 -1
  369. package/examples/jsm/nodes/accessors/TangentNode.js +95 -0
  370. package/examples/jsm/nodes/core/AttributeNode.js +32 -9
  371. package/examples/jsm/nodes/core/CodeNode.js +3 -3
  372. package/examples/jsm/nodes/core/FunctionCallNode.js +20 -5
  373. package/examples/jsm/nodes/core/FunctionNode.js +2 -2
  374. package/examples/jsm/nodes/core/Node.js +15 -13
  375. package/examples/jsm/nodes/core/NodeBuilder.js +67 -18
  376. package/examples/jsm/nodes/core/NodeFrame.js +2 -2
  377. package/examples/jsm/nodes/core/NodeUtils.js +23 -1
  378. package/examples/jsm/nodes/core/NodeVarying.js +17 -0
  379. package/examples/jsm/nodes/core/VaryingNode.js +56 -0
  380. package/examples/jsm/nodes/core/constants.js +13 -13
  381. package/examples/jsm/nodes/display/BlendModeNode.js +85 -0
  382. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +84 -0
  383. package/examples/jsm/nodes/display/NormalMapNode.js +19 -12
  384. package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
  385. package/examples/jsm/nodes/display/ViewportNode.js +106 -0
  386. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +5 -5
  387. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +3 -3
  388. package/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +2 -2
  389. package/examples/jsm/nodes/geometry/RangeNode.js +109 -0
  390. package/examples/jsm/nodes/gpgpu/ComputeNode.js +3 -1
  391. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  392. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -7
  393. package/examples/jsm/nodes/lighting/LightingContextNode.js +4 -4
  394. package/examples/jsm/nodes/loaders/NodeLoader.js +2 -2
  395. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +33 -0
  396. package/examples/jsm/nodes/materials/Materials.js +21 -31
  397. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +70 -0
  398. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +4 -7
  399. package/examples/jsm/nodes/materials/NodeMaterial.js +11 -3
  400. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +28 -17
  401. package/examples/jsm/nodes/materialx/DISCLAIMER.md +199 -0
  402. package/examples/jsm/nodes/materialx/MaterialXNodes.js +59 -0
  403. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +56 -0
  404. package/examples/jsm/nodes/materialx/lib/mx_noise.js +617 -0
  405. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
  406. package/examples/jsm/nodes/math/MathNode.js +7 -17
  407. package/examples/jsm/nodes/math/OperatorNode.js +16 -3
  408. package/examples/jsm/nodes/parsers/GLSLNodeFunction.js +21 -6
  409. package/examples/jsm/nodes/procedural/CheckerNode.js +2 -2
  410. package/examples/jsm/nodes/shadernode/ShaderNode.js +40 -25
  411. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +95 -68
  412. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +49 -6
  413. package/examples/jsm/nodes/utils/ConvertNode.js +18 -12
  414. package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
  415. package/examples/jsm/nodes/utils/JoinNode.js +15 -9
  416. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
  417. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +3 -2
  418. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  419. package/examples/jsm/nodes/utils/RemapNode.js +34 -0
  420. package/examples/jsm/nodes/utils/RotateUVNode.js +32 -0
  421. package/examples/jsm/nodes/utils/SplitNode.js +21 -5
  422. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
  423. package/examples/jsm/nodes/utils/TimerNode.js +23 -3
  424. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
  425. package/examples/jsm/objects/GroundProjectedEnv.js +186 -0
  426. package/examples/jsm/objects/Reflector.js +12 -5
  427. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -5
  428. package/examples/jsm/objects/Refractor.js +12 -6
  429. package/examples/jsm/objects/ShadowMesh.js +8 -2
  430. package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
  431. package/examples/jsm/postprocessing/BloomPass.js +22 -3
  432. package/examples/jsm/postprocessing/BokehPass.js +18 -4
  433. package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
  434. package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
  435. package/examples/jsm/postprocessing/EffectComposer.js +9 -0
  436. package/examples/jsm/postprocessing/FilmPass.js +8 -0
  437. package/examples/jsm/postprocessing/GlitchPass.js +13 -1
  438. package/examples/jsm/postprocessing/HalftonePass.js +8 -0
  439. package/examples/jsm/postprocessing/OutlinePass.js +25 -3
  440. package/examples/jsm/postprocessing/Pass.js +2 -0
  441. package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
  442. package/examples/jsm/postprocessing/SAOPass.js +20 -0
  443. package/examples/jsm/postprocessing/SMAAPass.js +16 -0
  444. package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
  445. package/examples/jsm/postprocessing/SavePass.js +17 -1
  446. package/examples/jsm/postprocessing/ShaderPass.js +8 -0
  447. package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
  448. package/examples/jsm/postprocessing/TexturePass.js +8 -0
  449. package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
  450. package/examples/jsm/renderers/CSS2DRenderer.js +2 -2
  451. package/examples/jsm/renderers/CSS3DRenderer.js +2 -2
  452. package/examples/jsm/renderers/Projector.js +2 -24
  453. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +9 -5
  454. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +363 -231
  455. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +7 -3
  456. package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
  457. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
  458. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +68 -3
  459. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +6 -0
  460. package/examples/jsm/renderers/webgpu/WebGPUGeometries.js +6 -0
  461. package/examples/jsm/renderers/webgpu/WebGPUObjects.js +1 -1
  462. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +17 -19
  463. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +16 -14
  464. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +2 -2
  465. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +113 -93
  466. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +5 -3
  467. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +2 -2
  468. package/examples/jsm/renderers/webgpu/WebGPUUtils.js +81 -0
  469. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +63 -36
  470. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +1 -1
  471. package/examples/jsm/shaders/LuminosityShader.js +1 -1
  472. package/examples/jsm/shaders/MMDToonShader.js +2 -4
  473. package/examples/jsm/shaders/ToneMapShader.js +1 -1
  474. package/examples/jsm/shaders/VelocityShader.js +128 -0
  475. package/examples/jsm/utils/BufferGeometryUtils.js +176 -43
  476. package/examples/jsm/utils/GeometryUtils.js +17 -25
  477. package/examples/jsm/utils/PackedPhongMaterial.js +0 -1
  478. package/examples/jsm/utils/SceneUtils.js +117 -12
  479. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  480. package/examples/jsm/webxr/OculusHandPointerModel.js +6 -1
  481. package/examples/jsm/webxr/VRButton.js +1 -7
  482. package/examples/jsm/webxr/XRHandMeshModel.js +8 -3
  483. package/package.json +22 -18
  484. package/src/Three.Legacy.js +262 -36
  485. package/src/Three.js +4 -2
  486. package/src/animation/AnimationAction.js +6 -5
  487. package/src/animation/AnimationClip.js +1 -1
  488. package/src/animation/AnimationMixer.js +1 -1
  489. package/src/animation/AnimationUtils.js +204 -199
  490. package/src/animation/KeyframeTrack.js +1 -1
  491. package/src/animation/PropertyBinding.js +31 -5
  492. package/src/audio/AudioContext.js +5 -5
  493. package/src/cameras/CubeCamera.js +14 -21
  494. package/src/constants.js +2 -4
  495. package/src/core/BufferAttribute.js +81 -111
  496. package/src/core/BufferGeometry.js +3 -41
  497. package/src/core/InstancedBufferAttribute.js +0 -10
  498. package/src/core/InstancedBufferGeometry.js +1 -7
  499. package/src/core/InterleavedBuffer.js +1 -1
  500. package/src/core/InterleavedBufferAttribute.js +57 -8
  501. package/src/core/Object3D.js +22 -5
  502. package/src/core/Uniform.js +0 -7
  503. package/src/core/UniformsGroup.js +92 -0
  504. package/src/extras/DataUtils.js +104 -88
  505. package/src/extras/Earcut.js +67 -67
  506. package/src/extras/core/Path.js +1 -0
  507. package/src/extras/core/ShapePath.js +1 -4
  508. package/src/extras/curves/CatmullRomCurve3.js +4 -2
  509. package/src/geometries/BoxGeometry.js +1 -1
  510. package/src/geometries/CapsuleGeometry.js +1 -1
  511. package/src/geometries/CircleGeometry.js +1 -1
  512. package/src/geometries/ConeGeometry.js +1 -1
  513. package/src/geometries/CylinderGeometry.js +2 -1
  514. package/src/geometries/DodecahedronGeometry.js +1 -1
  515. package/src/geometries/EdgesGeometry.js +5 -4
  516. package/src/geometries/ExtrudeGeometry.js +2 -11
  517. package/src/geometries/IcosahedronGeometry.js +1 -1
  518. package/src/geometries/LatheGeometry.js +2 -2
  519. package/src/geometries/OctahedronGeometry.js +1 -1
  520. package/src/geometries/PlaneGeometry.js +2 -1
  521. package/src/geometries/PolyhedronGeometry.js +2 -2
  522. package/src/geometries/RingGeometry.js +1 -1
  523. package/src/geometries/ShapeGeometry.js +3 -2
  524. package/src/geometries/SphereGeometry.js +2 -1
  525. package/src/geometries/TetrahedronGeometry.js +1 -1
  526. package/src/geometries/TorusGeometry.js +2 -1
  527. package/src/geometries/TorusKnotGeometry.js +2 -1
  528. package/src/geometries/TubeGeometry.js +2 -1
  529. package/src/geometries/WireframeGeometry.js +1 -0
  530. package/src/helpers/ArrowHelper.js +9 -0
  531. package/src/helpers/Box3Helper.js +7 -0
  532. package/src/helpers/BoxHelper.js +7 -1
  533. package/src/helpers/CameraHelper.js +97 -38
  534. package/src/helpers/DirectionalLightHelper.js +6 -1
  535. package/src/helpers/GridHelper.js +7 -0
  536. package/src/helpers/HemisphereLightHelper.js +5 -1
  537. package/src/helpers/PlaneHelper.js +15 -9
  538. package/src/helpers/PointLightHelper.js +2 -1
  539. package/src/helpers/PolarGridHelper.js +25 -14
  540. package/src/helpers/SkeletonHelper.js +7 -0
  541. package/src/helpers/SpotLightHelper.js +5 -2
  542. package/src/lights/LightShadow.js +1 -2
  543. package/src/lights/PointLight.js +2 -2
  544. package/src/lights/SpotLight.js +4 -2
  545. package/src/loaders/FileLoader.js +16 -2
  546. package/src/loaders/LoadingManager.js +1 -1
  547. package/src/loaders/MaterialLoader.js +49 -7
  548. package/src/loaders/ObjectLoader.js +9 -42
  549. package/src/materials/Material.js +2 -34
  550. package/src/materials/Materials.js +0 -27
  551. package/src/materials/MeshLambertMaterial.js +28 -1
  552. package/src/materials/MeshPhysicalMaterial.js +1 -1
  553. package/src/materials/ShaderMaterial.js +3 -7
  554. package/src/math/Color.js +8 -18
  555. package/src/math/MathUtils.js +1 -7
  556. package/src/math/Matrix3.js +54 -25
  557. package/src/math/Matrix4.js +3 -27
  558. package/src/math/Quaternion.js +1 -21
  559. package/src/math/Ray.js +2 -5
  560. package/src/math/Sphere.js +36 -21
  561. package/src/math/Vector2.js +4 -24
  562. package/src/math/Vector3.js +7 -46
  563. package/src/math/Vector4.js +4 -24
  564. package/src/objects/InstancedMesh.js +7 -0
  565. package/src/objects/LOD.js +25 -6
  566. package/src/renderers/WebGL3DRenderTarget.js +1 -1
  567. package/src/renderers/WebGLArrayRenderTarget.js +1 -1
  568. package/src/renderers/WebGLCubeRenderTarget.js +1 -1
  569. package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
  570. package/src/renderers/WebGLRenderTarget.js +1 -1
  571. package/src/renderers/WebGLRenderer.js +119 -69
  572. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +12 -12
  573. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -5
  574. package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -5
  575. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +24 -24
  576. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
  577. package/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js +1 -1
  578. package/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js +1 -1
  579. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +2 -1
  580. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +113 -99
  581. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +34 -13
  582. package/src/renderers/shaders/ShaderChunk/lights_lambert_fragment.glsl.js +5 -0
  583. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +28 -0
  584. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
  585. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +3 -1
  586. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +13 -1
  587. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
  588. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -4
  589. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +2 -4
  590. package/src/renderers/shaders/ShaderChunk/output_fragment.glsl.js +1 -1
  591. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
  592. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +18 -7
  593. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +8 -3
  594. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +9 -6
  595. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  596. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +14 -10
  597. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +2 -2
  598. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +1 -1
  599. package/src/renderers/shaders/ShaderChunk.js +7 -2
  600. package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
  601. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
  602. package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
  603. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +0 -1
  604. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +22 -50
  605. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  606. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +0 -3
  607. package/src/renderers/shaders/ShaderLib.js +50 -36
  608. package/src/renderers/shaders/UniformsLib.js +13 -12
  609. package/src/renderers/shaders/UniformsUtils.js +29 -0
  610. package/src/renderers/webgl/WebGLAttributes.js +2 -0
  611. package/src/renderers/webgl/WebGLBackground.js +17 -9
  612. package/src/renderers/webgl/WebGLLights.js +37 -17
  613. package/src/renderers/webgl/WebGLMaterials.js +2 -1
  614. package/src/renderers/webgl/WebGLMorphtargets.js +0 -20
  615. package/src/renderers/webgl/WebGLProgram.js +6 -11
  616. package/src/renderers/webgl/WebGLPrograms.js +30 -26
  617. package/src/renderers/webgl/WebGLRenderLists.js +5 -4
  618. package/src/renderers/webgl/WebGLRenderStates.js +5 -4
  619. package/src/renderers/webgl/WebGLShaderCache.js +9 -6
  620. package/src/renderers/webgl/WebGLShadowMap.js +13 -16
  621. package/src/renderers/webgl/WebGLState.js +125 -41
  622. package/src/renderers/webgl/WebGLTextures.js +94 -39
  623. package/src/renderers/webgl/WebGLUniforms.js +156 -28
  624. package/src/renderers/webgl/WebGLUniformsGroups.js +372 -0
  625. package/src/renderers/webgl/WebGLUtils.js +3 -1
  626. package/src/renderers/webvr/WebVRManager.js +42 -9
  627. package/src/renderers/webvr/WebVRUtils.js +1 -1
  628. package/src/renderers/webxr/WebXRController.js +91 -50
  629. package/src/renderers/webxr/WebXRManager.js +127 -34
  630. package/src/scenes/Scene.js +24 -3
  631. package/src/textures/CompressedArrayTexture.js +18 -0
  632. package/src/textures/Source.js +1 -1
  633. package/src/textures/Texture.js +2 -1
  634. package/src/utils.js +1 -1
  635. package/examples/js/controls/experimental/CameraControls.js +0 -1048
  636. package/examples/js/libs/lottie_canvas.js +0 -12751
  637. package/examples/js/loaders/KTX2Loader.js +0 -558
  638. package/examples/js/shaders/PixelShader.js +0 -51
  639. package/examples/jsm/controls/experimental/CameraControls.js +0 -1248
  640. package/examples/jsm/nodes/accessors/ReflectNode.js +0 -70
  641. package/examples/jsm/nodes/core/NodeVary.js +0 -14
  642. package/examples/jsm/nodes/core/VaryNode.js +0 -54
  643. package/examples/jsm/package.json +0 -3
  644. package/examples/jsm/renderers/webgl/nodes/WebGLPhysicalContextNode.js +0 -45
  645. package/examples/jsm/shaders/PixelShader.js +0 -44
  646. package/src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl.js +0 -122
@@ -23,6 +23,7 @@ const _material_library_pattern = /^mtllib /;
23
23
  const _material_use_pattern = /^usemtl /;
24
24
  // usemap map_name
25
25
  const _map_use_pattern = /^usemap /;
26
+ const _face_vertex_data_separator_pattern = /\s+/;
26
27
 
27
28
  const _vA = new Vector3();
28
29
  const _vB = new Vector3();
@@ -503,31 +504,22 @@ class OBJLoader extends Loader {
503
504
  }
504
505
 
505
506
  const lines = text.split( '\n' );
506
- let line = '', lineFirstChar = '';
507
- let lineLength = 0;
508
507
  let result = [];
509
508
 
510
- // Faster to just trim left side of the line. Use if available.
511
- const trimLeft = ( typeof ''.trimLeft === 'function' );
512
-
513
509
  for ( let i = 0, l = lines.length; i < l; i ++ ) {
514
510
 
515
- line = lines[ i ];
516
-
517
- line = trimLeft ? line.trimLeft() : line.trim();
518
-
519
- lineLength = line.length;
511
+ const line = lines[ i ].trimStart();
520
512
 
521
- if ( lineLength === 0 ) continue;
513
+ if ( line.length === 0 ) continue;
522
514
 
523
- lineFirstChar = line.charAt( 0 );
515
+ const lineFirstChar = line.charAt( 0 );
524
516
 
525
517
  // @todo invoke passed in handler if any
526
518
  if ( lineFirstChar === '#' ) continue;
527
519
 
528
520
  if ( lineFirstChar === 'v' ) {
529
521
 
530
- const data = line.split( /\s+/ );
522
+ const data = line.split( _face_vertex_data_separator_pattern );
531
523
 
532
524
  switch ( data[ 0 ] ) {
533
525
 
@@ -575,7 +567,7 @@ class OBJLoader extends Loader {
575
567
  } else if ( lineFirstChar === 'f' ) {
576
568
 
577
569
  const lineData = line.slice( 1 ).trim();
578
- const vertexData = lineData.split( /\s+/ );
570
+ const vertexData = lineData.split( _face_vertex_data_separator_pattern );
579
571
  const faceVertices = [];
580
572
 
581
573
  // Parse the face vertex data into an easy to work with format
@@ -2,6 +2,7 @@ import {
2
2
  BufferGeometry,
3
3
  FileLoader,
4
4
  Float32BufferAttribute,
5
+ Int32BufferAttribute,
5
6
  Loader,
6
7
  LoaderUtils,
7
8
  Points,
@@ -122,7 +123,7 @@ class PCDLoader extends Loader {
122
123
 
123
124
  // remove comments
124
125
 
125
- PCDheader.str = PCDheader.str.replace( /\#.*/gi, '' );
126
+ PCDheader.str = PCDheader.str.replace( /#.*/gi, '' );
126
127
 
127
128
  // parse
128
129
 
@@ -229,6 +230,8 @@ class PCDLoader extends Loader {
229
230
  const position = [];
230
231
  const normal = [];
231
232
  const color = [];
233
+ const intensity = [];
234
+ const label = [];
232
235
 
233
236
  // ascii
234
237
 
@@ -285,6 +288,18 @@ class PCDLoader extends Loader {
285
288
 
286
289
  }
287
290
 
291
+ if ( offset.intensity !== undefined ) {
292
+
293
+ intensity.push( parseFloat( line[ offset.intensity ] ) );
294
+
295
+ }
296
+
297
+ if ( offset.label !== undefined ) {
298
+
299
+ label.push( parseInt( line[ offset.label ] ) );
300
+
301
+ }
302
+
288
303
  }
289
304
 
290
305
  }
@@ -309,25 +324,46 @@ class PCDLoader extends Loader {
309
324
 
310
325
  if ( offset.x !== undefined ) {
311
326
 
312
- position.push( dataview.getFloat32( ( PCDheader.points * offset.x ) + PCDheader.size[ 0 ] * i, this.littleEndian ) );
313
- position.push( dataview.getFloat32( ( PCDheader.points * offset.y ) + PCDheader.size[ 1 ] * i, this.littleEndian ) );
314
- position.push( dataview.getFloat32( ( PCDheader.points * offset.z ) + PCDheader.size[ 2 ] * i, this.littleEndian ) );
327
+ const xIndex = PCDheader.fields.indexOf( 'x' );
328
+ const yIndex = PCDheader.fields.indexOf( 'y' );
329
+ const zIndex = PCDheader.fields.indexOf( 'z' );
330
+ position.push( dataview.getFloat32( ( PCDheader.points * offset.x ) + PCDheader.size[ xIndex ] * i, this.littleEndian ) );
331
+ position.push( dataview.getFloat32( ( PCDheader.points * offset.y ) + PCDheader.size[ yIndex ] * i, this.littleEndian ) );
332
+ position.push( dataview.getFloat32( ( PCDheader.points * offset.z ) + PCDheader.size[ zIndex ] * i, this.littleEndian ) );
315
333
 
316
334
  }
317
335
 
318
336
  if ( offset.rgb !== undefined ) {
319
337
 
320
- color.push( dataview.getUint8( ( PCDheader.points * offset.rgb ) + PCDheader.size[ 3 ] * i + 2 ) / 255.0 );
321
- color.push( dataview.getUint8( ( PCDheader.points * offset.rgb ) + PCDheader.size[ 3 ] * i + 1 ) / 255.0 );
322
- color.push( dataview.getUint8( ( PCDheader.points * offset.rgb ) + PCDheader.size[ 3 ] * i + 0 ) / 255.0 );
338
+ const rgbIndex = PCDheader.fields.indexOf( 'rgb' );
339
+ color.push( dataview.getUint8( ( PCDheader.points * offset.rgb ) + PCDheader.size[ rgbIndex ] * i + 2 ) / 255.0 );
340
+ color.push( dataview.getUint8( ( PCDheader.points * offset.rgb ) + PCDheader.size[ rgbIndex ] * i + 1 ) / 255.0 );
341
+ color.push( dataview.getUint8( ( PCDheader.points * offset.rgb ) + PCDheader.size[ rgbIndex ] * i + 0 ) / 255.0 );
323
342
 
324
343
  }
325
344
 
326
345
  if ( offset.normal_x !== undefined ) {
327
346
 
328
- normal.push( dataview.getFloat32( ( PCDheader.points * offset.normal_x ) + PCDheader.size[ 4 ] * i, this.littleEndian ) );
329
- normal.push( dataview.getFloat32( ( PCDheader.points * offset.normal_y ) + PCDheader.size[ 5 ] * i, this.littleEndian ) );
330
- normal.push( dataview.getFloat32( ( PCDheader.points * offset.normal_z ) + PCDheader.size[ 6 ] * i, this.littleEndian ) );
347
+ const xIndex = PCDheader.fields.indexOf( 'normal_x' );
348
+ const yIndex = PCDheader.fields.indexOf( 'normal_y' );
349
+ const zIndex = PCDheader.fields.indexOf( 'normal_z' );
350
+ normal.push( dataview.getFloat32( ( PCDheader.points * offset.normal_x ) + PCDheader.size[ xIndex ] * i, this.littleEndian ) );
351
+ normal.push( dataview.getFloat32( ( PCDheader.points * offset.normal_y ) + PCDheader.size[ yIndex ] * i, this.littleEndian ) );
352
+ normal.push( dataview.getFloat32( ( PCDheader.points * offset.normal_z ) + PCDheader.size[ zIndex ] * i, this.littleEndian ) );
353
+
354
+ }
355
+
356
+ if ( offset.intensity !== undefined ) {
357
+
358
+ const intensityIndex = PCDheader.fields.indexOf( 'intensity' );
359
+ intensity.push( dataview.getFloat32( ( PCDheader.points * offset.intensity ) + PCDheader.size[ intensityIndex ] * i, this.littleEndian ) );
360
+
361
+ }
362
+
363
+ if ( offset.label !== undefined ) {
364
+
365
+ const labelIndex = PCDheader.fields.indexOf( 'label' );
366
+ label.push( dataview.getInt32( ( PCDheader.points * offset.label ) + PCDheader.size[ labelIndex ] * i, this.littleEndian ) );
331
367
 
332
368
  }
333
369
 
@@ -368,6 +404,18 @@ class PCDLoader extends Loader {
368
404
 
369
405
  }
370
406
 
407
+ if ( offset.intensity !== undefined ) {
408
+
409
+ intensity.push( dataview.getFloat32( row + offset.intensity, this.littleEndian ) );
410
+
411
+ }
412
+
413
+ if ( offset.label !== undefined ) {
414
+
415
+ label.push( dataview.getInt32( row + offset.label, this.littleEndian ) );
416
+
417
+ }
418
+
371
419
  }
372
420
 
373
421
  }
@@ -379,6 +427,8 @@ class PCDLoader extends Loader {
379
427
  if ( position.length > 0 ) geometry.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );
380
428
  if ( normal.length > 0 ) geometry.setAttribute( 'normal', new Float32BufferAttribute( normal, 3 ) );
381
429
  if ( color.length > 0 ) geometry.setAttribute( 'color', new Float32BufferAttribute( color, 3 ) );
430
+ if ( intensity.length > 0 ) geometry.setAttribute( 'intensity', new Float32BufferAttribute( intensity, 1 ) );
431
+ if ( label.length > 0 ) geometry.setAttribute( 'label', new Int32BufferAttribute( label, 1 ) );
382
432
 
383
433
  geometry.computeBoundingSphere();
384
434
 
@@ -390,10 +440,6 @@ class PCDLoader extends Loader {
390
440
 
391
441
  material.vertexColors = true;
392
442
 
393
- } else {
394
-
395
- material.color.setHex( Math.random() * 0xffffff );
396
-
397
443
  }
398
444
 
399
445
  // build point cloud
@@ -31,6 +31,16 @@ import {
31
31
  * diffuse_blue: 'blue'
32
32
  * } );
33
33
  *
34
+ * Custom properties outside of the defaults for position, uv, normal
35
+ * and color attributes can be added using the setCustomPropertyMapping method.
36
+ * For example, the following maps the element properties “custom_property_a”
37
+ * and “custom_property_b” to an attribute “customAttribute” with an item size of 2.
38
+ * Attribute item sizes are set from the number of element properties in the property array.
39
+ *
40
+ * loader.setCustomPropertyMapping( {
41
+ * customAttribute: ['custom_property_a', 'custom_property_b'],
42
+ * } );
43
+ *
34
44
  */
35
45
 
36
46
  const _color = new Color();
@@ -42,6 +52,7 @@ class PLYLoader extends Loader {
42
52
  super( manager );
43
53
 
44
54
  this.propertyNameMapping = {};
55
+ this.customPropertyMapping = {};
45
56
 
46
57
  }
47
58
 
@@ -86,11 +97,17 @@ class PLYLoader extends Loader {
86
97
 
87
98
  }
88
99
 
100
+ setCustomPropertyNameMapping( mapping ) {
101
+
102
+ this.customPropertyMapping = mapping;
103
+
104
+ }
105
+
89
106
  parse( data ) {
90
107
 
91
108
  function parseHeader( data ) {
92
109
 
93
- const patternHeader = /^ply([\s\S]*)end_header\r?\n/;
110
+ const patternHeader = /^ply([\s\S]*)end_header(\r\n|\r|\n)/;
94
111
  let headerText = '';
95
112
  let headerLength = 0;
96
113
  const result = patternHeader.exec( data );
@@ -109,7 +126,7 @@ class PLYLoader extends Loader {
109
126
  objInfo: ''
110
127
  };
111
128
 
112
- const lines = headerText.split( '\n' );
129
+ const lines = headerText.split( /\r\n|\r|\n/ );
113
130
  let currentElement;
114
131
 
115
132
  function make_ply_element_property( propertValues, propertyNameMapping ) {
@@ -260,18 +277,32 @@ class PLYLoader extends Loader {
260
277
 
261
278
  }
262
279
 
280
+ function createBuffer() {
281
+
282
+ const buffer = {
283
+ indices: [],
284
+ vertices: [],
285
+ normals: [],
286
+ uvs: [],
287
+ faceVertexUvs: [],
288
+ colors: [],
289
+ };
290
+
291
+ for ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {
292
+
293
+ buffer[ customProperty ] = [];
294
+
295
+ }
296
+
297
+ return buffer;
298
+
299
+ }
300
+
263
301
  function parseASCII( data, header ) {
264
302
 
265
303
  // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)
266
304
 
267
- const buffer = {
268
- indices: [],
269
- vertices: [],
270
- normals: [],
271
- uvs: [],
272
- faceVertexUvs: [],
273
- colors: []
274
- };
305
+ const buffer = createBuffer();
275
306
 
276
307
  let result;
277
308
 
@@ -283,7 +314,7 @@ class PLYLoader extends Loader {
283
314
 
284
315
  }
285
316
 
286
- const lines = body.split( '\n' );
317
+ const lines = body.split( /\r\n|\r|\n/ );
287
318
  let currentElement = 0;
288
319
  let currentElementCount = 0;
289
320
 
@@ -357,6 +388,24 @@ class PLYLoader extends Loader {
357
388
 
358
389
  }
359
390
 
391
+ // custom buffer data
392
+
393
+ for ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {
394
+
395
+ if ( buffer[ customProperty ].length > 0 ) {
396
+
397
+ geometry.setAttribute(
398
+ customProperty,
399
+ new Float32BufferAttribute(
400
+ buffer[ customProperty ],
401
+ scope.customPropertyMapping[ customProperty ].length
402
+ )
403
+ );
404
+
405
+ }
406
+
407
+ }
408
+
360
409
  geometry.computeBoundingSphere();
361
410
 
362
411
  return geometry;
@@ -419,6 +468,16 @@ class PLYLoader extends Loader {
419
468
 
420
469
  }
421
470
 
471
+ for ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {
472
+
473
+ for ( const elementProperty of scope.customPropertyMapping[ customProperty ] ) {
474
+
475
+ buffer[ customProperty ].push( element[ elementProperty ] );
476
+
477
+ }
478
+
479
+ }
480
+
422
481
  } else if ( elementName === 'face' ) {
423
482
 
424
483
  const vertex_indices = element.vertex_indices || element.vertex_index; // issue #9338
@@ -506,14 +565,7 @@ class PLYLoader extends Loader {
506
565
 
507
566
  function parseBinary( data, header ) {
508
567
 
509
- const buffer = {
510
- indices: [],
511
- vertices: [],
512
- normals: [],
513
- uvs: [],
514
- faceVertexUvs: [],
515
- colors: []
516
- };
568
+ const buffer = createBuffer();
517
569
 
518
570
  const little_endian = ( header.format === 'binary_little_endian' );
519
571
  const body = new DataView( data, header.headerLength );
@@ -450,7 +450,7 @@ class RGBELoader extends DataTextureLoader {
450
450
  texture.magFilter = LinearFilter;
451
451
  texture.generateMipmaps = false;
452
452
  texture.flipY = true;
453
-
453
+
454
454
  break;
455
455
 
456
456
  }
@@ -78,6 +78,7 @@ class SVGLoader extends Loader {
78
78
  switch ( node.nodeName ) {
79
79
 
80
80
  case 'svg':
81
+ style = parseStyle( node, style );
81
82
  break;
82
83
 
83
84
  case 'style':
@@ -1458,7 +1459,7 @@ class SVGLoader extends Loader {
1458
1459
  if ( array.length >= 1 ) {
1459
1460
 
1460
1461
  const tx = array[ 0 ];
1461
- let ty = tx;
1462
+ let ty = 0;
1462
1463
 
1463
1464
  if ( array.length >= 2 ) {
1464
1465
 
@@ -1481,7 +1482,7 @@ class SVGLoader extends Loader {
1481
1482
  let cy = 0;
1482
1483
 
1483
1484
  // Angle
1484
- angle = - array[ 0 ] * Math.PI / 180;
1485
+ angle = array[ 0 ] * Math.PI / 180;
1485
1486
 
1486
1487
  if ( array.length >= 3 ) {
1487
1488
 
@@ -1492,10 +1493,10 @@ class SVGLoader extends Loader {
1492
1493
  }
1493
1494
 
1494
1495
  // Rotate around center (cx, cy)
1495
- tempTransform1.identity().translate( - cx, - cy );
1496
- tempTransform2.identity().rotate( angle );
1496
+ tempTransform1.makeTranslation( - cx, - cy );
1497
+ tempTransform2.makeRotation( angle );
1497
1498
  tempTransform3.multiplyMatrices( tempTransform2, tempTransform1 );
1498
- tempTransform1.identity().translate( cx, cy );
1499
+ tempTransform1.makeTranslation( cx, cy );
1499
1500
  currentTransform.multiplyMatrices( tempTransform1, tempTransform3 );
1500
1501
 
1501
1502
  }
@@ -1587,7 +1588,120 @@ class SVGLoader extends Loader {
1587
1588
 
1588
1589
  }
1589
1590
 
1590
- const isRotated = isTransformRotated( m );
1591
+ function transfEllipseGeneric( curve ) {
1592
+
1593
+ // For math description see:
1594
+ // https://math.stackexchange.com/questions/4544164
1595
+
1596
+ const a = curve.xRadius;
1597
+ const b = curve.yRadius;
1598
+
1599
+ const cosTheta = Math.cos( curve.aRotation );
1600
+ const sinTheta = Math.sin( curve.aRotation );
1601
+
1602
+ const v1 = new Vector3( a * cosTheta, a * sinTheta, 0 );
1603
+ const v2 = new Vector3( -b * sinTheta, b * cosTheta, 0 );
1604
+
1605
+ const f1 = v1.applyMatrix3( m );
1606
+ const f2 = v2.applyMatrix3( m );
1607
+
1608
+ const mF = tempTransform0.set(
1609
+ f1.x, f2.x, 0,
1610
+ f1.y, f2.y, 0,
1611
+ 0, 0, 1,
1612
+ );
1613
+
1614
+ const mFInv = tempTransform1.copy( mF ).invert();
1615
+ const mFInvT = tempTransform2.copy( mFInv ).transpose();
1616
+ const mQ = mFInvT.multiply( mFInv );
1617
+ const mQe = mQ.elements;
1618
+
1619
+ const ed = eigenDecomposition( mQe[0], mQe[1], mQe[4] );
1620
+ const rt1sqrt = Math.sqrt( ed.rt1 );
1621
+ const rt2sqrt = Math.sqrt( ed.rt2 );
1622
+
1623
+ curve.xRadius = 1 / rt1sqrt;
1624
+ curve.yRadius = 1 / rt2sqrt;
1625
+ curve.aRotation = Math.atan2( ed.sn, ed.cs );
1626
+
1627
+ const isFullEllipse =
1628
+ ( curve.aEndAngle - curve.aStartAngle ) % ( 2 * Math.PI ) < Number.EPSILON;
1629
+
1630
+ // Do not touch angles of a full ellipse because after transformation they
1631
+ // would converge to a sinle value effectively removing the whole curve
1632
+
1633
+ if ( !isFullEllipse ) {
1634
+
1635
+ const mDsqrt = tempTransform1.set(
1636
+ rt1sqrt, 0, 0,
1637
+ 0, rt2sqrt, 0,
1638
+ 0, 0, 1,
1639
+ );
1640
+
1641
+ const mRT = tempTransform2.set(
1642
+ ed.cs, ed.sn, 0,
1643
+ -ed.sn, ed.cs, 0,
1644
+ 0, 0, 1,
1645
+ );
1646
+
1647
+ const mDRF = mDsqrt.multiply( mRT ).multiply( mF );
1648
+
1649
+ const transformAngle = phi => {
1650
+
1651
+ const { x: cosR, y: sinR } =
1652
+ new Vector3( Math.cos( phi ), Math.sin( phi ), 0 ).applyMatrix3( mDRF );
1653
+
1654
+ return Math.atan2( sinR, cosR );
1655
+
1656
+ }
1657
+
1658
+ curve.aStartAngle = transformAngle( curve.aStartAngle );
1659
+ curve.aEndAngle = transformAngle( curve.aEndAngle );
1660
+
1661
+ if ( isTransformFlipped( m ) ) {
1662
+
1663
+ curve.aClockwise = !curve.aClockwise;
1664
+
1665
+ }
1666
+
1667
+ }
1668
+
1669
+ }
1670
+
1671
+ function transfEllipseNoSkew( curve ) {
1672
+
1673
+ // Faster shortcut if no skew is applied
1674
+ // (e.g, a euclidean transform of a group containing the ellipse)
1675
+
1676
+ const sx = getTransformScaleX( m );
1677
+ const sy = getTransformScaleY( m );
1678
+
1679
+ curve.xRadius *= sx;
1680
+ curve.yRadius *= sy;
1681
+
1682
+ // Extract rotation angle from the matrix of form:
1683
+ //
1684
+ // | cosθ sx -sinθ sy |
1685
+ // | sinθ sx cosθ sy |
1686
+ //
1687
+ // Remembering that tanθ = sinθ / cosθ; and that
1688
+ // `sx`, `sy`, or both might be zero.
1689
+ const theta =
1690
+ sx > Number.EPSILON
1691
+ ? Math.atan2( m.elements[ 1 ], m.elements[ 0 ] )
1692
+ : Math.atan2( - m.elements[ 3 ], m.elements[ 4 ] );
1693
+
1694
+ curve.aRotation += theta;
1695
+
1696
+ if ( isTransformFlipped( m ) ) {
1697
+
1698
+ curve.aStartAngle *= -1;
1699
+ curve.aEndAngle *= -1;
1700
+ curve.aClockwise = !curve.aClockwise;
1701
+
1702
+ }
1703
+
1704
+ }
1591
1705
 
1592
1706
  const subPaths = path.subPaths;
1593
1707
 
@@ -1620,19 +1734,24 @@ class SVGLoader extends Loader {
1620
1734
 
1621
1735
  } else if ( curve.isEllipseCurve ) {
1622
1736
 
1623
- if ( isRotated ) {
1624
-
1625
- console.warn( 'SVGLoader: Elliptic arc or ellipse rotation or skewing is not implemented.' );
1626
-
1627
- }
1737
+ // Transform ellipse center point
1628
1738
 
1629
1739
  tempV2.set( curve.aX, curve.aY );
1630
1740
  transfVec2( tempV2 );
1631
1741
  curve.aX = tempV2.x;
1632
1742
  curve.aY = tempV2.y;
1633
1743
 
1634
- curve.xRadius *= getTransformScaleX( m );
1635
- curve.yRadius *= getTransformScaleY( m );
1744
+ // Transform ellipse shape parameters
1745
+
1746
+ if ( isTransformSkewed( m ) ) {
1747
+
1748
+ transfEllipseGeneric( curve );
1749
+
1750
+ } else {
1751
+
1752
+ transfEllipseNoSkew( curve );
1753
+
1754
+ }
1636
1755
 
1637
1756
  }
1638
1757
 
@@ -1642,9 +1761,25 @@ class SVGLoader extends Loader {
1642
1761
 
1643
1762
  }
1644
1763
 
1645
- function isTransformRotated( m ) {
1764
+ function isTransformFlipped( m ) {
1765
+
1766
+ const te = m.elements;
1767
+ return te[ 0 ] * te[ 4 ] - te[ 1 ] * te[ 3 ] < 0;
1768
+
1769
+ }
1770
+
1771
+ function isTransformSkewed( m ) {
1772
+
1773
+ const te = m.elements;
1774
+ const basisDot = te[ 0 ] * te[ 3 ] + te[ 1 ] * te[ 4 ];
1775
+
1776
+ // Shortcut for trivial rotations and transformations
1777
+ if ( basisDot === 0 ) return false;
1778
+
1779
+ const sx = getTransformScaleX( m );
1780
+ const sy = getTransformScaleY( m );
1646
1781
 
1647
- return m.elements[ 1 ] !== 0 || m.elements[ 3 ] !== 0;
1782
+ return Math.abs( basisDot / ( sx * sy ) ) > Number.EPSILON;
1648
1783
 
1649
1784
  }
1650
1785
 
@@ -1662,6 +1797,85 @@ class SVGLoader extends Loader {
1662
1797
 
1663
1798
  }
1664
1799
 
1800
+ // Calculates the eigensystem of a real symmetric 2x2 matrix
1801
+ // [ A B ]
1802
+ // [ B C ]
1803
+ // in the form
1804
+ // [ A B ] = [ cs -sn ] [ rt1 0 ] [ cs sn ]
1805
+ // [ B C ] [ sn cs ] [ 0 rt2 ] [ -sn cs ]
1806
+ // where rt1 >= rt2.
1807
+ //
1808
+ // Adapted from: https://www.mpi-hd.mpg.de/personalhomes/globes/3x3/index.html
1809
+ // -> Algorithms for real symmetric matrices -> Analytical (2x2 symmetric)
1810
+ function eigenDecomposition( A, B, C ) {
1811
+
1812
+ let rt1, rt2, cs, sn, t;
1813
+ const sm = A + C;
1814
+ const df = A - C;
1815
+ const rt = Math.sqrt( df * df + 4 * B * B );
1816
+
1817
+ if ( sm > 0 ) {
1818
+
1819
+ rt1 = 0.5 * ( sm + rt );
1820
+ t = 1 / rt1;
1821
+ rt2 = A * t * C - B * t * B;
1822
+
1823
+ } else if ( sm < 0 ) {
1824
+
1825
+ rt2 = 0.5 * ( sm - rt );
1826
+
1827
+ } else {
1828
+
1829
+ // This case needs to be treated separately to avoid div by 0
1830
+
1831
+ rt1 = 0.5 * rt;
1832
+ rt2 = -0.5 * rt;
1833
+
1834
+ }
1835
+
1836
+ // Calculate eigenvectors
1837
+
1838
+ if ( df > 0 ) {
1839
+
1840
+ cs = df + rt;
1841
+
1842
+ } else {
1843
+
1844
+ cs = df - rt;
1845
+
1846
+ }
1847
+
1848
+ if ( Math.abs( cs ) > 2 * Math.abs( B ) ) {
1849
+
1850
+ t = -2 * B / cs;
1851
+ sn = 1 / Math.sqrt( 1 + t * t );
1852
+ cs = t * sn;
1853
+
1854
+ } else if ( Math.abs( B ) === 0 ) {
1855
+
1856
+ cs = 1;
1857
+ sn = 0;
1858
+
1859
+ } else {
1860
+
1861
+ t = -0.5 * cs / B;
1862
+ cs = 1 / Math.sqrt( 1 + t * t );
1863
+ sn = t * cs;
1864
+
1865
+ }
1866
+
1867
+ if ( df > 0 ) {
1868
+
1869
+ t = cs;
1870
+ cs = -sn;
1871
+ sn = t;
1872
+
1873
+ }
1874
+
1875
+ return { rt1, rt2, cs, sn };
1876
+
1877
+ }
1878
+
1665
1879
  //
1666
1880
 
1667
1881
  const paths = [];
@@ -2106,7 +2320,7 @@ class SVGLoader extends Loader {
2106
2320
  simplePaths = simplePaths.filter( sp => sp.points.length > 1 );
2107
2321
 
2108
2322
  // check if path is solid or a hole
2109
- const isAHole = simplePaths.map( p => isHoleTo( p, simplePaths, scanlineMinX, scanlineMaxX, shapePath.userData.style.fillRule ) );
2323
+ const isAHole = simplePaths.map( p => isHoleTo( p, simplePaths, scanlineMinX, scanlineMaxX, shapePath.userData?.style.fillRule ) );
2110
2324
 
2111
2325
 
2112
2326
  const shapesToReturn = [];
@@ -2312,7 +2526,7 @@ class SVGLoader extends Loader {
2312
2526
  const dot = Math.abs( normal1.dot( tempV2_3 ) );
2313
2527
 
2314
2528
  // If path is straight, don't create join
2315
- if ( dot !== 0 ) {
2529
+ if ( dot > Number.EPSILON ) {
2316
2530
 
2317
2531
  // Compute inner and outer segment intersections
2318
2532
  const miterSide = strokeWidth2 / dot;