three-stdlib 2.16.0 → 2.16.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1218) hide show
  1. package/BufferGeometryUtils-1a7a235c.js +655 -0
  2. package/BufferGeometryUtils-971dfde3.js +1 -0
  3. package/Nodes-4f766d71.js +471 -0
  4. package/Nodes-9aa16d74.js +1 -0
  5. package/animation/AnimationClipCreator.cjs.js +1 -0
  6. package/animation/AnimationClipCreator.js +52 -32
  7. package/animation/CCDIKSolver.cjs.js +1 -0
  8. package/animation/CCDIKSolver.js +143 -64
  9. package/animation/MMDAnimationHelper.cjs.js +1 -0
  10. package/animation/MMDAnimationHelper.js +341 -150
  11. package/animation/MMDPhysics.cjs.js +1 -0
  12. package/animation/MMDPhysics.js +361 -154
  13. package/cameras/CinematicCamera.cjs.js +1 -0
  14. package/cameras/CinematicCamera.js +77 -67
  15. package/controls/ArcballControls.cjs.js +1 -0
  16. package/controls/ArcballControls.js +1449 -544
  17. package/controls/DeviceOrientationControls.cjs.js +1 -0
  18. package/controls/DeviceOrientationControls.js +97 -52
  19. package/controls/DragControls.cjs.js +1 -0
  20. package/controls/DragControls.js +187 -85
  21. package/controls/FirstPersonControls.cjs.js +1 -0
  22. package/controls/FirstPersonControls.js +193 -123
  23. package/controls/FlyControls.cjs.js +1 -0
  24. package/controls/FlyControls.js +152 -82
  25. package/controls/OrbitControls.cjs.js +1 -0
  26. package/controls/OrbitControls.js +481 -232
  27. package/controls/PointerLockControls.cjs.js +1 -0
  28. package/controls/PointerLockControls.js +99 -63
  29. package/controls/TrackballControls.cjs.js +1 -0
  30. package/controls/TrackballControls.js +383 -211
  31. package/controls/TransformControls.cjs.js +1 -0
  32. package/controls/TransformControls.js +782 -575
  33. package/controls/experimental/CameraControls.cjs.js +1 -0
  34. package/controls/experimental/CameraControls.js +609 -329
  35. package/csm/CSM.cjs.js +1 -0
  36. package/csm/CSM.js +108 -47
  37. package/csm/CSMFrustum.cjs.js +1 -0
  38. package/csm/CSMFrustum.js +29 -14
  39. package/csm/CSMHelper.cjs.js +1 -0
  40. package/csm/CSMHelper.js +34 -20
  41. package/csm/CSMShader.cjs.js +1 -0
  42. package/csm/CSMShader.js +11 -7
  43. package/curves/CurveExtras.cjs.js +1 -0
  44. package/curves/CurveExtras.js +115 -73
  45. package/curves/NURBSCurve.cjs.js +1 -0
  46. package/curves/NURBSCurve.js +43 -15
  47. package/curves/NURBSSurface.cjs.js +1 -0
  48. package/curves/NURBSSurface.js +27 -11
  49. package/curves/NURBSUtils.cjs.js +1 -0
  50. package/curves/NURBSUtils.js +203 -54
  51. package/custom.d.cjs.js +1 -0
  52. package/{shaders/types.mjs → custom.d.js} +0 -0
  53. package/deprecated/Geometry.cjs.js +1 -0
  54. package/deprecated/Geometry.js +486 -191
  55. package/effects/AnaglyphEffect.cjs.js +1 -0
  56. package/effects/AnaglyphEffect.js +60 -95
  57. package/effects/AsciiEffect.cjs.js +1 -0
  58. package/effects/AsciiEffect.js +110 -80
  59. package/effects/OutlineEffect.cjs.js +1 -0
  60. package/effects/OutlineEffect.js +204 -121
  61. package/effects/ParallaxBarrierEffect.cjs.js +1 -0
  62. package/effects/ParallaxBarrierEffect.js +38 -39
  63. package/effects/PeppersGhostEffect.cjs.js +1 -0
  64. package/effects/PeppersGhostEffect.js +68 -19
  65. package/effects/StereoEffect.cjs.js +1 -0
  66. package/effects/StereoEffect.js +16 -12
  67. package/environments/RoomEnvironment.cjs.js +1 -0
  68. package/environments/RoomEnvironment.js +47 -52
  69. package/exporters/ColladaExporter.cjs.js +1 -0
  70. package/exporters/ColladaExporter.js +241 -115
  71. package/exporters/DRACOExporter.cjs.js +1 -0
  72. package/exporters/DRACOExporter.js +121 -67
  73. package/exporters/GLTFExporter.cjs.js +1 -0
  74. package/exporters/GLTFExporter.js +1014 -463
  75. package/exporters/MMDExporter.cjs.js +1 -0
  76. package/exporters/MMDExporter.js +102 -44
  77. package/exporters/OBJExporter.cjs.js +1 -0
  78. package/exporters/OBJExporter.js +140 -78
  79. package/exporters/PLYExporter.cjs.js +1 -0
  80. package/exporters/PLYExporter.js +154 -93
  81. package/exporters/STLExporter.cjs.js +1 -0
  82. package/exporters/STLExporter.js +81 -30
  83. package/exporters/USDZExporter.cjs.js +1 -0
  84. package/exporters/USDZExporter.js +144 -84
  85. package/geometries/BoxLineGeometry.cjs.js +1 -0
  86. package/geometries/BoxLineGeometry.js +14 -7
  87. package/geometries/ConvexGeometry.cjs.js +1 -0
  88. package/geometries/ConvexGeometry.js +23 -14
  89. package/geometries/DecalGeometry.cjs.js +1 -0
  90. package/geometries/DecalGeometry.js +162 -108
  91. package/geometries/LightningStrike.cjs.js +1 -0
  92. package/geometries/LightningStrike.js +294 -101
  93. package/geometries/ParametricGeometries.cjs.js +1 -0
  94. package/geometries/ParametricGeometries.js +76 -26
  95. package/geometries/ParametricGeometry.cjs.js +1 -0
  96. package/geometries/ParametricGeometry.js +48 -24
  97. package/geometries/RoundedBoxGeometry.cjs.js +1 -0
  98. package/geometries/RoundedBoxGeometry.js +64 -33
  99. package/geometries/TeapotGeometry.cjs.js +1 -0
  100. package/geometries/TeapotGeometry.js +174 -1434
  101. package/geometries/TextGeometry.cjs.js +1 -0
  102. package/geometries/TextGeometry.js +17 -9
  103. package/helpers/LightProbeHelper.cjs.js +1 -0
  104. package/helpers/LightProbeHelper.js +21 -53
  105. package/helpers/PositionalAudioHelper.cjs.js +1 -0
  106. package/helpers/PositionalAudioHelper.js +30 -23
  107. package/helpers/RectAreaLightHelper.cjs.js +1 -0
  108. package/helpers/RectAreaLightHelper.js +33 -17
  109. package/helpers/VertexNormalsHelper.cjs.js +1 -0
  110. package/helpers/VertexNormalsHelper.js +41 -20
  111. package/helpers/VertexTangentsHelper.cjs.js +1 -0
  112. package/helpers/VertexTangentsHelper.js +36 -18
  113. package/index.cjs.js +1 -0
  114. package/index.js +333 -969
  115. package/interactive/InteractiveGroup.cjs.js +1 -0
  116. package/interactive/InteractiveGroup.d.ts +5 -0
  117. package/interactive/InteractiveGroup.js +87 -0
  118. package/interactive/SelectionBox.cjs.js +1 -0
  119. package/interactive/SelectionBox.js +46 -31
  120. package/interactive/SelectionHelper.cjs.js +1 -0
  121. package/interactive/SelectionHelper.js +21 -16
  122. package/libs/MeshoptDecoder.cjs.js +1 -0
  123. package/libs/MeshoptDecoder.js +58 -147
  124. package/libs/MotionControllers.cjs.js +1 -0
  125. package/libs/MotionControllers.js +208 -66
  126. package/lights/LightProbeGenerator.cjs.js +1 -0
  127. package/lights/LightProbeGenerator.js +96 -40
  128. package/lights/RectAreaLightUniformsLib.cjs.js +1 -0
  129. package/lights/RectAreaLightUniformsLib.js +9 -32842
  130. package/lines/Line2.cjs.js +1 -0
  131. package/lines/Line2.js +12 -9
  132. package/lines/LineGeometry.cjs.js +1 -0
  133. package/lines/LineGeometry.js +19 -7
  134. package/lines/LineMaterial.cjs.js +1 -0
  135. package/lines/LineMaterial.js +89 -51
  136. package/lines/LineSegments2.cjs.js +1 -0
  137. package/lines/LineSegments2.js +165 -56
  138. package/lines/LineSegmentsGeometry.cjs.js +1 -0
  139. package/lines/LineSegmentsGeometry.js +71 -29
  140. package/lines/Wireframe.cjs.js +1 -0
  141. package/lines/Wireframe.js +29 -15
  142. package/lines/WireframeGeometry2.cjs.js +1 -0
  143. package/lines/WireframeGeometry2.js +9 -8
  144. package/loaders/3DMLoader.cjs.js +1 -0
  145. package/loaders/3DMLoader.js +469 -234
  146. package/loaders/3MFLoader.cjs.js +1 -0
  147. package/loaders/3MFLoader.js +555 -340
  148. package/loaders/AMFLoader.cjs.js +1 -0
  149. package/loaders/AMFLoader.js +219 -114
  150. package/loaders/AssimpLoader.cjs.js +1 -0
  151. package/loaders/AssimpLoader.js +725 -328
  152. package/loaders/BVHLoader.cjs.js +1 -0
  153. package/loaders/BVHLoader.js +200 -94
  154. package/loaders/BasisTextureLoader.cjs.js +1 -0
  155. package/loaders/BasisTextureLoader.js +357 -229
  156. package/loaders/ColladaLoader.cjs.js +1 -0
  157. package/loaders/ColladaLoader.js +1522 -932
  158. package/loaders/DDSLoader.cjs.js +1 -0
  159. package/loaders/DDSLoader.js +108 -42
  160. package/loaders/DRACOLoader.cjs.js +1 -0
  161. package/loaders/DRACOLoader.js +210 -103
  162. package/loaders/EXRLoader.cjs.js +1 -0
  163. package/loaders/EXRLoader.js +809 -461
  164. package/loaders/FBXLoader.cjs.js +1 -0
  165. package/loaders/FBXLoader.js +1397 -842
  166. package/loaders/FontLoader.cjs.js +1 -0
  167. package/loaders/FontLoader.js +66 -33
  168. package/loaders/GCodeLoader.cjs.js +1 -0
  169. package/loaders/GCodeLoader.js +111 -63
  170. package/loaders/GLTFLoader.cjs.js +1 -0
  171. package/loaders/GLTFLoader.js +1484 -771
  172. package/loaders/HDRCubeTextureLoader.cjs.js +1 -0
  173. package/loaders/HDRCubeTextureLoader.js +50 -45
  174. package/loaders/KMZLoader.cjs.js +1 -0
  175. package/loaders/KMZLoader.js +55 -42
  176. package/loaders/KTX2Loader.cjs.js +1 -0
  177. package/loaders/KTX2Loader.js +362 -229
  178. package/loaders/KTXLoader.cjs.js +1 -0
  179. package/loaders/KTXLoader.js +99 -37
  180. package/loaders/LDrawLoader.cjs.js +1 -0
  181. package/loaders/LDrawLoader.js +746 -313
  182. package/loaders/LUT3dlLoader.cjs.js +1 -0
  183. package/loaders/LUT3dlLoader.js +62 -50
  184. package/loaders/LUTCubeLoader.cjs.js +1 -0
  185. package/loaders/LUTCubeLoader.js +56 -45
  186. package/loaders/LWOLoader.cjs.js +1 -0
  187. package/loaders/LWOLoader.js +339 -227
  188. package/loaders/LottieLoader.cjs.js +1 -0
  189. package/loaders/LottieLoader.js +38 -36
  190. package/loaders/MD2Loader.cjs.js +1 -0
  191. package/loaders/MD2Loader.js +91 -248
  192. package/loaders/MDDLoader.cjs.js +1 -0
  193. package/loaders/MDDLoader.js +45 -25
  194. package/loaders/MMDLoader.cjs.js +1 -0
  195. package/loaders/MMDLoader.js +795 -359
  196. package/loaders/MTLLoader.cjs.js +1 -0
  197. package/loaders/MTLLoader.js +201 -91
  198. package/loaders/NRRDLoader.cjs.js +1 -0
  199. package/loaders/NRRDLoader.js +263 -182
  200. package/loaders/NodeMaterialLoader.cjs.js +1 -0
  201. package/loaders/NodeMaterialLoader.js +14 -121
  202. package/loaders/OBJLoader.cjs.js +1 -0
  203. package/loaders/OBJLoader.js +283 -161
  204. package/loaders/PCDLoader.cjs.js +1 -0
  205. package/loaders/PCDLoader.js +164 -145
  206. package/loaders/PDBLoader.cjs.js +1 -0
  207. package/loaders/PDBLoader.js +63 -45
  208. package/loaders/PLYLoader.cjs.js +1 -0
  209. package/loaders/PLYLoader.js +203 -106
  210. package/loaders/PRWMLoader.cjs.js +1 -0
  211. package/loaders/PRWMLoader.js +110 -73
  212. package/loaders/PVRLoader.cjs.js +1 -0
  213. package/loaders/PVRLoader.js +93 -32
  214. package/loaders/RGBELoader.cjs.js +1 -0
  215. package/loaders/RGBELoader.js +233 -96
  216. package/loaders/RGBMLoader.cjs.js +1 -0
  217. package/loaders/RGBMLoader.js +514 -344
  218. package/loaders/STLLoader.cjs.js +1 -0
  219. package/loaders/STLLoader.js +165 -59
  220. package/loaders/SVGLoader.cjs.js +1 -0
  221. package/loaders/SVGLoader.js +851 -481
  222. package/loaders/TDSLoader.cjs.js +1 -0
  223. package/loaders/TDSLoader.js +527 -137
  224. package/loaders/TGALoader.cjs.js +1 -0
  225. package/loaders/TGALoader.js +205 -94
  226. package/loaders/TTFLoader.cjs.js +1 -0
  227. package/loaders/TTFLoader.js +79 -58
  228. package/loaders/TiltLoader.cjs.js +1 -0
  229. package/loaders/TiltLoader.js +167 -129
  230. package/loaders/VOXLoader.cjs.js +1 -0
  231. package/loaders/VOXLoader.js +84 -320
  232. package/loaders/VRMLLoader.cjs.js +1 -0
  233. package/loaders/VRMLLoader.js +1268 -786
  234. package/loaders/VRMLoader.cjs.js +1 -0
  235. package/loaders/VRMLoader.js +31 -23
  236. package/loaders/VTKLoader.cjs.js +1 -0
  237. package/loaders/VTKLoader.js +407 -219
  238. package/loaders/XLoader.cjs.js +1 -0
  239. package/loaders/XLoader.js +1259 -1083
  240. package/loaders/XYZLoader.cjs.js +1 -0
  241. package/loaders/XYZLoader.js +34 -28
  242. package/loaders/lwo/IFFParser.cjs.js +1 -0
  243. package/loaders/lwo/IFFParser.js +492 -238
  244. package/loaders/lwo/LWO2Parser.cjs.js +1 -0
  245. package/loaders/lwo/LWO2Parser.js +279 -176
  246. package/loaders/lwo/LWO3Parser.cjs.js +1 -0
  247. package/loaders/lwo/LWO3Parser.js +247 -160
  248. package/math/Capsule.cjs.js +1 -0
  249. package/math/Capsule.js +43 -56
  250. package/math/ColorConverter.cjs.js +1 -0
  251. package/math/ColorConverter.js +32 -18
  252. package/math/ConvexHull.cjs.js +1 -0
  253. package/math/ConvexHull.js +357 -97
  254. package/math/ImprovedNoise.cjs.js +1 -0
  255. package/math/ImprovedNoise.js +32 -282
  256. package/math/Lut.cjs.js +1 -0
  257. package/math/Lut.js +35 -51
  258. package/math/MeshSurfaceSampler.cjs.js +1 -0
  259. package/math/MeshSurfaceSampler.js +68 -25
  260. package/math/OBB.cjs.js +1 -0
  261. package/math/OBB.js +152 -91
  262. package/math/Octree.cjs.js +1 -0
  263. package/math/Octree.js +139 -76
  264. package/math/SimplexNoise.cjs.js +1 -0
  265. package/math/SimplexNoise.js +238 -217
  266. package/misc/ConvexObjectBreaker.cjs.js +1 -0
  267. package/misc/ConvexObjectBreaker.js +185 -79
  268. package/misc/GPUComputationRenderer.cjs.js +1 -0
  269. package/misc/GPUComputationRenderer.js +194 -69
  270. package/misc/Gyroscope.cjs.js +1 -0
  271. package/misc/Gyroscope.js +22 -16
  272. package/misc/MD2Character.cjs.js +1 -0
  273. package/misc/MD2Character.js +74 -52
  274. package/misc/MD2CharacterComplex.cjs.js +1 -0
  275. package/misc/MD2CharacterComplex.js +163 -112
  276. package/misc/MorphAnimMesh.cjs.js +1 -0
  277. package/misc/MorphAnimMesh.js +28 -20
  278. package/misc/MorphBlendMesh.cjs.js +1 -0
  279. package/misc/MorphBlendMesh.js +69 -45
  280. package/misc/ProgressiveLightmap.cjs.js +1 -0
  281. package/misc/ProgressiveLightmap.js +187 -70
  282. package/misc/RollerCoaster.cjs.js +1 -0
  283. package/misc/RollerCoaster.js +135 -106
  284. package/misc/TubePainter.cjs.js +1 -0
  285. package/misc/TubePainter.js +92 -74
  286. package/misc/Volume.cjs.js +1 -0
  287. package/misc/Volume.js +270 -108
  288. package/misc/VolumeSlice.cjs.js +1 -0
  289. package/misc/VolumeSlice.js +122 -34
  290. package/misc/WebGL.cjs.js +1 -0
  291. package/misc/WebGL.js +34 -37
  292. package/modifiers/CurveModifier.cjs.js +1 -0
  293. package/modifiers/CurveModifier.js +151 -46
  294. package/modifiers/EdgeSplitModifier.cjs.js +1 -0
  295. package/modifiers/EdgeSplitModifier.js +90 -46
  296. package/modifiers/SimplifyModifier.cjs.js +1 -0
  297. package/modifiers/SimplifyModifier.js +202 -77
  298. package/modifiers/TessellateModifier.cjs.js +1 -0
  299. package/modifiers/TessellateModifier.js +90 -65
  300. package/nodes/Nodes.cjs.js +1 -0
  301. package/nodes/Nodes.js +140 -274
  302. package/nodes/ShaderNode.cjs.js +1 -0
  303. package/nodes/ShaderNode.js +196 -296
  304. package/nodes/accessors/BufferNode.cjs.js +1 -0
  305. package/nodes/accessors/BufferNode.js +8 -4
  306. package/nodes/accessors/CameraNode.cjs.js +1 -0
  307. package/nodes/accessors/CameraNode.js +25 -20
  308. package/nodes/accessors/CubeTextureNode.cjs.js +1 -0
  309. package/nodes/accessors/CubeTextureNode.js +26 -14
  310. package/nodes/accessors/MaterialNode.cjs.js +1 -0
  311. package/nodes/accessors/MaterialNode.js +53 -43
  312. package/nodes/accessors/MaterialReferenceNode.cjs.js +1 -0
  313. package/nodes/accessors/MaterialReferenceNode.js +6 -3
  314. package/nodes/accessors/ModelNode.cjs.js +1 -0
  315. package/nodes/accessors/ModelNode.js +5 -3
  316. package/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
  317. package/nodes/accessors/ModelViewProjectionNode.js +13 -14
  318. package/nodes/accessors/NormalNode.cjs.js +1 -0
  319. package/nodes/accessors/NormalNode.js +39 -40
  320. package/nodes/accessors/Object3DNode.cjs.js +1 -0
  321. package/nodes/accessors/Object3DNode.js +50 -40
  322. package/nodes/accessors/PointUVNode.cjs.js +1 -0
  323. package/nodes/accessors/PointUVNode.js +9 -5
  324. package/nodes/accessors/PositionNode.cjs.js +1 -0
  325. package/nodes/accessors/PositionNode.js +41 -42
  326. package/nodes/accessors/ReferenceNode.cjs.js +1 -0
  327. package/nodes/accessors/ReferenceNode.js +17 -10
  328. package/nodes/accessors/ReflectNode.cjs.js +1 -0
  329. package/nodes/accessors/ReflectNode.js +26 -23
  330. package/nodes/accessors/SkinningNode.cjs.js +1 -0
  331. package/nodes/accessors/SkinningNode.js +48 -46
  332. package/nodes/accessors/TextureNode.cjs.js +1 -0
  333. package/nodes/accessors/TextureNode.js +29 -14
  334. package/nodes/accessors/UVNode.cjs.js +1 -0
  335. package/nodes/accessors/UVNode.js +11 -5
  336. package/nodes/core/ArrayUniformNode.cjs.js +1 -0
  337. package/nodes/core/ArrayUniformNode.js +7 -3
  338. package/nodes/core/AttributeNode.cjs.js +1 -0
  339. package/nodes/core/AttributeNode.js +12 -5
  340. package/nodes/core/BypassNode.cjs.js +1 -0
  341. package/nodes/core/BypassNode.js +12 -5
  342. package/nodes/core/CodeNode.cjs.js +1 -0
  343. package/nodes/core/CodeNode.js +12 -4
  344. package/nodes/core/ConstNode.cjs.js +1 -0
  345. package/nodes/core/ConstNode.js +7 -3
  346. package/nodes/core/ContextNode.cjs.js +1 -0
  347. package/nodes/core/ContextNode.js +8 -3
  348. package/nodes/core/ExpressionNode.cjs.js +1 -0
  349. package/nodes/core/ExpressionNode.js +9 -5
  350. package/nodes/core/FunctionCallNode.cjs.js +1 -0
  351. package/nodes/core/FunctionCallNode.js +15 -6
  352. package/nodes/core/FunctionNode.cjs.js +1 -0
  353. package/nodes/core/FunctionNode.js +25 -10
  354. package/nodes/core/InputNode.cjs.js +1 -0
  355. package/nodes/core/InputNode.js +23 -12
  356. package/nodes/core/Node.cjs.js +1 -0
  357. package/nodes/core/Node.js +75 -35
  358. package/nodes/core/NodeAttribute.cjs.js +1 -0
  359. package/nodes/core/NodeAttribute.js +4 -2
  360. package/nodes/core/NodeBuilder.cjs.js +1 -0
  361. package/nodes/core/NodeBuilder.js +224 -110
  362. package/nodes/core/NodeCode.cjs.js +1 -0
  363. package/nodes/core/NodeCode.js +7 -4
  364. package/nodes/core/NodeFrame.cjs.js +1 -0
  365. package/nodes/core/NodeFrame.js +12 -9
  366. package/nodes/core/NodeFunction.cjs.js +1 -0
  367. package/nodes/core/NodeFunction.js +17 -0
  368. package/nodes/core/NodeFunctionInput.cjs.js +1 -0
  369. package/nodes/core/NodeFunctionInput.js +5 -3
  370. package/nodes/core/NodeKeywords.cjs.js +1 -0
  371. package/nodes/core/NodeKeywords.js +16 -5
  372. package/nodes/core/NodeParser.cjs.js +1 -0
  373. package/nodes/core/NodeParser.js +8 -0
  374. package/nodes/core/NodeUniform.cjs.js +1 -0
  375. package/nodes/core/NodeUniform.js +7 -3
  376. package/nodes/core/NodeUtils.cjs.js +1 -0
  377. package/nodes/core/NodeUtils.js +43 -39
  378. package/nodes/core/NodeVar.cjs.js +1 -0
  379. package/nodes/core/NodeVar.js +4 -2
  380. package/nodes/core/NodeVary.cjs.js +1 -0
  381. package/nodes/core/NodeVary.js +4 -2
  382. package/nodes/core/PropertyNode.cjs.js +1 -0
  383. package/nodes/core/PropertyNode.js +10 -4
  384. package/nodes/core/TempNode.cjs.js +1 -0
  385. package/nodes/core/TempNode.js +11 -5
  386. package/nodes/core/UniformNode.cjs.js +1 -0
  387. package/nodes/core/UniformNode.js +10 -4
  388. package/nodes/core/VarNode.cjs.js +1 -0
  389. package/nodes/core/VarNode.js +11 -3
  390. package/nodes/core/VaryNode.cjs.js +1 -0
  391. package/nodes/core/VaryNode.js +15 -6
  392. package/nodes/core/constants.cjs.js +1 -0
  393. package/nodes/core/constants.js +7 -20
  394. package/nodes/display/ColorSpaceNode.cjs.js +1 -0
  395. package/nodes/display/ColorSpaceNode.js +38 -34
  396. package/nodes/display/NormalMapNode.cjs.js +1 -0
  397. package/nodes/display/NormalMapNode.js +53 -35
  398. package/nodes/fog/FogNode.cjs.js +1 -0
  399. package/nodes/fog/FogNode.js +9 -5
  400. package/nodes/fog/FogRangeNode.cjs.js +1 -0
  401. package/nodes/fog/FogRangeNode.js +9 -5
  402. package/nodes/functions/BSDFs.cjs.js +1 -0
  403. package/nodes/functions/BSDFs.js +118 -61
  404. package/nodes/functions/PhysicalMaterialFunctions.cjs.js +1 -0
  405. package/nodes/functions/PhysicalMaterialFunctions.js +57 -0
  406. package/nodes/lights/LightContextNode.cjs.js +1 -0
  407. package/nodes/lights/LightContextNode.js +23 -14
  408. package/nodes/lights/LightNode.cjs.js +1 -0
  409. package/nodes/lights/LightNode.js +31 -27
  410. package/nodes/lights/LightsNode.cjs.js +1 -0
  411. package/nodes/lights/LightsNode.js +28 -9
  412. package/nodes/loaders/NodeLoader.cjs.js +1 -0
  413. package/nodes/loaders/NodeLoader.js +42 -27
  414. package/nodes/loaders/NodeMaterialLoader.cjs.js +1 -0
  415. package/nodes/loaders/NodeMaterialLoader.js +10 -4
  416. package/nodes/loaders/NodeObjectLoader.cjs.js +1 -0
  417. package/nodes/loaders/NodeObjectLoader.js +19 -9
  418. package/nodes/materials/LineBasicNodeMaterial.cjs.js +1 -0
  419. package/nodes/materials/LineBasicNodeMaterial.js +10 -5
  420. package/nodes/materials/Materials.cjs.js +1 -0
  421. package/nodes/materials/Materials.js +17 -14
  422. package/nodes/materials/MeshBasicNodeMaterial.cjs.js +1 -0
  423. package/nodes/materials/MeshBasicNodeMaterial.js +10 -5
  424. package/nodes/materials/MeshStandardNodeMaterial.cjs.js +1 -0
  425. package/nodes/materials/MeshStandardNodeMaterial.js +8 -5
  426. package/nodes/materials/NodeMaterial.cjs.js +1 -0
  427. package/nodes/materials/NodeMaterial.js +36 -20
  428. package/nodes/materials/PointsNodeMaterial.cjs.js +1 -0
  429. package/nodes/materials/PointsNodeMaterial.js +10 -5
  430. package/nodes/math/CondNode.cjs.js +1 -0
  431. package/nodes/math/CondNode.js +23 -11
  432. package/nodes/math/MathNode.cjs.js +1 -0
  433. package/nodes/math/MathNode.js +142 -98
  434. package/nodes/math/OperatorNode.cjs.js +1 -0
  435. package/nodes/math/OperatorNode.js +46 -24
  436. package/nodes/parsers/GLSLNodeFunction.cjs.js +1 -0
  437. package/nodes/parsers/GLSLNodeFunction.js +101 -0
  438. package/nodes/parsers/GLSLNodeParser.cjs.js +1 -0
  439. package/nodes/parsers/GLSLNodeParser.js +13 -0
  440. package/nodes/parsers/WGSLNodeFunction.cjs.js +1 -0
  441. package/nodes/parsers/WGSLNodeFunction.js +71 -0
  442. package/nodes/parsers/WGSLNodeParser.cjs.js +1 -0
  443. package/nodes/parsers/WGSLNodeParser.js +13 -0
  444. package/nodes/procedural/CheckerNode.cjs.js +1 -0
  445. package/nodes/procedural/CheckerNode.js +19 -13
  446. package/nodes/utils/ArrayElementNode.cjs.js +1 -0
  447. package/nodes/utils/ArrayElementNode.js +8 -4
  448. package/nodes/utils/ConvertNode.cjs.js +1 -0
  449. package/nodes/utils/ConvertNode.js +8 -3
  450. package/nodes/utils/JoinNode.cjs.js +1 -0
  451. package/nodes/utils/JoinNode.js +11 -7
  452. package/nodes/utils/MatcapUVNode.cjs.js +1 -0
  453. package/nodes/utils/MatcapUVNode.js +11 -8
  454. package/nodes/utils/OscNode.cjs.js +1 -0
  455. package/nodes/utils/OscNode.js +33 -27
  456. package/nodes/utils/SplitNode.cjs.js +1 -0
  457. package/nodes/utils/SplitNode.js +20 -6
  458. package/nodes/utils/SpriteSheetUVNode.cjs.js +1 -0
  459. package/nodes/utils/SpriteSheetUVNode.js +23 -23
  460. package/nodes/utils/TimerNode.cjs.js +1 -0
  461. package/nodes/utils/TimerNode.js +24 -20
  462. package/objects/GroundProjectedEnv.cjs.js +1 -0
  463. package/objects/GroundProjectedEnv.js +37 -22
  464. package/objects/Lensflare.cjs.js +1 -0
  465. package/objects/Lensflare.js +156 -86
  466. package/objects/LightningStorm.cjs.js +1 -0
  467. package/objects/LightningStorm.js +102 -38
  468. package/objects/MarchingCubes.cjs.js +1 -0
  469. package/objects/MarchingCubes.js +303 -150
  470. package/objects/Reflector.cjs.js +1 -0
  471. package/objects/Reflector.js +72 -50
  472. package/objects/ReflectorForSSRPass.cjs.js +1 -0
  473. package/objects/ReflectorForSSRPass.js +131 -80
  474. package/objects/ReflectorRTT.cjs.js +1 -0
  475. package/objects/ReflectorRTT.js +7 -6
  476. package/objects/Refractor.cjs.js +1 -0
  477. package/objects/Refractor.js +106 -64
  478. package/objects/ShadowMesh.cjs.js +1 -0
  479. package/objects/ShadowMesh.js +17 -8
  480. package/objects/Sky.cjs.js +1 -0
  481. package/objects/Sky.js +80 -119
  482. package/objects/Water.cjs.js +1 -0
  483. package/objects/Water.js +127 -83
  484. package/objects/Water2.cjs.js +1 -0
  485. package/objects/Water2.js +108 -72
  486. package/offscreen/jank.cjs.js +1 -0
  487. package/offscreen/jank.js +14 -10
  488. package/offscreen/offscreen.cjs.js +1 -0
  489. package/offscreen/offscreen.js +5 -4
  490. package/offscreen/scene.cjs.js +1 -0
  491. package/offscreen/scene.js +48 -45
  492. package/package.json +3 -3
  493. package/physics/AmmoPhysics.cjs.js +1 -0
  494. package/physics/AmmoPhysics.js +71 -30
  495. package/postprocessing/AdaptiveToneMappingPass.cjs.js +1 -0
  496. package/postprocessing/AdaptiveToneMappingPass.js +123 -97
  497. package/postprocessing/AfterimagePass.cjs.js +1 -0
  498. package/postprocessing/AfterimagePass.js +49 -28
  499. package/postprocessing/BloomPass.cjs.js +1 -0
  500. package/postprocessing/BloomPass.js +69 -43
  501. package/postprocessing/BokehPass.cjs.js +1 -0
  502. package/postprocessing/BokehPass.js +69 -39
  503. package/postprocessing/ClearPass.cjs.js +1 -0
  504. package/postprocessing/ClearPass.js +25 -10
  505. package/postprocessing/CubeTexturePass.cjs.js +1 -0
  506. package/postprocessing/CubeTexturePass.js +27 -28
  507. package/postprocessing/DotScreenPass.cjs.js +1 -0
  508. package/postprocessing/DotScreenPass.js +32 -24
  509. package/postprocessing/EffectComposer.cjs.js +1 -0
  510. package/postprocessing/EffectComposer.js +86 -39
  511. package/postprocessing/FilmPass.cjs.js +1 -0
  512. package/postprocessing/FilmPass.js +30 -25
  513. package/postprocessing/GlitchPass.cjs.js +1 -0
  514. package/postprocessing/GlitchPass.js +61 -38
  515. package/postprocessing/HalftonePass.cjs.js +1 -0
  516. package/postprocessing/HalftonePass.js +39 -19
  517. package/postprocessing/LUTPass.cjs.js +1 -0
  518. package/postprocessing/LUTPass.js +38 -13
  519. package/postprocessing/MaskPass.cjs.js +1 -0
  520. package/postprocessing/MaskPass.js +38 -19
  521. package/postprocessing/OutlinePass.cjs.js +1 -0
  522. package/postprocessing/OutlinePass.js +277 -135
  523. package/postprocessing/Pass.cjs.js +1 -0
  524. package/postprocessing/Pass.js +44 -20
  525. package/postprocessing/RenderPass.cjs.js +1 -0
  526. package/postprocessing/RenderPass.js +36 -13
  527. package/postprocessing/RenderPixelatedPass.cjs.js +1 -0
  528. package/postprocessing/RenderPixelatedPass.js +58 -44
  529. package/postprocessing/SAOPass.cjs.js +1 -0
  530. package/postprocessing/SAOPass.js +189 -154
  531. package/postprocessing/SMAAPass.cjs.js +1 -0
  532. package/postprocessing/SMAAPass.js +84 -64
  533. package/postprocessing/SSAARenderPass.cjs.js +1 -0
  534. package/postprocessing/SSAARenderPass.js +69 -121
  535. package/postprocessing/SSAOPass.cjs.js +1 -0
  536. package/postprocessing/SSAOPass.js +172 -123
  537. package/postprocessing/SSRPass.cjs.js +1 -0
  538. package/postprocessing/SSRPass.js +280 -211
  539. package/postprocessing/SavePass.cjs.js +1 -0
  540. package/postprocessing/SavePass.js +25 -20
  541. package/postprocessing/ShaderPass.cjs.js +1 -0
  542. package/postprocessing/ShaderPass.js +30 -14
  543. package/postprocessing/TAARenderPass.cjs.js +1 -0
  544. package/postprocessing/TAARenderPass.js +61 -42
  545. package/postprocessing/TexturePass.cjs.js +1 -0
  546. package/postprocessing/TexturePass.js +22 -21
  547. package/postprocessing/UnrealBloomPass.cjs.js +1 -0
  548. package/postprocessing/UnrealBloomPass.js +213 -105
  549. package/renderers/CSS2DRenderer.cjs.js +1 -0
  550. package/renderers/CSS2DRenderer.js +56 -44
  551. package/renderers/CSS3DRenderer.cjs.js +1 -0
  552. package/renderers/CSS3DRenderer.js +86 -53
  553. package/renderers/Projector.cjs.js +1 -0
  554. package/renderers/Projector.js +274 -107
  555. package/renderers/SVGRenderer.cjs.js +1 -0
  556. package/renderers/SVGRenderer.js +182 -72
  557. package/renderers/nodes/accessors/CameraNode.cjs.js +1 -0
  558. package/renderers/nodes/accessors/CameraNode.js +40 -29
  559. package/renderers/nodes/accessors/ModelNode.cjs.js +1 -0
  560. package/renderers/nodes/accessors/ModelNode.js +37 -28
  561. package/renderers/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
  562. package/renderers/nodes/accessors/ModelViewProjectionNode.js +23 -10
  563. package/renderers/nodes/accessors/NormalNode.cjs.js +1 -0
  564. package/renderers/nodes/accessors/NormalNode.js +45 -35
  565. package/renderers/nodes/accessors/PositionNode.cjs.js +1 -0
  566. package/renderers/nodes/accessors/PositionNode.js +19 -18
  567. package/renderers/nodes/accessors/UVNode.cjs.js +1 -0
  568. package/renderers/nodes/accessors/UVNode.js +10 -5
  569. package/renderers/nodes/core/AttributeNode.cjs.js +1 -0
  570. package/renderers/nodes/core/AttributeNode.js +14 -5
  571. package/renderers/nodes/core/InputNode.cjs.js +1 -0
  572. package/renderers/nodes/core/InputNode.js +14 -4
  573. package/renderers/nodes/core/Node.cjs.js +1 -0
  574. package/renderers/nodes/core/Node.js +17 -7
  575. package/renderers/nodes/core/NodeAttribute.cjs.js +1 -0
  576. package/renderers/nodes/core/NodeAttribute.js +6 -3
  577. package/renderers/nodes/core/NodeBuilder.cjs.js +1 -0
  578. package/renderers/nodes/core/NodeBuilder.js +154 -87
  579. package/renderers/nodes/core/NodeFrame.cjs.js +1 -0
  580. package/renderers/nodes/core/NodeFrame.js +12 -9
  581. package/renderers/nodes/core/NodeSlot.cjs.js +1 -0
  582. package/renderers/nodes/core/NodeSlot.js +3 -2
  583. package/renderers/nodes/core/NodeUniform.cjs.js +1 -0
  584. package/renderers/nodes/core/NodeUniform.js +9 -4
  585. package/renderers/nodes/core/NodeVary.cjs.js +1 -0
  586. package/renderers/nodes/core/NodeVary.js +7 -4
  587. package/renderers/nodes/core/VaryNode.cjs.js +1 -0
  588. package/renderers/nodes/core/VaryNode.js +12 -6
  589. package/renderers/nodes/core/constants.cjs.js +1 -0
  590. package/renderers/nodes/core/constants.js +13 -16
  591. package/renderers/nodes/inputs/ColorNode.cjs.js +1 -0
  592. package/renderers/nodes/inputs/ColorNode.js +11 -5
  593. package/renderers/nodes/inputs/FloatNode.cjs.js +1 -0
  594. package/renderers/nodes/inputs/FloatNode.js +11 -5
  595. package/renderers/nodes/inputs/Matrix3Node.cjs.js +1 -0
  596. package/renderers/nodes/inputs/Matrix3Node.js +13 -7
  597. package/renderers/nodes/inputs/Matrix4Node.cjs.js +1 -0
  598. package/renderers/nodes/inputs/Matrix4Node.js +13 -7
  599. package/renderers/nodes/inputs/TextureNode.cjs.js +1 -0
  600. package/renderers/nodes/inputs/TextureNode.js +15 -7
  601. package/renderers/nodes/inputs/Vector2Node.cjs.js +1 -0
  602. package/renderers/nodes/inputs/Vector2Node.js +11 -5
  603. package/renderers/nodes/inputs/Vector3Node.cjs.js +1 -0
  604. package/renderers/nodes/inputs/Vector3Node.js +13 -7
  605. package/renderers/nodes/inputs/Vector4Node.cjs.js +1 -0
  606. package/renderers/nodes/inputs/Vector4Node.js +13 -7
  607. package/renderers/nodes/math/MathNode.cjs.js +1 -0
  608. package/renderers/nodes/math/MathNode.js +30 -20
  609. package/renderers/nodes/math/OperatorNode.cjs.js +1 -0
  610. package/renderers/nodes/math/OperatorNode.js +20 -4
  611. package/renderers/nodes/utils/SwitchNode.cjs.js +1 -0
  612. package/renderers/nodes/utils/SwitchNode.js +9 -4
  613. package/renderers/nodes/utils/TimerNode.cjs.js +1 -0
  614. package/renderers/nodes/utils/TimerNode.js +10 -5
  615. package/renderers/webgpu/WebGPU.cjs.js +1 -0
  616. package/renderers/webgpu/WebGPU.js +16 -14
  617. package/renderers/webgpu/WebGPUAttributes.cjs.js +1 -0
  618. package/renderers/webgpu/WebGPUAttributes.js +23 -16
  619. package/renderers/webgpu/WebGPUBackground.cjs.js +1 -0
  620. package/renderers/webgpu/WebGPUBackground.js +30 -13
  621. package/renderers/webgpu/WebGPUBinding.cjs.js +1 -0
  622. package/renderers/webgpu/WebGPUBinding.js +7 -4
  623. package/renderers/webgpu/WebGPUBindings.cjs.js +1 -0
  624. package/renderers/webgpu/WebGPUBindings.js +57 -21
  625. package/renderers/webgpu/WebGPUComputePipelines.cjs.js +1 -0
  626. package/renderers/webgpu/WebGPUComputePipelines.js +25 -14
  627. package/renderers/webgpu/WebGPUGeometries.cjs.js +1 -0
  628. package/renderers/webgpu/WebGPUGeometries.js +15 -5
  629. package/renderers/webgpu/WebGPUInfo.cjs.js +1 -0
  630. package/renderers/webgpu/WebGPUInfo.js +8 -3
  631. package/renderers/webgpu/WebGPUObjects.cjs.js +1 -0
  632. package/renderers/webgpu/WebGPUObjects.js +10 -5
  633. package/renderers/webgpu/WebGPUProperties.cjs.js +1 -0
  634. package/renderers/webgpu/WebGPUProperties.js +11 -5
  635. package/renderers/webgpu/WebGPURenderLists.cjs.js +1 -0
  636. package/renderers/webgpu/WebGPURenderLists.js +36 -20
  637. package/renderers/webgpu/WebGPURenderPipelines.cjs.js +1 -0
  638. package/renderers/webgpu/WebGPURenderPipelines.js +387 -260
  639. package/renderers/webgpu/WebGPURenderer.cjs.js +1 -0
  640. package/renderers/webgpu/WebGPURenderer.js +262 -124
  641. package/renderers/webgpu/WebGPUSampledTexture.cjs.js +1 -0
  642. package/renderers/webgpu/WebGPUSampledTexture.js +31 -18
  643. package/renderers/webgpu/WebGPUSampler.cjs.js +1 -0
  644. package/renderers/webgpu/WebGPUSampler.js +12 -7
  645. package/renderers/webgpu/WebGPUStorageBuffer.cjs.js +1 -0
  646. package/renderers/webgpu/WebGPUStorageBuffer.js +12 -7
  647. package/renderers/webgpu/WebGPUTextureRenderer.cjs.js +1 -0
  648. package/renderers/webgpu/WebGPUTextureRenderer.js +11 -5
  649. package/renderers/webgpu/WebGPUTextureUtils.cjs.js +1 -0
  650. package/renderers/webgpu/WebGPUTextureUtils.js +40 -29
  651. package/renderers/webgpu/WebGPUTextures.cjs.js +1 -0
  652. package/renderers/webgpu/WebGPUTextures.js +333 -186
  653. package/renderers/webgpu/WebGPUUniform.cjs.js +1 -0
  654. package/renderers/webgpu/WebGPUUniform.js +51 -25
  655. package/renderers/webgpu/WebGPUUniformsGroup.cjs.js +1 -0
  656. package/renderers/webgpu/WebGPUUniformsGroup.js +72 -32
  657. package/renderers/webgpu/constants.cjs.js +1 -0
  658. package/renderers/webgpu/constants.js +181 -190
  659. package/renderers/webgpu/nodes/ShaderLib.cjs.js +1 -0
  660. package/renderers/webgpu/nodes/ShaderLib.js +2 -2
  661. package/renderers/webgpu/nodes/WebGPUNodeBuilder.cjs.js +1 -0
  662. package/renderers/webgpu/nodes/WebGPUNodeBuilder.js +124 -53
  663. package/renderers/webgpu/nodes/WebGPUNodeUniform.cjs.js +1 -0
  664. package/renderers/webgpu/nodes/WebGPUNodeUniform.js +31 -17
  665. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.cjs.js +1 -0
  666. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.js +9 -8
  667. package/renderers/webgpu/nodes/WebGPUNodes.cjs.js +1 -0
  668. package/renderers/webgpu/nodes/WebGPUNodes.js +45 -7
  669. package/shaders/ACESFilmicToneMappingShader.cjs.js +1 -0
  670. package/shaders/ACESFilmicToneMappingShader.js +24 -44
  671. package/shaders/AfterimageShader.cjs.js +1 -0
  672. package/shaders/AfterimageShader.js +18 -28
  673. package/shaders/BasicShader.cjs.js +1 -0
  674. package/shaders/BasicShader.js +7 -9
  675. package/shaders/BleachBypassShader.cjs.js +1 -0
  676. package/shaders/BleachBypassShader.js +15 -31
  677. package/shaders/BlendShader.cjs.js +1 -0
  678. package/shaders/BlendShader.js +19 -26
  679. package/shaders/BokehShader.cjs.js +1 -0
  680. package/shaders/BokehShader.js +36 -98
  681. package/shaders/BokehShader2.cjs.js +1 -0
  682. package/shaders/BokehShader2.js +90 -261
  683. package/shaders/BrightnessContrastShader.cjs.js +1 -0
  684. package/shaders/BrightnessContrastShader.js +19 -28
  685. package/shaders/ColorCorrectionShader.cjs.js +1 -0
  686. package/shaders/ColorCorrectionShader.js +22 -26
  687. package/shaders/ColorifyShader.cjs.js +1 -0
  688. package/shaders/ColorifyShader.js +16 -24
  689. package/shaders/ConvolutionShader.cjs.js +1 -0
  690. package/shaders/ConvolutionShader.js +36 -40
  691. package/shaders/CopyShader.cjs.js +1 -0
  692. package/shaders/CopyShader.js +13 -21
  693. package/shaders/DOFMipMapShader.cjs.js +1 -0
  694. package/shaders/DOFMipMapShader.js +21 -28
  695. package/shaders/DepthLimitedBlurShader.cjs.js +1 -0
  696. package/shaders/DepthLimitedBlurShader.js +40 -85
  697. package/shaders/DigitalGlitch.cjs.js +1 -0
  698. package/shaders/DigitalGlitch.js +46 -74
  699. package/shaders/DotScreenShader.cjs.js +1 -0
  700. package/shaders/DotScreenShader.js +27 -35
  701. package/shaders/FXAAShader.cjs.js +1 -0
  702. package/shaders/FXAAShader.js +19 -1094
  703. package/shaders/FilmShader.cjs.js +1 -0
  704. package/shaders/FilmShader.js +52 -38
  705. package/shaders/FocusShader.cjs.js +1 -0
  706. package/shaders/FocusShader.js +24 -51
  707. package/shaders/FreiChenShader.cjs.js +1 -0
  708. package/shaders/FreiChenShader.js +24 -57
  709. package/shaders/FresnelShader.cjs.js +1 -0
  710. package/shaders/FresnelShader.js +22 -43
  711. package/shaders/GammaCorrectionShader.cjs.js +1 -0
  712. package/shaders/GammaCorrectionShader.js +11 -19
  713. package/shaders/GodRaysShader.cjs.js +1 -0
  714. package/shaders/GodRaysShader.js +94 -103
  715. package/shaders/HalftoneShader.cjs.js +1 -0
  716. package/shaders/HalftoneShader.js +65 -208
  717. package/shaders/HorizontalBlurShader.cjs.js +1 -0
  718. package/shaders/HorizontalBlurShader.js +23 -7
  719. package/shaders/HorizontalTiltShiftShader.cjs.js +1 -0
  720. package/shaders/HorizontalTiltShiftShader.js +21 -33
  721. package/shaders/HueSaturationShader.cjs.js +1 -0
  722. package/shaders/HueSaturationShader.js +21 -37
  723. package/shaders/KaleidoShader.cjs.js +1 -0
  724. package/shaders/KaleidoShader.js +22 -30
  725. package/shaders/LuminosityHighPassShader.cjs.js +1 -0
  726. package/shaders/LuminosityHighPassShader.js +27 -33
  727. package/shaders/LuminosityShader.cjs.js +1 -0
  728. package/shaders/LuminosityShader.js +11 -21
  729. package/shaders/MirrorShader.cjs.js +1 -0
  730. package/shaders/MirrorShader.js +16 -31
  731. package/shaders/NormalMapShader.cjs.js +1 -0
  732. package/shaders/NormalMapShader.js +23 -27
  733. package/shaders/ParallaxShader.cjs.js +1 -0
  734. package/shaders/ParallaxShader.js +48 -107
  735. package/shaders/PixelShader.cjs.js +1 -0
  736. package/shaders/PixelShader.js +16 -24
  737. package/shaders/RGBShiftShader.cjs.js +1 -0
  738. package/shaders/RGBShiftShader.js +22 -26
  739. package/shaders/SAOShader.cjs.js +1 -0
  740. package/shaders/SAOShader.js +48 -132
  741. package/shaders/SMAAShader.cjs.js +1 -0
  742. package/shaders/SMAAShader.js +135 -256
  743. package/shaders/SSAOShader.cjs.js +1 -0
  744. package/shaders/SSAOShader.js +81 -153
  745. package/shaders/SSRShader.cjs.js +1 -0
  746. package/shaders/SSRShader.js +87 -32
  747. package/shaders/SepiaShader.cjs.js +1 -0
  748. package/shaders/SepiaShader.js +15 -25
  749. package/shaders/SobelOperatorShader.cjs.js +1 -0
  750. package/shaders/SobelOperatorShader.js +29 -40
  751. package/shaders/SubsurfaceScatteringShader.cjs.js +1 -0
  752. package/shaders/SubsurfaceScatteringShader.js +39 -53
  753. package/shaders/TechnicolorShader.cjs.js +1 -0
  754. package/shaders/TechnicolorShader.js +13 -20
  755. package/shaders/ToneMapShader.cjs.js +1 -0
  756. package/shaders/ToneMapShader.js +28 -44
  757. package/shaders/ToonShader.cjs.js +1 -0
  758. package/shaders/ToonShader.js +96 -172
  759. package/shaders/TriangleBlurShader.cjs.js +1 -0
  760. package/shaders/TriangleBlurShader.js +23 -32
  761. package/shaders/UnpackDepthRGBAShader.cjs.js +1 -0
  762. package/shaders/UnpackDepthRGBAShader.js +14 -22
  763. package/shaders/VerticalBlurShader.cjs.js +1 -0
  764. package/shaders/VerticalBlurShader.js +23 -7
  765. package/shaders/VerticalTiltShiftShader.cjs.js +1 -0
  766. package/shaders/VerticalTiltShiftShader.js +21 -33
  767. package/shaders/VignetteShader.cjs.js +1 -0
  768. package/shaders/VignetteShader.js +28 -24
  769. package/shaders/VolumeShader.cjs.js +1 -0
  770. package/shaders/VolumeShader.js +77 -174
  771. package/shaders/WaterRefractionShader.cjs.js +1 -0
  772. package/shaders/WaterRefractionShader.js +6 -38
  773. package/shaders/types.cjs.js +1 -0
  774. package/shaders/types.js +1 -1
  775. package/textures/FlakesTexture.cjs.js +1 -0
  776. package/textures/FlakesTexture.js +10 -8
  777. package/types/helpers.cjs.js +1 -0
  778. package/types/helpers.js +2 -3
  779. package/types/shared.cjs.js +1 -0
  780. package/types/shared.js +1 -0
  781. package/types/utils.cjs.js +1 -0
  782. package/types/utils.js +1 -0
  783. package/utils/BufferGeometryUtils.cjs.js +1 -0
  784. package/utils/BufferGeometryUtils.js +325 -251
  785. package/utils/GeometryCompressionUtils.cjs.js +1 -0
  786. package/utils/GeometryCompressionUtils.js +239 -241
  787. package/utils/GeometryUtils.cjs.js +1 -0
  788. package/utils/GeometryUtils.js +94 -41
  789. package/utils/LDrawUtils.cjs.js +1 -0
  790. package/utils/LDrawUtils.d.ts +5 -0
  791. package/utils/LDrawUtils.js +144 -0
  792. package/utils/RoughnessMipmapper.cjs.js +1 -0
  793. package/utils/RoughnessMipmapper.js +82 -38
  794. package/utils/SceneUtils.cjs.js +1 -0
  795. package/utils/SceneUtils.js +20 -15
  796. package/utils/ShadowMapViewer.cjs.js +1 -0
  797. package/utils/ShadowMapViewer.js +95 -49
  798. package/utils/SkeletonUtils.cjs.js +1 -0
  799. package/utils/SkeletonUtils.js +165 -74
  800. package/utils/UVsDebug.cjs.js +1 -0
  801. package/utils/UVsDebug.js +62 -32
  802. package/utils/WorkerPool.cjs.js +1 -0
  803. package/utils/WorkerPool.js +33 -13
  804. package/webxr/ARButton.cjs.js +1 -0
  805. package/webxr/ARButton.js +98 -72
  806. package/webxr/OculusHandModel.cjs.js +1 -0
  807. package/webxr/OculusHandModel.js +37 -18
  808. package/webxr/OculusHandPointerModel.cjs.js +1 -0
  809. package/webxr/OculusHandPointerModel.js +80 -58
  810. package/webxr/Text2D.cjs.js +1 -0
  811. package/webxr/Text2D.js +19 -37
  812. package/webxr/VRButton.cjs.js +1 -0
  813. package/webxr/VRButton.js +90 -59
  814. package/webxr/XRControllerModelFactory.cjs.js +1 -0
  815. package/webxr/XRControllerModelFactory.js +116 -58
  816. package/webxr/XREstimatedLight.cjs.js +1 -0
  817. package/webxr/XREstimatedLight.js +66 -39
  818. package/webxr/XRHandMeshModel.cjs.js +1 -0
  819. package/webxr/XRHandMeshModel.js +29 -40
  820. package/webxr/XRHandModelFactory.cjs.js +1 -0
  821. package/webxr/XRHandModelFactory.js +31 -28
  822. package/webxr/XRHandPrimitiveModel.cjs.js +1 -0
  823. package/webxr/XRHandPrimitiveModel.js +27 -41
  824. package/animation/AnimationClipCreator.mjs +0 -57
  825. package/animation/CCDIKSolver.mjs +0 -223
  826. package/animation/MMDAnimationHelper.mjs +0 -514
  827. package/animation/MMDPhysics.mjs +0 -769
  828. package/cameras/CinematicCamera.mjs +0 -129
  829. package/controls/ArcballControls.mjs +0 -1737
  830. package/controls/DeviceOrientationControls.mjs +0 -74
  831. package/controls/DragControls.mjs +0 -172
  832. package/controls/FirstPersonControls.mjs +0 -220
  833. package/controls/FlyControls.mjs +0 -239
  834. package/controls/OrbitControls.mjs +0 -731
  835. package/controls/PointerLockControls.mjs +0 -88
  836. package/controls/TrackballControls.mjs +0 -481
  837. package/controls/TransformControls.mjs +0 -1068
  838. package/controls/experimental/CameraControls.mjs +0 -673
  839. package/csm/CSM.mjs +0 -244
  840. package/csm/CSMFrustum.mjs +0 -75
  841. package/csm/CSMHelper.mjs +0 -114
  842. package/csm/CSMShader.mjs +0 -251
  843. package/curves/CurveExtras.mjs +0 -224
  844. package/curves/NURBSCurve.mjs +0 -35
  845. package/curves/NURBSSurface.mjs +0 -28
  846. package/curves/NURBSUtils.mjs +0 -226
  847. package/deprecated/Geometry.mjs +0 -966
  848. package/effects/AnaglyphEffect.mjs +0 -120
  849. package/effects/AsciiEffect.mjs +0 -173
  850. package/effects/OutlineEffect.mjs +0 -295
  851. package/effects/ParallaxBarrierEffect.mjs +0 -64
  852. package/effects/PeppersGhostEffect.mjs +0 -85
  853. package/effects/StereoEffect.mjs +0 -32
  854. package/environments/RoomEnvironment.mjs +0 -78
  855. package/exporters/ColladaExporter.mjs +0 -299
  856. package/exporters/DRACOExporter.mjs +0 -132
  857. package/exporters/GLTFExporter.mjs +0 -1381
  858. package/exporters/MMDExporter.mjs +0 -102
  859. package/exporters/OBJExporter.mjs +0 -166
  860. package/exporters/PLYExporter.mjs +0 -278
  861. package/exporters/STLExporter.mjs +0 -129
  862. package/exporters/USDZExporter.mjs +0 -328
  863. package/geometries/BoxLineGeometry.mjs +0 -45
  864. package/geometries/ConvexGeometry.mjs +0 -29
  865. package/geometries/DecalGeometry.mjs +0 -184
  866. package/geometries/LightningStrike.mjs +0 -547
  867. package/geometries/ParametricGeometries.mjs +0 -129
  868. package/geometries/ParametricGeometry.mjs +0 -63
  869. package/geometries/RoundedBoxGeometry.mjs +0 -91
  870. package/geometries/TeapotGeometry.mjs +0 -1557
  871. package/geometries/TextGeometry.mjs +0 -23
  872. package/helpers/LightProbeHelper.mjs +0 -72
  873. package/helpers/PositionalAudioHelper.mjs +0 -68
  874. package/helpers/RectAreaLightHelper.mjs +0 -44
  875. package/helpers/VertexNormalsHelper.mjs +0 -54
  876. package/helpers/VertexTangentsHelper.mjs +0 -45
  877. package/index.mjs +0 -969
  878. package/interactive/SelectionBox.mjs +0 -137
  879. package/interactive/SelectionHelper.mjs +0 -54
  880. package/libs/MeshoptDecoder.mjs +0 -210
  881. package/libs/MotionControllers.mjs +0 -261
  882. package/lights/LightProbeGenerator.mjs +0 -145
  883. package/lights/RectAreaLightUniformsLib.mjs +0 -32842
  884. package/lines/Line2.mjs +0 -13
  885. package/lines/LineGeometry.mjs +0 -44
  886. package/lines/LineMaterial.mjs +0 -539
  887. package/lines/LineSegments2.mjs +0 -202
  888. package/lines/LineSegmentsGeometry.mjs +0 -124
  889. package/lines/Wireframe.mjs +0 -31
  890. package/lines/WireframeGeometry2.mjs +0 -13
  891. package/loaders/3DMLoader.mjs +0 -802
  892. package/loaders/3MFLoader.mjs +0 -837
  893. package/loaders/AMFLoader.mjs +0 -284
  894. package/loaders/AssimpLoader.mjs +0 -1396
  895. package/loaders/BVHLoader.mjs +0 -207
  896. package/loaders/BasisTextureLoader.mjs +0 -474
  897. package/loaders/ColladaLoader.mjs +0 -2403
  898. package/loaders/DDSLoader.mjs +0 -148
  899. package/loaders/DRACOLoader.mjs +0 -340
  900. package/loaders/EXRLoader.mjs +0 -1351
  901. package/loaders/FBXLoader.mjs +0 -2362
  902. package/loaders/FontLoader.mjs +0 -111
  903. package/loaders/GCodeLoader.mjs +0 -141
  904. package/loaders/GLTFLoader.mjs +0 -2316
  905. package/loaders/HDRCubeTextureLoader.mjs +0 -77
  906. package/loaders/KMZLoader.mjs +0 -75
  907. package/loaders/KTX2Loader.mjs +0 -427
  908. package/loaders/KTXLoader.mjs +0 -87
  909. package/loaders/LDrawLoader.mjs +0 -1409
  910. package/loaders/LUT3dlLoader.mjs +0 -100
  911. package/loaders/LUTCubeLoader.mjs +0 -104
  912. package/loaders/LWOLoader.mjs +0 -625
  913. package/loaders/LottieLoader.mjs +0 -47
  914. package/loaders/MD2Loader.mjs +0 -359
  915. package/loaders/MDDLoader.mjs +0 -58
  916. package/loaders/MMDLoader.mjs +0 -998
  917. package/loaders/MTLLoader.mjs +0 -280
  918. package/loaders/NRRDLoader.mjs +0 -401
  919. package/loaders/NodeMaterialLoader.mjs +0 -146
  920. package/loaders/OBJLoader.mjs +0 -487
  921. package/loaders/PCDLoader.mjs +0 -248
  922. package/loaders/PDBLoader.mjs +0 -246
  923. package/loaders/PLYLoader.mjs +0 -317
  924. package/loaders/PRWMLoader.mjs +0 -160
  925. package/loaders/PVRLoader.mjs +0 -131
  926. package/loaders/RGBELoader.mjs +0 -244
  927. package/loaders/RGBMLoader.mjs +0 -998
  928. package/loaders/STLLoader.mjs +0 -190
  929. package/loaders/SVGLoader.mjs +0 -1709
  930. package/loaders/TDSLoader.mjs +0 -480
  931. package/loaders/TGALoader.mjs +0 -285
  932. package/loaders/TTFLoader.mjs +0 -131
  933. package/loaders/TiltLoader.mjs +0 -373
  934. package/loaders/VOXLoader.mjs +0 -431
  935. package/loaders/VRMLLoader.mjs +0 -2093
  936. package/loaders/VRMLoader.mjs +0 -38
  937. package/loaders/VTKLoader.mjs +0 -646
  938. package/loaders/XLoader.mjs +0 -1258
  939. package/loaders/XYZLoader.mjs +0 -60
  940. package/loaders/lwo/IFFParser.mjs +0 -697
  941. package/loaders/lwo/LWO2Parser.mjs +0 -327
  942. package/loaders/lwo/LWO3Parser.mjs +0 -298
  943. package/math/Capsule.mjs +0 -100
  944. package/math/ColorConverter.mjs +0 -51
  945. package/math/ConvexHull.mjs +0 -574
  946. package/math/ImprovedNoise.mjs +0 -302
  947. package/math/Lut.mjs +0 -135
  948. package/math/MeshSurfaceSampler.mjs +0 -107
  949. package/math/OBB.mjs +0 -235
  950. package/math/Octree.mjs +0 -278
  951. package/math/SimplexNoise.mjs +0 -425
  952. package/misc/ConvexObjectBreaker.mjs +0 -292
  953. package/misc/GPUComputationRenderer.mjs +0 -171
  954. package/misc/Gyroscope.mjs +0 -35
  955. package/misc/MD2Character.mjs +0 -162
  956. package/misc/MD2CharacterComplex.mjs +0 -328
  957. package/misc/MorphAnimMesh.mjs +0 -40
  958. package/misc/MorphBlendMesh.mjs +0 -179
  959. package/misc/ProgressiveLightmap.mjs +0 -166
  960. package/misc/RollerCoaster.mjs +0 -346
  961. package/misc/TubePainter.mjs +0 -123
  962. package/misc/Volume.mjs +0 -244
  963. package/misc/VolumeSlice.mjs +0 -106
  964. package/misc/WebGL.mjs +0 -74
  965. package/modifiers/CurveModifier.mjs +0 -182
  966. package/modifiers/EdgeSplitModifier.mjs +0 -162
  967. package/modifiers/SimplifyModifier.mjs +0 -282
  968. package/modifiers/TessellateModifier.mjs +0 -206
  969. package/nodes/Nodes.mjs +0 -400
  970. package/nodes/ShaderNode.mjs +0 -408
  971. package/nodes/accessors/BufferNode.mjs +0 -15
  972. package/nodes/accessors/CameraNode.mjs +0 -44
  973. package/nodes/accessors/CubeTextureNode.mjs +0 -42
  974. package/nodes/accessors/MaterialNode.mjs +0 -71
  975. package/nodes/accessors/MaterialReferenceNode.mjs +0 -14
  976. package/nodes/accessors/ModelNode.mjs +0 -9
  977. package/nodes/accessors/ModelViewProjectionNode.mjs +0 -24
  978. package/nodes/accessors/NormalNode.mjs +0 -62
  979. package/nodes/accessors/Object3DNode.mjs +0 -76
  980. package/nodes/accessors/PointUVNode.mjs +0 -13
  981. package/nodes/accessors/PositionNode.mjs +0 -65
  982. package/nodes/accessors/ReferenceNode.mjs +0 -37
  983. package/nodes/accessors/ReflectNode.mjs +0 -43
  984. package/nodes/accessors/SkinningNode.mjs +0 -58
  985. package/nodes/accessors/TextureNode.mjs +0 -54
  986. package/nodes/accessors/UVNode.mjs +0 -23
  987. package/nodes/core/ArrayUniformNode.mjs +0 -14
  988. package/nodes/core/AttributeNode.mjs +0 -30
  989. package/nodes/core/BypassNode.mjs +0 -22
  990. package/nodes/core/CodeNode.mjs +0 -28
  991. package/nodes/core/ConstNode.mjs +0 -14
  992. package/nodes/core/ContextNode.mjs +0 -22
  993. package/nodes/core/ExpressionNode.mjs +0 -19
  994. package/nodes/core/FunctionCallNode.mjs +0 -37
  995. package/nodes/core/FunctionNode.mjs +0 -56
  996. package/nodes/core/InputNode.mjs +0 -38
  997. package/nodes/core/Node.mjs +0 -139
  998. package/nodes/core/NodeAttribute.mjs +0 -10
  999. package/nodes/core/NodeBuilder.mjs +0 -395
  1000. package/nodes/core/NodeCode.mjs +0 -11
  1001. package/nodes/core/NodeFrame.mjs +0 -35
  1002. package/nodes/core/NodeFunctionInput.mjs +0 -13
  1003. package/nodes/core/NodeKeywords.mjs +0 -44
  1004. package/nodes/core/NodeUniform.mjs +0 -18
  1005. package/nodes/core/NodeUtils.mjs +0 -57
  1006. package/nodes/core/NodeVar.mjs +0 -10
  1007. package/nodes/core/NodeVary.mjs +0 -10
  1008. package/nodes/core/PropertyNode.mjs +0 -21
  1009. package/nodes/core/TempNode.mjs +0 -25
  1010. package/nodes/core/UniformNode.mjs +0 -23
  1011. package/nodes/core/VarNode.mjs +0 -31
  1012. package/nodes/core/VaryNode.mjs +0 -30
  1013. package/nodes/core/constants.mjs +0 -24
  1014. package/nodes/display/ColorSpaceNode.mjs +0 -63
  1015. package/nodes/display/NormalMapNode.mjs +0 -54
  1016. package/nodes/fog/FogNode.mjs +0 -15
  1017. package/nodes/fog/FogRangeNode.mjs +0 -17
  1018. package/nodes/functions/BSDFs.mjs +0 -64
  1019. package/nodes/lights/LightContextNode.mjs +0 -35
  1020. package/nodes/lights/LightNode.mjs +0 -58
  1021. package/nodes/lights/LightsNode.mjs +0 -59
  1022. package/nodes/loaders/NodeLoader.mjs +0 -66
  1023. package/nodes/loaders/NodeMaterialLoader.mjs +0 -24
  1024. package/nodes/loaders/NodeObjectLoader.mjs +0 -40
  1025. package/nodes/materials/LineBasicNodeMaterial.mjs +0 -27
  1026. package/nodes/materials/Materials.mjs +0 -28
  1027. package/nodes/materials/MeshBasicNodeMaterial.mjs +0 -28
  1028. package/nodes/materials/MeshStandardNodeMaterial.mjs +0 -41
  1029. package/nodes/materials/NodeMaterial.mjs +0 -64
  1030. package/nodes/materials/PointsNodeMaterial.mjs +0 -30
  1031. package/nodes/math/CondNode.mjs +0 -38
  1032. package/nodes/math/MathNode.mjs +0 -163
  1033. package/nodes/math/OperatorNode.mjs +0 -103
  1034. package/nodes/procedural/CheckerNode.mjs +0 -21
  1035. package/nodes/utils/ArrayElementNode.mjs +0 -19
  1036. package/nodes/utils/ConvertNode.mjs +0 -25
  1037. package/nodes/utils/JoinNode.mjs +0 -26
  1038. package/nodes/utils/MatcapUVNode.mjs +0 -16
  1039. package/nodes/utils/OscNode.mjs +0 -50
  1040. package/nodes/utils/SplitNode.mjs +0 -45
  1041. package/nodes/utils/SpriteSheetUVNode.mjs +0 -40
  1042. package/nodes/utils/TimerNode.mjs +0 -44
  1043. package/objects/GroundProjectedEnv.mjs +0 -130
  1044. package/objects/Lensflare.mjs +0 -262
  1045. package/objects/LightningStorm.mjs +0 -110
  1046. package/objects/MarchingCubes.mjs +0 -457
  1047. package/objects/Reflector.mjs +0 -166
  1048. package/objects/ReflectorForSSRPass.mjs +0 -247
  1049. package/objects/ReflectorRTT.mjs +0 -10
  1050. package/objects/Refractor.mjs +0 -178
  1051. package/objects/ShadowMesh.mjs +0 -41
  1052. package/objects/Sky.mjs +0 -124
  1053. package/objects/Water.mjs +0 -235
  1054. package/objects/Water2.mjs +0 -252
  1055. package/offscreen/jank.mjs +0 -27
  1056. package/offscreen/offscreen.mjs +0 -5
  1057. package/offscreen/scene.mjs +0 -52
  1058. package/physics/AmmoPhysics.mjs +0 -165
  1059. package/postprocessing/AdaptiveToneMappingPass.mjs +0 -221
  1060. package/postprocessing/AfterimagePass.mjs +0 -55
  1061. package/postprocessing/BloomPass.mjs +0 -90
  1062. package/postprocessing/BokehPass.mjs +0 -76
  1063. package/postprocessing/ClearPass.mjs +0 -27
  1064. package/postprocessing/CubeTexturePass.mjs +0 -49
  1065. package/postprocessing/DotScreenPass.mjs +0 -40
  1066. package/postprocessing/EffectComposer.mjs +0 -139
  1067. package/postprocessing/FilmPass.mjs +0 -42
  1068. package/postprocessing/GlitchPass.mjs +0 -75
  1069. package/postprocessing/HalftonePass.mjs +0 -44
  1070. package/postprocessing/LUTPass.mjs +0 -136
  1071. package/postprocessing/MaskPass.mjs +0 -60
  1072. package/postprocessing/OutlinePass.mjs +0 -438
  1073. package/postprocessing/Pass.mjs +0 -37
  1074. package/postprocessing/RenderPass.mjs +0 -48
  1075. package/postprocessing/RenderPixelatedPass.mjs +0 -199
  1076. package/postprocessing/SAOPass.mjs +0 -282
  1077. package/postprocessing/SMAAPass.mjs +0 -112
  1078. package/postprocessing/SSAARenderPass.mjs +0 -170
  1079. package/postprocessing/SSAOPass.mjs +0 -265
  1080. package/postprocessing/SSRPass.mjs +0 -432
  1081. package/postprocessing/SavePass.mjs +0 -37
  1082. package/postprocessing/ShaderPass.mjs +0 -39
  1083. package/postprocessing/TAARenderPass.mjs +0 -88
  1084. package/postprocessing/TexturePass.mjs +0 -39
  1085. package/postprocessing/UnrealBloomPass.mjs +0 -220
  1086. package/renderers/CSS2DRenderer.mjs +0 -112
  1087. package/renderers/CSS3DRenderer.mjs +0 -133
  1088. package/renderers/Projector.mjs +0 -511
  1089. package/renderers/SVGRenderer.mjs +0 -306
  1090. package/renderers/nodes/accessors/CameraNode.mjs +0 -63
  1091. package/renderers/nodes/accessors/ModelNode.mjs +0 -61
  1092. package/renderers/nodes/accessors/ModelViewProjectionNode.mjs +0 -21
  1093. package/renderers/nodes/accessors/NormalNode.mjs +0 -61
  1094. package/renderers/nodes/accessors/PositionNode.mjs +0 -30
  1095. package/renderers/nodes/accessors/UVNode.mjs +0 -13
  1096. package/renderers/nodes/core/AttributeNode.mjs +0 -35
  1097. package/renderers/nodes/core/InputNode.mjs +0 -31
  1098. package/renderers/nodes/core/Node.mjs +0 -34
  1099. package/renderers/nodes/core/NodeAttribute.mjs +0 -10
  1100. package/renderers/nodes/core/NodeBuilder.mjs +0 -243
  1101. package/renderers/nodes/core/NodeFrame.mjs +0 -35
  1102. package/renderers/nodes/core/NodeSlot.mjs +0 -10
  1103. package/renderers/nodes/core/NodeUniform.mjs +0 -18
  1104. package/renderers/nodes/core/NodeVary.mjs +0 -11
  1105. package/renderers/nodes/core/VaryNode.mjs +0 -22
  1106. package/renderers/nodes/core/constants.mjs +0 -22
  1107. package/renderers/nodes/inputs/ColorNode.mjs +0 -11
  1108. package/renderers/nodes/inputs/FloatNode.mjs +0 -11
  1109. package/renderers/nodes/inputs/Matrix3Node.mjs +0 -12
  1110. package/renderers/nodes/inputs/Matrix4Node.mjs +0 -12
  1111. package/renderers/nodes/inputs/TextureNode.mjs +0 -20
  1112. package/renderers/nodes/inputs/Vector2Node.mjs +0 -11
  1113. package/renderers/nodes/inputs/Vector3Node.mjs +0 -12
  1114. package/renderers/nodes/inputs/Vector4Node.mjs +0 -12
  1115. package/renderers/nodes/math/MathNode.mjs +0 -55
  1116. package/renderers/nodes/math/OperatorNode.mjs +0 -42
  1117. package/renderers/nodes/utils/SwitchNode.mjs +0 -20
  1118. package/renderers/nodes/utils/TimerNode.mjs +0 -14
  1119. package/renderers/webgpu/WebGPU.mjs +0 -24
  1120. package/renderers/webgpu/WebGPUAttributes.mjs +0 -69
  1121. package/renderers/webgpu/WebGPUBackground.mjs +0 -61
  1122. package/renderers/webgpu/WebGPUBinding.mjs +0 -14
  1123. package/renderers/webgpu/WebGPUBindings.mjs +0 -155
  1124. package/renderers/webgpu/WebGPUComputePipelines.mjs +0 -44
  1125. package/renderers/webgpu/WebGPUGeometries.mjs +0 -41
  1126. package/renderers/webgpu/WebGPUInfo.mjs +0 -46
  1127. package/renderers/webgpu/WebGPUObjects.mjs +0 -25
  1128. package/renderers/webgpu/WebGPUProperties.mjs +0 -22
  1129. package/renderers/webgpu/WebGPURenderLists.mjs +0 -119
  1130. package/renderers/webgpu/WebGPURenderPipelines.mjs +0 -545
  1131. package/renderers/webgpu/WebGPURenderer.mjs +0 -574
  1132. package/renderers/webgpu/WebGPUSampledTexture.mjs +0 -40
  1133. package/renderers/webgpu/WebGPUSampler.mjs +0 -15
  1134. package/renderers/webgpu/WebGPUStorageBuffer.mjs +0 -15
  1135. package/renderers/webgpu/WebGPUTextureRenderer.mjs +0 -23
  1136. package/renderers/webgpu/WebGPUTextureUtils.mjs +0 -98
  1137. package/renderers/webgpu/WebGPUTextures.mjs +0 -484
  1138. package/renderers/webgpu/WebGPUUniform.mjs +0 -81
  1139. package/renderers/webgpu/WebGPUUniformsGroup.mjs +0 -176
  1140. package/renderers/webgpu/constants.mjs +0 -230
  1141. package/renderers/webgpu/nodes/ShaderLib.mjs +0 -42
  1142. package/renderers/webgpu/nodes/WebGPUNodeBuilder.mjs +0 -165
  1143. package/renderers/webgpu/nodes/WebGPUNodeUniform.mjs +0 -73
  1144. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.mjs +0 -15
  1145. package/renderers/webgpu/nodes/WebGPUNodes.mjs +0 -40
  1146. package/shaders/ACESFilmicToneMappingShader.mjs +0 -48
  1147. package/shaders/AfterimageShader.mjs +0 -32
  1148. package/shaders/BasicShader.mjs +0 -12
  1149. package/shaders/BleachBypassShader.mjs +0 -35
  1150. package/shaders/BlendShader.mjs +0 -30
  1151. package/shaders/BokehShader.mjs +0 -106
  1152. package/shaders/BokehShader2.mjs +0 -269
  1153. package/shaders/BrightnessContrastShader.mjs +0 -32
  1154. package/shaders/ColorCorrectionShader.mjs +0 -30
  1155. package/shaders/ColorifyShader.mjs +0 -28
  1156. package/shaders/ConvolutionShader.mjs +0 -55
  1157. package/shaders/CopyShader.mjs +0 -25
  1158. package/shaders/DOFMipMapShader.mjs +0 -32
  1159. package/shaders/DepthLimitedBlurShader.mjs +0 -114
  1160. package/shaders/DigitalGlitch.mjs +0 -78
  1161. package/shaders/DotScreenShader.mjs +0 -39
  1162. package/shaders/FXAAShader.mjs +0 -1098
  1163. package/shaders/FilmShader.mjs +0 -42
  1164. package/shaders/FocusShader.mjs +0 -55
  1165. package/shaders/FreiChenShader.mjs +0 -61
  1166. package/shaders/FresnelShader.mjs +0 -47
  1167. package/shaders/GammaCorrectionShader.mjs +0 -23
  1168. package/shaders/GodRaysShader.mjs +0 -146
  1169. package/shaders/HalftoneShader.mjs +0 -212
  1170. package/shaders/HorizontalBlurShader.mjs +0 -43
  1171. package/shaders/HorizontalTiltShiftShader.mjs +0 -37
  1172. package/shaders/HueSaturationShader.mjs +0 -41
  1173. package/shaders/KaleidoShader.mjs +0 -34
  1174. package/shaders/LuminosityHighPassShader.mjs +0 -37
  1175. package/shaders/LuminosityShader.mjs +0 -25
  1176. package/shaders/MirrorShader.mjs +0 -35
  1177. package/shaders/NormalMapShader.mjs +0 -31
  1178. package/shaders/ParallaxShader.mjs +0 -113
  1179. package/shaders/PixelShader.mjs +0 -28
  1180. package/shaders/RGBShiftShader.mjs +0 -30
  1181. package/shaders/SAOShader.mjs +0 -144
  1182. package/shaders/SMAAShader.mjs +0 -272
  1183. package/shaders/SSAOShader.mjs +0 -172
  1184. package/shaders/SSRShader.mjs +0 -324
  1185. package/shaders/SepiaShader.mjs +0 -29
  1186. package/shaders/SobelOperatorShader.mjs +0 -44
  1187. package/shaders/SubsurfaceScatteringShader.mjs +0 -59
  1188. package/shaders/TechnicolorShader.mjs +0 -24
  1189. package/shaders/ToneMapShader.mjs +0 -48
  1190. package/shaders/ToonShader.mjs +0 -188
  1191. package/shaders/TriangleBlurShader.mjs +0 -36
  1192. package/shaders/UnpackDepthRGBAShader.mjs +0 -26
  1193. package/shaders/VerticalBlurShader.mjs +0 -44
  1194. package/shaders/VerticalTiltShiftShader.mjs +0 -37
  1195. package/shaders/VignetteShader.mjs +0 -28
  1196. package/shaders/VolumeShader.mjs +0 -178
  1197. package/shaders/WaterRefractionShader.mjs +0 -57
  1198. package/textures/FlakesTexture.mjs +0 -30
  1199. package/types/helpers.mjs +0 -4
  1200. package/utils/BufferGeometryUtils.mjs +0 -570
  1201. package/utils/GeometryCompressionUtils.mjs +0 -547
  1202. package/utils/GeometryUtils.mjs +0 -108
  1203. package/utils/RoughnessMipmapper.mjs +0 -213
  1204. package/utils/SceneUtils.mjs +0 -36
  1205. package/utils/ShadowMapViewer.mjs +0 -114
  1206. package/utils/SkeletonUtils.mjs +0 -292
  1207. package/utils/UVsDebug.mjs +0 -85
  1208. package/utils/WorkerPool.mjs +0 -62
  1209. package/webxr/ARButton.mjs +0 -119
  1210. package/webxr/OculusHandModel.mjs +0 -71
  1211. package/webxr/OculusHandPointerModel.mjs +0 -207
  1212. package/webxr/Text2D.mjs +0 -31
  1213. package/webxr/VRButton.mjs +0 -105
  1214. package/webxr/XRControllerModelFactory.mjs +0 -146
  1215. package/webxr/XREstimatedLight.mjs +0 -126
  1216. package/webxr/XRHandMeshModel.mjs +0 -73
  1217. package/webxr/XRHandModelFactory.mjs +0 -61
  1218. package/webxr/XRHandPrimitiveModel.mjs +0 -68
@@ -1,211 +1,255 @@
1
- "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const THREE = require("three");
4
- const TGALoader = require("./TGALoader.js");
5
- class ColladaLoader extends THREE.Loader {
1
+ import { Loader, LoaderUtils, FileLoader, Vector3, Quaternion, Matrix4, MeshBasicMaterial, Scene, TextureLoader, Euler, MathUtils, AnimationClip, VectorKeyframeTrack, QuaternionKeyframeTrack, MeshLambertMaterial, MeshPhongMaterial, Vector2, DoubleSide, FrontSide, PerspectiveCamera, OrthographicCamera, Color, AmbientLight, SpotLight, PointLight, DirectionalLight, BufferGeometry, Float32BufferAttribute, Skeleton, Bone, Group, LineBasicMaterial, SkinnedMesh, Mesh, Line, LineSegments, RepeatWrapping, ClampToEdgeWrapping } from 'three';
2
+ import { TGALoader } from './TGALoader.js';
3
+
4
+ class ColladaLoader extends Loader {
6
5
  constructor(manager) {
7
6
  super(manager);
8
7
  }
8
+
9
9
  load(url, onLoad, onProgress, onError) {
10
10
  const scope = this;
11
- const path = scope.path === "" ? THREE.LoaderUtils.extractUrlBase(url) : scope.path;
12
- const loader = new THREE.FileLoader(scope.manager);
11
+ const path = scope.path === '' ? LoaderUtils.extractUrlBase(url) : scope.path;
12
+ const loader = new FileLoader(scope.manager);
13
13
  loader.setPath(scope.path);
14
14
  loader.setRequestHeader(scope.requestHeader);
15
15
  loader.setWithCredentials(scope.withCredentials);
16
- loader.load(
17
- url,
18
- function(text) {
19
- try {
20
- onLoad(scope.parse(text, path));
21
- } catch (e) {
22
- if (onError) {
23
- onError(e);
24
- } else {
25
- console.error(e);
26
- }
27
- scope.manager.itemError(url);
16
+ loader.load(url, function (text) {
17
+ try {
18
+ onLoad(scope.parse(text, path));
19
+ } catch (e) {
20
+ if (onError) {
21
+ onError(e);
22
+ } else {
23
+ console.error(e);
28
24
  }
29
- },
30
- onProgress,
31
- onError
32
- );
25
+
26
+ scope.manager.itemError(url);
27
+ }
28
+ }, onProgress, onError);
33
29
  }
30
+
34
31
  parse(text, path) {
35
- function getElementsByTagName(xml2, name) {
32
+ function getElementsByTagName(xml, name) {
33
+ // Non recursive xml.getElementsByTagName() ...
36
34
  const array = [];
37
- const childNodes = xml2.childNodes;
35
+ const childNodes = xml.childNodes;
36
+
38
37
  for (let i = 0, l = childNodes.length; i < l; i++) {
39
38
  const child = childNodes[i];
39
+
40
40
  if (child.nodeName === name) {
41
41
  array.push(child);
42
42
  }
43
43
  }
44
+
44
45
  return array;
45
46
  }
46
- function parseStrings(text2) {
47
- if (text2.length === 0)
48
- return [];
49
- const parts = text2.trim().split(/\s+/);
47
+
48
+ function parseStrings(text) {
49
+ if (text.length === 0) return [];
50
+ const parts = text.trim().split(/\s+/);
50
51
  const array = new Array(parts.length);
52
+
51
53
  for (let i = 0, l = parts.length; i < l; i++) {
52
54
  array[i] = parts[i];
53
55
  }
56
+
54
57
  return array;
55
58
  }
56
- function parseFloats(text2) {
57
- if (text2.length === 0)
58
- return [];
59
- const parts = text2.trim().split(/\s+/);
59
+
60
+ function parseFloats(text) {
61
+ if (text.length === 0) return [];
62
+ const parts = text.trim().split(/\s+/);
60
63
  const array = new Array(parts.length);
64
+
61
65
  for (let i = 0, l = parts.length; i < l; i++) {
62
66
  array[i] = parseFloat(parts[i]);
63
67
  }
68
+
64
69
  return array;
65
70
  }
66
- function parseInts(text2) {
67
- if (text2.length === 0)
68
- return [];
69
- const parts = text2.trim().split(/\s+/);
71
+
72
+ function parseInts(text) {
73
+ if (text.length === 0) return [];
74
+ const parts = text.trim().split(/\s+/);
70
75
  const array = new Array(parts.length);
76
+
71
77
  for (let i = 0, l = parts.length; i < l; i++) {
72
78
  array[i] = parseInt(parts[i]);
73
79
  }
80
+
74
81
  return array;
75
82
  }
76
- function parseId(text2) {
77
- return text2.substring(1);
83
+
84
+ function parseId(text) {
85
+ return text.substring(1);
78
86
  }
87
+
79
88
  function generateId() {
80
- return "three_default_" + count++;
89
+ return 'three_default_' + count++;
81
90
  }
91
+
82
92
  function isEmpty(object) {
83
93
  return Object.keys(object).length === 0;
84
- }
85
- function parseAsset(xml2) {
94
+ } // asset
95
+
96
+
97
+ function parseAsset(xml) {
86
98
  return {
87
- unit: parseAssetUnit(getElementsByTagName(xml2, "unit")[0]),
88
- upAxis: parseAssetUpAxis(getElementsByTagName(xml2, "up_axis")[0])
99
+ unit: parseAssetUnit(getElementsByTagName(xml, 'unit')[0]),
100
+ upAxis: parseAssetUpAxis(getElementsByTagName(xml, 'up_axis')[0])
89
101
  };
90
102
  }
91
- function parseAssetUnit(xml2) {
92
- if (xml2 !== void 0 && xml2.hasAttribute("meter") === true) {
93
- return parseFloat(xml2.getAttribute("meter"));
103
+
104
+ function parseAssetUnit(xml) {
105
+ if (xml !== undefined && xml.hasAttribute('meter') === true) {
106
+ return parseFloat(xml.getAttribute('meter'));
94
107
  } else {
95
- return 1;
96
- }
97
- }
98
- function parseAssetUpAxis(xml2) {
99
- return xml2 !== void 0 ? xml2.textContent : "Y_UP";
100
- }
101
- function parseLibrary(xml2, libraryName, nodeName, parser) {
102
- const library2 = getElementsByTagName(xml2, libraryName)[0];
103
- if (library2 !== void 0) {
104
- const elements = getElementsByTagName(library2, nodeName);
108
+ return 1; // default 1 meter
109
+ }
110
+ }
111
+
112
+ function parseAssetUpAxis(xml) {
113
+ return xml !== undefined ? xml.textContent : 'Y_UP';
114
+ } // library
115
+
116
+
117
+ function parseLibrary(xml, libraryName, nodeName, parser) {
118
+ const library = getElementsByTagName(xml, libraryName)[0];
119
+
120
+ if (library !== undefined) {
121
+ const elements = getElementsByTagName(library, nodeName);
122
+
105
123
  for (let i = 0; i < elements.length; i++) {
106
124
  parser(elements[i]);
107
125
  }
108
126
  }
109
127
  }
128
+
110
129
  function buildLibrary(data, builder) {
111
130
  for (const name in data) {
112
131
  const object = data[name];
113
132
  object.build = builder(data[name]);
114
133
  }
115
- }
134
+ } // get
135
+
136
+
116
137
  function getBuild(data, builder) {
117
- if (data.build !== void 0)
118
- return data.build;
138
+ if (data.build !== undefined) return data.build;
119
139
  data.build = builder(data);
120
140
  return data.build;
121
- }
122
- function parseAnimation(xml2) {
141
+ } // animation
142
+
143
+
144
+ function parseAnimation(xml) {
123
145
  const data = {
124
146
  sources: {},
125
147
  samplers: {},
126
148
  channels: {}
127
149
  };
128
150
  let hasChildren = false;
129
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
130
- const child = xml2.childNodes[i];
131
- if (child.nodeType !== 1)
132
- continue;
151
+
152
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
153
+ const child = xml.childNodes[i];
154
+ if (child.nodeType !== 1) continue;
133
155
  let id;
156
+
134
157
  switch (child.nodeName) {
135
- case "source":
136
- id = child.getAttribute("id");
158
+ case 'source':
159
+ id = child.getAttribute('id');
137
160
  data.sources[id] = parseSource(child);
138
161
  break;
139
- case "sampler":
140
- id = child.getAttribute("id");
162
+
163
+ case 'sampler':
164
+ id = child.getAttribute('id');
141
165
  data.samplers[id] = parseAnimationSampler(child);
142
166
  break;
143
- case "channel":
144
- id = child.getAttribute("target");
167
+
168
+ case 'channel':
169
+ id = child.getAttribute('target');
145
170
  data.channels[id] = parseAnimationChannel(child);
146
171
  break;
147
- case "animation":
172
+
173
+ case 'animation':
174
+ // hierarchy of related animations
148
175
  parseAnimation(child);
149
176
  hasChildren = true;
150
177
  break;
178
+
151
179
  default:
152
180
  console.log(child);
153
181
  }
154
182
  }
183
+
155
184
  if (hasChildren === false) {
156
- library.animations[xml2.getAttribute("id") || THREE.MathUtils.generateUUID()] = data;
185
+ // since 'id' attributes can be optional, it's necessary to generate a UUID for unqiue assignment
186
+ library.animations[xml.getAttribute('id') || MathUtils.generateUUID()] = data;
157
187
  }
158
188
  }
159
- function parseAnimationSampler(xml2) {
189
+
190
+ function parseAnimationSampler(xml) {
160
191
  const data = {
161
192
  inputs: {}
162
193
  };
163
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
164
- const child = xml2.childNodes[i];
165
- if (child.nodeType !== 1)
166
- continue;
194
+
195
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
196
+ const child = xml.childNodes[i];
197
+ if (child.nodeType !== 1) continue;
198
+
167
199
  switch (child.nodeName) {
168
- case "input":
169
- const id = parseId(child.getAttribute("source"));
170
- const semantic = child.getAttribute("semantic");
200
+ case 'input':
201
+ const id = parseId(child.getAttribute('source'));
202
+ const semantic = child.getAttribute('semantic');
171
203
  data.inputs[semantic] = id;
172
204
  break;
173
205
  }
174
206
  }
207
+
175
208
  return data;
176
209
  }
177
- function parseAnimationChannel(xml2) {
210
+
211
+ function parseAnimationChannel(xml) {
178
212
  const data = {};
179
- const target = xml2.getAttribute("target");
180
- let parts = target.split("/");
213
+ const target = xml.getAttribute('target'); // parsing SID Addressing Syntax
214
+
215
+ let parts = target.split('/');
181
216
  const id = parts.shift();
182
- let sid = parts.shift();
183
- const arraySyntax = sid.indexOf("(") !== -1;
184
- const memberSyntax = sid.indexOf(".") !== -1;
217
+ let sid = parts.shift(); // check selection syntax
218
+
219
+ const arraySyntax = sid.indexOf('(') !== -1;
220
+ const memberSyntax = sid.indexOf('.') !== -1;
221
+
185
222
  if (memberSyntax) {
186
- parts = sid.split(".");
223
+ // member selection access
224
+ parts = sid.split('.');
187
225
  sid = parts.shift();
188
226
  data.member = parts.shift();
189
227
  } else if (arraySyntax) {
190
- const indices = sid.split("(");
228
+ // array-access syntax. can be used to express fields in one-dimensional vectors or two-dimensional matrices.
229
+ const indices = sid.split('(');
191
230
  sid = indices.shift();
231
+
192
232
  for (let i = 0; i < indices.length; i++) {
193
- indices[i] = parseInt(indices[i].replace(/\)/, ""));
233
+ indices[i] = parseInt(indices[i].replace(/\)/, ''));
194
234
  }
235
+
195
236
  data.indices = indices;
196
237
  }
238
+
197
239
  data.id = id;
198
240
  data.sid = sid;
199
241
  data.arraySyntax = arraySyntax;
200
242
  data.memberSyntax = memberSyntax;
201
- data.sampler = parseId(xml2.getAttribute("source"));
243
+ data.sampler = parseId(xml.getAttribute('source'));
202
244
  return data;
203
245
  }
246
+
204
247
  function buildAnimation(data) {
205
248
  const tracks = [];
206
249
  const channels = data.channels;
207
250
  const samplers = data.samplers;
208
251
  const sources = data.sources;
252
+
209
253
  for (const target in channels) {
210
254
  if (channels.hasOwnProperty(target)) {
211
255
  const channel = channels[target];
@@ -218,11 +262,14 @@ class ColladaLoader extends THREE.Loader {
218
262
  createKeyframeTracks(animation, tracks);
219
263
  }
220
264
  }
265
+
221
266
  return tracks;
222
267
  }
268
+
223
269
  function getAnimation(id) {
224
270
  return getBuild(library.animations[id], buildAnimation);
225
271
  }
272
+
226
273
  function buildAnimationChannel(channel, inputSource, outputSource) {
227
274
  const node = library.nodes[channel.id];
228
275
  const object3D = getNode(node.id);
@@ -230,14 +277,16 @@ class ColladaLoader extends THREE.Loader {
230
277
  const defaultMatrix = node.matrix.clone().transpose();
231
278
  let time, stride;
232
279
  let i, il, j, jl;
233
- const data = {};
280
+ const data = {}; // the collada spec allows the animation of data in various ways.
281
+ // depending on the transform type (matrix, translate, rotate, scale), we execute different logic
282
+
234
283
  switch (transform) {
235
- case "matrix":
284
+ case 'matrix':
236
285
  for (i = 0, il = inputSource.array.length; i < il; i++) {
237
286
  time = inputSource.array[i];
238
287
  stride = i * outputSource.stride;
239
- if (data[time] === void 0)
240
- data[time] = {};
288
+ if (data[time] === undefined) data[time] = {};
289
+
241
290
  if (channel.arraySyntax === true) {
242
291
  const value = outputSource.array[stride];
243
292
  const index = channel.indices[0] + 4 * channel.indices[1];
@@ -248,41 +297,58 @@ class ColladaLoader extends THREE.Loader {
248
297
  }
249
298
  }
250
299
  }
300
+
251
301
  break;
252
- case "translate":
302
+
303
+ case 'translate':
253
304
  console.warn('THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform);
254
305
  break;
255
- case "rotate":
306
+
307
+ case 'rotate':
256
308
  console.warn('THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform);
257
309
  break;
258
- case "scale":
310
+
311
+ case 'scale':
259
312
  console.warn('THREE.ColladaLoader: Animation transform type "%s" not yet implemented.', transform);
260
313
  break;
261
314
  }
315
+
262
316
  const keyframes = prepareAnimationData(data, defaultMatrix);
263
317
  const animation = {
264
318
  name: object3D.uuid,
265
- keyframes
319
+ keyframes: keyframes
266
320
  };
267
321
  return animation;
268
322
  }
323
+
269
324
  function prepareAnimationData(data, defaultMatrix) {
270
- const keyframes = [];
325
+ const keyframes = []; // transfer data into a sortable array
326
+
271
327
  for (const time in data) {
272
- keyframes.push({ time: parseFloat(time), value: data[time] });
273
- }
274
- keyframes.sort(ascending);
328
+ keyframes.push({
329
+ time: parseFloat(time),
330
+ value: data[time]
331
+ });
332
+ } // ensure keyframes are sorted by time
333
+
334
+
335
+ keyframes.sort(ascending); // now we clean up all animation data, so we can use them for keyframe tracks
336
+
275
337
  for (let i = 0; i < 16; i++) {
276
338
  transformAnimationData(keyframes, i, defaultMatrix.elements[i]);
277
339
  }
278
- return keyframes;
340
+
341
+ return keyframes; // array sort function
342
+
279
343
  function ascending(a, b) {
280
344
  return a.time - b.time;
281
345
  }
282
346
  }
283
- const position = new THREE.Vector3();
284
- const scale = new THREE.Vector3();
285
- const quaternion = new THREE.Quaternion();
347
+
348
+ const position = new Vector3();
349
+ const scale = new Vector3();
350
+ const quaternion = new Quaternion();
351
+
286
352
  function createKeyframeTracks(animation, tracks) {
287
353
  const keyframes = animation.keyframes;
288
354
  const name = animation.name;
@@ -290,6 +356,7 @@ class ColladaLoader extends THREE.Loader {
290
356
  const positionData = [];
291
357
  const quaternionData = [];
292
358
  const scaleData = [];
359
+
293
360
  for (let i = 0, l = keyframes.length; i < l; i++) {
294
361
  const keyframe = keyframes[i];
295
362
  const time = keyframe.time;
@@ -301,219 +368,274 @@ class ColladaLoader extends THREE.Loader {
301
368
  quaternionData.push(quaternion.x, quaternion.y, quaternion.z, quaternion.w);
302
369
  scaleData.push(scale.x, scale.y, scale.z);
303
370
  }
304
- if (positionData.length > 0)
305
- tracks.push(new THREE.VectorKeyframeTrack(name + ".position", times, positionData));
371
+
372
+ if (positionData.length > 0) tracks.push(new VectorKeyframeTrack(name + '.position', times, positionData));
373
+
306
374
  if (quaternionData.length > 0) {
307
- tracks.push(new THREE.QuaternionKeyframeTrack(name + ".quaternion", times, quaternionData));
375
+ tracks.push(new QuaternionKeyframeTrack(name + '.quaternion', times, quaternionData));
308
376
  }
309
- if (scaleData.length > 0)
310
- tracks.push(new THREE.VectorKeyframeTrack(name + ".scale", times, scaleData));
377
+
378
+ if (scaleData.length > 0) tracks.push(new VectorKeyframeTrack(name + '.scale', times, scaleData));
311
379
  return tracks;
312
380
  }
381
+
313
382
  function transformAnimationData(keyframes, property, defaultValue) {
314
383
  let keyframe;
315
384
  let empty = true;
316
- let i, l;
385
+ let i, l; // check, if values of a property are missing in our keyframes
386
+
317
387
  for (i = 0, l = keyframes.length; i < l; i++) {
318
388
  keyframe = keyframes[i];
319
- if (keyframe.value[property] === void 0) {
320
- keyframe.value[property] = null;
389
+
390
+ if (keyframe.value[property] === undefined) {
391
+ keyframe.value[property] = null; // mark as missing
321
392
  } else {
322
393
  empty = false;
323
394
  }
324
395
  }
396
+
325
397
  if (empty === true) {
398
+ // no values at all, so we set a default value
326
399
  for (i = 0, l = keyframes.length; i < l; i++) {
327
400
  keyframe = keyframes[i];
328
401
  keyframe.value[property] = defaultValue;
329
402
  }
330
403
  } else {
404
+ // filling gaps
331
405
  createMissingKeyframes(keyframes, property);
332
406
  }
333
407
  }
408
+
334
409
  function createMissingKeyframes(keyframes, property) {
335
410
  let prev, next;
411
+
336
412
  for (let i = 0, l = keyframes.length; i < l; i++) {
337
413
  const keyframe = keyframes[i];
414
+
338
415
  if (keyframe.value[property] === null) {
339
416
  prev = getPrev(keyframes, i, property);
340
417
  next = getNext(keyframes, i, property);
418
+
341
419
  if (prev === null) {
342
420
  keyframe.value[property] = next.value[property];
343
421
  continue;
344
422
  }
423
+
345
424
  if (next === null) {
346
425
  keyframe.value[property] = prev.value[property];
347
426
  continue;
348
427
  }
428
+
349
429
  interpolate(keyframe, prev, next, property);
350
430
  }
351
431
  }
352
432
  }
433
+
353
434
  function getPrev(keyframes, i, property) {
354
435
  while (i >= 0) {
355
436
  const keyframe = keyframes[i];
356
- if (keyframe.value[property] !== null)
357
- return keyframe;
437
+ if (keyframe.value[property] !== null) return keyframe;
358
438
  i--;
359
439
  }
440
+
360
441
  return null;
361
442
  }
443
+
362
444
  function getNext(keyframes, i, property) {
363
445
  while (i < keyframes.length) {
364
446
  const keyframe = keyframes[i];
365
- if (keyframe.value[property] !== null)
366
- return keyframe;
447
+ if (keyframe.value[property] !== null) return keyframe;
367
448
  i++;
368
449
  }
450
+
369
451
  return null;
370
452
  }
453
+
371
454
  function interpolate(key, prev, next, property) {
372
455
  if (next.time - prev.time === 0) {
373
456
  key.value[property] = prev.value[property];
374
457
  return;
375
458
  }
459
+
376
460
  key.value[property] = (key.time - prev.time) * (next.value[property] - prev.value[property]) / (next.time - prev.time) + prev.value[property];
377
- }
378
- function parseAnimationClip(xml2) {
461
+ } // animation clips
462
+
463
+
464
+ function parseAnimationClip(xml) {
379
465
  const data = {
380
- name: xml2.getAttribute("id") || "default",
381
- start: parseFloat(xml2.getAttribute("start") || 0),
382
- end: parseFloat(xml2.getAttribute("end") || 0),
466
+ name: xml.getAttribute('id') || 'default',
467
+ start: parseFloat(xml.getAttribute('start') || 0),
468
+ end: parseFloat(xml.getAttribute('end') || 0),
383
469
  animations: []
384
470
  };
385
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
386
- const child = xml2.childNodes[i];
387
- if (child.nodeType !== 1)
388
- continue;
471
+
472
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
473
+ const child = xml.childNodes[i];
474
+ if (child.nodeType !== 1) continue;
475
+
389
476
  switch (child.nodeName) {
390
- case "instance_animation":
391
- data.animations.push(parseId(child.getAttribute("url")));
477
+ case 'instance_animation':
478
+ data.animations.push(parseId(child.getAttribute('url')));
392
479
  break;
393
480
  }
394
481
  }
395
- library.clips[xml2.getAttribute("id")] = data;
482
+
483
+ library.clips[xml.getAttribute('id')] = data;
396
484
  }
485
+
397
486
  function buildAnimationClip(data) {
398
487
  const tracks = [];
399
488
  const name = data.name;
400
489
  const duration = data.end - data.start || -1;
401
- const animations2 = data.animations;
402
- for (let i = 0, il = animations2.length; i < il; i++) {
403
- const animationTracks = getAnimation(animations2[i]);
490
+ const animations = data.animations;
491
+
492
+ for (let i = 0, il = animations.length; i < il; i++) {
493
+ const animationTracks = getAnimation(animations[i]);
494
+
404
495
  for (let j = 0, jl = animationTracks.length; j < jl; j++) {
405
496
  tracks.push(animationTracks[j]);
406
497
  }
407
498
  }
408
- return new THREE.AnimationClip(name, duration, tracks);
499
+
500
+ return new AnimationClip(name, duration, tracks);
409
501
  }
502
+
410
503
  function getAnimationClip(id) {
411
504
  return getBuild(library.clips[id], buildAnimationClip);
412
- }
413
- function parseController(xml2) {
505
+ } // controller
506
+
507
+
508
+ function parseController(xml) {
414
509
  const data = {};
415
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
416
- const child = xml2.childNodes[i];
417
- if (child.nodeType !== 1)
418
- continue;
510
+
511
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
512
+ const child = xml.childNodes[i];
513
+ if (child.nodeType !== 1) continue;
514
+
419
515
  switch (child.nodeName) {
420
- case "skin":
421
- data.id = parseId(child.getAttribute("source"));
516
+ case 'skin':
517
+ // there is exactly one skin per controller
518
+ data.id = parseId(child.getAttribute('source'));
422
519
  data.skin = parseSkin(child);
423
520
  break;
424
- case "morph":
425
- data.id = parseId(child.getAttribute("source"));
426
- console.warn("THREE.ColladaLoader: Morph target animation not supported yet.");
521
+
522
+ case 'morph':
523
+ data.id = parseId(child.getAttribute('source'));
524
+ console.warn('THREE.ColladaLoader: Morph target animation not supported yet.');
427
525
  break;
428
526
  }
429
527
  }
430
- library.controllers[xml2.getAttribute("id")] = data;
528
+
529
+ library.controllers[xml.getAttribute('id')] = data;
431
530
  }
432
- function parseSkin(xml2) {
531
+
532
+ function parseSkin(xml) {
433
533
  const data = {
434
534
  sources: {}
435
535
  };
436
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
437
- const child = xml2.childNodes[i];
438
- if (child.nodeType !== 1)
439
- continue;
536
+
537
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
538
+ const child = xml.childNodes[i];
539
+ if (child.nodeType !== 1) continue;
540
+
440
541
  switch (child.nodeName) {
441
- case "bind_shape_matrix":
542
+ case 'bind_shape_matrix':
442
543
  data.bindShapeMatrix = parseFloats(child.textContent);
443
544
  break;
444
- case "source":
445
- const id = child.getAttribute("id");
545
+
546
+ case 'source':
547
+ const id = child.getAttribute('id');
446
548
  data.sources[id] = parseSource(child);
447
549
  break;
448
- case "joints":
550
+
551
+ case 'joints':
449
552
  data.joints = parseJoints(child);
450
553
  break;
451
- case "vertex_weights":
554
+
555
+ case 'vertex_weights':
452
556
  data.vertexWeights = parseVertexWeights(child);
453
557
  break;
454
558
  }
455
559
  }
560
+
456
561
  return data;
457
562
  }
458
- function parseJoints(xml2) {
563
+
564
+ function parseJoints(xml) {
459
565
  const data = {
460
566
  inputs: {}
461
567
  };
462
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
463
- const child = xml2.childNodes[i];
464
- if (child.nodeType !== 1)
465
- continue;
568
+
569
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
570
+ const child = xml.childNodes[i];
571
+ if (child.nodeType !== 1) continue;
572
+
466
573
  switch (child.nodeName) {
467
- case "input":
468
- const semantic = child.getAttribute("semantic");
469
- const id = parseId(child.getAttribute("source"));
574
+ case 'input':
575
+ const semantic = child.getAttribute('semantic');
576
+ const id = parseId(child.getAttribute('source'));
470
577
  data.inputs[semantic] = id;
471
578
  break;
472
579
  }
473
580
  }
581
+
474
582
  return data;
475
583
  }
476
- function parseVertexWeights(xml2) {
584
+
585
+ function parseVertexWeights(xml) {
477
586
  const data = {
478
587
  inputs: {}
479
588
  };
480
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
481
- const child = xml2.childNodes[i];
482
- if (child.nodeType !== 1)
483
- continue;
589
+
590
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
591
+ const child = xml.childNodes[i];
592
+ if (child.nodeType !== 1) continue;
593
+
484
594
  switch (child.nodeName) {
485
- case "input":
486
- const semantic = child.getAttribute("semantic");
487
- const id = parseId(child.getAttribute("source"));
488
- const offset = parseInt(child.getAttribute("offset"));
489
- data.inputs[semantic] = { id, offset };
595
+ case 'input':
596
+ const semantic = child.getAttribute('semantic');
597
+ const id = parseId(child.getAttribute('source'));
598
+ const offset = parseInt(child.getAttribute('offset'));
599
+ data.inputs[semantic] = {
600
+ id: id,
601
+ offset: offset
602
+ };
490
603
  break;
491
- case "vcount":
604
+
605
+ case 'vcount':
492
606
  data.vcount = parseInts(child.textContent);
493
607
  break;
494
- case "v":
608
+
609
+ case 'v':
495
610
  data.v = parseInts(child.textContent);
496
611
  break;
497
612
  }
498
613
  }
614
+
499
615
  return data;
500
616
  }
617
+
501
618
  function buildController(data) {
502
619
  const build = {
503
620
  id: data.id
504
621
  };
505
622
  const geometry = library.geometries[build.id];
506
- if (data.skin !== void 0) {
507
- build.skin = buildSkin(data.skin);
623
+
624
+ if (data.skin !== undefined) {
625
+ build.skin = buildSkin(data.skin); // we enhance the 'sources' property of the corresponding geometry with our skin data
626
+
508
627
  geometry.sources.skinIndices = build.skin.indices;
509
628
  geometry.sources.skinWeights = build.skin.weights;
510
629
  }
630
+
511
631
  return build;
512
632
  }
633
+
513
634
  function buildSkin(data) {
514
635
  const BONE_LIMIT = 4;
515
636
  const build = {
516
637
  joints: [],
638
+ // this must be an array to preserve the joint order
517
639
  indices: {
518
640
  array: [],
519
641
  stride: BONE_LIMIT
@@ -533,21 +655,33 @@ class ColladaLoader extends THREE.Loader {
533
655
  const inverseSource = data.sources[data.joints.inputs.INV_BIND_MATRIX];
534
656
  const weights = sources[vertexWeights.inputs.WEIGHT.id].array;
535
657
  let stride = 0;
536
- let i, j, l;
658
+ let i, j, l; // procces skin data for each vertex
659
+
537
660
  for (i = 0, l = vcount.length; i < l; i++) {
538
- const jointCount = vcount[i];
661
+ const jointCount = vcount[i]; // this is the amount of joints that affect a single vertex
662
+
539
663
  const vertexSkinData = [];
664
+
540
665
  for (j = 0; j < jointCount; j++) {
541
666
  const skinIndex = v[stride + jointOffset];
542
667
  const weightId = v[stride + weightOffset];
543
668
  const skinWeight = weights[weightId];
544
- vertexSkinData.push({ index: skinIndex, weight: skinWeight });
669
+ vertexSkinData.push({
670
+ index: skinIndex,
671
+ weight: skinWeight
672
+ });
545
673
  stride += 2;
546
- }
547
- vertexSkinData.sort(descending);
674
+ } // we sort the joints in descending order based on the weights.
675
+ // this ensures, we only procced the most important joints of the vertex
676
+
677
+
678
+ vertexSkinData.sort(descending); // now we provide for each vertex a set of four index and weight values.
679
+ // the order of the skin data matches the order of vertices
680
+
548
681
  for (j = 0; j < BONE_LIMIT; j++) {
549
682
  const d = vertexSkinData[j];
550
- if (d !== void 0) {
683
+
684
+ if (d !== undefined) {
551
685
  build.indices.array.push(d.index);
552
686
  build.weights.array.push(d.weight);
553
687
  } else {
@@ -555,377 +689,468 @@ class ColladaLoader extends THREE.Loader {
555
689
  build.weights.array.push(0);
556
690
  }
557
691
  }
558
- }
692
+ } // setup bind matrix
693
+
694
+
559
695
  if (data.bindShapeMatrix) {
560
- build.bindMatrix = new THREE.Matrix4().fromArray(data.bindShapeMatrix).transpose();
696
+ build.bindMatrix = new Matrix4().fromArray(data.bindShapeMatrix).transpose();
561
697
  } else {
562
- build.bindMatrix = new THREE.Matrix4().identity();
563
- }
698
+ build.bindMatrix = new Matrix4().identity();
699
+ } // process bones and inverse bind matrix data
700
+
701
+
564
702
  for (i = 0, l = jointSource.array.length; i < l; i++) {
565
703
  const name = jointSource.array[i];
566
- const boneInverse = new THREE.Matrix4().fromArray(inverseSource.array, i * inverseSource.stride).transpose();
567
- build.joints.push({ name, boneInverse });
704
+ const boneInverse = new Matrix4().fromArray(inverseSource.array, i * inverseSource.stride).transpose();
705
+ build.joints.push({
706
+ name: name,
707
+ boneInverse: boneInverse
708
+ });
568
709
  }
569
- return build;
710
+
711
+ return build; // array sort function
712
+
570
713
  function descending(a, b) {
571
714
  return b.weight - a.weight;
572
715
  }
573
716
  }
717
+
574
718
  function getController(id) {
575
719
  return getBuild(library.controllers[id], buildController);
576
- }
577
- function parseImage(xml2) {
720
+ } // image
721
+
722
+
723
+ function parseImage(xml) {
578
724
  const data = {
579
- init_from: getElementsByTagName(xml2, "init_from")[0].textContent
725
+ init_from: getElementsByTagName(xml, 'init_from')[0].textContent
580
726
  };
581
- library.images[xml2.getAttribute("id")] = data;
727
+ library.images[xml.getAttribute('id')] = data;
582
728
  }
729
+
583
730
  function buildImage(data) {
584
- if (data.build !== void 0)
585
- return data.build;
731
+ if (data.build !== undefined) return data.build;
586
732
  return data.init_from;
587
733
  }
734
+
588
735
  function getImage(id) {
589
736
  const data = library.images[id];
590
- if (data !== void 0) {
737
+
738
+ if (data !== undefined) {
591
739
  return getBuild(data, buildImage);
592
740
  }
741
+
593
742
  console.warn("THREE.ColladaLoader: Couldn't find image with ID:", id);
594
743
  return null;
595
- }
596
- function parseEffect(xml2) {
744
+ } // effect
745
+
746
+
747
+ function parseEffect(xml) {
597
748
  const data = {};
598
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
599
- const child = xml2.childNodes[i];
600
- if (child.nodeType !== 1)
601
- continue;
749
+
750
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
751
+ const child = xml.childNodes[i];
752
+ if (child.nodeType !== 1) continue;
753
+
602
754
  switch (child.nodeName) {
603
- case "profile_COMMON":
755
+ case 'profile_COMMON':
604
756
  data.profile = parseEffectProfileCOMMON(child);
605
757
  break;
606
758
  }
607
759
  }
608
- library.effects[xml2.getAttribute("id")] = data;
760
+
761
+ library.effects[xml.getAttribute('id')] = data;
609
762
  }
610
- function parseEffectProfileCOMMON(xml2) {
763
+
764
+ function parseEffectProfileCOMMON(xml) {
611
765
  const data = {
612
766
  surfaces: {},
613
767
  samplers: {}
614
768
  };
615
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
616
- const child = xml2.childNodes[i];
617
- if (child.nodeType !== 1)
618
- continue;
769
+
770
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
771
+ const child = xml.childNodes[i];
772
+ if (child.nodeType !== 1) continue;
773
+
619
774
  switch (child.nodeName) {
620
- case "newparam":
775
+ case 'newparam':
621
776
  parseEffectNewparam(child, data);
622
777
  break;
623
- case "technique":
778
+
779
+ case 'technique':
624
780
  data.technique = parseEffectTechnique(child);
625
781
  break;
626
- case "extra":
782
+
783
+ case 'extra':
627
784
  data.extra = parseEffectExtra(child);
628
785
  break;
629
786
  }
630
787
  }
788
+
631
789
  return data;
632
790
  }
633
- function parseEffectNewparam(xml2, data) {
634
- const sid = xml2.getAttribute("sid");
635
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
636
- const child = xml2.childNodes[i];
637
- if (child.nodeType !== 1)
638
- continue;
791
+
792
+ function parseEffectNewparam(xml, data) {
793
+ const sid = xml.getAttribute('sid');
794
+
795
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
796
+ const child = xml.childNodes[i];
797
+ if (child.nodeType !== 1) continue;
798
+
639
799
  switch (child.nodeName) {
640
- case "surface":
800
+ case 'surface':
641
801
  data.surfaces[sid] = parseEffectSurface(child);
642
802
  break;
643
- case "sampler2D":
803
+
804
+ case 'sampler2D':
644
805
  data.samplers[sid] = parseEffectSampler(child);
645
806
  break;
646
807
  }
647
808
  }
648
809
  }
649
- function parseEffectSurface(xml2) {
810
+
811
+ function parseEffectSurface(xml) {
650
812
  const data = {};
651
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
652
- const child = xml2.childNodes[i];
653
- if (child.nodeType !== 1)
654
- continue;
813
+
814
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
815
+ const child = xml.childNodes[i];
816
+ if (child.nodeType !== 1) continue;
817
+
655
818
  switch (child.nodeName) {
656
- case "init_from":
819
+ case 'init_from':
657
820
  data.init_from = child.textContent;
658
821
  break;
659
822
  }
660
823
  }
824
+
661
825
  return data;
662
826
  }
663
- function parseEffectSampler(xml2) {
827
+
828
+ function parseEffectSampler(xml) {
664
829
  const data = {};
665
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
666
- const child = xml2.childNodes[i];
667
- if (child.nodeType !== 1)
668
- continue;
830
+
831
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
832
+ const child = xml.childNodes[i];
833
+ if (child.nodeType !== 1) continue;
834
+
669
835
  switch (child.nodeName) {
670
- case "source":
836
+ case 'source':
671
837
  data.source = child.textContent;
672
838
  break;
673
839
  }
674
840
  }
841
+
675
842
  return data;
676
843
  }
677
- function parseEffectTechnique(xml2) {
844
+
845
+ function parseEffectTechnique(xml) {
678
846
  const data = {};
679
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
680
- const child = xml2.childNodes[i];
681
- if (child.nodeType !== 1)
682
- continue;
847
+
848
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
849
+ const child = xml.childNodes[i];
850
+ if (child.nodeType !== 1) continue;
851
+
683
852
  switch (child.nodeName) {
684
- case "constant":
685
- case "lambert":
686
- case "blinn":
687
- case "phong":
853
+ case 'constant':
854
+ case 'lambert':
855
+ case 'blinn':
856
+ case 'phong':
688
857
  data.type = child.nodeName;
689
858
  data.parameters = parseEffectParameters(child);
690
859
  break;
691
- case "extra":
860
+
861
+ case 'extra':
692
862
  data.extra = parseEffectExtra(child);
693
863
  break;
694
864
  }
695
865
  }
866
+
696
867
  return data;
697
868
  }
698
- function parseEffectParameters(xml2) {
869
+
870
+ function parseEffectParameters(xml) {
699
871
  const data = {};
700
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
701
- const child = xml2.childNodes[i];
702
- if (child.nodeType !== 1)
703
- continue;
872
+
873
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
874
+ const child = xml.childNodes[i];
875
+ if (child.nodeType !== 1) continue;
876
+
704
877
  switch (child.nodeName) {
705
- case "emission":
706
- case "diffuse":
707
- case "specular":
708
- case "bump":
709
- case "ambient":
710
- case "shininess":
711
- case "transparency":
878
+ case 'emission':
879
+ case 'diffuse':
880
+ case 'specular':
881
+ case 'bump':
882
+ case 'ambient':
883
+ case 'shininess':
884
+ case 'transparency':
712
885
  data[child.nodeName] = parseEffectParameter(child);
713
886
  break;
714
- case "transparent":
887
+
888
+ case 'transparent':
715
889
  data[child.nodeName] = {
716
- opaque: child.hasAttribute("opaque") ? child.getAttribute("opaque") : "A_ONE",
890
+ opaque: child.hasAttribute('opaque') ? child.getAttribute('opaque') : 'A_ONE',
717
891
  data: parseEffectParameter(child)
718
892
  };
719
893
  break;
720
894
  }
721
895
  }
896
+
722
897
  return data;
723
898
  }
724
- function parseEffectParameter(xml2) {
899
+
900
+ function parseEffectParameter(xml) {
725
901
  const data = {};
726
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
727
- const child = xml2.childNodes[i];
728
- if (child.nodeType !== 1)
729
- continue;
902
+
903
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
904
+ const child = xml.childNodes[i];
905
+ if (child.nodeType !== 1) continue;
906
+
730
907
  switch (child.nodeName) {
731
- case "color":
908
+ case 'color':
732
909
  data[child.nodeName] = parseFloats(child.textContent);
733
910
  break;
734
- case "float":
911
+
912
+ case 'float':
735
913
  data[child.nodeName] = parseFloat(child.textContent);
736
914
  break;
737
- case "texture":
738
- data[child.nodeName] = { id: child.getAttribute("texture"), extra: parseEffectParameterTexture(child) };
915
+
916
+ case 'texture':
917
+ data[child.nodeName] = {
918
+ id: child.getAttribute('texture'),
919
+ extra: parseEffectParameterTexture(child)
920
+ };
739
921
  break;
740
922
  }
741
923
  }
924
+
742
925
  return data;
743
926
  }
744
- function parseEffectParameterTexture(xml2) {
927
+
928
+ function parseEffectParameterTexture(xml) {
745
929
  const data = {
746
930
  technique: {}
747
931
  };
748
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
749
- const child = xml2.childNodes[i];
750
- if (child.nodeType !== 1)
751
- continue;
932
+
933
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
934
+ const child = xml.childNodes[i];
935
+ if (child.nodeType !== 1) continue;
936
+
752
937
  switch (child.nodeName) {
753
- case "extra":
938
+ case 'extra':
754
939
  parseEffectParameterTextureExtra(child, data);
755
940
  break;
756
941
  }
757
942
  }
943
+
758
944
  return data;
759
945
  }
760
- function parseEffectParameterTextureExtra(xml2, data) {
761
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
762
- const child = xml2.childNodes[i];
763
- if (child.nodeType !== 1)
764
- continue;
946
+
947
+ function parseEffectParameterTextureExtra(xml, data) {
948
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
949
+ const child = xml.childNodes[i];
950
+ if (child.nodeType !== 1) continue;
951
+
765
952
  switch (child.nodeName) {
766
- case "technique":
953
+ case 'technique':
767
954
  parseEffectParameterTextureExtraTechnique(child, data);
768
955
  break;
769
956
  }
770
957
  }
771
958
  }
772
- function parseEffectParameterTextureExtraTechnique(xml2, data) {
773
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
774
- const child = xml2.childNodes[i];
775
- if (child.nodeType !== 1)
776
- continue;
959
+
960
+ function parseEffectParameterTextureExtraTechnique(xml, data) {
961
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
962
+ const child = xml.childNodes[i];
963
+ if (child.nodeType !== 1) continue;
964
+
777
965
  switch (child.nodeName) {
778
- case "repeatU":
779
- case "repeatV":
780
- case "offsetU":
781
- case "offsetV":
966
+ case 'repeatU':
967
+ case 'repeatV':
968
+ case 'offsetU':
969
+ case 'offsetV':
782
970
  data.technique[child.nodeName] = parseFloat(child.textContent);
783
971
  break;
784
- case "wrapU":
785
- case "wrapV":
786
- if (child.textContent.toUpperCase() === "TRUE") {
972
+
973
+ case 'wrapU':
974
+ case 'wrapV':
975
+ // some files have values for wrapU/wrapV which become NaN via parseInt
976
+ if (child.textContent.toUpperCase() === 'TRUE') {
787
977
  data.technique[child.nodeName] = 1;
788
- } else if (child.textContent.toUpperCase() === "FALSE") {
978
+ } else if (child.textContent.toUpperCase() === 'FALSE') {
789
979
  data.technique[child.nodeName] = 0;
790
980
  } else {
791
981
  data.technique[child.nodeName] = parseInt(child.textContent);
792
982
  }
983
+
793
984
  break;
794
- case "bump":
985
+
986
+ case 'bump':
795
987
  data[child.nodeName] = parseEffectExtraTechniqueBump(child);
796
988
  break;
797
989
  }
798
990
  }
799
991
  }
800
- function parseEffectExtra(xml2) {
992
+
993
+ function parseEffectExtra(xml) {
801
994
  const data = {};
802
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
803
- const child = xml2.childNodes[i];
804
- if (child.nodeType !== 1)
805
- continue;
995
+
996
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
997
+ const child = xml.childNodes[i];
998
+ if (child.nodeType !== 1) continue;
999
+
806
1000
  switch (child.nodeName) {
807
- case "technique":
1001
+ case 'technique':
808
1002
  data.technique = parseEffectExtraTechnique(child);
809
1003
  break;
810
1004
  }
811
1005
  }
1006
+
812
1007
  return data;
813
1008
  }
814
- function parseEffectExtraTechnique(xml2) {
1009
+
1010
+ function parseEffectExtraTechnique(xml) {
815
1011
  const data = {};
816
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
817
- const child = xml2.childNodes[i];
818
- if (child.nodeType !== 1)
819
- continue;
1012
+
1013
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
1014
+ const child = xml.childNodes[i];
1015
+ if (child.nodeType !== 1) continue;
1016
+
820
1017
  switch (child.nodeName) {
821
- case "double_sided":
1018
+ case 'double_sided':
822
1019
  data[child.nodeName] = parseInt(child.textContent);
823
1020
  break;
824
- case "bump":
1021
+
1022
+ case 'bump':
825
1023
  data[child.nodeName] = parseEffectExtraTechniqueBump(child);
826
1024
  break;
827
1025
  }
828
1026
  }
1027
+
829
1028
  return data;
830
1029
  }
831
- function parseEffectExtraTechniqueBump(xml2) {
1030
+
1031
+ function parseEffectExtraTechniqueBump(xml) {
832
1032
  var data = {};
833
- for (var i = 0, l = xml2.childNodes.length; i < l; i++) {
834
- var child = xml2.childNodes[i];
835
- if (child.nodeType !== 1)
836
- continue;
1033
+
1034
+ for (var i = 0, l = xml.childNodes.length; i < l; i++) {
1035
+ var child = xml.childNodes[i];
1036
+ if (child.nodeType !== 1) continue;
1037
+
837
1038
  switch (child.nodeName) {
838
- case "texture":
1039
+ case 'texture':
839
1040
  data[child.nodeName] = {
840
- id: child.getAttribute("texture"),
841
- texcoord: child.getAttribute("texcoord"),
1041
+ id: child.getAttribute('texture'),
1042
+ texcoord: child.getAttribute('texcoord'),
842
1043
  extra: parseEffectParameterTexture(child)
843
1044
  };
844
1045
  break;
845
1046
  }
846
1047
  }
1048
+
847
1049
  return data;
848
1050
  }
1051
+
849
1052
  function buildEffect(data) {
850
1053
  return data;
851
1054
  }
1055
+
852
1056
  function getEffect(id) {
853
1057
  return getBuild(library.effects[id], buildEffect);
854
- }
855
- function parseMaterial(xml2) {
1058
+ } // material
1059
+
1060
+
1061
+ function parseMaterial(xml) {
856
1062
  const data = {
857
- name: xml2.getAttribute("name")
1063
+ name: xml.getAttribute('name')
858
1064
  };
859
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
860
- const child = xml2.childNodes[i];
861
- if (child.nodeType !== 1)
862
- continue;
1065
+
1066
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
1067
+ const child = xml.childNodes[i];
1068
+ if (child.nodeType !== 1) continue;
1069
+
863
1070
  switch (child.nodeName) {
864
- case "instance_effect":
865
- data.url = parseId(child.getAttribute("url"));
1071
+ case 'instance_effect':
1072
+ data.url = parseId(child.getAttribute('url'));
866
1073
  break;
867
1074
  }
868
1075
  }
869
- library.materials[xml2.getAttribute("id")] = data;
1076
+
1077
+ library.materials[xml.getAttribute('id')] = data;
870
1078
  }
1079
+
871
1080
  function getTextureLoader(image) {
872
1081
  let loader;
873
- let extension = image.slice((image.lastIndexOf(".") - 1 >>> 0) + 2);
1082
+ let extension = image.slice((image.lastIndexOf('.') - 1 >>> 0) + 2); // http://www.jstips.co/en/javascript/get-file-extension/
1083
+
874
1084
  extension = extension.toLowerCase();
1085
+
875
1086
  switch (extension) {
876
- case "tga":
1087
+ case 'tga':
877
1088
  loader = tgaLoader;
878
1089
  break;
1090
+
879
1091
  default:
880
1092
  loader = textureLoader;
881
1093
  }
1094
+
882
1095
  return loader;
883
1096
  }
1097
+
884
1098
  function buildMaterial(data) {
885
1099
  const effect = getEffect(data.url);
886
1100
  const technique = effect.profile.technique;
887
1101
  let material;
1102
+
888
1103
  switch (technique.type) {
889
- case "phong":
890
- case "blinn":
891
- material = new THREE.MeshPhongMaterial();
1104
+ case 'phong':
1105
+ case 'blinn':
1106
+ material = new MeshPhongMaterial();
892
1107
  break;
893
- case "lambert":
894
- material = new THREE.MeshLambertMaterial();
1108
+
1109
+ case 'lambert':
1110
+ material = new MeshLambertMaterial();
895
1111
  break;
1112
+
896
1113
  default:
897
- material = new THREE.MeshBasicMaterial();
1114
+ material = new MeshBasicMaterial();
898
1115
  break;
899
1116
  }
900
- material.name = data.name || "";
1117
+
1118
+ material.name = data.name || '';
1119
+
901
1120
  function getTexture(textureObject) {
902
1121
  const sampler = effect.profile.samplers[textureObject.id];
903
- let image = null;
904
- if (sampler !== void 0) {
1122
+ let image = null; // get image
1123
+
1124
+ if (sampler !== undefined) {
905
1125
  const surface = effect.profile.surfaces[sampler.source];
906
1126
  image = getImage(surface.init_from);
907
1127
  } else {
908
- console.warn("THREE.ColladaLoader: Undefined sampler. Access image directly (see #12530).");
1128
+ console.warn('THREE.ColladaLoader: Undefined sampler. Access image directly (see #12530).');
909
1129
  image = getImage(textureObject.id);
910
- }
1130
+ } // create texture if image is avaiable
1131
+
1132
+
911
1133
  if (image !== null) {
912
1134
  const loader = getTextureLoader(image);
913
- if (loader !== void 0) {
1135
+
1136
+ if (loader !== undefined) {
914
1137
  const texture = loader.load(image);
915
1138
  const extra = textureObject.extra;
916
- if (extra !== void 0 && extra.technique !== void 0 && isEmpty(extra.technique) === false) {
917
- const technique2 = extra.technique;
918
- texture.wrapS = technique2.wrapU ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;
919
- texture.wrapT = technique2.wrapV ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;
920
- texture.offset.set(technique2.offsetU || 0, technique2.offsetV || 0);
921
- texture.repeat.set(technique2.repeatU || 1, technique2.repeatV || 1);
1139
+
1140
+ if (extra !== undefined && extra.technique !== undefined && isEmpty(extra.technique) === false) {
1141
+ const technique = extra.technique;
1142
+ texture.wrapS = technique.wrapU ? RepeatWrapping : ClampToEdgeWrapping;
1143
+ texture.wrapT = technique.wrapV ? RepeatWrapping : ClampToEdgeWrapping;
1144
+ texture.offset.set(technique.offsetU || 0, technique.offsetV || 0);
1145
+ texture.repeat.set(technique.repeatU || 1, technique.repeatV || 1);
922
1146
  } else {
923
- texture.wrapS = THREE.RepeatWrapping;
924
- texture.wrapT = THREE.RepeatWrapping;
1147
+ texture.wrapS = RepeatWrapping;
1148
+ texture.wrapT = RepeatWrapping;
925
1149
  }
1150
+
926
1151
  return texture;
927
1152
  } else {
928
- console.warn("THREE.ColladaLoader: Loader for texture %s not found.", image);
1153
+ console.warn('THREE.ColladaLoader: Loader for texture %s not found.', image);
929
1154
  return null;
930
1155
  }
931
1156
  } else {
@@ -933,582 +1158,737 @@ class ColladaLoader extends THREE.Loader {
933
1158
  return null;
934
1159
  }
935
1160
  }
1161
+
936
1162
  const parameters = technique.parameters;
1163
+
937
1164
  for (const key in parameters) {
938
1165
  const parameter = parameters[key];
1166
+
939
1167
  switch (key) {
940
- case "diffuse":
941
- if (parameter.color)
942
- material.color.fromArray(parameter.color);
943
- if (parameter.texture)
944
- material.map = getTexture(parameter.texture);
945
- break;
946
- case "specular":
947
- if (parameter.color && material.specular)
948
- material.specular.fromArray(parameter.color);
949
- if (parameter.texture)
950
- material.specularMap = getTexture(parameter.texture);
951
- break;
952
- case "bump":
953
- if (parameter.texture)
954
- material.normalMap = getTexture(parameter.texture);
955
- break;
956
- case "ambient":
957
- if (parameter.texture)
958
- material.lightMap = getTexture(parameter.texture);
959
- break;
960
- case "shininess":
961
- if (parameter.float && material.shininess)
962
- material.shininess = parameter.float;
963
- break;
964
- case "emission":
965
- if (parameter.color && material.emissive)
966
- material.emissive.fromArray(parameter.color);
967
- if (parameter.texture)
968
- material.emissiveMap = getTexture(parameter.texture);
969
- break;
970
- }
971
- }
972
- let transparent = parameters["transparent"];
973
- let transparency = parameters["transparency"];
974
- if (transparency === void 0 && transparent) {
1168
+ case 'diffuse':
1169
+ if (parameter.color) material.color.fromArray(parameter.color);
1170
+ if (parameter.texture) material.map = getTexture(parameter.texture);
1171
+ break;
1172
+
1173
+ case 'specular':
1174
+ if (parameter.color && material.specular) material.specular.fromArray(parameter.color);
1175
+ if (parameter.texture) material.specularMap = getTexture(parameter.texture);
1176
+ break;
1177
+
1178
+ case 'bump':
1179
+ if (parameter.texture) material.normalMap = getTexture(parameter.texture);
1180
+ break;
1181
+
1182
+ case 'ambient':
1183
+ if (parameter.texture) material.lightMap = getTexture(parameter.texture);
1184
+ break;
1185
+
1186
+ case 'shininess':
1187
+ if (parameter.float && material.shininess) material.shininess = parameter.float;
1188
+ break;
1189
+
1190
+ case 'emission':
1191
+ if (parameter.color && material.emissive) material.emissive.fromArray(parameter.color);
1192
+ if (parameter.texture) material.emissiveMap = getTexture(parameter.texture);
1193
+ break;
1194
+ }
1195
+ } //
1196
+
1197
+
1198
+ let transparent = parameters['transparent'];
1199
+ let transparency = parameters['transparency']; // <transparency> does not exist but <transparent>
1200
+
1201
+ if (transparency === undefined && transparent) {
975
1202
  transparency = {
976
1203
  float: 1
977
1204
  };
978
- }
979
- if (transparent === void 0 && transparency) {
1205
+ } // <transparent> does not exist but <transparency>
1206
+
1207
+
1208
+ if (transparent === undefined && transparency) {
980
1209
  transparent = {
981
- opaque: "A_ONE",
1210
+ opaque: 'A_ONE',
982
1211
  data: {
983
1212
  color: [1, 1, 1, 1]
984
1213
  }
985
1214
  };
986
1215
  }
1216
+
987
1217
  if (transparent && transparency) {
1218
+ // handle case if a texture exists but no color
988
1219
  if (transparent.data.texture) {
1220
+ // we do not set an alpha map (see #13792)
989
1221
  material.transparent = true;
990
1222
  } else {
991
1223
  const color = transparent.data.color;
1224
+
992
1225
  switch (transparent.opaque) {
993
- case "A_ONE":
1226
+ case 'A_ONE':
994
1227
  material.opacity = color[3] * transparency.float;
995
1228
  break;
996
- case "RGB_ZERO":
1229
+
1230
+ case 'RGB_ZERO':
997
1231
  material.opacity = 1 - color[0] * transparency.float;
998
1232
  break;
999
- case "A_ZERO":
1233
+
1234
+ case 'A_ZERO':
1000
1235
  material.opacity = 1 - color[3] * transparency.float;
1001
1236
  break;
1002
- case "RGB_ONE":
1237
+
1238
+ case 'RGB_ONE':
1003
1239
  material.opacity = color[0] * transparency.float;
1004
1240
  break;
1241
+
1005
1242
  default:
1006
1243
  console.warn('THREE.ColladaLoader: Invalid opaque type "%s" of transparent tag.', transparent.opaque);
1007
1244
  }
1008
- if (material.opacity < 1)
1009
- material.transparent = true;
1245
+
1246
+ if (material.opacity < 1) material.transparent = true;
1010
1247
  }
1011
- }
1012
- if (technique.extra !== void 0 && technique.extra.technique !== void 0) {
1248
+ } //
1249
+
1250
+
1251
+ if (technique.extra !== undefined && technique.extra.technique !== undefined) {
1013
1252
  const techniques = technique.extra.technique;
1253
+
1014
1254
  for (const k in techniques) {
1015
1255
  const v = techniques[k];
1256
+
1016
1257
  switch (k) {
1017
- case "double_sided":
1018
- material.side = v === 1 ? THREE.DoubleSide : THREE.FrontSide;
1258
+ case 'double_sided':
1259
+ material.side = v === 1 ? DoubleSide : FrontSide;
1019
1260
  break;
1020
- case "bump":
1261
+
1262
+ case 'bump':
1021
1263
  material.normalMap = getTexture(v.texture);
1022
- material.normalScale = new THREE.Vector2(1, 1);
1264
+ material.normalScale = new Vector2(1, 1);
1023
1265
  break;
1024
1266
  }
1025
1267
  }
1026
1268
  }
1269
+
1027
1270
  return material;
1028
1271
  }
1272
+
1029
1273
  function getMaterial(id) {
1030
1274
  return getBuild(library.materials[id], buildMaterial);
1031
- }
1032
- function parseCamera(xml2) {
1275
+ } // camera
1276
+
1277
+
1278
+ function parseCamera(xml) {
1033
1279
  const data = {
1034
- name: xml2.getAttribute("name")
1280
+ name: xml.getAttribute('name')
1035
1281
  };
1036
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
1037
- const child = xml2.childNodes[i];
1038
- if (child.nodeType !== 1)
1039
- continue;
1282
+
1283
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
1284
+ const child = xml.childNodes[i];
1285
+ if (child.nodeType !== 1) continue;
1286
+
1040
1287
  switch (child.nodeName) {
1041
- case "optics":
1288
+ case 'optics':
1042
1289
  data.optics = parseCameraOptics(child);
1043
1290
  break;
1044
1291
  }
1045
1292
  }
1046
- library.cameras[xml2.getAttribute("id")] = data;
1293
+
1294
+ library.cameras[xml.getAttribute('id')] = data;
1047
1295
  }
1048
- function parseCameraOptics(xml2) {
1049
- for (let i = 0; i < xml2.childNodes.length; i++) {
1050
- const child = xml2.childNodes[i];
1296
+
1297
+ function parseCameraOptics(xml) {
1298
+ for (let i = 0; i < xml.childNodes.length; i++) {
1299
+ const child = xml.childNodes[i];
1300
+
1051
1301
  switch (child.nodeName) {
1052
- case "technique_common":
1302
+ case 'technique_common':
1053
1303
  return parseCameraTechnique(child);
1054
1304
  }
1055
1305
  }
1306
+
1056
1307
  return {};
1057
1308
  }
1058
- function parseCameraTechnique(xml2) {
1309
+
1310
+ function parseCameraTechnique(xml) {
1059
1311
  const data = {};
1060
- for (let i = 0; i < xml2.childNodes.length; i++) {
1061
- const child = xml2.childNodes[i];
1312
+
1313
+ for (let i = 0; i < xml.childNodes.length; i++) {
1314
+ const child = xml.childNodes[i];
1315
+
1062
1316
  switch (child.nodeName) {
1063
- case "perspective":
1064
- case "orthographic":
1317
+ case 'perspective':
1318
+ case 'orthographic':
1065
1319
  data.technique = child.nodeName;
1066
1320
  data.parameters = parseCameraParameters(child);
1067
1321
  break;
1068
1322
  }
1069
1323
  }
1324
+
1070
1325
  return data;
1071
1326
  }
1072
- function parseCameraParameters(xml2) {
1327
+
1328
+ function parseCameraParameters(xml) {
1073
1329
  const data = {};
1074
- for (let i = 0; i < xml2.childNodes.length; i++) {
1075
- const child = xml2.childNodes[i];
1330
+
1331
+ for (let i = 0; i < xml.childNodes.length; i++) {
1332
+ const child = xml.childNodes[i];
1333
+
1076
1334
  switch (child.nodeName) {
1077
- case "xfov":
1078
- case "yfov":
1079
- case "xmag":
1080
- case "ymag":
1081
- case "znear":
1082
- case "zfar":
1083
- case "aspect_ratio":
1335
+ case 'xfov':
1336
+ case 'yfov':
1337
+ case 'xmag':
1338
+ case 'ymag':
1339
+ case 'znear':
1340
+ case 'zfar':
1341
+ case 'aspect_ratio':
1084
1342
  data[child.nodeName] = parseFloat(child.textContent);
1085
1343
  break;
1086
1344
  }
1087
1345
  }
1346
+
1088
1347
  return data;
1089
1348
  }
1349
+
1090
1350
  function buildCamera(data) {
1091
1351
  let camera;
1352
+
1092
1353
  switch (data.optics.technique) {
1093
- case "perspective":
1094
- camera = new THREE.PerspectiveCamera(
1095
- data.optics.parameters.yfov,
1096
- data.optics.parameters.aspect_ratio,
1097
- data.optics.parameters.znear,
1098
- data.optics.parameters.zfar
1099
- );
1354
+ case 'perspective':
1355
+ camera = new PerspectiveCamera(data.optics.parameters.yfov, data.optics.parameters.aspect_ratio, data.optics.parameters.znear, data.optics.parameters.zfar);
1100
1356
  break;
1101
- case "orthographic":
1357
+
1358
+ case 'orthographic':
1102
1359
  let ymag = data.optics.parameters.ymag;
1103
1360
  let xmag = data.optics.parameters.xmag;
1104
1361
  const aspectRatio = data.optics.parameters.aspect_ratio;
1105
- xmag = xmag === void 0 ? ymag * aspectRatio : xmag;
1106
- ymag = ymag === void 0 ? xmag / aspectRatio : ymag;
1362
+ xmag = xmag === undefined ? ymag * aspectRatio : xmag;
1363
+ ymag = ymag === undefined ? xmag / aspectRatio : ymag;
1107
1364
  xmag *= 0.5;
1108
1365
  ymag *= 0.5;
1109
- camera = new THREE.OrthographicCamera(
1110
- -xmag,
1111
- xmag,
1112
- ymag,
1113
- -ymag,
1114
- data.optics.parameters.znear,
1115
- data.optics.parameters.zfar
1116
- );
1366
+ camera = new OrthographicCamera(-xmag, xmag, ymag, -ymag, // left, right, top, bottom
1367
+ data.optics.parameters.znear, data.optics.parameters.zfar);
1117
1368
  break;
1369
+
1118
1370
  default:
1119
- camera = new THREE.PerspectiveCamera();
1371
+ camera = new PerspectiveCamera();
1120
1372
  break;
1121
1373
  }
1122
- camera.name = data.name || "";
1374
+
1375
+ camera.name = data.name || '';
1123
1376
  return camera;
1124
1377
  }
1378
+
1125
1379
  function getCamera(id) {
1126
1380
  const data = library.cameras[id];
1127
- if (data !== void 0) {
1381
+
1382
+ if (data !== undefined) {
1128
1383
  return getBuild(data, buildCamera);
1129
1384
  }
1385
+
1130
1386
  console.warn("THREE.ColladaLoader: Couldn't find camera with ID:", id);
1131
1387
  return null;
1132
- }
1133
- function parseLight(xml2) {
1388
+ } // light
1389
+
1390
+
1391
+ function parseLight(xml) {
1134
1392
  let data = {};
1135
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
1136
- const child = xml2.childNodes[i];
1137
- if (child.nodeType !== 1)
1138
- continue;
1393
+
1394
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
1395
+ const child = xml.childNodes[i];
1396
+ if (child.nodeType !== 1) continue;
1397
+
1139
1398
  switch (child.nodeName) {
1140
- case "technique_common":
1399
+ case 'technique_common':
1141
1400
  data = parseLightTechnique(child);
1142
1401
  break;
1143
1402
  }
1144
1403
  }
1145
- library.lights[xml2.getAttribute("id")] = data;
1404
+
1405
+ library.lights[xml.getAttribute('id')] = data;
1146
1406
  }
1147
- function parseLightTechnique(xml2) {
1407
+
1408
+ function parseLightTechnique(xml) {
1148
1409
  const data = {};
1149
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
1150
- const child = xml2.childNodes[i];
1151
- if (child.nodeType !== 1)
1152
- continue;
1410
+
1411
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
1412
+ const child = xml.childNodes[i];
1413
+ if (child.nodeType !== 1) continue;
1414
+
1153
1415
  switch (child.nodeName) {
1154
- case "directional":
1155
- case "point":
1156
- case "spot":
1157
- case "ambient":
1416
+ case 'directional':
1417
+ case 'point':
1418
+ case 'spot':
1419
+ case 'ambient':
1158
1420
  data.technique = child.nodeName;
1159
1421
  data.parameters = parseLightParameters(child);
1160
1422
  }
1161
1423
  }
1424
+
1162
1425
  return data;
1163
1426
  }
1164
- function parseLightParameters(xml2) {
1427
+
1428
+ function parseLightParameters(xml) {
1165
1429
  const data = {};
1166
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
1167
- const child = xml2.childNodes[i];
1168
- if (child.nodeType !== 1)
1169
- continue;
1430
+
1431
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
1432
+ const child = xml.childNodes[i];
1433
+ if (child.nodeType !== 1) continue;
1434
+
1170
1435
  switch (child.nodeName) {
1171
- case "color":
1436
+ case 'color':
1172
1437
  const array = parseFloats(child.textContent);
1173
- data.color = new THREE.Color().fromArray(array);
1438
+ data.color = new Color().fromArray(array);
1174
1439
  break;
1175
- case "falloff_angle":
1440
+
1441
+ case 'falloff_angle':
1176
1442
  data.falloffAngle = parseFloat(child.textContent);
1177
1443
  break;
1178
- case "quadratic_attenuation":
1444
+
1445
+ case 'quadratic_attenuation':
1179
1446
  const f = parseFloat(child.textContent);
1180
1447
  data.distance = f ? Math.sqrt(1 / f) : 0;
1181
1448
  break;
1182
1449
  }
1183
1450
  }
1451
+
1184
1452
  return data;
1185
1453
  }
1454
+
1186
1455
  function buildLight(data) {
1187
1456
  let light;
1457
+
1188
1458
  switch (data.technique) {
1189
- case "directional":
1190
- light = new THREE.DirectionalLight();
1459
+ case 'directional':
1460
+ light = new DirectionalLight();
1191
1461
  break;
1192
- case "point":
1193
- light = new THREE.PointLight();
1462
+
1463
+ case 'point':
1464
+ light = new PointLight();
1194
1465
  break;
1195
- case "spot":
1196
- light = new THREE.SpotLight();
1466
+
1467
+ case 'spot':
1468
+ light = new SpotLight();
1197
1469
  break;
1198
- case "ambient":
1199
- light = new THREE.AmbientLight();
1470
+
1471
+ case 'ambient':
1472
+ light = new AmbientLight();
1200
1473
  break;
1201
1474
  }
1202
- if (data.parameters.color)
1203
- light.color.copy(data.parameters.color);
1204
- if (data.parameters.distance)
1205
- light.distance = data.parameters.distance;
1475
+
1476
+ if (data.parameters.color) light.color.copy(data.parameters.color);
1477
+ if (data.parameters.distance) light.distance = data.parameters.distance;
1206
1478
  return light;
1207
1479
  }
1480
+
1208
1481
  function getLight(id) {
1209
1482
  const data = library.lights[id];
1210
- if (data !== void 0) {
1483
+
1484
+ if (data !== undefined) {
1211
1485
  return getBuild(data, buildLight);
1212
1486
  }
1487
+
1213
1488
  console.warn("THREE.ColladaLoader: Couldn't find light with ID:", id);
1214
1489
  return null;
1215
- }
1216
- function parseGeometry(xml2) {
1490
+ } // geometry
1491
+
1492
+
1493
+ function parseGeometry(xml) {
1217
1494
  const data = {
1218
- name: xml2.getAttribute("name"),
1495
+ name: xml.getAttribute('name'),
1219
1496
  sources: {},
1220
1497
  vertices: {},
1221
1498
  primitives: []
1222
1499
  };
1223
- const mesh = getElementsByTagName(xml2, "mesh")[0];
1224
- if (mesh === void 0)
1225
- return;
1500
+ const mesh = getElementsByTagName(xml, 'mesh')[0]; // the following tags inside geometry are not supported yet (see https://github.com/mrdoob/three.js/pull/12606): convex_mesh, spline, brep
1501
+
1502
+ if (mesh === undefined) return;
1503
+
1226
1504
  for (let i = 0; i < mesh.childNodes.length; i++) {
1227
1505
  const child = mesh.childNodes[i];
1228
- if (child.nodeType !== 1)
1229
- continue;
1230
- const id = child.getAttribute("id");
1506
+ if (child.nodeType !== 1) continue;
1507
+ const id = child.getAttribute('id');
1508
+
1231
1509
  switch (child.nodeName) {
1232
- case "source":
1510
+ case 'source':
1233
1511
  data.sources[id] = parseSource(child);
1234
1512
  break;
1235
- case "vertices":
1513
+
1514
+ case 'vertices':
1515
+ // data.sources[ id ] = data.sources[ parseId( getElementsByTagName( child, 'input' )[ 0 ].getAttribute( 'source' ) ) ];
1236
1516
  data.vertices = parseGeometryVertices(child);
1237
1517
  break;
1238
- case "polygons":
1239
- console.warn("THREE.ColladaLoader: Unsupported primitive type: ", child.nodeName);
1518
+
1519
+ case 'polygons':
1520
+ console.warn('THREE.ColladaLoader: Unsupported primitive type: ', child.nodeName);
1240
1521
  break;
1241
- case "lines":
1242
- case "linestrips":
1243
- case "polylist":
1244
- case "triangles":
1522
+
1523
+ case 'lines':
1524
+ case 'linestrips':
1525
+ case 'polylist':
1526
+ case 'triangles':
1245
1527
  data.primitives.push(parseGeometryPrimitive(child));
1246
1528
  break;
1529
+
1247
1530
  default:
1248
1531
  console.log(child);
1249
1532
  }
1250
1533
  }
1251
- library.geometries[xml2.getAttribute("id")] = data;
1534
+
1535
+ library.geometries[xml.getAttribute('id')] = data;
1252
1536
  }
1253
- function parseSource(xml2) {
1537
+
1538
+ function parseSource(xml) {
1254
1539
  const data = {
1255
1540
  array: [],
1256
1541
  stride: 3
1257
1542
  };
1258
- for (let i = 0; i < xml2.childNodes.length; i++) {
1259
- const child = xml2.childNodes[i];
1260
- if (child.nodeType !== 1)
1261
- continue;
1543
+
1544
+ for (let i = 0; i < xml.childNodes.length; i++) {
1545
+ const child = xml.childNodes[i];
1546
+ if (child.nodeType !== 1) continue;
1547
+
1262
1548
  switch (child.nodeName) {
1263
- case "float_array":
1549
+ case 'float_array':
1264
1550
  data.array = parseFloats(child.textContent);
1265
1551
  break;
1266
- case "Name_array":
1552
+
1553
+ case 'Name_array':
1267
1554
  data.array = parseStrings(child.textContent);
1268
1555
  break;
1269
- case "technique_common":
1270
- const accessor = getElementsByTagName(child, "accessor")[0];
1271
- if (accessor !== void 0) {
1272
- data.stride = parseInt(accessor.getAttribute("stride"));
1556
+
1557
+ case 'technique_common':
1558
+ const accessor = getElementsByTagName(child, 'accessor')[0];
1559
+
1560
+ if (accessor !== undefined) {
1561
+ data.stride = parseInt(accessor.getAttribute('stride'));
1273
1562
  }
1563
+
1274
1564
  break;
1275
1565
  }
1276
1566
  }
1567
+
1277
1568
  return data;
1278
1569
  }
1279
- function parseGeometryVertices(xml2) {
1570
+
1571
+ function parseGeometryVertices(xml) {
1280
1572
  const data = {};
1281
- for (let i = 0; i < xml2.childNodes.length; i++) {
1282
- const child = xml2.childNodes[i];
1283
- if (child.nodeType !== 1)
1284
- continue;
1285
- data[child.getAttribute("semantic")] = parseId(child.getAttribute("source"));
1573
+
1574
+ for (let i = 0; i < xml.childNodes.length; i++) {
1575
+ const child = xml.childNodes[i];
1576
+ if (child.nodeType !== 1) continue;
1577
+ data[child.getAttribute('semantic')] = parseId(child.getAttribute('source'));
1286
1578
  }
1579
+
1287
1580
  return data;
1288
1581
  }
1289
- function parseGeometryPrimitive(xml2) {
1582
+
1583
+ function parseGeometryPrimitive(xml) {
1290
1584
  const primitive = {
1291
- type: xml2.nodeName,
1292
- material: xml2.getAttribute("material"),
1293
- count: parseInt(xml2.getAttribute("count")),
1585
+ type: xml.nodeName,
1586
+ material: xml.getAttribute('material'),
1587
+ count: parseInt(xml.getAttribute('count')),
1294
1588
  inputs: {},
1295
1589
  stride: 0,
1296
1590
  hasUV: false
1297
1591
  };
1298
- for (let i = 0, l = xml2.childNodes.length; i < l; i++) {
1299
- const child = xml2.childNodes[i];
1300
- if (child.nodeType !== 1)
1301
- continue;
1592
+
1593
+ for (let i = 0, l = xml.childNodes.length; i < l; i++) {
1594
+ const child = xml.childNodes[i];
1595
+ if (child.nodeType !== 1) continue;
1596
+
1302
1597
  switch (child.nodeName) {
1303
- case "input":
1304
- const id = parseId(child.getAttribute("source"));
1305
- const semantic = child.getAttribute("semantic");
1306
- const offset = parseInt(child.getAttribute("offset"));
1307
- const set = parseInt(child.getAttribute("set"));
1598
+ case 'input':
1599
+ const id = parseId(child.getAttribute('source'));
1600
+ const semantic = child.getAttribute('semantic');
1601
+ const offset = parseInt(child.getAttribute('offset'));
1602
+ const set = parseInt(child.getAttribute('set'));
1308
1603
  const inputname = set > 0 ? semantic + set : semantic;
1309
- primitive.inputs[inputname] = { id, offset };
1604
+ primitive.inputs[inputname] = {
1605
+ id: id,
1606
+ offset: offset
1607
+ };
1310
1608
  primitive.stride = Math.max(primitive.stride, offset + 1);
1311
- if (semantic === "TEXCOORD")
1312
- primitive.hasUV = true;
1609
+ if (semantic === 'TEXCOORD') primitive.hasUV = true;
1313
1610
  break;
1314
- case "vcount":
1611
+
1612
+ case 'vcount':
1315
1613
  primitive.vcount = parseInts(child.textContent);
1316
1614
  break;
1317
- case "p":
1615
+
1616
+ case 'p':
1318
1617
  primitive.p = parseInts(child.textContent);
1319
1618
  break;
1320
1619
  }
1321
1620
  }
1621
+
1322
1622
  return primitive;
1323
1623
  }
1624
+
1324
1625
  function groupPrimitives(primitives) {
1325
1626
  const build = {};
1627
+
1326
1628
  for (let i = 0; i < primitives.length; i++) {
1327
1629
  const primitive = primitives[i];
1328
- if (build[primitive.type] === void 0)
1329
- build[primitive.type] = [];
1630
+ if (build[primitive.type] === undefined) build[primitive.type] = [];
1330
1631
  build[primitive.type].push(primitive);
1331
1632
  }
1633
+
1332
1634
  return build;
1333
1635
  }
1636
+
1334
1637
  function checkUVCoordinates(primitives) {
1335
- let count2 = 0;
1638
+ let count = 0;
1639
+
1336
1640
  for (let i = 0, l = primitives.length; i < l; i++) {
1337
1641
  const primitive = primitives[i];
1642
+
1338
1643
  if (primitive.hasUV === true) {
1339
- count2++;
1644
+ count++;
1340
1645
  }
1341
1646
  }
1342
- if (count2 > 0 && count2 < primitives.length) {
1647
+
1648
+ if (count > 0 && count < primitives.length) {
1343
1649
  primitives.uvsNeedsFix = true;
1344
1650
  }
1345
1651
  }
1652
+
1346
1653
  function buildGeometry(data) {
1347
1654
  const build = {};
1348
1655
  const sources = data.sources;
1349
1656
  const vertices = data.vertices;
1350
1657
  const primitives = data.primitives;
1351
- if (primitives.length === 0)
1352
- return {};
1658
+ if (primitives.length === 0) return {}; // our goal is to create one buffer geometry for a single type of primitives
1659
+ // first, we group all primitives by their type
1660
+
1353
1661
  const groupedPrimitives = groupPrimitives(primitives);
1662
+
1354
1663
  for (const type in groupedPrimitives) {
1355
- const primitiveType = groupedPrimitives[type];
1356
- checkUVCoordinates(primitiveType);
1664
+ const primitiveType = groupedPrimitives[type]; // second, ensure consistent uv coordinates for each type of primitives (polylist,triangles or lines)
1665
+
1666
+ checkUVCoordinates(primitiveType); // third, create a buffer geometry for each type of primitives
1667
+
1357
1668
  build[type] = buildGeometryType(primitiveType, sources, vertices);
1358
1669
  }
1670
+
1359
1671
  return build;
1360
1672
  }
1673
+
1361
1674
  function buildGeometryType(primitives, sources, vertices) {
1362
1675
  const build = {};
1363
- const position2 = { array: [], stride: 0 };
1364
- const normal = { array: [], stride: 0 };
1365
- const uv = { array: [], stride: 0 };
1366
- const uv2 = { array: [], stride: 0 };
1367
- const color = { array: [], stride: 0 };
1368
- const skinIndex = { array: [], stride: 4 };
1369
- const skinWeight = { array: [], stride: 4 };
1370
- const geometry = new THREE.BufferGeometry();
1676
+ const position = {
1677
+ array: [],
1678
+ stride: 0
1679
+ };
1680
+ const normal = {
1681
+ array: [],
1682
+ stride: 0
1683
+ };
1684
+ const uv = {
1685
+ array: [],
1686
+ stride: 0
1687
+ };
1688
+ const uv2 = {
1689
+ array: [],
1690
+ stride: 0
1691
+ };
1692
+ const color = {
1693
+ array: [],
1694
+ stride: 0
1695
+ };
1696
+ const skinIndex = {
1697
+ array: [],
1698
+ stride: 4
1699
+ };
1700
+ const skinWeight = {
1701
+ array: [],
1702
+ stride: 4
1703
+ };
1704
+ const geometry = new BufferGeometry();
1371
1705
  const materialKeys = [];
1372
1706
  let start = 0;
1707
+
1373
1708
  for (let p = 0; p < primitives.length; p++) {
1374
1709
  const primitive = primitives[p];
1375
- const inputs = primitive.inputs;
1376
- let count2 = 0;
1710
+ const inputs = primitive.inputs; // groups
1711
+
1712
+ let count = 0;
1713
+
1377
1714
  switch (primitive.type) {
1378
- case "lines":
1379
- case "linestrips":
1380
- count2 = primitive.count * 2;
1715
+ case 'lines':
1716
+ case 'linestrips':
1717
+ count = primitive.count * 2;
1381
1718
  break;
1382
- case "triangles":
1383
- count2 = primitive.count * 3;
1719
+
1720
+ case 'triangles':
1721
+ count = primitive.count * 3;
1384
1722
  break;
1385
- case "polylist":
1723
+
1724
+ case 'polylist':
1386
1725
  for (let g = 0; g < primitive.count; g++) {
1387
1726
  const vc = primitive.vcount[g];
1727
+
1388
1728
  switch (vc) {
1389
1729
  case 3:
1390
- count2 += 3;
1730
+ count += 3; // single triangle
1731
+
1391
1732
  break;
1733
+
1392
1734
  case 4:
1393
- count2 += 6;
1735
+ count += 6; // quad, subdivided into two triangles
1736
+
1394
1737
  break;
1738
+
1395
1739
  default:
1396
- count2 += (vc - 2) * 3;
1740
+ count += (vc - 2) * 3; // polylist with more than four vertices
1741
+
1397
1742
  break;
1398
1743
  }
1399
1744
  }
1745
+
1400
1746
  break;
1747
+
1401
1748
  default:
1402
- console.warn("THREE.ColladaLoader: Unknow primitive type:", primitive.type);
1749
+ console.warn('THREE.ColladaLoader: Unknow primitive type:', primitive.type);
1403
1750
  }
1404
- geometry.addGroup(start, count2, p);
1405
- start += count2;
1751
+
1752
+ geometry.addGroup(start, count, p);
1753
+ start += count; // material
1754
+
1406
1755
  if (primitive.material) {
1407
1756
  materialKeys.push(primitive.material);
1408
- }
1757
+ } // geometry data
1758
+
1759
+
1409
1760
  for (const name in inputs) {
1410
1761
  const input = inputs[name];
1762
+
1411
1763
  switch (name) {
1412
- case "VERTEX":
1764
+ case 'VERTEX':
1413
1765
  for (const key in vertices) {
1414
1766
  const id = vertices[key];
1767
+
1415
1768
  switch (key) {
1416
- case "POSITION":
1417
- const prevLength = position2.array.length;
1418
- buildGeometryData(primitive, sources[id], input.offset, position2.array);
1419
- position2.stride = sources[id].stride;
1769
+ case 'POSITION':
1770
+ const prevLength = position.array.length;
1771
+ buildGeometryData(primitive, sources[id], input.offset, position.array);
1772
+ position.stride = sources[id].stride;
1773
+
1420
1774
  if (sources.skinWeights && sources.skinIndices) {
1421
1775
  buildGeometryData(primitive, sources.skinIndices, input.offset, skinIndex.array);
1422
1776
  buildGeometryData(primitive, sources.skinWeights, input.offset, skinWeight.array);
1423
- }
1777
+ } // see #3803
1778
+
1779
+
1424
1780
  if (primitive.hasUV === false && primitives.uvsNeedsFix === true) {
1425
- const count3 = (position2.array.length - prevLength) / position2.stride;
1426
- for (let i = 0; i < count3; i++) {
1781
+ const count = (position.array.length - prevLength) / position.stride;
1782
+
1783
+ for (let i = 0; i < count; i++) {
1784
+ // fill missing uv coordinates
1427
1785
  uv.array.push(0, 0);
1428
1786
  }
1429
1787
  }
1788
+
1430
1789
  break;
1431
- case "NORMAL":
1790
+
1791
+ case 'NORMAL':
1432
1792
  buildGeometryData(primitive, sources[id], input.offset, normal.array);
1433
1793
  normal.stride = sources[id].stride;
1434
1794
  break;
1435
- case "COLOR":
1795
+
1796
+ case 'COLOR':
1436
1797
  buildGeometryData(primitive, sources[id], input.offset, color.array);
1437
1798
  color.stride = sources[id].stride;
1438
1799
  break;
1439
- case "TEXCOORD":
1800
+
1801
+ case 'TEXCOORD':
1440
1802
  buildGeometryData(primitive, sources[id], input.offset, uv.array);
1441
1803
  uv.stride = sources[id].stride;
1442
1804
  break;
1443
- case "TEXCOORD1":
1805
+
1806
+ case 'TEXCOORD1':
1444
1807
  buildGeometryData(primitive, sources[id], input.offset, uv2.array);
1445
1808
  uv.stride = sources[id].stride;
1446
1809
  break;
1810
+
1447
1811
  default:
1448
1812
  console.warn('THREE.ColladaLoader: Semantic "%s" not handled in geometry build process.', key);
1449
1813
  }
1450
1814
  }
1815
+
1451
1816
  break;
1452
- case "NORMAL":
1817
+
1818
+ case 'NORMAL':
1453
1819
  buildGeometryData(primitive, sources[input.id], input.offset, normal.array);
1454
1820
  normal.stride = sources[input.id].stride;
1455
1821
  break;
1456
- case "COLOR":
1822
+
1823
+ case 'COLOR':
1457
1824
  buildGeometryData(primitive, sources[input.id], input.offset, color.array);
1458
1825
  color.stride = sources[input.id].stride;
1459
1826
  break;
1460
- case "TEXCOORD":
1827
+
1828
+ case 'TEXCOORD':
1461
1829
  buildGeometryData(primitive, sources[input.id], input.offset, uv.array);
1462
1830
  uv.stride = sources[input.id].stride;
1463
1831
  break;
1464
- case "TEXCOORD1":
1832
+
1833
+ case 'TEXCOORD1':
1465
1834
  buildGeometryData(primitive, sources[input.id], input.offset, uv2.array);
1466
1835
  uv2.stride = sources[input.id].stride;
1467
1836
  break;
1468
1837
  }
1469
1838
  }
1839
+ } // build geometry
1840
+
1841
+
1842
+ if (position.array.length > 0) {
1843
+ geometry.setAttribute('position', new Float32BufferAttribute(position.array, position.stride));
1470
1844
  }
1471
- if (position2.array.length > 0) {
1472
- geometry.setAttribute("position", new THREE.Float32BufferAttribute(position2.array, position2.stride));
1473
- }
1845
+
1474
1846
  if (normal.array.length > 0) {
1475
- geometry.setAttribute("normal", new THREE.Float32BufferAttribute(normal.array, normal.stride));
1476
- }
1477
- if (color.array.length > 0)
1478
- geometry.setAttribute("color", new THREE.Float32BufferAttribute(color.array, color.stride));
1479
- if (uv.array.length > 0)
1480
- geometry.setAttribute("uv", new THREE.Float32BufferAttribute(uv.array, uv.stride));
1481
- if (uv2.array.length > 0)
1482
- geometry.setAttribute("uv2", new THREE.Float32BufferAttribute(uv2.array, uv2.stride));
1847
+ geometry.setAttribute('normal', new Float32BufferAttribute(normal.array, normal.stride));
1848
+ }
1849
+
1850
+ if (color.array.length > 0) geometry.setAttribute('color', new Float32BufferAttribute(color.array, color.stride));
1851
+ if (uv.array.length > 0) geometry.setAttribute('uv', new Float32BufferAttribute(uv.array, uv.stride));
1852
+ if (uv2.array.length > 0) geometry.setAttribute('uv2', new Float32BufferAttribute(uv2.array, uv2.stride));
1853
+
1483
1854
  if (skinIndex.array.length > 0) {
1484
- geometry.setAttribute("skinIndex", new THREE.Float32BufferAttribute(skinIndex.array, skinIndex.stride));
1855
+ geometry.setAttribute('skinIndex', new Float32BufferAttribute(skinIndex.array, skinIndex.stride));
1485
1856
  }
1857
+
1486
1858
  if (skinWeight.array.length > 0) {
1487
- geometry.setAttribute("skinWeight", new THREE.Float32BufferAttribute(skinWeight.array, skinWeight.stride));
1859
+ geometry.setAttribute('skinWeight', new Float32BufferAttribute(skinWeight.array, skinWeight.stride));
1488
1860
  }
1861
+
1489
1862
  build.data = geometry;
1490
1863
  build.type = primitives[0].type;
1491
1864
  build.materialKeys = materialKeys;
1492
1865
  return build;
1493
1866
  }
1867
+
1494
1868
  function buildGeometryData(primitive, source, offset, array) {
1495
1869
  const indices = primitive.p;
1496
1870
  const stride = primitive.stride;
1497
1871
  const vcount = primitive.vcount;
1872
+
1498
1873
  function pushVector(i) {
1499
1874
  let index = indices[i + offset] * sourceStride;
1500
1875
  const length = index + sourceStride;
1876
+
1501
1877
  for (; index < length; index++) {
1502
1878
  array.push(sourceArray[index]);
1503
1879
  }
1504
1880
  }
1881
+
1505
1882
  const sourceArray = source.array;
1506
1883
  const sourceStride = source.stride;
1507
- if (primitive.vcount !== void 0) {
1884
+
1885
+ if (primitive.vcount !== undefined) {
1508
1886
  let index = 0;
1887
+
1509
1888
  for (let i = 0, l = vcount.length; i < l; i++) {
1510
- const count2 = vcount[i];
1511
- if (count2 === 4) {
1889
+ const count = vcount[i];
1890
+
1891
+ if (count === 4) {
1512
1892
  const a = index + stride * 0;
1513
1893
  const b = index + stride * 1;
1514
1894
  const c = index + stride * 2;
@@ -1519,15 +1899,15 @@ class ColladaLoader extends THREE.Loader {
1519
1899
  pushVector(b);
1520
1900
  pushVector(c);
1521
1901
  pushVector(d);
1522
- } else if (count2 === 3) {
1902
+ } else if (count === 3) {
1523
1903
  const a = index + stride * 0;
1524
1904
  const b = index + stride * 1;
1525
1905
  const c = index + stride * 2;
1526
1906
  pushVector(a);
1527
1907
  pushVector(b);
1528
1908
  pushVector(c);
1529
- } else if (count2 > 4) {
1530
- for (let k = 1, kl = count2 - 2; k <= kl; k++) {
1909
+ } else if (count > 4) {
1910
+ for (let k = 1, kl = count - 2; k <= kl; k++) {
1531
1911
  const a = index + stride * 0;
1532
1912
  const b = index + stride * k;
1533
1913
  const c = index + stride * (k + 1);
@@ -1536,7 +1916,8 @@ class ColladaLoader extends THREE.Loader {
1536
1916
  pushVector(c);
1537
1917
  }
1538
1918
  }
1539
- index += stride * count2;
1919
+
1920
+ index += stride * count;
1540
1921
  }
1541
1922
  } else {
1542
1923
  for (let i = 0, l = indices.length; i < l; i += stride) {
@@ -1544,420 +1925,493 @@ class ColladaLoader extends THREE.Loader {
1544
1925
  }
1545
1926
  }
1546
1927
  }
1928
+
1547
1929
  function getGeometry(id) {
1548
1930
  return getBuild(library.geometries[id], buildGeometry);
1549
- }
1550
- function parseKinematicsModel(xml2) {
1931
+ } // kinematics
1932
+
1933
+
1934
+ function parseKinematicsModel(xml) {
1551
1935
  const data = {
1552
- name: xml2.getAttribute("name") || "",
1936
+ name: xml.getAttribute('name') || '',
1553
1937
  joints: {},
1554
1938
  links: []
1555
1939
  };
1556
- for (let i = 0; i < xml2.childNodes.length; i++) {
1557
- const child = xml2.childNodes[i];
1558
- if (child.nodeType !== 1)
1559
- continue;
1940
+
1941
+ for (let i = 0; i < xml.childNodes.length; i++) {
1942
+ const child = xml.childNodes[i];
1943
+ if (child.nodeType !== 1) continue;
1944
+
1560
1945
  switch (child.nodeName) {
1561
- case "technique_common":
1946
+ case 'technique_common':
1562
1947
  parseKinematicsTechniqueCommon(child, data);
1563
1948
  break;
1564
1949
  }
1565
1950
  }
1566
- library.kinematicsModels[xml2.getAttribute("id")] = data;
1951
+
1952
+ library.kinematicsModels[xml.getAttribute('id')] = data;
1567
1953
  }
1954
+
1568
1955
  function buildKinematicsModel(data) {
1569
- if (data.build !== void 0)
1570
- return data.build;
1956
+ if (data.build !== undefined) return data.build;
1571
1957
  return data;
1572
1958
  }
1959
+
1573
1960
  function getKinematicsModel(id) {
1574
1961
  return getBuild(library.kinematicsModels[id], buildKinematicsModel);
1575
1962
  }
1576
- function parseKinematicsTechniqueCommon(xml2, data) {
1577
- for (let i = 0; i < xml2.childNodes.length; i++) {
1578
- const child = xml2.childNodes[i];
1579
- if (child.nodeType !== 1)
1580
- continue;
1963
+
1964
+ function parseKinematicsTechniqueCommon(xml, data) {
1965
+ for (let i = 0; i < xml.childNodes.length; i++) {
1966
+ const child = xml.childNodes[i];
1967
+ if (child.nodeType !== 1) continue;
1968
+
1581
1969
  switch (child.nodeName) {
1582
- case "joint":
1583
- data.joints[child.getAttribute("sid")] = parseKinematicsJoint(child);
1970
+ case 'joint':
1971
+ data.joints[child.getAttribute('sid')] = parseKinematicsJoint(child);
1584
1972
  break;
1585
- case "link":
1973
+
1974
+ case 'link':
1586
1975
  data.links.push(parseKinematicsLink(child));
1587
1976
  break;
1588
1977
  }
1589
1978
  }
1590
1979
  }
1591
- function parseKinematicsJoint(xml2) {
1980
+
1981
+ function parseKinematicsJoint(xml) {
1592
1982
  let data;
1593
- for (let i = 0; i < xml2.childNodes.length; i++) {
1594
- const child = xml2.childNodes[i];
1595
- if (child.nodeType !== 1)
1596
- continue;
1983
+
1984
+ for (let i = 0; i < xml.childNodes.length; i++) {
1985
+ const child = xml.childNodes[i];
1986
+ if (child.nodeType !== 1) continue;
1987
+
1597
1988
  switch (child.nodeName) {
1598
- case "prismatic":
1599
- case "revolute":
1989
+ case 'prismatic':
1990
+ case 'revolute':
1600
1991
  data = parseKinematicsJointParameter(child);
1601
1992
  break;
1602
1993
  }
1603
1994
  }
1995
+
1604
1996
  return data;
1605
1997
  }
1606
- function parseKinematicsJointParameter(xml2) {
1998
+
1999
+ function parseKinematicsJointParameter(xml) {
1607
2000
  const data = {
1608
- sid: xml2.getAttribute("sid"),
1609
- name: xml2.getAttribute("name") || "",
1610
- axis: new THREE.Vector3(),
2001
+ sid: xml.getAttribute('sid'),
2002
+ name: xml.getAttribute('name') || '',
2003
+ axis: new Vector3(),
1611
2004
  limits: {
1612
2005
  min: 0,
1613
2006
  max: 0
1614
2007
  },
1615
- type: xml2.nodeName,
2008
+ type: xml.nodeName,
1616
2009
  static: false,
1617
2010
  zeroPosition: 0,
1618
2011
  middlePosition: 0
1619
2012
  };
1620
- for (let i = 0; i < xml2.childNodes.length; i++) {
1621
- const child = xml2.childNodes[i];
1622
- if (child.nodeType !== 1)
1623
- continue;
2013
+
2014
+ for (let i = 0; i < xml.childNodes.length; i++) {
2015
+ const child = xml.childNodes[i];
2016
+ if (child.nodeType !== 1) continue;
2017
+
1624
2018
  switch (child.nodeName) {
1625
- case "axis":
2019
+ case 'axis':
1626
2020
  const array = parseFloats(child.textContent);
1627
2021
  data.axis.fromArray(array);
1628
2022
  break;
1629
- case "limits":
1630
- const max = child.getElementsByTagName("max")[0];
1631
- const min = child.getElementsByTagName("min")[0];
2023
+
2024
+ case 'limits':
2025
+ const max = child.getElementsByTagName('max')[0];
2026
+ const min = child.getElementsByTagName('min')[0];
1632
2027
  data.limits.max = parseFloat(max.textContent);
1633
2028
  data.limits.min = parseFloat(min.textContent);
1634
2029
  break;
1635
2030
  }
1636
- }
2031
+ } // if min is equal to or greater than max, consider the joint static
2032
+
2033
+
1637
2034
  if (data.limits.min >= data.limits.max) {
1638
2035
  data.static = true;
1639
- }
1640
- data.middlePosition = (data.limits.min + data.limits.max) / 2;
2036
+ } // calculate middle position
2037
+
2038
+
2039
+ data.middlePosition = (data.limits.min + data.limits.max) / 2.0;
1641
2040
  return data;
1642
2041
  }
1643
- function parseKinematicsLink(xml2) {
2042
+
2043
+ function parseKinematicsLink(xml) {
1644
2044
  const data = {
1645
- sid: xml2.getAttribute("sid"),
1646
- name: xml2.getAttribute("name") || "",
2045
+ sid: xml.getAttribute('sid'),
2046
+ name: xml.getAttribute('name') || '',
1647
2047
  attachments: [],
1648
2048
  transforms: []
1649
2049
  };
1650
- for (let i = 0; i < xml2.childNodes.length; i++) {
1651
- const child = xml2.childNodes[i];
1652
- if (child.nodeType !== 1)
1653
- continue;
2050
+
2051
+ for (let i = 0; i < xml.childNodes.length; i++) {
2052
+ const child = xml.childNodes[i];
2053
+ if (child.nodeType !== 1) continue;
2054
+
1654
2055
  switch (child.nodeName) {
1655
- case "attachment_full":
2056
+ case 'attachment_full':
1656
2057
  data.attachments.push(parseKinematicsAttachment(child));
1657
2058
  break;
1658
- case "matrix":
1659
- case "translate":
1660
- case "rotate":
2059
+
2060
+ case 'matrix':
2061
+ case 'translate':
2062
+ case 'rotate':
1661
2063
  data.transforms.push(parseKinematicsTransform(child));
1662
2064
  break;
1663
2065
  }
1664
2066
  }
2067
+
1665
2068
  return data;
1666
2069
  }
1667
- function parseKinematicsAttachment(xml2) {
2070
+
2071
+ function parseKinematicsAttachment(xml) {
1668
2072
  const data = {
1669
- joint: xml2.getAttribute("joint").split("/").pop(),
2073
+ joint: xml.getAttribute('joint').split('/').pop(),
1670
2074
  transforms: [],
1671
2075
  links: []
1672
2076
  };
1673
- for (let i = 0; i < xml2.childNodes.length; i++) {
1674
- const child = xml2.childNodes[i];
1675
- if (child.nodeType !== 1)
1676
- continue;
2077
+
2078
+ for (let i = 0; i < xml.childNodes.length; i++) {
2079
+ const child = xml.childNodes[i];
2080
+ if (child.nodeType !== 1) continue;
2081
+
1677
2082
  switch (child.nodeName) {
1678
- case "link":
2083
+ case 'link':
1679
2084
  data.links.push(parseKinematicsLink(child));
1680
2085
  break;
1681
- case "matrix":
1682
- case "translate":
1683
- case "rotate":
2086
+
2087
+ case 'matrix':
2088
+ case 'translate':
2089
+ case 'rotate':
1684
2090
  data.transforms.push(parseKinematicsTransform(child));
1685
2091
  break;
1686
2092
  }
1687
2093
  }
2094
+
1688
2095
  return data;
1689
2096
  }
1690
- function parseKinematicsTransform(xml2) {
2097
+
2098
+ function parseKinematicsTransform(xml) {
1691
2099
  const data = {
1692
- type: xml2.nodeName
2100
+ type: xml.nodeName
1693
2101
  };
1694
- const array = parseFloats(xml2.textContent);
2102
+ const array = parseFloats(xml.textContent);
2103
+
1695
2104
  switch (data.type) {
1696
- case "matrix":
1697
- data.obj = new THREE.Matrix4();
2105
+ case 'matrix':
2106
+ data.obj = new Matrix4();
1698
2107
  data.obj.fromArray(array).transpose();
1699
2108
  break;
1700
- case "translate":
1701
- data.obj = new THREE.Vector3();
2109
+
2110
+ case 'translate':
2111
+ data.obj = new Vector3();
1702
2112
  data.obj.fromArray(array);
1703
2113
  break;
1704
- case "rotate":
1705
- data.obj = new THREE.Vector3();
2114
+
2115
+ case 'rotate':
2116
+ data.obj = new Vector3();
1706
2117
  data.obj.fromArray(array);
1707
- data.angle = THREE.MathUtils.degToRad(array[3]);
2118
+ data.angle = MathUtils.degToRad(array[3]);
1708
2119
  break;
1709
2120
  }
2121
+
1710
2122
  return data;
1711
- }
1712
- function parsePhysicsModel(xml2) {
2123
+ } // physics
2124
+
2125
+
2126
+ function parsePhysicsModel(xml) {
1713
2127
  const data = {
1714
- name: xml2.getAttribute("name") || "",
2128
+ name: xml.getAttribute('name') || '',
1715
2129
  rigidBodies: {}
1716
2130
  };
1717
- for (let i = 0; i < xml2.childNodes.length; i++) {
1718
- const child = xml2.childNodes[i];
1719
- if (child.nodeType !== 1)
1720
- continue;
2131
+
2132
+ for (let i = 0; i < xml.childNodes.length; i++) {
2133
+ const child = xml.childNodes[i];
2134
+ if (child.nodeType !== 1) continue;
2135
+
1721
2136
  switch (child.nodeName) {
1722
- case "rigid_body":
1723
- data.rigidBodies[child.getAttribute("name")] = {};
1724
- parsePhysicsRigidBody(child, data.rigidBodies[child.getAttribute("name")]);
2137
+ case 'rigid_body':
2138
+ data.rigidBodies[child.getAttribute('name')] = {};
2139
+ parsePhysicsRigidBody(child, data.rigidBodies[child.getAttribute('name')]);
1725
2140
  break;
1726
2141
  }
1727
2142
  }
1728
- library.physicsModels[xml2.getAttribute("id")] = data;
2143
+
2144
+ library.physicsModels[xml.getAttribute('id')] = data;
1729
2145
  }
1730
- function parsePhysicsRigidBody(xml2, data) {
1731
- for (let i = 0; i < xml2.childNodes.length; i++) {
1732
- const child = xml2.childNodes[i];
1733
- if (child.nodeType !== 1)
1734
- continue;
2146
+
2147
+ function parsePhysicsRigidBody(xml, data) {
2148
+ for (let i = 0; i < xml.childNodes.length; i++) {
2149
+ const child = xml.childNodes[i];
2150
+ if (child.nodeType !== 1) continue;
2151
+
1735
2152
  switch (child.nodeName) {
1736
- case "technique_common":
2153
+ case 'technique_common':
1737
2154
  parsePhysicsTechniqueCommon(child, data);
1738
2155
  break;
1739
2156
  }
1740
2157
  }
1741
2158
  }
1742
- function parsePhysicsTechniqueCommon(xml2, data) {
1743
- for (let i = 0; i < xml2.childNodes.length; i++) {
1744
- const child = xml2.childNodes[i];
1745
- if (child.nodeType !== 1)
1746
- continue;
2159
+
2160
+ function parsePhysicsTechniqueCommon(xml, data) {
2161
+ for (let i = 0; i < xml.childNodes.length; i++) {
2162
+ const child = xml.childNodes[i];
2163
+ if (child.nodeType !== 1) continue;
2164
+
1747
2165
  switch (child.nodeName) {
1748
- case "inertia":
2166
+ case 'inertia':
1749
2167
  data.inertia = parseFloats(child.textContent);
1750
2168
  break;
1751
- case "mass":
2169
+
2170
+ case 'mass':
1752
2171
  data.mass = parseFloats(child.textContent)[0];
1753
2172
  break;
1754
2173
  }
1755
2174
  }
1756
- }
1757
- function parseKinematicsScene(xml2) {
2175
+ } // scene
2176
+
2177
+
2178
+ function parseKinematicsScene(xml) {
1758
2179
  const data = {
1759
2180
  bindJointAxis: []
1760
2181
  };
1761
- for (let i = 0; i < xml2.childNodes.length; i++) {
1762
- const child = xml2.childNodes[i];
1763
- if (child.nodeType !== 1)
1764
- continue;
2182
+
2183
+ for (let i = 0; i < xml.childNodes.length; i++) {
2184
+ const child = xml.childNodes[i];
2185
+ if (child.nodeType !== 1) continue;
2186
+
1765
2187
  switch (child.nodeName) {
1766
- case "bind_joint_axis":
2188
+ case 'bind_joint_axis':
1767
2189
  data.bindJointAxis.push(parseKinematicsBindJointAxis(child));
1768
2190
  break;
1769
2191
  }
1770
2192
  }
1771
- library.kinematicsScenes[parseId(xml2.getAttribute("url"))] = data;
2193
+
2194
+ library.kinematicsScenes[parseId(xml.getAttribute('url'))] = data;
1772
2195
  }
1773
- function parseKinematicsBindJointAxis(xml2) {
2196
+
2197
+ function parseKinematicsBindJointAxis(xml) {
1774
2198
  const data = {
1775
- target: xml2.getAttribute("target").split("/").pop()
2199
+ target: xml.getAttribute('target').split('/').pop()
1776
2200
  };
1777
- for (let i = 0; i < xml2.childNodes.length; i++) {
1778
- const child = xml2.childNodes[i];
1779
- if (child.nodeType !== 1)
1780
- continue;
2201
+
2202
+ for (let i = 0; i < xml.childNodes.length; i++) {
2203
+ const child = xml.childNodes[i];
2204
+ if (child.nodeType !== 1) continue;
2205
+
1781
2206
  switch (child.nodeName) {
1782
- case "axis":
1783
- const param = child.getElementsByTagName("param")[0];
2207
+ case 'axis':
2208
+ const param = child.getElementsByTagName('param')[0];
1784
2209
  data.axis = param.textContent;
1785
- const tmpJointIndex = data.axis.split("inst_").pop().split("axis")[0];
2210
+ const tmpJointIndex = data.axis.split('inst_').pop().split('axis')[0];
1786
2211
  data.jointIndex = tmpJointIndex.substr(0, tmpJointIndex.length - 1);
1787
2212
  break;
1788
2213
  }
1789
2214
  }
2215
+
1790
2216
  return data;
1791
2217
  }
2218
+
1792
2219
  function buildKinematicsScene(data) {
1793
- if (data.build !== void 0)
1794
- return data.build;
2220
+ if (data.build !== undefined) return data.build;
1795
2221
  return data;
1796
2222
  }
2223
+
1797
2224
  function getKinematicsScene(id) {
1798
2225
  return getBuild(library.kinematicsScenes[id], buildKinematicsScene);
1799
2226
  }
2227
+
1800
2228
  function setupKinematics() {
1801
2229
  const kinematicsModelId = Object.keys(library.kinematicsModels)[0];
1802
2230
  const kinematicsSceneId = Object.keys(library.kinematicsScenes)[0];
1803
2231
  const visualSceneId = Object.keys(library.visualScenes)[0];
1804
- if (kinematicsModelId === void 0 || kinematicsSceneId === void 0)
1805
- return;
2232
+ if (kinematicsModelId === undefined || kinematicsSceneId === undefined) return;
1806
2233
  const kinematicsModel = getKinematicsModel(kinematicsModelId);
1807
2234
  const kinematicsScene = getKinematicsScene(kinematicsSceneId);
1808
2235
  const visualScene = getVisualScene(visualSceneId);
1809
2236
  const bindJointAxis = kinematicsScene.bindJointAxis;
1810
2237
  const jointMap = {};
2238
+
1811
2239
  for (let i = 0, l = bindJointAxis.length; i < l; i++) {
1812
- const axis = bindJointAxis[i];
2240
+ const axis = bindJointAxis[i]; // the result of the following query is an element of type 'translate', 'rotate','scale' or 'matrix'
2241
+
1813
2242
  const targetElement = collada.querySelector('[sid="' + axis.target + '"]');
2243
+
1814
2244
  if (targetElement) {
1815
- const parentVisualElement = targetElement.parentElement;
2245
+ // get the parent of the transform element
2246
+ const parentVisualElement = targetElement.parentElement; // connect the joint of the kinematics model with the element in the visual scene
2247
+
1816
2248
  connect(axis.jointIndex, parentVisualElement);
1817
2249
  }
1818
2250
  }
2251
+
1819
2252
  function connect(jointIndex, visualElement) {
1820
- const visualElementName = visualElement.getAttribute("name");
2253
+ const visualElementName = visualElement.getAttribute('name');
1821
2254
  const joint = kinematicsModel.joints[jointIndex];
1822
- visualScene.traverse(function(object) {
2255
+ visualScene.traverse(function (object) {
1823
2256
  if (object.name === visualElementName) {
1824
2257
  jointMap[jointIndex] = {
1825
- object,
2258
+ object: object,
1826
2259
  transforms: buildTransformList(visualElement),
1827
- joint,
2260
+ joint: joint,
1828
2261
  position: joint.zeroPosition
1829
2262
  };
1830
2263
  }
1831
2264
  });
1832
2265
  }
1833
- const m0 = new THREE.Matrix4();
2266
+
2267
+ const m0 = new Matrix4();
1834
2268
  kinematics = {
1835
2269
  joints: kinematicsModel && kinematicsModel.joints,
1836
- getJointValue: function(jointIndex) {
2270
+ getJointValue: function (jointIndex) {
1837
2271
  const jointData = jointMap[jointIndex];
2272
+
1838
2273
  if (jointData) {
1839
2274
  return jointData.position;
1840
2275
  } else {
1841
- console.warn("THREE.ColladaLoader: Joint " + jointIndex + " doesn't exist.");
2276
+ console.warn('THREE.ColladaLoader: Joint ' + jointIndex + " doesn't exist.");
1842
2277
  }
1843
2278
  },
1844
- setJointValue: function(jointIndex, value) {
2279
+ setJointValue: function (jointIndex, value) {
1845
2280
  const jointData = jointMap[jointIndex];
2281
+
1846
2282
  if (jointData) {
1847
2283
  const joint = jointData.joint;
2284
+
1848
2285
  if (value > joint.limits.max || value < joint.limits.min) {
1849
- console.warn(
1850
- "THREE.ColladaLoader: Joint " + jointIndex + " value " + value + " outside of limits (min: " + joint.limits.min + ", max: " + joint.limits.max + ")."
1851
- );
2286
+ console.warn('THREE.ColladaLoader: Joint ' + jointIndex + ' value ' + value + ' outside of limits (min: ' + joint.limits.min + ', max: ' + joint.limits.max + ').');
1852
2287
  } else if (joint.static) {
1853
- console.warn("THREE.ColladaLoader: Joint " + jointIndex + " is static.");
2288
+ console.warn('THREE.ColladaLoader: Joint ' + jointIndex + ' is static.');
1854
2289
  } else {
1855
2290
  const object = jointData.object;
1856
2291
  const axis = joint.axis;
1857
2292
  const transforms = jointData.transforms;
1858
- matrix.identity();
2293
+ matrix.identity(); // each update, we have to apply all transforms in the correct order
2294
+
1859
2295
  for (let i = 0; i < transforms.length; i++) {
1860
- const transform = transforms[i];
2296
+ const transform = transforms[i]; // if there is a connection of the transform node with a joint, apply the joint value
2297
+
1861
2298
  if (transform.sid && transform.sid.indexOf(jointIndex) !== -1) {
1862
2299
  switch (joint.type) {
1863
- case "revolute":
1864
- matrix.multiply(m0.makeRotationAxis(axis, THREE.MathUtils.degToRad(value)));
2300
+ case 'revolute':
2301
+ matrix.multiply(m0.makeRotationAxis(axis, MathUtils.degToRad(value)));
1865
2302
  break;
1866
- case "prismatic":
2303
+
2304
+ case 'prismatic':
1867
2305
  matrix.multiply(m0.makeTranslation(axis.x * value, axis.y * value, axis.z * value));
1868
2306
  break;
2307
+
1869
2308
  default:
1870
- console.warn("THREE.ColladaLoader: Unknown joint type: " + joint.type);
2309
+ console.warn('THREE.ColladaLoader: Unknown joint type: ' + joint.type);
1871
2310
  break;
1872
2311
  }
1873
2312
  } else {
1874
2313
  switch (transform.type) {
1875
- case "matrix":
2314
+ case 'matrix':
1876
2315
  matrix.multiply(transform.obj);
1877
2316
  break;
1878
- case "translate":
2317
+
2318
+ case 'translate':
1879
2319
  matrix.multiply(m0.makeTranslation(transform.obj.x, transform.obj.y, transform.obj.z));
1880
2320
  break;
1881
- case "scale":
2321
+
2322
+ case 'scale':
1882
2323
  matrix.scale(transform.obj);
1883
2324
  break;
1884
- case "rotate":
2325
+
2326
+ case 'rotate':
1885
2327
  matrix.multiply(m0.makeRotationAxis(transform.obj, transform.angle));
1886
2328
  break;
1887
2329
  }
1888
2330
  }
1889
2331
  }
2332
+
1890
2333
  object.matrix.copy(matrix);
1891
2334
  object.matrix.decompose(object.position, object.quaternion, object.scale);
1892
2335
  jointMap[jointIndex].position = value;
1893
2336
  }
1894
2337
  } else {
1895
- console.log("THREE.ColladaLoader: " + jointIndex + " does not exist.");
2338
+ console.log('THREE.ColladaLoader: ' + jointIndex + ' does not exist.');
1896
2339
  }
1897
2340
  }
1898
2341
  };
1899
2342
  }
2343
+
1900
2344
  function buildTransformList(node) {
1901
2345
  const transforms = [];
1902
- const xml2 = collada.querySelector('[id="' + node.id + '"]');
1903
- for (let i = 0; i < xml2.childNodes.length; i++) {
1904
- const child = xml2.childNodes[i];
1905
- if (child.nodeType !== 1)
1906
- continue;
1907
- let array, vector2;
2346
+ const xml = collada.querySelector('[id="' + node.id + '"]');
2347
+
2348
+ for (let i = 0; i < xml.childNodes.length; i++) {
2349
+ const child = xml.childNodes[i];
2350
+ if (child.nodeType !== 1) continue;
2351
+ let array, vector;
2352
+
1908
2353
  switch (child.nodeName) {
1909
- case "matrix":
2354
+ case 'matrix':
1910
2355
  array = parseFloats(child.textContent);
1911
- const matrix2 = new THREE.Matrix4().fromArray(array).transpose();
2356
+ const matrix = new Matrix4().fromArray(array).transpose();
1912
2357
  transforms.push({
1913
- sid: child.getAttribute("sid"),
2358
+ sid: child.getAttribute('sid'),
1914
2359
  type: child.nodeName,
1915
- obj: matrix2
2360
+ obj: matrix
1916
2361
  });
1917
2362
  break;
1918
- case "translate":
1919
- case "scale":
2363
+
2364
+ case 'translate':
2365
+ case 'scale':
1920
2366
  array = parseFloats(child.textContent);
1921
- vector2 = new THREE.Vector3().fromArray(array);
2367
+ vector = new Vector3().fromArray(array);
1922
2368
  transforms.push({
1923
- sid: child.getAttribute("sid"),
2369
+ sid: child.getAttribute('sid'),
1924
2370
  type: child.nodeName,
1925
- obj: vector2
2371
+ obj: vector
1926
2372
  });
1927
2373
  break;
1928
- case "rotate":
2374
+
2375
+ case 'rotate':
1929
2376
  array = parseFloats(child.textContent);
1930
- vector2 = new THREE.Vector3().fromArray(array);
1931
- const angle = THREE.MathUtils.degToRad(array[3]);
2377
+ vector = new Vector3().fromArray(array);
2378
+ const angle = MathUtils.degToRad(array[3]);
1932
2379
  transforms.push({
1933
- sid: child.getAttribute("sid"),
2380
+ sid: child.getAttribute('sid'),
1934
2381
  type: child.nodeName,
1935
- obj: vector2,
1936
- angle
2382
+ obj: vector,
2383
+ angle: angle
1937
2384
  });
1938
2385
  break;
1939
2386
  }
1940
2387
  }
2388
+
1941
2389
  return transforms;
1942
- }
1943
- function prepareNodes(xml2) {
1944
- const elements = xml2.getElementsByTagName("node");
2390
+ } // nodes
2391
+
2392
+
2393
+ function prepareNodes(xml) {
2394
+ const elements = xml.getElementsByTagName('node'); // ensure all node elements have id attributes
2395
+
1945
2396
  for (let i = 0; i < elements.length; i++) {
1946
2397
  const element = elements[i];
1947
- if (element.hasAttribute("id") === false) {
1948
- element.setAttribute("id", generateId());
2398
+
2399
+ if (element.hasAttribute('id') === false) {
2400
+ element.setAttribute('id', generateId());
1949
2401
  }
1950
2402
  }
1951
2403
  }
1952
- const matrix = new THREE.Matrix4();
1953
- const vector = new THREE.Vector3();
1954
- function parseNode(xml2) {
2404
+
2405
+ const matrix = new Matrix4();
2406
+ const vector = new Vector3();
2407
+
2408
+ function parseNode(xml) {
1955
2409
  const data = {
1956
- name: xml2.getAttribute("name") || "",
1957
- type: xml2.getAttribute("type"),
1958
- id: xml2.getAttribute("id"),
1959
- sid: xml2.getAttribute("sid"),
1960
- matrix: new THREE.Matrix4(),
2410
+ name: xml.getAttribute('name') || '',
2411
+ type: xml.getAttribute('type'),
2412
+ id: xml.getAttribute('id'),
2413
+ sid: xml.getAttribute('sid'),
2414
+ matrix: new Matrix4(),
1961
2415
  nodes: [],
1962
2416
  instanceCameras: [],
1963
2417
  instanceControllers: [],
@@ -1966,183 +2420,238 @@ class ColladaLoader extends THREE.Loader {
1966
2420
  instanceNodes: [],
1967
2421
  transforms: {}
1968
2422
  };
1969
- for (let i = 0; i < xml2.childNodes.length; i++) {
1970
- const child = xml2.childNodes[i];
1971
- if (child.nodeType !== 1)
1972
- continue;
2423
+
2424
+ for (let i = 0; i < xml.childNodes.length; i++) {
2425
+ const child = xml.childNodes[i];
2426
+ if (child.nodeType !== 1) continue;
1973
2427
  let array;
2428
+
1974
2429
  switch (child.nodeName) {
1975
- case "node":
1976
- data.nodes.push(child.getAttribute("id"));
2430
+ case 'node':
2431
+ data.nodes.push(child.getAttribute('id'));
1977
2432
  parseNode(child);
1978
2433
  break;
1979
- case "instance_camera":
1980
- data.instanceCameras.push(parseId(child.getAttribute("url")));
2434
+
2435
+ case 'instance_camera':
2436
+ data.instanceCameras.push(parseId(child.getAttribute('url')));
1981
2437
  break;
1982
- case "instance_controller":
2438
+
2439
+ case 'instance_controller':
1983
2440
  data.instanceControllers.push(parseNodeInstance(child));
1984
2441
  break;
1985
- case "instance_light":
1986
- data.instanceLights.push(parseId(child.getAttribute("url")));
2442
+
2443
+ case 'instance_light':
2444
+ data.instanceLights.push(parseId(child.getAttribute('url')));
1987
2445
  break;
1988
- case "instance_geometry":
2446
+
2447
+ case 'instance_geometry':
1989
2448
  data.instanceGeometries.push(parseNodeInstance(child));
1990
2449
  break;
1991
- case "instance_node":
1992
- data.instanceNodes.push(parseId(child.getAttribute("url")));
2450
+
2451
+ case 'instance_node':
2452
+ data.instanceNodes.push(parseId(child.getAttribute('url')));
1993
2453
  break;
1994
- case "matrix":
2454
+
2455
+ case 'matrix':
1995
2456
  array = parseFloats(child.textContent);
1996
2457
  data.matrix.multiply(matrix.fromArray(array).transpose());
1997
- data.transforms[child.getAttribute("sid")] = child.nodeName;
2458
+ data.transforms[child.getAttribute('sid')] = child.nodeName;
1998
2459
  break;
1999
- case "translate":
2460
+
2461
+ case 'translate':
2000
2462
  array = parseFloats(child.textContent);
2001
2463
  vector.fromArray(array);
2002
2464
  data.matrix.multiply(matrix.makeTranslation(vector.x, vector.y, vector.z));
2003
- data.transforms[child.getAttribute("sid")] = child.nodeName;
2465
+ data.transforms[child.getAttribute('sid')] = child.nodeName;
2004
2466
  break;
2005
- case "rotate":
2467
+
2468
+ case 'rotate':
2006
2469
  array = parseFloats(child.textContent);
2007
- const angle = THREE.MathUtils.degToRad(array[3]);
2470
+ const angle = MathUtils.degToRad(array[3]);
2008
2471
  data.matrix.multiply(matrix.makeRotationAxis(vector.fromArray(array), angle));
2009
- data.transforms[child.getAttribute("sid")] = child.nodeName;
2472
+ data.transforms[child.getAttribute('sid')] = child.nodeName;
2010
2473
  break;
2011
- case "scale":
2474
+
2475
+ case 'scale':
2012
2476
  array = parseFloats(child.textContent);
2013
2477
  data.matrix.scale(vector.fromArray(array));
2014
- data.transforms[child.getAttribute("sid")] = child.nodeName;
2478
+ data.transforms[child.getAttribute('sid')] = child.nodeName;
2015
2479
  break;
2016
- case "extra":
2480
+
2481
+ case 'extra':
2017
2482
  break;
2483
+
2018
2484
  default:
2019
2485
  console.log(child);
2020
2486
  }
2021
2487
  }
2488
+
2022
2489
  if (hasNode(data.id)) {
2023
- console.warn(
2024
- "THREE.ColladaLoader: There is already a node with ID %s. Exclude current node from further processing.",
2025
- data.id
2026
- );
2490
+ console.warn('THREE.ColladaLoader: There is already a node with ID %s. Exclude current node from further processing.', data.id);
2027
2491
  } else {
2028
2492
  library.nodes[data.id] = data;
2029
2493
  }
2494
+
2030
2495
  return data;
2031
2496
  }
2032
- function parseNodeInstance(xml2) {
2497
+
2498
+ function parseNodeInstance(xml) {
2033
2499
  const data = {
2034
- id: parseId(xml2.getAttribute("url")),
2500
+ id: parseId(xml.getAttribute('url')),
2035
2501
  materials: {},
2036
2502
  skeletons: []
2037
2503
  };
2038
- for (let i = 0; i < xml2.childNodes.length; i++) {
2039
- const child = xml2.childNodes[i];
2504
+
2505
+ for (let i = 0; i < xml.childNodes.length; i++) {
2506
+ const child = xml.childNodes[i];
2507
+
2040
2508
  switch (child.nodeName) {
2041
- case "bind_material":
2042
- const instances = child.getElementsByTagName("instance_material");
2509
+ case 'bind_material':
2510
+ const instances = child.getElementsByTagName('instance_material');
2511
+
2043
2512
  for (let j = 0; j < instances.length; j++) {
2044
2513
  const instance = instances[j];
2045
- const symbol = instance.getAttribute("symbol");
2046
- const target = instance.getAttribute("target");
2514
+ const symbol = instance.getAttribute('symbol');
2515
+ const target = instance.getAttribute('target');
2047
2516
  data.materials[symbol] = parseId(target);
2048
2517
  }
2518
+
2049
2519
  break;
2050
- case "skeleton":
2520
+
2521
+ case 'skeleton':
2051
2522
  data.skeletons.push(parseId(child.textContent));
2052
2523
  break;
2053
- default:
2054
- break;
2055
2524
  }
2056
2525
  }
2526
+
2057
2527
  return data;
2058
2528
  }
2529
+
2059
2530
  function buildSkeleton(skeletons, joints) {
2060
2531
  const boneData = [];
2061
2532
  const sortedBoneData = [];
2062
- let i, j, data;
2533
+ let i, j, data; // a skeleton can have multiple root bones. collada expresses this
2534
+ // situtation with multiple "skeleton" tags per controller instance
2535
+
2063
2536
  for (i = 0; i < skeletons.length; i++) {
2064
2537
  const skeleton = skeletons[i];
2065
2538
  let root;
2539
+
2066
2540
  if (hasNode(skeleton)) {
2067
2541
  root = getNode(skeleton);
2068
2542
  buildBoneHierarchy(root, joints, boneData);
2069
2543
  } else if (hasVisualScene(skeleton)) {
2544
+ // handle case where the skeleton refers to the visual scene (#13335)
2070
2545
  const visualScene = library.visualScenes[skeleton];
2071
2546
  const children = visualScene.children;
2072
- for (let j2 = 0; j2 < children.length; j2++) {
2073
- const child = children[j2];
2074
- if (child.type === "JOINT") {
2075
- const root2 = getNode(child.id);
2076
- buildBoneHierarchy(root2, joints, boneData);
2547
+
2548
+ for (let j = 0; j < children.length; j++) {
2549
+ const child = children[j];
2550
+
2551
+ if (child.type === 'JOINT') {
2552
+ const root = getNode(child.id);
2553
+ buildBoneHierarchy(root, joints, boneData);
2077
2554
  }
2078
2555
  }
2079
2556
  } else {
2080
- console.error("THREE.ColladaLoader: Unable to find root bone of skeleton with ID:", skeleton);
2557
+ console.error('THREE.ColladaLoader: Unable to find root bone of skeleton with ID:', skeleton);
2081
2558
  }
2082
- }
2559
+ } // sort bone data (the order is defined in the corresponding controller)
2560
+
2561
+
2083
2562
  for (i = 0; i < joints.length; i++) {
2084
2563
  for (j = 0; j < boneData.length; j++) {
2085
2564
  data = boneData[j];
2565
+
2086
2566
  if (data.bone.name === joints[i].name) {
2087
2567
  sortedBoneData[i] = data;
2088
2568
  data.processed = true;
2089
2569
  break;
2090
2570
  }
2091
2571
  }
2092
- }
2572
+ } // add unprocessed bone data at the end of the list
2573
+
2574
+
2093
2575
  for (i = 0; i < boneData.length; i++) {
2094
2576
  data = boneData[i];
2577
+
2095
2578
  if (data.processed === false) {
2096
2579
  sortedBoneData.push(data);
2097
2580
  data.processed = true;
2098
2581
  }
2099
- }
2582
+ } // setup arrays for skeleton creation
2583
+
2584
+
2100
2585
  const bones = [];
2101
2586
  const boneInverses = [];
2587
+
2102
2588
  for (i = 0; i < sortedBoneData.length; i++) {
2103
2589
  data = sortedBoneData[i];
2104
2590
  bones.push(data.bone);
2105
2591
  boneInverses.push(data.boneInverse);
2106
2592
  }
2107
- return new THREE.Skeleton(bones, boneInverses);
2593
+
2594
+ return new Skeleton(bones, boneInverses);
2108
2595
  }
2596
+
2109
2597
  function buildBoneHierarchy(root, joints, boneData) {
2110
- root.traverse(function(object) {
2598
+ // setup bone data from visual scene
2599
+ root.traverse(function (object) {
2111
2600
  if (object.isBone === true) {
2112
- let boneInverse;
2601
+ let boneInverse; // retrieve the boneInverse from the controller data
2602
+
2113
2603
  for (let i = 0; i < joints.length; i++) {
2114
2604
  const joint = joints[i];
2605
+
2115
2606
  if (joint.name === object.name) {
2116
2607
  boneInverse = joint.boneInverse;
2117
2608
  break;
2118
2609
  }
2119
2610
  }
2120
- if (boneInverse === void 0) {
2121
- boneInverse = new THREE.Matrix4();
2611
+
2612
+ if (boneInverse === undefined) {
2613
+ // Unfortunately, there can be joints in the visual scene that are not part of the
2614
+ // corresponding controller. In this case, we have to create a dummy boneInverse matrix
2615
+ // for the respective bone. This bone won't affect any vertices, because there are no skin indices
2616
+ // and weights defined for it. But we still have to add the bone to the sorted bone list in order to
2617
+ // ensure a correct animation of the model.
2618
+ boneInverse = new Matrix4();
2122
2619
  }
2123
- boneData.push({ bone: object, boneInverse, processed: false });
2620
+
2621
+ boneData.push({
2622
+ bone: object,
2623
+ boneInverse: boneInverse,
2624
+ processed: false
2625
+ });
2124
2626
  }
2125
2627
  });
2126
2628
  }
2629
+
2127
2630
  function buildNode(data) {
2128
2631
  const objects = [];
2129
- const matrix2 = data.matrix;
2632
+ const matrix = data.matrix;
2130
2633
  const nodes = data.nodes;
2131
2634
  const type = data.type;
2132
2635
  const instanceCameras = data.instanceCameras;
2133
2636
  const instanceControllers = data.instanceControllers;
2134
2637
  const instanceLights = data.instanceLights;
2135
2638
  const instanceGeometries = data.instanceGeometries;
2136
- const instanceNodes = data.instanceNodes;
2639
+ const instanceNodes = data.instanceNodes; // nodes
2640
+
2137
2641
  for (let i = 0, l = nodes.length; i < l; i++) {
2138
2642
  objects.push(getNode(nodes[i]));
2139
- }
2643
+ } // instance cameras
2644
+
2645
+
2140
2646
  for (let i = 0, l = instanceCameras.length; i < l; i++) {
2141
2647
  const instanceCamera = getCamera(instanceCameras[i]);
2648
+
2142
2649
  if (instanceCamera !== null) {
2143
2650
  objects.push(instanceCamera.clone());
2144
2651
  }
2145
- }
2652
+ } // instance controllers
2653
+
2654
+
2146
2655
  for (let i = 0, l = instanceControllers.length; i < l; i++) {
2147
2656
  const instance = instanceControllers[i];
2148
2657
  const controller = getController(instance.id);
@@ -2151,196 +2660,272 @@ class ColladaLoader extends THREE.Loader {
2151
2660
  const skeletons = instance.skeletons;
2152
2661
  const joints = controller.skin.joints;
2153
2662
  const skeleton = buildSkeleton(skeletons, joints);
2663
+
2154
2664
  for (let j = 0, jl = newObjects.length; j < jl; j++) {
2155
- const object2 = newObjects[j];
2156
- if (object2.isSkinnedMesh) {
2157
- object2.bind(skeleton, controller.skin.bindMatrix);
2158
- object2.normalizeSkinWeights();
2665
+ const object = newObjects[j];
2666
+
2667
+ if (object.isSkinnedMesh) {
2668
+ object.bind(skeleton, controller.skin.bindMatrix);
2669
+ object.normalizeSkinWeights();
2159
2670
  }
2160
- objects.push(object2);
2671
+
2672
+ objects.push(object);
2161
2673
  }
2162
- }
2674
+ } // instance lights
2675
+
2676
+
2163
2677
  for (let i = 0, l = instanceLights.length; i < l; i++) {
2164
2678
  const instanceLight = getLight(instanceLights[i]);
2679
+
2165
2680
  if (instanceLight !== null) {
2166
2681
  objects.push(instanceLight.clone());
2167
2682
  }
2168
- }
2683
+ } // instance geometries
2684
+
2685
+
2169
2686
  for (let i = 0, l = instanceGeometries.length; i < l; i++) {
2170
- const instance = instanceGeometries[i];
2687
+ const instance = instanceGeometries[i]; // a single geometry instance in collada can lead to multiple object3Ds.
2688
+ // this is the case when primitives are combined like triangles and lines
2689
+
2171
2690
  const geometries = getGeometry(instance.id);
2172
2691
  const newObjects = buildObjects(geometries, instance.materials);
2692
+
2173
2693
  for (let j = 0, jl = newObjects.length; j < jl; j++) {
2174
2694
  objects.push(newObjects[j]);
2175
2695
  }
2176
- }
2696
+ } // instance nodes
2697
+
2698
+
2177
2699
  for (let i = 0, l = instanceNodes.length; i < l; i++) {
2178
2700
  objects.push(getNode(instanceNodes[i]).clone());
2179
2701
  }
2702
+
2180
2703
  let object;
2704
+
2181
2705
  if (nodes.length === 0 && objects.length === 1) {
2182
2706
  object = objects[0];
2183
2707
  } else {
2184
- object = type === "JOINT" ? new THREE.Bone() : new THREE.Group();
2708
+ object = type === 'JOINT' ? new Bone() : new Group();
2709
+
2185
2710
  for (let i = 0; i < objects.length; i++) {
2186
2711
  object.add(objects[i]);
2187
2712
  }
2188
2713
  }
2189
- object.name = type === "JOINT" ? data.sid : data.name;
2190
- object.matrix.copy(matrix2);
2714
+
2715
+ object.name = type === 'JOINT' ? data.sid : data.name;
2716
+ object.matrix.copy(matrix);
2191
2717
  object.matrix.decompose(object.position, object.quaternion, object.scale);
2192
2718
  return object;
2193
2719
  }
2194
- const fallbackMaterial = new THREE.MeshBasicMaterial({ color: 16711935 });
2720
+
2721
+ const fallbackMaterial = new MeshBasicMaterial({
2722
+ color: 0xff00ff
2723
+ });
2724
+
2195
2725
  function resolveMaterialBinding(keys, instanceMaterials) {
2196
2726
  const materials = [];
2727
+
2197
2728
  for (let i = 0, l = keys.length; i < l; i++) {
2198
2729
  const id = instanceMaterials[keys[i]];
2199
- if (id === void 0) {
2200
- console.warn("THREE.ColladaLoader: Material with key %s not found. Apply fallback material.", keys[i]);
2730
+
2731
+ if (id === undefined) {
2732
+ console.warn('THREE.ColladaLoader: Material with key %s not found. Apply fallback material.', keys[i]);
2201
2733
  materials.push(fallbackMaterial);
2202
2734
  } else {
2203
2735
  materials.push(getMaterial(id));
2204
2736
  }
2205
2737
  }
2738
+
2206
2739
  return materials;
2207
2740
  }
2741
+
2208
2742
  function buildObjects(geometries, instanceMaterials) {
2209
2743
  const objects = [];
2744
+
2210
2745
  for (const type in geometries) {
2211
2746
  const geometry = geometries[type];
2212
- const materials = resolveMaterialBinding(geometry.materialKeys, instanceMaterials);
2747
+ const materials = resolveMaterialBinding(geometry.materialKeys, instanceMaterials); // handle case if no materials are defined
2748
+
2213
2749
  if (materials.length === 0) {
2214
- if (type === "lines" || type === "linestrips") {
2215
- materials.push(new THREE.LineBasicMaterial());
2750
+ if (type === 'lines' || type === 'linestrips') {
2751
+ materials.push(new LineBasicMaterial());
2216
2752
  } else {
2217
- materials.push(new THREE.MeshPhongMaterial());
2753
+ materials.push(new MeshPhongMaterial());
2218
2754
  }
2219
- }
2220
- const skinning = geometry.data.attributes.skinIndex !== void 0;
2221
- const material = materials.length === 1 ? materials[0] : materials;
2755
+ } // regard skinning
2756
+
2757
+
2758
+ const skinning = geometry.data.attributes.skinIndex !== undefined; // choose between a single or multi materials (material array)
2759
+
2760
+ const material = materials.length === 1 ? materials[0] : materials; // now create a specific 3D object
2761
+
2222
2762
  let object;
2763
+
2223
2764
  switch (type) {
2224
- case "lines":
2225
- object = new THREE.LineSegments(geometry.data, material);
2765
+ case 'lines':
2766
+ object = new LineSegments(geometry.data, material);
2226
2767
  break;
2227
- case "linestrips":
2228
- object = new THREE.Line(geometry.data, material);
2768
+
2769
+ case 'linestrips':
2770
+ object = new Line(geometry.data, material);
2229
2771
  break;
2230
- case "triangles":
2231
- case "polylist":
2772
+
2773
+ case 'triangles':
2774
+ case 'polylist':
2232
2775
  if (skinning) {
2233
- object = new THREE.SkinnedMesh(geometry.data, material);
2776
+ object = new SkinnedMesh(geometry.data, material);
2234
2777
  } else {
2235
- object = new THREE.Mesh(geometry.data, material);
2778
+ object = new Mesh(geometry.data, material);
2236
2779
  }
2780
+
2237
2781
  break;
2238
2782
  }
2783
+
2239
2784
  objects.push(object);
2240
2785
  }
2786
+
2241
2787
  return objects;
2242
2788
  }
2789
+
2243
2790
  function hasNode(id) {
2244
- return library.nodes[id] !== void 0;
2791
+ return library.nodes[id] !== undefined;
2245
2792
  }
2793
+
2246
2794
  function getNode(id) {
2247
2795
  return getBuild(library.nodes[id], buildNode);
2248
- }
2249
- function parseVisualScene(xml2) {
2796
+ } // visual scenes
2797
+
2798
+
2799
+ function parseVisualScene(xml) {
2250
2800
  const data = {
2251
- name: xml2.getAttribute("name"),
2801
+ name: xml.getAttribute('name'),
2252
2802
  children: []
2253
2803
  };
2254
- prepareNodes(xml2);
2255
- const elements = getElementsByTagName(xml2, "node");
2804
+ prepareNodes(xml);
2805
+ const elements = getElementsByTagName(xml, 'node');
2806
+
2256
2807
  for (let i = 0; i < elements.length; i++) {
2257
2808
  data.children.push(parseNode(elements[i]));
2258
2809
  }
2259
- library.visualScenes[xml2.getAttribute("id")] = data;
2810
+
2811
+ library.visualScenes[xml.getAttribute('id')] = data;
2260
2812
  }
2813
+
2261
2814
  function buildVisualScene(data) {
2262
- const group = new THREE.Group();
2815
+ const group = new Group();
2263
2816
  group.name = data.name;
2264
2817
  const children = data.children;
2818
+
2265
2819
  for (let i = 0; i < children.length; i++) {
2266
2820
  const child = children[i];
2267
2821
  group.add(getNode(child.id));
2268
2822
  }
2823
+
2269
2824
  return group;
2270
2825
  }
2826
+
2271
2827
  function hasVisualScene(id) {
2272
- return library.visualScenes[id] !== void 0;
2828
+ return library.visualScenes[id] !== undefined;
2273
2829
  }
2830
+
2274
2831
  function getVisualScene(id) {
2275
2832
  return getBuild(library.visualScenes[id], buildVisualScene);
2276
- }
2277
- function parseScene(xml2) {
2278
- const instance = getElementsByTagName(xml2, "instance_visual_scene")[0];
2279
- return getVisualScene(parseId(instance.getAttribute("url")));
2280
- }
2833
+ } // scenes
2834
+
2835
+
2836
+ function parseScene(xml) {
2837
+ const instance = getElementsByTagName(xml, 'instance_visual_scene')[0];
2838
+ return getVisualScene(parseId(instance.getAttribute('url')));
2839
+ }
2840
+
2281
2841
  function setupAnimations() {
2282
2842
  const clips = library.clips;
2843
+
2283
2844
  if (isEmpty(clips) === true) {
2284
2845
  if (isEmpty(library.animations) === false) {
2846
+ // if there are animations but no clips, we create a default clip for playback
2285
2847
  const tracks = [];
2848
+
2286
2849
  for (const id in library.animations) {
2287
2850
  const animationTracks = getAnimation(id);
2851
+
2288
2852
  for (let i = 0, l = animationTracks.length; i < l; i++) {
2289
2853
  tracks.push(animationTracks[i]);
2290
2854
  }
2291
2855
  }
2292
- animations.push(new THREE.AnimationClip("default", -1, tracks));
2856
+
2857
+ animations.push(new AnimationClip('default', -1, tracks));
2293
2858
  }
2294
2859
  } else {
2295
2860
  for (const id in clips) {
2296
2861
  animations.push(getAnimationClip(id));
2297
2862
  }
2298
2863
  }
2299
- }
2300
- function parserErrorToText(parserError2) {
2301
- let result = "";
2302
- const stack = [parserError2];
2864
+ } // convert the parser error element into text with each child elements text
2865
+ // separated by new lines.
2866
+
2867
+
2868
+ function parserErrorToText(parserError) {
2869
+ let result = '';
2870
+ const stack = [parserError];
2871
+
2303
2872
  while (stack.length) {
2304
2873
  const node = stack.shift();
2874
+
2305
2875
  if (node.nodeType === Node.TEXT_NODE) {
2306
2876
  result += node.textContent;
2307
2877
  } else {
2308
- result += "\n";
2878
+ result += '\n';
2309
2879
  stack.push.apply(stack, node.childNodes);
2310
2880
  }
2311
2881
  }
2882
+
2312
2883
  return result.trim();
2313
2884
  }
2885
+
2314
2886
  if (text.length === 0) {
2315
- return { scene: new THREE.Scene() };
2887
+ return {
2888
+ scene: new Scene()
2889
+ };
2316
2890
  }
2317
- const xml = new DOMParser().parseFromString(text, "application/xml");
2318
- const collada = getElementsByTagName(xml, "COLLADA")[0];
2319
- const parserError = xml.getElementsByTagName("parsererror")[0];
2320
- if (parserError !== void 0) {
2321
- const errorElement = getElementsByTagName(parserError, "div")[0];
2891
+
2892
+ const xml = new DOMParser().parseFromString(text, 'application/xml');
2893
+ const collada = getElementsByTagName(xml, 'COLLADA')[0];
2894
+ const parserError = xml.getElementsByTagName('parsererror')[0];
2895
+
2896
+ if (parserError !== undefined) {
2897
+ // Chrome will return parser error with a div in it
2898
+ const errorElement = getElementsByTagName(parserError, 'div')[0];
2322
2899
  let errorText;
2900
+
2323
2901
  if (errorElement) {
2324
2902
  errorText = errorElement.textContent;
2325
2903
  } else {
2326
2904
  errorText = parserErrorToText(parserError);
2327
2905
  }
2328
- console.error("THREE.ColladaLoader: Failed to parse collada file.\n", errorText);
2906
+
2907
+ console.error('THREE.ColladaLoader: Failed to parse collada file.\n', errorText);
2329
2908
  return null;
2330
- }
2331
- const version = collada.getAttribute("version");
2332
- console.log("THREE.ColladaLoader: File version", version);
2333
- const asset = parseAsset(getElementsByTagName(collada, "asset")[0]);
2334
- const textureLoader = new THREE.TextureLoader(this.manager);
2909
+ } // metadata
2910
+
2911
+
2912
+ const version = collada.getAttribute('version');
2913
+ console.log('THREE.ColladaLoader: File version', version);
2914
+ const asset = parseAsset(getElementsByTagName(collada, 'asset')[0]);
2915
+ const textureLoader = new TextureLoader(this.manager);
2335
2916
  textureLoader.setPath(this.resourcePath || path).setCrossOrigin(this.crossOrigin);
2336
2917
  let tgaLoader;
2337
- if (TGALoader.TGALoader) {
2338
- tgaLoader = new TGALoader.TGALoader(this.manager);
2918
+
2919
+ if (TGALoader) {
2920
+ tgaLoader = new TGALoader(this.manager);
2339
2921
  tgaLoader.setPath(this.resourcePath || path);
2340
- }
2922
+ } //
2923
+
2924
+
2341
2925
  const animations = [];
2342
2926
  let kinematics = {};
2343
- let count = 0;
2927
+ let count = 0; //
2928
+
2344
2929
  const library = {
2345
2930
  animations: {},
2346
2931
  clips: {},
@@ -2357,20 +2942,20 @@ class ColladaLoader extends THREE.Loader {
2357
2942
  physicsModels: {},
2358
2943
  kinematicsScenes: {}
2359
2944
  };
2360
- parseLibrary(collada, "library_animations", "animation", parseAnimation);
2361
- parseLibrary(collada, "library_animation_clips", "animation_clip", parseAnimationClip);
2362
- parseLibrary(collada, "library_controllers", "controller", parseController);
2363
- parseLibrary(collada, "library_images", "image", parseImage);
2364
- parseLibrary(collada, "library_effects", "effect", parseEffect);
2365
- parseLibrary(collada, "library_materials", "material", parseMaterial);
2366
- parseLibrary(collada, "library_cameras", "camera", parseCamera);
2367
- parseLibrary(collada, "library_lights", "light", parseLight);
2368
- parseLibrary(collada, "library_geometries", "geometry", parseGeometry);
2369
- parseLibrary(collada, "library_nodes", "node", parseNode);
2370
- parseLibrary(collada, "library_visual_scenes", "visual_scene", parseVisualScene);
2371
- parseLibrary(collada, "library_kinematics_models", "kinematics_model", parseKinematicsModel);
2372
- parseLibrary(collada, "library_physics_models", "physics_model", parsePhysicsModel);
2373
- parseLibrary(collada, "scene", "instance_kinematics_scene", parseKinematicsScene);
2945
+ parseLibrary(collada, 'library_animations', 'animation', parseAnimation);
2946
+ parseLibrary(collada, 'library_animation_clips', 'animation_clip', parseAnimationClip);
2947
+ parseLibrary(collada, 'library_controllers', 'controller', parseController);
2948
+ parseLibrary(collada, 'library_images', 'image', parseImage);
2949
+ parseLibrary(collada, 'library_effects', 'effect', parseEffect);
2950
+ parseLibrary(collada, 'library_materials', 'material', parseMaterial);
2951
+ parseLibrary(collada, 'library_cameras', 'camera', parseCamera);
2952
+ parseLibrary(collada, 'library_lights', 'light', parseLight);
2953
+ parseLibrary(collada, 'library_geometries', 'geometry', parseGeometry);
2954
+ parseLibrary(collada, 'library_nodes', 'node', parseNode);
2955
+ parseLibrary(collada, 'library_visual_scenes', 'visual_scene', parseVisualScene);
2956
+ parseLibrary(collada, 'library_kinematics_models', 'kinematics_model', parseKinematicsModel);
2957
+ parseLibrary(collada, 'library_physics_models', 'physics_model', parsePhysicsModel);
2958
+ parseLibrary(collada, 'scene', 'instance_kinematics_scene', parseKinematicsScene);
2374
2959
  buildLibrary(library.animations, buildAnimation);
2375
2960
  buildLibrary(library.clips, buildAnimationClip);
2376
2961
  buildLibrary(library.controllers, buildController);
@@ -2383,21 +2968,26 @@ class ColladaLoader extends THREE.Loader {
2383
2968
  buildLibrary(library.visualScenes, buildVisualScene);
2384
2969
  setupAnimations();
2385
2970
  setupKinematics();
2386
- const scene = parseScene(getElementsByTagName(collada, "scene")[0]);
2971
+ const scene = parseScene(getElementsByTagName(collada, 'scene')[0]);
2387
2972
  scene.animations = animations;
2388
- if (asset.upAxis === "Z_UP") {
2389
- scene.quaternion.setFromEuler(new THREE.Euler(-Math.PI / 2, 0, 0));
2973
+
2974
+ if (asset.upAxis === 'Z_UP') {
2975
+ scene.quaternion.setFromEuler(new Euler(-Math.PI / 2, 0, 0));
2390
2976
  }
2977
+
2391
2978
  scene.scale.multiplyScalar(asset.unit);
2392
2979
  return {
2393
2980
  get animations() {
2394
- console.warn("THREE.ColladaLoader: Please access animations over scene.animations now.");
2981
+ console.warn('THREE.ColladaLoader: Please access animations over scene.animations now.');
2395
2982
  return animations;
2396
2983
  },
2397
- kinematics,
2398
- library,
2399
- scene
2984
+
2985
+ kinematics: kinematics,
2986
+ library: library,
2987
+ scene: scene
2400
2988
  };
2401
2989
  }
2990
+
2402
2991
  }
2403
- exports.ColladaLoader = ColladaLoader;
2992
+
2993
+ export { ColladaLoader };