three-stdlib 2.35.4 → 2.35.5

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