three-stdlib 2.35.3 → 2.35.4

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 (514) hide show
  1. package/_polyfill/CapsuleGeometry.cjs +20 -17
  2. package/_polyfill/CapsuleGeometry.cjs.map +1 -1
  3. package/_polyfill/CapsuleGeometry.js +20 -17
  4. package/_polyfill/CapsuleGeometry.js.map +1 -1
  5. package/_polyfill/constants.cjs +1 -1
  6. package/_polyfill/constants.cjs.map +1 -1
  7. package/_polyfill/constants.js +1 -1
  8. package/_polyfill/constants.js.map +1 -1
  9. package/animation/AnimationClipCreator.cjs +13 -13
  10. package/animation/AnimationClipCreator.cjs.map +1 -1
  11. package/animation/AnimationClipCreator.js +13 -13
  12. package/animation/AnimationClipCreator.js.map +1 -1
  13. package/animation/CCDIKSolver.cjs +11 -11
  14. package/animation/CCDIKSolver.cjs.map +1 -1
  15. package/animation/CCDIKSolver.js +12 -12
  16. package/animation/CCDIKSolver.js.map +1 -1
  17. package/animation/MMDAnimationHelper.cjs +1 -1
  18. package/animation/MMDAnimationHelper.cjs.map +1 -1
  19. package/animation/MMDAnimationHelper.js +1 -1
  20. package/animation/MMDAnimationHelper.js.map +1 -1
  21. package/animation/MMDPhysics.cjs +4 -4
  22. package/animation/MMDPhysics.cjs.map +1 -1
  23. package/animation/MMDPhysics.js +4 -4
  24. package/animation/MMDPhysics.js.map +1 -1
  25. package/controls/ArcballControls.cjs +2 -2
  26. package/controls/ArcballControls.cjs.map +1 -1
  27. package/controls/ArcballControls.js +3 -3
  28. package/controls/ArcballControls.js.map +1 -1
  29. package/controls/FirstPersonControls.cjs +1 -1
  30. package/controls/FirstPersonControls.cjs.map +1 -1
  31. package/controls/FirstPersonControls.js +1 -1
  32. package/controls/FirstPersonControls.js.map +1 -1
  33. package/controls/OrbitControls.cjs +2 -2
  34. package/controls/OrbitControls.cjs.map +1 -1
  35. package/controls/OrbitControls.js +3 -3
  36. package/controls/OrbitControls.js.map +1 -1
  37. package/controls/PointerLockControls.cjs +2 -2
  38. package/controls/PointerLockControls.cjs.map +1 -1
  39. package/controls/PointerLockControls.js +3 -3
  40. package/controls/PointerLockControls.js.map +1 -1
  41. package/csm/CSM.cjs +4 -4
  42. package/csm/CSM.cjs.map +1 -1
  43. package/csm/CSM.js +5 -5
  44. package/csm/CSM.js.map +1 -1
  45. package/csm/CSMFrustum.cjs +1 -1
  46. package/csm/CSMFrustum.cjs.map +1 -1
  47. package/csm/CSMFrustum.js +2 -2
  48. package/csm/CSMFrustum.js.map +1 -1
  49. package/deprecated/Geometry.cjs +722 -715
  50. package/deprecated/Geometry.cjs.map +1 -1
  51. package/deprecated/Geometry.js +723 -716
  52. package/deprecated/Geometry.js.map +1 -1
  53. package/effects/AnaglyphEffect.cjs +2 -1
  54. package/effects/AnaglyphEffect.cjs.map +1 -1
  55. package/effects/AnaglyphEffect.js +3 -2
  56. package/effects/AnaglyphEffect.js.map +1 -1
  57. package/effects/OutlineEffect.cjs +2 -1
  58. package/effects/OutlineEffect.cjs.map +1 -1
  59. package/effects/OutlineEffect.js +3 -2
  60. package/effects/OutlineEffect.js.map +1 -1
  61. package/effects/ParallaxBarrierEffect.cjs +2 -1
  62. package/effects/ParallaxBarrierEffect.cjs.map +1 -1
  63. package/effects/ParallaxBarrierEffect.js +3 -2
  64. package/effects/ParallaxBarrierEffect.js.map +1 -1
  65. package/exporters/DRACOExporter.cjs +133 -122
  66. package/exporters/DRACOExporter.cjs.map +1 -1
  67. package/exporters/DRACOExporter.d.ts +23 -21
  68. package/exporters/DRACOExporter.js +133 -122
  69. package/exporters/DRACOExporter.js.map +1 -1
  70. package/exporters/GLTFExporter.cjs +170 -167
  71. package/exporters/GLTFExporter.cjs.map +1 -1
  72. package/exporters/GLTFExporter.js +170 -167
  73. package/exporters/GLTFExporter.js.map +1 -1
  74. package/geometries/LightningStrike.cjs +524 -515
  75. package/geometries/LightningStrike.cjs.map +1 -1
  76. package/geometries/LightningStrike.js +524 -515
  77. package/geometries/LightningStrike.js.map +1 -1
  78. package/geometries/RoundedBoxGeometry.cjs +1 -1
  79. package/geometries/RoundedBoxGeometry.cjs.map +1 -1
  80. package/geometries/RoundedBoxGeometry.js +2 -2
  81. package/geometries/RoundedBoxGeometry.js.map +1 -1
  82. package/helpers/RaycasterHelper.cjs +2 -2
  83. package/helpers/RaycasterHelper.cjs.map +1 -1
  84. package/helpers/RaycasterHelper.js +3 -3
  85. package/helpers/RaycasterHelper.js.map +1 -1
  86. package/helpers/VertexNormalsHelper.cjs +3 -3
  87. package/helpers/VertexNormalsHelper.cjs.map +1 -1
  88. package/helpers/VertexNormalsHelper.js +4 -4
  89. package/helpers/VertexNormalsHelper.js.map +1 -1
  90. package/helpers/VertexTangentsHelper.cjs +2 -2
  91. package/helpers/VertexTangentsHelper.cjs.map +1 -1
  92. package/helpers/VertexTangentsHelper.js +3 -3
  93. package/helpers/VertexTangentsHelper.js.map +1 -1
  94. package/interactive/InteractiveGroup.cjs +1 -1
  95. package/interactive/InteractiveGroup.cjs.map +1 -1
  96. package/interactive/InteractiveGroup.js +2 -2
  97. package/interactive/InteractiveGroup.js.map +1 -1
  98. package/interactive/SelectionBox.cjs +15 -15
  99. package/interactive/SelectionBox.cjs.map +1 -1
  100. package/interactive/SelectionBox.js +16 -16
  101. package/interactive/SelectionBox.js.map +1 -1
  102. package/libs/chevrotain.cjs +1 -1
  103. package/libs/chevrotain.cjs.map +1 -1
  104. package/libs/chevrotain.js +1 -1
  105. package/libs/chevrotain.js.map +1 -1
  106. package/libs/lottie.cjs +1 -1
  107. package/libs/lottie.cjs.map +1 -1
  108. package/libs/lottie.js +1 -1
  109. package/libs/lottie.js.map +1 -1
  110. package/libs/opentype.cjs +1 -1
  111. package/libs/opentype.cjs.map +1 -1
  112. package/libs/opentype.js +1 -1
  113. package/libs/opentype.js.map +1 -1
  114. package/lights/LightProbeGenerator.cjs +5 -5
  115. package/lights/LightProbeGenerator.cjs.map +1 -1
  116. package/lights/LightProbeGenerator.js +5 -5
  117. package/lights/LightProbeGenerator.js.map +1 -1
  118. package/lights/RectAreaLightUniformsLib.cjs +3 -3
  119. package/lights/RectAreaLightUniformsLib.cjs.map +1 -1
  120. package/lights/RectAreaLightUniformsLib.js +3 -3
  121. package/lights/RectAreaLightUniformsLib.js.map +1 -1
  122. package/lines/LineMaterial.cjs +2 -1
  123. package/lines/LineMaterial.cjs.map +1 -1
  124. package/lines/LineMaterial.js +3 -2
  125. package/lines/LineMaterial.js.map +1 -1
  126. package/lines/LineSegments2.cjs +13 -13
  127. package/lines/LineSegments2.cjs.map +1 -1
  128. package/lines/LineSegments2.js +14 -14
  129. package/lines/LineSegments2.js.map +1 -1
  130. package/lines/LineSegmentsGeometry.cjs +2 -2
  131. package/lines/LineSegmentsGeometry.cjs.map +1 -1
  132. package/lines/LineSegmentsGeometry.js +3 -3
  133. package/lines/LineSegmentsGeometry.js.map +1 -1
  134. package/lines/Wireframe.cjs +3 -3
  135. package/lines/Wireframe.cjs.map +1 -1
  136. package/lines/Wireframe.js +4 -4
  137. package/lines/Wireframe.js.map +1 -1
  138. package/loaders/BasisTextureLoader.cjs +441 -435
  139. package/loaders/BasisTextureLoader.cjs.map +1 -1
  140. package/loaders/BasisTextureLoader.js +441 -435
  141. package/loaders/BasisTextureLoader.js.map +1 -1
  142. package/loaders/EXRLoader.cjs +2 -1
  143. package/loaders/EXRLoader.cjs.map +1 -1
  144. package/loaders/EXRLoader.js +3 -2
  145. package/loaders/EXRLoader.js.map +1 -1
  146. package/loaders/FBXLoader.cjs +2 -2
  147. package/loaders/FBXLoader.cjs.map +1 -1
  148. package/loaders/FBXLoader.js +2 -2
  149. package/loaders/FBXLoader.js.map +1 -1
  150. package/loaders/FontLoader.cjs +2 -2
  151. package/loaders/FontLoader.cjs.map +1 -1
  152. package/loaders/FontLoader.d.ts +2 -2
  153. package/loaders/FontLoader.js +2 -2
  154. package/loaders/FontLoader.js.map +1 -1
  155. package/loaders/GLTFLoader.cjs +2 -2
  156. package/loaders/GLTFLoader.cjs.map +1 -1
  157. package/loaders/GLTFLoader.js +2 -2
  158. package/loaders/GLTFLoader.js.map +1 -1
  159. package/loaders/KTX2Loader.cjs +377 -374
  160. package/loaders/KTX2Loader.cjs.map +1 -1
  161. package/loaders/KTX2Loader.js +377 -374
  162. package/loaders/KTX2Loader.js.map +1 -1
  163. package/loaders/LDrawLoader.cjs +5 -4
  164. package/loaders/LDrawLoader.cjs.map +1 -1
  165. package/loaders/LDrawLoader.js +6 -5
  166. package/loaders/LDrawLoader.js.map +1 -1
  167. package/loaders/OBJLoader.cjs +5 -5
  168. package/loaders/OBJLoader.cjs.map +1 -1
  169. package/loaders/OBJLoader.js +6 -6
  170. package/loaders/OBJLoader.js.map +1 -1
  171. package/loaders/PRWMLoader.cjs +46 -43
  172. package/loaders/PRWMLoader.cjs.map +1 -1
  173. package/loaders/PRWMLoader.js +46 -43
  174. package/loaders/PRWMLoader.js.map +1 -1
  175. package/loaders/SVGLoader.cjs +1694 -1688
  176. package/loaders/SVGLoader.cjs.map +1 -1
  177. package/loaders/SVGLoader.js +1694 -1688
  178. package/loaders/SVGLoader.js.map +1 -1
  179. package/loaders/XLoader.cjs +1 -1
  180. package/loaders/XLoader.cjs.map +1 -1
  181. package/loaders/XLoader.js +1 -1
  182. package/loaders/XLoader.js.map +1 -1
  183. package/math/Capsule.cjs +3 -3
  184. package/math/Capsule.cjs.map +1 -1
  185. package/math/Capsule.js +3 -3
  186. package/math/Capsule.js.map +1 -1
  187. package/math/ColorConverter.cjs +9 -9
  188. package/math/ColorConverter.cjs.map +1 -1
  189. package/math/ColorConverter.js +9 -9
  190. package/math/ColorConverter.js.map +1 -1
  191. package/math/ConvexHull.cjs +53 -50
  192. package/math/ConvexHull.cjs.map +1 -1
  193. package/math/ConvexHull.js +53 -50
  194. package/math/ConvexHull.js.map +1 -1
  195. package/math/ImprovedNoise.cjs +1 -1
  196. package/math/ImprovedNoise.cjs.map +1 -1
  197. package/math/ImprovedNoise.js +1 -1
  198. package/math/ImprovedNoise.js.map +1 -1
  199. package/math/MeshSurfaceSampler.cjs +2 -2
  200. package/math/MeshSurfaceSampler.cjs.map +1 -1
  201. package/math/MeshSurfaceSampler.js +2 -2
  202. package/math/MeshSurfaceSampler.js.map +1 -1
  203. package/math/OBB.cjs +14 -14
  204. package/math/OBB.cjs.map +1 -1
  205. package/math/OBB.js +15 -15
  206. package/math/OBB.js.map +1 -1
  207. package/math/Octree.cjs +7 -7
  208. package/math/Octree.cjs.map +1 -1
  209. package/math/Octree.js +8 -8
  210. package/math/Octree.js.map +1 -1
  211. package/misc/ConvexObjectBreaker.cjs +271 -268
  212. package/misc/ConvexObjectBreaker.cjs.map +1 -1
  213. package/misc/ConvexObjectBreaker.js +272 -269
  214. package/misc/ConvexObjectBreaker.js.map +1 -1
  215. package/misc/Gyroscope.cjs +6 -6
  216. package/misc/Gyroscope.cjs.map +1 -1
  217. package/misc/Gyroscope.js +7 -7
  218. package/misc/Gyroscope.js.map +1 -1
  219. package/modifiers/CurveModifier.cjs +1 -1
  220. package/modifiers/CurveModifier.cjs.map +1 -1
  221. package/modifiers/CurveModifier.js +2 -2
  222. package/modifiers/CurveModifier.js.map +1 -1
  223. package/modifiers/SimplifyModifier.cjs +2 -2
  224. package/modifiers/SimplifyModifier.cjs.map +1 -1
  225. package/modifiers/SimplifyModifier.js +2 -2
  226. package/modifiers/SimplifyModifier.js.map +1 -1
  227. package/objects/BatchedMesh.cjs +2 -2
  228. package/objects/BatchedMesh.cjs.map +1 -1
  229. package/objects/BatchedMesh.js +3 -3
  230. package/objects/BatchedMesh.js.map +1 -1
  231. package/objects/GroundProjectedEnv.cjs +2 -1
  232. package/objects/GroundProjectedEnv.cjs.map +1 -1
  233. package/objects/GroundProjectedEnv.js +3 -2
  234. package/objects/GroundProjectedEnv.js.map +1 -1
  235. package/objects/Lensflare.cjs +209 -206
  236. package/objects/Lensflare.cjs.map +1 -1
  237. package/objects/Lensflare.js +209 -206
  238. package/objects/Lensflare.js.map +1 -1
  239. package/objects/Reflector.cjs +154 -146
  240. package/objects/Reflector.cjs.map +1 -1
  241. package/objects/Reflector.js +154 -146
  242. package/objects/Reflector.js.map +1 -1
  243. package/objects/ReflectorForSSRPass.cjs +183 -180
  244. package/objects/ReflectorForSSRPass.cjs.map +1 -1
  245. package/objects/ReflectorForSSRPass.js +183 -180
  246. package/objects/ReflectorForSSRPass.js.map +1 -1
  247. package/objects/Refractor.cjs +164 -161
  248. package/objects/Refractor.cjs.map +1 -1
  249. package/objects/Refractor.js +164 -161
  250. package/objects/Refractor.js.map +1 -1
  251. package/objects/ShadowMesh.cjs +1 -1
  252. package/objects/ShadowMesh.cjs.map +1 -1
  253. package/objects/ShadowMesh.js +2 -2
  254. package/objects/ShadowMesh.js.map +1 -1
  255. package/objects/Sky.cjs +35 -32
  256. package/objects/Sky.cjs.map +1 -1
  257. package/objects/Sky.d.ts +100 -6
  258. package/objects/Sky.js +35 -32
  259. package/objects/Sky.js.map +1 -1
  260. package/objects/Water.cjs +2 -1
  261. package/objects/Water.cjs.map +1 -1
  262. package/objects/Water.js +3 -2
  263. package/objects/Water.js.map +1 -1
  264. package/objects/Water2.cjs +143 -140
  265. package/objects/Water2.cjs.map +1 -1
  266. package/objects/Water2.js +143 -140
  267. package/objects/Water2.js.map +1 -1
  268. package/package.json +1 -1
  269. package/postprocessing/SAOPass.cjs +267 -264
  270. package/postprocessing/SAOPass.cjs.map +1 -1
  271. package/postprocessing/SAOPass.js +267 -264
  272. package/postprocessing/SAOPass.js.map +1 -1
  273. package/postprocessing/SSAOPass.cjs +253 -250
  274. package/postprocessing/SSAOPass.cjs.map +1 -1
  275. package/postprocessing/SSAOPass.js +253 -250
  276. package/postprocessing/SSAOPass.js.map +1 -1
  277. package/postprocessing/SSRPass.cjs +379 -376
  278. package/postprocessing/SSRPass.cjs.map +1 -1
  279. package/postprocessing/SSRPass.js +379 -376
  280. package/postprocessing/SSRPass.js.map +1 -1
  281. package/postprocessing/UnrealBloomPass.cjs +205 -202
  282. package/postprocessing/UnrealBloomPass.cjs.map +1 -1
  283. package/postprocessing/UnrealBloomPass.js +205 -202
  284. package/postprocessing/UnrealBloomPass.js.map +1 -1
  285. package/renderers/CSS2DRenderer.cjs +5 -5
  286. package/renderers/CSS2DRenderer.cjs.map +1 -1
  287. package/renderers/CSS2DRenderer.js +5 -5
  288. package/renderers/CSS2DRenderer.js.map +1 -1
  289. package/renderers/CSS3DRenderer.cjs +5 -5
  290. package/renderers/CSS3DRenderer.cjs.map +1 -1
  291. package/renderers/CSS3DRenderer.js +6 -6
  292. package/renderers/CSS3DRenderer.js.map +1 -1
  293. package/shaders/ACESFilmicToneMappingShader.cjs +71 -46
  294. package/shaders/ACESFilmicToneMappingShader.cjs.map +1 -1
  295. package/shaders/ACESFilmicToneMappingShader.js +71 -46
  296. package/shaders/ACESFilmicToneMappingShader.js.map +1 -1
  297. package/shaders/AfterimageShader.cjs +41 -22
  298. package/shaders/AfterimageShader.cjs.map +1 -1
  299. package/shaders/AfterimageShader.js +41 -22
  300. package/shaders/AfterimageShader.js.map +1 -1
  301. package/shaders/BasicShader.cjs +20 -6
  302. package/shaders/BasicShader.cjs.map +1 -1
  303. package/shaders/BasicShader.js +20 -6
  304. package/shaders/BasicShader.js.map +1 -1
  305. package/shaders/BleachBypassShader.cjs +46 -26
  306. package/shaders/BleachBypassShader.cjs.map +1 -1
  307. package/shaders/BleachBypassShader.js +46 -26
  308. package/shaders/BleachBypassShader.js.map +1 -1
  309. package/shaders/BlendShader.cjs +33 -19
  310. package/shaders/BlendShader.cjs.map +1 -1
  311. package/shaders/BlendShader.js +33 -19
  312. package/shaders/BlendShader.js.map +1 -1
  313. package/shaders/BokehShader.cjs +117 -90
  314. package/shaders/BokehShader.cjs.map +1 -1
  315. package/shaders/BokehShader.js +117 -90
  316. package/shaders/BokehShader.js.map +1 -1
  317. package/shaders/BokehShader2.cjs +333 -232
  318. package/shaders/BokehShader2.cjs.map +1 -1
  319. package/shaders/BokehShader2.js +333 -232
  320. package/shaders/BokehShader2.js.map +1 -1
  321. package/shaders/BrightnessContrastShader.cjs +38 -22
  322. package/shaders/BrightnessContrastShader.cjs.map +1 -1
  323. package/shaders/BrightnessContrastShader.js +38 -22
  324. package/shaders/BrightnessContrastShader.js.map +1 -1
  325. package/shaders/ColorCorrectionShader.cjs +35 -21
  326. package/shaders/ColorCorrectionShader.cjs.map +1 -1
  327. package/shaders/ColorCorrectionShader.js +35 -21
  328. package/shaders/ColorCorrectionShader.js.map +1 -1
  329. package/shaders/ColorifyShader.cjs +34 -19
  330. package/shaders/ColorifyShader.cjs.map +1 -1
  331. package/shaders/ColorifyShader.js +34 -19
  332. package/shaders/ColorifyShader.js.map +1 -1
  333. package/shaders/ConvolutionShader.cjs +43 -24
  334. package/shaders/ConvolutionShader.cjs.map +1 -1
  335. package/shaders/ConvolutionShader.js +43 -24
  336. package/shaders/ConvolutionShader.js.map +1 -1
  337. package/shaders/CopyShader.cjs +30 -16
  338. package/shaders/CopyShader.cjs.map +1 -1
  339. package/shaders/CopyShader.js +30 -16
  340. package/shaders/CopyShader.js.map +1 -1
  341. package/shaders/DOFMipMapShader.cjs +38 -21
  342. package/shaders/DOFMipMapShader.cjs.map +1 -1
  343. package/shaders/DOFMipMapShader.js +38 -21
  344. package/shaders/DOFMipMapShader.js.map +1 -1
  345. package/shaders/DepthLimitedBlurShader.cjs +98 -69
  346. package/shaders/DepthLimitedBlurShader.cjs.map +1 -1
  347. package/shaders/DepthLimitedBlurShader.js +98 -69
  348. package/shaders/DepthLimitedBlurShader.js.map +1 -1
  349. package/shaders/DigitalGlitch.cjs +70 -59
  350. package/shaders/DigitalGlitch.cjs.map +1 -1
  351. package/shaders/DigitalGlitch.js +70 -59
  352. package/shaders/DigitalGlitch.js.map +1 -1
  353. package/shaders/DotScreenShader.cjs +49 -28
  354. package/shaders/DotScreenShader.cjs.map +1 -1
  355. package/shaders/DotScreenShader.js +49 -28
  356. package/shaders/DotScreenShader.js.map +1 -1
  357. package/shaders/FXAAShader.cjs +1098 -1089
  358. package/shaders/FXAAShader.cjs.map +1 -1
  359. package/shaders/FXAAShader.js +1098 -1089
  360. package/shaders/FXAAShader.js.map +1 -1
  361. package/shaders/FilmShader.cjs +57 -29
  362. package/shaders/FilmShader.cjs.map +1 -1
  363. package/shaders/FilmShader.js +57 -29
  364. package/shaders/FilmShader.js.map +1 -1
  365. package/shaders/FocusShader.cjs +70 -43
  366. package/shaders/FocusShader.cjs.map +1 -1
  367. package/shaders/FocusShader.js +70 -43
  368. package/shaders/FocusShader.js.map +1 -1
  369. package/shaders/FreiChenShader.cjs +74 -53
  370. package/shaders/FreiChenShader.cjs.map +1 -1
  371. package/shaders/FreiChenShader.js +74 -53
  372. package/shaders/FreiChenShader.js.map +1 -1
  373. package/shaders/FresnelShader.cjs +55 -35
  374. package/shaders/FresnelShader.cjs.map +1 -1
  375. package/shaders/FresnelShader.js +55 -35
  376. package/shaders/FresnelShader.js.map +1 -1
  377. package/shaders/GammaCorrectionShader.cjs +33 -19
  378. package/shaders/GammaCorrectionShader.cjs.map +1 -1
  379. package/shaders/GammaCorrectionShader.js +33 -19
  380. package/shaders/GammaCorrectionShader.js.map +1 -1
  381. package/shaders/GodRaysShader.cjs +193 -116
  382. package/shaders/GodRaysShader.cjs.map +1 -1
  383. package/shaders/GodRaysShader.js +193 -116
  384. package/shaders/GodRaysShader.js.map +1 -1
  385. package/shaders/HalftoneShader.cjs +270 -192
  386. package/shaders/HalftoneShader.cjs.map +1 -1
  387. package/shaders/HalftoneShader.js +270 -192
  388. package/shaders/HalftoneShader.js.map +1 -1
  389. package/shaders/HorizontalTiltShiftShader.cjs +43 -27
  390. package/shaders/HorizontalTiltShiftShader.cjs.map +1 -1
  391. package/shaders/HorizontalTiltShiftShader.js +43 -27
  392. package/shaders/HorizontalTiltShiftShader.js.map +1 -1
  393. package/shaders/HueSaturationShader.cjs +47 -31
  394. package/shaders/HueSaturationShader.cjs.map +1 -1
  395. package/shaders/HueSaturationShader.js +47 -31
  396. package/shaders/HueSaturationShader.js.map +1 -1
  397. package/shaders/KaleidoShader.cjs +37 -24
  398. package/shaders/KaleidoShader.cjs.map +1 -1
  399. package/shaders/KaleidoShader.js +37 -24
  400. package/shaders/KaleidoShader.js.map +1 -1
  401. package/shaders/LuminosityHighPassShader.cjs +43 -24
  402. package/shaders/LuminosityHighPassShader.cjs.map +1 -1
  403. package/shaders/LuminosityHighPassShader.js +43 -24
  404. package/shaders/LuminosityHighPassShader.js.map +1 -1
  405. package/shaders/LuminosityShader.cjs +34 -17
  406. package/shaders/LuminosityShader.cjs.map +1 -1
  407. package/shaders/LuminosityShader.js +34 -17
  408. package/shaders/LuminosityShader.js.map +1 -1
  409. package/shaders/MirrorShader.cjs +39 -26
  410. package/shaders/MirrorShader.cjs.map +1 -1
  411. package/shaders/MirrorShader.js +39 -26
  412. package/shaders/MirrorShader.js.map +1 -1
  413. package/shaders/NormalMapShader.cjs +36 -21
  414. package/shaders/NormalMapShader.cjs.map +1 -1
  415. package/shaders/NormalMapShader.js +36 -21
  416. package/shaders/NormalMapShader.js.map +1 -1
  417. package/shaders/ParallaxShader.cjs +147 -97
  418. package/shaders/ParallaxShader.cjs.map +1 -1
  419. package/shaders/ParallaxShader.js +147 -97
  420. package/shaders/ParallaxShader.js.map +1 -1
  421. package/shaders/PixelShader.cjs +31 -18
  422. package/shaders/PixelShader.cjs.map +1 -1
  423. package/shaders/PixelShader.js +31 -18
  424. package/shaders/PixelShader.js.map +1 -1
  425. package/shaders/RGBShiftShader.cjs +33 -20
  426. package/shaders/RGBShiftShader.cjs.map +1 -1
  427. package/shaders/RGBShiftShader.js +33 -20
  428. package/shaders/RGBShiftShader.js.map +1 -1
  429. package/shaders/SAOShader.cjs +154 -117
  430. package/shaders/SAOShader.cjs.map +1 -1
  431. package/shaders/SAOShader.js +154 -117
  432. package/shaders/SAOShader.js.map +1 -1
  433. package/shaders/SMAAShader.cjs +358 -270
  434. package/shaders/SMAAShader.cjs.map +1 -1
  435. package/shaders/SMAAShader.js +358 -270
  436. package/shaders/SMAAShader.js.map +1 -1
  437. package/shaders/SSAOShader.cjs +236 -142
  438. package/shaders/SSAOShader.cjs.map +1 -1
  439. package/shaders/SSAOShader.js +236 -142
  440. package/shaders/SSAOShader.js.map +1 -1
  441. package/shaders/SSRShader.cjs +4 -4
  442. package/shaders/SSRShader.cjs.map +1 -1
  443. package/shaders/SSRShader.js +4 -4
  444. package/shaders/SSRShader.js.map +1 -1
  445. package/shaders/SepiaShader.cjs +36 -20
  446. package/shaders/SepiaShader.cjs.map +1 -1
  447. package/shaders/SepiaShader.js +36 -20
  448. package/shaders/SepiaShader.js.map +1 -1
  449. package/shaders/SobelOperatorShader.cjs +64 -37
  450. package/shaders/SobelOperatorShader.cjs.map +1 -1
  451. package/shaders/SobelOperatorShader.js +64 -37
  452. package/shaders/SobelOperatorShader.js.map +1 -1
  453. package/shaders/TechnicolorShader.cjs +29 -16
  454. package/shaders/TechnicolorShader.cjs.map +1 -1
  455. package/shaders/TechnicolorShader.js +29 -16
  456. package/shaders/TechnicolorShader.js.map +1 -1
  457. package/shaders/ToneMapShader.cjs +55 -35
  458. package/shaders/ToneMapShader.cjs.map +1 -1
  459. package/shaders/ToneMapShader.js +55 -35
  460. package/shaders/ToneMapShader.js.map +1 -1
  461. package/shaders/ToonShader.cjs +275 -165
  462. package/shaders/ToonShader.cjs.map +1 -1
  463. package/shaders/ToonShader.js +275 -165
  464. package/shaders/ToonShader.js.map +1 -1
  465. package/shaders/TriangleBlurShader.cjs +50 -27
  466. package/shaders/TriangleBlurShader.cjs.map +1 -1
  467. package/shaders/TriangleBlurShader.js +50 -27
  468. package/shaders/TriangleBlurShader.js.map +1 -1
  469. package/shaders/UnpackDepthRGBAShader.cjs +32 -17
  470. package/shaders/UnpackDepthRGBAShader.cjs.map +1 -1
  471. package/shaders/UnpackDepthRGBAShader.js +32 -17
  472. package/shaders/UnpackDepthRGBAShader.js.map +1 -1
  473. package/shaders/VerticalTiltShiftShader.cjs +43 -27
  474. package/shaders/VerticalTiltShiftShader.cjs.map +1 -1
  475. package/shaders/VerticalTiltShiftShader.js +43 -27
  476. package/shaders/VerticalTiltShiftShader.js.map +1 -1
  477. package/shaders/VignetteShader.cjs +43 -27
  478. package/shaders/VignetteShader.cjs.map +1 -1
  479. package/shaders/VignetteShader.js +43 -27
  480. package/shaders/VignetteShader.js.map +1 -1
  481. package/shaders/VolumeShader.cjs +264 -213
  482. package/shaders/VolumeShader.cjs.map +1 -1
  483. package/shaders/VolumeShader.js +264 -213
  484. package/shaders/VolumeShader.js.map +1 -1
  485. package/shaders/WaterRefractionShader.cjs +63 -35
  486. package/shaders/WaterRefractionShader.cjs.map +1 -1
  487. package/shaders/WaterRefractionShader.js +63 -35
  488. package/shaders/WaterRefractionShader.js.map +1 -1
  489. package/utils/GeometryCompressionUtils.cjs +2 -1
  490. package/utils/GeometryCompressionUtils.cjs.map +1 -1
  491. package/utils/GeometryCompressionUtils.js +3 -2
  492. package/utils/GeometryCompressionUtils.js.map +1 -1
  493. package/utils/RoughnessMipmapper.cjs +3 -3
  494. package/utils/RoughnessMipmapper.cjs.map +1 -1
  495. package/utils/RoughnessMipmapper.js +4 -4
  496. package/utils/RoughnessMipmapper.js.map +1 -1
  497. package/webxr/ARButton.cjs +109 -106
  498. package/webxr/ARButton.cjs.map +1 -1
  499. package/webxr/ARButton.d.ts +4 -3
  500. package/webxr/ARButton.js +109 -106
  501. package/webxr/ARButton.js.map +1 -1
  502. package/webxr/OculusHandPointerModel.cjs +2 -2
  503. package/webxr/OculusHandPointerModel.cjs.map +1 -1
  504. package/webxr/OculusHandPointerModel.js +2 -2
  505. package/webxr/OculusHandPointerModel.js.map +1 -1
  506. package/webxr/VRButton.cjs +98 -95
  507. package/webxr/VRButton.cjs.map +1 -1
  508. package/webxr/VRButton.d.ts +6 -5
  509. package/webxr/VRButton.js +98 -95
  510. package/webxr/VRButton.js.map +1 -1
  511. package/webxr/XRHandPrimitiveModel.cjs +2 -2
  512. package/webxr/XRHandPrimitiveModel.cjs.map +1 -1
  513. package/webxr/XRHandPrimitiveModel.js +3 -3
  514. package/webxr/XRHandPrimitiveModel.js.map +1 -1
@@ -2,1816 +2,1822 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const THREE = require("three");
4
4
  const COLOR_SPACE_SVG = "srgb";
5
- class SVGLoader extends THREE.Loader {
6
- constructor(manager) {
7
- super(manager);
8
- this.defaultDPI = 90;
9
- this.defaultUnit = "px";
10
- }
11
- load(url, onLoad, onProgress, onError) {
12
- const scope = this;
13
- const loader = new THREE.FileLoader(scope.manager);
14
- loader.setPath(scope.path);
15
- loader.setRequestHeader(scope.requestHeader);
16
- loader.setWithCredentials(scope.withCredentials);
17
- loader.load(
18
- url,
19
- function(text) {
20
- try {
21
- onLoad(scope.parse(text));
22
- } catch (e) {
23
- if (onError) {
24
- onError(e);
25
- } else {
26
- console.error(e);
27
- }
28
- scope.manager.itemError(url);
29
- }
30
- },
31
- onProgress,
32
- onError
33
- );
34
- }
35
- parse(text) {
36
- const scope = this;
37
- function parseNode(node, style) {
38
- if (node.nodeType !== 1)
39
- return;
40
- const transform = getNodeTransform(node);
41
- let isDefsNode = false;
42
- let path = null;
43
- switch (node.nodeName) {
44
- case "svg":
45
- style = parseStyle(node, style);
46
- break;
47
- case "style":
48
- parseCSSStylesheet(node);
49
- break;
50
- case "g":
51
- style = parseStyle(node, style);
52
- break;
53
- case "path":
54
- style = parseStyle(node, style);
55
- if (node.hasAttribute("d"))
56
- path = parsePathNode(node);
57
- break;
58
- case "rect":
59
- style = parseStyle(node, style);
60
- path = parseRectNode(node);
61
- break;
62
- case "polygon":
63
- style = parseStyle(node, style);
64
- path = parsePolygonNode(node);
65
- break;
66
- case "polyline":
67
- style = parseStyle(node, style);
68
- path = parsePolylineNode(node);
69
- break;
70
- case "circle":
71
- style = parseStyle(node, style);
72
- path = parseCircleNode(node);
73
- break;
74
- case "ellipse":
75
- style = parseStyle(node, style);
76
- path = parseEllipseNode(node);
77
- break;
78
- case "line":
79
- style = parseStyle(node, style);
80
- path = parseLineNode(node);
81
- break;
82
- case "defs":
83
- isDefsNode = true;
84
- break;
85
- case "use":
86
- style = parseStyle(node, style);
87
- const href = node.getAttributeNS("http://www.w3.org/1999/xlink", "href") || "";
88
- const usedNodeId = href.substring(1);
89
- const usedNode = node.viewportElement.getElementById(usedNodeId);
90
- if (usedNode) {
91
- parseNode(usedNode, style);
92
- } else {
93
- console.warn("SVGLoader: 'use node' references non-existent node id: " + usedNodeId);
94
- }
95
- break;
96
- }
97
- if (path) {
98
- if (style.fill !== void 0 && style.fill !== "none") {
99
- path.color.setStyle(style.fill, COLOR_SPACE_SVG);
100
- }
101
- transformPath(path, currentTransform);
102
- paths.push(path);
103
- path.userData = { node, style };
104
- }
105
- const childNodes = node.childNodes;
106
- for (let i = 0; i < childNodes.length; i++) {
107
- const node2 = childNodes[i];
108
- if (isDefsNode && node2.nodeName !== "style" && node2.nodeName !== "defs") {
109
- continue;
110
- }
111
- parseNode(node2, style);
112
- }
113
- if (transform) {
114
- transformStack.pop();
115
- if (transformStack.length > 0) {
116
- currentTransform.copy(transformStack[transformStack.length - 1]);
117
- } else {
118
- currentTransform.identity();
119
- }
120
- }
5
+ const SVGLoader = /* @__PURE__ */ (() => {
6
+ class SVGLoader2 extends THREE.Loader {
7
+ constructor(manager) {
8
+ super(manager);
9
+ this.defaultDPI = 90;
10
+ this.defaultUnit = "px";
121
11
  }
122
- function parsePathNode(node) {
123
- const path = new THREE.ShapePath();
124
- const point = new THREE.Vector2();
125
- const control = new THREE.Vector2();
126
- const firstPoint = new THREE.Vector2();
127
- let isFirstPoint = true;
128
- let doSetFirstPoint = false;
129
- const d = node.getAttribute("d");
130
- if (d === "" || d === "none")
131
- return null;
132
- const commands = d.match(/[a-df-z][^a-df-z]*/gi);
133
- for (let i = 0, l = commands.length; i < l; i++) {
134
- const command = commands[i];
135
- const type = command.charAt(0);
136
- const data2 = command.slice(1).trim();
137
- if (isFirstPoint === true) {
138
- doSetFirstPoint = true;
139
- isFirstPoint = false;
140
- }
141
- let numbers;
142
- switch (type) {
143
- case "M":
144
- numbers = parseFloats(data2);
145
- for (let j = 0, jl = numbers.length; j < jl; j += 2) {
146
- point.x = numbers[j + 0];
147
- point.y = numbers[j + 1];
148
- control.x = point.x;
149
- control.y = point.y;
150
- if (j === 0) {
151
- path.moveTo(point.x, point.y);
152
- } else {
153
- path.lineTo(point.x, point.y);
154
- }
155
- if (j === 0)
156
- firstPoint.copy(point);
157
- }
158
- break;
159
- case "H":
160
- numbers = parseFloats(data2);
161
- for (let j = 0, jl = numbers.length; j < jl; j++) {
162
- point.x = numbers[j];
163
- control.x = point.x;
164
- control.y = point.y;
165
- path.lineTo(point.x, point.y);
166
- if (j === 0 && doSetFirstPoint === true)
167
- firstPoint.copy(point);
168
- }
169
- break;
170
- case "V":
171
- numbers = parseFloats(data2);
172
- for (let j = 0, jl = numbers.length; j < jl; j++) {
173
- point.y = numbers[j];
174
- control.x = point.x;
175
- control.y = point.y;
176
- path.lineTo(point.x, point.y);
177
- if (j === 0 && doSetFirstPoint === true)
178
- firstPoint.copy(point);
179
- }
180
- break;
181
- case "L":
182
- numbers = parseFloats(data2);
183
- for (let j = 0, jl = numbers.length; j < jl; j += 2) {
184
- point.x = numbers[j + 0];
185
- point.y = numbers[j + 1];
186
- control.x = point.x;
187
- control.y = point.y;
188
- path.lineTo(point.x, point.y);
189
- if (j === 0 && doSetFirstPoint === true)
190
- firstPoint.copy(point);
191
- }
192
- break;
193
- case "C":
194
- numbers = parseFloats(data2);
195
- for (let j = 0, jl = numbers.length; j < jl; j += 6) {
196
- path.bezierCurveTo(
197
- numbers[j + 0],
198
- numbers[j + 1],
199
- numbers[j + 2],
200
- numbers[j + 3],
201
- numbers[j + 4],
202
- numbers[j + 5]
203
- );
204
- control.x = numbers[j + 2];
205
- control.y = numbers[j + 3];
206
- point.x = numbers[j + 4];
207
- point.y = numbers[j + 5];
208
- if (j === 0 && doSetFirstPoint === true)
209
- firstPoint.copy(point);
12
+ load(url, onLoad, onProgress, onError) {
13
+ const scope = this;
14
+ const loader = new THREE.FileLoader(scope.manager);
15
+ loader.setPath(scope.path);
16
+ loader.setRequestHeader(scope.requestHeader);
17
+ loader.setWithCredentials(scope.withCredentials);
18
+ loader.load(
19
+ url,
20
+ function(text) {
21
+ try {
22
+ onLoad(scope.parse(text));
23
+ } catch (e) {
24
+ if (onError) {
25
+ onError(e);
26
+ } else {
27
+ console.error(e);
210
28
  }
29
+ scope.manager.itemError(url);
30
+ }
31
+ },
32
+ onProgress,
33
+ onError
34
+ );
35
+ }
36
+ parse(text) {
37
+ const scope = this;
38
+ function parseNode(node, style) {
39
+ if (node.nodeType !== 1)
40
+ return;
41
+ const transform = getNodeTransform(node);
42
+ let isDefsNode = false;
43
+ let path = null;
44
+ switch (node.nodeName) {
45
+ case "svg":
46
+ style = parseStyle(node, style);
211
47
  break;
212
- case "S":
213
- numbers = parseFloats(data2);
214
- for (let j = 0, jl = numbers.length; j < jl; j += 4) {
215
- path.bezierCurveTo(
216
- getReflection(point.x, control.x),
217
- getReflection(point.y, control.y),
218
- numbers[j + 0],
219
- numbers[j + 1],
220
- numbers[j + 2],
221
- numbers[j + 3]
222
- );
223
- control.x = numbers[j + 0];
224
- control.y = numbers[j + 1];
225
- point.x = numbers[j + 2];
226
- point.y = numbers[j + 3];
227
- if (j === 0 && doSetFirstPoint === true)
228
- firstPoint.copy(point);
229
- }
48
+ case "style":
49
+ parseCSSStylesheet(node);
230
50
  break;
231
- case "Q":
232
- numbers = parseFloats(data2);
233
- for (let j = 0, jl = numbers.length; j < jl; j += 4) {
234
- path.quadraticCurveTo(numbers[j + 0], numbers[j + 1], numbers[j + 2], numbers[j + 3]);
235
- control.x = numbers[j + 0];
236
- control.y = numbers[j + 1];
237
- point.x = numbers[j + 2];
238
- point.y = numbers[j + 3];
239
- if (j === 0 && doSetFirstPoint === true)
240
- firstPoint.copy(point);
241
- }
51
+ case "g":
52
+ style = parseStyle(node, style);
242
53
  break;
243
- case "T":
244
- numbers = parseFloats(data2);
245
- for (let j = 0, jl = numbers.length; j < jl; j += 2) {
246
- const rx = getReflection(point.x, control.x);
247
- const ry = getReflection(point.y, control.y);
248
- path.quadraticCurveTo(rx, ry, numbers[j + 0], numbers[j + 1]);
249
- control.x = rx;
250
- control.y = ry;
251
- point.x = numbers[j + 0];
252
- point.y = numbers[j + 1];
253
- if (j === 0 && doSetFirstPoint === true)
254
- firstPoint.copy(point);
255
- }
54
+ case "path":
55
+ style = parseStyle(node, style);
56
+ if (node.hasAttribute("d"))
57
+ path = parsePathNode(node);
256
58
  break;
257
- case "A":
258
- numbers = parseFloats(data2, [3, 4], 7);
259
- for (let j = 0, jl = numbers.length; j < jl; j += 7) {
260
- if (numbers[j + 5] == point.x && numbers[j + 6] == point.y)
261
- continue;
262
- const start = point.clone();
263
- point.x = numbers[j + 5];
264
- point.y = numbers[j + 6];
265
- control.x = point.x;
266
- control.y = point.y;
267
- parseArcCommand(
268
- path,
269
- numbers[j],
270
- numbers[j + 1],
271
- numbers[j + 2],
272
- numbers[j + 3],
273
- numbers[j + 4],
274
- start,
275
- point
276
- );
277
- if (j === 0 && doSetFirstPoint === true)
278
- firstPoint.copy(point);
279
- }
59
+ case "rect":
60
+ style = parseStyle(node, style);
61
+ path = parseRectNode(node);
280
62
  break;
281
- case "m":
282
- numbers = parseFloats(data2);
283
- for (let j = 0, jl = numbers.length; j < jl; j += 2) {
284
- point.x += numbers[j + 0];
285
- point.y += numbers[j + 1];
286
- control.x = point.x;
287
- control.y = point.y;
288
- if (j === 0) {
289
- path.moveTo(point.x, point.y);
290
- } else {
291
- path.lineTo(point.x, point.y);
292
- }
293
- if (j === 0)
294
- firstPoint.copy(point);
295
- }
63
+ case "polygon":
64
+ style = parseStyle(node, style);
65
+ path = parsePolygonNode(node);
296
66
  break;
297
- case "h":
298
- numbers = parseFloats(data2);
299
- for (let j = 0, jl = numbers.length; j < jl; j++) {
300
- point.x += numbers[j];
301
- control.x = point.x;
302
- control.y = point.y;
303
- path.lineTo(point.x, point.y);
304
- if (j === 0 && doSetFirstPoint === true)
305
- firstPoint.copy(point);
306
- }
67
+ case "polyline":
68
+ style = parseStyle(node, style);
69
+ path = parsePolylineNode(node);
307
70
  break;
308
- case "v":
309
- numbers = parseFloats(data2);
310
- for (let j = 0, jl = numbers.length; j < jl; j++) {
311
- point.y += numbers[j];
312
- control.x = point.x;
313
- control.y = point.y;
314
- path.lineTo(point.x, point.y);
315
- if (j === 0 && doSetFirstPoint === true)
316
- firstPoint.copy(point);
317
- }
71
+ case "circle":
72
+ style = parseStyle(node, style);
73
+ path = parseCircleNode(node);
318
74
  break;
319
- case "l":
320
- numbers = parseFloats(data2);
321
- for (let j = 0, jl = numbers.length; j < jl; j += 2) {
322
- point.x += numbers[j + 0];
323
- point.y += numbers[j + 1];
324
- control.x = point.x;
325
- control.y = point.y;
326
- path.lineTo(point.x, point.y);
327
- if (j === 0 && doSetFirstPoint === true)
328
- firstPoint.copy(point);
329
- }
75
+ case "ellipse":
76
+ style = parseStyle(node, style);
77
+ path = parseEllipseNode(node);
330
78
  break;
331
- case "c":
332
- numbers = parseFloats(data2);
333
- for (let j = 0, jl = numbers.length; j < jl; j += 6) {
334
- path.bezierCurveTo(
335
- point.x + numbers[j + 0],
336
- point.y + numbers[j + 1],
337
- point.x + numbers[j + 2],
338
- point.y + numbers[j + 3],
339
- point.x + numbers[j + 4],
340
- point.y + numbers[j + 5]
341
- );
342
- control.x = point.x + numbers[j + 2];
343
- control.y = point.y + numbers[j + 3];
344
- point.x += numbers[j + 4];
345
- point.y += numbers[j + 5];
346
- if (j === 0 && doSetFirstPoint === true)
347
- firstPoint.copy(point);
348
- }
79
+ case "line":
80
+ style = parseStyle(node, style);
81
+ path = parseLineNode(node);
349
82
  break;
350
- case "s":
351
- numbers = parseFloats(data2);
352
- for (let j = 0, jl = numbers.length; j < jl; j += 4) {
353
- path.bezierCurveTo(
354
- getReflection(point.x, control.x),
355
- getReflection(point.y, control.y),
356
- point.x + numbers[j + 0],
357
- point.y + numbers[j + 1],
358
- point.x + numbers[j + 2],
359
- point.y + numbers[j + 3]
360
- );
361
- control.x = point.x + numbers[j + 0];
362
- control.y = point.y + numbers[j + 1];
363
- point.x += numbers[j + 2];
364
- point.y += numbers[j + 3];
365
- if (j === 0 && doSetFirstPoint === true)
366
- firstPoint.copy(point);
367
- }
83
+ case "defs":
84
+ isDefsNode = true;
368
85
  break;
369
- case "q":
370
- numbers = parseFloats(data2);
371
- for (let j = 0, jl = numbers.length; j < jl; j += 4) {
372
- path.quadraticCurveTo(
373
- point.x + numbers[j + 0],
374
- point.y + numbers[j + 1],
375
- point.x + numbers[j + 2],
376
- point.y + numbers[j + 3]
377
- );
378
- control.x = point.x + numbers[j + 0];
379
- control.y = point.y + numbers[j + 1];
380
- point.x += numbers[j + 2];
381
- point.y += numbers[j + 3];
382
- if (j === 0 && doSetFirstPoint === true)
383
- firstPoint.copy(point);
384
- }
385
- break;
386
- case "t":
387
- numbers = parseFloats(data2);
388
- for (let j = 0, jl = numbers.length; j < jl; j += 2) {
389
- const rx = getReflection(point.x, control.x);
390
- const ry = getReflection(point.y, control.y);
391
- path.quadraticCurveTo(rx, ry, point.x + numbers[j + 0], point.y + numbers[j + 1]);
392
- control.x = rx;
393
- control.y = ry;
394
- point.x = point.x + numbers[j + 0];
395
- point.y = point.y + numbers[j + 1];
396
- if (j === 0 && doSetFirstPoint === true)
397
- firstPoint.copy(point);
398
- }
399
- break;
400
- case "a":
401
- numbers = parseFloats(data2, [3, 4], 7);
402
- for (let j = 0, jl = numbers.length; j < jl; j += 7) {
403
- if (numbers[j + 5] == 0 && numbers[j + 6] == 0)
404
- continue;
405
- const start = point.clone();
406
- point.x += numbers[j + 5];
407
- point.y += numbers[j + 6];
408
- control.x = point.x;
409
- control.y = point.y;
410
- parseArcCommand(
411
- path,
412
- numbers[j],
413
- numbers[j + 1],
414
- numbers[j + 2],
415
- numbers[j + 3],
416
- numbers[j + 4],
417
- start,
418
- point
419
- );
420
- if (j === 0 && doSetFirstPoint === true)
421
- firstPoint.copy(point);
422
- }
423
- break;
424
- case "Z":
425
- case "z":
426
- path.currentPath.autoClose = true;
427
- if (path.currentPath.curves.length > 0) {
428
- point.copy(firstPoint);
429
- path.currentPath.currentPoint.copy(point);
430
- isFirstPoint = true;
86
+ case "use":
87
+ style = parseStyle(node, style);
88
+ const href = node.getAttributeNS("http://www.w3.org/1999/xlink", "href") || "";
89
+ const usedNodeId = href.substring(1);
90
+ const usedNode = node.viewportElement.getElementById(usedNodeId);
91
+ if (usedNode) {
92
+ parseNode(usedNode, style);
93
+ } else {
94
+ console.warn("SVGLoader: 'use node' references non-existent node id: " + usedNodeId);
431
95
  }
432
96
  break;
433
- default:
434
- console.warn(command);
435
- }
436
- doSetFirstPoint = false;
437
- }
438
- return path;
439
- }
440
- function parseCSSStylesheet(node) {
441
- if (!node.sheet || !node.sheet.cssRules || !node.sheet.cssRules.length)
442
- return;
443
- for (let i = 0; i < node.sheet.cssRules.length; i++) {
444
- const stylesheet = node.sheet.cssRules[i];
445
- if (stylesheet.type !== 1)
446
- continue;
447
- const selectorList = stylesheet.selectorText.split(/,/gm).filter(Boolean).map((i2) => i2.trim());
448
- for (let j = 0; j < selectorList.length; j++) {
449
- const definitions = Object.fromEntries(Object.entries(stylesheet.style).filter(([, v]) => v !== ""));
450
- stylesheets[selectorList[j]] = Object.assign(stylesheets[selectorList[j]] || {}, definitions);
451
97
  }
452
- }
453
- }
454
- function parseArcCommand(path, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, start, end) {
455
- if (rx == 0 || ry == 0) {
456
- path.lineTo(end.x, end.y);
457
- return;
458
- }
459
- x_axis_rotation = x_axis_rotation * Math.PI / 180;
460
- rx = Math.abs(rx);
461
- ry = Math.abs(ry);
462
- const dx2 = (start.x - end.x) / 2;
463
- const dy2 = (start.y - end.y) / 2;
464
- const x1p = Math.cos(x_axis_rotation) * dx2 + Math.sin(x_axis_rotation) * dy2;
465
- const y1p = -Math.sin(x_axis_rotation) * dx2 + Math.cos(x_axis_rotation) * dy2;
466
- let rxs = rx * rx;
467
- let rys = ry * ry;
468
- const x1ps = x1p * x1p;
469
- const y1ps = y1p * y1p;
470
- const cr = x1ps / rxs + y1ps / rys;
471
- if (cr > 1) {
472
- const s = Math.sqrt(cr);
473
- rx = s * rx;
474
- ry = s * ry;
475
- rxs = rx * rx;
476
- rys = ry * ry;
477
- }
478
- const dq = rxs * y1ps + rys * x1ps;
479
- const pq = (rxs * rys - dq) / dq;
480
- let q = Math.sqrt(Math.max(0, pq));
481
- if (large_arc_flag === sweep_flag)
482
- q = -q;
483
- const cxp = q * rx * y1p / ry;
484
- const cyp = -q * ry * x1p / rx;
485
- const cx = Math.cos(x_axis_rotation) * cxp - Math.sin(x_axis_rotation) * cyp + (start.x + end.x) / 2;
486
- const cy = Math.sin(x_axis_rotation) * cxp + Math.cos(x_axis_rotation) * cyp + (start.y + end.y) / 2;
487
- const theta = svgAngle(1, 0, (x1p - cxp) / rx, (y1p - cyp) / ry);
488
- const delta = svgAngle((x1p - cxp) / rx, (y1p - cyp) / ry, (-x1p - cxp) / rx, (-y1p - cyp) / ry) % (Math.PI * 2);
489
- path.currentPath.absellipse(cx, cy, rx, ry, theta, theta + delta, sweep_flag === 0, x_axis_rotation);
490
- }
491
- function svgAngle(ux, uy, vx, vy) {
492
- const dot = ux * vx + uy * vy;
493
- const len = Math.sqrt(ux * ux + uy * uy) * Math.sqrt(vx * vx + vy * vy);
494
- let ang = Math.acos(Math.max(-1, Math.min(1, dot / len)));
495
- if (ux * vy - uy * vx < 0)
496
- ang = -ang;
497
- return ang;
498
- }
499
- function parseRectNode(node) {
500
- const x = parseFloatWithUnits(node.getAttribute("x") || 0);
501
- const y = parseFloatWithUnits(node.getAttribute("y") || 0);
502
- const rx = parseFloatWithUnits(node.getAttribute("rx") || node.getAttribute("ry") || 0);
503
- const ry = parseFloatWithUnits(node.getAttribute("ry") || node.getAttribute("rx") || 0);
504
- const w = parseFloatWithUnits(node.getAttribute("width"));
505
- const h = parseFloatWithUnits(node.getAttribute("height"));
506
- const bci = 1 - 0.551915024494;
507
- const path = new THREE.ShapePath();
508
- path.moveTo(x + rx, y);
509
- path.lineTo(x + w - rx, y);
510
- if (rx !== 0 || ry !== 0) {
511
- path.bezierCurveTo(x + w - rx * bci, y, x + w, y + ry * bci, x + w, y + ry);
512
- }
513
- path.lineTo(x + w, y + h - ry);
514
- if (rx !== 0 || ry !== 0) {
515
- path.bezierCurveTo(x + w, y + h - ry * bci, x + w - rx * bci, y + h, x + w - rx, y + h);
516
- }
517
- path.lineTo(x + rx, y + h);
518
- if (rx !== 0 || ry !== 0) {
519
- path.bezierCurveTo(x + rx * bci, y + h, x, y + h - ry * bci, x, y + h - ry);
520
- }
521
- path.lineTo(x, y + ry);
522
- if (rx !== 0 || ry !== 0) {
523
- path.bezierCurveTo(x, y + ry * bci, x + rx * bci, y, x + rx, y);
524
- }
525
- return path;
526
- }
527
- function parsePolygonNode(node) {
528
- function iterator(match, a, b) {
529
- const x = parseFloatWithUnits(a);
530
- const y = parseFloatWithUnits(b);
531
- if (index === 0) {
532
- path.moveTo(x, y);
533
- } else {
534
- path.lineTo(x, y);
98
+ if (path) {
99
+ if (style.fill !== void 0 && style.fill !== "none") {
100
+ path.color.setStyle(style.fill, COLOR_SPACE_SVG);
101
+ }
102
+ transformPath(path, currentTransform);
103
+ paths.push(path);
104
+ path.userData = { node, style };
535
105
  }
536
- index++;
537
- }
538
- const regex = /([+-]?\d*\.?\d+(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;
539
- const path = new THREE.ShapePath();
540
- let index = 0;
541
- node.getAttribute("points").replace(regex, iterator);
542
- path.currentPath.autoClose = true;
543
- return path;
544
- }
545
- function parsePolylineNode(node) {
546
- function iterator(match, a, b) {
547
- const x = parseFloatWithUnits(a);
548
- const y = parseFloatWithUnits(b);
549
- if (index === 0) {
550
- path.moveTo(x, y);
551
- } else {
552
- path.lineTo(x, y);
106
+ const childNodes = node.childNodes;
107
+ for (let i = 0; i < childNodes.length; i++) {
108
+ const node2 = childNodes[i];
109
+ if (isDefsNode && node2.nodeName !== "style" && node2.nodeName !== "defs") {
110
+ continue;
111
+ }
112
+ parseNode(node2, style);
553
113
  }
554
- index++;
555
- }
556
- const regex = /([+-]?\d*\.?\d+(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;
557
- const path = new THREE.ShapePath();
558
- let index = 0;
559
- node.getAttribute("points").replace(regex, iterator);
560
- path.currentPath.autoClose = false;
561
- return path;
562
- }
563
- function parseCircleNode(node) {
564
- const x = parseFloatWithUnits(node.getAttribute("cx") || 0);
565
- const y = parseFloatWithUnits(node.getAttribute("cy") || 0);
566
- const r = parseFloatWithUnits(node.getAttribute("r") || 0);
567
- const subpath = new THREE.Path();
568
- subpath.absarc(x, y, r, 0, Math.PI * 2);
569
- const path = new THREE.ShapePath();
570
- path.subPaths.push(subpath);
571
- return path;
572
- }
573
- function parseEllipseNode(node) {
574
- const x = parseFloatWithUnits(node.getAttribute("cx") || 0);
575
- const y = parseFloatWithUnits(node.getAttribute("cy") || 0);
576
- const rx = parseFloatWithUnits(node.getAttribute("rx") || 0);
577
- const ry = parseFloatWithUnits(node.getAttribute("ry") || 0);
578
- const subpath = new THREE.Path();
579
- subpath.absellipse(x, y, rx, ry, 0, Math.PI * 2);
580
- const path = new THREE.ShapePath();
581
- path.subPaths.push(subpath);
582
- return path;
583
- }
584
- function parseLineNode(node) {
585
- const x1 = parseFloatWithUnits(node.getAttribute("x1") || 0);
586
- const y1 = parseFloatWithUnits(node.getAttribute("y1") || 0);
587
- const x2 = parseFloatWithUnits(node.getAttribute("x2") || 0);
588
- const y2 = parseFloatWithUnits(node.getAttribute("y2") || 0);
589
- const path = new THREE.ShapePath();
590
- path.moveTo(x1, y1);
591
- path.lineTo(x2, y2);
592
- path.currentPath.autoClose = false;
593
- return path;
594
- }
595
- function parseStyle(node, style) {
596
- style = Object.assign({}, style);
597
- let stylesheetStyles = {};
598
- if (node.hasAttribute("class")) {
599
- const classSelectors = node.getAttribute("class").split(/\s/).filter(Boolean).map((i) => i.trim());
600
- for (let i = 0; i < classSelectors.length; i++) {
601
- stylesheetStyles = Object.assign(stylesheetStyles, stylesheets["." + classSelectors[i]]);
114
+ if (transform) {
115
+ transformStack.pop();
116
+ if (transformStack.length > 0) {
117
+ currentTransform.copy(transformStack[transformStack.length - 1]);
118
+ } else {
119
+ currentTransform.identity();
120
+ }
602
121
  }
603
122
  }
604
- if (node.hasAttribute("id")) {
605
- stylesheetStyles = Object.assign(stylesheetStyles, stylesheets["#" + node.getAttribute("id")]);
606
- }
607
- function addStyle(svgName, jsName, adjustFunction) {
608
- if (adjustFunction === void 0)
609
- adjustFunction = function copy(v) {
610
- if (v.startsWith("url"))
611
- console.warn("SVGLoader: url access in attributes is not implemented.");
612
- return v;
613
- };
614
- if (node.hasAttribute(svgName))
615
- style[jsName] = adjustFunction(node.getAttribute(svgName));
616
- if (stylesheetStyles[svgName])
617
- style[jsName] = adjustFunction(stylesheetStyles[svgName]);
618
- if (node.style && node.style[svgName] !== "")
619
- style[jsName] = adjustFunction(node.style[svgName]);
620
- }
621
- function clamp(v) {
622
- return Math.max(0, Math.min(1, parseFloatWithUnits(v)));
623
- }
624
- function positive(v) {
625
- return Math.max(0, parseFloatWithUnits(v));
626
- }
627
- addStyle("fill", "fill");
628
- addStyle("fill-opacity", "fillOpacity", clamp);
629
- addStyle("fill-rule", "fillRule");
630
- addStyle("opacity", "opacity", clamp);
631
- addStyle("stroke", "stroke");
632
- addStyle("stroke-opacity", "strokeOpacity", clamp);
633
- addStyle("stroke-width", "strokeWidth", positive);
634
- addStyle("stroke-linejoin", "strokeLineJoin");
635
- addStyle("stroke-linecap", "strokeLineCap");
636
- addStyle("stroke-miterlimit", "strokeMiterLimit", positive);
637
- addStyle("visibility", "visibility");
638
- return style;
639
- }
640
- function getReflection(a, b) {
641
- return a - (b - a);
642
- }
643
- function parseFloats(input, flags, stride) {
644
- if (typeof input !== "string") {
645
- throw new TypeError("Invalid input: " + typeof input);
646
- }
647
- const RE = {
648
- SEPARATOR: /[ \t\r\n\,.\-+]/,
649
- WHITESPACE: /[ \t\r\n]/,
650
- DIGIT: /[\d]/,
651
- SIGN: /[-+]/,
652
- POINT: /\./,
653
- COMMA: /,/,
654
- EXP: /e/i,
655
- FLAGS: /[01]/
656
- };
657
- const SEP = 0;
658
- const INT = 1;
659
- const FLOAT = 2;
660
- const EXP = 3;
661
- let state = SEP;
662
- let seenComma = true;
663
- let number = "", exponent = "";
664
- const result = [];
665
- function throwSyntaxError(current2, i, partial) {
666
- const error = new SyntaxError('Unexpected character "' + current2 + '" at index ' + i + ".");
667
- error.partial = partial;
668
- throw error;
669
- }
670
- function newNumber() {
671
- if (number !== "") {
672
- if (exponent === "")
673
- result.push(Number(number));
674
- else
675
- result.push(Number(number) * Math.pow(10, Number(exponent)));
676
- }
677
- number = "";
678
- exponent = "";
679
- }
680
- let current;
681
- const length = input.length;
682
- for (let i = 0; i < length; i++) {
683
- current = input[i];
684
- if (Array.isArray(flags) && flags.includes(result.length % stride) && RE.FLAGS.test(current)) {
685
- state = INT;
686
- number = current;
687
- newNumber();
688
- continue;
689
- }
690
- if (state === SEP) {
691
- if (RE.WHITESPACE.test(current)) {
692
- continue;
123
+ function parsePathNode(node) {
124
+ const path = new THREE.ShapePath();
125
+ const point = new THREE.Vector2();
126
+ const control = new THREE.Vector2();
127
+ const firstPoint = new THREE.Vector2();
128
+ let isFirstPoint = true;
129
+ let doSetFirstPoint = false;
130
+ const d = node.getAttribute("d");
131
+ if (d === "" || d === "none")
132
+ return null;
133
+ const commands = d.match(/[a-df-z][^a-df-z]*/gi);
134
+ for (let i = 0, l = commands.length; i < l; i++) {
135
+ const command = commands[i];
136
+ const type = command.charAt(0);
137
+ const data2 = command.slice(1).trim();
138
+ if (isFirstPoint === true) {
139
+ doSetFirstPoint = true;
140
+ isFirstPoint = false;
693
141
  }
694
- if (RE.DIGIT.test(current) || RE.SIGN.test(current)) {
695
- state = INT;
696
- number = current;
697
- continue;
142
+ let numbers;
143
+ switch (type) {
144
+ case "M":
145
+ numbers = parseFloats(data2);
146
+ for (let j = 0, jl = numbers.length; j < jl; j += 2) {
147
+ point.x = numbers[j + 0];
148
+ point.y = numbers[j + 1];
149
+ control.x = point.x;
150
+ control.y = point.y;
151
+ if (j === 0) {
152
+ path.moveTo(point.x, point.y);
153
+ } else {
154
+ path.lineTo(point.x, point.y);
155
+ }
156
+ if (j === 0)
157
+ firstPoint.copy(point);
158
+ }
159
+ break;
160
+ case "H":
161
+ numbers = parseFloats(data2);
162
+ for (let j = 0, jl = numbers.length; j < jl; j++) {
163
+ point.x = numbers[j];
164
+ control.x = point.x;
165
+ control.y = point.y;
166
+ path.lineTo(point.x, point.y);
167
+ if (j === 0 && doSetFirstPoint === true)
168
+ firstPoint.copy(point);
169
+ }
170
+ break;
171
+ case "V":
172
+ numbers = parseFloats(data2);
173
+ for (let j = 0, jl = numbers.length; j < jl; j++) {
174
+ point.y = numbers[j];
175
+ control.x = point.x;
176
+ control.y = point.y;
177
+ path.lineTo(point.x, point.y);
178
+ if (j === 0 && doSetFirstPoint === true)
179
+ firstPoint.copy(point);
180
+ }
181
+ break;
182
+ case "L":
183
+ numbers = parseFloats(data2);
184
+ for (let j = 0, jl = numbers.length; j < jl; j += 2) {
185
+ point.x = numbers[j + 0];
186
+ point.y = numbers[j + 1];
187
+ control.x = point.x;
188
+ control.y = point.y;
189
+ path.lineTo(point.x, point.y);
190
+ if (j === 0 && doSetFirstPoint === true)
191
+ firstPoint.copy(point);
192
+ }
193
+ break;
194
+ case "C":
195
+ numbers = parseFloats(data2);
196
+ for (let j = 0, jl = numbers.length; j < jl; j += 6) {
197
+ path.bezierCurveTo(
198
+ numbers[j + 0],
199
+ numbers[j + 1],
200
+ numbers[j + 2],
201
+ numbers[j + 3],
202
+ numbers[j + 4],
203
+ numbers[j + 5]
204
+ );
205
+ control.x = numbers[j + 2];
206
+ control.y = numbers[j + 3];
207
+ point.x = numbers[j + 4];
208
+ point.y = numbers[j + 5];
209
+ if (j === 0 && doSetFirstPoint === true)
210
+ firstPoint.copy(point);
211
+ }
212
+ break;
213
+ case "S":
214
+ numbers = parseFloats(data2);
215
+ for (let j = 0, jl = numbers.length; j < jl; j += 4) {
216
+ path.bezierCurveTo(
217
+ getReflection(point.x, control.x),
218
+ getReflection(point.y, control.y),
219
+ numbers[j + 0],
220
+ numbers[j + 1],
221
+ numbers[j + 2],
222
+ numbers[j + 3]
223
+ );
224
+ control.x = numbers[j + 0];
225
+ control.y = numbers[j + 1];
226
+ point.x = numbers[j + 2];
227
+ point.y = numbers[j + 3];
228
+ if (j === 0 && doSetFirstPoint === true)
229
+ firstPoint.copy(point);
230
+ }
231
+ break;
232
+ case "Q":
233
+ numbers = parseFloats(data2);
234
+ for (let j = 0, jl = numbers.length; j < jl; j += 4) {
235
+ path.quadraticCurveTo(numbers[j + 0], numbers[j + 1], numbers[j + 2], numbers[j + 3]);
236
+ control.x = numbers[j + 0];
237
+ control.y = numbers[j + 1];
238
+ point.x = numbers[j + 2];
239
+ point.y = numbers[j + 3];
240
+ if (j === 0 && doSetFirstPoint === true)
241
+ firstPoint.copy(point);
242
+ }
243
+ break;
244
+ case "T":
245
+ numbers = parseFloats(data2);
246
+ for (let j = 0, jl = numbers.length; j < jl; j += 2) {
247
+ const rx = getReflection(point.x, control.x);
248
+ const ry = getReflection(point.y, control.y);
249
+ path.quadraticCurveTo(rx, ry, numbers[j + 0], numbers[j + 1]);
250
+ control.x = rx;
251
+ control.y = ry;
252
+ point.x = numbers[j + 0];
253
+ point.y = numbers[j + 1];
254
+ if (j === 0 && doSetFirstPoint === true)
255
+ firstPoint.copy(point);
256
+ }
257
+ break;
258
+ case "A":
259
+ numbers = parseFloats(data2, [3, 4], 7);
260
+ for (let j = 0, jl = numbers.length; j < jl; j += 7) {
261
+ if (numbers[j + 5] == point.x && numbers[j + 6] == point.y)
262
+ continue;
263
+ const start = point.clone();
264
+ point.x = numbers[j + 5];
265
+ point.y = numbers[j + 6];
266
+ control.x = point.x;
267
+ control.y = point.y;
268
+ parseArcCommand(
269
+ path,
270
+ numbers[j],
271
+ numbers[j + 1],
272
+ numbers[j + 2],
273
+ numbers[j + 3],
274
+ numbers[j + 4],
275
+ start,
276
+ point
277
+ );
278
+ if (j === 0 && doSetFirstPoint === true)
279
+ firstPoint.copy(point);
280
+ }
281
+ break;
282
+ case "m":
283
+ numbers = parseFloats(data2);
284
+ for (let j = 0, jl = numbers.length; j < jl; j += 2) {
285
+ point.x += numbers[j + 0];
286
+ point.y += numbers[j + 1];
287
+ control.x = point.x;
288
+ control.y = point.y;
289
+ if (j === 0) {
290
+ path.moveTo(point.x, point.y);
291
+ } else {
292
+ path.lineTo(point.x, point.y);
293
+ }
294
+ if (j === 0)
295
+ firstPoint.copy(point);
296
+ }
297
+ break;
298
+ case "h":
299
+ numbers = parseFloats(data2);
300
+ for (let j = 0, jl = numbers.length; j < jl; j++) {
301
+ point.x += numbers[j];
302
+ control.x = point.x;
303
+ control.y = point.y;
304
+ path.lineTo(point.x, point.y);
305
+ if (j === 0 && doSetFirstPoint === true)
306
+ firstPoint.copy(point);
307
+ }
308
+ break;
309
+ case "v":
310
+ numbers = parseFloats(data2);
311
+ for (let j = 0, jl = numbers.length; j < jl; j++) {
312
+ point.y += numbers[j];
313
+ control.x = point.x;
314
+ control.y = point.y;
315
+ path.lineTo(point.x, point.y);
316
+ if (j === 0 && doSetFirstPoint === true)
317
+ firstPoint.copy(point);
318
+ }
319
+ break;
320
+ case "l":
321
+ numbers = parseFloats(data2);
322
+ for (let j = 0, jl = numbers.length; j < jl; j += 2) {
323
+ point.x += numbers[j + 0];
324
+ point.y += numbers[j + 1];
325
+ control.x = point.x;
326
+ control.y = point.y;
327
+ path.lineTo(point.x, point.y);
328
+ if (j === 0 && doSetFirstPoint === true)
329
+ firstPoint.copy(point);
330
+ }
331
+ break;
332
+ case "c":
333
+ numbers = parseFloats(data2);
334
+ for (let j = 0, jl = numbers.length; j < jl; j += 6) {
335
+ path.bezierCurveTo(
336
+ point.x + numbers[j + 0],
337
+ point.y + numbers[j + 1],
338
+ point.x + numbers[j + 2],
339
+ point.y + numbers[j + 3],
340
+ point.x + numbers[j + 4],
341
+ point.y + numbers[j + 5]
342
+ );
343
+ control.x = point.x + numbers[j + 2];
344
+ control.y = point.y + numbers[j + 3];
345
+ point.x += numbers[j + 4];
346
+ point.y += numbers[j + 5];
347
+ if (j === 0 && doSetFirstPoint === true)
348
+ firstPoint.copy(point);
349
+ }
350
+ break;
351
+ case "s":
352
+ numbers = parseFloats(data2);
353
+ for (let j = 0, jl = numbers.length; j < jl; j += 4) {
354
+ path.bezierCurveTo(
355
+ getReflection(point.x, control.x),
356
+ getReflection(point.y, control.y),
357
+ point.x + numbers[j + 0],
358
+ point.y + numbers[j + 1],
359
+ point.x + numbers[j + 2],
360
+ point.y + numbers[j + 3]
361
+ );
362
+ control.x = point.x + numbers[j + 0];
363
+ control.y = point.y + numbers[j + 1];
364
+ point.x += numbers[j + 2];
365
+ point.y += numbers[j + 3];
366
+ if (j === 0 && doSetFirstPoint === true)
367
+ firstPoint.copy(point);
368
+ }
369
+ break;
370
+ case "q":
371
+ numbers = parseFloats(data2);
372
+ for (let j = 0, jl = numbers.length; j < jl; j += 4) {
373
+ path.quadraticCurveTo(
374
+ point.x + numbers[j + 0],
375
+ point.y + numbers[j + 1],
376
+ point.x + numbers[j + 2],
377
+ point.y + numbers[j + 3]
378
+ );
379
+ control.x = point.x + numbers[j + 0];
380
+ control.y = point.y + numbers[j + 1];
381
+ point.x += numbers[j + 2];
382
+ point.y += numbers[j + 3];
383
+ if (j === 0 && doSetFirstPoint === true)
384
+ firstPoint.copy(point);
385
+ }
386
+ break;
387
+ case "t":
388
+ numbers = parseFloats(data2);
389
+ for (let j = 0, jl = numbers.length; j < jl; j += 2) {
390
+ const rx = getReflection(point.x, control.x);
391
+ const ry = getReflection(point.y, control.y);
392
+ path.quadraticCurveTo(rx, ry, point.x + numbers[j + 0], point.y + numbers[j + 1]);
393
+ control.x = rx;
394
+ control.y = ry;
395
+ point.x = point.x + numbers[j + 0];
396
+ point.y = point.y + numbers[j + 1];
397
+ if (j === 0 && doSetFirstPoint === true)
398
+ firstPoint.copy(point);
399
+ }
400
+ break;
401
+ case "a":
402
+ numbers = parseFloats(data2, [3, 4], 7);
403
+ for (let j = 0, jl = numbers.length; j < jl; j += 7) {
404
+ if (numbers[j + 5] == 0 && numbers[j + 6] == 0)
405
+ continue;
406
+ const start = point.clone();
407
+ point.x += numbers[j + 5];
408
+ point.y += numbers[j + 6];
409
+ control.x = point.x;
410
+ control.y = point.y;
411
+ parseArcCommand(
412
+ path,
413
+ numbers[j],
414
+ numbers[j + 1],
415
+ numbers[j + 2],
416
+ numbers[j + 3],
417
+ numbers[j + 4],
418
+ start,
419
+ point
420
+ );
421
+ if (j === 0 && doSetFirstPoint === true)
422
+ firstPoint.copy(point);
423
+ }
424
+ break;
425
+ case "Z":
426
+ case "z":
427
+ path.currentPath.autoClose = true;
428
+ if (path.currentPath.curves.length > 0) {
429
+ point.copy(firstPoint);
430
+ path.currentPath.currentPoint.copy(point);
431
+ isFirstPoint = true;
432
+ }
433
+ break;
434
+ default:
435
+ console.warn(command);
698
436
  }
699
- if (RE.POINT.test(current)) {
700
- state = FLOAT;
701
- number = current;
437
+ doSetFirstPoint = false;
438
+ }
439
+ return path;
440
+ }
441
+ function parseCSSStylesheet(node) {
442
+ if (!node.sheet || !node.sheet.cssRules || !node.sheet.cssRules.length)
443
+ return;
444
+ for (let i = 0; i < node.sheet.cssRules.length; i++) {
445
+ const stylesheet = node.sheet.cssRules[i];
446
+ if (stylesheet.type !== 1)
702
447
  continue;
703
- }
704
- if (RE.COMMA.test(current)) {
705
- if (seenComma) {
706
- throwSyntaxError(current, i, result);
707
- }
708
- seenComma = true;
448
+ const selectorList = stylesheet.selectorText.split(/,/gm).filter(Boolean).map((i2) => i2.trim());
449
+ for (let j = 0; j < selectorList.length; j++) {
450
+ const definitions = Object.fromEntries(Object.entries(stylesheet.style).filter(([, v]) => v !== ""));
451
+ stylesheets[selectorList[j]] = Object.assign(stylesheets[selectorList[j]] || {}, definitions);
709
452
  }
710
453
  }
711
- if (state === INT) {
712
- if (RE.DIGIT.test(current)) {
713
- number += current;
714
- continue;
454
+ }
455
+ function parseArcCommand(path, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, start, end) {
456
+ if (rx == 0 || ry == 0) {
457
+ path.lineTo(end.x, end.y);
458
+ return;
459
+ }
460
+ x_axis_rotation = x_axis_rotation * Math.PI / 180;
461
+ rx = Math.abs(rx);
462
+ ry = Math.abs(ry);
463
+ const dx2 = (start.x - end.x) / 2;
464
+ const dy2 = (start.y - end.y) / 2;
465
+ const x1p = Math.cos(x_axis_rotation) * dx2 + Math.sin(x_axis_rotation) * dy2;
466
+ const y1p = -Math.sin(x_axis_rotation) * dx2 + Math.cos(x_axis_rotation) * dy2;
467
+ let rxs = rx * rx;
468
+ let rys = ry * ry;
469
+ const x1ps = x1p * x1p;
470
+ const y1ps = y1p * y1p;
471
+ const cr = x1ps / rxs + y1ps / rys;
472
+ if (cr > 1) {
473
+ const s = Math.sqrt(cr);
474
+ rx = s * rx;
475
+ ry = s * ry;
476
+ rxs = rx * rx;
477
+ rys = ry * ry;
478
+ }
479
+ const dq = rxs * y1ps + rys * x1ps;
480
+ const pq = (rxs * rys - dq) / dq;
481
+ let q = Math.sqrt(Math.max(0, pq));
482
+ if (large_arc_flag === sweep_flag)
483
+ q = -q;
484
+ const cxp = q * rx * y1p / ry;
485
+ const cyp = -q * ry * x1p / rx;
486
+ const cx = Math.cos(x_axis_rotation) * cxp - Math.sin(x_axis_rotation) * cyp + (start.x + end.x) / 2;
487
+ const cy = Math.sin(x_axis_rotation) * cxp + Math.cos(x_axis_rotation) * cyp + (start.y + end.y) / 2;
488
+ const theta = svgAngle(1, 0, (x1p - cxp) / rx, (y1p - cyp) / ry);
489
+ const delta = svgAngle((x1p - cxp) / rx, (y1p - cyp) / ry, (-x1p - cxp) / rx, (-y1p - cyp) / ry) % (Math.PI * 2);
490
+ path.currentPath.absellipse(cx, cy, rx, ry, theta, theta + delta, sweep_flag === 0, x_axis_rotation);
491
+ }
492
+ function svgAngle(ux, uy, vx, vy) {
493
+ const dot = ux * vx + uy * vy;
494
+ const len = Math.sqrt(ux * ux + uy * uy) * Math.sqrt(vx * vx + vy * vy);
495
+ let ang = Math.acos(Math.max(-1, Math.min(1, dot / len)));
496
+ if (ux * vy - uy * vx < 0)
497
+ ang = -ang;
498
+ return ang;
499
+ }
500
+ function parseRectNode(node) {
501
+ const x = parseFloatWithUnits(node.getAttribute("x") || 0);
502
+ const y = parseFloatWithUnits(node.getAttribute("y") || 0);
503
+ const rx = parseFloatWithUnits(node.getAttribute("rx") || node.getAttribute("ry") || 0);
504
+ const ry = parseFloatWithUnits(node.getAttribute("ry") || node.getAttribute("rx") || 0);
505
+ const w = parseFloatWithUnits(node.getAttribute("width"));
506
+ const h = parseFloatWithUnits(node.getAttribute("height"));
507
+ const bci = 1 - 0.551915024494;
508
+ const path = new THREE.ShapePath();
509
+ path.moveTo(x + rx, y);
510
+ path.lineTo(x + w - rx, y);
511
+ if (rx !== 0 || ry !== 0) {
512
+ path.bezierCurveTo(x + w - rx * bci, y, x + w, y + ry * bci, x + w, y + ry);
513
+ }
514
+ path.lineTo(x + w, y + h - ry);
515
+ if (rx !== 0 || ry !== 0) {
516
+ path.bezierCurveTo(x + w, y + h - ry * bci, x + w - rx * bci, y + h, x + w - rx, y + h);
517
+ }
518
+ path.lineTo(x + rx, y + h);
519
+ if (rx !== 0 || ry !== 0) {
520
+ path.bezierCurveTo(x + rx * bci, y + h, x, y + h - ry * bci, x, y + h - ry);
521
+ }
522
+ path.lineTo(x, y + ry);
523
+ if (rx !== 0 || ry !== 0) {
524
+ path.bezierCurveTo(x, y + ry * bci, x + rx * bci, y, x + rx, y);
525
+ }
526
+ return path;
527
+ }
528
+ function parsePolygonNode(node) {
529
+ function iterator(match, a, b) {
530
+ const x = parseFloatWithUnits(a);
531
+ const y = parseFloatWithUnits(b);
532
+ if (index === 0) {
533
+ path.moveTo(x, y);
534
+ } else {
535
+ path.lineTo(x, y);
715
536
  }
716
- if (RE.POINT.test(current)) {
717
- number += current;
718
- state = FLOAT;
719
- continue;
537
+ index++;
538
+ }
539
+ const regex = /([+-]?\d*\.?\d+(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;
540
+ const path = new THREE.ShapePath();
541
+ let index = 0;
542
+ node.getAttribute("points").replace(regex, iterator);
543
+ path.currentPath.autoClose = true;
544
+ return path;
545
+ }
546
+ function parsePolylineNode(node) {
547
+ function iterator(match, a, b) {
548
+ const x = parseFloatWithUnits(a);
549
+ const y = parseFloatWithUnits(b);
550
+ if (index === 0) {
551
+ path.moveTo(x, y);
552
+ } else {
553
+ path.lineTo(x, y);
720
554
  }
721
- if (RE.EXP.test(current)) {
722
- state = EXP;
723
- continue;
555
+ index++;
556
+ }
557
+ const regex = /([+-]?\d*\.?\d+(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;
558
+ const path = new THREE.ShapePath();
559
+ let index = 0;
560
+ node.getAttribute("points").replace(regex, iterator);
561
+ path.currentPath.autoClose = false;
562
+ return path;
563
+ }
564
+ function parseCircleNode(node) {
565
+ const x = parseFloatWithUnits(node.getAttribute("cx") || 0);
566
+ const y = parseFloatWithUnits(node.getAttribute("cy") || 0);
567
+ const r = parseFloatWithUnits(node.getAttribute("r") || 0);
568
+ const subpath = new THREE.Path();
569
+ subpath.absarc(x, y, r, 0, Math.PI * 2);
570
+ const path = new THREE.ShapePath();
571
+ path.subPaths.push(subpath);
572
+ return path;
573
+ }
574
+ function parseEllipseNode(node) {
575
+ const x = parseFloatWithUnits(node.getAttribute("cx") || 0);
576
+ const y = parseFloatWithUnits(node.getAttribute("cy") || 0);
577
+ const rx = parseFloatWithUnits(node.getAttribute("rx") || 0);
578
+ const ry = parseFloatWithUnits(node.getAttribute("ry") || 0);
579
+ const subpath = new THREE.Path();
580
+ subpath.absellipse(x, y, rx, ry, 0, Math.PI * 2);
581
+ const path = new THREE.ShapePath();
582
+ path.subPaths.push(subpath);
583
+ return path;
584
+ }
585
+ function parseLineNode(node) {
586
+ const x1 = parseFloatWithUnits(node.getAttribute("x1") || 0);
587
+ const y1 = parseFloatWithUnits(node.getAttribute("y1") || 0);
588
+ const x2 = parseFloatWithUnits(node.getAttribute("x2") || 0);
589
+ const y2 = parseFloatWithUnits(node.getAttribute("y2") || 0);
590
+ const path = new THREE.ShapePath();
591
+ path.moveTo(x1, y1);
592
+ path.lineTo(x2, y2);
593
+ path.currentPath.autoClose = false;
594
+ return path;
595
+ }
596
+ function parseStyle(node, style) {
597
+ style = Object.assign({}, style);
598
+ let stylesheetStyles = {};
599
+ if (node.hasAttribute("class")) {
600
+ const classSelectors = node.getAttribute("class").split(/\s/).filter(Boolean).map((i) => i.trim());
601
+ for (let i = 0; i < classSelectors.length; i++) {
602
+ stylesheetStyles = Object.assign(stylesheetStyles, stylesheets["." + classSelectors[i]]);
724
603
  }
725
- if (RE.SIGN.test(current) && number.length === 1 && RE.SIGN.test(number[0])) {
726
- throwSyntaxError(current, i, result);
604
+ }
605
+ if (node.hasAttribute("id")) {
606
+ stylesheetStyles = Object.assign(stylesheetStyles, stylesheets["#" + node.getAttribute("id")]);
607
+ }
608
+ function addStyle(svgName, jsName, adjustFunction) {
609
+ if (adjustFunction === void 0)
610
+ adjustFunction = function copy(v) {
611
+ if (v.startsWith("url"))
612
+ console.warn("SVGLoader: url access in attributes is not implemented.");
613
+ return v;
614
+ };
615
+ if (node.hasAttribute(svgName))
616
+ style[jsName] = adjustFunction(node.getAttribute(svgName));
617
+ if (stylesheetStyles[svgName])
618
+ style[jsName] = adjustFunction(stylesheetStyles[svgName]);
619
+ if (node.style && node.style[svgName] !== "")
620
+ style[jsName] = adjustFunction(node.style[svgName]);
621
+ }
622
+ function clamp(v) {
623
+ return Math.max(0, Math.min(1, parseFloatWithUnits(v)));
624
+ }
625
+ function positive(v) {
626
+ return Math.max(0, parseFloatWithUnits(v));
627
+ }
628
+ addStyle("fill", "fill");
629
+ addStyle("fill-opacity", "fillOpacity", clamp);
630
+ addStyle("fill-rule", "fillRule");
631
+ addStyle("opacity", "opacity", clamp);
632
+ addStyle("stroke", "stroke");
633
+ addStyle("stroke-opacity", "strokeOpacity", clamp);
634
+ addStyle("stroke-width", "strokeWidth", positive);
635
+ addStyle("stroke-linejoin", "strokeLineJoin");
636
+ addStyle("stroke-linecap", "strokeLineCap");
637
+ addStyle("stroke-miterlimit", "strokeMiterLimit", positive);
638
+ addStyle("visibility", "visibility");
639
+ return style;
640
+ }
641
+ function getReflection(a, b) {
642
+ return a - (b - a);
643
+ }
644
+ function parseFloats(input, flags, stride) {
645
+ if (typeof input !== "string") {
646
+ throw new TypeError("Invalid input: " + typeof input);
647
+ }
648
+ const RE = {
649
+ SEPARATOR: /[ \t\r\n\,.\-+]/,
650
+ WHITESPACE: /[ \t\r\n]/,
651
+ DIGIT: /[\d]/,
652
+ SIGN: /[-+]/,
653
+ POINT: /\./,
654
+ COMMA: /,/,
655
+ EXP: /e/i,
656
+ FLAGS: /[01]/
657
+ };
658
+ const SEP = 0;
659
+ const INT = 1;
660
+ const FLOAT = 2;
661
+ const EXP = 3;
662
+ let state = SEP;
663
+ let seenComma = true;
664
+ let number = "", exponent = "";
665
+ const result = [];
666
+ function throwSyntaxError(current2, i, partial) {
667
+ const error = new SyntaxError('Unexpected character "' + current2 + '" at index ' + i + ".");
668
+ error.partial = partial;
669
+ throw error;
670
+ }
671
+ function newNumber() {
672
+ if (number !== "") {
673
+ if (exponent === "")
674
+ result.push(Number(number));
675
+ else
676
+ result.push(Number(number) * Math.pow(10, Number(exponent)));
727
677
  }
678
+ number = "";
679
+ exponent = "";
728
680
  }
729
- if (state === FLOAT) {
730
- if (RE.DIGIT.test(current)) {
731
- number += current;
681
+ let current;
682
+ const length = input.length;
683
+ for (let i = 0; i < length; i++) {
684
+ current = input[i];
685
+ if (Array.isArray(flags) && flags.includes(result.length % stride) && RE.FLAGS.test(current)) {
686
+ state = INT;
687
+ number = current;
688
+ newNumber();
732
689
  continue;
733
690
  }
734
- if (RE.EXP.test(current)) {
735
- state = EXP;
736
- continue;
691
+ if (state === SEP) {
692
+ if (RE.WHITESPACE.test(current)) {
693
+ continue;
694
+ }
695
+ if (RE.DIGIT.test(current) || RE.SIGN.test(current)) {
696
+ state = INT;
697
+ number = current;
698
+ continue;
699
+ }
700
+ if (RE.POINT.test(current)) {
701
+ state = FLOAT;
702
+ number = current;
703
+ continue;
704
+ }
705
+ if (RE.COMMA.test(current)) {
706
+ if (seenComma) {
707
+ throwSyntaxError(current, i, result);
708
+ }
709
+ seenComma = true;
710
+ }
737
711
  }
738
- if (RE.POINT.test(current) && number[number.length - 1] === ".") {
739
- throwSyntaxError(current, i, result);
712
+ if (state === INT) {
713
+ if (RE.DIGIT.test(current)) {
714
+ number += current;
715
+ continue;
716
+ }
717
+ if (RE.POINT.test(current)) {
718
+ number += current;
719
+ state = FLOAT;
720
+ continue;
721
+ }
722
+ if (RE.EXP.test(current)) {
723
+ state = EXP;
724
+ continue;
725
+ }
726
+ if (RE.SIGN.test(current) && number.length === 1 && RE.SIGN.test(number[0])) {
727
+ throwSyntaxError(current, i, result);
728
+ }
740
729
  }
741
- }
742
- if (state === EXP) {
743
- if (RE.DIGIT.test(current)) {
744
- exponent += current;
745
- continue;
730
+ if (state === FLOAT) {
731
+ if (RE.DIGIT.test(current)) {
732
+ number += current;
733
+ continue;
734
+ }
735
+ if (RE.EXP.test(current)) {
736
+ state = EXP;
737
+ continue;
738
+ }
739
+ if (RE.POINT.test(current) && number[number.length - 1] === ".") {
740
+ throwSyntaxError(current, i, result);
741
+ }
746
742
  }
747
- if (RE.SIGN.test(current)) {
748
- if (exponent === "") {
743
+ if (state === EXP) {
744
+ if (RE.DIGIT.test(current)) {
749
745
  exponent += current;
750
746
  continue;
751
747
  }
752
- if (exponent.length === 1 && RE.SIGN.test(exponent)) {
753
- throwSyntaxError(current, i, result);
748
+ if (RE.SIGN.test(current)) {
749
+ if (exponent === "") {
750
+ exponent += current;
751
+ continue;
752
+ }
753
+ if (exponent.length === 1 && RE.SIGN.test(exponent)) {
754
+ throwSyntaxError(current, i, result);
755
+ }
756
+ }
757
+ }
758
+ if (RE.WHITESPACE.test(current)) {
759
+ newNumber();
760
+ state = SEP;
761
+ seenComma = false;
762
+ } else if (RE.COMMA.test(current)) {
763
+ newNumber();
764
+ state = SEP;
765
+ seenComma = true;
766
+ } else if (RE.SIGN.test(current)) {
767
+ newNumber();
768
+ state = INT;
769
+ number = current;
770
+ } else if (RE.POINT.test(current)) {
771
+ newNumber();
772
+ state = FLOAT;
773
+ number = current;
774
+ } else {
775
+ throwSyntaxError(current, i, result);
776
+ }
777
+ }
778
+ newNumber();
779
+ return result;
780
+ }
781
+ const units = ["mm", "cm", "in", "pt", "pc", "px"];
782
+ const unitConversion = {
783
+ mm: {
784
+ mm: 1,
785
+ cm: 0.1,
786
+ in: 1 / 25.4,
787
+ pt: 72 / 25.4,
788
+ pc: 6 / 25.4,
789
+ px: -1
790
+ },
791
+ cm: {
792
+ mm: 10,
793
+ cm: 1,
794
+ in: 1 / 2.54,
795
+ pt: 72 / 2.54,
796
+ pc: 6 / 2.54,
797
+ px: -1
798
+ },
799
+ in: {
800
+ mm: 25.4,
801
+ cm: 2.54,
802
+ in: 1,
803
+ pt: 72,
804
+ pc: 6,
805
+ px: -1
806
+ },
807
+ pt: {
808
+ mm: 25.4 / 72,
809
+ cm: 2.54 / 72,
810
+ in: 1 / 72,
811
+ pt: 1,
812
+ pc: 6 / 72,
813
+ px: -1
814
+ },
815
+ pc: {
816
+ mm: 25.4 / 6,
817
+ cm: 2.54 / 6,
818
+ in: 1 / 6,
819
+ pt: 72 / 6,
820
+ pc: 1,
821
+ px: -1
822
+ },
823
+ px: {
824
+ px: 1
825
+ }
826
+ };
827
+ function parseFloatWithUnits(string) {
828
+ let theUnit = "px";
829
+ if (typeof string === "string" || string instanceof String) {
830
+ for (let i = 0, n = units.length; i < n; i++) {
831
+ const u = units[i];
832
+ if (string.endsWith(u)) {
833
+ theUnit = u;
834
+ string = string.substring(0, string.length - u.length);
835
+ break;
754
836
  }
755
837
  }
756
838
  }
757
- if (RE.WHITESPACE.test(current)) {
758
- newNumber();
759
- state = SEP;
760
- seenComma = false;
761
- } else if (RE.COMMA.test(current)) {
762
- newNumber();
763
- state = SEP;
764
- seenComma = true;
765
- } else if (RE.SIGN.test(current)) {
766
- newNumber();
767
- state = INT;
768
- number = current;
769
- } else if (RE.POINT.test(current)) {
770
- newNumber();
771
- state = FLOAT;
772
- number = current;
839
+ let scale = void 0;
840
+ if (theUnit === "px" && scope.defaultUnit !== "px") {
841
+ scale = unitConversion["in"][scope.defaultUnit] / scope.defaultDPI;
773
842
  } else {
774
- throwSyntaxError(current, i, result);
775
- }
776
- }
777
- newNumber();
778
- return result;
779
- }
780
- const units = ["mm", "cm", "in", "pt", "pc", "px"];
781
- const unitConversion = {
782
- mm: {
783
- mm: 1,
784
- cm: 0.1,
785
- in: 1 / 25.4,
786
- pt: 72 / 25.4,
787
- pc: 6 / 25.4,
788
- px: -1
789
- },
790
- cm: {
791
- mm: 10,
792
- cm: 1,
793
- in: 1 / 2.54,
794
- pt: 72 / 2.54,
795
- pc: 6 / 2.54,
796
- px: -1
797
- },
798
- in: {
799
- mm: 25.4,
800
- cm: 2.54,
801
- in: 1,
802
- pt: 72,
803
- pc: 6,
804
- px: -1
805
- },
806
- pt: {
807
- mm: 25.4 / 72,
808
- cm: 2.54 / 72,
809
- in: 1 / 72,
810
- pt: 1,
811
- pc: 6 / 72,
812
- px: -1
813
- },
814
- pc: {
815
- mm: 25.4 / 6,
816
- cm: 2.54 / 6,
817
- in: 1 / 6,
818
- pt: 72 / 6,
819
- pc: 1,
820
- px: -1
821
- },
822
- px: {
823
- px: 1
824
- }
825
- };
826
- function parseFloatWithUnits(string) {
827
- let theUnit = "px";
828
- if (typeof string === "string" || string instanceof String) {
829
- for (let i = 0, n = units.length; i < n; i++) {
830
- const u = units[i];
831
- if (string.endsWith(u)) {
832
- theUnit = u;
833
- string = string.substring(0, string.length - u.length);
834
- break;
843
+ scale = unitConversion[theUnit][scope.defaultUnit];
844
+ if (scale < 0) {
845
+ scale = unitConversion[theUnit]["in"] * scope.defaultDPI;
835
846
  }
836
847
  }
848
+ return scale * parseFloat(string);
837
849
  }
838
- let scale = void 0;
839
- if (theUnit === "px" && scope.defaultUnit !== "px") {
840
- scale = unitConversion["in"][scope.defaultUnit] / scope.defaultDPI;
841
- } else {
842
- scale = unitConversion[theUnit][scope.defaultUnit];
843
- if (scale < 0) {
844
- scale = unitConversion[theUnit]["in"] * scope.defaultDPI;
850
+ function getNodeTransform(node) {
851
+ if (!(node.hasAttribute("transform") || node.nodeName === "use" && (node.hasAttribute("x") || node.hasAttribute("y")))) {
852
+ return null;
845
853
  }
846
- }
847
- return scale * parseFloat(string);
848
- }
849
- function getNodeTransform(node) {
850
- if (!(node.hasAttribute("transform") || node.nodeName === "use" && (node.hasAttribute("x") || node.hasAttribute("y")))) {
851
- return null;
852
- }
853
- const transform = parseNodeTransform(node);
854
- if (transformStack.length > 0) {
855
- transform.premultiply(transformStack[transformStack.length - 1]);
856
- }
857
- currentTransform.copy(transform);
858
- transformStack.push(transform);
859
- return transform;
860
- }
861
- function parseNodeTransform(node) {
862
- const transform = new THREE.Matrix3();
863
- const currentTransform2 = tempTransform0;
864
- if (node.nodeName === "use" && (node.hasAttribute("x") || node.hasAttribute("y"))) {
865
- const tx = parseFloatWithUnits(node.getAttribute("x"));
866
- const ty = parseFloatWithUnits(node.getAttribute("y"));
867
- transform.translate(tx, ty);
868
- }
869
- if (node.hasAttribute("transform")) {
870
- const transformsTexts = node.getAttribute("transform").split(")");
871
- for (let tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex--) {
872
- const transformText = transformsTexts[tIndex].trim();
873
- if (transformText === "")
874
- continue;
875
- const openParPos = transformText.indexOf("(");
876
- const closeParPos = transformText.length;
877
- if (openParPos > 0 && openParPos < closeParPos) {
878
- const transformType = transformText.slice(0, openParPos);
879
- const array = parseFloats(transformText.slice(openParPos + 1));
880
- currentTransform2.identity();
881
- switch (transformType) {
882
- case "translate":
883
- if (array.length >= 1) {
884
- const tx = array[0];
885
- let ty = 0;
886
- if (array.length >= 2) {
887
- ty = array[1];
854
+ const transform = parseNodeTransform(node);
855
+ if (transformStack.length > 0) {
856
+ transform.premultiply(transformStack[transformStack.length - 1]);
857
+ }
858
+ currentTransform.copy(transform);
859
+ transformStack.push(transform);
860
+ return transform;
861
+ }
862
+ function parseNodeTransform(node) {
863
+ const transform = new THREE.Matrix3();
864
+ const currentTransform2 = tempTransform0;
865
+ if (node.nodeName === "use" && (node.hasAttribute("x") || node.hasAttribute("y"))) {
866
+ const tx = parseFloatWithUnits(node.getAttribute("x"));
867
+ const ty = parseFloatWithUnits(node.getAttribute("y"));
868
+ transform.translate(tx, ty);
869
+ }
870
+ if (node.hasAttribute("transform")) {
871
+ const transformsTexts = node.getAttribute("transform").split(")");
872
+ for (let tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex--) {
873
+ const transformText = transformsTexts[tIndex].trim();
874
+ if (transformText === "")
875
+ continue;
876
+ const openParPos = transformText.indexOf("(");
877
+ const closeParPos = transformText.length;
878
+ if (openParPos > 0 && openParPos < closeParPos) {
879
+ const transformType = transformText.slice(0, openParPos);
880
+ const array = parseFloats(transformText.slice(openParPos + 1));
881
+ currentTransform2.identity();
882
+ switch (transformType) {
883
+ case "translate":
884
+ if (array.length >= 1) {
885
+ const tx = array[0];
886
+ let ty = 0;
887
+ if (array.length >= 2) {
888
+ ty = array[1];
889
+ }
890
+ currentTransform2.translate(tx, ty);
888
891
  }
889
- currentTransform2.translate(tx, ty);
890
- }
891
- break;
892
- case "rotate":
893
- if (array.length >= 1) {
894
- let angle = 0;
895
- let cx = 0;
896
- let cy = 0;
897
- angle = array[0] * Math.PI / 180;
898
- if (array.length >= 3) {
899
- cx = array[1];
900
- cy = array[2];
892
+ break;
893
+ case "rotate":
894
+ if (array.length >= 1) {
895
+ let angle = 0;
896
+ let cx = 0;
897
+ let cy = 0;
898
+ angle = array[0] * Math.PI / 180;
899
+ if (array.length >= 3) {
900
+ cx = array[1];
901
+ cy = array[2];
902
+ }
903
+ tempTransform1.makeTranslation(-cx, -cy);
904
+ tempTransform2.makeRotation(angle);
905
+ tempTransform3.multiplyMatrices(tempTransform2, tempTransform1);
906
+ tempTransform1.makeTranslation(cx, cy);
907
+ currentTransform2.multiplyMatrices(tempTransform1, tempTransform3);
901
908
  }
902
- tempTransform1.makeTranslation(-cx, -cy);
903
- tempTransform2.makeRotation(angle);
904
- tempTransform3.multiplyMatrices(tempTransform2, tempTransform1);
905
- tempTransform1.makeTranslation(cx, cy);
906
- currentTransform2.multiplyMatrices(tempTransform1, tempTransform3);
907
- }
908
- break;
909
- case "scale":
910
- if (array.length >= 1) {
911
- const scaleX = array[0];
912
- let scaleY = scaleX;
913
- if (array.length >= 2) {
914
- scaleY = array[1];
909
+ break;
910
+ case "scale":
911
+ if (array.length >= 1) {
912
+ const scaleX = array[0];
913
+ let scaleY = scaleX;
914
+ if (array.length >= 2) {
915
+ scaleY = array[1];
916
+ }
917
+ currentTransform2.scale(scaleX, scaleY);
915
918
  }
916
- currentTransform2.scale(scaleX, scaleY);
917
- }
918
- break;
919
- case "skewX":
920
- if (array.length === 1) {
921
- currentTransform2.set(1, Math.tan(array[0] * Math.PI / 180), 0, 0, 1, 0, 0, 0, 1);
922
- }
923
- break;
924
- case "skewY":
925
- if (array.length === 1) {
926
- currentTransform2.set(1, 0, 0, Math.tan(array[0] * Math.PI / 180), 1, 0, 0, 0, 1);
927
- }
928
- break;
929
- case "matrix":
930
- if (array.length === 6) {
931
- currentTransform2.set(array[0], array[2], array[4], array[1], array[3], array[5], 0, 0, 1);
932
- }
933
- break;
919
+ break;
920
+ case "skewX":
921
+ if (array.length === 1) {
922
+ currentTransform2.set(1, Math.tan(array[0] * Math.PI / 180), 0, 0, 1, 0, 0, 0, 1);
923
+ }
924
+ break;
925
+ case "skewY":
926
+ if (array.length === 1) {
927
+ currentTransform2.set(1, 0, 0, Math.tan(array[0] * Math.PI / 180), 1, 0, 0, 0, 1);
928
+ }
929
+ break;
930
+ case "matrix":
931
+ if (array.length === 6) {
932
+ currentTransform2.set(array[0], array[2], array[4], array[1], array[3], array[5], 0, 0, 1);
933
+ }
934
+ break;
935
+ }
934
936
  }
937
+ transform.premultiply(currentTransform2);
935
938
  }
936
- transform.premultiply(currentTransform2);
937
939
  }
940
+ return transform;
938
941
  }
939
- return transform;
940
- }
941
- function transformPath(path, m) {
942
- function transfVec2(v2) {
943
- tempV3.set(v2.x, v2.y, 1).applyMatrix3(m);
944
- v2.set(tempV3.x, tempV3.y);
945
- }
946
- function transfEllipseGeneric(curve) {
947
- const a = curve.xRadius;
948
- const b = curve.yRadius;
949
- const cosTheta = Math.cos(curve.aRotation);
950
- const sinTheta = Math.sin(curve.aRotation);
951
- const v1 = new THREE.Vector3(a * cosTheta, a * sinTheta, 0);
952
- const v2 = new THREE.Vector3(-b * sinTheta, b * cosTheta, 0);
953
- const f1 = v1.applyMatrix3(m);
954
- const f2 = v2.applyMatrix3(m);
955
- const mF = tempTransform0.set(f1.x, f2.x, 0, f1.y, f2.y, 0, 0, 0, 1);
956
- const mFInv = tempTransform1.copy(mF).invert();
957
- const mFInvT = tempTransform2.copy(mFInv).transpose();
958
- const mQ = mFInvT.multiply(mFInv);
959
- const mQe = mQ.elements;
960
- const ed = eigenDecomposition(mQe[0], mQe[1], mQe[4]);
961
- const rt1sqrt = Math.sqrt(ed.rt1);
962
- const rt2sqrt = Math.sqrt(ed.rt2);
963
- curve.xRadius = 1 / rt1sqrt;
964
- curve.yRadius = 1 / rt2sqrt;
965
- curve.aRotation = Math.atan2(ed.sn, ed.cs);
966
- const isFullEllipse = (curve.aEndAngle - curve.aStartAngle) % (2 * Math.PI) < Number.EPSILON;
967
- if (!isFullEllipse) {
968
- const mDsqrt = tempTransform1.set(rt1sqrt, 0, 0, 0, rt2sqrt, 0, 0, 0, 1);
969
- const mRT = tempTransform2.set(ed.cs, ed.sn, 0, -ed.sn, ed.cs, 0, 0, 0, 1);
970
- const mDRF = mDsqrt.multiply(mRT).multiply(mF);
971
- const transformAngle = (phi) => {
972
- const { x: cosR, y: sinR } = new THREE.Vector3(Math.cos(phi), Math.sin(phi), 0).applyMatrix3(mDRF);
973
- return Math.atan2(sinR, cosR);
974
- };
975
- curve.aStartAngle = transformAngle(curve.aStartAngle);
976
- curve.aEndAngle = transformAngle(curve.aEndAngle);
942
+ function transformPath(path, m) {
943
+ function transfVec2(v2) {
944
+ tempV3.set(v2.x, v2.y, 1).applyMatrix3(m);
945
+ v2.set(tempV3.x, tempV3.y);
946
+ }
947
+ function transfEllipseGeneric(curve) {
948
+ const a = curve.xRadius;
949
+ const b = curve.yRadius;
950
+ const cosTheta = Math.cos(curve.aRotation);
951
+ const sinTheta = Math.sin(curve.aRotation);
952
+ const v1 = new THREE.Vector3(a * cosTheta, a * sinTheta, 0);
953
+ const v2 = new THREE.Vector3(-b * sinTheta, b * cosTheta, 0);
954
+ const f1 = v1.applyMatrix3(m);
955
+ const f2 = v2.applyMatrix3(m);
956
+ const mF = tempTransform0.set(f1.x, f2.x, 0, f1.y, f2.y, 0, 0, 0, 1);
957
+ const mFInv = tempTransform1.copy(mF).invert();
958
+ const mFInvT = tempTransform2.copy(mFInv).transpose();
959
+ const mQ = mFInvT.multiply(mFInv);
960
+ const mQe = mQ.elements;
961
+ const ed = eigenDecomposition(mQe[0], mQe[1], mQe[4]);
962
+ const rt1sqrt = Math.sqrt(ed.rt1);
963
+ const rt2sqrt = Math.sqrt(ed.rt2);
964
+ curve.xRadius = 1 / rt1sqrt;
965
+ curve.yRadius = 1 / rt2sqrt;
966
+ curve.aRotation = Math.atan2(ed.sn, ed.cs);
967
+ const isFullEllipse = (curve.aEndAngle - curve.aStartAngle) % (2 * Math.PI) < Number.EPSILON;
968
+ if (!isFullEllipse) {
969
+ const mDsqrt = tempTransform1.set(rt1sqrt, 0, 0, 0, rt2sqrt, 0, 0, 0, 1);
970
+ const mRT = tempTransform2.set(ed.cs, ed.sn, 0, -ed.sn, ed.cs, 0, 0, 0, 1);
971
+ const mDRF = mDsqrt.multiply(mRT).multiply(mF);
972
+ const transformAngle = (phi) => {
973
+ const { x: cosR, y: sinR } = new THREE.Vector3(Math.cos(phi), Math.sin(phi), 0).applyMatrix3(mDRF);
974
+ return Math.atan2(sinR, cosR);
975
+ };
976
+ curve.aStartAngle = transformAngle(curve.aStartAngle);
977
+ curve.aEndAngle = transformAngle(curve.aEndAngle);
978
+ if (isTransformFlipped(m)) {
979
+ curve.aClockwise = !curve.aClockwise;
980
+ }
981
+ }
982
+ }
983
+ function transfEllipseNoSkew(curve) {
984
+ const sx = getTransformScaleX(m);
985
+ const sy = getTransformScaleY(m);
986
+ curve.xRadius *= sx;
987
+ curve.yRadius *= sy;
988
+ const theta = sx > Number.EPSILON ? Math.atan2(m.elements[1], m.elements[0]) : Math.atan2(-m.elements[3], m.elements[4]);
989
+ curve.aRotation += theta;
977
990
  if (isTransformFlipped(m)) {
991
+ curve.aStartAngle *= -1;
992
+ curve.aEndAngle *= -1;
978
993
  curve.aClockwise = !curve.aClockwise;
979
994
  }
980
995
  }
981
- }
982
- function transfEllipseNoSkew(curve) {
983
- const sx = getTransformScaleX(m);
984
- const sy = getTransformScaleY(m);
985
- curve.xRadius *= sx;
986
- curve.yRadius *= sy;
987
- const theta = sx > Number.EPSILON ? Math.atan2(m.elements[1], m.elements[0]) : Math.atan2(-m.elements[3], m.elements[4]);
988
- curve.aRotation += theta;
989
- if (isTransformFlipped(m)) {
990
- curve.aStartAngle *= -1;
991
- curve.aEndAngle *= -1;
992
- curve.aClockwise = !curve.aClockwise;
993
- }
994
- }
995
- const subPaths = path.subPaths;
996
- for (let i = 0, n = subPaths.length; i < n; i++) {
997
- const subPath = subPaths[i];
998
- const curves = subPath.curves;
999
- for (let j = 0; j < curves.length; j++) {
1000
- const curve = curves[j];
1001
- if (curve.isLineCurve) {
1002
- transfVec2(curve.v1);
1003
- transfVec2(curve.v2);
1004
- } else if (curve.isCubicBezierCurve) {
1005
- transfVec2(curve.v0);
1006
- transfVec2(curve.v1);
1007
- transfVec2(curve.v2);
1008
- transfVec2(curve.v3);
1009
- } else if (curve.isQuadraticBezierCurve) {
1010
- transfVec2(curve.v0);
1011
- transfVec2(curve.v1);
1012
- transfVec2(curve.v2);
1013
- } else if (curve.isEllipseCurve) {
1014
- tempV2.set(curve.aX, curve.aY);
1015
- transfVec2(tempV2);
1016
- curve.aX = tempV2.x;
1017
- curve.aY = tempV2.y;
1018
- if (isTransformSkewed(m)) {
1019
- transfEllipseGeneric(curve);
1020
- } else {
1021
- transfEllipseNoSkew(curve);
996
+ const subPaths = path.subPaths;
997
+ for (let i = 0, n = subPaths.length; i < n; i++) {
998
+ const subPath = subPaths[i];
999
+ const curves = subPath.curves;
1000
+ for (let j = 0; j < curves.length; j++) {
1001
+ const curve = curves[j];
1002
+ if (curve.isLineCurve) {
1003
+ transfVec2(curve.v1);
1004
+ transfVec2(curve.v2);
1005
+ } else if (curve.isCubicBezierCurve) {
1006
+ transfVec2(curve.v0);
1007
+ transfVec2(curve.v1);
1008
+ transfVec2(curve.v2);
1009
+ transfVec2(curve.v3);
1010
+ } else if (curve.isQuadraticBezierCurve) {
1011
+ transfVec2(curve.v0);
1012
+ transfVec2(curve.v1);
1013
+ transfVec2(curve.v2);
1014
+ } else if (curve.isEllipseCurve) {
1015
+ tempV2.set(curve.aX, curve.aY);
1016
+ transfVec2(tempV2);
1017
+ curve.aX = tempV2.x;
1018
+ curve.aY = tempV2.y;
1019
+ if (isTransformSkewed(m)) {
1020
+ transfEllipseGeneric(curve);
1021
+ } else {
1022
+ transfEllipseNoSkew(curve);
1023
+ }
1022
1024
  }
1023
1025
  }
1024
1026
  }
1025
1027
  }
1026
- }
1027
- function isTransformFlipped(m) {
1028
- const te = m.elements;
1029
- return te[0] * te[4] - te[1] * te[3] < 0;
1030
- }
1031
- function isTransformSkewed(m) {
1032
- const te = m.elements;
1033
- const basisDot = te[0] * te[3] + te[1] * te[4];
1034
- if (basisDot === 0)
1035
- return false;
1036
- const sx = getTransformScaleX(m);
1037
- const sy = getTransformScaleY(m);
1038
- return Math.abs(basisDot / (sx * sy)) > Number.EPSILON;
1039
- }
1040
- function getTransformScaleX(m) {
1041
- const te = m.elements;
1042
- return Math.sqrt(te[0] * te[0] + te[1] * te[1]);
1043
- }
1044
- function getTransformScaleY(m) {
1045
- const te = m.elements;
1046
- return Math.sqrt(te[3] * te[3] + te[4] * te[4]);
1047
- }
1048
- function eigenDecomposition(A, B, C) {
1049
- let rt1, rt2, cs, sn, t;
1050
- const sm = A + C;
1051
- const df = A - C;
1052
- const rt = Math.sqrt(df * df + 4 * B * B);
1053
- if (sm > 0) {
1054
- rt1 = 0.5 * (sm + rt);
1055
- t = 1 / rt1;
1056
- rt2 = A * t * C - B * t * B;
1057
- } else if (sm < 0) {
1058
- rt2 = 0.5 * (sm - rt);
1059
- } else {
1060
- rt1 = 0.5 * rt;
1061
- rt2 = -0.5 * rt;
1062
- }
1063
- if (df > 0) {
1064
- cs = df + rt;
1065
- } else {
1066
- cs = df - rt;
1067
- }
1068
- if (Math.abs(cs) > 2 * Math.abs(B)) {
1069
- t = -2 * B / cs;
1070
- sn = 1 / Math.sqrt(1 + t * t);
1071
- cs = t * sn;
1072
- } else if (Math.abs(B) === 0) {
1073
- cs = 1;
1074
- sn = 0;
1075
- } else {
1076
- t = -0.5 * cs / B;
1077
- cs = 1 / Math.sqrt(1 + t * t);
1078
- sn = t * cs;
1079
- }
1080
- if (df > 0) {
1081
- t = cs;
1082
- cs = -sn;
1083
- sn = t;
1028
+ function isTransformFlipped(m) {
1029
+ const te = m.elements;
1030
+ return te[0] * te[4] - te[1] * te[3] < 0;
1084
1031
  }
1085
- return { rt1, rt2, cs, sn };
1032
+ function isTransformSkewed(m) {
1033
+ const te = m.elements;
1034
+ const basisDot = te[0] * te[3] + te[1] * te[4];
1035
+ if (basisDot === 0)
1036
+ return false;
1037
+ const sx = getTransformScaleX(m);
1038
+ const sy = getTransformScaleY(m);
1039
+ return Math.abs(basisDot / (sx * sy)) > Number.EPSILON;
1040
+ }
1041
+ function getTransformScaleX(m) {
1042
+ const te = m.elements;
1043
+ return Math.sqrt(te[0] * te[0] + te[1] * te[1]);
1044
+ }
1045
+ function getTransformScaleY(m) {
1046
+ const te = m.elements;
1047
+ return Math.sqrt(te[3] * te[3] + te[4] * te[4]);
1048
+ }
1049
+ function eigenDecomposition(A, B, C) {
1050
+ let rt1, rt2, cs, sn, t;
1051
+ const sm = A + C;
1052
+ const df = A - C;
1053
+ const rt = Math.sqrt(df * df + 4 * B * B);
1054
+ if (sm > 0) {
1055
+ rt1 = 0.5 * (sm + rt);
1056
+ t = 1 / rt1;
1057
+ rt2 = A * t * C - B * t * B;
1058
+ } else if (sm < 0) {
1059
+ rt2 = 0.5 * (sm - rt);
1060
+ } else {
1061
+ rt1 = 0.5 * rt;
1062
+ rt2 = -0.5 * rt;
1063
+ }
1064
+ if (df > 0) {
1065
+ cs = df + rt;
1066
+ } else {
1067
+ cs = df - rt;
1068
+ }
1069
+ if (Math.abs(cs) > 2 * Math.abs(B)) {
1070
+ t = -2 * B / cs;
1071
+ sn = 1 / Math.sqrt(1 + t * t);
1072
+ cs = t * sn;
1073
+ } else if (Math.abs(B) === 0) {
1074
+ cs = 1;
1075
+ sn = 0;
1076
+ } else {
1077
+ t = -0.5 * cs / B;
1078
+ cs = 1 / Math.sqrt(1 + t * t);
1079
+ sn = t * cs;
1080
+ }
1081
+ if (df > 0) {
1082
+ t = cs;
1083
+ cs = -sn;
1084
+ sn = t;
1085
+ }
1086
+ return { rt1, rt2, cs, sn };
1087
+ }
1088
+ const paths = [];
1089
+ const stylesheets = {};
1090
+ const transformStack = [];
1091
+ const tempTransform0 = new THREE.Matrix3();
1092
+ const tempTransform1 = new THREE.Matrix3();
1093
+ const tempTransform2 = new THREE.Matrix3();
1094
+ const tempTransform3 = new THREE.Matrix3();
1095
+ const tempV2 = new THREE.Vector2();
1096
+ const tempV3 = new THREE.Vector3();
1097
+ const currentTransform = new THREE.Matrix3();
1098
+ const xml = new DOMParser().parseFromString(text, "image/svg+xml");
1099
+ parseNode(xml.documentElement, {
1100
+ fill: "#000",
1101
+ fillOpacity: 1,
1102
+ strokeOpacity: 1,
1103
+ strokeWidth: 1,
1104
+ strokeLineJoin: "miter",
1105
+ strokeLineCap: "butt",
1106
+ strokeMiterLimit: 4
1107
+ });
1108
+ const data = { paths, xml: xml.documentElement };
1109
+ return data;
1086
1110
  }
1087
- const paths = [];
1088
- const stylesheets = {};
1089
- const transformStack = [];
1090
- const tempTransform0 = new THREE.Matrix3();
1091
- const tempTransform1 = new THREE.Matrix3();
1092
- const tempTransform2 = new THREE.Matrix3();
1093
- const tempTransform3 = new THREE.Matrix3();
1094
- const tempV2 = new THREE.Vector2();
1095
- const tempV3 = new THREE.Vector3();
1096
- const currentTransform = new THREE.Matrix3();
1097
- const xml = new DOMParser().parseFromString(text, "image/svg+xml");
1098
- parseNode(xml.documentElement, {
1099
- fill: "#000",
1100
- fillOpacity: 1,
1101
- strokeOpacity: 1,
1102
- strokeWidth: 1,
1103
- strokeLineJoin: "miter",
1104
- strokeLineCap: "butt",
1105
- strokeMiterLimit: 4
1106
- });
1107
- const data = { paths, xml: xml.documentElement };
1108
- return data;
1109
- }
1110
- static createShapes(shapePath) {
1111
- const BIGNUMBER = 999999999;
1112
- const IntersectionLocationType = {
1113
- ORIGIN: 0,
1114
- DESTINATION: 1,
1115
- BETWEEN: 2,
1116
- LEFT: 3,
1117
- RIGHT: 4,
1118
- BEHIND: 5,
1119
- BEYOND: 6
1120
- };
1121
- const classifyResult = {
1122
- loc: IntersectionLocationType.ORIGIN,
1123
- t: 0
1124
- };
1125
- function findEdgeIntersection(a0, a1, b0, b1) {
1126
- const x1 = a0.x;
1127
- const x2 = a1.x;
1128
- const x3 = b0.x;
1129
- const x4 = b1.x;
1130
- const y1 = a0.y;
1131
- const y2 = a1.y;
1132
- const y3 = b0.y;
1133
- const y4 = b1.y;
1134
- const nom1 = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3);
1135
- const nom2 = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3);
1136
- const denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
1137
- const t1 = nom1 / denom;
1138
- const t2 = nom2 / denom;
1139
- if (denom === 0 && nom1 !== 0 || t1 <= 0 || t1 >= 1 || t2 < 0 || t2 > 1) {
1140
- return null;
1141
- } else if (nom1 === 0 && denom === 0) {
1142
- for (let i = 0; i < 2; i++) {
1143
- classifyPoint(i === 0 ? b0 : b1, a0, a1);
1144
- if (classifyResult.loc == IntersectionLocationType.ORIGIN) {
1145
- const point = i === 0 ? b0 : b1;
1146
- return { x: point.x, y: point.y, t: classifyResult.t };
1147
- } else if (classifyResult.loc == IntersectionLocationType.BETWEEN) {
1148
- const x = +(x1 + classifyResult.t * (x2 - x1)).toPrecision(10);
1149
- const y = +(y1 + classifyResult.t * (y2 - y1)).toPrecision(10);
1150
- return { x, y, t: classifyResult.t };
1111
+ static createShapes(shapePath) {
1112
+ const BIGNUMBER = 999999999;
1113
+ const IntersectionLocationType = {
1114
+ ORIGIN: 0,
1115
+ DESTINATION: 1,
1116
+ BETWEEN: 2,
1117
+ LEFT: 3,
1118
+ RIGHT: 4,
1119
+ BEHIND: 5,
1120
+ BEYOND: 6
1121
+ };
1122
+ const classifyResult = {
1123
+ loc: IntersectionLocationType.ORIGIN,
1124
+ t: 0
1125
+ };
1126
+ function findEdgeIntersection(a0, a1, b0, b1) {
1127
+ const x1 = a0.x;
1128
+ const x2 = a1.x;
1129
+ const x3 = b0.x;
1130
+ const x4 = b1.x;
1131
+ const y1 = a0.y;
1132
+ const y2 = a1.y;
1133
+ const y3 = b0.y;
1134
+ const y4 = b1.y;
1135
+ const nom1 = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3);
1136
+ const nom2 = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3);
1137
+ const denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
1138
+ const t1 = nom1 / denom;
1139
+ const t2 = nom2 / denom;
1140
+ if (denom === 0 && nom1 !== 0 || t1 <= 0 || t1 >= 1 || t2 < 0 || t2 > 1) {
1141
+ return null;
1142
+ } else if (nom1 === 0 && denom === 0) {
1143
+ for (let i = 0; i < 2; i++) {
1144
+ classifyPoint(i === 0 ? b0 : b1, a0, a1);
1145
+ if (classifyResult.loc == IntersectionLocationType.ORIGIN) {
1146
+ const point = i === 0 ? b0 : b1;
1147
+ return { x: point.x, y: point.y, t: classifyResult.t };
1148
+ } else if (classifyResult.loc == IntersectionLocationType.BETWEEN) {
1149
+ const x = +(x1 + classifyResult.t * (x2 - x1)).toPrecision(10);
1150
+ const y = +(y1 + classifyResult.t * (y2 - y1)).toPrecision(10);
1151
+ return { x, y, t: classifyResult.t };
1152
+ }
1151
1153
  }
1152
- }
1153
- return null;
1154
- } else {
1155
- for (let i = 0; i < 2; i++) {
1156
- classifyPoint(i === 0 ? b0 : b1, a0, a1);
1157
- if (classifyResult.loc == IntersectionLocationType.ORIGIN) {
1158
- const point = i === 0 ? b0 : b1;
1159
- return { x: point.x, y: point.y, t: classifyResult.t };
1154
+ return null;
1155
+ } else {
1156
+ for (let i = 0; i < 2; i++) {
1157
+ classifyPoint(i === 0 ? b0 : b1, a0, a1);
1158
+ if (classifyResult.loc == IntersectionLocationType.ORIGIN) {
1159
+ const point = i === 0 ? b0 : b1;
1160
+ return { x: point.x, y: point.y, t: classifyResult.t };
1161
+ }
1160
1162
  }
1163
+ const x = +(x1 + t1 * (x2 - x1)).toPrecision(10);
1164
+ const y = +(y1 + t1 * (y2 - y1)).toPrecision(10);
1165
+ return { x, y, t: t1 };
1161
1166
  }
1162
- const x = +(x1 + t1 * (x2 - x1)).toPrecision(10);
1163
- const y = +(y1 + t1 * (y2 - y1)).toPrecision(10);
1164
- return { x, y, t: t1 };
1165
- }
1166
- }
1167
- function classifyPoint(p, edgeStart, edgeEnd) {
1168
- const ax = edgeEnd.x - edgeStart.x;
1169
- const ay = edgeEnd.y - edgeStart.y;
1170
- const bx = p.x - edgeStart.x;
1171
- const by = p.y - edgeStart.y;
1172
- const sa = ax * by - bx * ay;
1173
- if (p.x === edgeStart.x && p.y === edgeStart.y) {
1174
- classifyResult.loc = IntersectionLocationType.ORIGIN;
1175
- classifyResult.t = 0;
1176
- return;
1177
- }
1178
- if (p.x === edgeEnd.x && p.y === edgeEnd.y) {
1179
- classifyResult.loc = IntersectionLocationType.DESTINATION;
1180
- classifyResult.t = 1;
1181
- return;
1182
- }
1183
- if (sa < -Number.EPSILON) {
1184
- classifyResult.loc = IntersectionLocationType.LEFT;
1185
- return;
1186
- }
1187
- if (sa > Number.EPSILON) {
1188
- classifyResult.loc = IntersectionLocationType.RIGHT;
1189
- return;
1190
- }
1191
- if (ax * bx < 0 || ay * by < 0) {
1192
- classifyResult.loc = IntersectionLocationType.BEHIND;
1193
- return;
1194
- }
1195
- if (Math.sqrt(ax * ax + ay * ay) < Math.sqrt(bx * bx + by * by)) {
1196
- classifyResult.loc = IntersectionLocationType.BEYOND;
1197
- return;
1198
- }
1199
- let t;
1200
- if (ax !== 0) {
1201
- t = bx / ax;
1202
- } else {
1203
- t = by / ay;
1204
1167
  }
1205
- classifyResult.loc = IntersectionLocationType.BETWEEN;
1206
- classifyResult.t = t;
1207
- }
1208
- function getIntersections(path1, path2) {
1209
- const intersectionsRaw = [];
1210
- const intersections = [];
1211
- for (let index = 1; index < path1.length; index++) {
1212
- const path1EdgeStart = path1[index - 1];
1213
- const path1EdgeEnd = path1[index];
1214
- for (let index2 = 1; index2 < path2.length; index2++) {
1215
- const path2EdgeStart = path2[index2 - 1];
1216
- const path2EdgeEnd = path2[index2];
1217
- const intersection = findEdgeIntersection(path1EdgeStart, path1EdgeEnd, path2EdgeStart, path2EdgeEnd);
1218
- if (intersection !== null && intersectionsRaw.find(
1219
- (i) => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON
1220
- ) === void 0) {
1221
- intersectionsRaw.push(intersection);
1222
- intersections.push(new THREE.Vector2(intersection.x, intersection.y));
1168
+ function classifyPoint(p, edgeStart, edgeEnd) {
1169
+ const ax = edgeEnd.x - edgeStart.x;
1170
+ const ay = edgeEnd.y - edgeStart.y;
1171
+ const bx = p.x - edgeStart.x;
1172
+ const by = p.y - edgeStart.y;
1173
+ const sa = ax * by - bx * ay;
1174
+ if (p.x === edgeStart.x && p.y === edgeStart.y) {
1175
+ classifyResult.loc = IntersectionLocationType.ORIGIN;
1176
+ classifyResult.t = 0;
1177
+ return;
1178
+ }
1179
+ if (p.x === edgeEnd.x && p.y === edgeEnd.y) {
1180
+ classifyResult.loc = IntersectionLocationType.DESTINATION;
1181
+ classifyResult.t = 1;
1182
+ return;
1183
+ }
1184
+ if (sa < -Number.EPSILON) {
1185
+ classifyResult.loc = IntersectionLocationType.LEFT;
1186
+ return;
1187
+ }
1188
+ if (sa > Number.EPSILON) {
1189
+ classifyResult.loc = IntersectionLocationType.RIGHT;
1190
+ return;
1191
+ }
1192
+ if (ax * bx < 0 || ay * by < 0) {
1193
+ classifyResult.loc = IntersectionLocationType.BEHIND;
1194
+ return;
1195
+ }
1196
+ if (Math.sqrt(ax * ax + ay * ay) < Math.sqrt(bx * bx + by * by)) {
1197
+ classifyResult.loc = IntersectionLocationType.BEYOND;
1198
+ return;
1199
+ }
1200
+ let t;
1201
+ if (ax !== 0) {
1202
+ t = bx / ax;
1203
+ } else {
1204
+ t = by / ay;
1205
+ }
1206
+ classifyResult.loc = IntersectionLocationType.BETWEEN;
1207
+ classifyResult.t = t;
1208
+ }
1209
+ function getIntersections(path1, path2) {
1210
+ const intersectionsRaw = [];
1211
+ const intersections = [];
1212
+ for (let index = 1; index < path1.length; index++) {
1213
+ const path1EdgeStart = path1[index - 1];
1214
+ const path1EdgeEnd = path1[index];
1215
+ for (let index2 = 1; index2 < path2.length; index2++) {
1216
+ const path2EdgeStart = path2[index2 - 1];
1217
+ const path2EdgeEnd = path2[index2];
1218
+ const intersection = findEdgeIntersection(path1EdgeStart, path1EdgeEnd, path2EdgeStart, path2EdgeEnd);
1219
+ if (intersection !== null && intersectionsRaw.find(
1220
+ (i) => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON
1221
+ ) === void 0) {
1222
+ intersectionsRaw.push(intersection);
1223
+ intersections.push(new THREE.Vector2(intersection.x, intersection.y));
1224
+ }
1223
1225
  }
1224
1226
  }
1227
+ return intersections;
1228
+ }
1229
+ function getScanlineIntersections(scanline, boundingBox, paths) {
1230
+ const center = new THREE.Vector2();
1231
+ boundingBox.getCenter(center);
1232
+ const allIntersections = [];
1233
+ paths.forEach((path) => {
1234
+ if (path.boundingBox.containsPoint(center)) {
1235
+ const intersections = getIntersections(scanline, path.points);
1236
+ intersections.forEach((p) => {
1237
+ allIntersections.push({ identifier: path.identifier, isCW: path.isCW, point: p });
1238
+ });
1239
+ }
1240
+ });
1241
+ allIntersections.sort((i1, i2) => {
1242
+ return i1.point.x - i2.point.x;
1243
+ });
1244
+ return allIntersections;
1225
1245
  }
1226
- return intersections;
1227
- }
1228
- function getScanlineIntersections(scanline, boundingBox, paths) {
1229
- const center = new THREE.Vector2();
1230
- boundingBox.getCenter(center);
1231
- const allIntersections = [];
1232
- paths.forEach((path) => {
1233
- if (path.boundingBox.containsPoint(center)) {
1234
- const intersections = getIntersections(scanline, path.points);
1235
- intersections.forEach((p) => {
1236
- allIntersections.push({ identifier: path.identifier, isCW: path.isCW, point: p });
1237
- });
1246
+ function isHoleTo(simplePath, allPaths, scanlineMinX2, scanlineMaxX2, _fillRule) {
1247
+ if (_fillRule === null || _fillRule === void 0 || _fillRule === "") {
1248
+ _fillRule = "nonzero";
1238
1249
  }
1239
- });
1240
- allIntersections.sort((i1, i2) => {
1241
- return i1.point.x - i2.point.x;
1242
- });
1243
- return allIntersections;
1244
- }
1245
- function isHoleTo(simplePath, allPaths, scanlineMinX2, scanlineMaxX2, _fillRule) {
1246
- if (_fillRule === null || _fillRule === void 0 || _fillRule === "") {
1247
- _fillRule = "nonzero";
1248
- }
1249
- const centerBoundingBox = new THREE.Vector2();
1250
- simplePath.boundingBox.getCenter(centerBoundingBox);
1251
- const scanline = [new THREE.Vector2(scanlineMinX2, centerBoundingBox.y), new THREE.Vector2(scanlineMaxX2, centerBoundingBox.y)];
1252
- const scanlineIntersections = getScanlineIntersections(scanline, simplePath.boundingBox, allPaths);
1253
- scanlineIntersections.sort((i1, i2) => {
1254
- return i1.point.x - i2.point.x;
1255
- });
1256
- const baseIntersections = [];
1257
- const otherIntersections = [];
1258
- scanlineIntersections.forEach((i2) => {
1259
- if (i2.identifier === simplePath.identifier) {
1260
- baseIntersections.push(i2);
1261
- } else {
1262
- otherIntersections.push(i2);
1250
+ const centerBoundingBox = new THREE.Vector2();
1251
+ simplePath.boundingBox.getCenter(centerBoundingBox);
1252
+ const scanline = [
1253
+ new THREE.Vector2(scanlineMinX2, centerBoundingBox.y),
1254
+ new THREE.Vector2(scanlineMaxX2, centerBoundingBox.y)
1255
+ ];
1256
+ const scanlineIntersections = getScanlineIntersections(scanline, simplePath.boundingBox, allPaths);
1257
+ scanlineIntersections.sort((i1, i2) => {
1258
+ return i1.point.x - i2.point.x;
1259
+ });
1260
+ const baseIntersections = [];
1261
+ const otherIntersections = [];
1262
+ scanlineIntersections.forEach((i2) => {
1263
+ if (i2.identifier === simplePath.identifier) {
1264
+ baseIntersections.push(i2);
1265
+ } else {
1266
+ otherIntersections.push(i2);
1267
+ }
1268
+ });
1269
+ const firstXOfPath = baseIntersections[0].point.x;
1270
+ const stack = [];
1271
+ let i = 0;
1272
+ while (i < otherIntersections.length && otherIntersections[i].point.x < firstXOfPath) {
1273
+ if (stack.length > 0 && stack[stack.length - 1] === otherIntersections[i].identifier) {
1274
+ stack.pop();
1275
+ } else {
1276
+ stack.push(otherIntersections[i].identifier);
1277
+ }
1278
+ i++;
1263
1279
  }
1264
- });
1265
- const firstXOfPath = baseIntersections[0].point.x;
1266
- const stack = [];
1267
- let i = 0;
1268
- while (i < otherIntersections.length && otherIntersections[i].point.x < firstXOfPath) {
1269
- if (stack.length > 0 && stack[stack.length - 1] === otherIntersections[i].identifier) {
1270
- stack.pop();
1280
+ stack.push(simplePath.identifier);
1281
+ if (_fillRule === "evenodd") {
1282
+ const isHole = stack.length % 2 === 0 ? true : false;
1283
+ const isHoleFor = stack[stack.length - 2];
1284
+ return { identifier: simplePath.identifier, isHole, for: isHoleFor };
1285
+ } else if (_fillRule === "nonzero") {
1286
+ let isHole = true;
1287
+ let isHoleFor = null;
1288
+ let lastCWValue = null;
1289
+ for (let i2 = 0; i2 < stack.length; i2++) {
1290
+ const identifier = stack[i2];
1291
+ if (isHole) {
1292
+ lastCWValue = allPaths[identifier].isCW;
1293
+ isHole = false;
1294
+ isHoleFor = identifier;
1295
+ } else if (lastCWValue !== allPaths[identifier].isCW) {
1296
+ lastCWValue = allPaths[identifier].isCW;
1297
+ isHole = true;
1298
+ }
1299
+ }
1300
+ return { identifier: simplePath.identifier, isHole, for: isHoleFor };
1271
1301
  } else {
1272
- stack.push(otherIntersections[i].identifier);
1302
+ console.warn('fill-rule: "' + _fillRule + '" is currently not implemented.');
1273
1303
  }
1274
- i++;
1275
1304
  }
1276
- stack.push(simplePath.identifier);
1277
- if (_fillRule === "evenodd") {
1278
- const isHole = stack.length % 2 === 0 ? true : false;
1279
- const isHoleFor = stack[stack.length - 2];
1280
- return { identifier: simplePath.identifier, isHole, for: isHoleFor };
1281
- } else if (_fillRule === "nonzero") {
1282
- let isHole = true;
1283
- let isHoleFor = null;
1284
- let lastCWValue = null;
1285
- for (let i2 = 0; i2 < stack.length; i2++) {
1286
- const identifier = stack[i2];
1287
- if (isHole) {
1288
- lastCWValue = allPaths[identifier].isCW;
1289
- isHole = false;
1290
- isHoleFor = identifier;
1291
- } else if (lastCWValue !== allPaths[identifier].isCW) {
1292
- lastCWValue = allPaths[identifier].isCW;
1293
- isHole = true;
1305
+ let scanlineMinX = BIGNUMBER;
1306
+ let scanlineMaxX = -BIGNUMBER;
1307
+ let simplePaths = shapePath.subPaths.map((p) => {
1308
+ const points = p.getPoints();
1309
+ let maxY = -BIGNUMBER;
1310
+ let minY = BIGNUMBER;
1311
+ let maxX = -BIGNUMBER;
1312
+ let minX = BIGNUMBER;
1313
+ for (let i = 0; i < points.length; i++) {
1314
+ const p2 = points[i];
1315
+ if (p2.y > maxY) {
1316
+ maxY = p2.y;
1317
+ }
1318
+ if (p2.y < minY) {
1319
+ minY = p2.y;
1320
+ }
1321
+ if (p2.x > maxX) {
1322
+ maxX = p2.x;
1323
+ }
1324
+ if (p2.x < minX) {
1325
+ minX = p2.x;
1294
1326
  }
1295
1327
  }
1296
- return { identifier: simplePath.identifier, isHole, for: isHoleFor };
1297
- } else {
1298
- console.warn('fill-rule: "' + _fillRule + '" is currently not implemented.');
1299
- }
1300
- }
1301
- let scanlineMinX = BIGNUMBER;
1302
- let scanlineMaxX = -BIGNUMBER;
1303
- let simplePaths = shapePath.subPaths.map((p) => {
1304
- const points = p.getPoints();
1305
- let maxY = -BIGNUMBER;
1306
- let minY = BIGNUMBER;
1307
- let maxX = -BIGNUMBER;
1308
- let minX = BIGNUMBER;
1309
- for (let i = 0; i < points.length; i++) {
1310
- const p2 = points[i];
1311
- if (p2.y > maxY) {
1312
- maxY = p2.y;
1313
- }
1314
- if (p2.y < minY) {
1315
- minY = p2.y;
1316
- }
1317
- if (p2.x > maxX) {
1318
- maxX = p2.x;
1319
- }
1320
- if (p2.x < minX) {
1321
- minX = p2.x;
1328
+ if (scanlineMaxX <= maxX) {
1329
+ scanlineMaxX = maxX + 1;
1322
1330
  }
1323
- }
1324
- if (scanlineMaxX <= maxX) {
1325
- scanlineMaxX = maxX + 1;
1326
- }
1327
- if (scanlineMinX >= minX) {
1328
- scanlineMinX = minX - 1;
1329
- }
1331
+ if (scanlineMinX >= minX) {
1332
+ scanlineMinX = minX - 1;
1333
+ }
1334
+ return {
1335
+ curves: p.curves,
1336
+ points,
1337
+ isCW: THREE.ShapeUtils.isClockWise(points),
1338
+ identifier: -1,
1339
+ boundingBox: new THREE.Box2(new THREE.Vector2(minX, minY), new THREE.Vector2(maxX, maxY))
1340
+ };
1341
+ });
1342
+ simplePaths = simplePaths.filter((sp) => sp.points.length > 1);
1343
+ for (let identifier = 0; identifier < simplePaths.length; identifier++) {
1344
+ simplePaths[identifier].identifier = identifier;
1345
+ }
1346
+ const isAHole = simplePaths.map(
1347
+ (p) => isHoleTo(
1348
+ p,
1349
+ simplePaths,
1350
+ scanlineMinX,
1351
+ scanlineMaxX,
1352
+ shapePath.userData ? shapePath.userData.style.fillRule : void 0
1353
+ )
1354
+ );
1355
+ const shapesToReturn = [];
1356
+ simplePaths.forEach((p) => {
1357
+ const amIAHole = isAHole[p.identifier];
1358
+ if (!amIAHole.isHole) {
1359
+ const shape = new THREE.Shape();
1360
+ shape.curves = p.curves;
1361
+ const holes = isAHole.filter((h) => h.isHole && h.for === p.identifier);
1362
+ holes.forEach((h) => {
1363
+ const hole = simplePaths[h.identifier];
1364
+ const path = new THREE.Path();
1365
+ path.curves = hole.curves;
1366
+ shape.holes.push(path);
1367
+ });
1368
+ shapesToReturn.push(shape);
1369
+ }
1370
+ });
1371
+ return shapesToReturn;
1372
+ }
1373
+ static getStrokeStyle(width, color, lineJoin, lineCap, miterLimit) {
1374
+ width = width !== void 0 ? width : 1;
1375
+ color = color !== void 0 ? color : "#000";
1376
+ lineJoin = lineJoin !== void 0 ? lineJoin : "miter";
1377
+ lineCap = lineCap !== void 0 ? lineCap : "butt";
1378
+ miterLimit = miterLimit !== void 0 ? miterLimit : 4;
1330
1379
  return {
1331
- curves: p.curves,
1332
- points,
1333
- isCW: THREE.ShapeUtils.isClockWise(points),
1334
- identifier: -1,
1335
- boundingBox: new THREE.Box2(new THREE.Vector2(minX, minY), new THREE.Vector2(maxX, maxY))
1380
+ strokeColor: color,
1381
+ strokeWidth: width,
1382
+ strokeLineJoin: lineJoin,
1383
+ strokeLineCap: lineCap,
1384
+ strokeMiterLimit: miterLimit
1336
1385
  };
1337
- });
1338
- simplePaths = simplePaths.filter((sp) => sp.points.length > 1);
1339
- for (let identifier = 0; identifier < simplePaths.length; identifier++) {
1340
- simplePaths[identifier].identifier = identifier;
1341
1386
  }
1342
- const isAHole = simplePaths.map(
1343
- (p) => isHoleTo(
1344
- p,
1345
- simplePaths,
1346
- scanlineMinX,
1347
- scanlineMaxX,
1348
- shapePath.userData ? shapePath.userData.style.fillRule : void 0
1349
- )
1350
- );
1351
- const shapesToReturn = [];
1352
- simplePaths.forEach((p) => {
1353
- const amIAHole = isAHole[p.identifier];
1354
- if (!amIAHole.isHole) {
1355
- const shape = new THREE.Shape();
1356
- shape.curves = p.curves;
1357
- const holes = isAHole.filter((h) => h.isHole && h.for === p.identifier);
1358
- holes.forEach((h) => {
1359
- const hole = simplePaths[h.identifier];
1360
- const path = new THREE.Path();
1361
- path.curves = hole.curves;
1362
- shape.holes.push(path);
1363
- });
1364
- shapesToReturn.push(shape);
1387
+ static pointsToStroke(points, style, arcDivisions, minDistance) {
1388
+ const vertices = [];
1389
+ const normals = [];
1390
+ const uvs = [];
1391
+ if (SVGLoader2.pointsToStrokeWithBuffers(points, style, arcDivisions, minDistance, vertices, normals, uvs) === 0) {
1392
+ return null;
1365
1393
  }
1366
- });
1367
- return shapesToReturn;
1368
- }
1369
- static getStrokeStyle(width, color, lineJoin, lineCap, miterLimit) {
1370
- width = width !== void 0 ? width : 1;
1371
- color = color !== void 0 ? color : "#000";
1372
- lineJoin = lineJoin !== void 0 ? lineJoin : "miter";
1373
- lineCap = lineCap !== void 0 ? lineCap : "butt";
1374
- miterLimit = miterLimit !== void 0 ? miterLimit : 4;
1375
- return {
1376
- strokeColor: color,
1377
- strokeWidth: width,
1378
- strokeLineJoin: lineJoin,
1379
- strokeLineCap: lineCap,
1380
- strokeMiterLimit: miterLimit
1381
- };
1382
- }
1383
- static pointsToStroke(points, style, arcDivisions, minDistance) {
1384
- const vertices = [];
1385
- const normals = [];
1386
- const uvs = [];
1387
- if (SVGLoader.pointsToStrokeWithBuffers(points, style, arcDivisions, minDistance, vertices, normals, uvs) === 0) {
1388
- return null;
1394
+ const geometry = new THREE.BufferGeometry();
1395
+ geometry.setAttribute("position", new THREE.Float32BufferAttribute(vertices, 3));
1396
+ geometry.setAttribute("normal", new THREE.Float32BufferAttribute(normals, 3));
1397
+ geometry.setAttribute("uv", new THREE.Float32BufferAttribute(uvs, 2));
1398
+ return geometry;
1389
1399
  }
1390
- const geometry = new THREE.BufferGeometry();
1391
- geometry.setAttribute("position", new THREE.Float32BufferAttribute(vertices, 3));
1392
- geometry.setAttribute("normal", new THREE.Float32BufferAttribute(normals, 3));
1393
- geometry.setAttribute("uv", new THREE.Float32BufferAttribute(uvs, 2));
1394
- return geometry;
1395
- }
1396
- static pointsToStrokeWithBuffers(points, style, arcDivisions, minDistance, vertices, normals, uvs, vertexOffset) {
1397
- const tempV2_1 = new THREE.Vector2();
1398
- const tempV2_2 = new THREE.Vector2();
1399
- const tempV2_3 = new THREE.Vector2();
1400
- const tempV2_4 = new THREE.Vector2();
1401
- const tempV2_5 = new THREE.Vector2();
1402
- const tempV2_6 = new THREE.Vector2();
1403
- const tempV2_7 = new THREE.Vector2();
1404
- const lastPointL = new THREE.Vector2();
1405
- const lastPointR = new THREE.Vector2();
1406
- const point0L = new THREE.Vector2();
1407
- const point0R = new THREE.Vector2();
1408
- const currentPointL = new THREE.Vector2();
1409
- const currentPointR = new THREE.Vector2();
1410
- const nextPointL = new THREE.Vector2();
1411
- const nextPointR = new THREE.Vector2();
1412
- const innerPoint = new THREE.Vector2();
1413
- const outerPoint = new THREE.Vector2();
1414
- arcDivisions = arcDivisions !== void 0 ? arcDivisions : 12;
1415
- minDistance = minDistance !== void 0 ? minDistance : 1e-3;
1416
- vertexOffset = vertexOffset !== void 0 ? vertexOffset : 0;
1417
- points = removeDuplicatedPoints(points);
1418
- const numPoints = points.length;
1419
- if (numPoints < 2)
1420
- return 0;
1421
- const isClosed = points[0].equals(points[numPoints - 1]);
1422
- let currentPoint;
1423
- let previousPoint = points[0];
1424
- let nextPoint;
1425
- const strokeWidth2 = style.strokeWidth / 2;
1426
- const deltaU = 1 / (numPoints - 1);
1427
- let u0 = 0, u1;
1428
- let innerSideModified;
1429
- let joinIsOnLeftSide;
1430
- let isMiter;
1431
- let initialJoinIsOnLeftSide = false;
1432
- let numVertices = 0;
1433
- let currentCoordinate = vertexOffset * 3;
1434
- let currentCoordinateUV = vertexOffset * 2;
1435
- getNormal(points[0], points[1], tempV2_1).multiplyScalar(strokeWidth2);
1436
- lastPointL.copy(points[0]).sub(tempV2_1);
1437
- lastPointR.copy(points[0]).add(tempV2_1);
1438
- point0L.copy(lastPointL);
1439
- point0R.copy(lastPointR);
1440
- for (let iPoint = 1; iPoint < numPoints; iPoint++) {
1441
- currentPoint = points[iPoint];
1442
- if (iPoint === numPoints - 1) {
1443
- if (isClosed) {
1444
- nextPoint = points[1];
1445
- } else
1446
- nextPoint = void 0;
1447
- } else {
1448
- nextPoint = points[iPoint + 1];
1449
- }
1450
- const normal1 = tempV2_1;
1451
- getNormal(previousPoint, currentPoint, normal1);
1452
- tempV2_3.copy(normal1).multiplyScalar(strokeWidth2);
1453
- currentPointL.copy(currentPoint).sub(tempV2_3);
1454
- currentPointR.copy(currentPoint).add(tempV2_3);
1455
- u1 = u0 + deltaU;
1456
- innerSideModified = false;
1457
- if (nextPoint !== void 0) {
1458
- getNormal(currentPoint, nextPoint, tempV2_2);
1459
- tempV2_3.copy(tempV2_2).multiplyScalar(strokeWidth2);
1460
- nextPointL.copy(currentPoint).sub(tempV2_3);
1461
- nextPointR.copy(currentPoint).add(tempV2_3);
1462
- joinIsOnLeftSide = true;
1463
- tempV2_3.subVectors(nextPoint, previousPoint);
1464
- if (normal1.dot(tempV2_3) < 0) {
1465
- joinIsOnLeftSide = false;
1466
- }
1467
- if (iPoint === 1)
1468
- initialJoinIsOnLeftSide = joinIsOnLeftSide;
1469
- tempV2_3.subVectors(nextPoint, currentPoint);
1470
- tempV2_3.normalize();
1471
- const dot = Math.abs(normal1.dot(tempV2_3));
1472
- if (dot > Number.EPSILON) {
1473
- const miterSide = strokeWidth2 / dot;
1474
- tempV2_3.multiplyScalar(-miterSide);
1475
- tempV2_4.subVectors(currentPoint, previousPoint);
1476
- tempV2_5.copy(tempV2_4).setLength(miterSide).add(tempV2_3);
1477
- innerPoint.copy(tempV2_5).negate();
1478
- const miterLength2 = tempV2_5.length();
1479
- const segmentLengthPrev = tempV2_4.length();
1480
- tempV2_4.divideScalar(segmentLengthPrev);
1481
- tempV2_6.subVectors(nextPoint, currentPoint);
1482
- const segmentLengthNext = tempV2_6.length();
1483
- tempV2_6.divideScalar(segmentLengthNext);
1484
- if (tempV2_4.dot(innerPoint) < segmentLengthPrev && tempV2_6.dot(innerPoint) < segmentLengthNext) {
1485
- innerSideModified = true;
1400
+ static pointsToStrokeWithBuffers(points, style, arcDivisions, minDistance, vertices, normals, uvs, vertexOffset) {
1401
+ const tempV2_1 = new THREE.Vector2();
1402
+ const tempV2_2 = new THREE.Vector2();
1403
+ const tempV2_3 = new THREE.Vector2();
1404
+ const tempV2_4 = new THREE.Vector2();
1405
+ const tempV2_5 = new THREE.Vector2();
1406
+ const tempV2_6 = new THREE.Vector2();
1407
+ const tempV2_7 = new THREE.Vector2();
1408
+ const lastPointL = new THREE.Vector2();
1409
+ const lastPointR = new THREE.Vector2();
1410
+ const point0L = new THREE.Vector2();
1411
+ const point0R = new THREE.Vector2();
1412
+ const currentPointL = new THREE.Vector2();
1413
+ const currentPointR = new THREE.Vector2();
1414
+ const nextPointL = new THREE.Vector2();
1415
+ const nextPointR = new THREE.Vector2();
1416
+ const innerPoint = new THREE.Vector2();
1417
+ const outerPoint = new THREE.Vector2();
1418
+ arcDivisions = arcDivisions !== void 0 ? arcDivisions : 12;
1419
+ minDistance = minDistance !== void 0 ? minDistance : 1e-3;
1420
+ vertexOffset = vertexOffset !== void 0 ? vertexOffset : 0;
1421
+ points = removeDuplicatedPoints(points);
1422
+ const numPoints = points.length;
1423
+ if (numPoints < 2)
1424
+ return 0;
1425
+ const isClosed = points[0].equals(points[numPoints - 1]);
1426
+ let currentPoint;
1427
+ let previousPoint = points[0];
1428
+ let nextPoint;
1429
+ const strokeWidth2 = style.strokeWidth / 2;
1430
+ const deltaU = 1 / (numPoints - 1);
1431
+ let u0 = 0, u1;
1432
+ let innerSideModified;
1433
+ let joinIsOnLeftSide;
1434
+ let isMiter;
1435
+ let initialJoinIsOnLeftSide = false;
1436
+ let numVertices = 0;
1437
+ let currentCoordinate = vertexOffset * 3;
1438
+ let currentCoordinateUV = vertexOffset * 2;
1439
+ getNormal(points[0], points[1], tempV2_1).multiplyScalar(strokeWidth2);
1440
+ lastPointL.copy(points[0]).sub(tempV2_1);
1441
+ lastPointR.copy(points[0]).add(tempV2_1);
1442
+ point0L.copy(lastPointL);
1443
+ point0R.copy(lastPointR);
1444
+ for (let iPoint = 1; iPoint < numPoints; iPoint++) {
1445
+ currentPoint = points[iPoint];
1446
+ if (iPoint === numPoints - 1) {
1447
+ if (isClosed) {
1448
+ nextPoint = points[1];
1449
+ } else
1450
+ nextPoint = void 0;
1451
+ } else {
1452
+ nextPoint = points[iPoint + 1];
1453
+ }
1454
+ const normal1 = tempV2_1;
1455
+ getNormal(previousPoint, currentPoint, normal1);
1456
+ tempV2_3.copy(normal1).multiplyScalar(strokeWidth2);
1457
+ currentPointL.copy(currentPoint).sub(tempV2_3);
1458
+ currentPointR.copy(currentPoint).add(tempV2_3);
1459
+ u1 = u0 + deltaU;
1460
+ innerSideModified = false;
1461
+ if (nextPoint !== void 0) {
1462
+ getNormal(currentPoint, nextPoint, tempV2_2);
1463
+ tempV2_3.copy(tempV2_2).multiplyScalar(strokeWidth2);
1464
+ nextPointL.copy(currentPoint).sub(tempV2_3);
1465
+ nextPointR.copy(currentPoint).add(tempV2_3);
1466
+ joinIsOnLeftSide = true;
1467
+ tempV2_3.subVectors(nextPoint, previousPoint);
1468
+ if (normal1.dot(tempV2_3) < 0) {
1469
+ joinIsOnLeftSide = false;
1486
1470
  }
1487
- outerPoint.copy(tempV2_5).add(currentPoint);
1488
- innerPoint.add(currentPoint);
1489
- isMiter = false;
1490
- if (innerSideModified) {
1491
- if (joinIsOnLeftSide) {
1492
- nextPointR.copy(innerPoint);
1493
- currentPointR.copy(innerPoint);
1494
- } else {
1495
- nextPointL.copy(innerPoint);
1496
- currentPointL.copy(innerPoint);
1471
+ if (iPoint === 1)
1472
+ initialJoinIsOnLeftSide = joinIsOnLeftSide;
1473
+ tempV2_3.subVectors(nextPoint, currentPoint);
1474
+ tempV2_3.normalize();
1475
+ const dot = Math.abs(normal1.dot(tempV2_3));
1476
+ if (dot > Number.EPSILON) {
1477
+ const miterSide = strokeWidth2 / dot;
1478
+ tempV2_3.multiplyScalar(-miterSide);
1479
+ tempV2_4.subVectors(currentPoint, previousPoint);
1480
+ tempV2_5.copy(tempV2_4).setLength(miterSide).add(tempV2_3);
1481
+ innerPoint.copy(tempV2_5).negate();
1482
+ const miterLength2 = tempV2_5.length();
1483
+ const segmentLengthPrev = tempV2_4.length();
1484
+ tempV2_4.divideScalar(segmentLengthPrev);
1485
+ tempV2_6.subVectors(nextPoint, currentPoint);
1486
+ const segmentLengthNext = tempV2_6.length();
1487
+ tempV2_6.divideScalar(segmentLengthNext);
1488
+ if (tempV2_4.dot(innerPoint) < segmentLengthPrev && tempV2_6.dot(innerPoint) < segmentLengthNext) {
1489
+ innerSideModified = true;
1497
1490
  }
1498
- } else {
1499
- makeSegmentTriangles();
1500
- }
1501
- switch (style.strokeLineJoin) {
1502
- case "bevel":
1503
- makeSegmentWithBevelJoin(joinIsOnLeftSide, innerSideModified, u1);
1504
- break;
1505
- case "round":
1506
- createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide, innerSideModified);
1491
+ outerPoint.copy(tempV2_5).add(currentPoint);
1492
+ innerPoint.add(currentPoint);
1493
+ isMiter = false;
1494
+ if (innerSideModified) {
1507
1495
  if (joinIsOnLeftSide) {
1508
- makeCircularSector(currentPoint, currentPointL, nextPointL, u1, 0);
1496
+ nextPointR.copy(innerPoint);
1497
+ currentPointR.copy(innerPoint);
1509
1498
  } else {
1510
- makeCircularSector(currentPoint, nextPointR, currentPointR, u1, 1);
1499
+ nextPointL.copy(innerPoint);
1500
+ currentPointL.copy(innerPoint);
1511
1501
  }
1512
- break;
1513
- case "miter":
1514
- case "miter-clip":
1515
- default:
1516
- const miterFraction = strokeWidth2 * style.strokeMiterLimit / miterLength2;
1517
- if (miterFraction < 1) {
1518
- if (style.strokeLineJoin !== "miter-clip") {
1519
- makeSegmentWithBevelJoin(joinIsOnLeftSide, innerSideModified, u1);
1520
- break;
1502
+ } else {
1503
+ makeSegmentTriangles();
1504
+ }
1505
+ switch (style.strokeLineJoin) {
1506
+ case "bevel":
1507
+ makeSegmentWithBevelJoin(joinIsOnLeftSide, innerSideModified, u1);
1508
+ break;
1509
+ case "round":
1510
+ createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide, innerSideModified);
1511
+ if (joinIsOnLeftSide) {
1512
+ makeCircularSector(currentPoint, currentPointL, nextPointL, u1, 0);
1521
1513
  } else {
1522
- createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide, innerSideModified);
1523
- if (joinIsOnLeftSide) {
1524
- tempV2_6.subVectors(outerPoint, currentPointL).multiplyScalar(miterFraction).add(currentPointL);
1525
- tempV2_7.subVectors(outerPoint, nextPointL).multiplyScalar(miterFraction).add(nextPointL);
1526
- addVertex(currentPointL, u1, 0);
1527
- addVertex(tempV2_6, u1, 0);
1528
- addVertex(currentPoint, u1, 0.5);
1529
- addVertex(currentPoint, u1, 0.5);
1530
- addVertex(tempV2_6, u1, 0);
1531
- addVertex(tempV2_7, u1, 0);
1532
- addVertex(currentPoint, u1, 0.5);
1533
- addVertex(tempV2_7, u1, 0);
1534
- addVertex(nextPointL, u1, 0);
1535
- } else {
1536
- tempV2_6.subVectors(outerPoint, currentPointR).multiplyScalar(miterFraction).add(currentPointR);
1537
- tempV2_7.subVectors(outerPoint, nextPointR).multiplyScalar(miterFraction).add(nextPointR);
1538
- addVertex(currentPointR, u1, 1);
1539
- addVertex(tempV2_6, u1, 1);
1540
- addVertex(currentPoint, u1, 0.5);
1541
- addVertex(currentPoint, u1, 0.5);
1542
- addVertex(tempV2_6, u1, 1);
1543
- addVertex(tempV2_7, u1, 1);
1544
- addVertex(currentPoint, u1, 0.5);
1545
- addVertex(tempV2_7, u1, 1);
1546
- addVertex(nextPointR, u1, 1);
1547
- }
1514
+ makeCircularSector(currentPoint, nextPointR, currentPointR, u1, 1);
1548
1515
  }
1549
- } else {
1550
- if (innerSideModified) {
1551
- if (joinIsOnLeftSide) {
1552
- addVertex(lastPointR, u0, 1);
1553
- addVertex(lastPointL, u0, 0);
1554
- addVertex(outerPoint, u1, 0);
1555
- addVertex(lastPointR, u0, 1);
1556
- addVertex(outerPoint, u1, 0);
1557
- addVertex(innerPoint, u1, 1);
1558
- } else {
1559
- addVertex(lastPointR, u0, 1);
1560
- addVertex(lastPointL, u0, 0);
1561
- addVertex(outerPoint, u1, 1);
1562
- addVertex(lastPointL, u0, 0);
1563
- addVertex(innerPoint, u1, 0);
1564
- addVertex(outerPoint, u1, 1);
1565
- }
1566
- if (joinIsOnLeftSide) {
1567
- nextPointL.copy(outerPoint);
1516
+ break;
1517
+ case "miter":
1518
+ case "miter-clip":
1519
+ default:
1520
+ const miterFraction = strokeWidth2 * style.strokeMiterLimit / miterLength2;
1521
+ if (miterFraction < 1) {
1522
+ if (style.strokeLineJoin !== "miter-clip") {
1523
+ makeSegmentWithBevelJoin(joinIsOnLeftSide, innerSideModified, u1);
1524
+ break;
1568
1525
  } else {
1569
- nextPointR.copy(outerPoint);
1526
+ createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide, innerSideModified);
1527
+ if (joinIsOnLeftSide) {
1528
+ tempV2_6.subVectors(outerPoint, currentPointL).multiplyScalar(miterFraction).add(currentPointL);
1529
+ tempV2_7.subVectors(outerPoint, nextPointL).multiplyScalar(miterFraction).add(nextPointL);
1530
+ addVertex(currentPointL, u1, 0);
1531
+ addVertex(tempV2_6, u1, 0);
1532
+ addVertex(currentPoint, u1, 0.5);
1533
+ addVertex(currentPoint, u1, 0.5);
1534
+ addVertex(tempV2_6, u1, 0);
1535
+ addVertex(tempV2_7, u1, 0);
1536
+ addVertex(currentPoint, u1, 0.5);
1537
+ addVertex(tempV2_7, u1, 0);
1538
+ addVertex(nextPointL, u1, 0);
1539
+ } else {
1540
+ tempV2_6.subVectors(outerPoint, currentPointR).multiplyScalar(miterFraction).add(currentPointR);
1541
+ tempV2_7.subVectors(outerPoint, nextPointR).multiplyScalar(miterFraction).add(nextPointR);
1542
+ addVertex(currentPointR, u1, 1);
1543
+ addVertex(tempV2_6, u1, 1);
1544
+ addVertex(currentPoint, u1, 0.5);
1545
+ addVertex(currentPoint, u1, 0.5);
1546
+ addVertex(tempV2_6, u1, 1);
1547
+ addVertex(tempV2_7, u1, 1);
1548
+ addVertex(currentPoint, u1, 0.5);
1549
+ addVertex(tempV2_7, u1, 1);
1550
+ addVertex(nextPointR, u1, 1);
1551
+ }
1570
1552
  }
1571
1553
  } else {
1572
- if (joinIsOnLeftSide) {
1573
- addVertex(currentPointL, u1, 0);
1574
- addVertex(outerPoint, u1, 0);
1575
- addVertex(currentPoint, u1, 0.5);
1576
- addVertex(currentPoint, u1, 0.5);
1577
- addVertex(outerPoint, u1, 0);
1578
- addVertex(nextPointL, u1, 0);
1554
+ if (innerSideModified) {
1555
+ if (joinIsOnLeftSide) {
1556
+ addVertex(lastPointR, u0, 1);
1557
+ addVertex(lastPointL, u0, 0);
1558
+ addVertex(outerPoint, u1, 0);
1559
+ addVertex(lastPointR, u0, 1);
1560
+ addVertex(outerPoint, u1, 0);
1561
+ addVertex(innerPoint, u1, 1);
1562
+ } else {
1563
+ addVertex(lastPointR, u0, 1);
1564
+ addVertex(lastPointL, u0, 0);
1565
+ addVertex(outerPoint, u1, 1);
1566
+ addVertex(lastPointL, u0, 0);
1567
+ addVertex(innerPoint, u1, 0);
1568
+ addVertex(outerPoint, u1, 1);
1569
+ }
1570
+ if (joinIsOnLeftSide) {
1571
+ nextPointL.copy(outerPoint);
1572
+ } else {
1573
+ nextPointR.copy(outerPoint);
1574
+ }
1579
1575
  } else {
1580
- addVertex(currentPointR, u1, 1);
1581
- addVertex(outerPoint, u1, 1);
1582
- addVertex(currentPoint, u1, 0.5);
1583
- addVertex(currentPoint, u1, 0.5);
1584
- addVertex(outerPoint, u1, 1);
1585
- addVertex(nextPointR, u1, 1);
1576
+ if (joinIsOnLeftSide) {
1577
+ addVertex(currentPointL, u1, 0);
1578
+ addVertex(outerPoint, u1, 0);
1579
+ addVertex(currentPoint, u1, 0.5);
1580
+ addVertex(currentPoint, u1, 0.5);
1581
+ addVertex(outerPoint, u1, 0);
1582
+ addVertex(nextPointL, u1, 0);
1583
+ } else {
1584
+ addVertex(currentPointR, u1, 1);
1585
+ addVertex(outerPoint, u1, 1);
1586
+ addVertex(currentPoint, u1, 0.5);
1587
+ addVertex(currentPoint, u1, 0.5);
1588
+ addVertex(outerPoint, u1, 1);
1589
+ addVertex(nextPointR, u1, 1);
1590
+ }
1586
1591
  }
1592
+ isMiter = true;
1587
1593
  }
1588
- isMiter = true;
1589
- }
1590
- break;
1594
+ break;
1595
+ }
1596
+ } else {
1597
+ makeSegmentTriangles();
1591
1598
  }
1592
1599
  } else {
1593
1600
  makeSegmentTriangles();
1594
1601
  }
1595
- } else {
1596
- makeSegmentTriangles();
1597
- }
1598
- if (!isClosed && iPoint === numPoints - 1) {
1599
- addCapGeometry(points[0], point0L, point0R, joinIsOnLeftSide, true, u0);
1600
- }
1601
- u0 = u1;
1602
- previousPoint = currentPoint;
1603
- lastPointL.copy(nextPointL);
1604
- lastPointR.copy(nextPointR);
1605
- }
1606
- if (!isClosed) {
1607
- addCapGeometry(currentPoint, currentPointL, currentPointR, joinIsOnLeftSide, false, u1);
1608
- } else if (innerSideModified && vertices) {
1609
- let lastOuter = outerPoint;
1610
- let lastInner = innerPoint;
1611
- if (initialJoinIsOnLeftSide !== joinIsOnLeftSide) {
1612
- lastOuter = innerPoint;
1613
- lastInner = outerPoint;
1614
- }
1615
- if (joinIsOnLeftSide) {
1616
- if (isMiter || initialJoinIsOnLeftSide) {
1617
- lastInner.toArray(vertices, 0 * 3);
1618
- lastInner.toArray(vertices, 3 * 3);
1619
- if (isMiter) {
1620
- lastOuter.toArray(vertices, 1 * 3);
1621
- }
1602
+ if (!isClosed && iPoint === numPoints - 1) {
1603
+ addCapGeometry(points[0], point0L, point0R, joinIsOnLeftSide, true, u0);
1604
+ }
1605
+ u0 = u1;
1606
+ previousPoint = currentPoint;
1607
+ lastPointL.copy(nextPointL);
1608
+ lastPointR.copy(nextPointR);
1609
+ }
1610
+ if (!isClosed) {
1611
+ addCapGeometry(currentPoint, currentPointL, currentPointR, joinIsOnLeftSide, false, u1);
1612
+ } else if (innerSideModified && vertices) {
1613
+ let lastOuter = outerPoint;
1614
+ let lastInner = innerPoint;
1615
+ if (initialJoinIsOnLeftSide !== joinIsOnLeftSide) {
1616
+ lastOuter = innerPoint;
1617
+ lastInner = outerPoint;
1622
1618
  }
1623
- } else {
1624
- if (isMiter || !initialJoinIsOnLeftSide) {
1625
- lastInner.toArray(vertices, 1 * 3);
1626
- lastInner.toArray(vertices, 3 * 3);
1627
- if (isMiter) {
1628
- lastOuter.toArray(vertices, 0 * 3);
1619
+ if (joinIsOnLeftSide) {
1620
+ if (isMiter || initialJoinIsOnLeftSide) {
1621
+ lastInner.toArray(vertices, 0 * 3);
1622
+ lastInner.toArray(vertices, 3 * 3);
1623
+ if (isMiter) {
1624
+ lastOuter.toArray(vertices, 1 * 3);
1625
+ }
1626
+ }
1627
+ } else {
1628
+ if (isMiter || !initialJoinIsOnLeftSide) {
1629
+ lastInner.toArray(vertices, 1 * 3);
1630
+ lastInner.toArray(vertices, 3 * 3);
1631
+ if (isMiter) {
1632
+ lastOuter.toArray(vertices, 0 * 3);
1633
+ }
1629
1634
  }
1630
1635
  }
1631
1636
  }
1632
- }
1633
- return numVertices;
1634
- function getNormal(p1, p2, result) {
1635
- result.subVectors(p2, p1);
1636
- return result.set(-result.y, result.x).normalize();
1637
- }
1638
- function addVertex(position, u, v) {
1639
- if (vertices) {
1640
- vertices[currentCoordinate] = position.x;
1641
- vertices[currentCoordinate + 1] = position.y;
1642
- vertices[currentCoordinate + 2] = 0;
1643
- if (normals) {
1644
- normals[currentCoordinate] = 0;
1645
- normals[currentCoordinate + 1] = 0;
1646
- normals[currentCoordinate + 2] = 1;
1647
- }
1648
- currentCoordinate += 3;
1649
- if (uvs) {
1650
- uvs[currentCoordinateUV] = u;
1651
- uvs[currentCoordinateUV + 1] = v;
1652
- currentCoordinateUV += 2;
1637
+ return numVertices;
1638
+ function getNormal(p1, p2, result) {
1639
+ result.subVectors(p2, p1);
1640
+ return result.set(-result.y, result.x).normalize();
1641
+ }
1642
+ function addVertex(position, u, v) {
1643
+ if (vertices) {
1644
+ vertices[currentCoordinate] = position.x;
1645
+ vertices[currentCoordinate + 1] = position.y;
1646
+ vertices[currentCoordinate + 2] = 0;
1647
+ if (normals) {
1648
+ normals[currentCoordinate] = 0;
1649
+ normals[currentCoordinate + 1] = 0;
1650
+ normals[currentCoordinate + 2] = 1;
1651
+ }
1652
+ currentCoordinate += 3;
1653
+ if (uvs) {
1654
+ uvs[currentCoordinateUV] = u;
1655
+ uvs[currentCoordinateUV + 1] = v;
1656
+ currentCoordinateUV += 2;
1657
+ }
1658
+ }
1659
+ numVertices += 3;
1660
+ }
1661
+ function makeCircularSector(center, p1, p2, u, v) {
1662
+ tempV2_1.copy(p1).sub(center).normalize();
1663
+ tempV2_2.copy(p2).sub(center).normalize();
1664
+ let angle = Math.PI;
1665
+ const dot = tempV2_1.dot(tempV2_2);
1666
+ if (Math.abs(dot) < 1)
1667
+ angle = Math.abs(Math.acos(dot));
1668
+ angle /= arcDivisions;
1669
+ tempV2_3.copy(p1);
1670
+ for (let i = 0, il = arcDivisions - 1; i < il; i++) {
1671
+ tempV2_4.copy(tempV2_3).rotateAround(center, angle);
1672
+ addVertex(tempV2_3, u, v);
1673
+ addVertex(tempV2_4, u, v);
1674
+ addVertex(center, u, 0.5);
1675
+ tempV2_3.copy(tempV2_4);
1653
1676
  }
1654
- }
1655
- numVertices += 3;
1656
- }
1657
- function makeCircularSector(center, p1, p2, u, v) {
1658
- tempV2_1.copy(p1).sub(center).normalize();
1659
- tempV2_2.copy(p2).sub(center).normalize();
1660
- let angle = Math.PI;
1661
- const dot = tempV2_1.dot(tempV2_2);
1662
- if (Math.abs(dot) < 1)
1663
- angle = Math.abs(Math.acos(dot));
1664
- angle /= arcDivisions;
1665
- tempV2_3.copy(p1);
1666
- for (let i = 0, il = arcDivisions - 1; i < il; i++) {
1667
- tempV2_4.copy(tempV2_3).rotateAround(center, angle);
1668
- addVertex(tempV2_3, u, v);
1669
1677
  addVertex(tempV2_4, u, v);
1678
+ addVertex(p2, u, v);
1670
1679
  addVertex(center, u, 0.5);
1671
- tempV2_3.copy(tempV2_4);
1672
1680
  }
1673
- addVertex(tempV2_4, u, v);
1674
- addVertex(p2, u, v);
1675
- addVertex(center, u, 0.5);
1676
- }
1677
- function makeSegmentTriangles() {
1678
- addVertex(lastPointR, u0, 1);
1679
- addVertex(lastPointL, u0, 0);
1680
- addVertex(currentPointL, u1, 0);
1681
- addVertex(lastPointR, u0, 1);
1682
- addVertex(currentPointL, u1, 0);
1683
- addVertex(currentPointR, u1, 1);
1684
- }
1685
- function makeSegmentWithBevelJoin(joinIsOnLeftSide2, innerSideModified2, u) {
1686
- if (innerSideModified2) {
1687
- if (joinIsOnLeftSide2) {
1688
- addVertex(lastPointR, u0, 1);
1689
- addVertex(lastPointL, u0, 0);
1690
- addVertex(currentPointL, u1, 0);
1691
- addVertex(lastPointR, u0, 1);
1692
- addVertex(currentPointL, u1, 0);
1693
- addVertex(innerPoint, u1, 1);
1694
- addVertex(currentPointL, u, 0);
1695
- addVertex(nextPointL, u, 0);
1696
- addVertex(innerPoint, u, 0.5);
1697
- } else {
1698
- addVertex(lastPointR, u0, 1);
1699
- addVertex(lastPointL, u0, 0);
1700
- addVertex(currentPointR, u1, 1);
1701
- addVertex(lastPointL, u0, 0);
1702
- addVertex(innerPoint, u1, 0);
1703
- addVertex(currentPointR, u1, 1);
1704
- addVertex(currentPointR, u, 1);
1705
- addVertex(innerPoint, u, 0);
1706
- addVertex(nextPointR, u, 1);
1707
- }
1708
- } else {
1709
- if (joinIsOnLeftSide2) {
1710
- addVertex(currentPointL, u, 0);
1711
- addVertex(nextPointL, u, 0);
1712
- addVertex(currentPoint, u, 0.5);
1713
- } else {
1714
- addVertex(currentPointR, u, 1);
1715
- addVertex(nextPointR, u, 0);
1716
- addVertex(currentPoint, u, 0.5);
1717
- }
1718
- }
1719
- }
1720
- function createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide2, innerSideModified2) {
1721
- if (innerSideModified2) {
1722
- if (joinIsOnLeftSide2) {
1723
- addVertex(lastPointR, u0, 1);
1724
- addVertex(lastPointL, u0, 0);
1725
- addVertex(currentPointL, u1, 0);
1726
- addVertex(lastPointR, u0, 1);
1727
- addVertex(currentPointL, u1, 0);
1728
- addVertex(innerPoint, u1, 1);
1729
- addVertex(currentPointL, u0, 0);
1730
- addVertex(currentPoint, u1, 0.5);
1731
- addVertex(innerPoint, u1, 1);
1732
- addVertex(currentPoint, u1, 0.5);
1733
- addVertex(nextPointL, u0, 0);
1734
- addVertex(innerPoint, u1, 1);
1681
+ function makeSegmentTriangles() {
1682
+ addVertex(lastPointR, u0, 1);
1683
+ addVertex(lastPointL, u0, 0);
1684
+ addVertex(currentPointL, u1, 0);
1685
+ addVertex(lastPointR, u0, 1);
1686
+ addVertex(currentPointL, u1, 0);
1687
+ addVertex(currentPointR, u1, 1);
1688
+ }
1689
+ function makeSegmentWithBevelJoin(joinIsOnLeftSide2, innerSideModified2, u) {
1690
+ if (innerSideModified2) {
1691
+ if (joinIsOnLeftSide2) {
1692
+ addVertex(lastPointR, u0, 1);
1693
+ addVertex(lastPointL, u0, 0);
1694
+ addVertex(currentPointL, u1, 0);
1695
+ addVertex(lastPointR, u0, 1);
1696
+ addVertex(currentPointL, u1, 0);
1697
+ addVertex(innerPoint, u1, 1);
1698
+ addVertex(currentPointL, u, 0);
1699
+ addVertex(nextPointL, u, 0);
1700
+ addVertex(innerPoint, u, 0.5);
1701
+ } else {
1702
+ addVertex(lastPointR, u0, 1);
1703
+ addVertex(lastPointL, u0, 0);
1704
+ addVertex(currentPointR, u1, 1);
1705
+ addVertex(lastPointL, u0, 0);
1706
+ addVertex(innerPoint, u1, 0);
1707
+ addVertex(currentPointR, u1, 1);
1708
+ addVertex(currentPointR, u, 1);
1709
+ addVertex(innerPoint, u, 0);
1710
+ addVertex(nextPointR, u, 1);
1711
+ }
1735
1712
  } else {
1736
- addVertex(lastPointR, u0, 1);
1737
- addVertex(lastPointL, u0, 0);
1738
- addVertex(currentPointR, u1, 1);
1739
- addVertex(lastPointL, u0, 0);
1740
- addVertex(innerPoint, u1, 0);
1741
- addVertex(currentPointR, u1, 1);
1742
- addVertex(currentPointR, u0, 1);
1743
- addVertex(innerPoint, u1, 0);
1744
- addVertex(currentPoint, u1, 0.5);
1745
- addVertex(currentPoint, u1, 0.5);
1746
- addVertex(innerPoint, u1, 0);
1747
- addVertex(nextPointR, u0, 1);
1713
+ if (joinIsOnLeftSide2) {
1714
+ addVertex(currentPointL, u, 0);
1715
+ addVertex(nextPointL, u, 0);
1716
+ addVertex(currentPoint, u, 0.5);
1717
+ } else {
1718
+ addVertex(currentPointR, u, 1);
1719
+ addVertex(nextPointR, u, 0);
1720
+ addVertex(currentPoint, u, 0.5);
1721
+ }
1748
1722
  }
1749
1723
  }
1750
- }
1751
- function addCapGeometry(center, p1, p2, joinIsOnLeftSide2, start, u) {
1752
- switch (style.strokeLineCap) {
1753
- case "round":
1754
- if (start) {
1755
- makeCircularSector(center, p2, p1, u, 0.5);
1724
+ function createSegmentTrianglesWithMiddleSection(joinIsOnLeftSide2, innerSideModified2) {
1725
+ if (innerSideModified2) {
1726
+ if (joinIsOnLeftSide2) {
1727
+ addVertex(lastPointR, u0, 1);
1728
+ addVertex(lastPointL, u0, 0);
1729
+ addVertex(currentPointL, u1, 0);
1730
+ addVertex(lastPointR, u0, 1);
1731
+ addVertex(currentPointL, u1, 0);
1732
+ addVertex(innerPoint, u1, 1);
1733
+ addVertex(currentPointL, u0, 0);
1734
+ addVertex(currentPoint, u1, 0.5);
1735
+ addVertex(innerPoint, u1, 1);
1736
+ addVertex(currentPoint, u1, 0.5);
1737
+ addVertex(nextPointL, u0, 0);
1738
+ addVertex(innerPoint, u1, 1);
1756
1739
  } else {
1757
- makeCircularSector(center, p1, p2, u, 0.5);
1740
+ addVertex(lastPointR, u0, 1);
1741
+ addVertex(lastPointL, u0, 0);
1742
+ addVertex(currentPointR, u1, 1);
1743
+ addVertex(lastPointL, u0, 0);
1744
+ addVertex(innerPoint, u1, 0);
1745
+ addVertex(currentPointR, u1, 1);
1746
+ addVertex(currentPointR, u0, 1);
1747
+ addVertex(innerPoint, u1, 0);
1748
+ addVertex(currentPoint, u1, 0.5);
1749
+ addVertex(currentPoint, u1, 0.5);
1750
+ addVertex(innerPoint, u1, 0);
1751
+ addVertex(nextPointR, u0, 1);
1758
1752
  }
1759
- break;
1760
- case "square":
1761
- if (start) {
1762
- tempV2_1.subVectors(p1, center);
1763
- tempV2_2.set(tempV2_1.y, -tempV2_1.x);
1764
- tempV2_3.addVectors(tempV2_1, tempV2_2).add(center);
1765
- tempV2_4.subVectors(tempV2_2, tempV2_1).add(center);
1766
- if (joinIsOnLeftSide2) {
1767
- tempV2_3.toArray(vertices, 1 * 3);
1768
- tempV2_4.toArray(vertices, 0 * 3);
1769
- tempV2_4.toArray(vertices, 3 * 3);
1753
+ }
1754
+ }
1755
+ function addCapGeometry(center, p1, p2, joinIsOnLeftSide2, start, u) {
1756
+ switch (style.strokeLineCap) {
1757
+ case "round":
1758
+ if (start) {
1759
+ makeCircularSector(center, p2, p1, u, 0.5);
1770
1760
  } else {
1771
- tempV2_3.toArray(vertices, 1 * 3);
1772
- uvs[3 * 2 + 1] === 1 ? tempV2_4.toArray(vertices, 3 * 3) : tempV2_3.toArray(vertices, 3 * 3);
1773
- tempV2_4.toArray(vertices, 0 * 3);
1761
+ makeCircularSector(center, p1, p2, u, 0.5);
1774
1762
  }
1775
- } else {
1776
- tempV2_1.subVectors(p2, center);
1777
- tempV2_2.set(tempV2_1.y, -tempV2_1.x);
1778
- tempV2_3.addVectors(tempV2_1, tempV2_2).add(center);
1779
- tempV2_4.subVectors(tempV2_2, tempV2_1).add(center);
1780
- const vl = vertices.length;
1781
- if (joinIsOnLeftSide2) {
1782
- tempV2_3.toArray(vertices, vl - 1 * 3);
1783
- tempV2_4.toArray(vertices, vl - 2 * 3);
1784
- tempV2_4.toArray(vertices, vl - 4 * 3);
1763
+ break;
1764
+ case "square":
1765
+ if (start) {
1766
+ tempV2_1.subVectors(p1, center);
1767
+ tempV2_2.set(tempV2_1.y, -tempV2_1.x);
1768
+ tempV2_3.addVectors(tempV2_1, tempV2_2).add(center);
1769
+ tempV2_4.subVectors(tempV2_2, tempV2_1).add(center);
1770
+ if (joinIsOnLeftSide2) {
1771
+ tempV2_3.toArray(vertices, 1 * 3);
1772
+ tempV2_4.toArray(vertices, 0 * 3);
1773
+ tempV2_4.toArray(vertices, 3 * 3);
1774
+ } else {
1775
+ tempV2_3.toArray(vertices, 1 * 3);
1776
+ uvs[3 * 2 + 1] === 1 ? tempV2_4.toArray(vertices, 3 * 3) : tempV2_3.toArray(vertices, 3 * 3);
1777
+ tempV2_4.toArray(vertices, 0 * 3);
1778
+ }
1785
1779
  } else {
1786
- tempV2_4.toArray(vertices, vl - 2 * 3);
1787
- tempV2_3.toArray(vertices, vl - 1 * 3);
1788
- tempV2_4.toArray(vertices, vl - 4 * 3);
1780
+ tempV2_1.subVectors(p2, center);
1781
+ tempV2_2.set(tempV2_1.y, -tempV2_1.x);
1782
+ tempV2_3.addVectors(tempV2_1, tempV2_2).add(center);
1783
+ tempV2_4.subVectors(tempV2_2, tempV2_1).add(center);
1784
+ const vl = vertices.length;
1785
+ if (joinIsOnLeftSide2) {
1786
+ tempV2_3.toArray(vertices, vl - 1 * 3);
1787
+ tempV2_4.toArray(vertices, vl - 2 * 3);
1788
+ tempV2_4.toArray(vertices, vl - 4 * 3);
1789
+ } else {
1790
+ tempV2_4.toArray(vertices, vl - 2 * 3);
1791
+ tempV2_3.toArray(vertices, vl - 1 * 3);
1792
+ tempV2_4.toArray(vertices, vl - 4 * 3);
1793
+ }
1789
1794
  }
1790
- }
1791
- break;
1792
- }
1793
- }
1794
- function removeDuplicatedPoints(points2) {
1795
- let dupPoints = false;
1796
- for (let i = 1, n = points2.length - 1; i < n; i++) {
1797
- if (points2[i].distanceTo(points2[i + 1]) < minDistance) {
1798
- dupPoints = true;
1799
- break;
1795
+ break;
1800
1796
  }
1801
1797
  }
1802
- if (!dupPoints)
1803
- return points2;
1804
- const newPoints = [];
1805
- newPoints.push(points2[0]);
1806
- for (let i = 1, n = points2.length - 1; i < n; i++) {
1807
- if (points2[i].distanceTo(points2[i + 1]) >= minDistance) {
1808
- newPoints.push(points2[i]);
1798
+ function removeDuplicatedPoints(points2) {
1799
+ let dupPoints = false;
1800
+ for (let i = 1, n = points2.length - 1; i < n; i++) {
1801
+ if (points2[i].distanceTo(points2[i + 1]) < minDistance) {
1802
+ dupPoints = true;
1803
+ break;
1804
+ }
1805
+ }
1806
+ if (!dupPoints)
1807
+ return points2;
1808
+ const newPoints = [];
1809
+ newPoints.push(points2[0]);
1810
+ for (let i = 1, n = points2.length - 1; i < n; i++) {
1811
+ if (points2[i].distanceTo(points2[i + 1]) >= minDistance) {
1812
+ newPoints.push(points2[i]);
1813
+ }
1809
1814
  }
1815
+ newPoints.push(points2[points2.length - 1]);
1816
+ return newPoints;
1810
1817
  }
1811
- newPoints.push(points2[points2.length - 1]);
1812
- return newPoints;
1813
1818
  }
1814
1819
  }
1815
- }
1820
+ return SVGLoader2;
1821
+ })();
1816
1822
  exports.SVGLoader = SVGLoader;
1817
1823
  //# sourceMappingURL=SVGLoader.cjs.map