@needle-tools/three 0.145.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1160) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/build/three.cjs +36042 -0
  4. package/build/three.js +36048 -0
  5. package/build/three.min.js +6 -0
  6. package/build/three.module.js +49769 -0
  7. package/examples/fonts/LICENSE +13 -0
  8. package/examples/fonts/README.md +11 -0
  9. package/examples/fonts/droid/NOTICE +190 -0
  10. package/examples/fonts/droid/README.txt +18 -0
  11. package/examples/fonts/droid/droid_sans_bold.typeface.json +1 -0
  12. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +1 -0
  13. package/examples/fonts/droid/droid_sans_regular.typeface.json +1 -0
  14. package/examples/fonts/droid/droid_serif_bold.typeface.json +1 -0
  15. package/examples/fonts/droid/droid_serif_regular.typeface.json +1 -0
  16. package/examples/fonts/gentilis_bold.typeface.json +1 -0
  17. package/examples/fonts/gentilis_regular.typeface.json +1 -0
  18. package/examples/fonts/helvetiker_bold.typeface.json +1 -0
  19. package/examples/fonts/helvetiker_regular.typeface.json +1 -0
  20. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff +0 -0
  21. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2 +0 -0
  22. package/examples/fonts/open-sans/open-sans.css +9 -0
  23. package/examples/fonts/optimer_bold.typeface.json +1 -0
  24. package/examples/fonts/optimer_regular.typeface.json +1 -0
  25. package/examples/fonts/tabler-icons/fonts/tabler-icons.eot +0 -0
  26. package/examples/fonts/tabler-icons/fonts/tabler-icons.svg +3966 -0
  27. package/examples/fonts/tabler-icons/fonts/tabler-icons.ttf +0 -0
  28. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff +0 -0
  29. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff2 +0 -0
  30. package/examples/fonts/tabler-icons/tabler-icons.min.css +4 -0
  31. package/examples/fonts/ttf/README.md +9 -0
  32. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  33. package/examples/js/animation/AnimationClipCreator.js +97 -0
  34. package/examples/js/animation/CCDIKSolver.js +433 -0
  35. package/examples/js/animation/MMDAnimationHelper.js +1117 -0
  36. package/examples/js/animation/MMDPhysics.js +1238 -0
  37. package/examples/js/cameras/CinematicCamera.js +157 -0
  38. package/examples/js/controls/ArcballControls.js +3037 -0
  39. package/examples/js/controls/DragControls.js +230 -0
  40. package/examples/js/controls/FirstPersonControls.js +334 -0
  41. package/examples/js/controls/FlyControls.js +347 -0
  42. package/examples/js/controls/OrbitControls.js +1075 -0
  43. package/examples/js/controls/PointerLockControls.js +153 -0
  44. package/examples/js/controls/TrackballControls.js +782 -0
  45. package/examples/js/controls/TransformControls.js +1386 -0
  46. package/examples/js/csm/CSM.js +382 -0
  47. package/examples/js/csm/CSMFrustum.js +133 -0
  48. package/examples/js/csm/CSMHelper.js +145 -0
  49. package/examples/js/csm/CSMShader.js +257 -0
  50. package/examples/js/curves/CurveExtras.js +348 -0
  51. package/examples/js/curves/NURBSCurve.js +75 -0
  52. package/examples/js/curves/NURBSSurface.js +54 -0
  53. package/examples/js/curves/NURBSUtils.js +476 -0
  54. package/examples/js/effects/AnaglyphEffect.js +100 -0
  55. package/examples/js/effects/AsciiEffect.js +259 -0
  56. package/examples/js/effects/OutlineEffect.js +454 -0
  57. package/examples/js/effects/ParallaxBarrierEffect.js +75 -0
  58. package/examples/js/effects/PeppersGhostEffect.js +166 -0
  59. package/examples/js/effects/StereoEffect.js +50 -0
  60. package/examples/js/environments/DebugEnvironment.js +53 -0
  61. package/examples/js/environments/RoomEnvironment.js +122 -0
  62. package/examples/js/exporters/ColladaExporter.js +504 -0
  63. package/examples/js/exporters/DRACOExporter.js +212 -0
  64. package/examples/js/exporters/EXRExporter.js +458 -0
  65. package/examples/js/exporters/GLTFExporter.js +2543 -0
  66. package/examples/js/exporters/MMDExporter.js +194 -0
  67. package/examples/js/exporters/OBJExporter.js +251 -0
  68. package/examples/js/exporters/PLYExporter.js +422 -0
  69. package/examples/js/exporters/STLExporter.js +190 -0
  70. package/examples/js/exporters/USDZExporter.js +523 -0
  71. package/examples/js/geometries/BoxLineGeometry.js +60 -0
  72. package/examples/js/geometries/ConvexGeometry.js +48 -0
  73. package/examples/js/geometries/DecalGeometry.js +291 -0
  74. package/examples/js/geometries/LightningStrike.js +874 -0
  75. package/examples/js/geometries/ParametricGeometries.js +215 -0
  76. package/examples/js/geometries/ParametricGeometry.js +108 -0
  77. package/examples/js/geometries/RoundedBoxGeometry.js +140 -0
  78. package/examples/js/geometries/TeapotGeometry.js +331 -0
  79. package/examples/js/geometries/TextGeometry.js +51 -0
  80. package/examples/js/helpers/LightProbeHelper.js +49 -0
  81. package/examples/js/helpers/OctreeHelper.js +74 -0
  82. package/examples/js/helpers/PositionalAudioHelper.js +89 -0
  83. package/examples/js/helpers/RectAreaLightHelper.js +74 -0
  84. package/examples/js/helpers/VertexNormalsHelper.js +72 -0
  85. package/examples/js/helpers/VertexTangentsHelper.js +62 -0
  86. package/examples/js/helpers/ViewHelper.js +266 -0
  87. package/examples/js/interactive/HTMLMesh.js +508 -0
  88. package/examples/js/interactive/InteractiveGroup.js +101 -0
  89. package/examples/js/interactive/SelectionBox.js +262 -0
  90. package/examples/js/interactive/SelectionHelper.js +91 -0
  91. package/examples/js/libs/ammo.wasm.js +822 -0
  92. package/examples/js/libs/ammo.wasm.wasm +0 -0
  93. package/examples/js/libs/basis/README.md +46 -0
  94. package/examples/js/libs/basis/basis_transcoder.js +21 -0
  95. package/examples/js/libs/basis/basis_transcoder.wasm +0 -0
  96. package/examples/js/libs/chevrotain.min.js +3 -0
  97. package/examples/js/libs/draco/README.md +32 -0
  98. package/examples/js/libs/draco/draco_decoder.js +52 -0
  99. package/examples/js/libs/draco/draco_decoder.wasm +0 -0
  100. package/examples/js/libs/draco/draco_encoder.js +33 -0
  101. package/examples/js/libs/draco/draco_wasm_wrapper.js +104 -0
  102. package/examples/js/libs/draco/gltf/draco_decoder.js +48 -0
  103. package/examples/js/libs/draco/gltf/draco_decoder.wasm +0 -0
  104. package/examples/js/libs/draco/gltf/draco_encoder.js +33 -0
  105. package/examples/js/libs/draco/gltf/draco_wasm_wrapper.js +104 -0
  106. package/examples/js/libs/fflate.min.js +7 -0
  107. package/examples/js/libs/ktx-parse.umd.js +1 -0
  108. package/examples/js/libs/lottie_canvas.js +12751 -0
  109. package/examples/js/libs/meshopt_decoder.js +188 -0
  110. package/examples/js/libs/opentype.min.js +1 -0
  111. package/examples/js/libs/stats.min.js +5 -0
  112. package/examples/js/lights/LightProbeGenerator.js +228 -0
  113. package/examples/js/lights/RectAreaLightUniformsLib.js +56 -0
  114. package/examples/js/lines/Line2.js +19 -0
  115. package/examples/js/lines/LineGeometry.js +71 -0
  116. package/examples/js/lines/LineMaterial.js +642 -0
  117. package/examples/js/lines/LineSegments2.js +362 -0
  118. package/examples/js/lines/LineSegmentsGeometry.js +219 -0
  119. package/examples/js/lines/Wireframe.js +52 -0
  120. package/examples/js/lines/WireframeGeometry2.js +18 -0
  121. package/examples/js/loaders/3DMLoader.js +1370 -0
  122. package/examples/js/loaders/3MFLoader.js +1340 -0
  123. package/examples/js/loaders/AMFLoader.js +529 -0
  124. package/examples/js/loaders/BVHLoader.js +394 -0
  125. package/examples/js/loaders/BasisTextureLoader.js +736 -0
  126. package/examples/js/loaders/ColladaLoader.js +3821 -0
  127. package/examples/js/loaders/DDSLoader.js +245 -0
  128. package/examples/js/loaders/DRACOLoader.js +548 -0
  129. package/examples/js/loaders/EXRLoader.js +2136 -0
  130. package/examples/js/loaders/FBXLoader.js +3835 -0
  131. package/examples/js/loaders/FontLoader.js +169 -0
  132. package/examples/js/loaders/GCodeLoader.js +256 -0
  133. package/examples/js/loaders/GLTFLoader.js +4159 -0
  134. package/examples/js/loaders/HDRCubeTextureLoader.js +93 -0
  135. package/examples/js/loaders/KMZLoader.js +125 -0
  136. package/examples/js/loaders/KTXLoader.js +177 -0
  137. package/examples/js/loaders/LDrawLoader.js +2374 -0
  138. package/examples/js/loaders/LUT3dlLoader.js +139 -0
  139. package/examples/js/loaders/LUTCubeLoader.js +140 -0
  140. package/examples/js/loaders/LWOLoader.js +966 -0
  141. package/examples/js/loaders/LogLuvLoader.js +765 -0
  142. package/examples/js/loaders/LottieLoader.js +62 -0
  143. package/examples/js/loaders/MD2Loader.js +249 -0
  144. package/examples/js/loaders/MDDLoader.js +95 -0
  145. package/examples/js/loaders/MMDLoader.js +1924 -0
  146. package/examples/js/loaders/MTLLoader.js +501 -0
  147. package/examples/js/loaders/NRRDLoader.js +649 -0
  148. package/examples/js/loaders/OBJLoader.js +804 -0
  149. package/examples/js/loaders/PCDLoader.js +408 -0
  150. package/examples/js/loaders/PDBLoader.js +313 -0
  151. package/examples/js/loaders/PLYLoader.js +562 -0
  152. package/examples/js/loaders/PRWMLoader.js +260 -0
  153. package/examples/js/loaders/PVRLoader.js +227 -0
  154. package/examples/js/loaders/RGBELoader.js +467 -0
  155. package/examples/js/loaders/RGBMLoader.js +1415 -0
  156. package/examples/js/loaders/STLLoader.js +371 -0
  157. package/examples/js/loaders/SVGLoader.js +2655 -0
  158. package/examples/js/loaders/TDSLoader.js +1029 -0
  159. package/examples/js/loaders/TGALoader.js +486 -0
  160. package/examples/js/loaders/TIFFLoader.js +31 -0
  161. package/examples/js/loaders/TTFLoader.js +211 -0
  162. package/examples/js/loaders/TiltLoader.js +460 -0
  163. package/examples/js/loaders/VOXLoader.js +248 -0
  164. package/examples/js/loaders/VRMLLoader.js +3237 -0
  165. package/examples/js/loaders/VTKLoader.js +1095 -0
  166. package/examples/js/loaders/XYZLoader.js +91 -0
  167. package/examples/js/loaders/lwo/IFFParser.js +1148 -0
  168. package/examples/js/loaders/lwo/LWO2Parser.js +448 -0
  169. package/examples/js/loaders/lwo/LWO3Parser.js +402 -0
  170. package/examples/js/materials/MeshGouraudMaterial.js +385 -0
  171. package/examples/js/math/Capsule.js +120 -0
  172. package/examples/js/math/ColorConverter.js +33 -0
  173. package/examples/js/math/ConvexHull.js +1110 -0
  174. package/examples/js/math/ImprovedNoise.js +66 -0
  175. package/examples/js/math/Lut.js +171 -0
  176. package/examples/js/math/MeshSurfaceSampler.js +193 -0
  177. package/examples/js/math/OBB.js +341 -0
  178. package/examples/js/math/Octree.js +465 -0
  179. package/examples/js/math/SimplexNoise.js +459 -0
  180. package/examples/js/misc/ConvexObjectBreaker.js +485 -0
  181. package/examples/js/misc/GPUComputationRenderer.js +397 -0
  182. package/examples/js/misc/Gyroscope.js +60 -0
  183. package/examples/js/misc/MD2Character.js +244 -0
  184. package/examples/js/misc/MD2CharacterComplex.js +494 -0
  185. package/examples/js/misc/MorphAnimMesh.js +69 -0
  186. package/examples/js/misc/MorphBlendMesh.js +292 -0
  187. package/examples/js/misc/ProgressiveLightMap.js +331 -0
  188. package/examples/js/misc/RollerCoaster.js +437 -0
  189. package/examples/js/misc/TubePainter.js +161 -0
  190. package/examples/js/misc/Volume.js +466 -0
  191. package/examples/js/misc/VolumeSlice.js +224 -0
  192. package/examples/js/modifiers/CurveModifier.js +311 -0
  193. package/examples/js/modifiers/EdgeSplitModifier.js +258 -0
  194. package/examples/js/modifiers/SimplifyModifier.js +468 -0
  195. package/examples/js/modifiers/TessellateModifier.js +283 -0
  196. package/examples/js/objects/GroundProjectedEnv.js +193 -0
  197. package/examples/js/objects/Lensflare.js +347 -0
  198. package/examples/js/objects/LightningStorm.js +209 -0
  199. package/examples/js/objects/MarchingCubes.js +738 -0
  200. package/examples/js/objects/Reflector.js +214 -0
  201. package/examples/js/objects/ReflectorForSSRPass.js +319 -0
  202. package/examples/js/objects/Refractor.js +261 -0
  203. package/examples/js/objects/ShadowMesh.js +60 -0
  204. package/examples/js/objects/Sky.js +223 -0
  205. package/examples/js/objects/Water.js +287 -0
  206. package/examples/js/objects/Water2.js +306 -0
  207. package/examples/js/physics/AmmoPhysics.js +256 -0
  208. package/examples/js/physics/OimoPhysics.js +215 -0
  209. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +342 -0
  210. package/examples/js/postprocessing/AfterimagePass.js +70 -0
  211. package/examples/js/postprocessing/BloomPass.js +114 -0
  212. package/examples/js/postprocessing/BokehPass.js +103 -0
  213. package/examples/js/postprocessing/ClearPass.js +44 -0
  214. package/examples/js/postprocessing/CubeTexturePass.js +57 -0
  215. package/examples/js/postprocessing/DotScreenPass.js +49 -0
  216. package/examples/js/postprocessing/EffectComposer.js +279 -0
  217. package/examples/js/postprocessing/FilmPass.js +50 -0
  218. package/examples/js/postprocessing/GlitchPass.js +105 -0
  219. package/examples/js/postprocessing/HalftonePass.js +75 -0
  220. package/examples/js/postprocessing/LUTPass.js +184 -0
  221. package/examples/js/postprocessing/MaskPass.js +92 -0
  222. package/examples/js/postprocessing/OutlinePass.js +589 -0
  223. package/examples/js/postprocessing/Pass.js +75 -0
  224. package/examples/js/postprocessing/RenderPass.js +74 -0
  225. package/examples/js/postprocessing/SAOPass.js +366 -0
  226. package/examples/js/postprocessing/SMAAPass.js +153 -0
  227. package/examples/js/postprocessing/SSAARenderPass.js +156 -0
  228. package/examples/js/postprocessing/SSAOPass.js +351 -0
  229. package/examples/js/postprocessing/SSRPass.js +550 -0
  230. package/examples/js/postprocessing/SavePass.js +51 -0
  231. package/examples/js/postprocessing/ShaderPass.js +63 -0
  232. package/examples/js/postprocessing/TAARenderPass.js +128 -0
  233. package/examples/js/postprocessing/TexturePass.js +46 -0
  234. package/examples/js/postprocessing/UnrealBloomPass.js +357 -0
  235. package/examples/js/renderers/CSS2DRenderer.js +197 -0
  236. package/examples/js/renderers/CSS3DRenderer.js +258 -0
  237. package/examples/js/renderers/Projector.js +874 -0
  238. package/examples/js/renderers/SVGRenderer.js +537 -0
  239. package/examples/js/shaders/ACESFilmicToneMappingShader.js +92 -0
  240. package/examples/js/shaders/AfterimageShader.js +63 -0
  241. package/examples/js/shaders/BasicShader.js +30 -0
  242. package/examples/js/shaders/BleachBypassShader.js +65 -0
  243. package/examples/js/shaders/BlendShader.js +57 -0
  244. package/examples/js/shaders/BokehShader.js +159 -0
  245. package/examples/js/shaders/BokehShader2.js +428 -0
  246. package/examples/js/shaders/BrightnessContrastShader.js +61 -0
  247. package/examples/js/shaders/ColorCorrectionShader.js +56 -0
  248. package/examples/js/shaders/ColorifyShader.js +51 -0
  249. package/examples/js/shaders/ConvolutionShader.js +97 -0
  250. package/examples/js/shaders/CopyShader.js +48 -0
  251. package/examples/js/shaders/DOFMipMapShader.js +63 -0
  252. package/examples/js/shaders/DepthLimitedBlurShader.js +180 -0
  253. package/examples/js/shaders/DigitalGlitch.js +130 -0
  254. package/examples/js/shaders/DotScreenShader.js +76 -0
  255. package/examples/js/shaders/FXAAShader.js +286 -0
  256. package/examples/js/shaders/FilmShader.js +113 -0
  257. package/examples/js/shaders/FocusShader.js +98 -0
  258. package/examples/js/shaders/FreiChenShader.js +97 -0
  259. package/examples/js/shaders/GammaCorrectionShader.js +44 -0
  260. package/examples/js/shaders/GodRaysShader.js +297 -0
  261. package/examples/js/shaders/HalftoneShader.js +339 -0
  262. package/examples/js/shaders/HorizontalBlurShader.js +62 -0
  263. package/examples/js/shaders/HorizontalTiltShiftShader.js +68 -0
  264. package/examples/js/shaders/HueSaturationShader.js +72 -0
  265. package/examples/js/shaders/KaleidoShader.js +63 -0
  266. package/examples/js/shaders/LuminosityHighPassShader.js +71 -0
  267. package/examples/js/shaders/LuminosityShader.js +49 -0
  268. package/examples/js/shaders/MMDToonShader.js +100 -0
  269. package/examples/js/shaders/MirrorShader.js +59 -0
  270. package/examples/js/shaders/NormalMapShader.js +59 -0
  271. package/examples/js/shaders/PixelShader.js +51 -0
  272. package/examples/js/shaders/RGBShiftShader.js +59 -0
  273. package/examples/js/shaders/SAOShader.js +213 -0
  274. package/examples/js/shaders/SMAAShader.js +466 -0
  275. package/examples/js/shaders/SSAOShader.js +299 -0
  276. package/examples/js/shaders/SSRShader.js +393 -0
  277. package/examples/js/shaders/SepiaShader.js +55 -0
  278. package/examples/js/shaders/SobelOperatorShader.js +92 -0
  279. package/examples/js/shaders/SubsurfaceScatteringShader.js +49 -0
  280. package/examples/js/shaders/TechnicolorShader.js +46 -0
  281. package/examples/js/shaders/ToneMapShader.js +87 -0
  282. package/examples/js/shaders/ToonShader.js +351 -0
  283. package/examples/js/shaders/TriangleBlurShader.js +74 -0
  284. package/examples/js/shaders/UnpackDepthRGBAShader.js +50 -0
  285. package/examples/js/shaders/VerticalBlurShader.js +62 -0
  286. package/examples/js/shaders/VerticalTiltShiftShader.js +68 -0
  287. package/examples/js/shaders/VignetteShader.js +56 -0
  288. package/examples/js/shaders/VolumeShader.js +300 -0
  289. package/examples/js/shaders/WaterRefractionShader.js +88 -0
  290. package/examples/js/textures/FlakesTexture.js +41 -0
  291. package/examples/js/utils/BufferGeometryUtils.js +1094 -0
  292. package/examples/js/utils/CameraUtils.js +86 -0
  293. package/examples/js/utils/GPUStatsPanel.js +134 -0
  294. package/examples/js/utils/GeometryCompressionUtils.js +574 -0
  295. package/examples/js/utils/GeometryUtils.js +173 -0
  296. package/examples/js/utils/LDrawUtils.js +182 -0
  297. package/examples/js/utils/PackedPhongMaterial.js +107 -0
  298. package/examples/js/utils/SceneUtils.js +103 -0
  299. package/examples/js/utils/ShadowMapViewer.js +180 -0
  300. package/examples/js/utils/SkeletonUtils.js +507 -0
  301. package/examples/js/utils/UVsDebug.js +135 -0
  302. package/examples/js/utils/WorkerPool.js +115 -0
  303. package/examples/jsm/animation/AnimationClipCreator.js +114 -0
  304. package/examples/jsm/animation/CCDIKSolver.js +482 -0
  305. package/examples/jsm/animation/MMDAnimationHelper.js +1207 -0
  306. package/examples/jsm/animation/MMDPhysics.js +1406 -0
  307. package/examples/jsm/cameras/CinematicCamera.js +209 -0
  308. package/examples/jsm/capabilities/WebGL.js +91 -0
  309. package/examples/jsm/capabilities/WebGPU.js +39 -0
  310. package/examples/jsm/controls/ArcballControls.js +3216 -0
  311. package/examples/jsm/controls/DragControls.js +220 -0
  312. package/examples/jsm/controls/FirstPersonControls.js +325 -0
  313. package/examples/jsm/controls/FlyControls.js +284 -0
  314. package/examples/jsm/controls/OrbitControls.js +1249 -0
  315. package/examples/jsm/controls/PointerLockControls.js +157 -0
  316. package/examples/jsm/controls/TrackballControls.js +814 -0
  317. package/examples/jsm/controls/TransformControls.js +1558 -0
  318. package/examples/jsm/csm/CSM.js +378 -0
  319. package/examples/jsm/csm/CSMFrustum.js +152 -0
  320. package/examples/jsm/csm/CSMHelper.js +193 -0
  321. package/examples/jsm/csm/CSMShader.js +251 -0
  322. package/examples/jsm/curves/CurveExtras.js +422 -0
  323. package/examples/jsm/curves/NURBSCurve.js +80 -0
  324. package/examples/jsm/curves/NURBSSurface.js +52 -0
  325. package/examples/jsm/curves/NURBSUtils.js +487 -0
  326. package/examples/jsm/effects/AnaglyphEffect.js +168 -0
  327. package/examples/jsm/effects/AsciiEffect.js +266 -0
  328. package/examples/jsm/effects/OutlineEffect.js +553 -0
  329. package/examples/jsm/effects/ParallaxBarrierEffect.js +116 -0
  330. package/examples/jsm/effects/PeppersGhostEffect.js +153 -0
  331. package/examples/jsm/effects/StereoEffect.js +55 -0
  332. package/examples/jsm/environments/DebugEnvironment.js +52 -0
  333. package/examples/jsm/environments/RoomEnvironment.js +144 -0
  334. package/examples/jsm/exporters/ColladaExporter.js +713 -0
  335. package/examples/jsm/exporters/DRACOExporter.js +225 -0
  336. package/examples/jsm/exporters/EXRExporter.js +507 -0
  337. package/examples/jsm/exporters/GLTFExporter.js +2870 -0
  338. package/examples/jsm/exporters/KTX2Exporter.js +281 -0
  339. package/examples/jsm/exporters/MMDExporter.js +217 -0
  340. package/examples/jsm/exporters/OBJExporter.js +284 -0
  341. package/examples/jsm/exporters/PLYExporter.js +521 -0
  342. package/examples/jsm/exporters/STLExporter.js +195 -0
  343. package/examples/jsm/exporters/USDZExporter.js +1112 -0
  344. package/examples/jsm/geometries/BoxLineGeometry.js +69 -0
  345. package/examples/jsm/geometries/ConvexGeometry.js +59 -0
  346. package/examples/jsm/geometries/DecalGeometry.js +356 -0
  347. package/examples/jsm/geometries/LightningStrike.js +1017 -0
  348. package/examples/jsm/geometries/ParametricGeometries.js +254 -0
  349. package/examples/jsm/geometries/ParametricGeometry.js +129 -0
  350. package/examples/jsm/geometries/RoundedBoxGeometry.js +155 -0
  351. package/examples/jsm/geometries/TeapotGeometry.js +704 -0
  352. package/examples/jsm/geometries/TextGeometry.js +57 -0
  353. package/examples/jsm/helpers/LightProbeHelper.js +130 -0
  354. package/examples/jsm/helpers/OctreeHelper.js +72 -0
  355. package/examples/jsm/helpers/PositionalAudioHelper.js +109 -0
  356. package/examples/jsm/helpers/RectAreaLightHelper.js +85 -0
  357. package/examples/jsm/helpers/VertexNormalsHelper.js +96 -0
  358. package/examples/jsm/helpers/VertexTangentsHelper.js +88 -0
  359. package/examples/jsm/helpers/ViewHelper.js +319 -0
  360. package/examples/jsm/interactive/HTMLMesh.js +550 -0
  361. package/examples/jsm/interactive/InteractiveGroup.js +116 -0
  362. package/examples/jsm/interactive/SelectionBox.js +227 -0
  363. package/examples/jsm/interactive/SelectionHelper.js +97 -0
  364. package/examples/jsm/libs/OimoPhysics/OimoPhysics.js +37071 -0
  365. package/examples/jsm/libs/OimoPhysics/index.js +43 -0
  366. package/examples/jsm/libs/chevrotain.module.min.js +141 -0
  367. package/examples/jsm/libs/ecsy.module.js +1792 -0
  368. package/examples/jsm/libs/fflate.module.js +2474 -0
  369. package/examples/jsm/libs/flow.module.js +4552 -0
  370. package/examples/jsm/libs/ktx-parse.module.js +1 -0
  371. package/examples/jsm/libs/lil-gui.module.min.js +8 -0
  372. package/examples/jsm/libs/meshopt_decoder.module.js +178 -0
  373. package/examples/jsm/libs/mikktspace.module.js +128 -0
  374. package/examples/jsm/libs/mmdparser.module.js +11530 -0
  375. package/examples/jsm/libs/motion-controllers.module.js +397 -0
  376. package/examples/jsm/libs/opentype.module.js +14568 -0
  377. package/examples/jsm/libs/potpack.module.js +125 -0
  378. package/examples/jsm/libs/rhino3dm/rhino3dm.js +21 -0
  379. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +16 -0
  380. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  381. package/examples/jsm/libs/stats.module.js +167 -0
  382. package/examples/jsm/libs/tween.module.min.js +3 -0
  383. package/examples/jsm/libs/utif.module.js +1579 -0
  384. package/examples/jsm/libs/zstddec.module.js +1 -0
  385. package/examples/jsm/lights/LightProbeGenerator.js +250 -0
  386. package/examples/jsm/lights/RectAreaLightUniformsLib.js +79 -0
  387. package/examples/jsm/lines/Line2.js +19 -0
  388. package/examples/jsm/lines/LineGeometry.js +79 -0
  389. package/examples/jsm/lines/LineMaterial.js +702 -0
  390. package/examples/jsm/lines/LineSegments2.js +355 -0
  391. package/examples/jsm/lines/LineSegmentsGeometry.js +241 -0
  392. package/examples/jsm/lines/Wireframe.js +56 -0
  393. package/examples/jsm/lines/WireframeGeometry2.js +24 -0
  394. package/examples/jsm/loaders/3DMLoader.js +1495 -0
  395. package/examples/jsm/loaders/3MFLoader.js +1473 -0
  396. package/examples/jsm/loaders/AMFLoader.js +518 -0
  397. package/examples/jsm/loaders/BVHLoader.js +437 -0
  398. package/examples/jsm/loaders/BasisTextureLoader.js +790 -0
  399. package/examples/jsm/loaders/ColladaLoader.js +4092 -0
  400. package/examples/jsm/loaders/DDSLoader.js +274 -0
  401. package/examples/jsm/loaders/DRACOLoader.js +561 -0
  402. package/examples/jsm/loaders/EXRLoader.js +2310 -0
  403. package/examples/jsm/loaders/FBXLoader.js +4137 -0
  404. package/examples/jsm/loaders/FontLoader.js +183 -0
  405. package/examples/jsm/loaders/GCodeLoader.js +262 -0
  406. package/examples/jsm/loaders/GLTFLoader.js +5221 -0
  407. package/examples/jsm/loaders/HDRCubeTextureLoader.js +115 -0
  408. package/examples/jsm/loaders/IFCLoader.js +2431 -0
  409. package/examples/jsm/loaders/KMZLoader.js +130 -0
  410. package/examples/jsm/loaders/KTX2Loader.js +753 -0
  411. package/examples/jsm/loaders/KTXLoader.js +176 -0
  412. package/examples/jsm/loaders/LDrawLoader.js +2464 -0
  413. package/examples/jsm/loaders/LUT3dlLoader.js +151 -0
  414. package/examples/jsm/loaders/LUTCubeLoader.js +153 -0
  415. package/examples/jsm/loaders/LWOLoader.js +1069 -0
  416. package/examples/jsm/loaders/LogLuvLoader.js +606 -0
  417. package/examples/jsm/loaders/LottieLoader.js +73 -0
  418. package/examples/jsm/loaders/MD2Loader.js +399 -0
  419. package/examples/jsm/loaders/MDDLoader.js +102 -0
  420. package/examples/jsm/loaders/MMDLoader.js +2242 -0
  421. package/examples/jsm/loaders/MTLLoader.js +567 -0
  422. package/examples/jsm/loaders/NRRDLoader.js +671 -0
  423. package/examples/jsm/loaders/OBJLoader.js +905 -0
  424. package/examples/jsm/loaders/PCDLoader.js +453 -0
  425. package/examples/jsm/loaders/PDBLoader.js +227 -0
  426. package/examples/jsm/loaders/PLYLoader.js +564 -0
  427. package/examples/jsm/loaders/PRWMLoader.js +299 -0
  428. package/examples/jsm/loaders/PVRLoader.js +251 -0
  429. package/examples/jsm/loaders/RGBELoader.js +468 -0
  430. package/examples/jsm/loaders/RGBMLoader.js +1065 -0
  431. package/examples/jsm/loaders/STLLoader.js +399 -0
  432. package/examples/jsm/loaders/SVGLoader.js +2950 -0
  433. package/examples/jsm/loaders/TDSLoader.js +1124 -0
  434. package/examples/jsm/loaders/TGALoader.js +517 -0
  435. package/examples/jsm/loaders/TIFFLoader.js +36 -0
  436. package/examples/jsm/loaders/TTFLoader.js +221 -0
  437. package/examples/jsm/loaders/TiltLoader.js +514 -0
  438. package/examples/jsm/loaders/USDZLoader.js +618 -0
  439. package/examples/jsm/loaders/VOXLoader.js +305 -0
  440. package/examples/jsm/loaders/VRMLLoader.js +3493 -0
  441. package/examples/jsm/loaders/VTKLoader.js +1154 -0
  442. package/examples/jsm/loaders/XYZLoader.js +100 -0
  443. package/examples/jsm/loaders/ifc/web-ifc-api.js +47504 -0
  444. package/examples/jsm/loaders/ifc/web-ifc.wasm +0 -0
  445. package/examples/jsm/loaders/lwo/IFFParser.js +1218 -0
  446. package/examples/jsm/loaders/lwo/LWO2Parser.js +414 -0
  447. package/examples/jsm/loaders/lwo/LWO3Parser.js +373 -0
  448. package/examples/jsm/materials/MeshGouraudMaterial.js +423 -0
  449. package/examples/jsm/math/Capsule.js +137 -0
  450. package/examples/jsm/math/ColorConverter.js +36 -0
  451. package/examples/jsm/math/ConvexHull.js +1271 -0
  452. package/examples/jsm/math/ImprovedNoise.js +71 -0
  453. package/examples/jsm/math/Lut.js +203 -0
  454. package/examples/jsm/math/MeshSurfaceSampler.js +211 -0
  455. package/examples/jsm/math/OBB.js +423 -0
  456. package/examples/jsm/math/Octree.js +462 -0
  457. package/examples/jsm/math/SimplexNoise.js +444 -0
  458. package/examples/jsm/misc/ConvexObjectBreaker.js +525 -0
  459. package/examples/jsm/misc/GPUComputationRenderer.js +454 -0
  460. package/examples/jsm/misc/Gyroscope.js +66 -0
  461. package/examples/jsm/misc/MD2Character.js +276 -0
  462. package/examples/jsm/misc/MD2CharacterComplex.js +576 -0
  463. package/examples/jsm/misc/MorphAnimMesh.js +75 -0
  464. package/examples/jsm/misc/MorphBlendMesh.js +322 -0
  465. package/examples/jsm/misc/ProgressiveLightMap.js +321 -0
  466. package/examples/jsm/misc/RollerCoaster.js +560 -0
  467. package/examples/jsm/misc/TubePainter.js +205 -0
  468. package/examples/jsm/misc/Volume.js +460 -0
  469. package/examples/jsm/misc/VolumeSlice.js +227 -0
  470. package/examples/jsm/modifiers/CurveModifier.js +325 -0
  471. package/examples/jsm/modifiers/EdgeSplitModifier.js +279 -0
  472. package/examples/jsm/modifiers/SimplifyModifier.js +525 -0
  473. package/examples/jsm/modifiers/TessellateModifier.js +307 -0
  474. package/examples/jsm/node-editor/NodeEditor.js +857 -0
  475. package/examples/jsm/node-editor/accessors/MatcapUVEditor.js +14 -0
  476. package/examples/jsm/node-editor/accessors/NormalEditor.js +30 -0
  477. package/examples/jsm/node-editor/accessors/PositionEditor.js +30 -0
  478. package/examples/jsm/node-editor/accessors/UVEditor.js +25 -0
  479. package/examples/jsm/node-editor/core/BaseNode.js +96 -0
  480. package/examples/jsm/node-editor/core/DataFile.js +59 -0
  481. package/examples/jsm/node-editor/core/FileEditor.js +20 -0
  482. package/examples/jsm/node-editor/core/FileURLEditor.js +29 -0
  483. package/examples/jsm/node-editor/display/BlendEditor.js +44 -0
  484. package/examples/jsm/node-editor/display/NormalMapEditor.js +49 -0
  485. package/examples/jsm/node-editor/examples/animate-uv.json +1 -0
  486. package/examples/jsm/node-editor/examples/fake-top-light.json +1 -0
  487. package/examples/jsm/node-editor/examples/matcap.json +1 -0
  488. package/examples/jsm/node-editor/examples/oscillator-color.json +1 -0
  489. package/examples/jsm/node-editor/examples/rim.json +1 -0
  490. package/examples/jsm/node-editor/inputs/ColorEditor.js +96 -0
  491. package/examples/jsm/node-editor/inputs/FloatEditor.js +23 -0
  492. package/examples/jsm/node-editor/inputs/SliderEditor.js +67 -0
  493. package/examples/jsm/node-editor/inputs/TextureEditor.js +155 -0
  494. package/examples/jsm/node-editor/inputs/Vector2Editor.js +28 -0
  495. package/examples/jsm/node-editor/inputs/Vector3Editor.js +30 -0
  496. package/examples/jsm/node-editor/inputs/Vector4Editor.js +37 -0
  497. package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +84 -0
  498. package/examples/jsm/node-editor/materials/PointsMaterialEditor.js +102 -0
  499. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +118 -0
  500. package/examples/jsm/node-editor/math/AngleEditor.js +40 -0
  501. package/examples/jsm/node-editor/math/DotEditor.js +35 -0
  502. package/examples/jsm/node-editor/math/InvertEditor.js +39 -0
  503. package/examples/jsm/node-editor/math/LimiterEditor.js +62 -0
  504. package/examples/jsm/node-editor/math/NormalizeEditor.js +28 -0
  505. package/examples/jsm/node-editor/math/OperatorEditor.js +63 -0
  506. package/examples/jsm/node-editor/math/PowerEditor.js +44 -0
  507. package/examples/jsm/node-editor/math/TrigonometryEditor.js +45 -0
  508. package/examples/jsm/node-editor/procedural/CheckerEditor.js +27 -0
  509. package/examples/jsm/node-editor/scene/MeshEditor.js +102 -0
  510. package/examples/jsm/node-editor/scene/Object3DEditor.js +160 -0
  511. package/examples/jsm/node-editor/scene/PointsEditor.js +99 -0
  512. package/examples/jsm/node-editor/utils/JoinEditor.js +58 -0
  513. package/examples/jsm/node-editor/utils/OscillatorEditor.js +43 -0
  514. package/examples/jsm/node-editor/utils/PreviewEditor.js +170 -0
  515. package/examples/jsm/node-editor/utils/SplitEditor.js +39 -0
  516. package/examples/jsm/node-editor/utils/TimerEditor.js +58 -0
  517. package/examples/jsm/nodes/Nodes.js +346 -0
  518. package/examples/jsm/nodes/accessors/BitangentNode.js +62 -0
  519. package/examples/jsm/nodes/accessors/BufferNode.js +24 -0
  520. package/examples/jsm/nodes/accessors/CameraNode.js +67 -0
  521. package/examples/jsm/nodes/accessors/CubeTextureNode.js +107 -0
  522. package/examples/jsm/nodes/accessors/InstanceNode.js +58 -0
  523. package/examples/jsm/nodes/accessors/MaterialNode.js +152 -0
  524. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +23 -0
  525. package/examples/jsm/nodes/accessors/ModelNode.js +21 -0
  526. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +30 -0
  527. package/examples/jsm/nodes/accessors/NormalNode.js +79 -0
  528. package/examples/jsm/nodes/accessors/Object3DNode.js +122 -0
  529. package/examples/jsm/nodes/accessors/PointUVNode.js +21 -0
  530. package/examples/jsm/nodes/accessors/PositionNode.js +83 -0
  531. package/examples/jsm/nodes/accessors/ReferenceNode.js +65 -0
  532. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +31 -0
  533. package/examples/jsm/nodes/accessors/SkinningNode.js +109 -0
  534. package/examples/jsm/nodes/accessors/StorageBufferNode.js +21 -0
  535. package/examples/jsm/nodes/accessors/TangentNode.js +95 -0
  536. package/examples/jsm/nodes/accessors/TextureNode.js +100 -0
  537. package/examples/jsm/nodes/accessors/UVNode.js +41 -0
  538. package/examples/jsm/nodes/accessors/UserDataNode.js +23 -0
  539. package/examples/jsm/nodes/core/ArrayUniformNode.js +23 -0
  540. package/examples/jsm/nodes/core/AttributeNode.js +94 -0
  541. package/examples/jsm/nodes/core/BypassNode.js +38 -0
  542. package/examples/jsm/nodes/core/CodeNode.js +50 -0
  543. package/examples/jsm/nodes/core/ConstNode.js +29 -0
  544. package/examples/jsm/nodes/core/ContextNode.js +52 -0
  545. package/examples/jsm/nodes/core/ExpressionNode.js +32 -0
  546. package/examples/jsm/nodes/core/FunctionCallNode.js +82 -0
  547. package/examples/jsm/nodes/core/FunctionNode.js +105 -0
  548. package/examples/jsm/nodes/core/InputNode.js +62 -0
  549. package/examples/jsm/nodes/core/InstanceIndexNode.js +21 -0
  550. package/examples/jsm/nodes/core/Node.js +354 -0
  551. package/examples/jsm/nodes/core/NodeAttribute.js +14 -0
  552. package/examples/jsm/nodes/core/NodeBuilder.js +815 -0
  553. package/examples/jsm/nodes/core/NodeCode.js +15 -0
  554. package/examples/jsm/nodes/core/NodeFrame.js +59 -0
  555. package/examples/jsm/nodes/core/NodeFunction.js +22 -0
  556. package/examples/jsm/nodes/core/NodeFunctionInput.js +17 -0
  557. package/examples/jsm/nodes/core/NodeKeywords.js +80 -0
  558. package/examples/jsm/nodes/core/NodeParser.js +11 -0
  559. package/examples/jsm/nodes/core/NodeUniform.js +28 -0
  560. package/examples/jsm/nodes/core/NodeUtils.js +125 -0
  561. package/examples/jsm/nodes/core/NodeVar.js +14 -0
  562. package/examples/jsm/nodes/core/NodeVarying.js +14 -0
  563. package/examples/jsm/nodes/core/PropertyNode.js +36 -0
  564. package/examples/jsm/nodes/core/TempNode.js +50 -0
  565. package/examples/jsm/nodes/core/UniformNode.js +46 -0
  566. package/examples/jsm/nodes/core/VarNode.js +97 -0
  567. package/examples/jsm/nodes/core/VaryingNode.js +54 -0
  568. package/examples/jsm/nodes/core/constants.js +21 -0
  569. package/examples/jsm/nodes/display/BlendModeNode.js +85 -0
  570. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +84 -0
  571. package/examples/jsm/nodes/display/ColorSpaceNode.js +95 -0
  572. package/examples/jsm/nodes/display/FrontFacingNode.js +21 -0
  573. package/examples/jsm/nodes/display/NormalMapNode.js +93 -0
  574. package/examples/jsm/nodes/display/ToneMappingNode.js +51 -0
  575. package/examples/jsm/nodes/fog/FogNode.js +31 -0
  576. package/examples/jsm/nodes/fog/FogRangeNode.js +27 -0
  577. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +33 -0
  578. package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +9 -0
  579. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +27 -0
  580. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +18 -0
  581. package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +18 -0
  582. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +18 -0
  583. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +94 -0
  584. package/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +22 -0
  585. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +12 -0
  586. package/examples/jsm/nodes/functions/material/getRoughness.js +18 -0
  587. package/examples/jsm/nodes/geometry/RangeNode.js +109 -0
  588. package/examples/jsm/nodes/gpgpu/ComputeNode.js +65 -0
  589. package/examples/jsm/nodes/lighting/AONode.js +25 -0
  590. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +37 -0
  591. package/examples/jsm/nodes/lighting/EnvironmentNode.js +66 -0
  592. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +50 -0
  593. package/examples/jsm/nodes/lighting/LightingContextNode.js +75 -0
  594. package/examples/jsm/nodes/lighting/LightingNode.js +19 -0
  595. package/examples/jsm/nodes/lighting/LightsNode.js +120 -0
  596. package/examples/jsm/nodes/lighting/PunctualLightNode.js +68 -0
  597. package/examples/jsm/nodes/loaders/NodeLoader.js +107 -0
  598. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +73 -0
  599. package/examples/jsm/nodes/loaders/NodeObjectLoader.js +70 -0
  600. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +46 -0
  601. package/examples/jsm/nodes/materials/Materials.js +53 -0
  602. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +48 -0
  603. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +70 -0
  604. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +168 -0
  605. package/examples/jsm/nodes/materials/NodeMaterial.js +229 -0
  606. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +52 -0
  607. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +106 -0
  608. package/examples/jsm/nodes/materialx/DISCLAIMER.md +199 -0
  609. package/examples/jsm/nodes/materialx/MaterialXNodes.js +55 -0
  610. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +56 -0
  611. package/examples/jsm/nodes/materialx/lib/mx_noise.js +617 -0
  612. package/examples/jsm/nodes/math/CondNode.js +60 -0
  613. package/examples/jsm/nodes/math/MathNode.js +243 -0
  614. package/examples/jsm/nodes/math/OperatorNode.js +214 -0
  615. package/examples/jsm/nodes/parsers/GLSLNodeFunction.js +152 -0
  616. package/examples/jsm/nodes/parsers/GLSLNodeParser.js +14 -0
  617. package/examples/jsm/nodes/parsers/WGSLNodeFunction.js +104 -0
  618. package/examples/jsm/nodes/parsers/WGSLNodeParser.js +14 -0
  619. package/examples/jsm/nodes/procedural/CheckerNode.js +34 -0
  620. package/examples/jsm/nodes/shadernode/ShaderNode.js +264 -0
  621. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +299 -0
  622. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +131 -0
  623. package/examples/jsm/nodes/utils/ArrayElementNode.js +31 -0
  624. package/examples/jsm/nodes/utils/ConvertNode.js +47 -0
  625. package/examples/jsm/nodes/utils/JoinNode.js +42 -0
  626. package/examples/jsm/nodes/utils/MatcapUVNode.js +25 -0
  627. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +33 -0
  628. package/examples/jsm/nodes/utils/OscNode.js +74 -0
  629. package/examples/jsm/nodes/utils/RemapNode.js +34 -0
  630. package/examples/jsm/nodes/utils/RotateUVNode.js +32 -0
  631. package/examples/jsm/nodes/utils/SplitNode.js +102 -0
  632. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +58 -0
  633. package/examples/jsm/nodes/utils/TimerNode.js +84 -0
  634. package/examples/jsm/objects/GroundProjectedEnv.js +186 -0
  635. package/examples/jsm/objects/Lensflare.js +378 -0
  636. package/examples/jsm/objects/LightningStorm.js +245 -0
  637. package/examples/jsm/objects/MarchingCubes.js +1172 -0
  638. package/examples/jsm/objects/Reflector.js +269 -0
  639. package/examples/jsm/objects/ReflectorForSSRPass.js +349 -0
  640. package/examples/jsm/objects/Refractor.js +332 -0
  641. package/examples/jsm/objects/ShadowMesh.js +80 -0
  642. package/examples/jsm/objects/Sky.js +219 -0
  643. package/examples/jsm/objects/Water.js +329 -0
  644. package/examples/jsm/objects/Water2.js +358 -0
  645. package/examples/jsm/offscreen/jank.js +45 -0
  646. package/examples/jsm/offscreen/offscreen.js +8 -0
  647. package/examples/jsm/offscreen/scene.js +86 -0
  648. package/examples/jsm/physics/AmmoPhysics.js +286 -0
  649. package/examples/jsm/physics/OimoPhysics.js +231 -0
  650. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +369 -0
  651. package/examples/jsm/postprocessing/AfterimagePass.js +90 -0
  652. package/examples/jsm/postprocessing/BloomPass.js +150 -0
  653. package/examples/jsm/postprocessing/BokehPass.js +131 -0
  654. package/examples/jsm/postprocessing/ClearPass.js +46 -0
  655. package/examples/jsm/postprocessing/CubeTexturePass.js +78 -0
  656. package/examples/jsm/postprocessing/DotScreenPass.js +58 -0
  657. package/examples/jsm/postprocessing/EffectComposer.js +310 -0
  658. package/examples/jsm/postprocessing/FilmPass.js +59 -0
  659. package/examples/jsm/postprocessing/GlitchPass.js +118 -0
  660. package/examples/jsm/postprocessing/HalftonePass.js +77 -0
  661. package/examples/jsm/postprocessing/LUTPass.js +173 -0
  662. package/examples/jsm/postprocessing/MaskPass.js +101 -0
  663. package/examples/jsm/postprocessing/OutlinePass.js +646 -0
  664. package/examples/jsm/postprocessing/Pass.js +80 -0
  665. package/examples/jsm/postprocessing/RenderPass.js +81 -0
  666. package/examples/jsm/postprocessing/SAOPass.js +413 -0
  667. package/examples/jsm/postprocessing/SMAAPass.js +188 -0
  668. package/examples/jsm/postprocessing/SSAARenderPass.js +224 -0
  669. package/examples/jsm/postprocessing/SSAOPass.js +450 -0
  670. package/examples/jsm/postprocessing/SSRPass.js +645 -0
  671. package/examples/jsm/postprocessing/SavePass.js +62 -0
  672. package/examples/jsm/postprocessing/ShaderPass.js +68 -0
  673. package/examples/jsm/postprocessing/TAARenderPass.js +167 -0
  674. package/examples/jsm/postprocessing/TexturePass.js +60 -0
  675. package/examples/jsm/postprocessing/UnrealBloomPass.js +403 -0
  676. package/examples/jsm/renderers/CSS2DRenderer.js +210 -0
  677. package/examples/jsm/renderers/CSS3DRenderer.js +313 -0
  678. package/examples/jsm/renderers/Projector.js +918 -0
  679. package/examples/jsm/renderers/SVGRenderer.js +553 -0
  680. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +26 -0
  681. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +733 -0
  682. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +49 -0
  683. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +129 -0
  684. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +144 -0
  685. package/examples/jsm/renderers/webgpu/WebGPUBinding.js +22 -0
  686. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +255 -0
  687. package/examples/jsm/renderers/webgpu/WebGPUBuffer.js +43 -0
  688. package/examples/jsm/renderers/webgpu/WebGPUBufferUtils.js +33 -0
  689. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +78 -0
  690. package/examples/jsm/renderers/webgpu/WebGPUGeometries.js +82 -0
  691. package/examples/jsm/renderers/webgpu/WebGPUInfo.js +74 -0
  692. package/examples/jsm/renderers/webgpu/WebGPUObjects.js +36 -0
  693. package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +22 -0
  694. package/examples/jsm/renderers/webgpu/WebGPUProperties.js +38 -0
  695. package/examples/jsm/renderers/webgpu/WebGPURenderLists.js +199 -0
  696. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +735 -0
  697. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +296 -0
  698. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +66 -0
  699. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +969 -0
  700. package/examples/jsm/renderers/webgpu/WebGPUSampledTexture.js +73 -0
  701. package/examples/jsm/renderers/webgpu/WebGPUSampler.js +29 -0
  702. package/examples/jsm/renderers/webgpu/WebGPUStorageBuffer.js +20 -0
  703. package/examples/jsm/renderers/webgpu/WebGPUTextureRenderer.js +40 -0
  704. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +183 -0
  705. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +794 -0
  706. package/examples/jsm/renderers/webgpu/WebGPUUniform.js +136 -0
  707. package/examples/jsm/renderers/webgpu/WebGPUUniformBuffer.js +18 -0
  708. package/examples/jsm/renderers/webgpu/WebGPUUniformsGroup.js +299 -0
  709. package/examples/jsm/renderers/webgpu/WebGPUUtils.js +81 -0
  710. package/examples/jsm/renderers/webgpu/constants.js +261 -0
  711. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +801 -0
  712. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeSampledTexture.js +39 -0
  713. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeSampler.js +21 -0
  714. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeUniform.js +135 -0
  715. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +83 -0
  716. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +87 -0
  717. package/examples/jsm/shaders/AfterimageShader.js +56 -0
  718. package/examples/jsm/shaders/BasicShader.js +27 -0
  719. package/examples/jsm/shaders/BleachBypassShader.js +60 -0
  720. package/examples/jsm/shaders/BlendShader.js +48 -0
  721. package/examples/jsm/shaders/BokehShader.js +143 -0
  722. package/examples/jsm/shaders/BokehShader2.js +390 -0
  723. package/examples/jsm/shaders/BrightnessContrastShader.js +54 -0
  724. package/examples/jsm/shaders/ColorCorrectionShader.js +50 -0
  725. package/examples/jsm/shaders/ColorifyShader.js +49 -0
  726. package/examples/jsm/shaders/ConvolutionShader.js +101 -0
  727. package/examples/jsm/shaders/CopyShader.js +43 -0
  728. package/examples/jsm/shaders/DOFMipMapShader.js +54 -0
  729. package/examples/jsm/shaders/DepthLimitedBlurShader.js +166 -0
  730. package/examples/jsm/shaders/DigitalGlitch.js +101 -0
  731. package/examples/jsm/shaders/DotScreenShader.js +68 -0
  732. package/examples/jsm/shaders/FXAAShader.js +286 -0
  733. package/examples/jsm/shaders/FilmShader.js +100 -0
  734. package/examples/jsm/shaders/FocusShader.js +87 -0
  735. package/examples/jsm/shaders/FreiChenShader.js +94 -0
  736. package/examples/jsm/shaders/GammaCorrectionShader.js +41 -0
  737. package/examples/jsm/shaders/GodRaysShader.js +313 -0
  738. package/examples/jsm/shaders/HalftoneShader.js +310 -0
  739. package/examples/jsm/shaders/HorizontalBlurShader.js +57 -0
  740. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +61 -0
  741. package/examples/jsm/shaders/HueSaturationShader.js +65 -0
  742. package/examples/jsm/shaders/KaleidoShader.js +56 -0
  743. package/examples/jsm/shaders/LuminosityHighPassShader.js +64 -0
  744. package/examples/jsm/shaders/LuminosityShader.js +46 -0
  745. package/examples/jsm/shaders/MMDToonShader.js +123 -0
  746. package/examples/jsm/shaders/MirrorShader.js +54 -0
  747. package/examples/jsm/shaders/NormalMapShader.js +53 -0
  748. package/examples/jsm/shaders/PixelShader.js +44 -0
  749. package/examples/jsm/shaders/RGBShiftShader.js +52 -0
  750. package/examples/jsm/shaders/SAOShader.js +188 -0
  751. package/examples/jsm/shaders/SMAAShader.js +460 -0
  752. package/examples/jsm/shaders/SSAOShader.js +288 -0
  753. package/examples/jsm/shaders/SSRShader.js +364 -0
  754. package/examples/jsm/shaders/SepiaShader.js +50 -0
  755. package/examples/jsm/shaders/SobelOperatorShader.js +90 -0
  756. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +88 -0
  757. package/examples/jsm/shaders/TechnicolorShader.js +43 -0
  758. package/examples/jsm/shaders/ToneMapShader.js +73 -0
  759. package/examples/jsm/shaders/ToonShader.js +318 -0
  760. package/examples/jsm/shaders/TriangleBlurShader.js +72 -0
  761. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +45 -0
  762. package/examples/jsm/shaders/VerticalBlurShader.js +57 -0
  763. package/examples/jsm/shaders/VerticalTiltShiftShader.js +61 -0
  764. package/examples/jsm/shaders/VignetteShader.js +49 -0
  765. package/examples/jsm/shaders/VolumeShader.js +289 -0
  766. package/examples/jsm/shaders/WaterRefractionShader.js +90 -0
  767. package/examples/jsm/textures/FlakesTexture.js +40 -0
  768. package/examples/jsm/utils/BufferGeometryUtils.js +1222 -0
  769. package/examples/jsm/utils/CameraUtils.js +73 -0
  770. package/examples/jsm/utils/GPUStatsPanel.js +128 -0
  771. package/examples/jsm/utils/GeometryCompressionUtils.js +639 -0
  772. package/examples/jsm/utils/GeometryUtils.js +221 -0
  773. package/examples/jsm/utils/LDrawUtils.js +202 -0
  774. package/examples/jsm/utils/PackedPhongMaterial.js +251 -0
  775. package/examples/jsm/utils/SceneUtils.js +125 -0
  776. package/examples/jsm/utils/ShadowMapViewer.js +210 -0
  777. package/examples/jsm/utils/SkeletonUtils.js +596 -0
  778. package/examples/jsm/utils/UVsDebug.js +165 -0
  779. package/examples/jsm/utils/WorkerPool.js +102 -0
  780. package/examples/jsm/webxr/ARButton.js +208 -0
  781. package/examples/jsm/webxr/OculusHandModel.js +108 -0
  782. package/examples/jsm/webxr/OculusHandPointerModel.js +394 -0
  783. package/examples/jsm/webxr/Text2D.js +38 -0
  784. package/examples/jsm/webxr/VRButton.js +201 -0
  785. package/examples/jsm/webxr/XRControllerModelFactory.js +310 -0
  786. package/examples/jsm/webxr/XREstimatedLight.js +223 -0
  787. package/examples/jsm/webxr/XRHandMeshModel.js +108 -0
  788. package/examples/jsm/webxr/XRHandModelFactory.js +105 -0
  789. package/examples/jsm/webxr/XRHandPrimitiveModel.js +103 -0
  790. package/package.json +179 -0
  791. package/src/Three.Legacy.js +320 -0
  792. package/src/Three.js +180 -0
  793. package/src/animation/AnimationAction.js +700 -0
  794. package/src/animation/AnimationClip.js +473 -0
  795. package/src/animation/AnimationMixer.js +770 -0
  796. package/src/animation/AnimationObjectGroup.js +387 -0
  797. package/src/animation/AnimationUtils.js +361 -0
  798. package/src/animation/KeyframeTrack.js +462 -0
  799. package/src/animation/PropertyBinding.js +719 -0
  800. package/src/animation/PropertyMixer.js +318 -0
  801. package/src/animation/tracks/BooleanKeyframeTrack.js +19 -0
  802. package/src/animation/tracks/ColorKeyframeTrack.js +15 -0
  803. package/src/animation/tracks/NumberKeyframeTrack.js +12 -0
  804. package/src/animation/tracks/QuaternionKeyframeTrack.js +23 -0
  805. package/src/animation/tracks/StringKeyframeTrack.js +15 -0
  806. package/src/animation/tracks/VectorKeyframeTrack.js +12 -0
  807. package/src/audio/Audio.js +391 -0
  808. package/src/audio/AudioAnalyser.js +40 -0
  809. package/src/audio/AudioContext.js +25 -0
  810. package/src/audio/AudioListener.js +137 -0
  811. package/src/audio/PositionalAudio.js +138 -0
  812. package/src/cameras/ArrayCamera.js +17 -0
  813. package/src/cameras/Camera.js +68 -0
  814. package/src/cameras/CubeCamera.js +107 -0
  815. package/src/cameras/OrthographicCamera.js +136 -0
  816. package/src/cameras/PerspectiveCamera.js +233 -0
  817. package/src/cameras/StereoCamera.js +100 -0
  818. package/src/constants.js +181 -0
  819. package/src/core/BufferAttribute.js +493 -0
  820. package/src/core/BufferGeometry.js +1092 -0
  821. package/src/core/Clock.js +74 -0
  822. package/src/core/EventDispatcher.js +87 -0
  823. package/src/core/GLBufferAttribute.js +58 -0
  824. package/src/core/InstancedBufferAttribute.js +39 -0
  825. package/src/core/InstancedBufferGeometry.js +46 -0
  826. package/src/core/InstancedInterleavedBuffer.js +48 -0
  827. package/src/core/InterleavedBuffer.js +145 -0
  828. package/src/core/InterleavedBufferAttribute.js +331 -0
  829. package/src/core/Layers.js +60 -0
  830. package/src/core/Object3D.js +944 -0
  831. package/src/core/Raycaster.js +110 -0
  832. package/src/core/Uniform.js +17 -0
  833. package/src/core/UniformsGroup.js +92 -0
  834. package/src/extras/DataUtils.js +170 -0
  835. package/src/extras/Earcut.js +789 -0
  836. package/src/extras/ImageUtils.js +129 -0
  837. package/src/extras/PMREMGenerator.js +900 -0
  838. package/src/extras/ShapeUtils.js +92 -0
  839. package/src/extras/core/Curve.js +416 -0
  840. package/src/extras/core/CurvePath.js +252 -0
  841. package/src/extras/core/Interpolations.js +79 -0
  842. package/src/extras/core/Path.js +196 -0
  843. package/src/extras/core/Shape.js +102 -0
  844. package/src/extras/core/ShapePath.js +291 -0
  845. package/src/extras/curves/ArcCurve.js +17 -0
  846. package/src/extras/curves/CatmullRomCurve3.js +255 -0
  847. package/src/extras/curves/CubicBezierCurve.js +78 -0
  848. package/src/extras/curves/CubicBezierCurve3.js +79 -0
  849. package/src/extras/curves/Curves.js +10 -0
  850. package/src/extras/curves/EllipseCurve.js +156 -0
  851. package/src/extras/curves/LineCurve.js +90 -0
  852. package/src/extras/curves/LineCurve3.js +75 -0
  853. package/src/extras/curves/QuadraticBezierCurve.js +74 -0
  854. package/src/extras/curves/QuadraticBezierCurve3.js +75 -0
  855. package/src/extras/curves/SplineCurve.js +97 -0
  856. package/src/geometries/BoxGeometry.js +170 -0
  857. package/src/geometries/CapsuleGeometry.js +33 -0
  858. package/src/geometries/CircleGeometry.js +91 -0
  859. package/src/geometries/ConeGeometry.js +31 -0
  860. package/src/geometries/CylinderGeometry.js +276 -0
  861. package/src/geometries/DodecahedronGeometry.js +66 -0
  862. package/src/geometries/EdgesGeometry.js +142 -0
  863. package/src/geometries/ExtrudeGeometry.js +804 -0
  864. package/src/geometries/Geometries.js +21 -0
  865. package/src/geometries/IcosahedronGeometry.js +42 -0
  866. package/src/geometries/LatheGeometry.js +179 -0
  867. package/src/geometries/OctahedronGeometry.js +37 -0
  868. package/src/geometries/PlaneGeometry.js +88 -0
  869. package/src/geometries/PolyhedronGeometry.js +309 -0
  870. package/src/geometries/RingGeometry.js +118 -0
  871. package/src/geometries/ShapeGeometry.js +185 -0
  872. package/src/geometries/SphereGeometry.js +127 -0
  873. package/src/geometries/TetrahedronGeometry.js +34 -0
  874. package/src/geometries/TorusGeometry.js +110 -0
  875. package/src/geometries/TorusKnotGeometry.js +157 -0
  876. package/src/geometries/TubeGeometry.js +193 -0
  877. package/src/geometries/WireframeGeometry.js +137 -0
  878. package/src/helpers/ArrowHelper.js +114 -0
  879. package/src/helpers/AxesHelper.js +68 -0
  880. package/src/helpers/Box3Helper.js +56 -0
  881. package/src/helpers/BoxHelper.js +113 -0
  882. package/src/helpers/CameraHelper.js +269 -0
  883. package/src/helpers/DirectionalLightHelper.js +89 -0
  884. package/src/helpers/GridHelper.js +56 -0
  885. package/src/helpers/HemisphereLightHelper.js +85 -0
  886. package/src/helpers/PlaneHelper.js +63 -0
  887. package/src/helpers/PointLightHelper.js +91 -0
  888. package/src/helpers/PolarGridHelper.js +96 -0
  889. package/src/helpers/SkeletonHelper.js +128 -0
  890. package/src/helpers/SpotLightHelper.js +92 -0
  891. package/src/lights/AmbientLight.js +17 -0
  892. package/src/lights/AmbientLightProbe.js +21 -0
  893. package/src/lights/DirectionalLight.js +43 -0
  894. package/src/lights/DirectionalLightShadow.js +16 -0
  895. package/src/lights/HemisphereLight.js +34 -0
  896. package/src/lights/HemisphereLightProbe.js +30 -0
  897. package/src/lights/Light.js +58 -0
  898. package/src/lights/LightProbe.js +47 -0
  899. package/src/lights/LightShadow.js +147 -0
  900. package/src/lights/PointLight.js +57 -0
  901. package/src/lights/PointLightShadow.js +96 -0
  902. package/src/lights/RectAreaLight.js +56 -0
  903. package/src/lights/SpotLight.js +71 -0
  904. package/src/lights/SpotLightShadow.js +50 -0
  905. package/src/loaders/AnimationLoader.js +66 -0
  906. package/src/loaders/AudioLoader.js +60 -0
  907. package/src/loaders/BufferGeometryLoader.js +224 -0
  908. package/src/loaders/Cache.js +42 -0
  909. package/src/loaders/CompressedTextureLoader.js +134 -0
  910. package/src/loaders/CubeTextureLoader.js +56 -0
  911. package/src/loaders/DataTextureLoader.js +114 -0
  912. package/src/loaders/FileLoader.js +281 -0
  913. package/src/loaders/ImageBitmapLoader.js +99 -0
  914. package/src/loaders/ImageLoader.js +91 -0
  915. package/src/loaders/Loader.js +70 -0
  916. package/src/loaders/LoaderUtils.js +75 -0
  917. package/src/loaders/LoadingManager.js +142 -0
  918. package/src/loaders/MaterialLoader.js +355 -0
  919. package/src/loaders/ObjectLoader.js +1081 -0
  920. package/src/loaders/TextureLoader.js +41 -0
  921. package/src/materials/LineBasicMaterial.js +45 -0
  922. package/src/materials/LineDashedMaterial.js +35 -0
  923. package/src/materials/Material.js +493 -0
  924. package/src/materials/Materials.js +39 -0
  925. package/src/materials/MeshBasicMaterial.js +81 -0
  926. package/src/materials/MeshDepthMaterial.js +54 -0
  927. package/src/materials/MeshDistanceMaterial.js +52 -0
  928. package/src/materials/MeshLambertMaterial.js +116 -0
  929. package/src/materials/MeshMatcapMaterial.js +81 -0
  930. package/src/materials/MeshNormalMaterial.js +61 -0
  931. package/src/materials/MeshPhongMaterial.js +120 -0
  932. package/src/materials/MeshPhysicalMaterial.js +198 -0
  933. package/src/materials/MeshStandardMaterial.js +124 -0
  934. package/src/materials/MeshToonMaterial.js +102 -0
  935. package/src/materials/PointsMaterial.js +50 -0
  936. package/src/materials/RawShaderMaterial.js +17 -0
  937. package/src/materials/ShaderMaterial.js +182 -0
  938. package/src/materials/ShadowMaterial.js +37 -0
  939. package/src/materials/SpriteMaterial.js +54 -0
  940. package/src/math/Box2.js +203 -0
  941. package/src/math/Box3.js +532 -0
  942. package/src/math/Color.js +605 -0
  943. package/src/math/ColorManagement.js +74 -0
  944. package/src/math/Cylindrical.js +61 -0
  945. package/src/math/Euler.js +324 -0
  946. package/src/math/Frustum.js +162 -0
  947. package/src/math/Interpolant.js +241 -0
  948. package/src/math/Line3.js +115 -0
  949. package/src/math/MathUtils.js +321 -0
  950. package/src/math/Matrix3.js +333 -0
  951. package/src/math/Matrix4.js +860 -0
  952. package/src/math/Plane.js +205 -0
  953. package/src/math/Quaternion.js +678 -0
  954. package/src/math/Ray.js +496 -0
  955. package/src/math/Sphere.js +250 -0
  956. package/src/math/Spherical.js +86 -0
  957. package/src/math/SphericalHarmonics3.js +243 -0
  958. package/src/math/Triangle.js +299 -0
  959. package/src/math/Vector2.js +464 -0
  960. package/src/math/Vector3.js +715 -0
  961. package/src/math/Vector4.js +644 -0
  962. package/src/math/interpolants/CubicInterpolant.js +151 -0
  963. package/src/math/interpolants/DiscreteInterpolant.js +26 -0
  964. package/src/math/interpolants/LinearInterpolant.js +38 -0
  965. package/src/math/interpolants/QuaternionLinearInterpolant.js +39 -0
  966. package/src/objects/Bone.js +17 -0
  967. package/src/objects/Group.js +17 -0
  968. package/src/objects/InstancedMesh.js +126 -0
  969. package/src/objects/LOD.js +195 -0
  970. package/src/objects/Line.js +222 -0
  971. package/src/objects/LineLoop.js +17 -0
  972. package/src/objects/LineSegments.js +55 -0
  973. package/src/objects/Mesh.js +397 -0
  974. package/src/objects/Points.js +166 -0
  975. package/src/objects/Skeleton.js +281 -0
  976. package/src/objects/SkinnedMesh.js +151 -0
  977. package/src/objects/Sprite.js +181 -0
  978. package/src/renderers/WebGL1Renderer.js +7 -0
  979. package/src/renderers/WebGL3DRenderTarget.js +22 -0
  980. package/src/renderers/WebGLArrayRenderTarget.js +22 -0
  981. package/src/renderers/WebGLCubeRenderTarget.js +146 -0
  982. package/src/renderers/WebGLMultipleRenderTargets.js +82 -0
  983. package/src/renderers/WebGLRenderTarget.js +110 -0
  984. package/src/renderers/WebGLRenderer.js +2280 -0
  985. package/src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js +7 -0
  986. package/src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl.js +7 -0
  987. package/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js +7 -0
  988. package/src/renderers/shaders/ShaderChunk/alphatest_pars_fragment.glsl.js +5 -0
  989. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +18 -0
  990. package/src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl.js +8 -0
  991. package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +3 -0
  992. package/src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl.js +9 -0
  993. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +304 -0
  994. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +42 -0
  995. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +7 -0
  996. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +18 -0
  997. package/src/renderers/shaders/ShaderChunk/clearcoat_pars_fragment.glsl.js +21 -0
  998. package/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js +33 -0
  999. package/src/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl.js +9 -0
  1000. package/src/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl.js +7 -0
  1001. package/src/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl.js +7 -0
  1002. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +11 -0
  1003. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +11 -0
  1004. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +11 -0
  1005. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +23 -0
  1006. package/src/renderers/shaders/ShaderChunk/common.glsl.js +118 -0
  1007. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +191 -0
  1008. package/src/renderers/shaders/ShaderChunk/default_fragment.glsl.js +5 -0
  1009. package/src/renderers/shaders/ShaderChunk/default_vertex.glsl.js +5 -0
  1010. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +36 -0
  1011. package/src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl.js +9 -0
  1012. package/src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl.js +7 -0
  1013. package/src/renderers/shaders/ShaderChunk/dithering_fragment.glsl.js +7 -0
  1014. package/src/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl.js +20 -0
  1015. package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +9 -0
  1016. package/src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl.js +7 -0
  1017. package/src/renderers/shaders/ShaderChunk/encodings_fragment.glsl.js +3 -0
  1018. package/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js +11 -0
  1019. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +14 -0
  1020. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +66 -0
  1021. package/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js +21 -0
  1022. package/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js +22 -0
  1023. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +46 -0
  1024. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +37 -0
  1025. package/src/renderers/shaders/ShaderChunk/fog_fragment.glsl.js +17 -0
  1026. package/src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl.js +19 -0
  1027. package/src/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl.js +7 -0
  1028. package/src/renderers/shaders/ShaderChunk/fog_vertex.glsl.js +7 -0
  1029. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +27 -0
  1030. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +121 -0
  1031. package/src/renderers/shaders/ShaderChunk/iridescence_pars_fragment.glsl.js +14 -0
  1032. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +10 -0
  1033. package/src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl.js +8 -0
  1034. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +199 -0
  1035. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +13 -0
  1036. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +32 -0
  1037. package/src/renderers/shaders/ShaderChunk/lights_lambert_fragment.glsl.js +5 -0
  1038. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +30 -0
  1039. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +223 -0
  1040. package/src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl.js +7 -0
  1041. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +34 -0
  1042. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +120 -0
  1043. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +264 -0
  1044. package/src/renderers/shaders/ShaderChunk/lights_toon_fragment.glsl.js +4 -0
  1045. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +28 -0
  1046. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +9 -0
  1047. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +9 -0
  1048. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +16 -0
  1049. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +22 -0
  1050. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +17 -0
  1051. package/src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl.js +7 -0
  1052. package/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl.js +19 -0
  1053. package/src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl.js +19 -0
  1054. package/src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js +12 -0
  1055. package/src/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl.js +7 -0
  1056. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +24 -0
  1057. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +27 -0
  1058. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +38 -0
  1059. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +36 -0
  1060. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +46 -0
  1061. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +41 -0
  1062. package/src/renderers/shaders/ShaderChunk/normal_pars_fragment.glsl.js +14 -0
  1063. package/src/renderers/shaders/ShaderChunk/normal_pars_vertex.glsl.js +14 -0
  1064. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +14 -0
  1065. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +43 -0
  1066. package/src/renderers/shaders/ShaderChunk/output_fragment.glsl.js +12 -0
  1067. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +54 -0
  1068. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +8 -0
  1069. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +13 -0
  1070. package/src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js +12 -0
  1071. package/src/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl.js +7 -0
  1072. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +321 -0
  1073. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +68 -0
  1074. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +63 -0
  1075. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +66 -0
  1076. package/src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl.js +10 -0
  1077. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +33 -0
  1078. package/src/renderers/shaders/ShaderChunk/skinning_vertex.glsl.js +15 -0
  1079. package/src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl.js +20 -0
  1080. package/src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl.js +14 -0
  1081. package/src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl.js +7 -0
  1082. package/src/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl.js +7 -0
  1083. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +77 -0
  1084. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +36 -0
  1085. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +116 -0
  1086. package/src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl.js +7 -0
  1087. package/src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl.js +10 -0
  1088. package/src/renderers/shaders/ShaderChunk/uv2_vertex.glsl.js +7 -0
  1089. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +7 -0
  1090. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +17 -0
  1091. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +7 -0
  1092. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +15 -0
  1093. package/src/renderers/shaders/ShaderChunk.js +265 -0
  1094. package/src/renderers/shaders/ShaderLib/background.glsl.js +35 -0
  1095. package/src/renderers/shaders/ShaderLib/cube.glsl.js +38 -0
  1096. package/src/renderers/shaders/ShaderLib/depth.glsl.js +92 -0
  1097. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +73 -0
  1098. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +35 -0
  1099. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +70 -0
  1100. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +115 -0
  1101. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +123 -0
  1102. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +107 -0
  1103. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +82 -0
  1104. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +125 -0
  1105. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +216 -0
  1106. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +117 -0
  1107. package/src/renderers/shaders/ShaderLib/points.glsl.js +71 -0
  1108. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +49 -0
  1109. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +79 -0
  1110. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +53 -0
  1111. package/src/renderers/shaders/ShaderLib.js +331 -0
  1112. package/src/renderers/shaders/UniformsLib.js +218 -0
  1113. package/src/renderers/shaders/UniformsUtils.js +80 -0
  1114. package/src/renderers/webgl/WebGLAnimation.js +53 -0
  1115. package/src/renderers/webgl/WebGLAttributes.js +193 -0
  1116. package/src/renderers/webgl/WebGLBackground.js +228 -0
  1117. package/src/renderers/webgl/WebGLBindingStates.js +623 -0
  1118. package/src/renderers/webgl/WebGLBufferRenderer.js +61 -0
  1119. package/src/renderers/webgl/WebGLCapabilities.js +121 -0
  1120. package/src/renderers/webgl/WebGLClipping.js +167 -0
  1121. package/src/renderers/webgl/WebGLCubeMaps.js +99 -0
  1122. package/src/renderers/webgl/WebGLCubeUVMaps.js +130 -0
  1123. package/src/renderers/webgl/WebGLExtensions.js +96 -0
  1124. package/src/renderers/webgl/WebGLGeometries.js +195 -0
  1125. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +71 -0
  1126. package/src/renderers/webgl/WebGLInfo.js +72 -0
  1127. package/src/renderers/webgl/WebGLLights.js +574 -0
  1128. package/src/renderers/webgl/WebGLMaterials.js +677 -0
  1129. package/src/renderers/webgl/WebGLMorphtargets.js +300 -0
  1130. package/src/renderers/webgl/WebGLObjects.js +72 -0
  1131. package/src/renderers/webgl/WebGLProgram.js +901 -0
  1132. package/src/renderers/webgl/WebGLPrograms.js +542 -0
  1133. package/src/renderers/webgl/WebGLProperties.js +48 -0
  1134. package/src/renderers/webgl/WebGLRenderLists.js +238 -0
  1135. package/src/renderers/webgl/WebGLRenderStates.js +107 -0
  1136. package/src/renderers/webgl/WebGLShader.js +12 -0
  1137. package/src/renderers/webgl/WebGLShaderCache.js +124 -0
  1138. package/src/renderers/webgl/WebGLShadowMap.js +374 -0
  1139. package/src/renderers/webgl/WebGLState.js +1263 -0
  1140. package/src/renderers/webgl/WebGLTextures.js +1944 -0
  1141. package/src/renderers/webgl/WebGLUniforms.js +1050 -0
  1142. package/src/renderers/webgl/WebGLUniformsGroups.js +372 -0
  1143. package/src/renderers/webgl/WebGLUtils.js +266 -0
  1144. package/src/renderers/webxr/WebXRController.js +307 -0
  1145. package/src/renderers/webxr/WebXRManager.js +731 -0
  1146. package/src/scenes/Fog.js +37 -0
  1147. package/src/scenes/FogExp2.js +34 -0
  1148. package/src/scenes/Scene.js +71 -0
  1149. package/src/textures/CanvasTexture.js +17 -0
  1150. package/src/textures/CompressedTexture.js +28 -0
  1151. package/src/textures/CubeTexture.js +33 -0
  1152. package/src/textures/Data3DTexture.js +35 -0
  1153. package/src/textures/DataArrayTexture.js +27 -0
  1154. package/src/textures/DataTexture.js +22 -0
  1155. package/src/textures/DepthTexture.js +36 -0
  1156. package/src/textures/FramebufferTexture.js +25 -0
  1157. package/src/textures/Source.js +123 -0
  1158. package/src/textures/Texture.js +308 -0
  1159. package/src/textures/VideoTexture.js +55 -0
  1160. package/src/utils.js +71 -0
@@ -0,0 +1,2950 @@
1
+ import {
2
+ Box2,
3
+ BufferGeometry,
4
+ FileLoader,
5
+ Float32BufferAttribute,
6
+ Loader,
7
+ Matrix3,
8
+ Path,
9
+ Shape,
10
+ ShapePath,
11
+ ShapeUtils,
12
+ Vector2,
13
+ Vector3
14
+ } from 'three';
15
+
16
+ class SVGLoader extends Loader {
17
+
18
+ constructor( manager ) {
19
+
20
+ super( manager );
21
+
22
+ // Default dots per inch
23
+ this.defaultDPI = 90;
24
+
25
+ // Accepted units: 'mm', 'cm', 'in', 'pt', 'pc', 'px'
26
+ this.defaultUnit = 'px';
27
+
28
+ }
29
+
30
+ load( url, onLoad, onProgress, onError ) {
31
+
32
+ const scope = this;
33
+
34
+ const loader = new FileLoader( scope.manager );
35
+ loader.setPath( scope.path );
36
+ loader.setRequestHeader( scope.requestHeader );
37
+ loader.setWithCredentials( scope.withCredentials );
38
+ loader.load( url, function ( text ) {
39
+
40
+ try {
41
+
42
+ onLoad( scope.parse( text ) );
43
+
44
+ } catch ( e ) {
45
+
46
+ if ( onError ) {
47
+
48
+ onError( e );
49
+
50
+ } else {
51
+
52
+ console.error( e );
53
+
54
+ }
55
+
56
+ scope.manager.itemError( url );
57
+
58
+ }
59
+
60
+ }, onProgress, onError );
61
+
62
+ }
63
+
64
+ parse( text ) {
65
+
66
+ const scope = this;
67
+
68
+ function parseNode( node, style ) {
69
+
70
+ if ( node.nodeType !== 1 ) return;
71
+
72
+ const transform = getNodeTransform( node );
73
+
74
+ let isDefsNode = false;
75
+
76
+ let path = null;
77
+
78
+ switch ( node.nodeName ) {
79
+
80
+ case 'svg':
81
+ style = parseStyle( node, style );
82
+ break;
83
+
84
+ case 'style':
85
+ parseCSSStylesheet( node );
86
+ break;
87
+
88
+ case 'g':
89
+ style = parseStyle( node, style );
90
+ break;
91
+
92
+ case 'path':
93
+ style = parseStyle( node, style );
94
+ if ( node.hasAttribute( 'd' ) ) path = parsePathNode( node );
95
+ break;
96
+
97
+ case 'rect':
98
+ style = parseStyle( node, style );
99
+ path = parseRectNode( node );
100
+ break;
101
+
102
+ case 'polygon':
103
+ style = parseStyle( node, style );
104
+ path = parsePolygonNode( node );
105
+ break;
106
+
107
+ case 'polyline':
108
+ style = parseStyle( node, style );
109
+ path = parsePolylineNode( node );
110
+ break;
111
+
112
+ case 'circle':
113
+ style = parseStyle( node, style );
114
+ path = parseCircleNode( node );
115
+ break;
116
+
117
+ case 'ellipse':
118
+ style = parseStyle( node, style );
119
+ path = parseEllipseNode( node );
120
+ break;
121
+
122
+ case 'line':
123
+ style = parseStyle( node, style );
124
+ path = parseLineNode( node );
125
+ break;
126
+
127
+ case 'defs':
128
+ isDefsNode = true;
129
+ break;
130
+
131
+ case 'use':
132
+ style = parseStyle( node, style );
133
+
134
+ const href = node.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ) || '';
135
+ const usedNodeId = href.substring( 1 );
136
+ const usedNode = node.viewportElement.getElementById( usedNodeId );
137
+ if ( usedNode ) {
138
+
139
+ parseNode( usedNode, style );
140
+
141
+ } else {
142
+
143
+ console.warn( 'SVGLoader: \'use node\' references non-existent node id: ' + usedNodeId );
144
+
145
+ }
146
+
147
+ break;
148
+
149
+ default:
150
+ // console.log( node );
151
+
152
+ }
153
+
154
+ if ( path ) {
155
+
156
+ if ( style.fill !== undefined && style.fill !== 'none' ) {
157
+
158
+ path.color.setStyle( style.fill );
159
+
160
+ }
161
+
162
+ transformPath( path, currentTransform );
163
+
164
+ paths.push( path );
165
+
166
+ path.userData = { node: node, style: style };
167
+
168
+ }
169
+
170
+ const childNodes = node.childNodes;
171
+
172
+ for ( let i = 0; i < childNodes.length; i ++ ) {
173
+
174
+ const node = childNodes[ i ];
175
+
176
+ if ( isDefsNode && node.nodeName !== 'style' && node.nodeName !== 'defs' ) {
177
+
178
+ // Ignore everything in defs except CSS style definitions
179
+ // and nested defs, because it is OK by the standard to have
180
+ // <style/> there.
181
+ continue;
182
+
183
+ }
184
+
185
+ parseNode( node, style );
186
+
187
+ }
188
+
189
+
190
+ if ( transform ) {
191
+
192
+ transformStack.pop();
193
+
194
+ if ( transformStack.length > 0 ) {
195
+
196
+ currentTransform.copy( transformStack[ transformStack.length - 1 ] );
197
+
198
+ } else {
199
+
200
+ currentTransform.identity();
201
+
202
+ }
203
+
204
+ }
205
+
206
+ }
207
+
208
+ function parsePathNode( node ) {
209
+
210
+ const path = new ShapePath();
211
+
212
+ const point = new Vector2();
213
+ const control = new Vector2();
214
+
215
+ const firstPoint = new Vector2();
216
+ let isFirstPoint = true;
217
+ let doSetFirstPoint = false;
218
+
219
+ const d = node.getAttribute( 'd' );
220
+
221
+ // console.log( d );
222
+
223
+ const commands = d.match( /[a-df-z][^a-df-z]*/ig );
224
+
225
+ for ( let i = 0, l = commands.length; i < l; i ++ ) {
226
+
227
+ const command = commands[ i ];
228
+
229
+ const type = command.charAt( 0 );
230
+ const data = command.slice( 1 ).trim();
231
+
232
+ if ( isFirstPoint === true ) {
233
+
234
+ doSetFirstPoint = true;
235
+ isFirstPoint = false;
236
+
237
+ }
238
+
239
+ let numbers;
240
+
241
+ switch ( type ) {
242
+
243
+ case 'M':
244
+ numbers = parseFloats( data );
245
+ for ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {
246
+
247
+ point.x = numbers[ j + 0 ];
248
+ point.y = numbers[ j + 1 ];
249
+ control.x = point.x;
250
+ control.y = point.y;
251
+
252
+ if ( j === 0 ) {
253
+
254
+ path.moveTo( point.x, point.y );
255
+
256
+ } else {
257
+
258
+ path.lineTo( point.x, point.y );
259
+
260
+ }
261
+
262
+ if ( j === 0 ) firstPoint.copy( point );
263
+
264
+ }
265
+
266
+ break;
267
+
268
+ case 'H':
269
+ numbers = parseFloats( data );
270
+
271
+ for ( let j = 0, jl = numbers.length; j < jl; j ++ ) {
272
+
273
+ point.x = numbers[ j ];
274
+ control.x = point.x;
275
+ control.y = point.y;
276
+ path.lineTo( point.x, point.y );
277
+
278
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
279
+
280
+ }
281
+
282
+ break;
283
+
284
+ case 'V':
285
+ numbers = parseFloats( data );
286
+
287
+ for ( let j = 0, jl = numbers.length; j < jl; j ++ ) {
288
+
289
+ point.y = numbers[ j ];
290
+ control.x = point.x;
291
+ control.y = point.y;
292
+ path.lineTo( point.x, point.y );
293
+
294
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
295
+
296
+ }
297
+
298
+ break;
299
+
300
+ case 'L':
301
+ numbers = parseFloats( data );
302
+
303
+ for ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {
304
+
305
+ point.x = numbers[ j + 0 ];
306
+ point.y = numbers[ j + 1 ];
307
+ control.x = point.x;
308
+ control.y = point.y;
309
+ path.lineTo( point.x, point.y );
310
+
311
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
312
+
313
+ }
314
+
315
+ break;
316
+
317
+ case 'C':
318
+ numbers = parseFloats( data );
319
+
320
+ for ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {
321
+
322
+ path.bezierCurveTo(
323
+ numbers[ j + 0 ],
324
+ numbers[ j + 1 ],
325
+ numbers[ j + 2 ],
326
+ numbers[ j + 3 ],
327
+ numbers[ j + 4 ],
328
+ numbers[ j + 5 ]
329
+ );
330
+ control.x = numbers[ j + 2 ];
331
+ control.y = numbers[ j + 3 ];
332
+ point.x = numbers[ j + 4 ];
333
+ point.y = numbers[ j + 5 ];
334
+
335
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
336
+
337
+ }
338
+
339
+ break;
340
+
341
+ case 'S':
342
+ numbers = parseFloats( data );
343
+
344
+ for ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {
345
+
346
+ path.bezierCurveTo(
347
+ getReflection( point.x, control.x ),
348
+ getReflection( point.y, control.y ),
349
+ numbers[ j + 0 ],
350
+ numbers[ j + 1 ],
351
+ numbers[ j + 2 ],
352
+ numbers[ j + 3 ]
353
+ );
354
+ control.x = numbers[ j + 0 ];
355
+ control.y = numbers[ j + 1 ];
356
+ point.x = numbers[ j + 2 ];
357
+ point.y = numbers[ j + 3 ];
358
+
359
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
360
+
361
+ }
362
+
363
+ break;
364
+
365
+ case 'Q':
366
+ numbers = parseFloats( data );
367
+
368
+ for ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {
369
+
370
+ path.quadraticCurveTo(
371
+ numbers[ j + 0 ],
372
+ numbers[ j + 1 ],
373
+ numbers[ j + 2 ],
374
+ numbers[ j + 3 ]
375
+ );
376
+ control.x = numbers[ j + 0 ];
377
+ control.y = numbers[ j + 1 ];
378
+ point.x = numbers[ j + 2 ];
379
+ point.y = numbers[ j + 3 ];
380
+
381
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
382
+
383
+ }
384
+
385
+ break;
386
+
387
+ case 'T':
388
+ numbers = parseFloats( data );
389
+
390
+ for ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {
391
+
392
+ const rx = getReflection( point.x, control.x );
393
+ const ry = getReflection( point.y, control.y );
394
+ path.quadraticCurveTo(
395
+ rx,
396
+ ry,
397
+ numbers[ j + 0 ],
398
+ numbers[ j + 1 ]
399
+ );
400
+ control.x = rx;
401
+ control.y = ry;
402
+ point.x = numbers[ j + 0 ];
403
+ point.y = numbers[ j + 1 ];
404
+
405
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
406
+
407
+ }
408
+
409
+ break;
410
+
411
+ case 'A':
412
+ numbers = parseFloats( data, [ 3, 4 ], 7 );
413
+
414
+ for ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {
415
+
416
+ // skip command if start point == end point
417
+ if ( numbers[ j + 5 ] == point.x && numbers[ j + 6 ] == point.y ) continue;
418
+
419
+ const start = point.clone();
420
+ point.x = numbers[ j + 5 ];
421
+ point.y = numbers[ j + 6 ];
422
+ control.x = point.x;
423
+ control.y = point.y;
424
+ parseArcCommand(
425
+ path, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point
426
+ );
427
+
428
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
429
+
430
+ }
431
+
432
+ break;
433
+
434
+ case 'm':
435
+ numbers = parseFloats( data );
436
+
437
+ for ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {
438
+
439
+ point.x += numbers[ j + 0 ];
440
+ point.y += numbers[ j + 1 ];
441
+ control.x = point.x;
442
+ control.y = point.y;
443
+
444
+ if ( j === 0 ) {
445
+
446
+ path.moveTo( point.x, point.y );
447
+
448
+ } else {
449
+
450
+ path.lineTo( point.x, point.y );
451
+
452
+ }
453
+
454
+ if ( j === 0 ) firstPoint.copy( point );
455
+
456
+ }
457
+
458
+ break;
459
+
460
+ case 'h':
461
+ numbers = parseFloats( data );
462
+
463
+ for ( let j = 0, jl = numbers.length; j < jl; j ++ ) {
464
+
465
+ point.x += numbers[ j ];
466
+ control.x = point.x;
467
+ control.y = point.y;
468
+ path.lineTo( point.x, point.y );
469
+
470
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
471
+
472
+ }
473
+
474
+ break;
475
+
476
+ case 'v':
477
+ numbers = parseFloats( data );
478
+
479
+ for ( let j = 0, jl = numbers.length; j < jl; j ++ ) {
480
+
481
+ point.y += numbers[ j ];
482
+ control.x = point.x;
483
+ control.y = point.y;
484
+ path.lineTo( point.x, point.y );
485
+
486
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
487
+
488
+ }
489
+
490
+ break;
491
+
492
+ case 'l':
493
+ numbers = parseFloats( data );
494
+
495
+ for ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {
496
+
497
+ point.x += numbers[ j + 0 ];
498
+ point.y += numbers[ j + 1 ];
499
+ control.x = point.x;
500
+ control.y = point.y;
501
+ path.lineTo( point.x, point.y );
502
+
503
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
504
+
505
+ }
506
+
507
+ break;
508
+
509
+ case 'c':
510
+ numbers = parseFloats( data );
511
+
512
+ for ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {
513
+
514
+ path.bezierCurveTo(
515
+ point.x + numbers[ j + 0 ],
516
+ point.y + numbers[ j + 1 ],
517
+ point.x + numbers[ j + 2 ],
518
+ point.y + numbers[ j + 3 ],
519
+ point.x + numbers[ j + 4 ],
520
+ point.y + numbers[ j + 5 ]
521
+ );
522
+ control.x = point.x + numbers[ j + 2 ];
523
+ control.y = point.y + numbers[ j + 3 ];
524
+ point.x += numbers[ j + 4 ];
525
+ point.y += numbers[ j + 5 ];
526
+
527
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
528
+
529
+ }
530
+
531
+ break;
532
+
533
+ case 's':
534
+ numbers = parseFloats( data );
535
+
536
+ for ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {
537
+
538
+ path.bezierCurveTo(
539
+ getReflection( point.x, control.x ),
540
+ getReflection( point.y, control.y ),
541
+ point.x + numbers[ j + 0 ],
542
+ point.y + numbers[ j + 1 ],
543
+ point.x + numbers[ j + 2 ],
544
+ point.y + numbers[ j + 3 ]
545
+ );
546
+ control.x = point.x + numbers[ j + 0 ];
547
+ control.y = point.y + numbers[ j + 1 ];
548
+ point.x += numbers[ j + 2 ];
549
+ point.y += numbers[ j + 3 ];
550
+
551
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
552
+
553
+ }
554
+
555
+ break;
556
+
557
+ case 'q':
558
+ numbers = parseFloats( data );
559
+
560
+ for ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {
561
+
562
+ path.quadraticCurveTo(
563
+ point.x + numbers[ j + 0 ],
564
+ point.y + numbers[ j + 1 ],
565
+ point.x + numbers[ j + 2 ],
566
+ point.y + numbers[ j + 3 ]
567
+ );
568
+ control.x = point.x + numbers[ j + 0 ];
569
+ control.y = point.y + numbers[ j + 1 ];
570
+ point.x += numbers[ j + 2 ];
571
+ point.y += numbers[ j + 3 ];
572
+
573
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
574
+
575
+ }
576
+
577
+ break;
578
+
579
+ case 't':
580
+ numbers = parseFloats( data );
581
+
582
+ for ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {
583
+
584
+ const rx = getReflection( point.x, control.x );
585
+ const ry = getReflection( point.y, control.y );
586
+ path.quadraticCurveTo(
587
+ rx,
588
+ ry,
589
+ point.x + numbers[ j + 0 ],
590
+ point.y + numbers[ j + 1 ]
591
+ );
592
+ control.x = rx;
593
+ control.y = ry;
594
+ point.x = point.x + numbers[ j + 0 ];
595
+ point.y = point.y + numbers[ j + 1 ];
596
+
597
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
598
+
599
+ }
600
+
601
+ break;
602
+
603
+ case 'a':
604
+ numbers = parseFloats( data, [ 3, 4 ], 7 );
605
+
606
+ for ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {
607
+
608
+ // skip command if no displacement
609
+ if ( numbers[ j + 5 ] == 0 && numbers[ j + 6 ] == 0 ) continue;
610
+
611
+ const start = point.clone();
612
+ point.x += numbers[ j + 5 ];
613
+ point.y += numbers[ j + 6 ];
614
+ control.x = point.x;
615
+ control.y = point.y;
616
+ parseArcCommand(
617
+ path, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point
618
+ );
619
+
620
+ if ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );
621
+
622
+ }
623
+
624
+ break;
625
+
626
+ case 'Z':
627
+ case 'z':
628
+ path.currentPath.autoClose = true;
629
+
630
+ if ( path.currentPath.curves.length > 0 ) {
631
+
632
+ // Reset point to beginning of Path
633
+ point.copy( firstPoint );
634
+ path.currentPath.currentPoint.copy( point );
635
+ isFirstPoint = true;
636
+
637
+ }
638
+
639
+ break;
640
+
641
+ default:
642
+ console.warn( command );
643
+
644
+ }
645
+
646
+ // console.log( type, parseFloats( data ), parseFloats( data ).length )
647
+
648
+ doSetFirstPoint = false;
649
+
650
+ }
651
+
652
+ return path;
653
+
654
+ }
655
+
656
+ function parseCSSStylesheet( node ) {
657
+
658
+ if ( ! node.sheet || ! node.sheet.cssRules || ! node.sheet.cssRules.length ) return;
659
+
660
+ for ( let i = 0; i < node.sheet.cssRules.length; i ++ ) {
661
+
662
+ const stylesheet = node.sheet.cssRules[ i ];
663
+
664
+ if ( stylesheet.type !== 1 ) continue;
665
+
666
+ const selectorList = stylesheet.selectorText
667
+ .split( /,/gm )
668
+ .filter( Boolean )
669
+ .map( i => i.trim() );
670
+
671
+ for ( let j = 0; j < selectorList.length; j ++ ) {
672
+
673
+ // Remove empty rules
674
+ const definitions = Object.fromEntries(
675
+ Object.entries( stylesheet.style ).filter( ( [ , v ] ) => v !== '' )
676
+ );
677
+
678
+ stylesheets[ selectorList[ j ] ] = Object.assign(
679
+ stylesheets[ selectorList[ j ] ] || {},
680
+ definitions
681
+ );
682
+
683
+ }
684
+
685
+ }
686
+
687
+ }
688
+
689
+ /**
690
+ * https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
691
+ * https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion
692
+ * From
693
+ * rx ry x-axis-rotation large-arc-flag sweep-flag x y
694
+ * To
695
+ * aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation
696
+ */
697
+
698
+ function parseArcCommand( path, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, start, end ) {
699
+
700
+ if ( rx == 0 || ry == 0 ) {
701
+
702
+ // draw a line if either of the radii == 0
703
+ path.lineTo( end.x, end.y );
704
+ return;
705
+
706
+ }
707
+
708
+ x_axis_rotation = x_axis_rotation * Math.PI / 180;
709
+
710
+ // Ensure radii are positive
711
+ rx = Math.abs( rx );
712
+ ry = Math.abs( ry );
713
+
714
+ // Compute (x1', y1')
715
+ const dx2 = ( start.x - end.x ) / 2.0;
716
+ const dy2 = ( start.y - end.y ) / 2.0;
717
+ const x1p = Math.cos( x_axis_rotation ) * dx2 + Math.sin( x_axis_rotation ) * dy2;
718
+ const y1p = - Math.sin( x_axis_rotation ) * dx2 + Math.cos( x_axis_rotation ) * dy2;
719
+
720
+ // Compute (cx', cy')
721
+ let rxs = rx * rx;
722
+ let rys = ry * ry;
723
+ const x1ps = x1p * x1p;
724
+ const y1ps = y1p * y1p;
725
+
726
+ // Ensure radii are large enough
727
+ const cr = x1ps / rxs + y1ps / rys;
728
+
729
+ if ( cr > 1 ) {
730
+
731
+ // scale up rx,ry equally so cr == 1
732
+ const s = Math.sqrt( cr );
733
+ rx = s * rx;
734
+ ry = s * ry;
735
+ rxs = rx * rx;
736
+ rys = ry * ry;
737
+
738
+ }
739
+
740
+ const dq = ( rxs * y1ps + rys * x1ps );
741
+ const pq = ( rxs * rys - dq ) / dq;
742
+ let q = Math.sqrt( Math.max( 0, pq ) );
743
+ if ( large_arc_flag === sweep_flag ) q = - q;
744
+ const cxp = q * rx * y1p / ry;
745
+ const cyp = - q * ry * x1p / rx;
746
+
747
+ // Step 3: Compute (cx, cy) from (cx', cy')
748
+ const cx = Math.cos( x_axis_rotation ) * cxp - Math.sin( x_axis_rotation ) * cyp + ( start.x + end.x ) / 2;
749
+ const cy = Math.sin( x_axis_rotation ) * cxp + Math.cos( x_axis_rotation ) * cyp + ( start.y + end.y ) / 2;
750
+
751
+ // Step 4: Compute θ1 and Δθ
752
+ const theta = svgAngle( 1, 0, ( x1p - cxp ) / rx, ( y1p - cyp ) / ry );
753
+ const delta = svgAngle( ( x1p - cxp ) / rx, ( y1p - cyp ) / ry, ( - x1p - cxp ) / rx, ( - y1p - cyp ) / ry ) % ( Math.PI * 2 );
754
+
755
+ path.currentPath.absellipse( cx, cy, rx, ry, theta, theta + delta, sweep_flag === 0, x_axis_rotation );
756
+
757
+ }
758
+
759
+ function svgAngle( ux, uy, vx, vy ) {
760
+
761
+ const dot = ux * vx + uy * vy;
762
+ const len = Math.sqrt( ux * ux + uy * uy ) * Math.sqrt( vx * vx + vy * vy );
763
+ let ang = Math.acos( Math.max( - 1, Math.min( 1, dot / len ) ) ); // floating point precision, slightly over values appear
764
+ if ( ( ux * vy - uy * vx ) < 0 ) ang = - ang;
765
+ return ang;
766
+
767
+ }
768
+
769
+ /*
770
+ * According to https://www.w3.org/TR/SVG/shapes.html#RectElementRXAttribute
771
+ * rounded corner should be rendered to elliptical arc, but bezier curve does the job well enough
772
+ */
773
+ function parseRectNode( node ) {
774
+
775
+ const x = parseFloatWithUnits( node.getAttribute( 'x' ) || 0 );
776
+ const y = parseFloatWithUnits( node.getAttribute( 'y' ) || 0 );
777
+ const rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || node.getAttribute( 'ry' ) || 0 );
778
+ const ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || node.getAttribute( 'rx' ) || 0 );
779
+ const w = parseFloatWithUnits( node.getAttribute( 'width' ) );
780
+ const h = parseFloatWithUnits( node.getAttribute( 'height' ) );
781
+
782
+ // Ellipse arc to Bezier approximation Coefficient (Inversed). See:
783
+ // https://spencermortensen.com/articles/bezier-circle/
784
+ const bci = 1 - 0.551915024494;
785
+
786
+ const path = new ShapePath();
787
+
788
+ // top left
789
+ path.moveTo( x + rx, y );
790
+
791
+ // top right
792
+ path.lineTo( x + w - rx, y );
793
+ if ( rx !== 0 || ry !== 0 ) {
794
+
795
+ path.bezierCurveTo(
796
+ x + w - rx * bci,
797
+ y,
798
+ x + w,
799
+ y + ry * bci,
800
+ x + w,
801
+ y + ry
802
+ );
803
+
804
+ }
805
+
806
+ // bottom right
807
+ path.lineTo( x + w, y + h - ry );
808
+ if ( rx !== 0 || ry !== 0 ) {
809
+
810
+ path.bezierCurveTo(
811
+ x + w,
812
+ y + h - ry * bci,
813
+ x + w - rx * bci,
814
+ y + h,
815
+ x + w - rx,
816
+ y + h
817
+ );
818
+
819
+ }
820
+
821
+ // bottom left
822
+ path.lineTo( x + rx, y + h );
823
+ if ( rx !== 0 || ry !== 0 ) {
824
+
825
+ path.bezierCurveTo(
826
+ x + rx * bci,
827
+ y + h,
828
+ x,
829
+ y + h - ry * bci,
830
+ x,
831
+ y + h - ry
832
+ );
833
+
834
+ }
835
+
836
+ // back to top left
837
+ path.lineTo( x, y + ry );
838
+ if ( rx !== 0 || ry !== 0 ) {
839
+
840
+ path.bezierCurveTo( x, y + ry * bci, x + rx * bci, y, x + rx, y );
841
+
842
+ }
843
+
844
+ return path;
845
+
846
+ }
847
+
848
+ function parsePolygonNode( node ) {
849
+
850
+ function iterator( match, a, b ) {
851
+
852
+ const x = parseFloatWithUnits( a );
853
+ const y = parseFloatWithUnits( b );
854
+
855
+ if ( index === 0 ) {
856
+
857
+ path.moveTo( x, y );
858
+
859
+ } else {
860
+
861
+ path.lineTo( x, y );
862
+
863
+ }
864
+
865
+ index ++;
866
+
867
+ }
868
+
869
+ const regex = /(-?[\d\.?]+)[,|\s](-?[\d\.?]+)/g;
870
+
871
+ const path = new ShapePath();
872
+
873
+ let index = 0;
874
+
875
+ node.getAttribute( 'points' ).replace( regex, iterator );
876
+
877
+ path.currentPath.autoClose = true;
878
+
879
+ return path;
880
+
881
+ }
882
+
883
+ function parsePolylineNode( node ) {
884
+
885
+ function iterator( match, a, b ) {
886
+
887
+ const x = parseFloatWithUnits( a );
888
+ const y = parseFloatWithUnits( b );
889
+
890
+ if ( index === 0 ) {
891
+
892
+ path.moveTo( x, y );
893
+
894
+ } else {
895
+
896
+ path.lineTo( x, y );
897
+
898
+ }
899
+
900
+ index ++;
901
+
902
+ }
903
+
904
+ const regex = /(-?[\d\.?]+)[,|\s](-?[\d\.?]+)/g;
905
+
906
+ const path = new ShapePath();
907
+
908
+ let index = 0;
909
+
910
+ node.getAttribute( 'points' ).replace( regex, iterator );
911
+
912
+ path.currentPath.autoClose = false;
913
+
914
+ return path;
915
+
916
+ }
917
+
918
+ function parseCircleNode( node ) {
919
+
920
+ const x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );
921
+ const y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );
922
+ const r = parseFloatWithUnits( node.getAttribute( 'r' ) || 0 );
923
+
924
+ const subpath = new Path();
925
+ subpath.absarc( x, y, r, 0, Math.PI * 2 );
926
+
927
+ const path = new ShapePath();
928
+ path.subPaths.push( subpath );
929
+
930
+ return path;
931
+
932
+ }
933
+
934
+ function parseEllipseNode( node ) {
935
+
936
+ const x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );
937
+ const y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );
938
+ const rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || 0 );
939
+ const ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || 0 );
940
+
941
+ const subpath = new Path();
942
+ subpath.absellipse( x, y, rx, ry, 0, Math.PI * 2 );
943
+
944
+ const path = new ShapePath();
945
+ path.subPaths.push( subpath );
946
+
947
+ return path;
948
+
949
+ }
950
+
951
+ function parseLineNode( node ) {
952
+
953
+ const x1 = parseFloatWithUnits( node.getAttribute( 'x1' ) || 0 );
954
+ const y1 = parseFloatWithUnits( node.getAttribute( 'y1' ) || 0 );
955
+ const x2 = parseFloatWithUnits( node.getAttribute( 'x2' ) || 0 );
956
+ const y2 = parseFloatWithUnits( node.getAttribute( 'y2' ) || 0 );
957
+
958
+ const path = new ShapePath();
959
+ path.moveTo( x1, y1 );
960
+ path.lineTo( x2, y2 );
961
+ path.currentPath.autoClose = false;
962
+
963
+ return path;
964
+
965
+ }
966
+
967
+ //
968
+
969
+ function parseStyle( node, style ) {
970
+
971
+ style = Object.assign( {}, style ); // clone style
972
+
973
+ let stylesheetStyles = {};
974
+
975
+ if ( node.hasAttribute( 'class' ) ) {
976
+
977
+ const classSelectors = node.getAttribute( 'class' )
978
+ .split( /\s/ )
979
+ .filter( Boolean )
980
+ .map( i => i.trim() );
981
+
982
+ for ( let i = 0; i < classSelectors.length; i ++ ) {
983
+
984
+ stylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '.' + classSelectors[ i ] ] );
985
+
986
+ }
987
+
988
+ }
989
+
990
+ if ( node.hasAttribute( 'id' ) ) {
991
+
992
+ stylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '#' + node.getAttribute( 'id' ) ] );
993
+
994
+ }
995
+
996
+ function addStyle( svgName, jsName, adjustFunction ) {
997
+
998
+ if ( adjustFunction === undefined ) adjustFunction = function copy( v ) {
999
+
1000
+ if ( v.startsWith( 'url' ) ) console.warn( 'SVGLoader: url access in attributes is not implemented.' );
1001
+
1002
+ return v;
1003
+
1004
+ };
1005
+
1006
+ if ( node.hasAttribute( svgName ) ) style[ jsName ] = adjustFunction( node.getAttribute( svgName ) );
1007
+ if ( stylesheetStyles[ svgName ] ) style[ jsName ] = adjustFunction( stylesheetStyles[ svgName ] );
1008
+ if ( node.style && node.style[ svgName ] !== '' ) style[ jsName ] = adjustFunction( node.style[ svgName ] );
1009
+
1010
+ }
1011
+
1012
+ function clamp( v ) {
1013
+
1014
+ return Math.max( 0, Math.min( 1, parseFloatWithUnits( v ) ) );
1015
+
1016
+ }
1017
+
1018
+ function positive( v ) {
1019
+
1020
+ return Math.max( 0, parseFloatWithUnits( v ) );
1021
+
1022
+ }
1023
+
1024
+ addStyle( 'fill', 'fill' );
1025
+ addStyle( 'fill-opacity', 'fillOpacity', clamp );
1026
+ addStyle( 'fill-rule', 'fillRule' );
1027
+ addStyle( 'opacity', 'opacity', clamp );
1028
+ addStyle( 'stroke', 'stroke' );
1029
+ addStyle( 'stroke-opacity', 'strokeOpacity', clamp );
1030
+ addStyle( 'stroke-width', 'strokeWidth', positive );
1031
+ addStyle( 'stroke-linejoin', 'strokeLineJoin' );
1032
+ addStyle( 'stroke-linecap', 'strokeLineCap' );
1033
+ addStyle( 'stroke-miterlimit', 'strokeMiterLimit', positive );
1034
+ addStyle( 'visibility', 'visibility' );
1035
+
1036
+ return style;
1037
+
1038
+ }
1039
+
1040
+ // http://www.w3.org/TR/SVG11/implnote.html#PathElementImplementationNotes
1041
+
1042
+ function getReflection( a, b ) {
1043
+
1044
+ return a - ( b - a );
1045
+
1046
+ }
1047
+
1048
+ // from https://github.com/ppvg/svg-numbers (MIT License)
1049
+
1050
+ function parseFloats( input, flags, stride ) {
1051
+
1052
+ if ( typeof input !== 'string' ) {
1053
+
1054
+ throw new TypeError( 'Invalid input: ' + typeof input );
1055
+
1056
+ }
1057
+
1058
+ // Character groups
1059
+ const RE = {
1060
+ SEPARATOR: /[ \t\r\n\,.\-+]/,
1061
+ WHITESPACE: /[ \t\r\n]/,
1062
+ DIGIT: /[\d]/,
1063
+ SIGN: /[-+]/,
1064
+ POINT: /\./,
1065
+ COMMA: /,/,
1066
+ EXP: /e/i,
1067
+ FLAGS: /[01]/
1068
+ };
1069
+
1070
+ // States
1071
+ const SEP = 0;
1072
+ const INT = 1;
1073
+ const FLOAT = 2;
1074
+ const EXP = 3;
1075
+
1076
+ let state = SEP;
1077
+ let seenComma = true;
1078
+ let number = '', exponent = '';
1079
+ const result = [];
1080
+
1081
+ function throwSyntaxError( current, i, partial ) {
1082
+
1083
+ const error = new SyntaxError( 'Unexpected character "' + current + '" at index ' + i + '.' );
1084
+ error.partial = partial;
1085
+ throw error;
1086
+
1087
+ }
1088
+
1089
+ function newNumber() {
1090
+
1091
+ if ( number !== '' ) {
1092
+
1093
+ if ( exponent === '' ) result.push( Number( number ) );
1094
+ else result.push( Number( number ) * Math.pow( 10, Number( exponent ) ) );
1095
+
1096
+ }
1097
+
1098
+ number = '';
1099
+ exponent = '';
1100
+
1101
+ }
1102
+
1103
+ let current;
1104
+ const length = input.length;
1105
+
1106
+ for ( let i = 0; i < length; i ++ ) {
1107
+
1108
+ current = input[ i ];
1109
+
1110
+ // check for flags
1111
+ if ( Array.isArray( flags ) && flags.includes( result.length % stride ) && RE.FLAGS.test( current ) ) {
1112
+
1113
+ state = INT;
1114
+ number = current;
1115
+ newNumber();
1116
+ continue;
1117
+
1118
+ }
1119
+
1120
+ // parse until next number
1121
+ if ( state === SEP ) {
1122
+
1123
+ // eat whitespace
1124
+ if ( RE.WHITESPACE.test( current ) ) {
1125
+
1126
+ continue;
1127
+
1128
+ }
1129
+
1130
+ // start new number
1131
+ if ( RE.DIGIT.test( current ) || RE.SIGN.test( current ) ) {
1132
+
1133
+ state = INT;
1134
+ number = current;
1135
+ continue;
1136
+
1137
+ }
1138
+
1139
+ if ( RE.POINT.test( current ) ) {
1140
+
1141
+ state = FLOAT;
1142
+ number = current;
1143
+ continue;
1144
+
1145
+ }
1146
+
1147
+ // throw on double commas (e.g. "1, , 2")
1148
+ if ( RE.COMMA.test( current ) ) {
1149
+
1150
+ if ( seenComma ) {
1151
+
1152
+ throwSyntaxError( current, i, result );
1153
+
1154
+ }
1155
+
1156
+ seenComma = true;
1157
+
1158
+ }
1159
+
1160
+ }
1161
+
1162
+ // parse integer part
1163
+ if ( state === INT ) {
1164
+
1165
+ if ( RE.DIGIT.test( current ) ) {
1166
+
1167
+ number += current;
1168
+ continue;
1169
+
1170
+ }
1171
+
1172
+ if ( RE.POINT.test( current ) ) {
1173
+
1174
+ number += current;
1175
+ state = FLOAT;
1176
+ continue;
1177
+
1178
+ }
1179
+
1180
+ if ( RE.EXP.test( current ) ) {
1181
+
1182
+ state = EXP;
1183
+ continue;
1184
+
1185
+ }
1186
+
1187
+ // throw on double signs ("-+1"), but not on sign as separator ("-1-2")
1188
+ if ( RE.SIGN.test( current )
1189
+ && number.length === 1
1190
+ && RE.SIGN.test( number[ 0 ] ) ) {
1191
+
1192
+ throwSyntaxError( current, i, result );
1193
+
1194
+ }
1195
+
1196
+ }
1197
+
1198
+ // parse decimal part
1199
+ if ( state === FLOAT ) {
1200
+
1201
+ if ( RE.DIGIT.test( current ) ) {
1202
+
1203
+ number += current;
1204
+ continue;
1205
+
1206
+ }
1207
+
1208
+ if ( RE.EXP.test( current ) ) {
1209
+
1210
+ state = EXP;
1211
+ continue;
1212
+
1213
+ }
1214
+
1215
+ // throw on double decimal points (e.g. "1..2")
1216
+ if ( RE.POINT.test( current ) && number[ number.length - 1 ] === '.' ) {
1217
+
1218
+ throwSyntaxError( current, i, result );
1219
+
1220
+ }
1221
+
1222
+ }
1223
+
1224
+ // parse exponent part
1225
+ if ( state === EXP ) {
1226
+
1227
+ if ( RE.DIGIT.test( current ) ) {
1228
+
1229
+ exponent += current;
1230
+ continue;
1231
+
1232
+ }
1233
+
1234
+ if ( RE.SIGN.test( current ) ) {
1235
+
1236
+ if ( exponent === '' ) {
1237
+
1238
+ exponent += current;
1239
+ continue;
1240
+
1241
+ }
1242
+
1243
+ if ( exponent.length === 1 && RE.SIGN.test( exponent ) ) {
1244
+
1245
+ throwSyntaxError( current, i, result );
1246
+
1247
+ }
1248
+
1249
+ }
1250
+
1251
+ }
1252
+
1253
+
1254
+ // end of number
1255
+ if ( RE.WHITESPACE.test( current ) ) {
1256
+
1257
+ newNumber();
1258
+ state = SEP;
1259
+ seenComma = false;
1260
+
1261
+ } else if ( RE.COMMA.test( current ) ) {
1262
+
1263
+ newNumber();
1264
+ state = SEP;
1265
+ seenComma = true;
1266
+
1267
+ } else if ( RE.SIGN.test( current ) ) {
1268
+
1269
+ newNumber();
1270
+ state = INT;
1271
+ number = current;
1272
+
1273
+ } else if ( RE.POINT.test( current ) ) {
1274
+
1275
+ newNumber();
1276
+ state = FLOAT;
1277
+ number = current;
1278
+
1279
+ } else {
1280
+
1281
+ throwSyntaxError( current, i, result );
1282
+
1283
+ }
1284
+
1285
+ }
1286
+
1287
+ // add the last number found (if any)
1288
+ newNumber();
1289
+
1290
+ return result;
1291
+
1292
+ }
1293
+
1294
+ // Units
1295
+
1296
+ const units = [ 'mm', 'cm', 'in', 'pt', 'pc', 'px' ];
1297
+
1298
+ // Conversion: [ fromUnit ][ toUnit ] (-1 means dpi dependent)
1299
+ const unitConversion = {
1300
+
1301
+ 'mm': {
1302
+ 'mm': 1,
1303
+ 'cm': 0.1,
1304
+ 'in': 1 / 25.4,
1305
+ 'pt': 72 / 25.4,
1306
+ 'pc': 6 / 25.4,
1307
+ 'px': - 1
1308
+ },
1309
+ 'cm': {
1310
+ 'mm': 10,
1311
+ 'cm': 1,
1312
+ 'in': 1 / 2.54,
1313
+ 'pt': 72 / 2.54,
1314
+ 'pc': 6 / 2.54,
1315
+ 'px': - 1
1316
+ },
1317
+ 'in': {
1318
+ 'mm': 25.4,
1319
+ 'cm': 2.54,
1320
+ 'in': 1,
1321
+ 'pt': 72,
1322
+ 'pc': 6,
1323
+ 'px': - 1
1324
+ },
1325
+ 'pt': {
1326
+ 'mm': 25.4 / 72,
1327
+ 'cm': 2.54 / 72,
1328
+ 'in': 1 / 72,
1329
+ 'pt': 1,
1330
+ 'pc': 6 / 72,
1331
+ 'px': - 1
1332
+ },
1333
+ 'pc': {
1334
+ 'mm': 25.4 / 6,
1335
+ 'cm': 2.54 / 6,
1336
+ 'in': 1 / 6,
1337
+ 'pt': 72 / 6,
1338
+ 'pc': 1,
1339
+ 'px': - 1
1340
+ },
1341
+ 'px': {
1342
+ 'px': 1
1343
+ }
1344
+
1345
+ };
1346
+
1347
+ function parseFloatWithUnits( string ) {
1348
+
1349
+ let theUnit = 'px';
1350
+
1351
+ if ( typeof string === 'string' || string instanceof String ) {
1352
+
1353
+ for ( let i = 0, n = units.length; i < n; i ++ ) {
1354
+
1355
+ const u = units[ i ];
1356
+
1357
+ if ( string.endsWith( u ) ) {
1358
+
1359
+ theUnit = u;
1360
+ string = string.substring( 0, string.length - u.length );
1361
+ break;
1362
+
1363
+ }
1364
+
1365
+ }
1366
+
1367
+ }
1368
+
1369
+ let scale = undefined;
1370
+
1371
+ if ( theUnit === 'px' && scope.defaultUnit !== 'px' ) {
1372
+
1373
+ // Conversion scale from pixels to inches, then to default units
1374
+
1375
+ scale = unitConversion[ 'in' ][ scope.defaultUnit ] / scope.defaultDPI;
1376
+
1377
+ } else {
1378
+
1379
+ scale = unitConversion[ theUnit ][ scope.defaultUnit ];
1380
+
1381
+ if ( scale < 0 ) {
1382
+
1383
+ // Conversion scale to pixels
1384
+
1385
+ scale = unitConversion[ theUnit ][ 'in' ] * scope.defaultDPI;
1386
+
1387
+ }
1388
+
1389
+ }
1390
+
1391
+ return scale * parseFloat( string );
1392
+
1393
+ }
1394
+
1395
+ // Transforms
1396
+
1397
+ function getNodeTransform( node ) {
1398
+
1399
+ if ( ! ( node.hasAttribute( 'transform' ) || ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) ) ) {
1400
+
1401
+ return null;
1402
+
1403
+ }
1404
+
1405
+ const transform = parseNodeTransform( node );
1406
+
1407
+ if ( transformStack.length > 0 ) {
1408
+
1409
+ transform.premultiply( transformStack[ transformStack.length - 1 ] );
1410
+
1411
+ }
1412
+
1413
+ currentTransform.copy( transform );
1414
+ transformStack.push( transform );
1415
+
1416
+ return transform;
1417
+
1418
+ }
1419
+
1420
+ function parseNodeTransform( node ) {
1421
+
1422
+ const transform = new Matrix3();
1423
+ const currentTransform = tempTransform0;
1424
+
1425
+ if ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) {
1426
+
1427
+ const tx = parseFloatWithUnits( node.getAttribute( 'x' ) );
1428
+ const ty = parseFloatWithUnits( node.getAttribute( 'y' ) );
1429
+
1430
+ transform.translate( tx, ty );
1431
+
1432
+ }
1433
+
1434
+ if ( node.hasAttribute( 'transform' ) ) {
1435
+
1436
+ const transformsTexts = node.getAttribute( 'transform' ).split( ')' );
1437
+
1438
+ for ( let tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex -- ) {
1439
+
1440
+ const transformText = transformsTexts[ tIndex ].trim();
1441
+
1442
+ if ( transformText === '' ) continue;
1443
+
1444
+ const openParPos = transformText.indexOf( '(' );
1445
+ const closeParPos = transformText.length;
1446
+
1447
+ if ( openParPos > 0 && openParPos < closeParPos ) {
1448
+
1449
+ const transformType = transformText.slice( 0, openParPos );
1450
+
1451
+ const array = parseFloats( transformText.slice( openParPos + 1 ) );
1452
+
1453
+ currentTransform.identity();
1454
+
1455
+ switch ( transformType ) {
1456
+
1457
+ case 'translate':
1458
+
1459
+ if ( array.length >= 1 ) {
1460
+
1461
+ const tx = array[ 0 ];
1462
+ let ty = 0;
1463
+
1464
+ if ( array.length >= 2 ) {
1465
+
1466
+ ty = array[ 1 ];
1467
+
1468
+ }
1469
+
1470
+ currentTransform.translate( tx, ty );
1471
+
1472
+ }
1473
+
1474
+ break;
1475
+
1476
+ case 'rotate':
1477
+
1478
+ if ( array.length >= 1 ) {
1479
+
1480
+ let angle = 0;
1481
+ let cx = 0;
1482
+ let cy = 0;
1483
+
1484
+ // Angle
1485
+ angle = - array[ 0 ] * Math.PI / 180;
1486
+
1487
+ if ( array.length >= 3 ) {
1488
+
1489
+ // Center x, y
1490
+ cx = array[ 1 ];
1491
+ cy = array[ 2 ];
1492
+
1493
+ }
1494
+
1495
+ // Rotate around center (cx, cy)
1496
+ tempTransform1.identity().translate( - cx, - cy );
1497
+ tempTransform2.identity().rotate( angle );
1498
+ tempTransform3.multiplyMatrices( tempTransform2, tempTransform1 );
1499
+ tempTransform1.identity().translate( cx, cy );
1500
+ currentTransform.multiplyMatrices( tempTransform1, tempTransform3 );
1501
+
1502
+ }
1503
+
1504
+ break;
1505
+
1506
+ case 'scale':
1507
+
1508
+ if ( array.length >= 1 ) {
1509
+
1510
+ const scaleX = array[ 0 ];
1511
+ let scaleY = scaleX;
1512
+
1513
+ if ( array.length >= 2 ) {
1514
+
1515
+ scaleY = array[ 1 ];
1516
+
1517
+ }
1518
+
1519
+ currentTransform.scale( scaleX, scaleY );
1520
+
1521
+ }
1522
+
1523
+ break;
1524
+
1525
+ case 'skewX':
1526
+
1527
+ if ( array.length === 1 ) {
1528
+
1529
+ currentTransform.set(
1530
+ 1, Math.tan( array[ 0 ] * Math.PI / 180 ), 0,
1531
+ 0, 1, 0,
1532
+ 0, 0, 1
1533
+ );
1534
+
1535
+ }
1536
+
1537
+ break;
1538
+
1539
+ case 'skewY':
1540
+
1541
+ if ( array.length === 1 ) {
1542
+
1543
+ currentTransform.set(
1544
+ 1, 0, 0,
1545
+ Math.tan( array[ 0 ] * Math.PI / 180 ), 1, 0,
1546
+ 0, 0, 1
1547
+ );
1548
+
1549
+ }
1550
+
1551
+ break;
1552
+
1553
+ case 'matrix':
1554
+
1555
+ if ( array.length === 6 ) {
1556
+
1557
+ currentTransform.set(
1558
+ array[ 0 ], array[ 2 ], array[ 4 ],
1559
+ array[ 1 ], array[ 3 ], array[ 5 ],
1560
+ 0, 0, 1
1561
+ );
1562
+
1563
+ }
1564
+
1565
+ break;
1566
+
1567
+ }
1568
+
1569
+ }
1570
+
1571
+ transform.premultiply( currentTransform );
1572
+
1573
+ }
1574
+
1575
+ }
1576
+
1577
+ return transform;
1578
+
1579
+ }
1580
+
1581
+ function transformPath( path, m ) {
1582
+
1583
+ function transfVec2( v2 ) {
1584
+
1585
+ tempV3.set( v2.x, v2.y, 1 ).applyMatrix3( m );
1586
+
1587
+ v2.set( tempV3.x, tempV3.y );
1588
+
1589
+ }
1590
+
1591
+ const isRotated = isTransformRotated( m );
1592
+
1593
+ const subPaths = path.subPaths;
1594
+
1595
+ for ( let i = 0, n = subPaths.length; i < n; i ++ ) {
1596
+
1597
+ const subPath = subPaths[ i ];
1598
+ const curves = subPath.curves;
1599
+
1600
+ for ( let j = 0; j < curves.length; j ++ ) {
1601
+
1602
+ const curve = curves[ j ];
1603
+
1604
+ if ( curve.isLineCurve ) {
1605
+
1606
+ transfVec2( curve.v1 );
1607
+ transfVec2( curve.v2 );
1608
+
1609
+ } else if ( curve.isCubicBezierCurve ) {
1610
+
1611
+ transfVec2( curve.v0 );
1612
+ transfVec2( curve.v1 );
1613
+ transfVec2( curve.v2 );
1614
+ transfVec2( curve.v3 );
1615
+
1616
+ } else if ( curve.isQuadraticBezierCurve ) {
1617
+
1618
+ transfVec2( curve.v0 );
1619
+ transfVec2( curve.v1 );
1620
+ transfVec2( curve.v2 );
1621
+
1622
+ } else if ( curve.isEllipseCurve ) {
1623
+
1624
+ if ( isRotated ) {
1625
+
1626
+ console.warn( 'SVGLoader: Elliptic arc or ellipse rotation or skewing is not implemented.' );
1627
+
1628
+ }
1629
+
1630
+ tempV2.set( curve.aX, curve.aY );
1631
+ transfVec2( tempV2 );
1632
+ curve.aX = tempV2.x;
1633
+ curve.aY = tempV2.y;
1634
+
1635
+ curve.xRadius *= getTransformScaleX( m );
1636
+ curve.yRadius *= getTransformScaleY( m );
1637
+
1638
+ }
1639
+
1640
+ }
1641
+
1642
+ }
1643
+
1644
+ }
1645
+
1646
+ function isTransformRotated( m ) {
1647
+
1648
+ return m.elements[ 1 ] !== 0 || m.elements[ 3 ] !== 0;
1649
+
1650
+ }
1651
+
1652
+ function getTransformScaleX( m ) {
1653
+
1654
+ const te = m.elements;
1655
+ return Math.sqrt( te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] );
1656
+
1657
+ }
1658
+
1659
+ function getTransformScaleY( m ) {
1660
+
1661
+ const te = m.elements;
1662
+ return Math.sqrt( te[ 3 ] * te[ 3 ] + te[ 4 ] * te[ 4 ] );
1663
+
1664
+ }
1665
+
1666
+ //
1667
+
1668
+ const paths = [];
1669
+ const stylesheets = {};
1670
+
1671
+ const transformStack = [];
1672
+
1673
+ const tempTransform0 = new Matrix3();
1674
+ const tempTransform1 = new Matrix3();
1675
+ const tempTransform2 = new Matrix3();
1676
+ const tempTransform3 = new Matrix3();
1677
+ const tempV2 = new Vector2();
1678
+ const tempV3 = new Vector3();
1679
+
1680
+ const currentTransform = new Matrix3();
1681
+
1682
+ const xml = new DOMParser().parseFromString( text, 'image/svg+xml' ); // application/xml
1683
+
1684
+ parseNode( xml.documentElement, {
1685
+ fill: '#000',
1686
+ fillOpacity: 1,
1687
+ strokeOpacity: 1,
1688
+ strokeWidth: 1,
1689
+ strokeLineJoin: 'miter',
1690
+ strokeLineCap: 'butt',
1691
+ strokeMiterLimit: 4
1692
+ } );
1693
+
1694
+ const data = { paths: paths, xml: xml.documentElement };
1695
+
1696
+ // console.log( paths );
1697
+ return data;
1698
+
1699
+ }
1700
+
1701
+ static createShapes( shapePath ) {
1702
+
1703
+ // Param shapePath: a shapepath as returned by the parse function of this class
1704
+ // Returns Shape object
1705
+
1706
+ const BIGNUMBER = 999999999;
1707
+
1708
+ const IntersectionLocationType = {
1709
+ ORIGIN: 0,
1710
+ DESTINATION: 1,
1711
+ BETWEEN: 2,
1712
+ LEFT: 3,
1713
+ RIGHT: 4,
1714
+ BEHIND: 5,
1715
+ BEYOND: 6
1716
+ };
1717
+
1718
+ const classifyResult = {
1719
+ loc: IntersectionLocationType.ORIGIN,
1720
+ t: 0
1721
+ };
1722
+
1723
+ function findEdgeIntersection( a0, a1, b0, b1 ) {
1724
+
1725
+ const x1 = a0.x;
1726
+ const x2 = a1.x;
1727
+ const x3 = b0.x;
1728
+ const x4 = b1.x;
1729
+ const y1 = a0.y;
1730
+ const y2 = a1.y;
1731
+ const y3 = b0.y;
1732
+ const y4 = b1.y;
1733
+ const nom1 = ( x4 - x3 ) * ( y1 - y3 ) - ( y4 - y3 ) * ( x1 - x3 );
1734
+ const nom2 = ( x2 - x1 ) * ( y1 - y3 ) - ( y2 - y1 ) * ( x1 - x3 );
1735
+ const denom = ( y4 - y3 ) * ( x2 - x1 ) - ( x4 - x3 ) * ( y2 - y1 );
1736
+ const t1 = nom1 / denom;
1737
+ const t2 = nom2 / denom;
1738
+
1739
+ if ( ( ( denom === 0 ) && ( nom1 !== 0 ) ) || ( t1 <= 0 ) || ( t1 >= 1 ) || ( t2 < 0 ) || ( t2 > 1 ) ) {
1740
+
1741
+ //1. lines are parallel or edges don't intersect
1742
+
1743
+ return null;
1744
+
1745
+ } else if ( ( nom1 === 0 ) && ( denom === 0 ) ) {
1746
+
1747
+ //2. lines are colinear
1748
+
1749
+ //check if endpoints of edge2 (b0-b1) lies on edge1 (a0-a1)
1750
+ for ( let i = 0; i < 2; i ++ ) {
1751
+
1752
+ classifyPoint( i === 0 ? b0 : b1, a0, a1 );
1753
+ //find position of this endpoints relatively to edge1
1754
+ if ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {
1755
+
1756
+ const point = ( i === 0 ? b0 : b1 );
1757
+ return { x: point.x, y: point.y, t: classifyResult.t };
1758
+
1759
+ } else if ( classifyResult.loc == IntersectionLocationType.BETWEEN ) {
1760
+
1761
+ const x = + ( ( x1 + classifyResult.t * ( x2 - x1 ) ).toPrecision( 10 ) );
1762
+ const y = + ( ( y1 + classifyResult.t * ( y2 - y1 ) ).toPrecision( 10 ) );
1763
+ return { x: x, y: y, t: classifyResult.t, };
1764
+
1765
+ }
1766
+
1767
+ }
1768
+
1769
+ return null;
1770
+
1771
+ } else {
1772
+
1773
+ //3. edges intersect
1774
+
1775
+ for ( let i = 0; i < 2; i ++ ) {
1776
+
1777
+ classifyPoint( i === 0 ? b0 : b1, a0, a1 );
1778
+
1779
+ if ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {
1780
+
1781
+ const point = ( i === 0 ? b0 : b1 );
1782
+ return { x: point.x, y: point.y, t: classifyResult.t };
1783
+
1784
+ }
1785
+
1786
+ }
1787
+
1788
+ const x = + ( ( x1 + t1 * ( x2 - x1 ) ).toPrecision( 10 ) );
1789
+ const y = + ( ( y1 + t1 * ( y2 - y1 ) ).toPrecision( 10 ) );
1790
+ return { x: x, y: y, t: t1 };
1791
+
1792
+ }
1793
+
1794
+ }
1795
+
1796
+ function classifyPoint( p, edgeStart, edgeEnd ) {
1797
+
1798
+ const ax = edgeEnd.x - edgeStart.x;
1799
+ const ay = edgeEnd.y - edgeStart.y;
1800
+ const bx = p.x - edgeStart.x;
1801
+ const by = p.y - edgeStart.y;
1802
+ const sa = ax * by - bx * ay;
1803
+
1804
+ if ( ( p.x === edgeStart.x ) && ( p.y === edgeStart.y ) ) {
1805
+
1806
+ classifyResult.loc = IntersectionLocationType.ORIGIN;
1807
+ classifyResult.t = 0;
1808
+ return;
1809
+
1810
+ }
1811
+
1812
+ if ( ( p.x === edgeEnd.x ) && ( p.y === edgeEnd.y ) ) {
1813
+
1814
+ classifyResult.loc = IntersectionLocationType.DESTINATION;
1815
+ classifyResult.t = 1;
1816
+ return;
1817
+
1818
+ }
1819
+
1820
+ if ( sa < - Number.EPSILON ) {
1821
+
1822
+ classifyResult.loc = IntersectionLocationType.LEFT;
1823
+ return;
1824
+
1825
+ }
1826
+
1827
+ if ( sa > Number.EPSILON ) {
1828
+
1829
+ classifyResult.loc = IntersectionLocationType.RIGHT;
1830
+ return;
1831
+
1832
+
1833
+ }
1834
+
1835
+ if ( ( ( ax * bx ) < 0 ) || ( ( ay * by ) < 0 ) ) {
1836
+
1837
+ classifyResult.loc = IntersectionLocationType.BEHIND;
1838
+ return;
1839
+
1840
+ }
1841
+
1842
+ if ( ( Math.sqrt( ax * ax + ay * ay ) ) < ( Math.sqrt( bx * bx + by * by ) ) ) {
1843
+
1844
+ classifyResult.loc = IntersectionLocationType.BEYOND;
1845
+ return;
1846
+
1847
+ }
1848
+
1849
+ let t;
1850
+
1851
+ if ( ax !== 0 ) {
1852
+
1853
+ t = bx / ax;
1854
+
1855
+ } else {
1856
+
1857
+ t = by / ay;
1858
+
1859
+ }
1860
+
1861
+ classifyResult.loc = IntersectionLocationType.BETWEEN;
1862
+ classifyResult.t = t;
1863
+
1864
+ }
1865
+
1866
+ function getIntersections( path1, path2 ) {
1867
+
1868
+ const intersectionsRaw = [];
1869
+ const intersections = [];
1870
+
1871
+ for ( let index = 1; index < path1.length; index ++ ) {
1872
+
1873
+ const path1EdgeStart = path1[ index - 1 ];
1874
+ const path1EdgeEnd = path1[ index ];
1875
+
1876
+ for ( let index2 = 1; index2 < path2.length; index2 ++ ) {
1877
+
1878
+ const path2EdgeStart = path2[ index2 - 1 ];
1879
+ const path2EdgeEnd = path2[ index2 ];
1880
+
1881
+ const intersection = findEdgeIntersection( path1EdgeStart, path1EdgeEnd, path2EdgeStart, path2EdgeEnd );
1882
+
1883
+ if ( intersection !== null && intersectionsRaw.find( i => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON ) === undefined ) {
1884
+
1885
+ intersectionsRaw.push( intersection );
1886
+ intersections.push( new Vector2( intersection.x, intersection.y ) );
1887
+
1888
+ }
1889
+
1890
+ }
1891
+
1892
+ }
1893
+
1894
+ return intersections;
1895
+
1896
+ }
1897
+
1898
+ function getScanlineIntersections( scanline, boundingBox, paths ) {
1899
+
1900
+ const center = new Vector2();
1901
+ boundingBox.getCenter( center );
1902
+
1903
+ const allIntersections = [];
1904
+
1905
+ paths.forEach( path => {
1906
+
1907
+ // check if the center of the bounding box is in the bounding box of the paths.
1908
+ // this is a pruning method to limit the search of intersections in paths that can't envelop of the current path.
1909
+ // if a path envelops another path. The center of that oter path, has to be inside the bounding box of the enveloping path.
1910
+ if ( path.boundingBox.containsPoint( center ) ) {
1911
+
1912
+ const intersections = getIntersections( scanline, path.points );
1913
+
1914
+ intersections.forEach( p => {
1915
+
1916
+ allIntersections.push( { identifier: path.identifier, isCW: path.isCW, point: p } );
1917
+
1918
+ } );
1919
+
1920
+ }
1921
+
1922
+ } );
1923
+
1924
+ allIntersections.sort( ( i1, i2 ) => {
1925
+
1926
+ return i1.point.x - i2.point.x;
1927
+
1928
+ } );
1929
+
1930
+ return allIntersections;
1931
+
1932
+ }
1933
+
1934
+ function isHoleTo( simplePath, allPaths, scanlineMinX, scanlineMaxX, _fillRule ) {
1935
+
1936
+ if ( _fillRule === null || _fillRule === undefined || _fillRule === '' ) {
1937
+
1938
+ _fillRule = 'nonzero';
1939
+
1940
+ }
1941
+
1942
+ const centerBoundingBox = new Vector2();
1943
+ simplePath.boundingBox.getCenter( centerBoundingBox );
1944
+
1945
+ const scanline = [ new Vector2( scanlineMinX, centerBoundingBox.y ), new Vector2( scanlineMaxX, centerBoundingBox.y ) ];
1946
+
1947
+ const scanlineIntersections = getScanlineIntersections( scanline, simplePath.boundingBox, allPaths );
1948
+
1949
+ scanlineIntersections.sort( ( i1, i2 ) => {
1950
+
1951
+ return i1.point.x - i2.point.x;
1952
+
1953
+ } );
1954
+
1955
+ const baseIntersections = [];
1956
+ const otherIntersections = [];
1957
+
1958
+ scanlineIntersections.forEach( i => {
1959
+
1960
+ if ( i.identifier === simplePath.identifier ) {
1961
+
1962
+ baseIntersections.push( i );
1963
+
1964
+ } else {
1965
+
1966
+ otherIntersections.push( i );
1967
+
1968
+ }
1969
+
1970
+ } );
1971
+
1972
+ const firstXOfPath = baseIntersections[ 0 ].point.x;
1973
+
1974
+ // build up the path hierarchy
1975
+ const stack = [];
1976
+ let i = 0;
1977
+
1978
+ while ( i < otherIntersections.length && otherIntersections[ i ].point.x < firstXOfPath ) {
1979
+
1980
+ if ( stack.length > 0 && stack[ stack.length - 1 ] === otherIntersections[ i ].identifier ) {
1981
+
1982
+ stack.pop();
1983
+
1984
+ } else {
1985
+
1986
+ stack.push( otherIntersections[ i ].identifier );
1987
+
1988
+ }
1989
+
1990
+ i ++;
1991
+
1992
+ }
1993
+
1994
+ stack.push( simplePath.identifier );
1995
+
1996
+ if ( _fillRule === 'evenodd' ) {
1997
+
1998
+ const isHole = stack.length % 2 === 0 ? true : false;
1999
+ const isHoleFor = stack[ stack.length - 2 ];
2000
+
2001
+ return { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };
2002
+
2003
+ } else if ( _fillRule === 'nonzero' ) {
2004
+
2005
+ // check if path is a hole by counting the amount of paths with alternating rotations it has to cross.
2006
+ let isHole = true;
2007
+ let isHoleFor = null;
2008
+ let lastCWValue = null;
2009
+
2010
+ for ( let i = 0; i < stack.length; i ++ ) {
2011
+
2012
+ const identifier = stack[ i ];
2013
+ if ( isHole ) {
2014
+
2015
+ lastCWValue = allPaths[ identifier ].isCW;
2016
+ isHole = false;
2017
+ isHoleFor = identifier;
2018
+
2019
+ } else if ( lastCWValue !== allPaths[ identifier ].isCW ) {
2020
+
2021
+ lastCWValue = allPaths[ identifier ].isCW;
2022
+ isHole = true;
2023
+
2024
+ }
2025
+
2026
+ }
2027
+
2028
+ return { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };
2029
+
2030
+ } else {
2031
+
2032
+ console.warn( 'fill-rule: "' + _fillRule + '" is currently not implemented.' );
2033
+
2034
+ }
2035
+
2036
+ }
2037
+
2038
+ // check for self intersecting paths
2039
+ // TODO
2040
+
2041
+ // check intersecting paths
2042
+ // TODO
2043
+
2044
+ // prepare paths for hole detection
2045
+ let identifier = 0;
2046
+
2047
+ let scanlineMinX = BIGNUMBER;
2048
+ let scanlineMaxX = - BIGNUMBER;
2049
+
2050
+ let simplePaths = shapePath.subPaths.map( p => {
2051
+
2052
+ const points = p.getPoints();
2053
+ let maxY = - BIGNUMBER;
2054
+ let minY = BIGNUMBER;
2055
+ let maxX = - BIGNUMBER;
2056
+ let minX = BIGNUMBER;
2057
+
2058
+ //points.forEach(p => p.y *= -1);
2059
+
2060
+ for ( let i = 0; i < points.length; i ++ ) {
2061
+
2062
+ const p = points[ i ];
2063
+
2064
+ if ( p.y > maxY ) {
2065
+
2066
+ maxY = p.y;
2067
+
2068
+ }
2069
+
2070
+ if ( p.y < minY ) {
2071
+
2072
+ minY = p.y;
2073
+
2074
+ }
2075
+
2076
+ if ( p.x > maxX ) {
2077
+
2078
+ maxX = p.x;
2079
+
2080
+ }
2081
+
2082
+ if ( p.x < minX ) {
2083
+
2084
+ minX = p.x;
2085
+
2086
+ }
2087
+
2088
+ }
2089
+
2090
+ //
2091
+ if ( scanlineMaxX <= maxX ) {
2092
+
2093
+ scanlineMaxX = maxX + 1;
2094
+
2095
+ }
2096
+
2097
+ if ( scanlineMinX >= minX ) {
2098
+
2099
+ scanlineMinX = minX - 1;
2100
+
2101
+ }
2102
+
2103
+ return { curves: p.curves, points: points, isCW: ShapeUtils.isClockWise( points ), identifier: identifier ++, boundingBox: new Box2( new Vector2( minX, minY ), new Vector2( maxX, maxY ) ) };
2104
+
2105
+ } );
2106
+
2107
+ simplePaths = simplePaths.filter( sp => sp.points.length > 1 );
2108
+
2109
+ // check if path is solid or a hole
2110
+ const isAHole = simplePaths.map( p => isHoleTo( p, simplePaths, scanlineMinX, scanlineMaxX, shapePath.userData?.style.fillRule ) );
2111
+
2112
+
2113
+ const shapesToReturn = [];
2114
+ simplePaths.forEach( p => {
2115
+
2116
+ const amIAHole = isAHole[ p.identifier ];
2117
+
2118
+ if ( ! amIAHole.isHole ) {
2119
+
2120
+ const shape = new Shape();
2121
+ shape.curves = p.curves;
2122
+ const holes = isAHole.filter( h => h.isHole && h.for === p.identifier );
2123
+ holes.forEach( h => {
2124
+
2125
+ const hole = simplePaths[ h.identifier ];
2126
+ const path = new Path();
2127
+ path.curves = hole.curves;
2128
+ shape.holes.push( path );
2129
+
2130
+ } );
2131
+ shapesToReturn.push( shape );
2132
+
2133
+ }
2134
+
2135
+ } );
2136
+
2137
+ return shapesToReturn;
2138
+
2139
+ }
2140
+
2141
+ static getStrokeStyle( width, color, lineJoin, lineCap, miterLimit ) {
2142
+
2143
+ // Param width: Stroke width
2144
+ // Param color: As returned by THREE.Color.getStyle()
2145
+ // Param lineJoin: One of "round", "bevel", "miter" or "miter-limit"
2146
+ // Param lineCap: One of "round", "square" or "butt"
2147
+ // Param miterLimit: Maximum join length, in multiples of the "width" parameter (join is truncated if it exceeds that distance)
2148
+ // Returns style object
2149
+
2150
+ width = width !== undefined ? width : 1;
2151
+ color = color !== undefined ? color : '#000';
2152
+ lineJoin = lineJoin !== undefined ? lineJoin : 'miter';
2153
+ lineCap = lineCap !== undefined ? lineCap : 'butt';
2154
+ miterLimit = miterLimit !== undefined ? miterLimit : 4;
2155
+
2156
+ return {
2157
+ strokeColor: color,
2158
+ strokeWidth: width,
2159
+ strokeLineJoin: lineJoin,
2160
+ strokeLineCap: lineCap,
2161
+ strokeMiterLimit: miterLimit
2162
+ };
2163
+
2164
+ }
2165
+
2166
+ static pointsToStroke( points, style, arcDivisions, minDistance ) {
2167
+
2168
+ // Generates a stroke with some witdh around the given path.
2169
+ // The path can be open or closed (last point equals to first point)
2170
+ // Param points: Array of Vector2D (the path). Minimum 2 points.
2171
+ // Param style: Object with SVG properties as returned by SVGLoader.getStrokeStyle(), or SVGLoader.parse() in the path.userData.style object
2172
+ // Params arcDivisions: Arc divisions for round joins and endcaps. (Optional)
2173
+ // Param minDistance: Points closer to this distance will be merged. (Optional)
2174
+ // Returns BufferGeometry with stroke triangles (In plane z = 0). UV coordinates are generated ('u' along path. 'v' across it, from left to right)
2175
+
2176
+ const vertices = [];
2177
+ const normals = [];
2178
+ const uvs = [];
2179
+
2180
+ if ( SVGLoader.pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs ) === 0 ) {
2181
+
2182
+ return null;
2183
+
2184
+ }
2185
+
2186
+ const geometry = new BufferGeometry();
2187
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
2188
+ geometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
2189
+ geometry.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
2190
+
2191
+ return geometry;
2192
+
2193
+ }
2194
+
2195
+ static pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs, vertexOffset ) {
2196
+
2197
+ // This function can be called to update existing arrays or buffers.
2198
+ // Accepts same parameters as pointsToStroke, plus the buffers and optional offset.
2199
+ // Param vertexOffset: Offset vertices to start writing in the buffers (3 elements/vertex for vertices and normals, and 2 elements/vertex for uvs)
2200
+ // Returns number of written vertices / normals / uvs pairs
2201
+ // if 'vertices' parameter is undefined no triangles will be generated, but the returned vertices count will still be valid (useful to preallocate the buffers)
2202
+ // 'normals' and 'uvs' buffers are optional
2203
+
2204
+ const tempV2_1 = new Vector2();
2205
+ const tempV2_2 = new Vector2();
2206
+ const tempV2_3 = new Vector2();
2207
+ const tempV2_4 = new Vector2();
2208
+ const tempV2_5 = new Vector2();
2209
+ const tempV2_6 = new Vector2();
2210
+ const tempV2_7 = new Vector2();
2211
+ const lastPointL = new Vector2();
2212
+ const lastPointR = new Vector2();
2213
+ const point0L = new Vector2();
2214
+ const point0R = new Vector2();
2215
+ const currentPointL = new Vector2();
2216
+ const currentPointR = new Vector2();
2217
+ const nextPointL = new Vector2();
2218
+ const nextPointR = new Vector2();
2219
+ const innerPoint = new Vector2();
2220
+ const outerPoint = new Vector2();
2221
+
2222
+ arcDivisions = arcDivisions !== undefined ? arcDivisions : 12;
2223
+ minDistance = minDistance !== undefined ? minDistance : 0.001;
2224
+ vertexOffset = vertexOffset !== undefined ? vertexOffset : 0;
2225
+
2226
+ // First ensure there are no duplicated points
2227
+ points = removeDuplicatedPoints( points );
2228
+
2229
+ const numPoints = points.length;
2230
+
2231
+ if ( numPoints < 2 ) return 0;
2232
+
2233
+ const isClosed = points[ 0 ].equals( points[ numPoints - 1 ] );
2234
+
2235
+ let currentPoint;
2236
+ let previousPoint = points[ 0 ];
2237
+ let nextPoint;
2238
+
2239
+ const strokeWidth2 = style.strokeWidth / 2;
2240
+
2241
+ const deltaU = 1 / ( numPoints - 1 );
2242
+ let u0 = 0, u1;
2243
+
2244
+ let innerSideModified;
2245
+ let joinIsOnLeftSide;
2246
+ let isMiter;
2247
+ let initialJoinIsOnLeftSide = false;
2248
+
2249
+ let numVertices = 0;
2250
+ let currentCoordinate = vertexOffset * 3;
2251
+ let currentCoordinateUV = vertexOffset * 2;
2252
+
2253
+ // Get initial left and right stroke points
2254
+ getNormal( points[ 0 ], points[ 1 ], tempV2_1 ).multiplyScalar( strokeWidth2 );
2255
+ lastPointL.copy( points[ 0 ] ).sub( tempV2_1 );
2256
+ lastPointR.copy( points[ 0 ] ).add( tempV2_1 );
2257
+ point0L.copy( lastPointL );
2258
+ point0R.copy( lastPointR );
2259
+
2260
+ for ( let iPoint = 1; iPoint < numPoints; iPoint ++ ) {
2261
+
2262
+ currentPoint = points[ iPoint ];
2263
+
2264
+ // Get next point
2265
+ if ( iPoint === numPoints - 1 ) {
2266
+
2267
+ if ( isClosed ) {
2268
+
2269
+ // Skip duplicated initial point
2270
+ nextPoint = points[ 1 ];
2271
+
2272
+ } else nextPoint = undefined;
2273
+
2274
+ } else {
2275
+
2276
+ nextPoint = points[ iPoint + 1 ];
2277
+
2278
+ }
2279
+
2280
+ // Normal of previous segment in tempV2_1
2281
+ const normal1 = tempV2_1;
2282
+ getNormal( previousPoint, currentPoint, normal1 );
2283
+
2284
+ tempV2_3.copy( normal1 ).multiplyScalar( strokeWidth2 );
2285
+ currentPointL.copy( currentPoint ).sub( tempV2_3 );
2286
+ currentPointR.copy( currentPoint ).add( tempV2_3 );
2287
+
2288
+ u1 = u0 + deltaU;
2289
+
2290
+ innerSideModified = false;
2291
+
2292
+ if ( nextPoint !== undefined ) {
2293
+
2294
+ // Normal of next segment in tempV2_2
2295
+ getNormal( currentPoint, nextPoint, tempV2_2 );
2296
+
2297
+ tempV2_3.copy( tempV2_2 ).multiplyScalar( strokeWidth2 );
2298
+ nextPointL.copy( currentPoint ).sub( tempV2_3 );
2299
+ nextPointR.copy( currentPoint ).add( tempV2_3 );
2300
+
2301
+ joinIsOnLeftSide = true;
2302
+ tempV2_3.subVectors( nextPoint, previousPoint );
2303
+ if ( normal1.dot( tempV2_3 ) < 0 ) {
2304
+
2305
+ joinIsOnLeftSide = false;
2306
+
2307
+ }
2308
+
2309
+ if ( iPoint === 1 ) initialJoinIsOnLeftSide = joinIsOnLeftSide;
2310
+
2311
+ tempV2_3.subVectors( nextPoint, currentPoint );
2312
+ tempV2_3.normalize();
2313
+ const dot = Math.abs( normal1.dot( tempV2_3 ) );
2314
+
2315
+ // If path is straight, don't create join
2316
+ if ( dot > Number.EPSILON ) {
2317
+
2318
+ // Compute inner and outer segment intersections
2319
+ const miterSide = strokeWidth2 / dot;
2320
+ tempV2_3.multiplyScalar( - miterSide );
2321
+ tempV2_4.subVectors( currentPoint, previousPoint );
2322
+ tempV2_5.copy( tempV2_4 ).setLength( miterSide ).add( tempV2_3 );
2323
+ innerPoint.copy( tempV2_5 ).negate();
2324
+ const miterLength2 = tempV2_5.length();
2325
+ const segmentLengthPrev = tempV2_4.length();
2326
+ tempV2_4.divideScalar( segmentLengthPrev );
2327
+ tempV2_6.subVectors( nextPoint, currentPoint );
2328
+ const segmentLengthNext = tempV2_6.length();
2329
+ tempV2_6.divideScalar( segmentLengthNext );
2330
+ // Check that previous and next segments doesn't overlap with the innerPoint of intersection
2331
+ if ( tempV2_4.dot( innerPoint ) < segmentLengthPrev && tempV2_6.dot( innerPoint ) < segmentLengthNext ) {
2332
+
2333
+ innerSideModified = true;
2334
+
2335
+ }
2336
+
2337
+ outerPoint.copy( tempV2_5 ).add( currentPoint );
2338
+ innerPoint.add( currentPoint );
2339
+
2340
+ isMiter = false;
2341
+
2342
+ if ( innerSideModified ) {
2343
+
2344
+ if ( joinIsOnLeftSide ) {
2345
+
2346
+ nextPointR.copy( innerPoint );
2347
+ currentPointR.copy( innerPoint );
2348
+
2349
+ } else {
2350
+
2351
+ nextPointL.copy( innerPoint );
2352
+ currentPointL.copy( innerPoint );
2353
+
2354
+ }
2355
+
2356
+ } else {
2357
+
2358
+ // The segment triangles are generated here if there was overlapping
2359
+
2360
+ makeSegmentTriangles();
2361
+
2362
+ }
2363
+
2364
+ switch ( style.strokeLineJoin ) {
2365
+
2366
+ case 'bevel':
2367
+
2368
+ makeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );
2369
+
2370
+ break;
2371
+
2372
+ case 'round':
2373
+
2374
+ // Segment triangles
2375
+
2376
+ createSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );
2377
+
2378
+ // Join triangles
2379
+
2380
+ if ( joinIsOnLeftSide ) {
2381
+
2382
+ makeCircularSector( currentPoint, currentPointL, nextPointL, u1, 0 );
2383
+
2384
+ } else {
2385
+
2386
+ makeCircularSector( currentPoint, nextPointR, currentPointR, u1, 1 );
2387
+
2388
+ }
2389
+
2390
+ break;
2391
+
2392
+ case 'miter':
2393
+ case 'miter-clip':
2394
+ default:
2395
+
2396
+ const miterFraction = ( strokeWidth2 * style.strokeMiterLimit ) / miterLength2;
2397
+
2398
+ if ( miterFraction < 1 ) {
2399
+
2400
+ // The join miter length exceeds the miter limit
2401
+
2402
+ if ( style.strokeLineJoin !== 'miter-clip' ) {
2403
+
2404
+ makeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );
2405
+ break;
2406
+
2407
+ } else {
2408
+
2409
+ // Segment triangles
2410
+
2411
+ createSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );
2412
+
2413
+ // Miter-clip join triangles
2414
+
2415
+ if ( joinIsOnLeftSide ) {
2416
+
2417
+ tempV2_6.subVectors( outerPoint, currentPointL ).multiplyScalar( miterFraction ).add( currentPointL );
2418
+ tempV2_7.subVectors( outerPoint, nextPointL ).multiplyScalar( miterFraction ).add( nextPointL );
2419
+
2420
+ addVertex( currentPointL, u1, 0 );
2421
+ addVertex( tempV2_6, u1, 0 );
2422
+ addVertex( currentPoint, u1, 0.5 );
2423
+
2424
+ addVertex( currentPoint, u1, 0.5 );
2425
+ addVertex( tempV2_6, u1, 0 );
2426
+ addVertex( tempV2_7, u1, 0 );
2427
+
2428
+ addVertex( currentPoint, u1, 0.5 );
2429
+ addVertex( tempV2_7, u1, 0 );
2430
+ addVertex( nextPointL, u1, 0 );
2431
+
2432
+ } else {
2433
+
2434
+ tempV2_6.subVectors( outerPoint, currentPointR ).multiplyScalar( miterFraction ).add( currentPointR );
2435
+ tempV2_7.subVectors( outerPoint, nextPointR ).multiplyScalar( miterFraction ).add( nextPointR );
2436
+
2437
+ addVertex( currentPointR, u1, 1 );
2438
+ addVertex( tempV2_6, u1, 1 );
2439
+ addVertex( currentPoint, u1, 0.5 );
2440
+
2441
+ addVertex( currentPoint, u1, 0.5 );
2442
+ addVertex( tempV2_6, u1, 1 );
2443
+ addVertex( tempV2_7, u1, 1 );
2444
+
2445
+ addVertex( currentPoint, u1, 0.5 );
2446
+ addVertex( tempV2_7, u1, 1 );
2447
+ addVertex( nextPointR, u1, 1 );
2448
+
2449
+ }
2450
+
2451
+ }
2452
+
2453
+ } else {
2454
+
2455
+ // Miter join segment triangles
2456
+
2457
+ if ( innerSideModified ) {
2458
+
2459
+ // Optimized segment + join triangles
2460
+
2461
+ if ( joinIsOnLeftSide ) {
2462
+
2463
+ addVertex( lastPointR, u0, 1 );
2464
+ addVertex( lastPointL, u0, 0 );
2465
+ addVertex( outerPoint, u1, 0 );
2466
+
2467
+ addVertex( lastPointR, u0, 1 );
2468
+ addVertex( outerPoint, u1, 0 );
2469
+ addVertex( innerPoint, u1, 1 );
2470
+
2471
+ } else {
2472
+
2473
+ addVertex( lastPointR, u0, 1 );
2474
+ addVertex( lastPointL, u0, 0 );
2475
+ addVertex( outerPoint, u1, 1 );
2476
+
2477
+ addVertex( lastPointL, u0, 0 );
2478
+ addVertex( innerPoint, u1, 0 );
2479
+ addVertex( outerPoint, u1, 1 );
2480
+
2481
+ }
2482
+
2483
+
2484
+ if ( joinIsOnLeftSide ) {
2485
+
2486
+ nextPointL.copy( outerPoint );
2487
+
2488
+ } else {
2489
+
2490
+ nextPointR.copy( outerPoint );
2491
+
2492
+ }
2493
+
2494
+
2495
+ } else {
2496
+
2497
+ // Add extra miter join triangles
2498
+
2499
+ if ( joinIsOnLeftSide ) {
2500
+
2501
+ addVertex( currentPointL, u1, 0 );
2502
+ addVertex( outerPoint, u1, 0 );
2503
+ addVertex( currentPoint, u1, 0.5 );
2504
+
2505
+ addVertex( currentPoint, u1, 0.5 );
2506
+ addVertex( outerPoint, u1, 0 );
2507
+ addVertex( nextPointL, u1, 0 );
2508
+
2509
+ } else {
2510
+
2511
+ addVertex( currentPointR, u1, 1 );
2512
+ addVertex( outerPoint, u1, 1 );
2513
+ addVertex( currentPoint, u1, 0.5 );
2514
+
2515
+ addVertex( currentPoint, u1, 0.5 );
2516
+ addVertex( outerPoint, u1, 1 );
2517
+ addVertex( nextPointR, u1, 1 );
2518
+
2519
+ }
2520
+
2521
+ }
2522
+
2523
+ isMiter = true;
2524
+
2525
+ }
2526
+
2527
+ break;
2528
+
2529
+ }
2530
+
2531
+ } else {
2532
+
2533
+ // The segment triangles are generated here when two consecutive points are collinear
2534
+
2535
+ makeSegmentTriangles();
2536
+
2537
+ }
2538
+
2539
+ } else {
2540
+
2541
+ // The segment triangles are generated here if it is the ending segment
2542
+
2543
+ makeSegmentTriangles();
2544
+
2545
+ }
2546
+
2547
+ if ( ! isClosed && iPoint === numPoints - 1 ) {
2548
+
2549
+ // Start line endcap
2550
+ addCapGeometry( points[ 0 ], point0L, point0R, joinIsOnLeftSide, true, u0 );
2551
+
2552
+ }
2553
+
2554
+ // Increment loop variables
2555
+
2556
+ u0 = u1;
2557
+
2558
+ previousPoint = currentPoint;
2559
+
2560
+ lastPointL.copy( nextPointL );
2561
+ lastPointR.copy( nextPointR );
2562
+
2563
+ }
2564
+
2565
+ if ( ! isClosed ) {
2566
+
2567
+ // Ending line endcap
2568
+ addCapGeometry( currentPoint, currentPointL, currentPointR, joinIsOnLeftSide, false, u1 );
2569
+
2570
+ } else if ( innerSideModified && vertices ) {
2571
+
2572
+ // Modify path first segment vertices to adjust to the segments inner and outer intersections
2573
+
2574
+ let lastOuter = outerPoint;
2575
+ let lastInner = innerPoint;
2576
+
2577
+ if ( initialJoinIsOnLeftSide !== joinIsOnLeftSide ) {
2578
+
2579
+ lastOuter = innerPoint;
2580
+ lastInner = outerPoint;
2581
+
2582
+ }
2583
+
2584
+ if ( joinIsOnLeftSide ) {
2585
+
2586
+ if ( isMiter || initialJoinIsOnLeftSide ) {
2587
+
2588
+ lastInner.toArray( vertices, 0 * 3 );
2589
+ lastInner.toArray( vertices, 3 * 3 );
2590
+
2591
+ if ( isMiter ) {
2592
+
2593
+ lastOuter.toArray( vertices, 1 * 3 );
2594
+
2595
+ }
2596
+
2597
+ }
2598
+
2599
+ } else {
2600
+
2601
+ if ( isMiter || ! initialJoinIsOnLeftSide ) {
2602
+
2603
+ lastInner.toArray( vertices, 1 * 3 );
2604
+ lastInner.toArray( vertices, 3 * 3 );
2605
+
2606
+ if ( isMiter ) {
2607
+
2608
+ lastOuter.toArray( vertices, 0 * 3 );
2609
+
2610
+ }
2611
+
2612
+ }
2613
+
2614
+ }
2615
+
2616
+ }
2617
+
2618
+ return numVertices;
2619
+
2620
+ // -- End of algorithm
2621
+
2622
+ // -- Functions
2623
+
2624
+ function getNormal( p1, p2, result ) {
2625
+
2626
+ result.subVectors( p2, p1 );
2627
+ return result.set( - result.y, result.x ).normalize();
2628
+
2629
+ }
2630
+
2631
+ function addVertex( position, u, v ) {
2632
+
2633
+ if ( vertices ) {
2634
+
2635
+ vertices[ currentCoordinate ] = position.x;
2636
+ vertices[ currentCoordinate + 1 ] = position.y;
2637
+ vertices[ currentCoordinate + 2 ] = 0;
2638
+
2639
+ if ( normals ) {
2640
+
2641
+ normals[ currentCoordinate ] = 0;
2642
+ normals[ currentCoordinate + 1 ] = 0;
2643
+ normals[ currentCoordinate + 2 ] = 1;
2644
+
2645
+ }
2646
+
2647
+ currentCoordinate += 3;
2648
+
2649
+ if ( uvs ) {
2650
+
2651
+ uvs[ currentCoordinateUV ] = u;
2652
+ uvs[ currentCoordinateUV + 1 ] = v;
2653
+
2654
+ currentCoordinateUV += 2;
2655
+
2656
+ }
2657
+
2658
+ }
2659
+
2660
+ numVertices += 3;
2661
+
2662
+ }
2663
+
2664
+ function makeCircularSector( center, p1, p2, u, v ) {
2665
+
2666
+ // param p1, p2: Points in the circle arc.
2667
+ // p1 and p2 are in clockwise direction.
2668
+
2669
+ tempV2_1.copy( p1 ).sub( center ).normalize();
2670
+ tempV2_2.copy( p2 ).sub( center ).normalize();
2671
+
2672
+ let angle = Math.PI;
2673
+ const dot = tempV2_1.dot( tempV2_2 );
2674
+ if ( Math.abs( dot ) < 1 ) angle = Math.abs( Math.acos( dot ) );
2675
+
2676
+ angle /= arcDivisions;
2677
+
2678
+ tempV2_3.copy( p1 );
2679
+
2680
+ for ( let i = 0, il = arcDivisions - 1; i < il; i ++ ) {
2681
+
2682
+ tempV2_4.copy( tempV2_3 ).rotateAround( center, angle );
2683
+
2684
+ addVertex( tempV2_3, u, v );
2685
+ addVertex( tempV2_4, u, v );
2686
+ addVertex( center, u, 0.5 );
2687
+
2688
+ tempV2_3.copy( tempV2_4 );
2689
+
2690
+ }
2691
+
2692
+ addVertex( tempV2_4, u, v );
2693
+ addVertex( p2, u, v );
2694
+ addVertex( center, u, 0.5 );
2695
+
2696
+ }
2697
+
2698
+ function makeSegmentTriangles() {
2699
+
2700
+ addVertex( lastPointR, u0, 1 );
2701
+ addVertex( lastPointL, u0, 0 );
2702
+ addVertex( currentPointL, u1, 0 );
2703
+
2704
+ addVertex( lastPointR, u0, 1 );
2705
+ addVertex( currentPointL, u1, 1 );
2706
+ addVertex( currentPointR, u1, 0 );
2707
+
2708
+ }
2709
+
2710
+ function makeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u ) {
2711
+
2712
+ if ( innerSideModified ) {
2713
+
2714
+ // Optimized segment + bevel triangles
2715
+
2716
+ if ( joinIsOnLeftSide ) {
2717
+
2718
+ // Path segments triangles
2719
+
2720
+ addVertex( lastPointR, u0, 1 );
2721
+ addVertex( lastPointL, u0, 0 );
2722
+ addVertex( currentPointL, u1, 0 );
2723
+
2724
+ addVertex( lastPointR, u0, 1 );
2725
+ addVertex( currentPointL, u1, 0 );
2726
+ addVertex( innerPoint, u1, 1 );
2727
+
2728
+ // Bevel join triangle
2729
+
2730
+ addVertex( currentPointL, u, 0 );
2731
+ addVertex( nextPointL, u, 0 );
2732
+ addVertex( innerPoint, u, 0.5 );
2733
+
2734
+ } else {
2735
+
2736
+ // Path segments triangles
2737
+
2738
+ addVertex( lastPointR, u0, 1 );
2739
+ addVertex( lastPointL, u0, 0 );
2740
+ addVertex( currentPointR, u1, 1 );
2741
+
2742
+ addVertex( lastPointL, u0, 0 );
2743
+ addVertex( innerPoint, u1, 0 );
2744
+ addVertex( currentPointR, u1, 1 );
2745
+
2746
+ // Bevel join triangle
2747
+
2748
+ addVertex( currentPointR, u, 1 );
2749
+ addVertex( nextPointR, u, 0 );
2750
+ addVertex( innerPoint, u, 0.5 );
2751
+
2752
+ }
2753
+
2754
+ } else {
2755
+
2756
+ // Bevel join triangle. The segment triangles are done in the main loop
2757
+
2758
+ if ( joinIsOnLeftSide ) {
2759
+
2760
+ addVertex( currentPointL, u, 0 );
2761
+ addVertex( nextPointL, u, 0 );
2762
+ addVertex( currentPoint, u, 0.5 );
2763
+
2764
+ } else {
2765
+
2766
+ addVertex( currentPointR, u, 1 );
2767
+ addVertex( nextPointR, u, 0 );
2768
+ addVertex( currentPoint, u, 0.5 );
2769
+
2770
+ }
2771
+
2772
+ }
2773
+
2774
+ }
2775
+
2776
+ function createSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified ) {
2777
+
2778
+ if ( innerSideModified ) {
2779
+
2780
+ if ( joinIsOnLeftSide ) {
2781
+
2782
+ addVertex( lastPointR, u0, 1 );
2783
+ addVertex( lastPointL, u0, 0 );
2784
+ addVertex( currentPointL, u1, 0 );
2785
+
2786
+ addVertex( lastPointR, u0, 1 );
2787
+ addVertex( currentPointL, u1, 0 );
2788
+ addVertex( innerPoint, u1, 1 );
2789
+
2790
+ addVertex( currentPointL, u0, 0 );
2791
+ addVertex( currentPoint, u1, 0.5 );
2792
+ addVertex( innerPoint, u1, 1 );
2793
+
2794
+ addVertex( currentPoint, u1, 0.5 );
2795
+ addVertex( nextPointL, u0, 0 );
2796
+ addVertex( innerPoint, u1, 1 );
2797
+
2798
+ } else {
2799
+
2800
+ addVertex( lastPointR, u0, 1 );
2801
+ addVertex( lastPointL, u0, 0 );
2802
+ addVertex( currentPointR, u1, 1 );
2803
+
2804
+ addVertex( lastPointL, u0, 0 );
2805
+ addVertex( innerPoint, u1, 0 );
2806
+ addVertex( currentPointR, u1, 1 );
2807
+
2808
+ addVertex( currentPointR, u0, 1 );
2809
+ addVertex( innerPoint, u1, 0 );
2810
+ addVertex( currentPoint, u1, 0.5 );
2811
+
2812
+ addVertex( currentPoint, u1, 0.5 );
2813
+ addVertex( innerPoint, u1, 0 );
2814
+ addVertex( nextPointR, u0, 1 );
2815
+
2816
+ }
2817
+
2818
+ }
2819
+
2820
+ }
2821
+
2822
+ function addCapGeometry( center, p1, p2, joinIsOnLeftSide, start, u ) {
2823
+
2824
+ // param center: End point of the path
2825
+ // param p1, p2: Left and right cap points
2826
+
2827
+ switch ( style.strokeLineCap ) {
2828
+
2829
+ case 'round':
2830
+
2831
+ if ( start ) {
2832
+
2833
+ makeCircularSector( center, p2, p1, u, 0.5 );
2834
+
2835
+ } else {
2836
+
2837
+ makeCircularSector( center, p1, p2, u, 0.5 );
2838
+
2839
+ }
2840
+
2841
+ break;
2842
+
2843
+ case 'square':
2844
+
2845
+ if ( start ) {
2846
+
2847
+ tempV2_1.subVectors( p1, center );
2848
+ tempV2_2.set( tempV2_1.y, - tempV2_1.x );
2849
+
2850
+ tempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );
2851
+ tempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );
2852
+
2853
+ // Modify already existing vertices
2854
+ if ( joinIsOnLeftSide ) {
2855
+
2856
+ tempV2_3.toArray( vertices, 1 * 3 );
2857
+ tempV2_4.toArray( vertices, 0 * 3 );
2858
+ tempV2_4.toArray( vertices, 3 * 3 );
2859
+
2860
+ } else {
2861
+
2862
+ tempV2_3.toArray( vertices, 1 * 3 );
2863
+ tempV2_3.toArray( vertices, 3 * 3 );
2864
+ tempV2_4.toArray( vertices, 0 * 3 );
2865
+
2866
+ }
2867
+
2868
+ } else {
2869
+
2870
+ tempV2_1.subVectors( p2, center );
2871
+ tempV2_2.set( tempV2_1.y, - tempV2_1.x );
2872
+
2873
+ tempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );
2874
+ tempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );
2875
+
2876
+ const vl = vertices.length;
2877
+
2878
+ // Modify already existing vertices
2879
+ if ( joinIsOnLeftSide ) {
2880
+
2881
+ tempV2_3.toArray( vertices, vl - 1 * 3 );
2882
+ tempV2_4.toArray( vertices, vl - 2 * 3 );
2883
+ tempV2_4.toArray( vertices, vl - 4 * 3 );
2884
+
2885
+ } else {
2886
+
2887
+ tempV2_3.toArray( vertices, vl - 2 * 3 );
2888
+ tempV2_4.toArray( vertices, vl - 1 * 3 );
2889
+ tempV2_4.toArray( vertices, vl - 4 * 3 );
2890
+
2891
+ }
2892
+
2893
+ }
2894
+
2895
+ break;
2896
+
2897
+ case 'butt':
2898
+ default:
2899
+
2900
+ // Nothing to do here
2901
+ break;
2902
+
2903
+ }
2904
+
2905
+ }
2906
+
2907
+ function removeDuplicatedPoints( points ) {
2908
+
2909
+ // Creates a new array if necessary with duplicated points removed.
2910
+ // This does not remove duplicated initial and ending points of a closed path.
2911
+
2912
+ let dupPoints = false;
2913
+ for ( let i = 1, n = points.length - 1; i < n; i ++ ) {
2914
+
2915
+ if ( points[ i ].distanceTo( points[ i + 1 ] ) < minDistance ) {
2916
+
2917
+ dupPoints = true;
2918
+ break;
2919
+
2920
+ }
2921
+
2922
+ }
2923
+
2924
+ if ( ! dupPoints ) return points;
2925
+
2926
+ const newPoints = [];
2927
+ newPoints.push( points[ 0 ] );
2928
+
2929
+ for ( let i = 1, n = points.length - 1; i < n; i ++ ) {
2930
+
2931
+ if ( points[ i ].distanceTo( points[ i + 1 ] ) >= minDistance ) {
2932
+
2933
+ newPoints.push( points[ i ] );
2934
+
2935
+ }
2936
+
2937
+ }
2938
+
2939
+ newPoints.push( points[ points.length - 1 ] );
2940
+
2941
+ return newPoints;
2942
+
2943
+ }
2944
+
2945
+ }
2946
+
2947
+
2948
+ }
2949
+
2950
+ export { SVGLoader };