super-three 0.181.0 → 0.185.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 (693) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +21332 -19201
  4. package/build/three.core.js +20908 -19853
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1947 -862
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +37 -16
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +33628 -25197
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +33394 -25000
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +14 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +13 -6
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +127 -86
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +102 -17
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMFrustum.js +31 -6
  26. package/examples/jsm/csm/CSMShadowNode.js +10 -3
  27. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  28. package/examples/jsm/effects/AsciiEffect.js +14 -1
  29. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  30. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  31. package/examples/jsm/exporters/DRACOExporter.js +27 -6
  32. package/examples/jsm/exporters/EXRExporter.js +1 -1
  33. package/examples/jsm/exporters/GLTFExporter.js +266 -21
  34. package/examples/jsm/exporters/PLYExporter.js +286 -73
  35. package/examples/jsm/exporters/USDZExporter.js +353 -99
  36. package/examples/jsm/generators/CityGenerator.js +346 -0
  37. package/examples/jsm/generators/ForestGenerator.js +347 -0
  38. package/examples/jsm/generators/TerrainGenerator.js +504 -0
  39. package/examples/jsm/generators/TreeGenerator.js +377 -0
  40. package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
  41. package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
  42. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  43. package/examples/jsm/geometries/LoftGeometry.js +355 -0
  44. package/examples/jsm/geometries/TextGeometry.js +18 -0
  45. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  46. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  47. package/examples/jsm/helpers/LightProbeHelper.js +5 -4
  48. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  49. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  50. package/examples/jsm/helpers/ViewHelper.js +83 -14
  51. package/examples/jsm/inspector/Extension.js +13 -0
  52. package/examples/jsm/inspector/Inspector.js +244 -91
  53. package/examples/jsm/inspector/RendererInspector.js +165 -39
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  55. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  56. package/examples/jsm/inspector/tabs/Console.js +241 -25
  57. package/examples/jsm/inspector/tabs/Memory.js +136 -0
  58. package/examples/jsm/inspector/tabs/Parameters.js +115 -7
  59. package/examples/jsm/inspector/tabs/Performance.js +24 -9
  60. package/examples/jsm/inspector/tabs/Settings.js +306 -0
  61. package/examples/jsm/inspector/tabs/Timeline.js +1696 -0
  62. package/examples/jsm/inspector/tabs/Viewer.js +723 -9
  63. package/examples/jsm/inspector/ui/Graph.js +162 -25
  64. package/examples/jsm/inspector/ui/Item.js +92 -13
  65. package/examples/jsm/inspector/ui/List.js +2 -2
  66. package/examples/jsm/inspector/ui/Profiler.js +1991 -44
  67. package/examples/jsm/inspector/ui/Style.js +1943 -543
  68. package/examples/jsm/inspector/ui/Tab.js +226 -5
  69. package/examples/jsm/inspector/ui/Values.js +126 -8
  70. package/examples/jsm/inspector/ui/utils.js +143 -10
  71. package/examples/jsm/interaction/InteractionManager.js +226 -0
  72. package/examples/jsm/libs/basis/README.md +0 -1
  73. package/examples/jsm/libs/demuxer_mp4.js +3 -3
  74. package/examples/jsm/libs/draco/README.md +0 -1
  75. package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
  76. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  77. package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
  78. package/examples/jsm/libs/mikktspace.module.js +34 -9
  79. package/examples/jsm/lighting/ClusteredLighting.js +55 -0
  80. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  81. package/examples/jsm/lighting/LightProbeGrid.js +681 -0
  82. package/examples/jsm/lines/LineMaterial.js +45 -16
  83. package/examples/jsm/lines/LineSegments2.js +8 -0
  84. package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
  85. package/examples/jsm/loaders/3DMLoader.js +6 -5
  86. package/examples/jsm/loaders/3MFLoader.js +2 -2
  87. package/examples/jsm/loaders/AMFLoader.js +2 -2
  88. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  89. package/examples/jsm/loaders/DRACOLoader.js +51 -18
  90. package/examples/jsm/loaders/EXRLoader.js +701 -90
  91. package/examples/jsm/loaders/FBXLoader.js +235 -37
  92. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  93. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  94. package/examples/jsm/loaders/HDRLoader.js +7 -30
  95. package/examples/jsm/loaders/KMZLoader.js +5 -5
  96. package/examples/jsm/loaders/KTX2Loader.js +58 -17
  97. package/examples/jsm/loaders/LDrawLoader.js +49 -58
  98. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  99. package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
  100. package/examples/jsm/loaders/LWOLoader.js +11 -39
  101. package/examples/jsm/loaders/LottieLoader.js +1 -1
  102. package/examples/jsm/loaders/MaterialXLoader.js +31 -9
  103. package/examples/jsm/loaders/NRRDLoader.js +5 -5
  104. package/examples/jsm/loaders/PCDLoader.js +11 -9
  105. package/examples/jsm/loaders/PLYLoader.js +218 -55
  106. package/examples/jsm/loaders/SVGLoader.js +549 -497
  107. package/examples/jsm/loaders/TDSLoader.js +0 -2
  108. package/examples/jsm/loaders/TGALoader.js +0 -2
  109. package/examples/jsm/loaders/TTFLoader.js +1 -1
  110. package/examples/jsm/loaders/USDLoader.js +127 -43
  111. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  112. package/examples/jsm/loaders/VOXLoader.js +660 -117
  113. package/examples/jsm/loaders/VRMLLoader.js +80 -3
  114. package/examples/jsm/loaders/VTKLoader.js +42 -25
  115. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  116. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  117. package/examples/jsm/loaders/usd/USDAParser.js +504 -344
  118. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  119. package/examples/jsm/loaders/usd/USDComposer.js +4627 -0
  120. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  121. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  122. package/examples/jsm/math/Octree.js +131 -1
  123. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  124. package/examples/jsm/misc/RollerCoaster.js +42 -4
  125. package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
  126. package/examples/jsm/misc/Volume.js +2 -3
  127. package/examples/jsm/misc/VolumeSlice.js +0 -1
  128. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  129. package/examples/jsm/objects/GroundedSkybox.js +1 -1
  130. package/examples/jsm/objects/LensflareMesh.js +1 -1
  131. package/examples/jsm/objects/Reflector.js +72 -25
  132. package/examples/jsm/objects/Sky.js +90 -6
  133. package/examples/jsm/objects/SkyMesh.js +150 -16
  134. package/examples/jsm/objects/Water.js +4 -3
  135. package/examples/jsm/objects/Water2.js +5 -3
  136. package/examples/jsm/objects/Water2Mesh.js +1 -1
  137. package/examples/jsm/objects/WaterMesh.js +5 -7
  138. package/examples/jsm/physics/AmmoPhysics.js +27 -15
  139. package/examples/jsm/physics/JoltPhysics.js +10 -6
  140. package/examples/jsm/physics/RapierPhysics.js +36 -7
  141. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  142. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  143. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  144. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  145. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  146. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  147. package/examples/jsm/renderers/Projector.js +246 -28
  148. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  149. package/examples/jsm/shaders/GTAOShader.js +19 -6
  150. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  151. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  152. package/examples/jsm/shaders/SAOShader.js +17 -4
  153. package/examples/jsm/shaders/SSAOShader.js +11 -1
  154. package/examples/jsm/shaders/SSRShader.js +6 -5
  155. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  156. package/examples/jsm/shaders/VignetteShader.js +1 -1
  157. package/examples/jsm/shaders/VolumeShader.js +31 -44
  158. package/examples/jsm/transpiler/AST.js +44 -0
  159. package/examples/jsm/transpiler/GLSLDecoder.js +65 -8
  160. package/examples/jsm/transpiler/Linker.js +1 -1
  161. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  162. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  163. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  164. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  165. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  166. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  167. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  168. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  169. package/examples/jsm/tsl/display/BloomNode.js +75 -25
  170. package/examples/jsm/tsl/display/CRT.js +150 -0
  171. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  172. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  173. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  174. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  175. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  176. package/examples/jsm/tsl/display/FXAANode.js +13 -14
  177. package/examples/jsm/tsl/display/GTAONode.js +40 -17
  178. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  179. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  180. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
  181. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  182. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  183. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  184. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  185. package/examples/jsm/tsl/display/PixelationPassNode.js +9 -8
  186. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  187. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
  188. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  189. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  190. package/examples/jsm/tsl/display/SSAAPassNode.js +15 -27
  191. package/examples/jsm/tsl/display/SSGINode.js +96 -62
  192. package/examples/jsm/tsl/display/SSRNode.js +831 -134
  193. package/examples/jsm/tsl/display/SSSNode.js +8 -6
  194. package/examples/jsm/tsl/display/Shape.js +29 -0
  195. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  196. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  197. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  198. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  199. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  200. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  201. package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
  202. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  203. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  204. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  205. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
  206. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  207. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  208. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  209. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  210. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  211. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  212. package/examples/jsm/tsl/math/Bayer.js +53 -3
  213. package/examples/jsm/tsl/math/curlNoise.js +107 -0
  214. package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
  215. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
  216. package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
  217. package/examples/jsm/tsl/utils/RNoise.js +51 -0
  218. package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
  219. package/examples/jsm/utils/BufferGeometryUtils.js +128 -62
  220. package/examples/jsm/utils/ColorUtils.js +76 -0
  221. package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
  222. package/examples/jsm/utils/LDrawUtils.js +1 -1
  223. package/examples/jsm/utils/SceneOptimizer.js +1 -1
  224. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  225. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  226. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  227. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  228. package/examples/jsm/webxr/ARButton.js +1 -1
  229. package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
  230. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
  231. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  232. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  233. package/package.json +28 -34
  234. package/src/Three.Core.js +3 -1
  235. package/src/Three.TSL.js +35 -14
  236. package/src/Three.WebGPU.Nodes.js +5 -0
  237. package/src/Three.WebGPU.js +13 -0
  238. package/src/Three.js +1 -0
  239. package/src/animation/AnimationAction.js +18 -4
  240. package/src/animation/AnimationClip.js +0 -139
  241. package/src/animation/AnimationMixer.js +6 -0
  242. package/src/animation/AnimationUtils.js +1 -12
  243. package/src/animation/KeyframeTrack.js +47 -8
  244. package/src/animation/PropertyBinding.js +2 -2
  245. package/src/animation/PropertyMixer.js +4 -4
  246. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  247. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  248. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  249. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  250. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  251. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  252. package/src/audio/Audio.js +1 -1
  253. package/src/audio/AudioContext.js +2 -2
  254. package/src/audio/AudioListener.js +5 -3
  255. package/src/cameras/Camera.js +34 -4
  256. package/src/cameras/CubeCamera.js +20 -0
  257. package/src/cameras/StereoCamera.js +5 -2
  258. package/src/constants.js +90 -5
  259. package/src/core/BufferAttribute.js +13 -1
  260. package/src/core/BufferGeometry.js +43 -9
  261. package/src/core/Clock.js +7 -0
  262. package/src/core/Object3D.js +69 -11
  263. package/src/core/Raycaster.js +3 -3
  264. package/src/core/RenderTarget.js +19 -6
  265. package/src/extras/PMREMGenerator.js +13 -22
  266. package/src/extras/TextureUtils.js +6 -2
  267. package/src/extras/core/ShapePath.js +149 -160
  268. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  269. package/src/geometries/ExtrudeGeometry.js +2 -2
  270. package/src/geometries/PolyhedronGeometry.js +1 -1
  271. package/src/geometries/SphereGeometry.js +8 -3
  272. package/src/geometries/TorusGeometry.js +8 -3
  273. package/src/helpers/CameraHelper.js +3 -0
  274. package/src/helpers/DirectionalLightHelper.js +6 -1
  275. package/src/helpers/HemisphereLightHelper.js +5 -0
  276. package/src/helpers/PointLightHelper.js +3 -25
  277. package/src/helpers/SpotLightHelper.js +4 -1
  278. package/src/lights/DirectionalLight.js +13 -0
  279. package/src/lights/HemisphereLight.js +10 -0
  280. package/src/lights/Light.js +1 -11
  281. package/src/lights/LightProbe.js +0 -15
  282. package/src/lights/LightShadow.js +15 -6
  283. package/src/lights/PointLight.js +15 -0
  284. package/src/lights/PointLightShadow.js +0 -86
  285. package/src/lights/SpotLight.js +22 -1
  286. package/src/lights/webgpu/IESSpotLight.js +2 -1
  287. package/src/loaders/AudioLoader.js +11 -1
  288. package/src/loaders/Cache.js +28 -0
  289. package/src/loaders/DataTextureLoader.js +75 -42
  290. package/src/loaders/FileLoader.js +2 -3
  291. package/src/loaders/ImageBitmapLoader.js +12 -9
  292. package/src/loaders/Loader.js +6 -0
  293. package/src/loaders/LoadingManager.js +5 -0
  294. package/src/loaders/MaterialLoader.js +37 -266
  295. package/src/loaders/ObjectLoader.js +48 -6
  296. package/src/loaders/nodes/NodeLoader.js +2 -2
  297. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  298. package/src/materials/LineBasicMaterial.js +4 -0
  299. package/src/materials/Material.js +198 -1
  300. package/src/materials/MeshBasicMaterial.js +24 -0
  301. package/src/materials/MeshDepthMaterial.js +10 -0
  302. package/src/materials/MeshDistanceMaterial.js +10 -0
  303. package/src/materials/MeshLambertMaterial.js +49 -1
  304. package/src/materials/MeshMatcapMaterial.js +25 -1
  305. package/src/materials/MeshNormalMaterial.js +9 -1
  306. package/src/materials/MeshPhongMaterial.js +49 -1
  307. package/src/materials/MeshPhysicalMaterial.js +38 -0
  308. package/src/materials/MeshStandardMaterial.js +42 -1
  309. package/src/materials/MeshToonMaterial.js +35 -2
  310. package/src/materials/PointsMaterial.js +7 -0
  311. package/src/materials/ShaderMaterial.js +106 -1
  312. package/src/materials/SpriteMaterial.js +7 -0
  313. package/src/materials/nodes/Line2NodeMaterial.js +380 -297
  314. package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
  315. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  316. package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
  317. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +3 -30
  318. package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
  319. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -15
  320. package/src/materials/nodes/NodeMaterial.js +153 -89
  321. package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
  322. package/src/materials/nodes/manager/NodeMaterialObserver.js +234 -100
  323. package/src/math/Box3.js +5 -0
  324. package/src/math/FrustumArray.js +103 -133
  325. package/src/math/Interpolant.js +1 -1
  326. package/src/math/Line3.js +6 -5
  327. package/src/math/MathUtils.js +12 -12
  328. package/src/math/Matrix2.js +13 -9
  329. package/src/math/Matrix3.js +24 -9
  330. package/src/math/Matrix4.js +112 -74
  331. package/src/math/Plane.js +4 -3
  332. package/src/math/Quaternion.js +3 -29
  333. package/src/math/Sphere.js +1 -1
  334. package/src/math/Triangle.js +1 -1
  335. package/src/math/Vector2.js +13 -9
  336. package/src/math/Vector3.js +17 -15
  337. package/src/math/Vector4.js +15 -11
  338. package/src/math/interpolants/BezierInterpolant.js +106 -0
  339. package/src/nodes/Nodes.js +86 -71
  340. package/src/nodes/TSL.js +15 -13
  341. package/src/nodes/accessors/Arrays.js +5 -5
  342. package/src/nodes/accessors/Batch.js +108 -0
  343. package/src/nodes/accessors/Bitangent.js +7 -7
  344. package/src/nodes/accessors/BufferAttributeNode.js +120 -17
  345. package/src/nodes/accessors/BufferNode.js +29 -2
  346. package/src/nodes/accessors/Camera.js +149 -28
  347. package/src/nodes/accessors/ClippingNode.js +5 -5
  348. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  349. package/src/nodes/accessors/Instance.js +264 -0
  350. package/src/nodes/accessors/MaterialNode.js +27 -3
  351. package/src/nodes/accessors/MaterialProperties.js +6 -8
  352. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  353. package/src/nodes/accessors/ModelNode.js +1 -1
  354. package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
  355. package/src/nodes/accessors/Normal.js +24 -24
  356. package/src/nodes/accessors/Object3DNode.js +1 -1
  357. package/src/nodes/accessors/Position.js +39 -3
  358. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  359. package/src/nodes/accessors/ReferenceNode.js +9 -8
  360. package/src/nodes/accessors/ReflectVector.js +3 -3
  361. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  362. package/src/nodes/accessors/SceneProperties.js +47 -0
  363. package/src/nodes/accessors/Skinning.js +263 -0
  364. package/src/nodes/accessors/StorageBufferNode.js +16 -27
  365. package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
  366. package/src/nodes/accessors/StorageTextureNode.js +74 -11
  367. package/src/nodes/accessors/Tangent.js +8 -18
  368. package/src/nodes/accessors/Texture3DNode.js +32 -35
  369. package/src/nodes/accessors/TextureNode.js +124 -25
  370. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  371. package/src/nodes/accessors/UserDataNode.js +1 -2
  372. package/src/nodes/accessors/VertexColorNode.js +1 -2
  373. package/src/nodes/code/FunctionCallNode.js +1 -1
  374. package/src/nodes/code/FunctionNode.js +4 -19
  375. package/src/nodes/core/ArrayNode.js +21 -2
  376. package/src/nodes/core/AssignNode.js +3 -3
  377. package/src/nodes/core/AttributeNode.js +3 -3
  378. package/src/nodes/core/BypassNode.js +1 -1
  379. package/src/nodes/core/ContextNode.js +104 -5
  380. package/src/nodes/core/IndexNode.js +2 -1
  381. package/src/nodes/core/InputNode.js +1 -1
  382. package/src/nodes/core/InspectorNode.js +1 -1
  383. package/src/nodes/core/IsolateNode.js +1 -1
  384. package/src/nodes/core/MRTNode.js +55 -4
  385. package/src/nodes/core/Node.js +151 -17
  386. package/src/nodes/core/NodeBuilder.js +479 -101
  387. package/src/nodes/core/NodeError.js +28 -0
  388. package/src/nodes/core/NodeFrame.js +12 -4
  389. package/src/nodes/core/NodeUtils.js +20 -18
  390. package/src/nodes/core/OutputStructNode.js +13 -11
  391. package/src/nodes/core/OverrideContextNode.js +153 -0
  392. package/src/nodes/core/ParameterNode.js +4 -4
  393. package/src/nodes/core/PropertyNode.js +66 -4
  394. package/src/nodes/core/StackNode.js +91 -20
  395. package/src/nodes/core/StackTrace.js +139 -0
  396. package/src/nodes/core/StructNode.js +20 -8
  397. package/src/nodes/core/StructTypeNode.js +17 -23
  398. package/src/nodes/core/SubBuildNode.js +2 -2
  399. package/src/nodes/core/UniformGroupNode.js +36 -6
  400. package/src/nodes/core/UniformNode.js +21 -5
  401. package/src/nodes/core/VarNode.js +56 -23
  402. package/src/nodes/core/VaryingNode.js +14 -21
  403. package/src/nodes/display/BlendModes.js +1 -105
  404. package/src/nodes/display/BumpMapNode.js +6 -1
  405. package/src/nodes/display/ColorAdjustment.js +27 -9
  406. package/src/nodes/display/ColorSpaceNode.js +3 -3
  407. package/src/nodes/display/FrontFacingNode.js +38 -9
  408. package/src/nodes/display/NormalMapNode.js +41 -6
  409. package/src/nodes/display/PassNode.js +157 -56
  410. package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
  411. package/src/nodes/display/RenderOutputNode.js +19 -10
  412. package/src/nodes/display/ScreenNode.js +4 -2
  413. package/src/nodes/display/ToneMappingNode.js +1 -1
  414. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  415. package/src/nodes/display/ViewportDepthNode.js +52 -4
  416. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  417. package/src/nodes/display/ViewportTextureNode.js +39 -11
  418. package/src/nodes/fog/Fog.js +18 -35
  419. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  420. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  421. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  422. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  423. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  424. package/src/nodes/functions/VolumetricLightingModel.js +40 -7
  425. package/src/nodes/geometry/RangeNode.js +5 -3
  426. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  427. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  428. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  429. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  430. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  431. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -5
  432. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  433. package/src/nodes/lighting/EnvironmentNode.js +30 -5
  434. package/src/nodes/lighting/IESSpotLightNode.js +40 -2
  435. package/src/nodes/lighting/LightingContextNode.js +10 -2
  436. package/src/nodes/lighting/LightsNode.js +97 -65
  437. package/src/nodes/lighting/PointShadowNode.js +166 -148
  438. package/src/nodes/lighting/ShadowFilterNode.js +74 -117
  439. package/src/nodes/lighting/ShadowNode.js +149 -51
  440. package/src/nodes/materialx/lib/mx_noise.js +2 -2
  441. package/src/nodes/math/BitcastNode.js +1 -1
  442. package/src/nodes/math/BitcountNode.js +433 -0
  443. package/src/nodes/math/ConditionalNode.js +6 -6
  444. package/src/nodes/math/MathNode.js +115 -52
  445. package/src/nodes/math/OperatorNode.js +24 -23
  446. package/src/nodes/math/PackFloatNode.js +98 -0
  447. package/src/nodes/math/UnpackFloatNode.js +96 -0
  448. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  449. package/src/nodes/pmrem/PMREMNode.js +34 -3
  450. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  451. package/src/nodes/tsl/TSLBase.js +1 -1
  452. package/src/nodes/tsl/TSLCore.js +99 -33
  453. package/src/nodes/utils/ArrayElementNode.js +14 -1
  454. package/src/nodes/utils/ConvertNode.js +1 -1
  455. package/src/nodes/utils/DebugNode.js +12 -12
  456. package/src/nodes/utils/EquirectUV.js +30 -5
  457. package/src/nodes/utils/EventNode.js +31 -2
  458. package/src/nodes/utils/FlipNode.js +1 -1
  459. package/src/nodes/utils/FunctionOverloadingNode.js +2 -2
  460. package/src/nodes/utils/JoinNode.js +3 -3
  461. package/src/nodes/utils/LoopNode.js +1 -1
  462. package/src/nodes/utils/MemberNode.js +2 -2
  463. package/src/nodes/utils/Packing.js +48 -5
  464. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  465. package/src/nodes/utils/RTTNode.js +41 -25
  466. package/src/nodes/utils/ReflectorNode.js +4 -4
  467. package/src/nodes/utils/Remap.js +48 -0
  468. package/src/nodes/utils/RotateNode.js +1 -1
  469. package/src/nodes/utils/SampleNode.js +1 -1
  470. package/src/nodes/utils/SetNode.js +1 -1
  471. package/src/nodes/utils/SplitNode.js +1 -1
  472. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  473. package/src/nodes/utils/StorageArrayElementNode.js +1 -1
  474. package/src/nodes/utils/UVUtils.js +28 -0
  475. package/src/objects/BatchedMesh.js +66 -30
  476. package/src/objects/InstancedMesh.js +19 -3
  477. package/src/objects/Line.js +1 -1
  478. package/src/objects/Mesh.js +1 -1
  479. package/src/objects/Points.js +1 -1
  480. package/src/objects/SkinnedMesh.js +26 -9
  481. package/src/renderers/WebGLRenderer.js +344 -156
  482. package/src/renderers/common/Animation.js +3 -3
  483. package/src/renderers/common/Attributes.js +15 -1
  484. package/src/renderers/common/Backend.js +78 -13
  485. package/src/renderers/common/Background.js +26 -13
  486. package/src/renderers/common/BindGroup.js +1 -16
  487. package/src/renderers/common/Binding.js +11 -0
  488. package/src/renderers/common/Bindings.js +141 -57
  489. package/src/renderers/common/BlendMode.js +143 -0
  490. package/src/renderers/common/Buffer.js +49 -0
  491. package/src/renderers/common/BundleGroup.js +1 -1
  492. package/src/renderers/common/ChainMap.js +30 -6
  493. package/src/renderers/common/ClippingContext.js +10 -2
  494. package/src/renderers/common/ComputePipeline.js +1 -1
  495. package/src/renderers/common/CubeRenderTarget.js +51 -7
  496. package/src/renderers/common/Geometries.js +29 -3
  497. package/src/renderers/common/Info.js +374 -4
  498. package/src/renderers/common/InspectorBase.js +6 -1
  499. package/src/renderers/common/Lighting.js +51 -19
  500. package/src/renderers/common/Pipelines.js +40 -7
  501. package/src/renderers/common/PostProcessing.js +8 -206
  502. package/src/renderers/common/ReadbackBuffer.js +78 -0
  503. package/src/renderers/common/RenderBundle.js +3 -1
  504. package/src/renderers/common/RenderBundles.js +7 -3
  505. package/src/renderers/common/RenderContext.js +16 -0
  506. package/src/renderers/common/RenderContexts.js +33 -49
  507. package/src/renderers/common/RenderList.js +41 -4
  508. package/src/renderers/common/RenderLists.js +2 -1
  509. package/src/renderers/common/RenderObject.js +88 -16
  510. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  511. package/src/renderers/common/RenderObjects.js +21 -5
  512. package/src/renderers/common/RenderPipeline.js +232 -17
  513. package/src/renderers/common/Renderer.js +700 -163
  514. package/src/renderers/common/Sampler.js +16 -48
  515. package/src/renderers/common/StorageBuffer.js +13 -1
  516. package/src/renderers/common/Textures.js +121 -9
  517. package/src/renderers/common/TimestampQueryPool.js +6 -4
  518. package/src/renderers/common/Uniform.js +8 -0
  519. package/src/renderers/common/UniformsGroup.js +84 -1
  520. package/src/renderers/common/XRManager.js +377 -51
  521. package/src/renderers/common/extras/PMREMGenerator.js +40 -61
  522. package/src/renderers/common/nodes/NodeBuilderState.js +10 -2
  523. package/src/renderers/common/nodes/NodeLibrary.js +4 -4
  524. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +298 -106
  525. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  526. package/src/renderers/common/nodes/NodeUniformBuffer.js +65 -0
  527. package/src/renderers/shaders/DFGLUTData.js +19 -34
  528. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  529. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  530. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  531. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  532. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  533. package/src/renderers/shaders/ShaderChunk/common.glsl.js +13 -4
  534. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
  535. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  536. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +9 -13
  537. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  538. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
  539. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  540. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  541. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  542. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  543. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +3 -1
  544. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  545. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  546. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
  547. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  548. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
  549. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  550. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  551. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  552. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  553. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  554. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +2 -2
  555. package/src/renderers/shaders/ShaderChunk.js +5 -3
  556. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  557. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  558. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +2 -3
  559. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  560. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  561. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  562. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  563. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  564. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  565. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  566. package/src/renderers/shaders/ShaderLib.js +7 -6
  567. package/src/renderers/shaders/UniformsLib.js +7 -5
  568. package/src/renderers/shaders/UniformsUtils.js +27 -5
  569. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  570. package/src/renderers/webgl/WebGLBackground.js +15 -15
  571. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  572. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  573. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  574. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  575. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  576. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  577. package/src/renderers/webgl/WebGLLights.js +18 -1
  578. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  579. package/src/renderers/webgl/WebGLObjects.js +3 -1
  580. package/src/renderers/webgl/WebGLOutput.js +271 -0
  581. package/src/renderers/webgl/WebGLProgram.js +54 -113
  582. package/src/renderers/webgl/WebGLPrograms.js +74 -55
  583. package/src/renderers/webgl/WebGLRenderLists.js +24 -1
  584. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  585. package/src/renderers/webgl/WebGLShaderCache.js +5 -11
  586. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  587. package/src/renderers/webgl/WebGLState.js +75 -37
  588. package/src/renderers/webgl/WebGLTextures.js +230 -56
  589. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  590. package/src/renderers/webgl/WebGLUniformsGroups.js +82 -35
  591. package/src/renderers/webgl/WebGLUtils.js +6 -2
  592. package/src/renderers/webgl-fallback/WebGLBackend.js +322 -92
  593. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  594. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +295 -66
  595. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  596. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  597. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  598. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +118 -73
  599. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  600. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +9 -3
  601. package/src/renderers/webgpu/WebGPUBackend.js +733 -302
  602. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  603. package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
  604. package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
  605. package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
  606. package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
  607. package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
  608. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
  609. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
  610. package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
  611. package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
  612. package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
  613. package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
  614. package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
  615. package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
  616. package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
  617. package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
  618. package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
  619. package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
  620. package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
  621. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
  622. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
  623. package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
  624. package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
  625. package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
  626. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
  627. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +526 -93
  628. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
  629. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +194 -61
  630. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +395 -234
  631. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  632. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  633. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +224 -91
  634. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +228 -213
  635. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +428 -175
  636. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +40 -25
  637. package/src/renderers/webgpu/utils/WebGPUUtils.js +70 -13
  638. package/src/renderers/webxr/WebXRController.js +12 -0
  639. package/src/renderers/webxr/WebXRManager.js +4 -2
  640. package/src/textures/CubeDepthTexture.js +76 -0
  641. package/src/textures/DepthTexture.js +1 -1
  642. package/src/textures/ExternalTexture.js +0 -3
  643. package/src/textures/HTMLTexture.js +74 -0
  644. package/src/textures/Source.js +2 -2
  645. package/src/textures/Texture.js +16 -5
  646. package/src/utils.js +280 -3
  647. package/examples/fonts/LICENSE +0 -13
  648. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  649. package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
  650. package/examples/fonts/README.md +0 -11
  651. package/examples/fonts/droid/NOTICE +0 -190
  652. package/examples/fonts/droid/README.txt +0 -18
  653. package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
  654. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
  655. package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
  656. package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
  657. package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
  658. package/examples/fonts/gentilis_bold.typeface.json +0 -1
  659. package/examples/fonts/gentilis_regular.typeface.json +0 -1
  660. package/examples/fonts/helvetiker_bold.typeface.json +0 -1
  661. package/examples/fonts/helvetiker_regular.typeface.json +0 -1
  662. package/examples/fonts/optimer_bold.typeface.json +0 -1
  663. package/examples/fonts/optimer_regular.typeface.json +0 -1
  664. package/examples/fonts/ttf/README.md +0 -9
  665. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  666. package/examples/jsm/libs/ammo.wasm.js +0 -822
  667. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  668. package/examples/jsm/libs/draco/draco_encoder.js +0 -33
  669. package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
  670. package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
  671. package/examples/jsm/libs/opentype.module.js +0 -14506
  672. package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
  673. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
  674. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  675. package/examples/jsm/lighting/TiledLighting.js +0 -42
  676. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  677. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  678. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  679. package/examples/jsm/tsl/display/AnamorphicNode.js +0 -282
  680. package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
  681. package/src/nodes/accessors/BatchNode.js +0 -163
  682. package/src/nodes/accessors/InstanceNode.js +0 -244
  683. package/src/nodes/accessors/InstancedMeshNode.js +0 -50
  684. package/src/nodes/accessors/SceneNode.js +0 -145
  685. package/src/nodes/accessors/SkinningNode.js +0 -327
  686. package/src/nodes/code/ScriptableNode.js +0 -726
  687. package/src/nodes/code/ScriptableValueNode.js +0 -253
  688. package/src/nodes/display/PosterizeNode.js +0 -65
  689. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  690. package/src/nodes/utils/RemapNode.js +0 -125
  691. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  692. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  693. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -0,0 +1,1977 @@
1
+ import {
2
+ Color,
3
+ ColorManagement,
4
+ MathUtils,
5
+ Matrix4,
6
+ Vector3,
7
+ SRGBColorSpace
8
+ } from 'three';
9
+
10
+ /**
11
+ * Utility functions for parsing
12
+ */
13
+
14
+ function getElementsByTagName( xml, name ) {
15
+
16
+ // Non recursive xml.getElementsByTagName() ...
17
+
18
+ const array = [];
19
+ const childNodes = xml.childNodes;
20
+
21
+ for ( let i = 0, l = childNodes.length; i < l; i ++ ) {
22
+
23
+ const child = childNodes[ i ];
24
+
25
+ if ( child.nodeName === name ) {
26
+
27
+ array.push( child );
28
+
29
+ }
30
+
31
+ }
32
+
33
+ return array;
34
+
35
+ }
36
+
37
+ function parseStrings( text ) {
38
+
39
+ if ( text.length === 0 ) return [];
40
+
41
+ return text.trim().split( /\s+/ );
42
+
43
+ }
44
+
45
+ function parseFloats( text ) {
46
+
47
+ if ( text.length === 0 ) return [];
48
+
49
+ return text.trim().split( /\s+/ ).map( parseFloat );
50
+
51
+ }
52
+
53
+ function parseInts( text ) {
54
+
55
+ if ( text.length === 0 ) return [];
56
+
57
+ return text.trim().split( /\s+/ ).map( s => parseInt( s ) );
58
+
59
+ }
60
+
61
+ function parseId( text ) {
62
+
63
+ return text.substring( 1 );
64
+
65
+ }
66
+
67
+ /**
68
+ * ColladaParser handles XML parsing and converts Collada XML to intermediate data structures.
69
+ */
70
+ class ColladaParser {
71
+
72
+ constructor() {
73
+
74
+ this.count = 0;
75
+
76
+ }
77
+
78
+ generateId() {
79
+
80
+ return 'three_default_' + ( this.count ++ );
81
+
82
+ }
83
+
84
+ parse( text ) {
85
+
86
+ if ( text.length === 0 ) {
87
+
88
+ return null;
89
+
90
+ }
91
+
92
+ const xml = new DOMParser().parseFromString( text, 'application/xml' );
93
+
94
+ const collada = getElementsByTagName( xml, 'COLLADA' )[ 0 ];
95
+
96
+ const parserError = xml.getElementsByTagName( 'parsererror' )[ 0 ];
97
+ if ( parserError !== undefined ) {
98
+
99
+ // Chrome will return parser error with a div in it
100
+
101
+ const errorElement = getElementsByTagName( parserError, 'div' )[ 0 ];
102
+ let errorText;
103
+
104
+ if ( errorElement ) {
105
+
106
+ errorText = errorElement.textContent;
107
+
108
+ } else {
109
+
110
+ errorText = this.parserErrorToText( parserError );
111
+
112
+ }
113
+
114
+ console.error( 'THREE.ColladaLoader: Failed to parse collada file.\n', errorText );
115
+
116
+ return null;
117
+
118
+ }
119
+
120
+ // metadata
121
+
122
+ const version = collada.getAttribute( 'version' );
123
+ console.debug( 'THREE.ColladaLoader: File version', version );
124
+
125
+ const asset = this.parseAsset( getElementsByTagName( collada, 'asset' )[ 0 ] );
126
+
127
+ //
128
+
129
+ const library = {
130
+ animations: {},
131
+ clips: {},
132
+ controllers: {},
133
+ images: {},
134
+ effects: {},
135
+ materials: {},
136
+ cameras: {},
137
+ lights: {},
138
+ geometries: {},
139
+ nodes: {},
140
+ visualScenes: {},
141
+ kinematicsModels: {},
142
+ physicsModels: {},
143
+ kinematicsScenes: {},
144
+ joints: {}
145
+ };
146
+
147
+ this.library = library;
148
+ this.collada = collada;
149
+
150
+ this.parseLibrary( collada, 'library_animations', 'animation', this.parseAnimation.bind( this ) );
151
+ this.parseLibrary( collada, 'library_animation_clips', 'animation_clip', this.parseAnimationClip.bind( this ) );
152
+ this.parseLibrary( collada, 'library_controllers', 'controller', this.parseController.bind( this ) );
153
+ this.parseLibrary( collada, 'library_images', 'image', this.parseImage.bind( this ) );
154
+ this.parseLibrary( collada, 'library_effects', 'effect', this.parseEffect.bind( this ) );
155
+ this.parseLibrary( collada, 'library_materials', 'material', this.parseMaterial.bind( this ) );
156
+ this.parseLibrary( collada, 'library_cameras', 'camera', this.parseCamera.bind( this ) );
157
+ this.parseLibrary( collada, 'library_lights', 'light', this.parseLight.bind( this ) );
158
+ this.parseLibrary( collada, 'library_geometries', 'geometry', this.parseGeometry.bind( this ) );
159
+ this.parseLibrary( collada, 'library_nodes', 'node', this.parseNode.bind( this ) );
160
+ this.parseLibrary( collada, 'library_visual_scenes', 'visual_scene', this.parseVisualScene.bind( this ) );
161
+ this.parseLibrary( collada, 'library_joints', 'joint', this.parseLibraryJoint.bind( this ) );
162
+ this.parseLibrary( collada, 'library_kinematics_models', 'kinematics_model', this.parseKinematicsModel.bind( this ) );
163
+ this.parseLibrary( collada, 'library_physics_models', 'physics_model', this.parsePhysicsModel.bind( this ) );
164
+ this.parseLibrary( collada, 'scene', 'instance_kinematics_scene', this.parseKinematicsScene.bind( this ) );
165
+
166
+ return {
167
+ library: library,
168
+ asset: asset,
169
+ collada: collada
170
+ };
171
+
172
+ }
173
+
174
+ // convert the parser error element into text with each child elements text
175
+ // separated by new lines.
176
+
177
+ parserErrorToText( parserError ) {
178
+
179
+ const parts = [];
180
+ const stack = [ parserError ];
181
+
182
+ while ( stack.length ) {
183
+
184
+ const node = stack.shift();
185
+
186
+ if ( node.nodeType === Node.TEXT_NODE ) {
187
+
188
+ parts.push( node.textContent );
189
+
190
+ } else {
191
+
192
+ parts.push( '\n' );
193
+ stack.push( ...node.childNodes );
194
+
195
+ }
196
+
197
+ }
198
+
199
+ return parts.join( '' ).trim();
200
+
201
+ }
202
+
203
+ // asset
204
+
205
+ parseAsset( xml ) {
206
+
207
+ return {
208
+ unit: this.parseAssetUnit( getElementsByTagName( xml, 'unit' )[ 0 ] ),
209
+ upAxis: this.parseAssetUpAxis( getElementsByTagName( xml, 'up_axis' )[ 0 ] )
210
+ };
211
+
212
+ }
213
+
214
+ parseAssetUnit( xml ) {
215
+
216
+ if ( ( xml !== undefined ) && ( xml.hasAttribute( 'meter' ) === true ) ) {
217
+
218
+ return parseFloat( xml.getAttribute( 'meter' ) );
219
+
220
+ } else {
221
+
222
+ return 1; // default 1 meter
223
+
224
+ }
225
+
226
+ }
227
+
228
+ parseAssetUpAxis( xml ) {
229
+
230
+ return xml !== undefined ? xml.textContent : 'Y_UP';
231
+
232
+ }
233
+
234
+ // library
235
+
236
+ parseLibrary( xml, libraryName, nodeName, parser ) {
237
+
238
+ const library = getElementsByTagName( xml, libraryName )[ 0 ];
239
+
240
+ if ( library !== undefined ) {
241
+
242
+ const elements = getElementsByTagName( library, nodeName );
243
+
244
+ for ( let i = 0; i < elements.length; i ++ ) {
245
+
246
+ parser( elements[ i ] );
247
+
248
+ }
249
+
250
+ }
251
+
252
+ }
253
+
254
+ // animation
255
+
256
+ parseAnimation( xml ) {
257
+
258
+ const data = {
259
+ sources: {},
260
+ samplers: {},
261
+ channels: {}
262
+ };
263
+
264
+ let hasChildren = false;
265
+
266
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
267
+
268
+ const child = xml.childNodes[ i ];
269
+
270
+ if ( child.nodeType !== 1 ) continue;
271
+
272
+ let id;
273
+
274
+ switch ( child.nodeName ) {
275
+
276
+ case 'source':
277
+ id = child.getAttribute( 'id' );
278
+ data.sources[ id ] = this.parseSource( child );
279
+ break;
280
+
281
+ case 'sampler':
282
+ id = child.getAttribute( 'id' );
283
+ data.samplers[ id ] = this.parseAnimationSampler( child );
284
+ break;
285
+
286
+ case 'channel':
287
+ id = child.getAttribute( 'target' );
288
+ data.channels[ id ] = this.parseAnimationChannel( child );
289
+ break;
290
+
291
+ case 'animation':
292
+ // hierarchy of related animations
293
+ this.parseAnimation( child );
294
+ hasChildren = true;
295
+ break;
296
+
297
+ default:
298
+
299
+ }
300
+
301
+ }
302
+
303
+ if ( hasChildren === false ) {
304
+
305
+ // since 'id' attributes can be optional, it's necessary to generate a UUID for unique assignment
306
+
307
+ this.library.animations[ xml.getAttribute( 'id' ) || MathUtils.generateUUID() ] = data;
308
+
309
+ }
310
+
311
+ }
312
+
313
+ parseAnimationSampler( xml ) {
314
+
315
+ const data = {
316
+ inputs: {},
317
+ };
318
+
319
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
320
+
321
+ const child = xml.childNodes[ i ];
322
+
323
+ if ( child.nodeType !== 1 ) continue;
324
+
325
+ switch ( child.nodeName ) {
326
+
327
+ case 'input':
328
+ const id = parseId( child.getAttribute( 'source' ) );
329
+ const semantic = child.getAttribute( 'semantic' );
330
+ data.inputs[ semantic ] = id;
331
+ break;
332
+
333
+ }
334
+
335
+ }
336
+
337
+ return data;
338
+
339
+ }
340
+
341
+ parseAnimationChannel( xml ) {
342
+
343
+ const data = {};
344
+
345
+ const target = xml.getAttribute( 'target' );
346
+
347
+ // parsing SID Addressing Syntax
348
+
349
+ let parts = target.split( '/' );
350
+
351
+ const id = parts.shift();
352
+ let sid = parts.shift();
353
+
354
+ // check selection syntax
355
+
356
+ const arraySyntax = ( sid.indexOf( '(' ) !== - 1 );
357
+ const memberSyntax = ( sid.indexOf( '.' ) !== - 1 );
358
+
359
+ if ( memberSyntax ) {
360
+
361
+ // member selection access
362
+
363
+ parts = sid.split( '.' );
364
+ sid = parts.shift();
365
+ data.member = parts.shift();
366
+
367
+ } else if ( arraySyntax ) {
368
+
369
+ // array-access syntax. can be used to express fields in one-dimensional vectors or two-dimensional matrices.
370
+
371
+ const indices = sid.split( '(' );
372
+ sid = indices.shift();
373
+
374
+ for ( let i = 0; i < indices.length; i ++ ) {
375
+
376
+ indices[ i ] = parseInt( indices[ i ].replace( /\)/, '' ) );
377
+
378
+ }
379
+
380
+ data.indices = indices;
381
+
382
+ }
383
+
384
+ data.id = id;
385
+ data.sid = sid;
386
+
387
+ data.arraySyntax = arraySyntax;
388
+ data.memberSyntax = memberSyntax;
389
+
390
+ data.sampler = parseId( xml.getAttribute( 'source' ) );
391
+
392
+ return data;
393
+
394
+ }
395
+
396
+ // animation clips
397
+
398
+ parseAnimationClip( xml ) {
399
+
400
+ const data = {
401
+ name: xml.getAttribute( 'id' ) || 'default',
402
+ start: parseFloat( xml.getAttribute( 'start' ) || 0 ),
403
+ end: parseFloat( xml.getAttribute( 'end' ) || 0 ),
404
+ animations: []
405
+ };
406
+
407
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
408
+
409
+ const child = xml.childNodes[ i ];
410
+
411
+ if ( child.nodeType !== 1 ) continue;
412
+
413
+ switch ( child.nodeName ) {
414
+
415
+ case 'instance_animation':
416
+ data.animations.push( parseId( child.getAttribute( 'url' ) ) );
417
+ break;
418
+
419
+ }
420
+
421
+ }
422
+
423
+ this.library.clips[ xml.getAttribute( 'id' ) ] = data;
424
+
425
+ }
426
+
427
+ // controller
428
+
429
+ parseController( xml ) {
430
+
431
+ const data = {};
432
+
433
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
434
+
435
+ const child = xml.childNodes[ i ];
436
+
437
+ if ( child.nodeType !== 1 ) continue;
438
+
439
+ switch ( child.nodeName ) {
440
+
441
+ case 'skin':
442
+ // there is exactly one skin per controller
443
+ data.id = parseId( child.getAttribute( 'source' ) );
444
+ data.skin = this.parseSkin( child );
445
+ break;
446
+
447
+ case 'morph':
448
+ data.id = parseId( child.getAttribute( 'source' ) );
449
+ console.warn( 'THREE.ColladaLoader: Morph target animation not supported yet.' );
450
+ break;
451
+
452
+ }
453
+
454
+ }
455
+
456
+ this.library.controllers[ xml.getAttribute( 'id' ) ] = data;
457
+
458
+ }
459
+
460
+ parseSkin( xml ) {
461
+
462
+ const data = {
463
+ sources: {}
464
+ };
465
+
466
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
467
+
468
+ const child = xml.childNodes[ i ];
469
+
470
+ if ( child.nodeType !== 1 ) continue;
471
+
472
+ switch ( child.nodeName ) {
473
+
474
+ case 'bind_shape_matrix':
475
+ data.bindShapeMatrix = parseFloats( child.textContent );
476
+ break;
477
+
478
+ case 'source':
479
+ const id = child.getAttribute( 'id' );
480
+ data.sources[ id ] = this.parseSource( child );
481
+ break;
482
+
483
+ case 'joints':
484
+ data.joints = this.parseJoints( child );
485
+ break;
486
+
487
+ case 'vertex_weights':
488
+ data.vertexWeights = this.parseVertexWeights( child );
489
+ break;
490
+
491
+ }
492
+
493
+ }
494
+
495
+ return data;
496
+
497
+ }
498
+
499
+ parseJoints( xml ) {
500
+
501
+ const data = {
502
+ inputs: {}
503
+ };
504
+
505
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
506
+
507
+ const child = xml.childNodes[ i ];
508
+
509
+ if ( child.nodeType !== 1 ) continue;
510
+
511
+ switch ( child.nodeName ) {
512
+
513
+ case 'input':
514
+ const semantic = child.getAttribute( 'semantic' );
515
+ const id = parseId( child.getAttribute( 'source' ) );
516
+ data.inputs[ semantic ] = id;
517
+ break;
518
+
519
+ }
520
+
521
+ }
522
+
523
+ return data;
524
+
525
+ }
526
+
527
+ parseVertexWeights( xml ) {
528
+
529
+ const data = {
530
+ inputs: {}
531
+ };
532
+
533
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
534
+
535
+ const child = xml.childNodes[ i ];
536
+
537
+ if ( child.nodeType !== 1 ) continue;
538
+
539
+ switch ( child.nodeName ) {
540
+
541
+ case 'input':
542
+ const semantic = child.getAttribute( 'semantic' );
543
+ const id = parseId( child.getAttribute( 'source' ) );
544
+ const offset = parseInt( child.getAttribute( 'offset' ) );
545
+ data.inputs[ semantic ] = { id: id, offset: offset };
546
+ break;
547
+
548
+ case 'vcount':
549
+ data.vcount = parseInts( child.textContent );
550
+ break;
551
+
552
+ case 'v':
553
+ data.v = parseInts( child.textContent );
554
+ break;
555
+
556
+ }
557
+
558
+ }
559
+
560
+ return data;
561
+
562
+ }
563
+
564
+ // image
565
+
566
+ parseImage( xml ) {
567
+
568
+ const data = {
569
+ init_from: getElementsByTagName( xml, 'init_from' )[ 0 ].textContent
570
+ };
571
+
572
+ this.library.images[ xml.getAttribute( 'id' ) ] = data;
573
+
574
+ }
575
+
576
+ // effect
577
+
578
+ parseEffect( xml ) {
579
+
580
+ const data = {};
581
+
582
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
583
+
584
+ const child = xml.childNodes[ i ];
585
+
586
+ if ( child.nodeType !== 1 ) continue;
587
+
588
+ switch ( child.nodeName ) {
589
+
590
+ case 'profile_COMMON':
591
+ data.profile = this.parseEffectProfileCOMMON( child );
592
+ break;
593
+
594
+ }
595
+
596
+ }
597
+
598
+ this.library.effects[ xml.getAttribute( 'id' ) ] = data;
599
+
600
+ }
601
+
602
+ parseEffectProfileCOMMON( xml ) {
603
+
604
+ const data = {
605
+ surfaces: {},
606
+ samplers: {}
607
+ };
608
+
609
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
610
+
611
+ const child = xml.childNodes[ i ];
612
+
613
+ if ( child.nodeType !== 1 ) continue;
614
+
615
+ switch ( child.nodeName ) {
616
+
617
+ case 'newparam':
618
+ this.parseEffectNewparam( child, data );
619
+ break;
620
+
621
+ case 'technique':
622
+ data.technique = this.parseEffectTechnique( child );
623
+ break;
624
+
625
+ case 'extra':
626
+ data.extra = this.parseEffectExtra( child );
627
+ break;
628
+
629
+ }
630
+
631
+ }
632
+
633
+ return data;
634
+
635
+ }
636
+
637
+ parseEffectNewparam( xml, data ) {
638
+
639
+ const sid = xml.getAttribute( 'sid' );
640
+
641
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
642
+
643
+ const child = xml.childNodes[ i ];
644
+
645
+ if ( child.nodeType !== 1 ) continue;
646
+
647
+ switch ( child.nodeName ) {
648
+
649
+ case 'surface':
650
+ data.surfaces[ sid ] = this.parseEffectSurface( child );
651
+ break;
652
+
653
+ case 'sampler2D':
654
+ data.samplers[ sid ] = this.parseEffectSampler( child );
655
+ break;
656
+
657
+ }
658
+
659
+ }
660
+
661
+ }
662
+
663
+ parseEffectSurface( xml ) {
664
+
665
+ const data = {};
666
+
667
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
668
+
669
+ const child = xml.childNodes[ i ];
670
+
671
+ if ( child.nodeType !== 1 ) continue;
672
+
673
+ switch ( child.nodeName ) {
674
+
675
+ case 'init_from':
676
+ data.init_from = child.textContent;
677
+ break;
678
+
679
+ }
680
+
681
+ }
682
+
683
+ return data;
684
+
685
+ }
686
+
687
+ parseEffectSampler( xml ) {
688
+
689
+ const data = {};
690
+
691
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
692
+
693
+ const child = xml.childNodes[ i ];
694
+
695
+ if ( child.nodeType !== 1 ) continue;
696
+
697
+ switch ( child.nodeName ) {
698
+
699
+ case 'source':
700
+ data.source = child.textContent;
701
+ break;
702
+
703
+ }
704
+
705
+ }
706
+
707
+ return data;
708
+
709
+ }
710
+
711
+ parseEffectTechnique( xml ) {
712
+
713
+ const data = {};
714
+
715
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
716
+
717
+ const child = xml.childNodes[ i ];
718
+
719
+ if ( child.nodeType !== 1 ) continue;
720
+
721
+ switch ( child.nodeName ) {
722
+
723
+ case 'constant':
724
+ case 'lambert':
725
+ case 'blinn':
726
+ case 'phong':
727
+ data.type = child.nodeName;
728
+ data.parameters = this.parseEffectParameters( child );
729
+ break;
730
+
731
+ case 'extra':
732
+ data.extra = this.parseEffectExtra( child );
733
+ break;
734
+
735
+ }
736
+
737
+ }
738
+
739
+ return data;
740
+
741
+ }
742
+
743
+ parseEffectParameters( xml ) {
744
+
745
+ const data = {};
746
+
747
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
748
+
749
+ const child = xml.childNodes[ i ];
750
+
751
+ if ( child.nodeType !== 1 ) continue;
752
+
753
+ switch ( child.nodeName ) {
754
+
755
+ case 'emission':
756
+ case 'diffuse':
757
+ case 'specular':
758
+ case 'bump':
759
+ case 'ambient':
760
+ case 'shininess':
761
+ case 'transparency':
762
+ data[ child.nodeName ] = this.parseEffectParameter( child );
763
+ break;
764
+ case 'transparent':
765
+ data[ child.nodeName ] = {
766
+ opaque: child.hasAttribute( 'opaque' ) ? child.getAttribute( 'opaque' ) : 'A_ONE',
767
+ data: this.parseEffectParameter( child )
768
+ };
769
+ break;
770
+
771
+ }
772
+
773
+ }
774
+
775
+ return data;
776
+
777
+ }
778
+
779
+ parseEffectParameter( xml ) {
780
+
781
+ const data = {};
782
+
783
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
784
+
785
+ const child = xml.childNodes[ i ];
786
+
787
+ if ( child.nodeType !== 1 ) continue;
788
+
789
+ switch ( child.nodeName ) {
790
+
791
+ case 'color':
792
+ data[ child.nodeName ] = parseFloats( child.textContent );
793
+ break;
794
+
795
+ case 'float':
796
+ data[ child.nodeName ] = parseFloat( child.textContent );
797
+ break;
798
+
799
+ case 'texture':
800
+ data[ child.nodeName ] = { id: child.getAttribute( 'texture' ), extra: this.parseEffectParameterTexture( child ) };
801
+ break;
802
+
803
+ }
804
+
805
+ }
806
+
807
+ return data;
808
+
809
+ }
810
+
811
+ parseEffectParameterTexture( xml ) {
812
+
813
+ const data = {
814
+ technique: {}
815
+ };
816
+
817
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
818
+
819
+ const child = xml.childNodes[ i ];
820
+
821
+ if ( child.nodeType !== 1 ) continue;
822
+
823
+ switch ( child.nodeName ) {
824
+
825
+ case 'extra':
826
+ this.parseEffectParameterTextureExtra( child, data );
827
+ break;
828
+
829
+ }
830
+
831
+ }
832
+
833
+ return data;
834
+
835
+ }
836
+
837
+ parseEffectParameterTextureExtra( xml, data ) {
838
+
839
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
840
+
841
+ const child = xml.childNodes[ i ];
842
+
843
+ if ( child.nodeType !== 1 ) continue;
844
+
845
+ switch ( child.nodeName ) {
846
+
847
+ case 'technique':
848
+ this.parseEffectParameterTextureExtraTechnique( child, data );
849
+ break;
850
+
851
+ }
852
+
853
+ }
854
+
855
+ }
856
+
857
+ parseEffectParameterTextureExtraTechnique( xml, data ) {
858
+
859
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
860
+
861
+ const child = xml.childNodes[ i ];
862
+
863
+ if ( child.nodeType !== 1 ) continue;
864
+
865
+ switch ( child.nodeName ) {
866
+
867
+ case 'repeatU':
868
+ case 'repeatV':
869
+ case 'offsetU':
870
+ case 'offsetV':
871
+ data.technique[ child.nodeName ] = parseFloat( child.textContent );
872
+ break;
873
+
874
+ case 'wrapU':
875
+ case 'wrapV':
876
+
877
+ // some files have values for wrapU/wrapV which become NaN via parseInt
878
+
879
+ if ( child.textContent.toUpperCase() === 'TRUE' ) {
880
+
881
+ data.technique[ child.nodeName ] = 1;
882
+
883
+ } else if ( child.textContent.toUpperCase() === 'FALSE' ) {
884
+
885
+ data.technique[ child.nodeName ] = 0;
886
+
887
+ } else {
888
+
889
+ data.technique[ child.nodeName ] = parseInt( child.textContent );
890
+
891
+ }
892
+
893
+ break;
894
+
895
+ case 'bump':
896
+ data[ child.nodeName ] = this.parseEffectExtraTechniqueBump( child );
897
+ break;
898
+
899
+ }
900
+
901
+ }
902
+
903
+ }
904
+
905
+ parseEffectExtra( xml ) {
906
+
907
+ const data = {};
908
+
909
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
910
+
911
+ const child = xml.childNodes[ i ];
912
+
913
+ if ( child.nodeType !== 1 ) continue;
914
+
915
+ switch ( child.nodeName ) {
916
+
917
+ case 'technique':
918
+ data.technique = this.parseEffectExtraTechnique( child );
919
+ break;
920
+
921
+ }
922
+
923
+ }
924
+
925
+ return data;
926
+
927
+ }
928
+
929
+ parseEffectExtraTechnique( xml ) {
930
+
931
+ const data = {};
932
+
933
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
934
+
935
+ const child = xml.childNodes[ i ];
936
+
937
+ if ( child.nodeType !== 1 ) continue;
938
+
939
+ switch ( child.nodeName ) {
940
+
941
+ case 'double_sided':
942
+ data[ child.nodeName ] = parseInt( child.textContent );
943
+ break;
944
+
945
+ case 'bump':
946
+ data[ child.nodeName ] = this.parseEffectExtraTechniqueBump( child );
947
+ break;
948
+
949
+ }
950
+
951
+ }
952
+
953
+ return data;
954
+
955
+ }
956
+
957
+ parseEffectExtraTechniqueBump( xml ) {
958
+
959
+ const data = {};
960
+
961
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
962
+
963
+ const child = xml.childNodes[ i ];
964
+
965
+ if ( child.nodeType !== 1 ) continue;
966
+
967
+ switch ( child.nodeName ) {
968
+
969
+ case 'texture':
970
+ data[ child.nodeName ] = { id: child.getAttribute( 'texture' ), texcoord: child.getAttribute( 'texcoord' ), extra: this.parseEffectParameterTexture( child ) };
971
+ break;
972
+
973
+ }
974
+
975
+ }
976
+
977
+ return data;
978
+
979
+ }
980
+
981
+ // material
982
+
983
+ parseMaterial( xml ) {
984
+
985
+ const data = {
986
+ name: xml.getAttribute( 'name' )
987
+ };
988
+
989
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
990
+
991
+ const child = xml.childNodes[ i ];
992
+
993
+ if ( child.nodeType !== 1 ) continue;
994
+
995
+ switch ( child.nodeName ) {
996
+
997
+ case 'instance_effect':
998
+ data.url = parseId( child.getAttribute( 'url' ) );
999
+ break;
1000
+
1001
+ }
1002
+
1003
+ }
1004
+
1005
+ this.library.materials[ xml.getAttribute( 'id' ) ] = data;
1006
+
1007
+ }
1008
+
1009
+ // camera
1010
+
1011
+ parseCamera( xml ) {
1012
+
1013
+ const data = {
1014
+ name: xml.getAttribute( 'name' )
1015
+ };
1016
+
1017
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
1018
+
1019
+ const child = xml.childNodes[ i ];
1020
+
1021
+ if ( child.nodeType !== 1 ) continue;
1022
+
1023
+ switch ( child.nodeName ) {
1024
+
1025
+ case 'optics':
1026
+ data.optics = this.parseCameraOptics( child );
1027
+ break;
1028
+
1029
+ }
1030
+
1031
+ }
1032
+
1033
+ this.library.cameras[ xml.getAttribute( 'id' ) ] = data;
1034
+
1035
+ }
1036
+
1037
+ parseCameraOptics( xml ) {
1038
+
1039
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1040
+
1041
+ const child = xml.childNodes[ i ];
1042
+
1043
+ switch ( child.nodeName ) {
1044
+
1045
+ case 'technique_common':
1046
+ return this.parseCameraTechnique( child );
1047
+
1048
+ }
1049
+
1050
+ }
1051
+
1052
+ return {};
1053
+
1054
+ }
1055
+
1056
+ parseCameraTechnique( xml ) {
1057
+
1058
+ const data = {};
1059
+
1060
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1061
+
1062
+ const child = xml.childNodes[ i ];
1063
+
1064
+ switch ( child.nodeName ) {
1065
+
1066
+ case 'perspective':
1067
+ case 'orthographic':
1068
+
1069
+ data.technique = child.nodeName;
1070
+ data.parameters = this.parseCameraParameters( child );
1071
+
1072
+ break;
1073
+
1074
+ }
1075
+
1076
+ }
1077
+
1078
+ return data;
1079
+
1080
+ }
1081
+
1082
+ parseCameraParameters( xml ) {
1083
+
1084
+ const data = {};
1085
+
1086
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1087
+
1088
+ const child = xml.childNodes[ i ];
1089
+
1090
+ switch ( child.nodeName ) {
1091
+
1092
+ case 'xfov':
1093
+ case 'yfov':
1094
+ case 'xmag':
1095
+ case 'ymag':
1096
+ case 'znear':
1097
+ case 'zfar':
1098
+ case 'aspect_ratio':
1099
+ data[ child.nodeName ] = parseFloat( child.textContent );
1100
+ break;
1101
+
1102
+ }
1103
+
1104
+ }
1105
+
1106
+ return data;
1107
+
1108
+ }
1109
+
1110
+ // light
1111
+
1112
+ parseLight( xml ) {
1113
+
1114
+ let data = {};
1115
+
1116
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
1117
+
1118
+ const child = xml.childNodes[ i ];
1119
+
1120
+ if ( child.nodeType !== 1 ) continue;
1121
+
1122
+ switch ( child.nodeName ) {
1123
+
1124
+ case 'technique_common':
1125
+ data = this.parseLightTechnique( child );
1126
+ break;
1127
+
1128
+ }
1129
+
1130
+ }
1131
+
1132
+ this.library.lights[ xml.getAttribute( 'id' ) ] = data;
1133
+
1134
+ }
1135
+
1136
+ parseLightTechnique( xml ) {
1137
+
1138
+ const data = {};
1139
+
1140
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
1141
+
1142
+ const child = xml.childNodes[ i ];
1143
+
1144
+ if ( child.nodeType !== 1 ) continue;
1145
+
1146
+ switch ( child.nodeName ) {
1147
+
1148
+ case 'directional':
1149
+ case 'point':
1150
+ case 'spot':
1151
+ case 'ambient':
1152
+
1153
+ data.technique = child.nodeName;
1154
+ data.parameters = this.parseLightParameters( child );
1155
+ break;
1156
+
1157
+ }
1158
+
1159
+ }
1160
+
1161
+ return data;
1162
+
1163
+ }
1164
+
1165
+ parseLightParameters( xml ) {
1166
+
1167
+ const data = {};
1168
+
1169
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
1170
+
1171
+ const child = xml.childNodes[ i ];
1172
+
1173
+ if ( child.nodeType !== 1 ) continue;
1174
+
1175
+ switch ( child.nodeName ) {
1176
+
1177
+ case 'color':
1178
+ const array = parseFloats( child.textContent );
1179
+ data.color = new Color().fromArray( array );
1180
+ ColorManagement.colorSpaceToWorking( data.color, SRGBColorSpace );
1181
+ break;
1182
+
1183
+ case 'falloff_angle':
1184
+ data.falloffAngle = parseFloat( child.textContent );
1185
+ break;
1186
+
1187
+ case 'quadratic_attenuation':
1188
+ const f = parseFloat( child.textContent );
1189
+ data.distance = f ? Math.sqrt( 1 / f ) : 0;
1190
+ break;
1191
+
1192
+ }
1193
+
1194
+ }
1195
+
1196
+ return data;
1197
+
1198
+ }
1199
+
1200
+ // geometry
1201
+
1202
+ parseGeometry( xml ) {
1203
+
1204
+ const data = {
1205
+ name: xml.getAttribute( 'name' ),
1206
+ sources: {},
1207
+ vertices: {},
1208
+ primitives: []
1209
+ };
1210
+
1211
+ const mesh = getElementsByTagName( xml, 'mesh' )[ 0 ];
1212
+
1213
+ // the following tags inside geometry are not supported yet (see https://github.com/mrdoob/three.js/pull/12606): convex_mesh, spline, brep
1214
+ if ( mesh === undefined ) return;
1215
+
1216
+ for ( let i = 0; i < mesh.childNodes.length; i ++ ) {
1217
+
1218
+ const child = mesh.childNodes[ i ];
1219
+
1220
+ if ( child.nodeType !== 1 ) continue;
1221
+
1222
+ const id = child.getAttribute( 'id' );
1223
+
1224
+ switch ( child.nodeName ) {
1225
+
1226
+ case 'source':
1227
+ data.sources[ id ] = this.parseSource( child );
1228
+ break;
1229
+
1230
+ case 'vertices':
1231
+ // data.sources[ id ] = data.sources[ parseId( getElementsByTagName( child, 'input' )[ 0 ].getAttribute( 'source' ) ) ];
1232
+ data.vertices = this.parseGeometryVertices( child );
1233
+ break;
1234
+
1235
+ case 'polygons':
1236
+ case 'lines':
1237
+ case 'linestrips':
1238
+ case 'polylist':
1239
+ case 'triangles':
1240
+ data.primitives.push( this.parseGeometryPrimitive( child ) );
1241
+ break;
1242
+
1243
+ default:
1244
+
1245
+ }
1246
+
1247
+ }
1248
+
1249
+ this.library.geometries[ xml.getAttribute( 'id' ) ] = data;
1250
+
1251
+ }
1252
+
1253
+ parseSource( xml ) {
1254
+
1255
+ const data = {
1256
+ array: [],
1257
+ stride: 3
1258
+ };
1259
+
1260
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1261
+
1262
+ const child = xml.childNodes[ i ];
1263
+
1264
+ if ( child.nodeType !== 1 ) continue;
1265
+
1266
+ switch ( child.nodeName ) {
1267
+
1268
+ case 'float_array':
1269
+ data.array = parseFloats( child.textContent );
1270
+ break;
1271
+
1272
+ case 'Name_array':
1273
+ data.array = parseStrings( child.textContent );
1274
+ break;
1275
+
1276
+ case 'technique_common':
1277
+ const accessor = getElementsByTagName( child, 'accessor' )[ 0 ];
1278
+
1279
+ if ( accessor !== undefined ) {
1280
+
1281
+ data.stride = parseInt( accessor.getAttribute( 'stride' ) );
1282
+
1283
+ }
1284
+
1285
+ break;
1286
+
1287
+ }
1288
+
1289
+ }
1290
+
1291
+ return data;
1292
+
1293
+ }
1294
+
1295
+ parseGeometryVertices( xml ) {
1296
+
1297
+ const data = {};
1298
+
1299
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1300
+
1301
+ const child = xml.childNodes[ i ];
1302
+
1303
+ if ( child.nodeType !== 1 ) continue;
1304
+
1305
+ data[ child.getAttribute( 'semantic' ) ] = parseId( child.getAttribute( 'source' ) );
1306
+
1307
+ }
1308
+
1309
+ return data;
1310
+
1311
+ }
1312
+
1313
+ parseGeometryPrimitive( xml ) {
1314
+
1315
+ const primitive = {
1316
+ type: xml.nodeName,
1317
+ material: xml.getAttribute( 'material' ),
1318
+ count: parseInt( xml.getAttribute( 'count' ) ),
1319
+ inputs: {},
1320
+ stride: 0,
1321
+ hasUV: false
1322
+ };
1323
+
1324
+ for ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {
1325
+
1326
+ const child = xml.childNodes[ i ];
1327
+
1328
+ if ( child.nodeType !== 1 ) continue;
1329
+
1330
+ switch ( child.nodeName ) {
1331
+
1332
+ case 'input':
1333
+ const id = parseId( child.getAttribute( 'source' ) );
1334
+ const semantic = child.getAttribute( 'semantic' );
1335
+ const offset = parseInt( child.getAttribute( 'offset' ) );
1336
+ const set = parseInt( child.getAttribute( 'set' ) );
1337
+ const inputname = ( set > 0 ? semantic + set : semantic );
1338
+ primitive.inputs[ inputname ] = { id: id, offset: offset };
1339
+ primitive.stride = Math.max( primitive.stride, offset + 1 );
1340
+ if ( semantic === 'TEXCOORD' ) primitive.hasUV = true;
1341
+ break;
1342
+
1343
+ case 'vcount':
1344
+ primitive.vcount = parseInts( child.textContent );
1345
+ break;
1346
+
1347
+ case 'p':
1348
+ primitive.p = parseInts( child.textContent );
1349
+ break;
1350
+
1351
+ }
1352
+
1353
+ }
1354
+
1355
+ if ( primitive.type === 'polygons' ) {
1356
+
1357
+ primitive.vcount = [ primitive.p.length / primitive.stride ];
1358
+
1359
+ }
1360
+
1361
+ return primitive;
1362
+
1363
+ }
1364
+
1365
+ // kinematics
1366
+
1367
+ parseLibraryJoint( xml ) {
1368
+
1369
+ this.library.joints[ xml.getAttribute( 'id' ) ] = this.parseKinematicsJoint( xml );
1370
+
1371
+ }
1372
+
1373
+ parseKinematicsModel( xml ) {
1374
+
1375
+ const data = {
1376
+ name: xml.getAttribute( 'name' ) || '',
1377
+ joints: {},
1378
+ links: []
1379
+ };
1380
+
1381
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1382
+
1383
+ const child = xml.childNodes[ i ];
1384
+
1385
+ if ( child.nodeType !== 1 ) continue;
1386
+
1387
+ switch ( child.nodeName ) {
1388
+
1389
+ case 'technique_common':
1390
+ this.parseKinematicsTechniqueCommon( child, data );
1391
+ break;
1392
+
1393
+ }
1394
+
1395
+ }
1396
+
1397
+ this.library.kinematicsModels[ xml.getAttribute( 'id' ) ] = data;
1398
+
1399
+ }
1400
+
1401
+ parseKinematicsTechniqueCommon( xml, data ) {
1402
+
1403
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1404
+
1405
+ const child = xml.childNodes[ i ];
1406
+
1407
+ if ( child.nodeType !== 1 ) continue;
1408
+
1409
+ switch ( child.nodeName ) {
1410
+
1411
+ case 'joint':
1412
+ data.joints[ child.getAttribute( 'sid' ) ] = this.parseKinematicsJoint( child );
1413
+ break;
1414
+
1415
+ case 'instance_joint':
1416
+ data.joints[ child.getAttribute( 'sid' ) ] = this.library.joints[ parseId( child.getAttribute( 'url' ) ) ];
1417
+ break;
1418
+
1419
+ case 'link':
1420
+ data.links.push( this.parseKinematicsLink( child ) );
1421
+ break;
1422
+
1423
+ }
1424
+
1425
+ }
1426
+
1427
+ }
1428
+
1429
+ parseKinematicsJoint( xml ) {
1430
+
1431
+ let data;
1432
+
1433
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1434
+
1435
+ const child = xml.childNodes[ i ];
1436
+
1437
+ if ( child.nodeType !== 1 ) continue;
1438
+
1439
+ switch ( child.nodeName ) {
1440
+
1441
+ case 'prismatic':
1442
+ case 'revolute':
1443
+ data = this.parseKinematicsJointParameter( child );
1444
+ break;
1445
+
1446
+ }
1447
+
1448
+ }
1449
+
1450
+ return data;
1451
+
1452
+ }
1453
+
1454
+ parseKinematicsJointParameter( xml ) {
1455
+
1456
+ const data = {
1457
+ sid: xml.getAttribute( 'sid' ),
1458
+ name: xml.getAttribute( 'name' ) || '',
1459
+ axis: new Vector3(),
1460
+ limits: {
1461
+ min: 0,
1462
+ max: 0
1463
+ },
1464
+ type: xml.nodeName,
1465
+ static: false,
1466
+ zeroPosition: 0,
1467
+ middlePosition: 0
1468
+ };
1469
+
1470
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1471
+
1472
+ const child = xml.childNodes[ i ];
1473
+
1474
+ if ( child.nodeType !== 1 ) continue;
1475
+
1476
+ switch ( child.nodeName ) {
1477
+
1478
+ case 'axis':
1479
+ const array = parseFloats( child.textContent );
1480
+ data.axis.fromArray( array );
1481
+ break;
1482
+ case 'limits':
1483
+ const max = child.getElementsByTagName( 'max' )[ 0 ];
1484
+ const min = child.getElementsByTagName( 'min' )[ 0 ];
1485
+
1486
+ data.limits.max = parseFloat( max.textContent );
1487
+ data.limits.min = parseFloat( min.textContent );
1488
+ break;
1489
+
1490
+ }
1491
+
1492
+ }
1493
+
1494
+ // if min is equal to or greater than max, consider the joint static
1495
+
1496
+ if ( data.limits.min >= data.limits.max ) {
1497
+
1498
+ data.static = true;
1499
+
1500
+ }
1501
+
1502
+ // calculate middle position
1503
+
1504
+ data.middlePosition = ( data.limits.min + data.limits.max ) / 2.0;
1505
+
1506
+ return data;
1507
+
1508
+ }
1509
+
1510
+ parseKinematicsLink( xml ) {
1511
+
1512
+ const data = {
1513
+ sid: xml.getAttribute( 'sid' ),
1514
+ name: xml.getAttribute( 'name' ) || '',
1515
+ attachments: [],
1516
+ transforms: []
1517
+ };
1518
+
1519
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1520
+
1521
+ const child = xml.childNodes[ i ];
1522
+
1523
+ if ( child.nodeType !== 1 ) continue;
1524
+
1525
+ switch ( child.nodeName ) {
1526
+
1527
+ case 'attachment_full':
1528
+ data.attachments.push( this.parseKinematicsAttachment( child ) );
1529
+ break;
1530
+
1531
+ case 'matrix':
1532
+ case 'translate':
1533
+ case 'rotate':
1534
+ data.transforms.push( this.parseKinematicsTransform( child ) );
1535
+ break;
1536
+
1537
+ }
1538
+
1539
+ }
1540
+
1541
+ return data;
1542
+
1543
+ }
1544
+
1545
+ parseKinematicsAttachment( xml ) {
1546
+
1547
+ const data = {
1548
+ joint: xml.getAttribute( 'joint' ).split( '/' ).pop(),
1549
+ transforms: [],
1550
+ links: []
1551
+ };
1552
+
1553
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1554
+
1555
+ const child = xml.childNodes[ i ];
1556
+
1557
+ if ( child.nodeType !== 1 ) continue;
1558
+
1559
+ switch ( child.nodeName ) {
1560
+
1561
+ case 'link':
1562
+ data.links.push( this.parseKinematicsLink( child ) );
1563
+ break;
1564
+
1565
+ case 'matrix':
1566
+ case 'translate':
1567
+ case 'rotate':
1568
+ data.transforms.push( this.parseKinematicsTransform( child ) );
1569
+ break;
1570
+
1571
+ }
1572
+
1573
+ }
1574
+
1575
+ return data;
1576
+
1577
+ }
1578
+
1579
+ parseKinematicsTransform( xml ) {
1580
+
1581
+ const data = {
1582
+ type: xml.nodeName
1583
+ };
1584
+
1585
+ const array = parseFloats( xml.textContent );
1586
+
1587
+ switch ( data.type ) {
1588
+
1589
+ case 'matrix':
1590
+ data.obj = new Matrix4();
1591
+ data.obj.fromArray( array ).transpose();
1592
+ break;
1593
+
1594
+ case 'translate':
1595
+ data.obj = new Vector3();
1596
+ data.obj.fromArray( array );
1597
+ break;
1598
+
1599
+ case 'rotate':
1600
+ data.obj = new Vector3();
1601
+ data.obj.fromArray( array );
1602
+ data.angle = MathUtils.degToRad( array[ 3 ] );
1603
+ break;
1604
+
1605
+ }
1606
+
1607
+ return data;
1608
+
1609
+ }
1610
+
1611
+ // physics
1612
+
1613
+ parsePhysicsModel( xml ) {
1614
+
1615
+ const data = {
1616
+ name: xml.getAttribute( 'name' ) || '',
1617
+ rigidBodies: {}
1618
+ };
1619
+
1620
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1621
+
1622
+ const child = xml.childNodes[ i ];
1623
+
1624
+ if ( child.nodeType !== 1 ) continue;
1625
+
1626
+ switch ( child.nodeName ) {
1627
+
1628
+ case 'rigid_body':
1629
+ data.rigidBodies[ child.getAttribute( 'name' ) ] = {};
1630
+ this.parsePhysicsRigidBody( child, data.rigidBodies[ child.getAttribute( 'name' ) ] );
1631
+ break;
1632
+
1633
+ }
1634
+
1635
+ }
1636
+
1637
+ this.library.physicsModels[ xml.getAttribute( 'id' ) ] = data;
1638
+
1639
+ }
1640
+
1641
+ parsePhysicsRigidBody( xml, data ) {
1642
+
1643
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1644
+
1645
+ const child = xml.childNodes[ i ];
1646
+
1647
+ if ( child.nodeType !== 1 ) continue;
1648
+
1649
+ switch ( child.nodeName ) {
1650
+
1651
+ case 'technique_common':
1652
+ this.parsePhysicsTechniqueCommon( child, data );
1653
+ break;
1654
+
1655
+ }
1656
+
1657
+ }
1658
+
1659
+ }
1660
+
1661
+ parsePhysicsTechniqueCommon( xml, data ) {
1662
+
1663
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1664
+
1665
+ const child = xml.childNodes[ i ];
1666
+
1667
+ if ( child.nodeType !== 1 ) continue;
1668
+
1669
+ switch ( child.nodeName ) {
1670
+
1671
+ case 'inertia':
1672
+ data.inertia = parseFloats( child.textContent );
1673
+ break;
1674
+
1675
+ case 'mass':
1676
+ data.mass = parseFloats( child.textContent )[ 0 ];
1677
+ break;
1678
+
1679
+ }
1680
+
1681
+ }
1682
+
1683
+ }
1684
+
1685
+ // scene
1686
+
1687
+ parseKinematicsScene( xml ) {
1688
+
1689
+ const data = {
1690
+ bindJointAxis: []
1691
+ };
1692
+
1693
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1694
+
1695
+ const child = xml.childNodes[ i ];
1696
+
1697
+ if ( child.nodeType !== 1 ) continue;
1698
+
1699
+ switch ( child.nodeName ) {
1700
+
1701
+ case 'bind_joint_axis':
1702
+ data.bindJointAxis.push( this.parseKinematicsBindJointAxis( child ) );
1703
+ break;
1704
+
1705
+ }
1706
+
1707
+ }
1708
+
1709
+ this.library.kinematicsScenes[ parseId( xml.getAttribute( 'url' ) ) ] = data;
1710
+
1711
+ }
1712
+
1713
+ parseKinematicsBindJointAxis( xml ) {
1714
+
1715
+ const data = {
1716
+ target: xml.getAttribute( 'target' ).split( '/' ).pop()
1717
+ };
1718
+
1719
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1720
+
1721
+ const child = xml.childNodes[ i ];
1722
+
1723
+ if ( child.nodeType !== 1 ) continue;
1724
+
1725
+ switch ( child.nodeName ) {
1726
+
1727
+ case 'axis':
1728
+ const param = child.getElementsByTagName( 'param' )[ 0 ];
1729
+ data.axis = param.textContent;
1730
+ const tmpJointIndex = data.axis.split( 'inst_' ).pop().split( 'axis' )[ 0 ];
1731
+ data.jointIndex = tmpJointIndex.substring( 0, tmpJointIndex.length - 1 );
1732
+ break;
1733
+
1734
+ }
1735
+
1736
+ }
1737
+
1738
+ return data;
1739
+
1740
+ }
1741
+
1742
+ // nodes
1743
+
1744
+ prepareNodes( xml ) {
1745
+
1746
+ const elements = xml.getElementsByTagName( 'node' );
1747
+
1748
+ // ensure all node elements have id attributes
1749
+
1750
+ for ( let i = 0; i < elements.length; i ++ ) {
1751
+
1752
+ const element = elements[ i ];
1753
+
1754
+ if ( element.hasAttribute( 'id' ) === false ) {
1755
+
1756
+ element.setAttribute( 'id', this.generateId() );
1757
+
1758
+ }
1759
+
1760
+ }
1761
+
1762
+ }
1763
+
1764
+ parseNode( xml ) {
1765
+
1766
+ const matrix = new Matrix4();
1767
+ const vector = new Vector3();
1768
+
1769
+ const data = {
1770
+ name: xml.getAttribute( 'name' ) || '',
1771
+ type: xml.getAttribute( 'type' ),
1772
+ id: xml.getAttribute( 'id' ),
1773
+ sid: xml.getAttribute( 'sid' ),
1774
+ matrix: new Matrix4(),
1775
+ nodes: [],
1776
+ instanceCameras: [],
1777
+ instanceControllers: [],
1778
+ instanceLights: [],
1779
+ instanceGeometries: [],
1780
+ instanceNodes: [],
1781
+ transforms: {},
1782
+ transformData: {},
1783
+ transformOrder: []
1784
+ };
1785
+
1786
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1787
+
1788
+ const child = xml.childNodes[ i ];
1789
+
1790
+ if ( child.nodeType !== 1 ) continue;
1791
+
1792
+ let array;
1793
+
1794
+ switch ( child.nodeName ) {
1795
+
1796
+ case 'node':
1797
+ data.nodes.push( child.getAttribute( 'id' ) );
1798
+ this.parseNode( child );
1799
+ break;
1800
+
1801
+ case 'instance_camera':
1802
+ data.instanceCameras.push( parseId( child.getAttribute( 'url' ) ) );
1803
+ break;
1804
+
1805
+ case 'instance_controller':
1806
+ data.instanceControllers.push( this.parseNodeInstance( child ) );
1807
+ break;
1808
+
1809
+ case 'instance_light':
1810
+ data.instanceLights.push( parseId( child.getAttribute( 'url' ) ) );
1811
+ break;
1812
+
1813
+ case 'instance_geometry':
1814
+ data.instanceGeometries.push( this.parseNodeInstance( child ) );
1815
+ break;
1816
+
1817
+ case 'instance_node':
1818
+ data.instanceNodes.push( parseId( child.getAttribute( 'url' ) ) );
1819
+ break;
1820
+
1821
+ case 'matrix':
1822
+ array = parseFloats( child.textContent );
1823
+ data.matrix.multiply( matrix.fromArray( array ).transpose() );
1824
+ {
1825
+
1826
+ const sid = child.getAttribute( 'sid' );
1827
+ data.transforms[ sid ] = child.nodeName;
1828
+ data.transformData[ sid ] = { type: 'matrix', array: array };
1829
+ data.transformOrder.push( sid );
1830
+
1831
+ }
1832
+
1833
+ break;
1834
+
1835
+ case 'translate':
1836
+ array = parseFloats( child.textContent );
1837
+ vector.fromArray( array );
1838
+ data.matrix.multiply( matrix.makeTranslation( vector.x, vector.y, vector.z ) );
1839
+ {
1840
+
1841
+ const sid = child.getAttribute( 'sid' );
1842
+ data.transforms[ sid ] = child.nodeName;
1843
+ data.transformData[ sid ] = { type: 'translate', x: array[ 0 ], y: array[ 1 ], z: array[ 2 ] };
1844
+ data.transformOrder.push( sid );
1845
+
1846
+ }
1847
+
1848
+ break;
1849
+
1850
+ case 'rotate':
1851
+ array = parseFloats( child.textContent );
1852
+ {
1853
+
1854
+ const angle = MathUtils.degToRad( array[ 3 ] );
1855
+ data.matrix.multiply( matrix.makeRotationAxis( vector.fromArray( array ), angle ) );
1856
+ const sid = child.getAttribute( 'sid' );
1857
+ data.transforms[ sid ] = child.nodeName;
1858
+ data.transformData[ sid ] = { type: 'rotate', axis: [ array[ 0 ], array[ 1 ], array[ 2 ] ], angle: array[ 3 ] };
1859
+ data.transformOrder.push( sid );
1860
+
1861
+ }
1862
+
1863
+ break;
1864
+
1865
+ case 'scale':
1866
+ array = parseFloats( child.textContent );
1867
+ data.matrix.scale( vector.fromArray( array ) );
1868
+ {
1869
+
1870
+ const sid = child.getAttribute( 'sid' );
1871
+ data.transforms[ sid ] = child.nodeName;
1872
+ data.transformData[ sid ] = { type: 'scale', x: array[ 0 ], y: array[ 1 ], z: array[ 2 ] };
1873
+ data.transformOrder.push( sid );
1874
+
1875
+ }
1876
+
1877
+ break;
1878
+
1879
+ case 'extra':
1880
+ break;
1881
+
1882
+ default:
1883
+
1884
+ }
1885
+
1886
+ }
1887
+
1888
+ if ( this.hasNode( data.id ) ) {
1889
+
1890
+ console.warn( 'THREE.ColladaLoader: There is already a node with ID %s. Exclude current node from further processing.', data.id );
1891
+
1892
+ } else {
1893
+
1894
+ this.library.nodes[ data.id ] = data;
1895
+
1896
+ }
1897
+
1898
+ return data;
1899
+
1900
+ }
1901
+
1902
+ parseNodeInstance( xml ) {
1903
+
1904
+ const data = {
1905
+ id: parseId( xml.getAttribute( 'url' ) ),
1906
+ materials: {},
1907
+ skeletons: []
1908
+ };
1909
+
1910
+ for ( let i = 0; i < xml.childNodes.length; i ++ ) {
1911
+
1912
+ const child = xml.childNodes[ i ];
1913
+
1914
+ switch ( child.nodeName ) {
1915
+
1916
+ case 'bind_material':
1917
+ const instances = child.getElementsByTagName( 'instance_material' );
1918
+
1919
+ for ( let j = 0; j < instances.length; j ++ ) {
1920
+
1921
+ const instance = instances[ j ];
1922
+ const symbol = instance.getAttribute( 'symbol' );
1923
+ const target = instance.getAttribute( 'target' );
1924
+
1925
+ data.materials[ symbol ] = parseId( target );
1926
+
1927
+ }
1928
+
1929
+ break;
1930
+
1931
+ case 'skeleton':
1932
+ data.skeletons.push( parseId( child.textContent ) );
1933
+ break;
1934
+
1935
+ default:
1936
+ break;
1937
+
1938
+ }
1939
+
1940
+ }
1941
+
1942
+ return data;
1943
+
1944
+ }
1945
+
1946
+ // visual scenes
1947
+
1948
+ parseVisualScene( xml ) {
1949
+
1950
+ const data = {
1951
+ name: xml.getAttribute( 'name' ),
1952
+ children: []
1953
+ };
1954
+
1955
+ this.prepareNodes( xml );
1956
+
1957
+ const elements = getElementsByTagName( xml, 'node' );
1958
+
1959
+ for ( let i = 0; i < elements.length; i ++ ) {
1960
+
1961
+ data.children.push( this.parseNode( elements[ i ] ) );
1962
+
1963
+ }
1964
+
1965
+ this.library.visualScenes[ xml.getAttribute( 'id' ) ] = data;
1966
+
1967
+ }
1968
+
1969
+ hasNode( id ) {
1970
+
1971
+ return this.library.nodes[ id ] !== undefined;
1972
+
1973
+ }
1974
+
1975
+ }
1976
+
1977
+ export { ColladaParser, getElementsByTagName, parseStrings, parseFloats, parseInts, parseId };