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.
Files changed (1219) hide show
  1. package/BufferGeometryUtils-1a7a235c.js +655 -0
  2. package/BufferGeometryUtils-971dfde3.js +1 -0
  3. package/Nodes-4f766d71.js +471 -0
  4. package/Nodes-9aa16d74.js +1 -0
  5. package/animation/AnimationClipCreator.cjs.js +1 -0
  6. package/animation/AnimationClipCreator.js +52 -32
  7. package/animation/CCDIKSolver.cjs.js +1 -0
  8. package/animation/CCDIKSolver.js +143 -64
  9. package/animation/MMDAnimationHelper.cjs.js +1 -0
  10. package/animation/MMDAnimationHelper.js +341 -150
  11. package/animation/MMDPhysics.cjs.js +1 -0
  12. package/animation/MMDPhysics.js +361 -154
  13. package/cameras/CinematicCamera.cjs.js +1 -0
  14. package/cameras/CinematicCamera.js +77 -67
  15. package/controls/ArcballControls.cjs.js +1 -0
  16. package/controls/ArcballControls.js +1449 -544
  17. package/controls/DeviceOrientationControls.cjs.js +1 -0
  18. package/controls/DeviceOrientationControls.js +97 -52
  19. package/controls/DragControls.cjs.js +1 -0
  20. package/controls/DragControls.js +187 -85
  21. package/controls/FirstPersonControls.cjs.js +1 -0
  22. package/controls/FirstPersonControls.js +193 -123
  23. package/controls/FlyControls.cjs.js +1 -0
  24. package/controls/FlyControls.d.ts +5 -4
  25. package/controls/FlyControls.js +160 -90
  26. package/controls/OrbitControls.cjs.js +1 -0
  27. package/controls/OrbitControls.js +481 -232
  28. package/controls/PointerLockControls.cjs.js +1 -0
  29. package/controls/PointerLockControls.js +99 -63
  30. package/controls/TrackballControls.cjs.js +1 -0
  31. package/controls/TrackballControls.js +383 -211
  32. package/controls/TransformControls.cjs.js +1 -0
  33. package/controls/TransformControls.js +782 -575
  34. package/controls/experimental/CameraControls.cjs.js +1 -0
  35. package/controls/experimental/CameraControls.js +609 -329
  36. package/csm/CSM.cjs.js +1 -0
  37. package/csm/CSM.js +108 -47
  38. package/csm/CSMFrustum.cjs.js +1 -0
  39. package/csm/CSMFrustum.js +29 -14
  40. package/csm/CSMHelper.cjs.js +1 -0
  41. package/csm/CSMHelper.js +34 -20
  42. package/csm/CSMShader.cjs.js +1 -0
  43. package/csm/CSMShader.js +11 -7
  44. package/curves/CurveExtras.cjs.js +1 -0
  45. package/curves/CurveExtras.js +115 -73
  46. package/curves/NURBSCurve.cjs.js +1 -0
  47. package/curves/NURBSCurve.js +43 -15
  48. package/curves/NURBSSurface.cjs.js +1 -0
  49. package/curves/NURBSSurface.js +27 -11
  50. package/curves/NURBSUtils.cjs.js +1 -0
  51. package/curves/NURBSUtils.js +203 -54
  52. package/custom.d.cjs.js +1 -0
  53. package/{shaders/types.mjs → custom.d.js} +0 -0
  54. package/deprecated/Geometry.cjs.js +1 -0
  55. package/deprecated/Geometry.js +486 -191
  56. package/effects/AnaglyphEffect.cjs.js +1 -0
  57. package/effects/AnaglyphEffect.js +60 -95
  58. package/effects/AsciiEffect.cjs.js +1 -0
  59. package/effects/AsciiEffect.js +110 -80
  60. package/effects/OutlineEffect.cjs.js +1 -0
  61. package/effects/OutlineEffect.js +204 -121
  62. package/effects/ParallaxBarrierEffect.cjs.js +1 -0
  63. package/effects/ParallaxBarrierEffect.js +38 -39
  64. package/effects/PeppersGhostEffect.cjs.js +1 -0
  65. package/effects/PeppersGhostEffect.js +68 -19
  66. package/effects/StereoEffect.cjs.js +1 -0
  67. package/effects/StereoEffect.js +16 -12
  68. package/environments/RoomEnvironment.cjs.js +1 -0
  69. package/environments/RoomEnvironment.js +47 -52
  70. package/exporters/ColladaExporter.cjs.js +1 -0
  71. package/exporters/ColladaExporter.js +241 -115
  72. package/exporters/DRACOExporter.cjs.js +1 -0
  73. package/exporters/DRACOExporter.js +121 -67
  74. package/exporters/GLTFExporter.cjs.js +1 -0
  75. package/exporters/GLTFExporter.js +1014 -463
  76. package/exporters/MMDExporter.cjs.js +1 -0
  77. package/exporters/MMDExporter.js +102 -44
  78. package/exporters/OBJExporter.cjs.js +1 -0
  79. package/exporters/OBJExporter.js +140 -78
  80. package/exporters/PLYExporter.cjs.js +1 -0
  81. package/exporters/PLYExporter.js +154 -93
  82. package/exporters/STLExporter.cjs.js +1 -0
  83. package/exporters/STLExporter.js +81 -30
  84. package/exporters/USDZExporter.cjs.js +1 -0
  85. package/exporters/USDZExporter.js +144 -84
  86. package/geometries/BoxLineGeometry.cjs.js +1 -0
  87. package/geometries/BoxLineGeometry.js +14 -7
  88. package/geometries/ConvexGeometry.cjs.js +1 -0
  89. package/geometries/ConvexGeometry.js +23 -14
  90. package/geometries/DecalGeometry.cjs.js +1 -0
  91. package/geometries/DecalGeometry.js +162 -108
  92. package/geometries/LightningStrike.cjs.js +1 -0
  93. package/geometries/LightningStrike.js +294 -101
  94. package/geometries/ParametricGeometries.cjs.js +1 -0
  95. package/geometries/ParametricGeometries.js +76 -26
  96. package/geometries/ParametricGeometry.cjs.js +1 -0
  97. package/geometries/ParametricGeometry.js +48 -24
  98. package/geometries/RoundedBoxGeometry.cjs.js +1 -0
  99. package/geometries/RoundedBoxGeometry.js +64 -33
  100. package/geometries/TeapotGeometry.cjs.js +1 -0
  101. package/geometries/TeapotGeometry.js +174 -1434
  102. package/geometries/TextGeometry.cjs.js +1 -0
  103. package/geometries/TextGeometry.js +17 -9
  104. package/helpers/LightProbeHelper.cjs.js +1 -0
  105. package/helpers/LightProbeHelper.js +21 -53
  106. package/helpers/PositionalAudioHelper.cjs.js +1 -0
  107. package/helpers/PositionalAudioHelper.js +30 -23
  108. package/helpers/RectAreaLightHelper.cjs.js +1 -0
  109. package/helpers/RectAreaLightHelper.js +33 -17
  110. package/helpers/VertexNormalsHelper.cjs.js +1 -0
  111. package/helpers/VertexNormalsHelper.js +41 -20
  112. package/helpers/VertexTangentsHelper.cjs.js +1 -0
  113. package/helpers/VertexTangentsHelper.js +36 -18
  114. package/index.cjs.js +1 -0
  115. package/index.js +333 -969
  116. package/interactive/InteractiveGroup.cjs.js +1 -0
  117. package/interactive/InteractiveGroup.d.ts +5 -0
  118. package/interactive/InteractiveGroup.js +87 -0
  119. package/interactive/SelectionBox.cjs.js +1 -0
  120. package/interactive/SelectionBox.js +46 -31
  121. package/interactive/SelectionHelper.cjs.js +1 -0
  122. package/interactive/SelectionHelper.js +21 -16
  123. package/libs/MeshoptDecoder.cjs.js +1 -0
  124. package/libs/MeshoptDecoder.js +58 -147
  125. package/libs/MotionControllers.cjs.js +1 -0
  126. package/libs/MotionControllers.js +208 -66
  127. package/lights/LightProbeGenerator.cjs.js +1 -0
  128. package/lights/LightProbeGenerator.js +96 -40
  129. package/lights/RectAreaLightUniformsLib.cjs.js +1 -0
  130. package/lights/RectAreaLightUniformsLib.js +9 -32842
  131. package/lines/Line2.cjs.js +1 -0
  132. package/lines/Line2.js +12 -9
  133. package/lines/LineGeometry.cjs.js +1 -0
  134. package/lines/LineGeometry.js +19 -7
  135. package/lines/LineMaterial.cjs.js +1 -0
  136. package/lines/LineMaterial.js +89 -51
  137. package/lines/LineSegments2.cjs.js +1 -0
  138. package/lines/LineSegments2.js +165 -56
  139. package/lines/LineSegmentsGeometry.cjs.js +1 -0
  140. package/lines/LineSegmentsGeometry.js +71 -29
  141. package/lines/Wireframe.cjs.js +1 -0
  142. package/lines/Wireframe.js +29 -15
  143. package/lines/WireframeGeometry2.cjs.js +1 -0
  144. package/lines/WireframeGeometry2.js +9 -8
  145. package/loaders/3DMLoader.cjs.js +1 -0
  146. package/loaders/3DMLoader.js +469 -234
  147. package/loaders/3MFLoader.cjs.js +1 -0
  148. package/loaders/3MFLoader.js +555 -340
  149. package/loaders/AMFLoader.cjs.js +1 -0
  150. package/loaders/AMFLoader.js +219 -114
  151. package/loaders/AssimpLoader.cjs.js +1 -0
  152. package/loaders/AssimpLoader.js +725 -328
  153. package/loaders/BVHLoader.cjs.js +1 -0
  154. package/loaders/BVHLoader.js +200 -94
  155. package/loaders/BasisTextureLoader.cjs.js +1 -0
  156. package/loaders/BasisTextureLoader.js +357 -229
  157. package/loaders/ColladaLoader.cjs.js +1 -0
  158. package/loaders/ColladaLoader.js +1522 -932
  159. package/loaders/DDSLoader.cjs.js +1 -0
  160. package/loaders/DDSLoader.js +108 -42
  161. package/loaders/DRACOLoader.cjs.js +1 -0
  162. package/loaders/DRACOLoader.js +210 -103
  163. package/loaders/EXRLoader.cjs.js +1 -0
  164. package/loaders/EXRLoader.js +809 -461
  165. package/loaders/FBXLoader.cjs.js +1 -0
  166. package/loaders/FBXLoader.js +1397 -842
  167. package/loaders/FontLoader.cjs.js +1 -0
  168. package/loaders/FontLoader.js +66 -33
  169. package/loaders/GCodeLoader.cjs.js +1 -0
  170. package/loaders/GCodeLoader.js +111 -63
  171. package/loaders/GLTFLoader.cjs.js +1 -0
  172. package/loaders/GLTFLoader.js +1484 -771
  173. package/loaders/HDRCubeTextureLoader.cjs.js +1 -0
  174. package/loaders/HDRCubeTextureLoader.js +50 -45
  175. package/loaders/KMZLoader.cjs.js +1 -0
  176. package/loaders/KMZLoader.js +55 -42
  177. package/loaders/KTX2Loader.cjs.js +1 -0
  178. package/loaders/KTX2Loader.js +362 -229
  179. package/loaders/KTXLoader.cjs.js +1 -0
  180. package/loaders/KTXLoader.js +99 -37
  181. package/loaders/LDrawLoader.cjs.js +1 -0
  182. package/loaders/LDrawLoader.js +746 -313
  183. package/loaders/LUT3dlLoader.cjs.js +1 -0
  184. package/loaders/LUT3dlLoader.js +62 -50
  185. package/loaders/LUTCubeLoader.cjs.js +1 -0
  186. package/loaders/LUTCubeLoader.js +56 -45
  187. package/loaders/LWOLoader.cjs.js +1 -0
  188. package/loaders/LWOLoader.js +339 -227
  189. package/loaders/LottieLoader.cjs.js +1 -0
  190. package/loaders/LottieLoader.js +38 -36
  191. package/loaders/MD2Loader.cjs.js +1 -0
  192. package/loaders/MD2Loader.js +91 -248
  193. package/loaders/MDDLoader.cjs.js +1 -0
  194. package/loaders/MDDLoader.js +45 -25
  195. package/loaders/MMDLoader.cjs.js +1 -0
  196. package/loaders/MMDLoader.js +795 -359
  197. package/loaders/MTLLoader.cjs.js +1 -0
  198. package/loaders/MTLLoader.js +201 -91
  199. package/loaders/NRRDLoader.cjs.js +1 -0
  200. package/loaders/NRRDLoader.js +263 -182
  201. package/loaders/NodeMaterialLoader.cjs.js +1 -0
  202. package/loaders/NodeMaterialLoader.js +14 -121
  203. package/loaders/OBJLoader.cjs.js +1 -0
  204. package/loaders/OBJLoader.js +283 -161
  205. package/loaders/PCDLoader.cjs.js +1 -0
  206. package/loaders/PCDLoader.js +164 -145
  207. package/loaders/PDBLoader.cjs.js +1 -0
  208. package/loaders/PDBLoader.js +63 -45
  209. package/loaders/PLYLoader.cjs.js +1 -0
  210. package/loaders/PLYLoader.js +203 -106
  211. package/loaders/PRWMLoader.cjs.js +1 -0
  212. package/loaders/PRWMLoader.js +110 -73
  213. package/loaders/PVRLoader.cjs.js +1 -0
  214. package/loaders/PVRLoader.js +93 -32
  215. package/loaders/RGBELoader.cjs.js +1 -0
  216. package/loaders/RGBELoader.js +233 -96
  217. package/loaders/RGBMLoader.cjs.js +1 -0
  218. package/loaders/RGBMLoader.js +514 -344
  219. package/loaders/STLLoader.cjs.js +1 -0
  220. package/loaders/STLLoader.js +165 -59
  221. package/loaders/SVGLoader.cjs.js +1 -0
  222. package/loaders/SVGLoader.js +851 -481
  223. package/loaders/TDSLoader.cjs.js +1 -0
  224. package/loaders/TDSLoader.js +527 -137
  225. package/loaders/TGALoader.cjs.js +1 -0
  226. package/loaders/TGALoader.js +205 -94
  227. package/loaders/TTFLoader.cjs.js +1 -0
  228. package/loaders/TTFLoader.js +79 -58
  229. package/loaders/TiltLoader.cjs.js +1 -0
  230. package/loaders/TiltLoader.js +167 -129
  231. package/loaders/VOXLoader.cjs.js +1 -0
  232. package/loaders/VOXLoader.js +84 -320
  233. package/loaders/VRMLLoader.cjs.js +1 -0
  234. package/loaders/VRMLLoader.js +1268 -786
  235. package/loaders/VRMLoader.cjs.js +1 -0
  236. package/loaders/VRMLoader.js +31 -23
  237. package/loaders/VTKLoader.cjs.js +1 -0
  238. package/loaders/VTKLoader.js +407 -219
  239. package/loaders/XLoader.cjs.js +1 -0
  240. package/loaders/XLoader.js +1259 -1083
  241. package/loaders/XYZLoader.cjs.js +1 -0
  242. package/loaders/XYZLoader.js +34 -28
  243. package/loaders/lwo/IFFParser.cjs.js +1 -0
  244. package/loaders/lwo/IFFParser.js +492 -238
  245. package/loaders/lwo/LWO2Parser.cjs.js +1 -0
  246. package/loaders/lwo/LWO2Parser.js +279 -176
  247. package/loaders/lwo/LWO3Parser.cjs.js +1 -0
  248. package/loaders/lwo/LWO3Parser.js +247 -160
  249. package/math/Capsule.cjs.js +1 -0
  250. package/math/Capsule.js +43 -56
  251. package/math/ColorConverter.cjs.js +1 -0
  252. package/math/ColorConverter.js +32 -18
  253. package/math/ConvexHull.cjs.js +1 -0
  254. package/math/ConvexHull.js +357 -97
  255. package/math/ImprovedNoise.cjs.js +1 -0
  256. package/math/ImprovedNoise.js +32 -282
  257. package/math/Lut.cjs.js +1 -0
  258. package/math/Lut.js +35 -51
  259. package/math/MeshSurfaceSampler.cjs.js +1 -0
  260. package/math/MeshSurfaceSampler.js +68 -25
  261. package/math/OBB.cjs.js +1 -0
  262. package/math/OBB.js +152 -91
  263. package/math/Octree.cjs.js +1 -0
  264. package/math/Octree.js +139 -76
  265. package/math/SimplexNoise.cjs.js +1 -0
  266. package/math/SimplexNoise.js +238 -217
  267. package/misc/ConvexObjectBreaker.cjs.js +1 -0
  268. package/misc/ConvexObjectBreaker.js +185 -79
  269. package/misc/GPUComputationRenderer.cjs.js +1 -0
  270. package/misc/GPUComputationRenderer.js +194 -69
  271. package/misc/Gyroscope.cjs.js +1 -0
  272. package/misc/Gyroscope.js +22 -16
  273. package/misc/MD2Character.cjs.js +1 -0
  274. package/misc/MD2Character.js +74 -52
  275. package/misc/MD2CharacterComplex.cjs.js +1 -0
  276. package/misc/MD2CharacterComplex.js +163 -112
  277. package/misc/MorphAnimMesh.cjs.js +1 -0
  278. package/misc/MorphAnimMesh.js +28 -20
  279. package/misc/MorphBlendMesh.cjs.js +1 -0
  280. package/misc/MorphBlendMesh.js +69 -45
  281. package/misc/ProgressiveLightmap.cjs.js +1 -0
  282. package/misc/ProgressiveLightmap.js +187 -70
  283. package/misc/RollerCoaster.cjs.js +1 -0
  284. package/misc/RollerCoaster.js +135 -106
  285. package/misc/TubePainter.cjs.js +1 -0
  286. package/misc/TubePainter.js +92 -74
  287. package/misc/Volume.cjs.js +1 -0
  288. package/misc/Volume.js +270 -108
  289. package/misc/VolumeSlice.cjs.js +1 -0
  290. package/misc/VolumeSlice.js +122 -34
  291. package/misc/WebGL.cjs.js +1 -0
  292. package/misc/WebGL.js +34 -37
  293. package/modifiers/CurveModifier.cjs.js +1 -0
  294. package/modifiers/CurveModifier.js +151 -46
  295. package/modifiers/EdgeSplitModifier.cjs.js +1 -0
  296. package/modifiers/EdgeSplitModifier.js +90 -46
  297. package/modifiers/SimplifyModifier.cjs.js +1 -0
  298. package/modifiers/SimplifyModifier.js +202 -77
  299. package/modifiers/TessellateModifier.cjs.js +1 -0
  300. package/modifiers/TessellateModifier.js +90 -65
  301. package/nodes/Nodes.cjs.js +1 -0
  302. package/nodes/Nodes.js +140 -274
  303. package/nodes/ShaderNode.cjs.js +1 -0
  304. package/nodes/ShaderNode.js +196 -296
  305. package/nodes/accessors/BufferNode.cjs.js +1 -0
  306. package/nodes/accessors/BufferNode.js +8 -4
  307. package/nodes/accessors/CameraNode.cjs.js +1 -0
  308. package/nodes/accessors/CameraNode.js +25 -20
  309. package/nodes/accessors/CubeTextureNode.cjs.js +1 -0
  310. package/nodes/accessors/CubeTextureNode.js +26 -14
  311. package/nodes/accessors/MaterialNode.cjs.js +1 -0
  312. package/nodes/accessors/MaterialNode.js +53 -43
  313. package/nodes/accessors/MaterialReferenceNode.cjs.js +1 -0
  314. package/nodes/accessors/MaterialReferenceNode.js +6 -3
  315. package/nodes/accessors/ModelNode.cjs.js +1 -0
  316. package/nodes/accessors/ModelNode.js +5 -3
  317. package/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
  318. package/nodes/accessors/ModelViewProjectionNode.js +13 -14
  319. package/nodes/accessors/NormalNode.cjs.js +1 -0
  320. package/nodes/accessors/NormalNode.js +39 -40
  321. package/nodes/accessors/Object3DNode.cjs.js +1 -0
  322. package/nodes/accessors/Object3DNode.js +50 -40
  323. package/nodes/accessors/PointUVNode.cjs.js +1 -0
  324. package/nodes/accessors/PointUVNode.js +9 -5
  325. package/nodes/accessors/PositionNode.cjs.js +1 -0
  326. package/nodes/accessors/PositionNode.js +41 -42
  327. package/nodes/accessors/ReferenceNode.cjs.js +1 -0
  328. package/nodes/accessors/ReferenceNode.js +17 -10
  329. package/nodes/accessors/ReflectNode.cjs.js +1 -0
  330. package/nodes/accessors/ReflectNode.js +26 -23
  331. package/nodes/accessors/SkinningNode.cjs.js +1 -0
  332. package/nodes/accessors/SkinningNode.js +48 -46
  333. package/nodes/accessors/TextureNode.cjs.js +1 -0
  334. package/nodes/accessors/TextureNode.js +29 -14
  335. package/nodes/accessors/UVNode.cjs.js +1 -0
  336. package/nodes/accessors/UVNode.js +11 -5
  337. package/nodes/core/ArrayUniformNode.cjs.js +1 -0
  338. package/nodes/core/ArrayUniformNode.js +7 -3
  339. package/nodes/core/AttributeNode.cjs.js +1 -0
  340. package/nodes/core/AttributeNode.js +12 -5
  341. package/nodes/core/BypassNode.cjs.js +1 -0
  342. package/nodes/core/BypassNode.js +12 -5
  343. package/nodes/core/CodeNode.cjs.js +1 -0
  344. package/nodes/core/CodeNode.js +12 -4
  345. package/nodes/core/ConstNode.cjs.js +1 -0
  346. package/nodes/core/ConstNode.js +7 -3
  347. package/nodes/core/ContextNode.cjs.js +1 -0
  348. package/nodes/core/ContextNode.js +8 -3
  349. package/nodes/core/ExpressionNode.cjs.js +1 -0
  350. package/nodes/core/ExpressionNode.js +9 -5
  351. package/nodes/core/FunctionCallNode.cjs.js +1 -0
  352. package/nodes/core/FunctionCallNode.js +15 -6
  353. package/nodes/core/FunctionNode.cjs.js +1 -0
  354. package/nodes/core/FunctionNode.js +25 -10
  355. package/nodes/core/InputNode.cjs.js +1 -0
  356. package/nodes/core/InputNode.js +23 -12
  357. package/nodes/core/Node.cjs.js +1 -0
  358. package/nodes/core/Node.js +75 -35
  359. package/nodes/core/NodeAttribute.cjs.js +1 -0
  360. package/nodes/core/NodeAttribute.js +4 -2
  361. package/nodes/core/NodeBuilder.cjs.js +1 -0
  362. package/nodes/core/NodeBuilder.js +224 -110
  363. package/nodes/core/NodeCode.cjs.js +1 -0
  364. package/nodes/core/NodeCode.js +7 -4
  365. package/nodes/core/NodeFrame.cjs.js +1 -0
  366. package/nodes/core/NodeFrame.js +12 -9
  367. package/nodes/core/NodeFunction.cjs.js +1 -0
  368. package/nodes/core/NodeFunction.js +17 -0
  369. package/nodes/core/NodeFunctionInput.cjs.js +1 -0
  370. package/nodes/core/NodeFunctionInput.js +5 -3
  371. package/nodes/core/NodeKeywords.cjs.js +1 -0
  372. package/nodes/core/NodeKeywords.js +16 -5
  373. package/nodes/core/NodeParser.cjs.js +1 -0
  374. package/nodes/core/NodeParser.js +8 -0
  375. package/nodes/core/NodeUniform.cjs.js +1 -0
  376. package/nodes/core/NodeUniform.js +7 -3
  377. package/nodes/core/NodeUtils.cjs.js +1 -0
  378. package/nodes/core/NodeUtils.js +43 -39
  379. package/nodes/core/NodeVar.cjs.js +1 -0
  380. package/nodes/core/NodeVar.js +4 -2
  381. package/nodes/core/NodeVary.cjs.js +1 -0
  382. package/nodes/core/NodeVary.js +4 -2
  383. package/nodes/core/PropertyNode.cjs.js +1 -0
  384. package/nodes/core/PropertyNode.js +10 -4
  385. package/nodes/core/TempNode.cjs.js +1 -0
  386. package/nodes/core/TempNode.js +11 -5
  387. package/nodes/core/UniformNode.cjs.js +1 -0
  388. package/nodes/core/UniformNode.js +10 -4
  389. package/nodes/core/VarNode.cjs.js +1 -0
  390. package/nodes/core/VarNode.js +11 -3
  391. package/nodes/core/VaryNode.cjs.js +1 -0
  392. package/nodes/core/VaryNode.js +15 -6
  393. package/nodes/core/constants.cjs.js +1 -0
  394. package/nodes/core/constants.js +7 -20
  395. package/nodes/display/ColorSpaceNode.cjs.js +1 -0
  396. package/nodes/display/ColorSpaceNode.js +38 -34
  397. package/nodes/display/NormalMapNode.cjs.js +1 -0
  398. package/nodes/display/NormalMapNode.js +53 -35
  399. package/nodes/fog/FogNode.cjs.js +1 -0
  400. package/nodes/fog/FogNode.js +9 -5
  401. package/nodes/fog/FogRangeNode.cjs.js +1 -0
  402. package/nodes/fog/FogRangeNode.js +9 -5
  403. package/nodes/functions/BSDFs.cjs.js +1 -0
  404. package/nodes/functions/BSDFs.js +118 -61
  405. package/nodes/functions/PhysicalMaterialFunctions.cjs.js +1 -0
  406. package/nodes/functions/PhysicalMaterialFunctions.js +57 -0
  407. package/nodes/lights/LightContextNode.cjs.js +1 -0
  408. package/nodes/lights/LightContextNode.js +23 -14
  409. package/nodes/lights/LightNode.cjs.js +1 -0
  410. package/nodes/lights/LightNode.js +31 -27
  411. package/nodes/lights/LightsNode.cjs.js +1 -0
  412. package/nodes/lights/LightsNode.js +28 -9
  413. package/nodes/loaders/NodeLoader.cjs.js +1 -0
  414. package/nodes/loaders/NodeLoader.js +42 -27
  415. package/nodes/loaders/NodeMaterialLoader.cjs.js +1 -0
  416. package/nodes/loaders/NodeMaterialLoader.js +10 -4
  417. package/nodes/loaders/NodeObjectLoader.cjs.js +1 -0
  418. package/nodes/loaders/NodeObjectLoader.js +19 -9
  419. package/nodes/materials/LineBasicNodeMaterial.cjs.js +1 -0
  420. package/nodes/materials/LineBasicNodeMaterial.js +10 -5
  421. package/nodes/materials/Materials.cjs.js +1 -0
  422. package/nodes/materials/Materials.js +17 -14
  423. package/nodes/materials/MeshBasicNodeMaterial.cjs.js +1 -0
  424. package/nodes/materials/MeshBasicNodeMaterial.js +10 -5
  425. package/nodes/materials/MeshStandardNodeMaterial.cjs.js +1 -0
  426. package/nodes/materials/MeshStandardNodeMaterial.js +8 -5
  427. package/nodes/materials/NodeMaterial.cjs.js +1 -0
  428. package/nodes/materials/NodeMaterial.js +36 -20
  429. package/nodes/materials/PointsNodeMaterial.cjs.js +1 -0
  430. package/nodes/materials/PointsNodeMaterial.js +10 -5
  431. package/nodes/math/CondNode.cjs.js +1 -0
  432. package/nodes/math/CondNode.js +23 -11
  433. package/nodes/math/MathNode.cjs.js +1 -0
  434. package/nodes/math/MathNode.js +142 -98
  435. package/nodes/math/OperatorNode.cjs.js +1 -0
  436. package/nodes/math/OperatorNode.js +46 -24
  437. package/nodes/parsers/GLSLNodeFunction.cjs.js +1 -0
  438. package/nodes/parsers/GLSLNodeFunction.js +101 -0
  439. package/nodes/parsers/GLSLNodeParser.cjs.js +1 -0
  440. package/nodes/parsers/GLSLNodeParser.js +13 -0
  441. package/nodes/parsers/WGSLNodeFunction.cjs.js +1 -0
  442. package/nodes/parsers/WGSLNodeFunction.js +71 -0
  443. package/nodes/parsers/WGSLNodeParser.cjs.js +1 -0
  444. package/nodes/parsers/WGSLNodeParser.js +13 -0
  445. package/nodes/procedural/CheckerNode.cjs.js +1 -0
  446. package/nodes/procedural/CheckerNode.js +19 -13
  447. package/nodes/utils/ArrayElementNode.cjs.js +1 -0
  448. package/nodes/utils/ArrayElementNode.js +8 -4
  449. package/nodes/utils/ConvertNode.cjs.js +1 -0
  450. package/nodes/utils/ConvertNode.js +8 -3
  451. package/nodes/utils/JoinNode.cjs.js +1 -0
  452. package/nodes/utils/JoinNode.js +11 -7
  453. package/nodes/utils/MatcapUVNode.cjs.js +1 -0
  454. package/nodes/utils/MatcapUVNode.js +11 -8
  455. package/nodes/utils/OscNode.cjs.js +1 -0
  456. package/nodes/utils/OscNode.js +33 -27
  457. package/nodes/utils/SplitNode.cjs.js +1 -0
  458. package/nodes/utils/SplitNode.js +20 -6
  459. package/nodes/utils/SpriteSheetUVNode.cjs.js +1 -0
  460. package/nodes/utils/SpriteSheetUVNode.js +23 -23
  461. package/nodes/utils/TimerNode.cjs.js +1 -0
  462. package/nodes/utils/TimerNode.js +24 -20
  463. package/objects/GroundProjectedEnv.cjs.js +1 -0
  464. package/objects/GroundProjectedEnv.js +37 -22
  465. package/objects/Lensflare.cjs.js +1 -0
  466. package/objects/Lensflare.js +156 -86
  467. package/objects/LightningStorm.cjs.js +1 -0
  468. package/objects/LightningStorm.js +102 -38
  469. package/objects/MarchingCubes.cjs.js +1 -0
  470. package/objects/MarchingCubes.js +303 -150
  471. package/objects/Reflector.cjs.js +1 -0
  472. package/objects/Reflector.js +72 -50
  473. package/objects/ReflectorForSSRPass.cjs.js +1 -0
  474. package/objects/ReflectorForSSRPass.js +131 -80
  475. package/objects/ReflectorRTT.cjs.js +1 -0
  476. package/objects/ReflectorRTT.js +7 -6
  477. package/objects/Refractor.cjs.js +1 -0
  478. package/objects/Refractor.js +106 -64
  479. package/objects/ShadowMesh.cjs.js +1 -0
  480. package/objects/ShadowMesh.js +17 -8
  481. package/objects/Sky.cjs.js +1 -0
  482. package/objects/Sky.js +80 -119
  483. package/objects/Water.cjs.js +1 -0
  484. package/objects/Water.js +127 -83
  485. package/objects/Water2.cjs.js +1 -0
  486. package/objects/Water2.js +108 -72
  487. package/offscreen/jank.cjs.js +1 -0
  488. package/offscreen/jank.js +14 -10
  489. package/offscreen/offscreen.cjs.js +1 -0
  490. package/offscreen/offscreen.js +5 -4
  491. package/offscreen/scene.cjs.js +1 -0
  492. package/offscreen/scene.js +48 -45
  493. package/package.json +3 -3
  494. package/physics/AmmoPhysics.cjs.js +1 -0
  495. package/physics/AmmoPhysics.js +71 -30
  496. package/postprocessing/AdaptiveToneMappingPass.cjs.js +1 -0
  497. package/postprocessing/AdaptiveToneMappingPass.js +123 -97
  498. package/postprocessing/AfterimagePass.cjs.js +1 -0
  499. package/postprocessing/AfterimagePass.js +49 -28
  500. package/postprocessing/BloomPass.cjs.js +1 -0
  501. package/postprocessing/BloomPass.js +69 -43
  502. package/postprocessing/BokehPass.cjs.js +1 -0
  503. package/postprocessing/BokehPass.js +69 -39
  504. package/postprocessing/ClearPass.cjs.js +1 -0
  505. package/postprocessing/ClearPass.js +25 -10
  506. package/postprocessing/CubeTexturePass.cjs.js +1 -0
  507. package/postprocessing/CubeTexturePass.js +27 -28
  508. package/postprocessing/DotScreenPass.cjs.js +1 -0
  509. package/postprocessing/DotScreenPass.js +32 -24
  510. package/postprocessing/EffectComposer.cjs.js +1 -0
  511. package/postprocessing/EffectComposer.js +86 -39
  512. package/postprocessing/FilmPass.cjs.js +1 -0
  513. package/postprocessing/FilmPass.js +30 -25
  514. package/postprocessing/GlitchPass.cjs.js +1 -0
  515. package/postprocessing/GlitchPass.js +61 -38
  516. package/postprocessing/HalftonePass.cjs.js +1 -0
  517. package/postprocessing/HalftonePass.js +39 -19
  518. package/postprocessing/LUTPass.cjs.js +1 -0
  519. package/postprocessing/LUTPass.js +38 -13
  520. package/postprocessing/MaskPass.cjs.js +1 -0
  521. package/postprocessing/MaskPass.js +38 -19
  522. package/postprocessing/OutlinePass.cjs.js +1 -0
  523. package/postprocessing/OutlinePass.js +277 -135
  524. package/postprocessing/Pass.cjs.js +1 -0
  525. package/postprocessing/Pass.js +44 -20
  526. package/postprocessing/RenderPass.cjs.js +1 -0
  527. package/postprocessing/RenderPass.js +36 -13
  528. package/postprocessing/RenderPixelatedPass.cjs.js +1 -0
  529. package/postprocessing/RenderPixelatedPass.js +58 -44
  530. package/postprocessing/SAOPass.cjs.js +1 -0
  531. package/postprocessing/SAOPass.js +189 -154
  532. package/postprocessing/SMAAPass.cjs.js +1 -0
  533. package/postprocessing/SMAAPass.js +84 -64
  534. package/postprocessing/SSAARenderPass.cjs.js +1 -0
  535. package/postprocessing/SSAARenderPass.js +69 -121
  536. package/postprocessing/SSAOPass.cjs.js +1 -0
  537. package/postprocessing/SSAOPass.js +172 -123
  538. package/postprocessing/SSRPass.cjs.js +1 -0
  539. package/postprocessing/SSRPass.js +280 -211
  540. package/postprocessing/SavePass.cjs.js +1 -0
  541. package/postprocessing/SavePass.js +25 -20
  542. package/postprocessing/ShaderPass.cjs.js +1 -0
  543. package/postprocessing/ShaderPass.js +30 -14
  544. package/postprocessing/TAARenderPass.cjs.js +1 -0
  545. package/postprocessing/TAARenderPass.js +61 -42
  546. package/postprocessing/TexturePass.cjs.js +1 -0
  547. package/postprocessing/TexturePass.js +22 -21
  548. package/postprocessing/UnrealBloomPass.cjs.js +1 -0
  549. package/postprocessing/UnrealBloomPass.js +213 -105
  550. package/renderers/CSS2DRenderer.cjs.js +1 -0
  551. package/renderers/CSS2DRenderer.js +56 -44
  552. package/renderers/CSS3DRenderer.cjs.js +1 -0
  553. package/renderers/CSS3DRenderer.js +86 -53
  554. package/renderers/Projector.cjs.js +1 -0
  555. package/renderers/Projector.js +274 -107
  556. package/renderers/SVGRenderer.cjs.js +1 -0
  557. package/renderers/SVGRenderer.js +182 -72
  558. package/renderers/nodes/accessors/CameraNode.cjs.js +1 -0
  559. package/renderers/nodes/accessors/CameraNode.js +40 -29
  560. package/renderers/nodes/accessors/ModelNode.cjs.js +1 -0
  561. package/renderers/nodes/accessors/ModelNode.js +37 -28
  562. package/renderers/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
  563. package/renderers/nodes/accessors/ModelViewProjectionNode.js +23 -10
  564. package/renderers/nodes/accessors/NormalNode.cjs.js +1 -0
  565. package/renderers/nodes/accessors/NormalNode.js +45 -35
  566. package/renderers/nodes/accessors/PositionNode.cjs.js +1 -0
  567. package/renderers/nodes/accessors/PositionNode.js +19 -18
  568. package/renderers/nodes/accessors/UVNode.cjs.js +1 -0
  569. package/renderers/nodes/accessors/UVNode.js +10 -5
  570. package/renderers/nodes/core/AttributeNode.cjs.js +1 -0
  571. package/renderers/nodes/core/AttributeNode.js +14 -5
  572. package/renderers/nodes/core/InputNode.cjs.js +1 -0
  573. package/renderers/nodes/core/InputNode.js +14 -4
  574. package/renderers/nodes/core/Node.cjs.js +1 -0
  575. package/renderers/nodes/core/Node.js +17 -7
  576. package/renderers/nodes/core/NodeAttribute.cjs.js +1 -0
  577. package/renderers/nodes/core/NodeAttribute.js +6 -3
  578. package/renderers/nodes/core/NodeBuilder.cjs.js +1 -0
  579. package/renderers/nodes/core/NodeBuilder.js +154 -87
  580. package/renderers/nodes/core/NodeFrame.cjs.js +1 -0
  581. package/renderers/nodes/core/NodeFrame.js +12 -9
  582. package/renderers/nodes/core/NodeSlot.cjs.js +1 -0
  583. package/renderers/nodes/core/NodeSlot.js +3 -2
  584. package/renderers/nodes/core/NodeUniform.cjs.js +1 -0
  585. package/renderers/nodes/core/NodeUniform.js +9 -4
  586. package/renderers/nodes/core/NodeVary.cjs.js +1 -0
  587. package/renderers/nodes/core/NodeVary.js +7 -4
  588. package/renderers/nodes/core/VaryNode.cjs.js +1 -0
  589. package/renderers/nodes/core/VaryNode.js +12 -6
  590. package/renderers/nodes/core/constants.cjs.js +1 -0
  591. package/renderers/nodes/core/constants.js +13 -16
  592. package/renderers/nodes/inputs/ColorNode.cjs.js +1 -0
  593. package/renderers/nodes/inputs/ColorNode.js +11 -5
  594. package/renderers/nodes/inputs/FloatNode.cjs.js +1 -0
  595. package/renderers/nodes/inputs/FloatNode.js +11 -5
  596. package/renderers/nodes/inputs/Matrix3Node.cjs.js +1 -0
  597. package/renderers/nodes/inputs/Matrix3Node.js +13 -7
  598. package/renderers/nodes/inputs/Matrix4Node.cjs.js +1 -0
  599. package/renderers/nodes/inputs/Matrix4Node.js +13 -7
  600. package/renderers/nodes/inputs/TextureNode.cjs.js +1 -0
  601. package/renderers/nodes/inputs/TextureNode.js +15 -7
  602. package/renderers/nodes/inputs/Vector2Node.cjs.js +1 -0
  603. package/renderers/nodes/inputs/Vector2Node.js +11 -5
  604. package/renderers/nodes/inputs/Vector3Node.cjs.js +1 -0
  605. package/renderers/nodes/inputs/Vector3Node.js +13 -7
  606. package/renderers/nodes/inputs/Vector4Node.cjs.js +1 -0
  607. package/renderers/nodes/inputs/Vector4Node.js +13 -7
  608. package/renderers/nodes/math/MathNode.cjs.js +1 -0
  609. package/renderers/nodes/math/MathNode.js +30 -20
  610. package/renderers/nodes/math/OperatorNode.cjs.js +1 -0
  611. package/renderers/nodes/math/OperatorNode.js +20 -4
  612. package/renderers/nodes/utils/SwitchNode.cjs.js +1 -0
  613. package/renderers/nodes/utils/SwitchNode.js +9 -4
  614. package/renderers/nodes/utils/TimerNode.cjs.js +1 -0
  615. package/renderers/nodes/utils/TimerNode.js +10 -5
  616. package/renderers/webgpu/WebGPU.cjs.js +1 -0
  617. package/renderers/webgpu/WebGPU.js +16 -14
  618. package/renderers/webgpu/WebGPUAttributes.cjs.js +1 -0
  619. package/renderers/webgpu/WebGPUAttributes.js +23 -16
  620. package/renderers/webgpu/WebGPUBackground.cjs.js +1 -0
  621. package/renderers/webgpu/WebGPUBackground.js +30 -13
  622. package/renderers/webgpu/WebGPUBinding.cjs.js +1 -0
  623. package/renderers/webgpu/WebGPUBinding.js +7 -4
  624. package/renderers/webgpu/WebGPUBindings.cjs.js +1 -0
  625. package/renderers/webgpu/WebGPUBindings.js +57 -21
  626. package/renderers/webgpu/WebGPUComputePipelines.cjs.js +1 -0
  627. package/renderers/webgpu/WebGPUComputePipelines.js +25 -14
  628. package/renderers/webgpu/WebGPUGeometries.cjs.js +1 -0
  629. package/renderers/webgpu/WebGPUGeometries.js +15 -5
  630. package/renderers/webgpu/WebGPUInfo.cjs.js +1 -0
  631. package/renderers/webgpu/WebGPUInfo.js +8 -3
  632. package/renderers/webgpu/WebGPUObjects.cjs.js +1 -0
  633. package/renderers/webgpu/WebGPUObjects.js +10 -5
  634. package/renderers/webgpu/WebGPUProperties.cjs.js +1 -0
  635. package/renderers/webgpu/WebGPUProperties.js +11 -5
  636. package/renderers/webgpu/WebGPURenderLists.cjs.js +1 -0
  637. package/renderers/webgpu/WebGPURenderLists.js +36 -20
  638. package/renderers/webgpu/WebGPURenderPipelines.cjs.js +1 -0
  639. package/renderers/webgpu/WebGPURenderPipelines.js +387 -260
  640. package/renderers/webgpu/WebGPURenderer.cjs.js +1 -0
  641. package/renderers/webgpu/WebGPURenderer.js +262 -124
  642. package/renderers/webgpu/WebGPUSampledTexture.cjs.js +1 -0
  643. package/renderers/webgpu/WebGPUSampledTexture.js +31 -18
  644. package/renderers/webgpu/WebGPUSampler.cjs.js +1 -0
  645. package/renderers/webgpu/WebGPUSampler.js +12 -7
  646. package/renderers/webgpu/WebGPUStorageBuffer.cjs.js +1 -0
  647. package/renderers/webgpu/WebGPUStorageBuffer.js +12 -7
  648. package/renderers/webgpu/WebGPUTextureRenderer.cjs.js +1 -0
  649. package/renderers/webgpu/WebGPUTextureRenderer.js +11 -5
  650. package/renderers/webgpu/WebGPUTextureUtils.cjs.js +1 -0
  651. package/renderers/webgpu/WebGPUTextureUtils.js +40 -29
  652. package/renderers/webgpu/WebGPUTextures.cjs.js +1 -0
  653. package/renderers/webgpu/WebGPUTextures.js +333 -186
  654. package/renderers/webgpu/WebGPUUniform.cjs.js +1 -0
  655. package/renderers/webgpu/WebGPUUniform.js +51 -25
  656. package/renderers/webgpu/WebGPUUniformsGroup.cjs.js +1 -0
  657. package/renderers/webgpu/WebGPUUniformsGroup.js +72 -32
  658. package/renderers/webgpu/constants.cjs.js +1 -0
  659. package/renderers/webgpu/constants.js +181 -190
  660. package/renderers/webgpu/nodes/ShaderLib.cjs.js +1 -0
  661. package/renderers/webgpu/nodes/ShaderLib.js +2 -2
  662. package/renderers/webgpu/nodes/WebGPUNodeBuilder.cjs.js +1 -0
  663. package/renderers/webgpu/nodes/WebGPUNodeBuilder.js +124 -53
  664. package/renderers/webgpu/nodes/WebGPUNodeUniform.cjs.js +1 -0
  665. package/renderers/webgpu/nodes/WebGPUNodeUniform.js +31 -17
  666. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.cjs.js +1 -0
  667. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.js +9 -8
  668. package/renderers/webgpu/nodes/WebGPUNodes.cjs.js +1 -0
  669. package/renderers/webgpu/nodes/WebGPUNodes.js +45 -7
  670. package/shaders/ACESFilmicToneMappingShader.cjs.js +1 -0
  671. package/shaders/ACESFilmicToneMappingShader.js +24 -44
  672. package/shaders/AfterimageShader.cjs.js +1 -0
  673. package/shaders/AfterimageShader.js +18 -28
  674. package/shaders/BasicShader.cjs.js +1 -0
  675. package/shaders/BasicShader.js +7 -9
  676. package/shaders/BleachBypassShader.cjs.js +1 -0
  677. package/shaders/BleachBypassShader.js +15 -31
  678. package/shaders/BlendShader.cjs.js +1 -0
  679. package/shaders/BlendShader.js +19 -26
  680. package/shaders/BokehShader.cjs.js +1 -0
  681. package/shaders/BokehShader.js +36 -98
  682. package/shaders/BokehShader2.cjs.js +1 -0
  683. package/shaders/BokehShader2.js +90 -261
  684. package/shaders/BrightnessContrastShader.cjs.js +1 -0
  685. package/shaders/BrightnessContrastShader.js +19 -28
  686. package/shaders/ColorCorrectionShader.cjs.js +1 -0
  687. package/shaders/ColorCorrectionShader.js +22 -26
  688. package/shaders/ColorifyShader.cjs.js +1 -0
  689. package/shaders/ColorifyShader.js +16 -24
  690. package/shaders/ConvolutionShader.cjs.js +1 -0
  691. package/shaders/ConvolutionShader.js +36 -40
  692. package/shaders/CopyShader.cjs.js +1 -0
  693. package/shaders/CopyShader.js +13 -21
  694. package/shaders/DOFMipMapShader.cjs.js +1 -0
  695. package/shaders/DOFMipMapShader.js +21 -28
  696. package/shaders/DepthLimitedBlurShader.cjs.js +1 -0
  697. package/shaders/DepthLimitedBlurShader.js +40 -85
  698. package/shaders/DigitalGlitch.cjs.js +1 -0
  699. package/shaders/DigitalGlitch.js +46 -74
  700. package/shaders/DotScreenShader.cjs.js +1 -0
  701. package/shaders/DotScreenShader.js +27 -35
  702. package/shaders/FXAAShader.cjs.js +1 -0
  703. package/shaders/FXAAShader.js +19 -1094
  704. package/shaders/FilmShader.cjs.js +1 -0
  705. package/shaders/FilmShader.js +52 -38
  706. package/shaders/FocusShader.cjs.js +1 -0
  707. package/shaders/FocusShader.js +24 -51
  708. package/shaders/FreiChenShader.cjs.js +1 -0
  709. package/shaders/FreiChenShader.js +24 -57
  710. package/shaders/FresnelShader.cjs.js +1 -0
  711. package/shaders/FresnelShader.js +22 -43
  712. package/shaders/GammaCorrectionShader.cjs.js +1 -0
  713. package/shaders/GammaCorrectionShader.js +11 -19
  714. package/shaders/GodRaysShader.cjs.js +1 -0
  715. package/shaders/GodRaysShader.js +94 -103
  716. package/shaders/HalftoneShader.cjs.js +1 -0
  717. package/shaders/HalftoneShader.js +65 -208
  718. package/shaders/HorizontalBlurShader.cjs.js +1 -0
  719. package/shaders/HorizontalBlurShader.js +23 -7
  720. package/shaders/HorizontalTiltShiftShader.cjs.js +1 -0
  721. package/shaders/HorizontalTiltShiftShader.js +21 -33
  722. package/shaders/HueSaturationShader.cjs.js +1 -0
  723. package/shaders/HueSaturationShader.js +21 -37
  724. package/shaders/KaleidoShader.cjs.js +1 -0
  725. package/shaders/KaleidoShader.js +22 -30
  726. package/shaders/LuminosityHighPassShader.cjs.js +1 -0
  727. package/shaders/LuminosityHighPassShader.js +27 -33
  728. package/shaders/LuminosityShader.cjs.js +1 -0
  729. package/shaders/LuminosityShader.js +11 -21
  730. package/shaders/MirrorShader.cjs.js +1 -0
  731. package/shaders/MirrorShader.js +16 -31
  732. package/shaders/NormalMapShader.cjs.js +1 -0
  733. package/shaders/NormalMapShader.js +23 -27
  734. package/shaders/ParallaxShader.cjs.js +1 -0
  735. package/shaders/ParallaxShader.js +48 -107
  736. package/shaders/PixelShader.cjs.js +1 -0
  737. package/shaders/PixelShader.js +16 -24
  738. package/shaders/RGBShiftShader.cjs.js +1 -0
  739. package/shaders/RGBShiftShader.js +22 -26
  740. package/shaders/SAOShader.cjs.js +1 -0
  741. package/shaders/SAOShader.js +48 -132
  742. package/shaders/SMAAShader.cjs.js +1 -0
  743. package/shaders/SMAAShader.js +135 -256
  744. package/shaders/SSAOShader.cjs.js +1 -0
  745. package/shaders/SSAOShader.js +81 -153
  746. package/shaders/SSRShader.cjs.js +1 -0
  747. package/shaders/SSRShader.js +87 -32
  748. package/shaders/SepiaShader.cjs.js +1 -0
  749. package/shaders/SepiaShader.js +15 -25
  750. package/shaders/SobelOperatorShader.cjs.js +1 -0
  751. package/shaders/SobelOperatorShader.js +29 -40
  752. package/shaders/SubsurfaceScatteringShader.cjs.js +1 -0
  753. package/shaders/SubsurfaceScatteringShader.js +39 -53
  754. package/shaders/TechnicolorShader.cjs.js +1 -0
  755. package/shaders/TechnicolorShader.js +13 -20
  756. package/shaders/ToneMapShader.cjs.js +1 -0
  757. package/shaders/ToneMapShader.js +28 -44
  758. package/shaders/ToonShader.cjs.js +1 -0
  759. package/shaders/ToonShader.js +96 -172
  760. package/shaders/TriangleBlurShader.cjs.js +1 -0
  761. package/shaders/TriangleBlurShader.js +23 -32
  762. package/shaders/UnpackDepthRGBAShader.cjs.js +1 -0
  763. package/shaders/UnpackDepthRGBAShader.js +14 -22
  764. package/shaders/VerticalBlurShader.cjs.js +1 -0
  765. package/shaders/VerticalBlurShader.js +23 -7
  766. package/shaders/VerticalTiltShiftShader.cjs.js +1 -0
  767. package/shaders/VerticalTiltShiftShader.js +21 -33
  768. package/shaders/VignetteShader.cjs.js +1 -0
  769. package/shaders/VignetteShader.js +28 -24
  770. package/shaders/VolumeShader.cjs.js +1 -0
  771. package/shaders/VolumeShader.js +77 -174
  772. package/shaders/WaterRefractionShader.cjs.js +1 -0
  773. package/shaders/WaterRefractionShader.js +6 -38
  774. package/shaders/types.cjs.js +1 -0
  775. package/shaders/types.js +1 -1
  776. package/textures/FlakesTexture.cjs.js +1 -0
  777. package/textures/FlakesTexture.js +10 -8
  778. package/types/helpers.cjs.js +1 -0
  779. package/types/helpers.js +2 -3
  780. package/types/shared.cjs.js +1 -0
  781. package/types/shared.js +1 -0
  782. package/types/utils.cjs.js +1 -0
  783. package/types/utils.js +1 -0
  784. package/utils/BufferGeometryUtils.cjs.js +1 -0
  785. package/utils/BufferGeometryUtils.js +325 -251
  786. package/utils/GeometryCompressionUtils.cjs.js +1 -0
  787. package/utils/GeometryCompressionUtils.js +239 -241
  788. package/utils/GeometryUtils.cjs.js +1 -0
  789. package/utils/GeometryUtils.js +94 -41
  790. package/utils/LDrawUtils.cjs.js +1 -0
  791. package/utils/LDrawUtils.d.ts +5 -0
  792. package/utils/LDrawUtils.js +144 -0
  793. package/utils/RoughnessMipmapper.cjs.js +1 -0
  794. package/utils/RoughnessMipmapper.js +82 -38
  795. package/utils/SceneUtils.cjs.js +1 -0
  796. package/utils/SceneUtils.js +20 -15
  797. package/utils/ShadowMapViewer.cjs.js +1 -0
  798. package/utils/ShadowMapViewer.js +95 -49
  799. package/utils/SkeletonUtils.cjs.js +1 -0
  800. package/utils/SkeletonUtils.js +165 -74
  801. package/utils/UVsDebug.cjs.js +1 -0
  802. package/utils/UVsDebug.js +62 -32
  803. package/utils/WorkerPool.cjs.js +1 -0
  804. package/utils/WorkerPool.js +33 -13
  805. package/webxr/ARButton.cjs.js +1 -0
  806. package/webxr/ARButton.js +98 -72
  807. package/webxr/OculusHandModel.cjs.js +1 -0
  808. package/webxr/OculusHandModel.js +37 -18
  809. package/webxr/OculusHandPointerModel.cjs.js +1 -0
  810. package/webxr/OculusHandPointerModel.js +80 -58
  811. package/webxr/Text2D.cjs.js +1 -0
  812. package/webxr/Text2D.js +19 -37
  813. package/webxr/VRButton.cjs.js +1 -0
  814. package/webxr/VRButton.js +90 -59
  815. package/webxr/XRControllerModelFactory.cjs.js +1 -0
  816. package/webxr/XRControllerModelFactory.js +116 -58
  817. package/webxr/XREstimatedLight.cjs.js +1 -0
  818. package/webxr/XREstimatedLight.js +66 -39
  819. package/webxr/XRHandMeshModel.cjs.js +1 -0
  820. package/webxr/XRHandMeshModel.js +29 -40
  821. package/webxr/XRHandModelFactory.cjs.js +1 -0
  822. package/webxr/XRHandModelFactory.js +31 -28
  823. package/webxr/XRHandPrimitiveModel.cjs.js +1 -0
  824. package/webxr/XRHandPrimitiveModel.js +27 -41
  825. package/animation/AnimationClipCreator.mjs +0 -57
  826. package/animation/CCDIKSolver.mjs +0 -223
  827. package/animation/MMDAnimationHelper.mjs +0 -514
  828. package/animation/MMDPhysics.mjs +0 -769
  829. package/cameras/CinematicCamera.mjs +0 -129
  830. package/controls/ArcballControls.mjs +0 -1737
  831. package/controls/DeviceOrientationControls.mjs +0 -74
  832. package/controls/DragControls.mjs +0 -172
  833. package/controls/FirstPersonControls.mjs +0 -220
  834. package/controls/FlyControls.mjs +0 -239
  835. package/controls/OrbitControls.mjs +0 -731
  836. package/controls/PointerLockControls.mjs +0 -88
  837. package/controls/TrackballControls.mjs +0 -481
  838. package/controls/TransformControls.mjs +0 -1068
  839. package/controls/experimental/CameraControls.mjs +0 -673
  840. package/csm/CSM.mjs +0 -244
  841. package/csm/CSMFrustum.mjs +0 -75
  842. package/csm/CSMHelper.mjs +0 -114
  843. package/csm/CSMShader.mjs +0 -251
  844. package/curves/CurveExtras.mjs +0 -224
  845. package/curves/NURBSCurve.mjs +0 -35
  846. package/curves/NURBSSurface.mjs +0 -28
  847. package/curves/NURBSUtils.mjs +0 -226
  848. package/deprecated/Geometry.mjs +0 -966
  849. package/effects/AnaglyphEffect.mjs +0 -120
  850. package/effects/AsciiEffect.mjs +0 -173
  851. package/effects/OutlineEffect.mjs +0 -295
  852. package/effects/ParallaxBarrierEffect.mjs +0 -64
  853. package/effects/PeppersGhostEffect.mjs +0 -85
  854. package/effects/StereoEffect.mjs +0 -32
  855. package/environments/RoomEnvironment.mjs +0 -78
  856. package/exporters/ColladaExporter.mjs +0 -299
  857. package/exporters/DRACOExporter.mjs +0 -132
  858. package/exporters/GLTFExporter.mjs +0 -1381
  859. package/exporters/MMDExporter.mjs +0 -102
  860. package/exporters/OBJExporter.mjs +0 -166
  861. package/exporters/PLYExporter.mjs +0 -278
  862. package/exporters/STLExporter.mjs +0 -129
  863. package/exporters/USDZExporter.mjs +0 -328
  864. package/geometries/BoxLineGeometry.mjs +0 -45
  865. package/geometries/ConvexGeometry.mjs +0 -29
  866. package/geometries/DecalGeometry.mjs +0 -184
  867. package/geometries/LightningStrike.mjs +0 -547
  868. package/geometries/ParametricGeometries.mjs +0 -129
  869. package/geometries/ParametricGeometry.mjs +0 -63
  870. package/geometries/RoundedBoxGeometry.mjs +0 -91
  871. package/geometries/TeapotGeometry.mjs +0 -1557
  872. package/geometries/TextGeometry.mjs +0 -23
  873. package/helpers/LightProbeHelper.mjs +0 -72
  874. package/helpers/PositionalAudioHelper.mjs +0 -68
  875. package/helpers/RectAreaLightHelper.mjs +0 -44
  876. package/helpers/VertexNormalsHelper.mjs +0 -54
  877. package/helpers/VertexTangentsHelper.mjs +0 -45
  878. package/index.mjs +0 -969
  879. package/interactive/SelectionBox.mjs +0 -137
  880. package/interactive/SelectionHelper.mjs +0 -54
  881. package/libs/MeshoptDecoder.mjs +0 -210
  882. package/libs/MotionControllers.mjs +0 -261
  883. package/lights/LightProbeGenerator.mjs +0 -145
  884. package/lights/RectAreaLightUniformsLib.mjs +0 -32842
  885. package/lines/Line2.mjs +0 -13
  886. package/lines/LineGeometry.mjs +0 -44
  887. package/lines/LineMaterial.mjs +0 -539
  888. package/lines/LineSegments2.mjs +0 -202
  889. package/lines/LineSegmentsGeometry.mjs +0 -124
  890. package/lines/Wireframe.mjs +0 -31
  891. package/lines/WireframeGeometry2.mjs +0 -13
  892. package/loaders/3DMLoader.mjs +0 -802
  893. package/loaders/3MFLoader.mjs +0 -837
  894. package/loaders/AMFLoader.mjs +0 -284
  895. package/loaders/AssimpLoader.mjs +0 -1396
  896. package/loaders/BVHLoader.mjs +0 -207
  897. package/loaders/BasisTextureLoader.mjs +0 -474
  898. package/loaders/ColladaLoader.mjs +0 -2403
  899. package/loaders/DDSLoader.mjs +0 -148
  900. package/loaders/DRACOLoader.mjs +0 -340
  901. package/loaders/EXRLoader.mjs +0 -1351
  902. package/loaders/FBXLoader.mjs +0 -2362
  903. package/loaders/FontLoader.mjs +0 -111
  904. package/loaders/GCodeLoader.mjs +0 -141
  905. package/loaders/GLTFLoader.mjs +0 -2316
  906. package/loaders/HDRCubeTextureLoader.mjs +0 -77
  907. package/loaders/KMZLoader.mjs +0 -75
  908. package/loaders/KTX2Loader.mjs +0 -427
  909. package/loaders/KTXLoader.mjs +0 -87
  910. package/loaders/LDrawLoader.mjs +0 -1409
  911. package/loaders/LUT3dlLoader.mjs +0 -100
  912. package/loaders/LUTCubeLoader.mjs +0 -104
  913. package/loaders/LWOLoader.mjs +0 -625
  914. package/loaders/LottieLoader.mjs +0 -47
  915. package/loaders/MD2Loader.mjs +0 -359
  916. package/loaders/MDDLoader.mjs +0 -58
  917. package/loaders/MMDLoader.mjs +0 -998
  918. package/loaders/MTLLoader.mjs +0 -280
  919. package/loaders/NRRDLoader.mjs +0 -401
  920. package/loaders/NodeMaterialLoader.mjs +0 -146
  921. package/loaders/OBJLoader.mjs +0 -487
  922. package/loaders/PCDLoader.mjs +0 -248
  923. package/loaders/PDBLoader.mjs +0 -246
  924. package/loaders/PLYLoader.mjs +0 -317
  925. package/loaders/PRWMLoader.mjs +0 -160
  926. package/loaders/PVRLoader.mjs +0 -131
  927. package/loaders/RGBELoader.mjs +0 -244
  928. package/loaders/RGBMLoader.mjs +0 -998
  929. package/loaders/STLLoader.mjs +0 -190
  930. package/loaders/SVGLoader.mjs +0 -1709
  931. package/loaders/TDSLoader.mjs +0 -480
  932. package/loaders/TGALoader.mjs +0 -285
  933. package/loaders/TTFLoader.mjs +0 -131
  934. package/loaders/TiltLoader.mjs +0 -373
  935. package/loaders/VOXLoader.mjs +0 -431
  936. package/loaders/VRMLLoader.mjs +0 -2093
  937. package/loaders/VRMLoader.mjs +0 -38
  938. package/loaders/VTKLoader.mjs +0 -646
  939. package/loaders/XLoader.mjs +0 -1258
  940. package/loaders/XYZLoader.mjs +0 -60
  941. package/loaders/lwo/IFFParser.mjs +0 -697
  942. package/loaders/lwo/LWO2Parser.mjs +0 -327
  943. package/loaders/lwo/LWO3Parser.mjs +0 -298
  944. package/math/Capsule.mjs +0 -100
  945. package/math/ColorConverter.mjs +0 -51
  946. package/math/ConvexHull.mjs +0 -574
  947. package/math/ImprovedNoise.mjs +0 -302
  948. package/math/Lut.mjs +0 -135
  949. package/math/MeshSurfaceSampler.mjs +0 -107
  950. package/math/OBB.mjs +0 -235
  951. package/math/Octree.mjs +0 -278
  952. package/math/SimplexNoise.mjs +0 -425
  953. package/misc/ConvexObjectBreaker.mjs +0 -292
  954. package/misc/GPUComputationRenderer.mjs +0 -171
  955. package/misc/Gyroscope.mjs +0 -35
  956. package/misc/MD2Character.mjs +0 -162
  957. package/misc/MD2CharacterComplex.mjs +0 -328
  958. package/misc/MorphAnimMesh.mjs +0 -40
  959. package/misc/MorphBlendMesh.mjs +0 -179
  960. package/misc/ProgressiveLightmap.mjs +0 -166
  961. package/misc/RollerCoaster.mjs +0 -346
  962. package/misc/TubePainter.mjs +0 -123
  963. package/misc/Volume.mjs +0 -244
  964. package/misc/VolumeSlice.mjs +0 -106
  965. package/misc/WebGL.mjs +0 -74
  966. package/modifiers/CurveModifier.mjs +0 -182
  967. package/modifiers/EdgeSplitModifier.mjs +0 -162
  968. package/modifiers/SimplifyModifier.mjs +0 -282
  969. package/modifiers/TessellateModifier.mjs +0 -206
  970. package/nodes/Nodes.mjs +0 -400
  971. package/nodes/ShaderNode.mjs +0 -408
  972. package/nodes/accessors/BufferNode.mjs +0 -15
  973. package/nodes/accessors/CameraNode.mjs +0 -44
  974. package/nodes/accessors/CubeTextureNode.mjs +0 -42
  975. package/nodes/accessors/MaterialNode.mjs +0 -71
  976. package/nodes/accessors/MaterialReferenceNode.mjs +0 -14
  977. package/nodes/accessors/ModelNode.mjs +0 -9
  978. package/nodes/accessors/ModelViewProjectionNode.mjs +0 -24
  979. package/nodes/accessors/NormalNode.mjs +0 -62
  980. package/nodes/accessors/Object3DNode.mjs +0 -76
  981. package/nodes/accessors/PointUVNode.mjs +0 -13
  982. package/nodes/accessors/PositionNode.mjs +0 -65
  983. package/nodes/accessors/ReferenceNode.mjs +0 -37
  984. package/nodes/accessors/ReflectNode.mjs +0 -43
  985. package/nodes/accessors/SkinningNode.mjs +0 -58
  986. package/nodes/accessors/TextureNode.mjs +0 -54
  987. package/nodes/accessors/UVNode.mjs +0 -23
  988. package/nodes/core/ArrayUniformNode.mjs +0 -14
  989. package/nodes/core/AttributeNode.mjs +0 -30
  990. package/nodes/core/BypassNode.mjs +0 -22
  991. package/nodes/core/CodeNode.mjs +0 -28
  992. package/nodes/core/ConstNode.mjs +0 -14
  993. package/nodes/core/ContextNode.mjs +0 -22
  994. package/nodes/core/ExpressionNode.mjs +0 -19
  995. package/nodes/core/FunctionCallNode.mjs +0 -37
  996. package/nodes/core/FunctionNode.mjs +0 -56
  997. package/nodes/core/InputNode.mjs +0 -38
  998. package/nodes/core/Node.mjs +0 -139
  999. package/nodes/core/NodeAttribute.mjs +0 -10
  1000. package/nodes/core/NodeBuilder.mjs +0 -395
  1001. package/nodes/core/NodeCode.mjs +0 -11
  1002. package/nodes/core/NodeFrame.mjs +0 -35
  1003. package/nodes/core/NodeFunctionInput.mjs +0 -13
  1004. package/nodes/core/NodeKeywords.mjs +0 -44
  1005. package/nodes/core/NodeUniform.mjs +0 -18
  1006. package/nodes/core/NodeUtils.mjs +0 -57
  1007. package/nodes/core/NodeVar.mjs +0 -10
  1008. package/nodes/core/NodeVary.mjs +0 -10
  1009. package/nodes/core/PropertyNode.mjs +0 -21
  1010. package/nodes/core/TempNode.mjs +0 -25
  1011. package/nodes/core/UniformNode.mjs +0 -23
  1012. package/nodes/core/VarNode.mjs +0 -31
  1013. package/nodes/core/VaryNode.mjs +0 -30
  1014. package/nodes/core/constants.mjs +0 -24
  1015. package/nodes/display/ColorSpaceNode.mjs +0 -63
  1016. package/nodes/display/NormalMapNode.mjs +0 -54
  1017. package/nodes/fog/FogNode.mjs +0 -15
  1018. package/nodes/fog/FogRangeNode.mjs +0 -17
  1019. package/nodes/functions/BSDFs.mjs +0 -64
  1020. package/nodes/lights/LightContextNode.mjs +0 -35
  1021. package/nodes/lights/LightNode.mjs +0 -58
  1022. package/nodes/lights/LightsNode.mjs +0 -59
  1023. package/nodes/loaders/NodeLoader.mjs +0 -66
  1024. package/nodes/loaders/NodeMaterialLoader.mjs +0 -24
  1025. package/nodes/loaders/NodeObjectLoader.mjs +0 -40
  1026. package/nodes/materials/LineBasicNodeMaterial.mjs +0 -27
  1027. package/nodes/materials/Materials.mjs +0 -28
  1028. package/nodes/materials/MeshBasicNodeMaterial.mjs +0 -28
  1029. package/nodes/materials/MeshStandardNodeMaterial.mjs +0 -41
  1030. package/nodes/materials/NodeMaterial.mjs +0 -64
  1031. package/nodes/materials/PointsNodeMaterial.mjs +0 -30
  1032. package/nodes/math/CondNode.mjs +0 -38
  1033. package/nodes/math/MathNode.mjs +0 -163
  1034. package/nodes/math/OperatorNode.mjs +0 -103
  1035. package/nodes/procedural/CheckerNode.mjs +0 -21
  1036. package/nodes/utils/ArrayElementNode.mjs +0 -19
  1037. package/nodes/utils/ConvertNode.mjs +0 -25
  1038. package/nodes/utils/JoinNode.mjs +0 -26
  1039. package/nodes/utils/MatcapUVNode.mjs +0 -16
  1040. package/nodes/utils/OscNode.mjs +0 -50
  1041. package/nodes/utils/SplitNode.mjs +0 -45
  1042. package/nodes/utils/SpriteSheetUVNode.mjs +0 -40
  1043. package/nodes/utils/TimerNode.mjs +0 -44
  1044. package/objects/GroundProjectedEnv.mjs +0 -130
  1045. package/objects/Lensflare.mjs +0 -262
  1046. package/objects/LightningStorm.mjs +0 -110
  1047. package/objects/MarchingCubes.mjs +0 -457
  1048. package/objects/Reflector.mjs +0 -166
  1049. package/objects/ReflectorForSSRPass.mjs +0 -247
  1050. package/objects/ReflectorRTT.mjs +0 -10
  1051. package/objects/Refractor.mjs +0 -178
  1052. package/objects/ShadowMesh.mjs +0 -41
  1053. package/objects/Sky.mjs +0 -124
  1054. package/objects/Water.mjs +0 -235
  1055. package/objects/Water2.mjs +0 -252
  1056. package/offscreen/jank.mjs +0 -27
  1057. package/offscreen/offscreen.mjs +0 -5
  1058. package/offscreen/scene.mjs +0 -52
  1059. package/physics/AmmoPhysics.mjs +0 -165
  1060. package/postprocessing/AdaptiveToneMappingPass.mjs +0 -221
  1061. package/postprocessing/AfterimagePass.mjs +0 -55
  1062. package/postprocessing/BloomPass.mjs +0 -90
  1063. package/postprocessing/BokehPass.mjs +0 -76
  1064. package/postprocessing/ClearPass.mjs +0 -27
  1065. package/postprocessing/CubeTexturePass.mjs +0 -49
  1066. package/postprocessing/DotScreenPass.mjs +0 -40
  1067. package/postprocessing/EffectComposer.mjs +0 -139
  1068. package/postprocessing/FilmPass.mjs +0 -42
  1069. package/postprocessing/GlitchPass.mjs +0 -75
  1070. package/postprocessing/HalftonePass.mjs +0 -44
  1071. package/postprocessing/LUTPass.mjs +0 -136
  1072. package/postprocessing/MaskPass.mjs +0 -60
  1073. package/postprocessing/OutlinePass.mjs +0 -438
  1074. package/postprocessing/Pass.mjs +0 -37
  1075. package/postprocessing/RenderPass.mjs +0 -48
  1076. package/postprocessing/RenderPixelatedPass.mjs +0 -199
  1077. package/postprocessing/SAOPass.mjs +0 -282
  1078. package/postprocessing/SMAAPass.mjs +0 -112
  1079. package/postprocessing/SSAARenderPass.mjs +0 -170
  1080. package/postprocessing/SSAOPass.mjs +0 -265
  1081. package/postprocessing/SSRPass.mjs +0 -432
  1082. package/postprocessing/SavePass.mjs +0 -37
  1083. package/postprocessing/ShaderPass.mjs +0 -39
  1084. package/postprocessing/TAARenderPass.mjs +0 -88
  1085. package/postprocessing/TexturePass.mjs +0 -39
  1086. package/postprocessing/UnrealBloomPass.mjs +0 -220
  1087. package/renderers/CSS2DRenderer.mjs +0 -112
  1088. package/renderers/CSS3DRenderer.mjs +0 -133
  1089. package/renderers/Projector.mjs +0 -511
  1090. package/renderers/SVGRenderer.mjs +0 -306
  1091. package/renderers/nodes/accessors/CameraNode.mjs +0 -63
  1092. package/renderers/nodes/accessors/ModelNode.mjs +0 -61
  1093. package/renderers/nodes/accessors/ModelViewProjectionNode.mjs +0 -21
  1094. package/renderers/nodes/accessors/NormalNode.mjs +0 -61
  1095. package/renderers/nodes/accessors/PositionNode.mjs +0 -30
  1096. package/renderers/nodes/accessors/UVNode.mjs +0 -13
  1097. package/renderers/nodes/core/AttributeNode.mjs +0 -35
  1098. package/renderers/nodes/core/InputNode.mjs +0 -31
  1099. package/renderers/nodes/core/Node.mjs +0 -34
  1100. package/renderers/nodes/core/NodeAttribute.mjs +0 -10
  1101. package/renderers/nodes/core/NodeBuilder.mjs +0 -243
  1102. package/renderers/nodes/core/NodeFrame.mjs +0 -35
  1103. package/renderers/nodes/core/NodeSlot.mjs +0 -10
  1104. package/renderers/nodes/core/NodeUniform.mjs +0 -18
  1105. package/renderers/nodes/core/NodeVary.mjs +0 -11
  1106. package/renderers/nodes/core/VaryNode.mjs +0 -22
  1107. package/renderers/nodes/core/constants.mjs +0 -22
  1108. package/renderers/nodes/inputs/ColorNode.mjs +0 -11
  1109. package/renderers/nodes/inputs/FloatNode.mjs +0 -11
  1110. package/renderers/nodes/inputs/Matrix3Node.mjs +0 -12
  1111. package/renderers/nodes/inputs/Matrix4Node.mjs +0 -12
  1112. package/renderers/nodes/inputs/TextureNode.mjs +0 -20
  1113. package/renderers/nodes/inputs/Vector2Node.mjs +0 -11
  1114. package/renderers/nodes/inputs/Vector3Node.mjs +0 -12
  1115. package/renderers/nodes/inputs/Vector4Node.mjs +0 -12
  1116. package/renderers/nodes/math/MathNode.mjs +0 -55
  1117. package/renderers/nodes/math/OperatorNode.mjs +0 -42
  1118. package/renderers/nodes/utils/SwitchNode.mjs +0 -20
  1119. package/renderers/nodes/utils/TimerNode.mjs +0 -14
  1120. package/renderers/webgpu/WebGPU.mjs +0 -24
  1121. package/renderers/webgpu/WebGPUAttributes.mjs +0 -69
  1122. package/renderers/webgpu/WebGPUBackground.mjs +0 -61
  1123. package/renderers/webgpu/WebGPUBinding.mjs +0 -14
  1124. package/renderers/webgpu/WebGPUBindings.mjs +0 -155
  1125. package/renderers/webgpu/WebGPUComputePipelines.mjs +0 -44
  1126. package/renderers/webgpu/WebGPUGeometries.mjs +0 -41
  1127. package/renderers/webgpu/WebGPUInfo.mjs +0 -46
  1128. package/renderers/webgpu/WebGPUObjects.mjs +0 -25
  1129. package/renderers/webgpu/WebGPUProperties.mjs +0 -22
  1130. package/renderers/webgpu/WebGPURenderLists.mjs +0 -119
  1131. package/renderers/webgpu/WebGPURenderPipelines.mjs +0 -545
  1132. package/renderers/webgpu/WebGPURenderer.mjs +0 -574
  1133. package/renderers/webgpu/WebGPUSampledTexture.mjs +0 -40
  1134. package/renderers/webgpu/WebGPUSampler.mjs +0 -15
  1135. package/renderers/webgpu/WebGPUStorageBuffer.mjs +0 -15
  1136. package/renderers/webgpu/WebGPUTextureRenderer.mjs +0 -23
  1137. package/renderers/webgpu/WebGPUTextureUtils.mjs +0 -98
  1138. package/renderers/webgpu/WebGPUTextures.mjs +0 -484
  1139. package/renderers/webgpu/WebGPUUniform.mjs +0 -81
  1140. package/renderers/webgpu/WebGPUUniformsGroup.mjs +0 -176
  1141. package/renderers/webgpu/constants.mjs +0 -230
  1142. package/renderers/webgpu/nodes/ShaderLib.mjs +0 -42
  1143. package/renderers/webgpu/nodes/WebGPUNodeBuilder.mjs +0 -165
  1144. package/renderers/webgpu/nodes/WebGPUNodeUniform.mjs +0 -73
  1145. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.mjs +0 -15
  1146. package/renderers/webgpu/nodes/WebGPUNodes.mjs +0 -40
  1147. package/shaders/ACESFilmicToneMappingShader.mjs +0 -48
  1148. package/shaders/AfterimageShader.mjs +0 -32
  1149. package/shaders/BasicShader.mjs +0 -12
  1150. package/shaders/BleachBypassShader.mjs +0 -35
  1151. package/shaders/BlendShader.mjs +0 -30
  1152. package/shaders/BokehShader.mjs +0 -106
  1153. package/shaders/BokehShader2.mjs +0 -269
  1154. package/shaders/BrightnessContrastShader.mjs +0 -32
  1155. package/shaders/ColorCorrectionShader.mjs +0 -30
  1156. package/shaders/ColorifyShader.mjs +0 -28
  1157. package/shaders/ConvolutionShader.mjs +0 -55
  1158. package/shaders/CopyShader.mjs +0 -25
  1159. package/shaders/DOFMipMapShader.mjs +0 -32
  1160. package/shaders/DepthLimitedBlurShader.mjs +0 -114
  1161. package/shaders/DigitalGlitch.mjs +0 -78
  1162. package/shaders/DotScreenShader.mjs +0 -39
  1163. package/shaders/FXAAShader.mjs +0 -1098
  1164. package/shaders/FilmShader.mjs +0 -42
  1165. package/shaders/FocusShader.mjs +0 -55
  1166. package/shaders/FreiChenShader.mjs +0 -61
  1167. package/shaders/FresnelShader.mjs +0 -47
  1168. package/shaders/GammaCorrectionShader.mjs +0 -23
  1169. package/shaders/GodRaysShader.mjs +0 -146
  1170. package/shaders/HalftoneShader.mjs +0 -212
  1171. package/shaders/HorizontalBlurShader.mjs +0 -43
  1172. package/shaders/HorizontalTiltShiftShader.mjs +0 -37
  1173. package/shaders/HueSaturationShader.mjs +0 -41
  1174. package/shaders/KaleidoShader.mjs +0 -34
  1175. package/shaders/LuminosityHighPassShader.mjs +0 -37
  1176. package/shaders/LuminosityShader.mjs +0 -25
  1177. package/shaders/MirrorShader.mjs +0 -35
  1178. package/shaders/NormalMapShader.mjs +0 -31
  1179. package/shaders/ParallaxShader.mjs +0 -113
  1180. package/shaders/PixelShader.mjs +0 -28
  1181. package/shaders/RGBShiftShader.mjs +0 -30
  1182. package/shaders/SAOShader.mjs +0 -144
  1183. package/shaders/SMAAShader.mjs +0 -272
  1184. package/shaders/SSAOShader.mjs +0 -172
  1185. package/shaders/SSRShader.mjs +0 -324
  1186. package/shaders/SepiaShader.mjs +0 -29
  1187. package/shaders/SobelOperatorShader.mjs +0 -44
  1188. package/shaders/SubsurfaceScatteringShader.mjs +0 -59
  1189. package/shaders/TechnicolorShader.mjs +0 -24
  1190. package/shaders/ToneMapShader.mjs +0 -48
  1191. package/shaders/ToonShader.mjs +0 -188
  1192. package/shaders/TriangleBlurShader.mjs +0 -36
  1193. package/shaders/UnpackDepthRGBAShader.mjs +0 -26
  1194. package/shaders/VerticalBlurShader.mjs +0 -44
  1195. package/shaders/VerticalTiltShiftShader.mjs +0 -37
  1196. package/shaders/VignetteShader.mjs +0 -28
  1197. package/shaders/VolumeShader.mjs +0 -178
  1198. package/shaders/WaterRefractionShader.mjs +0 -57
  1199. package/textures/FlakesTexture.mjs +0 -30
  1200. package/types/helpers.mjs +0 -4
  1201. package/utils/BufferGeometryUtils.mjs +0 -570
  1202. package/utils/GeometryCompressionUtils.mjs +0 -547
  1203. package/utils/GeometryUtils.mjs +0 -108
  1204. package/utils/RoughnessMipmapper.mjs +0 -213
  1205. package/utils/SceneUtils.mjs +0 -36
  1206. package/utils/ShadowMapViewer.mjs +0 -114
  1207. package/utils/SkeletonUtils.mjs +0 -292
  1208. package/utils/UVsDebug.mjs +0 -85
  1209. package/utils/WorkerPool.mjs +0 -62
  1210. package/webxr/ARButton.mjs +0 -119
  1211. package/webxr/OculusHandModel.mjs +0 -71
  1212. package/webxr/OculusHandPointerModel.mjs +0 -207
  1213. package/webxr/Text2D.mjs +0 -31
  1214. package/webxr/VRButton.mjs +0 -105
  1215. package/webxr/XRControllerModelFactory.mjs +0 -146
  1216. package/webxr/XREstimatedLight.mjs +0 -126
  1217. package/webxr/XRHandMeshModel.mjs +0 -73
  1218. package/webxr/XRHandModelFactory.mjs +0 -61
  1219. package/webxr/XRHandPrimitiveModel.mjs +0 -68
@@ -1,113 +1,134 @@
1
- "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const THREE = require("three");
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
- this.defaultDPI = 90;
8
- this.defaultUnit = "px";
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 THREE.FileLoader(scope.manager);
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
- url,
18
- function(text) {
19
- try {
20
- onLoad(scope.parse(text));
21
- } catch (e) {
22
- if (onError) {
23
- onError(e);
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
- onProgress,
31
- onError
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 "svg":
43
+ case 'svg':
44
44
  break;
45
- case "style":
45
+
46
+ case 'style':
46
47
  parseCSSStylesheet(node);
47
48
  break;
48
- case "g":
49
+
50
+ case 'g':
49
51
  style = parseStyle(node, style);
50
52
  break;
51
- case "path":
53
+
54
+ case 'path':
52
55
  style = parseStyle(node, style);
53
- if (node.hasAttribute("d"))
54
- path = parsePathNode(node);
56
+ if (node.hasAttribute('d')) path = parsePathNode(node);
55
57
  break;
56
- case "rect":
58
+
59
+ case 'rect':
57
60
  style = parseStyle(node, style);
58
61
  path = parseRectNode(node);
59
62
  break;
60
- case "polygon":
63
+
64
+ case 'polygon':
61
65
  style = parseStyle(node, style);
62
66
  path = parsePolygonNode(node);
63
67
  break;
64
- case "polyline":
68
+
69
+ case 'polyline':
65
70
  style = parseStyle(node, style);
66
71
  path = parsePolylineNode(node);
67
72
  break;
68
- case "circle":
73
+
74
+ case 'circle':
69
75
  style = parseStyle(node, style);
70
76
  path = parseCircleNode(node);
71
77
  break;
72
- case "ellipse":
78
+
79
+ case 'ellipse':
73
80
  style = parseStyle(node, style);
74
81
  path = parseEllipseNode(node);
75
82
  break;
76
- case "line":
83
+
84
+ case 'line':
77
85
  style = parseStyle(node, style);
78
86
  path = parseLineNode(node);
79
87
  break;
80
- case "defs":
88
+
89
+ case 'defs':
81
90
  traverseChildNodes = false;
82
91
  break;
83
- case "use":
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
- default:
105
+
94
106
  }
107
+
95
108
  if (path) {
96
- if (style.fill !== void 0 && style.fill !== "none") {
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 = { node, style };
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 THREE.ShapePath();
120
- const point = new THREE.Vector2();
121
- const control = new THREE.Vector2();
122
- const firstPoint = new THREE.Vector2();
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("d");
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 data2 = command.substr(1).trim();
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 "M":
138
- numbers = parseFloats(data2);
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
- if (j === 0)
150
- firstPoint.copy(point);
178
+
179
+ if (j === 0) firstPoint.copy(point);
151
180
  }
181
+
152
182
  break;
153
- case "H":
154
- numbers = parseFloats(data2);
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
- case "V":
165
- numbers = parseFloats(data2);
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
- case "L":
176
- numbers = parseFloats(data2);
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
- case "C":
188
- numbers = parseFloats(data2);
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
- case "S":
207
- numbers = parseFloats(data2);
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
- case "Q":
226
- numbers = parseFloats(data2);
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
- case "T":
238
- numbers = parseFloats(data2);
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
- case "A":
252
- numbers = parseFloats(data2, [3, 4], 7);
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
- if (numbers[j + 5] == point.x && numbers[j + 6] == point.y)
255
- continue;
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
- path,
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
- case "m":
276
- numbers = parseFloats(data2);
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
- if (j === 0)
288
- firstPoint.copy(point);
313
+
314
+ if (j === 0) firstPoint.copy(point);
289
315
  }
316
+
290
317
  break;
291
- case "h":
292
- numbers = parseFloats(data2);
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
- case "v":
303
- numbers = parseFloats(data2);
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
- case "l":
314
- numbers = parseFloats(data2);
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
- case "c":
326
- numbers = parseFloats(data2);
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
- case "s":
345
- numbers = parseFloats(data2);
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
- case "q":
364
- numbers = parseFloats(data2);
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
- case "t":
381
- numbers = parseFloats(data2);
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
- case "a":
395
- numbers = parseFloats(data2, [3, 4], 7);
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
- if (numbers[j + 5] == 0 && numbers[j + 6] == 0)
398
- continue;
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
- path,
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
- case "Z":
419
- case "z":
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
- return;
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
- continue;
441
- const selectorList = stylesheet.selectorText.split(/,/gm).filter(Boolean).map((i2) => i2.trim());
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
- x_axis_rotation = x_axis_rotation * Math.PI / 180;
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
- const dx2 = (start.x - end.x) / 2;
456
- const dy2 = (start.y - end.y) / 2;
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
- if (ux * vy - uy * vx < 0)
489
- ang = -ang;
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("x") || 0);
494
- const y = parseFloatWithUnits(node.getAttribute("y") || 0);
495
- const rx = parseFloatWithUnits(node.getAttribute("rx") || node.getAttribute("ry") || 0);
496
- const ry = parseFloatWithUnits(node.getAttribute("ry") || node.getAttribute("rx") || 0);
497
- const w = parseFloatWithUnits(node.getAttribute("width"));
498
- const h = parseFloatWithUnits(node.getAttribute("height"));
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 THREE.ShapePath();
501
- path.moveTo(x + rx, y);
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 THREE.ShapePath();
602
+ const path = new ShapePath();
533
603
  let index = 0;
534
- node.getAttribute("points").replace(regex, iterator);
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 THREE.ShapePath();
624
+ const path = new ShapePath();
551
625
  let index = 0;
552
- node.getAttribute("points").replace(regex, iterator);
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("cx") || 0);
558
- const y = parseFloatWithUnits(node.getAttribute("cy") || 0);
559
- const r = parseFloatWithUnits(node.getAttribute("r") || 0);
560
- const subpath = new THREE.Path();
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 THREE.ShapePath();
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("cx") || 0);
568
- const y = parseFloatWithUnits(node.getAttribute("cy") || 0);
569
- const rx = parseFloatWithUnits(node.getAttribute("rx") || 0);
570
- const ry = parseFloatWithUnits(node.getAttribute("ry") || 0);
571
- const subpath = new THREE.Path();
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 THREE.ShapePath();
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("x1") || 0);
579
- const y1 = parseFloatWithUnits(node.getAttribute("y1") || 0);
580
- const x2 = parseFloatWithUnits(node.getAttribute("x2") || 0);
581
- const y2 = parseFloatWithUnits(node.getAttribute("y2") || 0);
582
- const path = new THREE.ShapePath();
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
- if (node.hasAttribute("class")) {
592
- const classSelectors = node.getAttribute("class").split(/\s/).filter(Boolean).map((i) => i.trim());
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["." + classSelectors[i]]);
676
+ stylesheetStyles = Object.assign(stylesheetStyles, stylesheets['.' + classSelectors[i]]);
595
677
  }
596
678
  }
597
- if (node.hasAttribute("id")) {
598
- stylesheetStyles = Object.assign(stylesheetStyles, stylesheets["#" + node.getAttribute("id")]);
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 === void 0) {
685
+ if (adjustFunction === undefined) {
602
686
  adjustFunction = function copy(v) {
603
- if (v.startsWith("url"))
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
- if (node.hasAttribute(svgName))
609
- style[jsName] = adjustFunction(node.getAttribute(svgName));
610
- if (stylesheetStyles[svgName])
611
- style[jsName] = adjustFunction(stylesheetStyles[svgName]);
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
- addStyle("fill", "fill");
622
- addStyle("fill-opacity", "fillOpacity", clamp);
623
- addStyle("fill-rule", "fillRule");
624
- addStyle("opacity", "opacity", clamp);
625
- addStyle("stroke", "stroke");
626
- addStyle("stroke-opacity", "strokeOpacity", clamp);
627
- addStyle("stroke-width", "strokeWidth", positive);
628
- addStyle("stroke-linejoin", "strokeLineJoin");
629
- addStyle("stroke-linecap", "strokeLineCap");
630
- addStyle("stroke-miterlimit", "strokeMiterLimit", positive);
631
- addStyle("visibility", "visibility");
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 !== "string") {
639
- throw new TypeError("Invalid input: " + typeof input);
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 = "", exponent = "";
748
+ let number = '',
749
+ exponent = '';
658
750
  const result = [];
659
- function throwSyntaxError(current2, i, partial) {
660
- const error = new SyntaxError('Unexpected character "' + current2 + '" at index ' + i + ".");
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
- number = "";
672
- exponent = "";
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
- if (RE.POINT.test(current) && number[number.length - 1] === ".") {
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
- const units = ["mm", "cm", "in", "pt", "pc", "px"];
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 = "px";
822
- if (typeof string === "string" || string instanceof String) {
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
- let scale = void 0;
833
- if (theUnit === "px" && scope.defaultUnit !== "px") {
834
- scale = unitConversion["in"][scope.defaultUnit] / scope.defaultDPI;
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
- scale = unitConversion[theUnit]["in"] * scope.defaultDPI;
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("transform") || node.nodeName === "use" && (node.hasAttribute("x") || node.hasAttribute("y")))) {
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 THREE.Matrix3();
857
- const currentTransform2 = tempTransform0;
858
- if (node.nodeName === "use" && (node.hasAttribute("x") || node.hasAttribute("y"))) {
859
- const tx = parseFloatWithUnits(node.getAttribute("x"));
860
- const ty = parseFloatWithUnits(node.getAttribute("y"));
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
- if (node.hasAttribute("transform")) {
864
- const transformsTexts = node.getAttribute("transform").split(")");
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
- continue;
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
- currentTransform2.identity();
1018
+ currentTransform.identity();
1019
+
875
1020
  switch (transformType) {
876
- case "translate":
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
- currentTransform2.translate(tx, ty);
1029
+
1030
+ currentTransform.translate(tx, ty);
884
1031
  }
1032
+
885
1033
  break;
886
- case "rotate":
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
- currentTransform2.multiplyMatrices(tempTransform1, tempTransform3);
1054
+ currentTransform.multiplyMatrices(tempTransform1, tempTransform3);
901
1055
  }
1056
+
902
1057
  break;
903
- case "scale":
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
- currentTransform2.scale(scaleX, scaleY);
1067
+
1068
+ currentTransform.scale(scaleX, scaleY);
911
1069
  }
1070
+
912
1071
  break;
913
- case "skewX":
1072
+
1073
+ case 'skewX':
914
1074
  if (array.length === 1) {
915
- currentTransform2.set(1, Math.tan(array[0] * Math.PI / 180), 0, 0, 1, 0, 0, 0, 1);
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
- case "skewY":
1079
+
1080
+ case 'skewY':
919
1081
  if (array.length === 1) {
920
- currentTransform2.set(1, 0, 0, Math.tan(array[0] * Math.PI / 180), 1, 0, 0, 0, 1);
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
- case "matrix":
1086
+
1087
+ case 'matrix':
924
1088
  if (array.length === 6) {
925
- currentTransform2.set(array[0], array[2], array[4], array[1], array[3], array[5], 0, 0, 1);
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
- transform.premultiply(currentTransform2);
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("SVGLoader: Elliptic arc or ellipse rotation or skewing is not implemented.");
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 THREE.Matrix3();
988
- const tempTransform1 = new THREE.Matrix3();
989
- const tempTransform2 = new THREE.Matrix3();
990
- const tempTransform3 = new THREE.Matrix3();
991
- const tempV2 = new THREE.Vector2();
992
- const tempV3 = new THREE.Vector3();
993
- const currentTransform = new THREE.Matrix3();
994
- const xml = new DOMParser().parseFromString(text, "image/svg+xml");
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: "#000",
1175
+ fill: '#000',
997
1176
  fillOpacity: 1,
998
1177
  strokeOpacity: 1,
999
1178
  strokeWidth: 1,
1000
- strokeLineJoin: "miter",
1001
- strokeLineCap: "butt",
1179
+ strokeLineJoin: 'miter',
1180
+ strokeLineCap: 'butt',
1002
1181
  strokeMiterLimit: 4
1003
1182
  });
1004
- const data = { paths, xml: xml.documentElement };
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 { x: point.x, y: point.y, t: classifyResult.t };
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 { x, y, t: classifyResult.t };
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 { x: point.x, y: point.y, t: classifyResult.t };
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 { x, y, t: t1 };
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
- if (intersection !== null && intersectionsRaw.find(
1116
- (i) => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON
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 THREE.Vector2(intersection.x, intersection.y));
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 THREE.Vector2();
1352
+ const center = new Vector2();
1127
1353
  boundingBox.getCenter(center);
1128
1354
  const allIntersections = [];
1129
- paths.forEach((path) => {
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((p) => {
1133
- allIntersections.push({ identifier: path.identifier, isCW: path.isCW, point: p });
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
- function isHoleTo(simplePath, allPaths, scanlineMinX2, scanlineMaxX2, _fillRule) {
1143
- if (_fillRule === null || _fillRule === void 0 || _fillRule === "") {
1144
- _fillRule = "nonzero";
1375
+
1376
+ function isHoleTo(simplePath, allPaths, scanlineMinX, scanlineMaxX, _fillRule) {
1377
+ if (_fillRule === null || _fillRule === undefined || _fillRule === '') {
1378
+ _fillRule = 'nonzero';
1145
1379
  }
1146
- const centerBoundingBox = new THREE.Vector2();
1380
+
1381
+ const centerBoundingBox = new Vector2();
1147
1382
  simplePath.boundingBox.getCenter(centerBoundingBox);
1148
- const scanline = [new THREE.Vector2(scanlineMinX2, centerBoundingBox.y), new THREE.Vector2(scanlineMaxX2, centerBoundingBox.y)];
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((i2) => {
1156
- if (i2.identifier === simplePath.identifier) {
1157
- baseIntersections.push(i2);
1390
+ scanlineIntersections.forEach(i => {
1391
+ if (i.identifier === simplePath.identifier) {
1392
+ baseIntersections.push(i);
1158
1393
  } else {
1159
- otherIntersections.push(i2);
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
- if (_fillRule === "evenodd") {
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 { identifier: simplePath.identifier, isHole, for: isHoleFor };
1178
- } else if (_fillRule === "nonzero") {
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
- for (let i2 = 0; i2 < stack.length; i2++) {
1183
- const identifier2 = stack[i2];
1427
+
1428
+ for (let i = 0; i < stack.length; i++) {
1429
+ const identifier = stack[i];
1430
+
1184
1431
  if (isHole) {
1185
- lastCWValue = allPaths[identifier2].isCW;
1432
+ lastCWValue = allPaths[identifier].isCW;
1186
1433
  isHole = false;
1187
- isHoleFor = identifier2;
1188
- } else if (lastCWValue !== allPaths[identifier2].isCW) {
1189
- lastCWValue = allPaths[identifier2].isCW;
1434
+ isHoleFor = identifier;
1435
+ } else if (lastCWValue !== allPaths[identifier].isCW) {
1436
+ lastCWValue = allPaths[identifier].isCW;
1190
1437
  isHole = true;
1191
1438
  }
1192
1439
  }
1193
- return { identifier: simplePath.identifier, isHole, for: isHoleFor };
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((p) => {
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 p2 = points[i];
1209
- if (p2.y > maxY) {
1210
- maxY = p2.y;
1467
+ const p = points[i];
1468
+
1469
+ if (p.y > maxY) {
1470
+ maxY = p.y;
1211
1471
  }
1212
- if (p2.y < minY) {
1213
- minY = p2.y;
1472
+
1473
+ if (p.y < minY) {
1474
+ minY = p.y;
1214
1475
  }
1215
- if (p2.x > maxX) {
1216
- maxX = p2.x;
1476
+
1477
+ if (p.x > maxX) {
1478
+ maxX = p.x;
1217
1479
  }
1218
- if (p2.x < minX) {
1219
- minX = p2.x;
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: THREE.ShapeUtils.isClockWise(points),
1497
+ points: points,
1498
+ isCW: ShapeUtils.isClockWise(points),
1232
1499
  identifier: identifier++,
1233
- boundingBox: new THREE.Box2(new THREE.Vector2(minX, minY), new THREE.Vector2(maxX, maxY))
1500
+ boundingBox: new Box2(new Vector2(minX, minY), new Vector2(maxX, maxY))
1234
1501
  };
1235
1502
  });
1236
- simplePaths = simplePaths.filter((sp) => sp.points.length > 1);
1237
- const isAHole = simplePaths.map(
1238
- (p) => isHoleTo(p, simplePaths, scanlineMinX, scanlineMaxX, shapePath.userData.style.fillRule)
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((p) => {
1507
+ simplePaths.forEach(p => {
1242
1508
  const amIAHole = isAHole[p.identifier];
1509
+
1243
1510
  if (!amIAHole.isHole) {
1244
- const shape = new THREE.Shape();
1511
+ const shape = new Shape();
1245
1512
  shape.curves = p.curves;
1246
- const holes = isAHole.filter((h) => h.isHole && h.for === p.identifier);
1247
- holes.forEach((h) => {
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 THREE.Path();
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
- width = width !== void 0 ? width : 1;
1260
- color = color !== void 0 ? color : "#000";
1261
- lineJoin = lineJoin !== void 0 ? lineJoin : "miter";
1262
- lineCap = lineCap !== void 0 ? lineCap : "butt";
1263
- miterLimit = miterLimit !== void 0 ? miterLimit : 4;
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
- const geometry = new THREE.BufferGeometry();
1280
- geometry.setAttribute("position", new THREE.Float32BufferAttribute(vertices, 3));
1281
- geometry.setAttribute("normal", new THREE.Float32BufferAttribute(normals, 3));
1282
- geometry.setAttribute("uv", new THREE.Float32BufferAttribute(uvs, 2));
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
- const tempV2_1 = new THREE.Vector2();
1287
- const tempV2_2 = new THREE.Vector2();
1288
- const tempV2_3 = new THREE.Vector2();
1289
- const tempV2_4 = new THREE.Vector2();
1290
- const tempV2_5 = new THREE.Vector2();
1291
- const tempV2_6 = new THREE.Vector2();
1292
- const tempV2_7 = new THREE.Vector2();
1293
- const lastPointL = new THREE.Vector2();
1294
- const lastPointR = new THREE.Vector2();
1295
- const point0L = new THREE.Vector2();
1296
- const point0R = new THREE.Vector2();
1297
- const currentPointL = new THREE.Vector2();
1298
- const currentPointR = new THREE.Vector2();
1299
- const nextPointL = new THREE.Vector2();
1300
- const nextPointR = new THREE.Vector2();
1301
- const innerPoint = new THREE.Vector2();
1302
- const outerPoint = new THREE.Vector2();
1303
- arcDivisions = arcDivisions !== void 0 ? arcDivisions : 12;
1304
- minDistance = minDistance !== void 0 ? minDistance : 1e-3;
1305
- vertexOffset = vertexOffset !== void 0 ? vertexOffset : 0;
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, u1;
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 = void 0;
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
- if (nextPoint !== void 0) {
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
- if (iPoint === 1)
1358
- initialJoinIsOnLeftSide = joinIsOnLeftSide;
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 "bevel":
1700
+ case 'bevel':
1393
1701
  makeSegmentWithBevelJoin(joinIsOnLeftSide, innerSideModified, u1);
1394
1702
  break;
1395
- case "round":
1396
- createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide, innerSideModified);
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
- case "miter":
1404
- case "miter-clip":
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
- if (style.strokeLineJoin !== "miter-clip") {
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
- createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide, innerSideModified);
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
- return numVertices;
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
- function makeSegmentWithBevelJoin(joinIsOnLeftSide2, innerSideModified2, u) {
1576
- if (innerSideModified2) {
1577
- if (joinIsOnLeftSide2) {
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
- if (joinIsOnLeftSide2) {
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
- function createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide2, innerSideModified2) {
1611
- if (innerSideModified2) {
1612
- if (joinIsOnLeftSide2) {
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
- function addCapGeometry(center, p1, p2, joinIsOnLeftSide2, start, u) {
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 "round":
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
- case "square":
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
- if (joinIsOnLeftSide2) {
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
- if (joinIsOnLeftSide2) {
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
- break;
1682
- case "butt":
1683
- default:
2045
+
1684
2046
  break;
1685
2047
  }
1686
2048
  }
1687
- function removeDuplicatedPoints(points2) {
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
- for (let i = 1, n = points2.length - 1; i < n; i++) {
1690
- if (points2[i].distanceTo(points2[i + 1]) < minDistance) {
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
- if (!dupPoints)
1696
- return points2;
2061
+
2062
+ if (!dupPoints) return points;
1697
2063
  const newPoints = [];
1698
- newPoints.push(points2[0]);
1699
- for (let i = 1, n = points2.length - 1; i < n; i++) {
1700
- if (points2[i].distanceTo(points2[i + 1]) >= minDistance) {
1701
- newPoints.push(points2[i]);
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
- newPoints.push(points2[points2.length - 1]);
2071
+
2072
+ newPoints.push(points[points.length - 1]);
1705
2073
  return newPoints;
1706
2074
  }
1707
2075
  }
2076
+
1708
2077
  }
1709
- exports.SVGLoader = SVGLoader;
2078
+
2079
+ export { SVGLoader };