three-stdlib 2.35.5 → 2.35.7

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