three-stdlib 2.16.0 → 2.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1219) 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.d.ts +5 -4
  25. package/controls/FlyControls.js +160 -90
  26. package/controls/OrbitControls.cjs.js +1 -0
  27. package/controls/OrbitControls.js +481 -232
  28. package/controls/PointerLockControls.cjs.js +1 -0
  29. package/controls/PointerLockControls.js +99 -63
  30. package/controls/TrackballControls.cjs.js +1 -0
  31. package/controls/TrackballControls.js +383 -211
  32. package/controls/TransformControls.cjs.js +1 -0
  33. package/controls/TransformControls.js +782 -575
  34. package/controls/experimental/CameraControls.cjs.js +1 -0
  35. package/controls/experimental/CameraControls.js +609 -329
  36. package/csm/CSM.cjs.js +1 -0
  37. package/csm/CSM.js +108 -47
  38. package/csm/CSMFrustum.cjs.js +1 -0
  39. package/csm/CSMFrustum.js +29 -14
  40. package/csm/CSMHelper.cjs.js +1 -0
  41. package/csm/CSMHelper.js +34 -20
  42. package/csm/CSMShader.cjs.js +1 -0
  43. package/csm/CSMShader.js +11 -7
  44. package/curves/CurveExtras.cjs.js +1 -0
  45. package/curves/CurveExtras.js +115 -73
  46. package/curves/NURBSCurve.cjs.js +1 -0
  47. package/curves/NURBSCurve.js +43 -15
  48. package/curves/NURBSSurface.cjs.js +1 -0
  49. package/curves/NURBSSurface.js +27 -11
  50. package/curves/NURBSUtils.cjs.js +1 -0
  51. package/curves/NURBSUtils.js +203 -54
  52. package/custom.d.cjs.js +1 -0
  53. package/{shaders/types.mjs → custom.d.js} +0 -0
  54. package/deprecated/Geometry.cjs.js +1 -0
  55. package/deprecated/Geometry.js +486 -191
  56. package/effects/AnaglyphEffect.cjs.js +1 -0
  57. package/effects/AnaglyphEffect.js +60 -95
  58. package/effects/AsciiEffect.cjs.js +1 -0
  59. package/effects/AsciiEffect.js +110 -80
  60. package/effects/OutlineEffect.cjs.js +1 -0
  61. package/effects/OutlineEffect.js +204 -121
  62. package/effects/ParallaxBarrierEffect.cjs.js +1 -0
  63. package/effects/ParallaxBarrierEffect.js +38 -39
  64. package/effects/PeppersGhostEffect.cjs.js +1 -0
  65. package/effects/PeppersGhostEffect.js +68 -19
  66. package/effects/StereoEffect.cjs.js +1 -0
  67. package/effects/StereoEffect.js +16 -12
  68. package/environments/RoomEnvironment.cjs.js +1 -0
  69. package/environments/RoomEnvironment.js +47 -52
  70. package/exporters/ColladaExporter.cjs.js +1 -0
  71. package/exporters/ColladaExporter.js +241 -115
  72. package/exporters/DRACOExporter.cjs.js +1 -0
  73. package/exporters/DRACOExporter.js +121 -67
  74. package/exporters/GLTFExporter.cjs.js +1 -0
  75. package/exporters/GLTFExporter.js +1014 -463
  76. package/exporters/MMDExporter.cjs.js +1 -0
  77. package/exporters/MMDExporter.js +102 -44
  78. package/exporters/OBJExporter.cjs.js +1 -0
  79. package/exporters/OBJExporter.js +140 -78
  80. package/exporters/PLYExporter.cjs.js +1 -0
  81. package/exporters/PLYExporter.js +154 -93
  82. package/exporters/STLExporter.cjs.js +1 -0
  83. package/exporters/STLExporter.js +81 -30
  84. package/exporters/USDZExporter.cjs.js +1 -0
  85. package/exporters/USDZExporter.js +144 -84
  86. package/geometries/BoxLineGeometry.cjs.js +1 -0
  87. package/geometries/BoxLineGeometry.js +14 -7
  88. package/geometries/ConvexGeometry.cjs.js +1 -0
  89. package/geometries/ConvexGeometry.js +23 -14
  90. package/geometries/DecalGeometry.cjs.js +1 -0
  91. package/geometries/DecalGeometry.js +162 -108
  92. package/geometries/LightningStrike.cjs.js +1 -0
  93. package/geometries/LightningStrike.js +294 -101
  94. package/geometries/ParametricGeometries.cjs.js +1 -0
  95. package/geometries/ParametricGeometries.js +76 -26
  96. package/geometries/ParametricGeometry.cjs.js +1 -0
  97. package/geometries/ParametricGeometry.js +48 -24
  98. package/geometries/RoundedBoxGeometry.cjs.js +1 -0
  99. package/geometries/RoundedBoxGeometry.js +64 -33
  100. package/geometries/TeapotGeometry.cjs.js +1 -0
  101. package/geometries/TeapotGeometry.js +174 -1434
  102. package/geometries/TextGeometry.cjs.js +1 -0
  103. package/geometries/TextGeometry.js +17 -9
  104. package/helpers/LightProbeHelper.cjs.js +1 -0
  105. package/helpers/LightProbeHelper.js +21 -53
  106. package/helpers/PositionalAudioHelper.cjs.js +1 -0
  107. package/helpers/PositionalAudioHelper.js +30 -23
  108. package/helpers/RectAreaLightHelper.cjs.js +1 -0
  109. package/helpers/RectAreaLightHelper.js +33 -17
  110. package/helpers/VertexNormalsHelper.cjs.js +1 -0
  111. package/helpers/VertexNormalsHelper.js +41 -20
  112. package/helpers/VertexTangentsHelper.cjs.js +1 -0
  113. package/helpers/VertexTangentsHelper.js +36 -18
  114. package/index.cjs.js +1 -0
  115. package/index.js +333 -969
  116. package/interactive/InteractiveGroup.cjs.js +1 -0
  117. package/interactive/InteractiveGroup.d.ts +5 -0
  118. package/interactive/InteractiveGroup.js +87 -0
  119. package/interactive/SelectionBox.cjs.js +1 -0
  120. package/interactive/SelectionBox.js +46 -31
  121. package/interactive/SelectionHelper.cjs.js +1 -0
  122. package/interactive/SelectionHelper.js +21 -16
  123. package/libs/MeshoptDecoder.cjs.js +1 -0
  124. package/libs/MeshoptDecoder.js +58 -147
  125. package/libs/MotionControllers.cjs.js +1 -0
  126. package/libs/MotionControllers.js +208 -66
  127. package/lights/LightProbeGenerator.cjs.js +1 -0
  128. package/lights/LightProbeGenerator.js +96 -40
  129. package/lights/RectAreaLightUniformsLib.cjs.js +1 -0
  130. package/lights/RectAreaLightUniformsLib.js +9 -32842
  131. package/lines/Line2.cjs.js +1 -0
  132. package/lines/Line2.js +12 -9
  133. package/lines/LineGeometry.cjs.js +1 -0
  134. package/lines/LineGeometry.js +19 -7
  135. package/lines/LineMaterial.cjs.js +1 -0
  136. package/lines/LineMaterial.js +89 -51
  137. package/lines/LineSegments2.cjs.js +1 -0
  138. package/lines/LineSegments2.js +165 -56
  139. package/lines/LineSegmentsGeometry.cjs.js +1 -0
  140. package/lines/LineSegmentsGeometry.js +71 -29
  141. package/lines/Wireframe.cjs.js +1 -0
  142. package/lines/Wireframe.js +29 -15
  143. package/lines/WireframeGeometry2.cjs.js +1 -0
  144. package/lines/WireframeGeometry2.js +9 -8
  145. package/loaders/3DMLoader.cjs.js +1 -0
  146. package/loaders/3DMLoader.js +469 -234
  147. package/loaders/3MFLoader.cjs.js +1 -0
  148. package/loaders/3MFLoader.js +555 -340
  149. package/loaders/AMFLoader.cjs.js +1 -0
  150. package/loaders/AMFLoader.js +219 -114
  151. package/loaders/AssimpLoader.cjs.js +1 -0
  152. package/loaders/AssimpLoader.js +725 -328
  153. package/loaders/BVHLoader.cjs.js +1 -0
  154. package/loaders/BVHLoader.js +200 -94
  155. package/loaders/BasisTextureLoader.cjs.js +1 -0
  156. package/loaders/BasisTextureLoader.js +357 -229
  157. package/loaders/ColladaLoader.cjs.js +1 -0
  158. package/loaders/ColladaLoader.js +1522 -932
  159. package/loaders/DDSLoader.cjs.js +1 -0
  160. package/loaders/DDSLoader.js +108 -42
  161. package/loaders/DRACOLoader.cjs.js +1 -0
  162. package/loaders/DRACOLoader.js +210 -103
  163. package/loaders/EXRLoader.cjs.js +1 -0
  164. package/loaders/EXRLoader.js +809 -461
  165. package/loaders/FBXLoader.cjs.js +1 -0
  166. package/loaders/FBXLoader.js +1397 -842
  167. package/loaders/FontLoader.cjs.js +1 -0
  168. package/loaders/FontLoader.js +66 -33
  169. package/loaders/GCodeLoader.cjs.js +1 -0
  170. package/loaders/GCodeLoader.js +111 -63
  171. package/loaders/GLTFLoader.cjs.js +1 -0
  172. package/loaders/GLTFLoader.js +1484 -771
  173. package/loaders/HDRCubeTextureLoader.cjs.js +1 -0
  174. package/loaders/HDRCubeTextureLoader.js +50 -45
  175. package/loaders/KMZLoader.cjs.js +1 -0
  176. package/loaders/KMZLoader.js +55 -42
  177. package/loaders/KTX2Loader.cjs.js +1 -0
  178. package/loaders/KTX2Loader.js +362 -229
  179. package/loaders/KTXLoader.cjs.js +1 -0
  180. package/loaders/KTXLoader.js +99 -37
  181. package/loaders/LDrawLoader.cjs.js +1 -0
  182. package/loaders/LDrawLoader.js +746 -313
  183. package/loaders/LUT3dlLoader.cjs.js +1 -0
  184. package/loaders/LUT3dlLoader.js +62 -50
  185. package/loaders/LUTCubeLoader.cjs.js +1 -0
  186. package/loaders/LUTCubeLoader.js +56 -45
  187. package/loaders/LWOLoader.cjs.js +1 -0
  188. package/loaders/LWOLoader.js +339 -227
  189. package/loaders/LottieLoader.cjs.js +1 -0
  190. package/loaders/LottieLoader.js +38 -36
  191. package/loaders/MD2Loader.cjs.js +1 -0
  192. package/loaders/MD2Loader.js +91 -248
  193. package/loaders/MDDLoader.cjs.js +1 -0
  194. package/loaders/MDDLoader.js +45 -25
  195. package/loaders/MMDLoader.cjs.js +1 -0
  196. package/loaders/MMDLoader.js +795 -359
  197. package/loaders/MTLLoader.cjs.js +1 -0
  198. package/loaders/MTLLoader.js +201 -91
  199. package/loaders/NRRDLoader.cjs.js +1 -0
  200. package/loaders/NRRDLoader.js +263 -182
  201. package/loaders/NodeMaterialLoader.cjs.js +1 -0
  202. package/loaders/NodeMaterialLoader.js +14 -121
  203. package/loaders/OBJLoader.cjs.js +1 -0
  204. package/loaders/OBJLoader.js +283 -161
  205. package/loaders/PCDLoader.cjs.js +1 -0
  206. package/loaders/PCDLoader.js +164 -145
  207. package/loaders/PDBLoader.cjs.js +1 -0
  208. package/loaders/PDBLoader.js +63 -45
  209. package/loaders/PLYLoader.cjs.js +1 -0
  210. package/loaders/PLYLoader.js +203 -106
  211. package/loaders/PRWMLoader.cjs.js +1 -0
  212. package/loaders/PRWMLoader.js +110 -73
  213. package/loaders/PVRLoader.cjs.js +1 -0
  214. package/loaders/PVRLoader.js +93 -32
  215. package/loaders/RGBELoader.cjs.js +1 -0
  216. package/loaders/RGBELoader.js +233 -96
  217. package/loaders/RGBMLoader.cjs.js +1 -0
  218. package/loaders/RGBMLoader.js +514 -344
  219. package/loaders/STLLoader.cjs.js +1 -0
  220. package/loaders/STLLoader.js +165 -59
  221. package/loaders/SVGLoader.cjs.js +1 -0
  222. package/loaders/SVGLoader.js +851 -481
  223. package/loaders/TDSLoader.cjs.js +1 -0
  224. package/loaders/TDSLoader.js +527 -137
  225. package/loaders/TGALoader.cjs.js +1 -0
  226. package/loaders/TGALoader.js +205 -94
  227. package/loaders/TTFLoader.cjs.js +1 -0
  228. package/loaders/TTFLoader.js +79 -58
  229. package/loaders/TiltLoader.cjs.js +1 -0
  230. package/loaders/TiltLoader.js +167 -129
  231. package/loaders/VOXLoader.cjs.js +1 -0
  232. package/loaders/VOXLoader.js +84 -320
  233. package/loaders/VRMLLoader.cjs.js +1 -0
  234. package/loaders/VRMLLoader.js +1268 -786
  235. package/loaders/VRMLoader.cjs.js +1 -0
  236. package/loaders/VRMLoader.js +31 -23
  237. package/loaders/VTKLoader.cjs.js +1 -0
  238. package/loaders/VTKLoader.js +407 -219
  239. package/loaders/XLoader.cjs.js +1 -0
  240. package/loaders/XLoader.js +1259 -1083
  241. package/loaders/XYZLoader.cjs.js +1 -0
  242. package/loaders/XYZLoader.js +34 -28
  243. package/loaders/lwo/IFFParser.cjs.js +1 -0
  244. package/loaders/lwo/IFFParser.js +492 -238
  245. package/loaders/lwo/LWO2Parser.cjs.js +1 -0
  246. package/loaders/lwo/LWO2Parser.js +279 -176
  247. package/loaders/lwo/LWO3Parser.cjs.js +1 -0
  248. package/loaders/lwo/LWO3Parser.js +247 -160
  249. package/math/Capsule.cjs.js +1 -0
  250. package/math/Capsule.js +43 -56
  251. package/math/ColorConverter.cjs.js +1 -0
  252. package/math/ColorConverter.js +32 -18
  253. package/math/ConvexHull.cjs.js +1 -0
  254. package/math/ConvexHull.js +357 -97
  255. package/math/ImprovedNoise.cjs.js +1 -0
  256. package/math/ImprovedNoise.js +32 -282
  257. package/math/Lut.cjs.js +1 -0
  258. package/math/Lut.js +35 -51
  259. package/math/MeshSurfaceSampler.cjs.js +1 -0
  260. package/math/MeshSurfaceSampler.js +68 -25
  261. package/math/OBB.cjs.js +1 -0
  262. package/math/OBB.js +152 -91
  263. package/math/Octree.cjs.js +1 -0
  264. package/math/Octree.js +139 -76
  265. package/math/SimplexNoise.cjs.js +1 -0
  266. package/math/SimplexNoise.js +238 -217
  267. package/misc/ConvexObjectBreaker.cjs.js +1 -0
  268. package/misc/ConvexObjectBreaker.js +185 -79
  269. package/misc/GPUComputationRenderer.cjs.js +1 -0
  270. package/misc/GPUComputationRenderer.js +194 -69
  271. package/misc/Gyroscope.cjs.js +1 -0
  272. package/misc/Gyroscope.js +22 -16
  273. package/misc/MD2Character.cjs.js +1 -0
  274. package/misc/MD2Character.js +74 -52
  275. package/misc/MD2CharacterComplex.cjs.js +1 -0
  276. package/misc/MD2CharacterComplex.js +163 -112
  277. package/misc/MorphAnimMesh.cjs.js +1 -0
  278. package/misc/MorphAnimMesh.js +28 -20
  279. package/misc/MorphBlendMesh.cjs.js +1 -0
  280. package/misc/MorphBlendMesh.js +69 -45
  281. package/misc/ProgressiveLightmap.cjs.js +1 -0
  282. package/misc/ProgressiveLightmap.js +187 -70
  283. package/misc/RollerCoaster.cjs.js +1 -0
  284. package/misc/RollerCoaster.js +135 -106
  285. package/misc/TubePainter.cjs.js +1 -0
  286. package/misc/TubePainter.js +92 -74
  287. package/misc/Volume.cjs.js +1 -0
  288. package/misc/Volume.js +270 -108
  289. package/misc/VolumeSlice.cjs.js +1 -0
  290. package/misc/VolumeSlice.js +122 -34
  291. package/misc/WebGL.cjs.js +1 -0
  292. package/misc/WebGL.js +34 -37
  293. package/modifiers/CurveModifier.cjs.js +1 -0
  294. package/modifiers/CurveModifier.js +151 -46
  295. package/modifiers/EdgeSplitModifier.cjs.js +1 -0
  296. package/modifiers/EdgeSplitModifier.js +90 -46
  297. package/modifiers/SimplifyModifier.cjs.js +1 -0
  298. package/modifiers/SimplifyModifier.js +202 -77
  299. package/modifiers/TessellateModifier.cjs.js +1 -0
  300. package/modifiers/TessellateModifier.js +90 -65
  301. package/nodes/Nodes.cjs.js +1 -0
  302. package/nodes/Nodes.js +140 -274
  303. package/nodes/ShaderNode.cjs.js +1 -0
  304. package/nodes/ShaderNode.js +196 -296
  305. package/nodes/accessors/BufferNode.cjs.js +1 -0
  306. package/nodes/accessors/BufferNode.js +8 -4
  307. package/nodes/accessors/CameraNode.cjs.js +1 -0
  308. package/nodes/accessors/CameraNode.js +25 -20
  309. package/nodes/accessors/CubeTextureNode.cjs.js +1 -0
  310. package/nodes/accessors/CubeTextureNode.js +26 -14
  311. package/nodes/accessors/MaterialNode.cjs.js +1 -0
  312. package/nodes/accessors/MaterialNode.js +53 -43
  313. package/nodes/accessors/MaterialReferenceNode.cjs.js +1 -0
  314. package/nodes/accessors/MaterialReferenceNode.js +6 -3
  315. package/nodes/accessors/ModelNode.cjs.js +1 -0
  316. package/nodes/accessors/ModelNode.js +5 -3
  317. package/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
  318. package/nodes/accessors/ModelViewProjectionNode.js +13 -14
  319. package/nodes/accessors/NormalNode.cjs.js +1 -0
  320. package/nodes/accessors/NormalNode.js +39 -40
  321. package/nodes/accessors/Object3DNode.cjs.js +1 -0
  322. package/nodes/accessors/Object3DNode.js +50 -40
  323. package/nodes/accessors/PointUVNode.cjs.js +1 -0
  324. package/nodes/accessors/PointUVNode.js +9 -5
  325. package/nodes/accessors/PositionNode.cjs.js +1 -0
  326. package/nodes/accessors/PositionNode.js +41 -42
  327. package/nodes/accessors/ReferenceNode.cjs.js +1 -0
  328. package/nodes/accessors/ReferenceNode.js +17 -10
  329. package/nodes/accessors/ReflectNode.cjs.js +1 -0
  330. package/nodes/accessors/ReflectNode.js +26 -23
  331. package/nodes/accessors/SkinningNode.cjs.js +1 -0
  332. package/nodes/accessors/SkinningNode.js +48 -46
  333. package/nodes/accessors/TextureNode.cjs.js +1 -0
  334. package/nodes/accessors/TextureNode.js +29 -14
  335. package/nodes/accessors/UVNode.cjs.js +1 -0
  336. package/nodes/accessors/UVNode.js +11 -5
  337. package/nodes/core/ArrayUniformNode.cjs.js +1 -0
  338. package/nodes/core/ArrayUniformNode.js +7 -3
  339. package/nodes/core/AttributeNode.cjs.js +1 -0
  340. package/nodes/core/AttributeNode.js +12 -5
  341. package/nodes/core/BypassNode.cjs.js +1 -0
  342. package/nodes/core/BypassNode.js +12 -5
  343. package/nodes/core/CodeNode.cjs.js +1 -0
  344. package/nodes/core/CodeNode.js +12 -4
  345. package/nodes/core/ConstNode.cjs.js +1 -0
  346. package/nodes/core/ConstNode.js +7 -3
  347. package/nodes/core/ContextNode.cjs.js +1 -0
  348. package/nodes/core/ContextNode.js +8 -3
  349. package/nodes/core/ExpressionNode.cjs.js +1 -0
  350. package/nodes/core/ExpressionNode.js +9 -5
  351. package/nodes/core/FunctionCallNode.cjs.js +1 -0
  352. package/nodes/core/FunctionCallNode.js +15 -6
  353. package/nodes/core/FunctionNode.cjs.js +1 -0
  354. package/nodes/core/FunctionNode.js +25 -10
  355. package/nodes/core/InputNode.cjs.js +1 -0
  356. package/nodes/core/InputNode.js +23 -12
  357. package/nodes/core/Node.cjs.js +1 -0
  358. package/nodes/core/Node.js +75 -35
  359. package/nodes/core/NodeAttribute.cjs.js +1 -0
  360. package/nodes/core/NodeAttribute.js +4 -2
  361. package/nodes/core/NodeBuilder.cjs.js +1 -0
  362. package/nodes/core/NodeBuilder.js +224 -110
  363. package/nodes/core/NodeCode.cjs.js +1 -0
  364. package/nodes/core/NodeCode.js +7 -4
  365. package/nodes/core/NodeFrame.cjs.js +1 -0
  366. package/nodes/core/NodeFrame.js +12 -9
  367. package/nodes/core/NodeFunction.cjs.js +1 -0
  368. package/nodes/core/NodeFunction.js +17 -0
  369. package/nodes/core/NodeFunctionInput.cjs.js +1 -0
  370. package/nodes/core/NodeFunctionInput.js +5 -3
  371. package/nodes/core/NodeKeywords.cjs.js +1 -0
  372. package/nodes/core/NodeKeywords.js +16 -5
  373. package/nodes/core/NodeParser.cjs.js +1 -0
  374. package/nodes/core/NodeParser.js +8 -0
  375. package/nodes/core/NodeUniform.cjs.js +1 -0
  376. package/nodes/core/NodeUniform.js +7 -3
  377. package/nodes/core/NodeUtils.cjs.js +1 -0
  378. package/nodes/core/NodeUtils.js +43 -39
  379. package/nodes/core/NodeVar.cjs.js +1 -0
  380. package/nodes/core/NodeVar.js +4 -2
  381. package/nodes/core/NodeVary.cjs.js +1 -0
  382. package/nodes/core/NodeVary.js +4 -2
  383. package/nodes/core/PropertyNode.cjs.js +1 -0
  384. package/nodes/core/PropertyNode.js +10 -4
  385. package/nodes/core/TempNode.cjs.js +1 -0
  386. package/nodes/core/TempNode.js +11 -5
  387. package/nodes/core/UniformNode.cjs.js +1 -0
  388. package/nodes/core/UniformNode.js +10 -4
  389. package/nodes/core/VarNode.cjs.js +1 -0
  390. package/nodes/core/VarNode.js +11 -3
  391. package/nodes/core/VaryNode.cjs.js +1 -0
  392. package/nodes/core/VaryNode.js +15 -6
  393. package/nodes/core/constants.cjs.js +1 -0
  394. package/nodes/core/constants.js +7 -20
  395. package/nodes/display/ColorSpaceNode.cjs.js +1 -0
  396. package/nodes/display/ColorSpaceNode.js +38 -34
  397. package/nodes/display/NormalMapNode.cjs.js +1 -0
  398. package/nodes/display/NormalMapNode.js +53 -35
  399. package/nodes/fog/FogNode.cjs.js +1 -0
  400. package/nodes/fog/FogNode.js +9 -5
  401. package/nodes/fog/FogRangeNode.cjs.js +1 -0
  402. package/nodes/fog/FogRangeNode.js +9 -5
  403. package/nodes/functions/BSDFs.cjs.js +1 -0
  404. package/nodes/functions/BSDFs.js +118 -61
  405. package/nodes/functions/PhysicalMaterialFunctions.cjs.js +1 -0
  406. package/nodes/functions/PhysicalMaterialFunctions.js +57 -0
  407. package/nodes/lights/LightContextNode.cjs.js +1 -0
  408. package/nodes/lights/LightContextNode.js +23 -14
  409. package/nodes/lights/LightNode.cjs.js +1 -0
  410. package/nodes/lights/LightNode.js +31 -27
  411. package/nodes/lights/LightsNode.cjs.js +1 -0
  412. package/nodes/lights/LightsNode.js +28 -9
  413. package/nodes/loaders/NodeLoader.cjs.js +1 -0
  414. package/nodes/loaders/NodeLoader.js +42 -27
  415. package/nodes/loaders/NodeMaterialLoader.cjs.js +1 -0
  416. package/nodes/loaders/NodeMaterialLoader.js +10 -4
  417. package/nodes/loaders/NodeObjectLoader.cjs.js +1 -0
  418. package/nodes/loaders/NodeObjectLoader.js +19 -9
  419. package/nodes/materials/LineBasicNodeMaterial.cjs.js +1 -0
  420. package/nodes/materials/LineBasicNodeMaterial.js +10 -5
  421. package/nodes/materials/Materials.cjs.js +1 -0
  422. package/nodes/materials/Materials.js +17 -14
  423. package/nodes/materials/MeshBasicNodeMaterial.cjs.js +1 -0
  424. package/nodes/materials/MeshBasicNodeMaterial.js +10 -5
  425. package/nodes/materials/MeshStandardNodeMaterial.cjs.js +1 -0
  426. package/nodes/materials/MeshStandardNodeMaterial.js +8 -5
  427. package/nodes/materials/NodeMaterial.cjs.js +1 -0
  428. package/nodes/materials/NodeMaterial.js +36 -20
  429. package/nodes/materials/PointsNodeMaterial.cjs.js +1 -0
  430. package/nodes/materials/PointsNodeMaterial.js +10 -5
  431. package/nodes/math/CondNode.cjs.js +1 -0
  432. package/nodes/math/CondNode.js +23 -11
  433. package/nodes/math/MathNode.cjs.js +1 -0
  434. package/nodes/math/MathNode.js +142 -98
  435. package/nodes/math/OperatorNode.cjs.js +1 -0
  436. package/nodes/math/OperatorNode.js +46 -24
  437. package/nodes/parsers/GLSLNodeFunction.cjs.js +1 -0
  438. package/nodes/parsers/GLSLNodeFunction.js +101 -0
  439. package/nodes/parsers/GLSLNodeParser.cjs.js +1 -0
  440. package/nodes/parsers/GLSLNodeParser.js +13 -0
  441. package/nodes/parsers/WGSLNodeFunction.cjs.js +1 -0
  442. package/nodes/parsers/WGSLNodeFunction.js +71 -0
  443. package/nodes/parsers/WGSLNodeParser.cjs.js +1 -0
  444. package/nodes/parsers/WGSLNodeParser.js +13 -0
  445. package/nodes/procedural/CheckerNode.cjs.js +1 -0
  446. package/nodes/procedural/CheckerNode.js +19 -13
  447. package/nodes/utils/ArrayElementNode.cjs.js +1 -0
  448. package/nodes/utils/ArrayElementNode.js +8 -4
  449. package/nodes/utils/ConvertNode.cjs.js +1 -0
  450. package/nodes/utils/ConvertNode.js +8 -3
  451. package/nodes/utils/JoinNode.cjs.js +1 -0
  452. package/nodes/utils/JoinNode.js +11 -7
  453. package/nodes/utils/MatcapUVNode.cjs.js +1 -0
  454. package/nodes/utils/MatcapUVNode.js +11 -8
  455. package/nodes/utils/OscNode.cjs.js +1 -0
  456. package/nodes/utils/OscNode.js +33 -27
  457. package/nodes/utils/SplitNode.cjs.js +1 -0
  458. package/nodes/utils/SplitNode.js +20 -6
  459. package/nodes/utils/SpriteSheetUVNode.cjs.js +1 -0
  460. package/nodes/utils/SpriteSheetUVNode.js +23 -23
  461. package/nodes/utils/TimerNode.cjs.js +1 -0
  462. package/nodes/utils/TimerNode.js +24 -20
  463. package/objects/GroundProjectedEnv.cjs.js +1 -0
  464. package/objects/GroundProjectedEnv.js +37 -22
  465. package/objects/Lensflare.cjs.js +1 -0
  466. package/objects/Lensflare.js +156 -86
  467. package/objects/LightningStorm.cjs.js +1 -0
  468. package/objects/LightningStorm.js +102 -38
  469. package/objects/MarchingCubes.cjs.js +1 -0
  470. package/objects/MarchingCubes.js +303 -150
  471. package/objects/Reflector.cjs.js +1 -0
  472. package/objects/Reflector.js +72 -50
  473. package/objects/ReflectorForSSRPass.cjs.js +1 -0
  474. package/objects/ReflectorForSSRPass.js +131 -80
  475. package/objects/ReflectorRTT.cjs.js +1 -0
  476. package/objects/ReflectorRTT.js +7 -6
  477. package/objects/Refractor.cjs.js +1 -0
  478. package/objects/Refractor.js +106 -64
  479. package/objects/ShadowMesh.cjs.js +1 -0
  480. package/objects/ShadowMesh.js +17 -8
  481. package/objects/Sky.cjs.js +1 -0
  482. package/objects/Sky.js +80 -119
  483. package/objects/Water.cjs.js +1 -0
  484. package/objects/Water.js +127 -83
  485. package/objects/Water2.cjs.js +1 -0
  486. package/objects/Water2.js +108 -72
  487. package/offscreen/jank.cjs.js +1 -0
  488. package/offscreen/jank.js +14 -10
  489. package/offscreen/offscreen.cjs.js +1 -0
  490. package/offscreen/offscreen.js +5 -4
  491. package/offscreen/scene.cjs.js +1 -0
  492. package/offscreen/scene.js +48 -45
  493. package/package.json +3 -3
  494. package/physics/AmmoPhysics.cjs.js +1 -0
  495. package/physics/AmmoPhysics.js +71 -30
  496. package/postprocessing/AdaptiveToneMappingPass.cjs.js +1 -0
  497. package/postprocessing/AdaptiveToneMappingPass.js +123 -97
  498. package/postprocessing/AfterimagePass.cjs.js +1 -0
  499. package/postprocessing/AfterimagePass.js +49 -28
  500. package/postprocessing/BloomPass.cjs.js +1 -0
  501. package/postprocessing/BloomPass.js +69 -43
  502. package/postprocessing/BokehPass.cjs.js +1 -0
  503. package/postprocessing/BokehPass.js +69 -39
  504. package/postprocessing/ClearPass.cjs.js +1 -0
  505. package/postprocessing/ClearPass.js +25 -10
  506. package/postprocessing/CubeTexturePass.cjs.js +1 -0
  507. package/postprocessing/CubeTexturePass.js +27 -28
  508. package/postprocessing/DotScreenPass.cjs.js +1 -0
  509. package/postprocessing/DotScreenPass.js +32 -24
  510. package/postprocessing/EffectComposer.cjs.js +1 -0
  511. package/postprocessing/EffectComposer.js +86 -39
  512. package/postprocessing/FilmPass.cjs.js +1 -0
  513. package/postprocessing/FilmPass.js +30 -25
  514. package/postprocessing/GlitchPass.cjs.js +1 -0
  515. package/postprocessing/GlitchPass.js +61 -38
  516. package/postprocessing/HalftonePass.cjs.js +1 -0
  517. package/postprocessing/HalftonePass.js +39 -19
  518. package/postprocessing/LUTPass.cjs.js +1 -0
  519. package/postprocessing/LUTPass.js +38 -13
  520. package/postprocessing/MaskPass.cjs.js +1 -0
  521. package/postprocessing/MaskPass.js +38 -19
  522. package/postprocessing/OutlinePass.cjs.js +1 -0
  523. package/postprocessing/OutlinePass.js +277 -135
  524. package/postprocessing/Pass.cjs.js +1 -0
  525. package/postprocessing/Pass.js +44 -20
  526. package/postprocessing/RenderPass.cjs.js +1 -0
  527. package/postprocessing/RenderPass.js +36 -13
  528. package/postprocessing/RenderPixelatedPass.cjs.js +1 -0
  529. package/postprocessing/RenderPixelatedPass.js +58 -44
  530. package/postprocessing/SAOPass.cjs.js +1 -0
  531. package/postprocessing/SAOPass.js +189 -154
  532. package/postprocessing/SMAAPass.cjs.js +1 -0
  533. package/postprocessing/SMAAPass.js +84 -64
  534. package/postprocessing/SSAARenderPass.cjs.js +1 -0
  535. package/postprocessing/SSAARenderPass.js +69 -121
  536. package/postprocessing/SSAOPass.cjs.js +1 -0
  537. package/postprocessing/SSAOPass.js +172 -123
  538. package/postprocessing/SSRPass.cjs.js +1 -0
  539. package/postprocessing/SSRPass.js +280 -211
  540. package/postprocessing/SavePass.cjs.js +1 -0
  541. package/postprocessing/SavePass.js +25 -20
  542. package/postprocessing/ShaderPass.cjs.js +1 -0
  543. package/postprocessing/ShaderPass.js +30 -14
  544. package/postprocessing/TAARenderPass.cjs.js +1 -0
  545. package/postprocessing/TAARenderPass.js +61 -42
  546. package/postprocessing/TexturePass.cjs.js +1 -0
  547. package/postprocessing/TexturePass.js +22 -21
  548. package/postprocessing/UnrealBloomPass.cjs.js +1 -0
  549. package/postprocessing/UnrealBloomPass.js +213 -105
  550. package/renderers/CSS2DRenderer.cjs.js +1 -0
  551. package/renderers/CSS2DRenderer.js +56 -44
  552. package/renderers/CSS3DRenderer.cjs.js +1 -0
  553. package/renderers/CSS3DRenderer.js +86 -53
  554. package/renderers/Projector.cjs.js +1 -0
  555. package/renderers/Projector.js +274 -107
  556. package/renderers/SVGRenderer.cjs.js +1 -0
  557. package/renderers/SVGRenderer.js +182 -72
  558. package/renderers/nodes/accessors/CameraNode.cjs.js +1 -0
  559. package/renderers/nodes/accessors/CameraNode.js +40 -29
  560. package/renderers/nodes/accessors/ModelNode.cjs.js +1 -0
  561. package/renderers/nodes/accessors/ModelNode.js +37 -28
  562. package/renderers/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
  563. package/renderers/nodes/accessors/ModelViewProjectionNode.js +23 -10
  564. package/renderers/nodes/accessors/NormalNode.cjs.js +1 -0
  565. package/renderers/nodes/accessors/NormalNode.js +45 -35
  566. package/renderers/nodes/accessors/PositionNode.cjs.js +1 -0
  567. package/renderers/nodes/accessors/PositionNode.js +19 -18
  568. package/renderers/nodes/accessors/UVNode.cjs.js +1 -0
  569. package/renderers/nodes/accessors/UVNode.js +10 -5
  570. package/renderers/nodes/core/AttributeNode.cjs.js +1 -0
  571. package/renderers/nodes/core/AttributeNode.js +14 -5
  572. package/renderers/nodes/core/InputNode.cjs.js +1 -0
  573. package/renderers/nodes/core/InputNode.js +14 -4
  574. package/renderers/nodes/core/Node.cjs.js +1 -0
  575. package/renderers/nodes/core/Node.js +17 -7
  576. package/renderers/nodes/core/NodeAttribute.cjs.js +1 -0
  577. package/renderers/nodes/core/NodeAttribute.js +6 -3
  578. package/renderers/nodes/core/NodeBuilder.cjs.js +1 -0
  579. package/renderers/nodes/core/NodeBuilder.js +154 -87
  580. package/renderers/nodes/core/NodeFrame.cjs.js +1 -0
  581. package/renderers/nodes/core/NodeFrame.js +12 -9
  582. package/renderers/nodes/core/NodeSlot.cjs.js +1 -0
  583. package/renderers/nodes/core/NodeSlot.js +3 -2
  584. package/renderers/nodes/core/NodeUniform.cjs.js +1 -0
  585. package/renderers/nodes/core/NodeUniform.js +9 -4
  586. package/renderers/nodes/core/NodeVary.cjs.js +1 -0
  587. package/renderers/nodes/core/NodeVary.js +7 -4
  588. package/renderers/nodes/core/VaryNode.cjs.js +1 -0
  589. package/renderers/nodes/core/VaryNode.js +12 -6
  590. package/renderers/nodes/core/constants.cjs.js +1 -0
  591. package/renderers/nodes/core/constants.js +13 -16
  592. package/renderers/nodes/inputs/ColorNode.cjs.js +1 -0
  593. package/renderers/nodes/inputs/ColorNode.js +11 -5
  594. package/renderers/nodes/inputs/FloatNode.cjs.js +1 -0
  595. package/renderers/nodes/inputs/FloatNode.js +11 -5
  596. package/renderers/nodes/inputs/Matrix3Node.cjs.js +1 -0
  597. package/renderers/nodes/inputs/Matrix3Node.js +13 -7
  598. package/renderers/nodes/inputs/Matrix4Node.cjs.js +1 -0
  599. package/renderers/nodes/inputs/Matrix4Node.js +13 -7
  600. package/renderers/nodes/inputs/TextureNode.cjs.js +1 -0
  601. package/renderers/nodes/inputs/TextureNode.js +15 -7
  602. package/renderers/nodes/inputs/Vector2Node.cjs.js +1 -0
  603. package/renderers/nodes/inputs/Vector2Node.js +11 -5
  604. package/renderers/nodes/inputs/Vector3Node.cjs.js +1 -0
  605. package/renderers/nodes/inputs/Vector3Node.js +13 -7
  606. package/renderers/nodes/inputs/Vector4Node.cjs.js +1 -0
  607. package/renderers/nodes/inputs/Vector4Node.js +13 -7
  608. package/renderers/nodes/math/MathNode.cjs.js +1 -0
  609. package/renderers/nodes/math/MathNode.js +30 -20
  610. package/renderers/nodes/math/OperatorNode.cjs.js +1 -0
  611. package/renderers/nodes/math/OperatorNode.js +20 -4
  612. package/renderers/nodes/utils/SwitchNode.cjs.js +1 -0
  613. package/renderers/nodes/utils/SwitchNode.js +9 -4
  614. package/renderers/nodes/utils/TimerNode.cjs.js +1 -0
  615. package/renderers/nodes/utils/TimerNode.js +10 -5
  616. package/renderers/webgpu/WebGPU.cjs.js +1 -0
  617. package/renderers/webgpu/WebGPU.js +16 -14
  618. package/renderers/webgpu/WebGPUAttributes.cjs.js +1 -0
  619. package/renderers/webgpu/WebGPUAttributes.js +23 -16
  620. package/renderers/webgpu/WebGPUBackground.cjs.js +1 -0
  621. package/renderers/webgpu/WebGPUBackground.js +30 -13
  622. package/renderers/webgpu/WebGPUBinding.cjs.js +1 -0
  623. package/renderers/webgpu/WebGPUBinding.js +7 -4
  624. package/renderers/webgpu/WebGPUBindings.cjs.js +1 -0
  625. package/renderers/webgpu/WebGPUBindings.js +57 -21
  626. package/renderers/webgpu/WebGPUComputePipelines.cjs.js +1 -0
  627. package/renderers/webgpu/WebGPUComputePipelines.js +25 -14
  628. package/renderers/webgpu/WebGPUGeometries.cjs.js +1 -0
  629. package/renderers/webgpu/WebGPUGeometries.js +15 -5
  630. package/renderers/webgpu/WebGPUInfo.cjs.js +1 -0
  631. package/renderers/webgpu/WebGPUInfo.js +8 -3
  632. package/renderers/webgpu/WebGPUObjects.cjs.js +1 -0
  633. package/renderers/webgpu/WebGPUObjects.js +10 -5
  634. package/renderers/webgpu/WebGPUProperties.cjs.js +1 -0
  635. package/renderers/webgpu/WebGPUProperties.js +11 -5
  636. package/renderers/webgpu/WebGPURenderLists.cjs.js +1 -0
  637. package/renderers/webgpu/WebGPURenderLists.js +36 -20
  638. package/renderers/webgpu/WebGPURenderPipelines.cjs.js +1 -0
  639. package/renderers/webgpu/WebGPURenderPipelines.js +387 -260
  640. package/renderers/webgpu/WebGPURenderer.cjs.js +1 -0
  641. package/renderers/webgpu/WebGPURenderer.js +262 -124
  642. package/renderers/webgpu/WebGPUSampledTexture.cjs.js +1 -0
  643. package/renderers/webgpu/WebGPUSampledTexture.js +31 -18
  644. package/renderers/webgpu/WebGPUSampler.cjs.js +1 -0
  645. package/renderers/webgpu/WebGPUSampler.js +12 -7
  646. package/renderers/webgpu/WebGPUStorageBuffer.cjs.js +1 -0
  647. package/renderers/webgpu/WebGPUStorageBuffer.js +12 -7
  648. package/renderers/webgpu/WebGPUTextureRenderer.cjs.js +1 -0
  649. package/renderers/webgpu/WebGPUTextureRenderer.js +11 -5
  650. package/renderers/webgpu/WebGPUTextureUtils.cjs.js +1 -0
  651. package/renderers/webgpu/WebGPUTextureUtils.js +40 -29
  652. package/renderers/webgpu/WebGPUTextures.cjs.js +1 -0
  653. package/renderers/webgpu/WebGPUTextures.js +333 -186
  654. package/renderers/webgpu/WebGPUUniform.cjs.js +1 -0
  655. package/renderers/webgpu/WebGPUUniform.js +51 -25
  656. package/renderers/webgpu/WebGPUUniformsGroup.cjs.js +1 -0
  657. package/renderers/webgpu/WebGPUUniformsGroup.js +72 -32
  658. package/renderers/webgpu/constants.cjs.js +1 -0
  659. package/renderers/webgpu/constants.js +181 -190
  660. package/renderers/webgpu/nodes/ShaderLib.cjs.js +1 -0
  661. package/renderers/webgpu/nodes/ShaderLib.js +2 -2
  662. package/renderers/webgpu/nodes/WebGPUNodeBuilder.cjs.js +1 -0
  663. package/renderers/webgpu/nodes/WebGPUNodeBuilder.js +124 -53
  664. package/renderers/webgpu/nodes/WebGPUNodeUniform.cjs.js +1 -0
  665. package/renderers/webgpu/nodes/WebGPUNodeUniform.js +31 -17
  666. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.cjs.js +1 -0
  667. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.js +9 -8
  668. package/renderers/webgpu/nodes/WebGPUNodes.cjs.js +1 -0
  669. package/renderers/webgpu/nodes/WebGPUNodes.js +45 -7
  670. package/shaders/ACESFilmicToneMappingShader.cjs.js +1 -0
  671. package/shaders/ACESFilmicToneMappingShader.js +24 -44
  672. package/shaders/AfterimageShader.cjs.js +1 -0
  673. package/shaders/AfterimageShader.js +18 -28
  674. package/shaders/BasicShader.cjs.js +1 -0
  675. package/shaders/BasicShader.js +7 -9
  676. package/shaders/BleachBypassShader.cjs.js +1 -0
  677. package/shaders/BleachBypassShader.js +15 -31
  678. package/shaders/BlendShader.cjs.js +1 -0
  679. package/shaders/BlendShader.js +19 -26
  680. package/shaders/BokehShader.cjs.js +1 -0
  681. package/shaders/BokehShader.js +36 -98
  682. package/shaders/BokehShader2.cjs.js +1 -0
  683. package/shaders/BokehShader2.js +90 -261
  684. package/shaders/BrightnessContrastShader.cjs.js +1 -0
  685. package/shaders/BrightnessContrastShader.js +19 -28
  686. package/shaders/ColorCorrectionShader.cjs.js +1 -0
  687. package/shaders/ColorCorrectionShader.js +22 -26
  688. package/shaders/ColorifyShader.cjs.js +1 -0
  689. package/shaders/ColorifyShader.js +16 -24
  690. package/shaders/ConvolutionShader.cjs.js +1 -0
  691. package/shaders/ConvolutionShader.js +36 -40
  692. package/shaders/CopyShader.cjs.js +1 -0
  693. package/shaders/CopyShader.js +13 -21
  694. package/shaders/DOFMipMapShader.cjs.js +1 -0
  695. package/shaders/DOFMipMapShader.js +21 -28
  696. package/shaders/DepthLimitedBlurShader.cjs.js +1 -0
  697. package/shaders/DepthLimitedBlurShader.js +40 -85
  698. package/shaders/DigitalGlitch.cjs.js +1 -0
  699. package/shaders/DigitalGlitch.js +46 -74
  700. package/shaders/DotScreenShader.cjs.js +1 -0
  701. package/shaders/DotScreenShader.js +27 -35
  702. package/shaders/FXAAShader.cjs.js +1 -0
  703. package/shaders/FXAAShader.js +19 -1094
  704. package/shaders/FilmShader.cjs.js +1 -0
  705. package/shaders/FilmShader.js +52 -38
  706. package/shaders/FocusShader.cjs.js +1 -0
  707. package/shaders/FocusShader.js +24 -51
  708. package/shaders/FreiChenShader.cjs.js +1 -0
  709. package/shaders/FreiChenShader.js +24 -57
  710. package/shaders/FresnelShader.cjs.js +1 -0
  711. package/shaders/FresnelShader.js +22 -43
  712. package/shaders/GammaCorrectionShader.cjs.js +1 -0
  713. package/shaders/GammaCorrectionShader.js +11 -19
  714. package/shaders/GodRaysShader.cjs.js +1 -0
  715. package/shaders/GodRaysShader.js +94 -103
  716. package/shaders/HalftoneShader.cjs.js +1 -0
  717. package/shaders/HalftoneShader.js +65 -208
  718. package/shaders/HorizontalBlurShader.cjs.js +1 -0
  719. package/shaders/HorizontalBlurShader.js +23 -7
  720. package/shaders/HorizontalTiltShiftShader.cjs.js +1 -0
  721. package/shaders/HorizontalTiltShiftShader.js +21 -33
  722. package/shaders/HueSaturationShader.cjs.js +1 -0
  723. package/shaders/HueSaturationShader.js +21 -37
  724. package/shaders/KaleidoShader.cjs.js +1 -0
  725. package/shaders/KaleidoShader.js +22 -30
  726. package/shaders/LuminosityHighPassShader.cjs.js +1 -0
  727. package/shaders/LuminosityHighPassShader.js +27 -33
  728. package/shaders/LuminosityShader.cjs.js +1 -0
  729. package/shaders/LuminosityShader.js +11 -21
  730. package/shaders/MirrorShader.cjs.js +1 -0
  731. package/shaders/MirrorShader.js +16 -31
  732. package/shaders/NormalMapShader.cjs.js +1 -0
  733. package/shaders/NormalMapShader.js +23 -27
  734. package/shaders/ParallaxShader.cjs.js +1 -0
  735. package/shaders/ParallaxShader.js +48 -107
  736. package/shaders/PixelShader.cjs.js +1 -0
  737. package/shaders/PixelShader.js +16 -24
  738. package/shaders/RGBShiftShader.cjs.js +1 -0
  739. package/shaders/RGBShiftShader.js +22 -26
  740. package/shaders/SAOShader.cjs.js +1 -0
  741. package/shaders/SAOShader.js +48 -132
  742. package/shaders/SMAAShader.cjs.js +1 -0
  743. package/shaders/SMAAShader.js +135 -256
  744. package/shaders/SSAOShader.cjs.js +1 -0
  745. package/shaders/SSAOShader.js +81 -153
  746. package/shaders/SSRShader.cjs.js +1 -0
  747. package/shaders/SSRShader.js +87 -32
  748. package/shaders/SepiaShader.cjs.js +1 -0
  749. package/shaders/SepiaShader.js +15 -25
  750. package/shaders/SobelOperatorShader.cjs.js +1 -0
  751. package/shaders/SobelOperatorShader.js +29 -40
  752. package/shaders/SubsurfaceScatteringShader.cjs.js +1 -0
  753. package/shaders/SubsurfaceScatteringShader.js +39 -53
  754. package/shaders/TechnicolorShader.cjs.js +1 -0
  755. package/shaders/TechnicolorShader.js +13 -20
  756. package/shaders/ToneMapShader.cjs.js +1 -0
  757. package/shaders/ToneMapShader.js +28 -44
  758. package/shaders/ToonShader.cjs.js +1 -0
  759. package/shaders/ToonShader.js +96 -172
  760. package/shaders/TriangleBlurShader.cjs.js +1 -0
  761. package/shaders/TriangleBlurShader.js +23 -32
  762. package/shaders/UnpackDepthRGBAShader.cjs.js +1 -0
  763. package/shaders/UnpackDepthRGBAShader.js +14 -22
  764. package/shaders/VerticalBlurShader.cjs.js +1 -0
  765. package/shaders/VerticalBlurShader.js +23 -7
  766. package/shaders/VerticalTiltShiftShader.cjs.js +1 -0
  767. package/shaders/VerticalTiltShiftShader.js +21 -33
  768. package/shaders/VignetteShader.cjs.js +1 -0
  769. package/shaders/VignetteShader.js +28 -24
  770. package/shaders/VolumeShader.cjs.js +1 -0
  771. package/shaders/VolumeShader.js +77 -174
  772. package/shaders/WaterRefractionShader.cjs.js +1 -0
  773. package/shaders/WaterRefractionShader.js +6 -38
  774. package/shaders/types.cjs.js +1 -0
  775. package/shaders/types.js +1 -1
  776. package/textures/FlakesTexture.cjs.js +1 -0
  777. package/textures/FlakesTexture.js +10 -8
  778. package/types/helpers.cjs.js +1 -0
  779. package/types/helpers.js +2 -3
  780. package/types/shared.cjs.js +1 -0
  781. package/types/shared.js +1 -0
  782. package/types/utils.cjs.js +1 -0
  783. package/types/utils.js +1 -0
  784. package/utils/BufferGeometryUtils.cjs.js +1 -0
  785. package/utils/BufferGeometryUtils.js +325 -251
  786. package/utils/GeometryCompressionUtils.cjs.js +1 -0
  787. package/utils/GeometryCompressionUtils.js +239 -241
  788. package/utils/GeometryUtils.cjs.js +1 -0
  789. package/utils/GeometryUtils.js +94 -41
  790. package/utils/LDrawUtils.cjs.js +1 -0
  791. package/utils/LDrawUtils.d.ts +5 -0
  792. package/utils/LDrawUtils.js +144 -0
  793. package/utils/RoughnessMipmapper.cjs.js +1 -0
  794. package/utils/RoughnessMipmapper.js +82 -38
  795. package/utils/SceneUtils.cjs.js +1 -0
  796. package/utils/SceneUtils.js +20 -15
  797. package/utils/ShadowMapViewer.cjs.js +1 -0
  798. package/utils/ShadowMapViewer.js +95 -49
  799. package/utils/SkeletonUtils.cjs.js +1 -0
  800. package/utils/SkeletonUtils.js +165 -74
  801. package/utils/UVsDebug.cjs.js +1 -0
  802. package/utils/UVsDebug.js +62 -32
  803. package/utils/WorkerPool.cjs.js +1 -0
  804. package/utils/WorkerPool.js +33 -13
  805. package/webxr/ARButton.cjs.js +1 -0
  806. package/webxr/ARButton.js +98 -72
  807. package/webxr/OculusHandModel.cjs.js +1 -0
  808. package/webxr/OculusHandModel.js +37 -18
  809. package/webxr/OculusHandPointerModel.cjs.js +1 -0
  810. package/webxr/OculusHandPointerModel.js +80 -58
  811. package/webxr/Text2D.cjs.js +1 -0
  812. package/webxr/Text2D.js +19 -37
  813. package/webxr/VRButton.cjs.js +1 -0
  814. package/webxr/VRButton.js +90 -59
  815. package/webxr/XRControllerModelFactory.cjs.js +1 -0
  816. package/webxr/XRControllerModelFactory.js +116 -58
  817. package/webxr/XREstimatedLight.cjs.js +1 -0
  818. package/webxr/XREstimatedLight.js +66 -39
  819. package/webxr/XRHandMeshModel.cjs.js +1 -0
  820. package/webxr/XRHandMeshModel.js +29 -40
  821. package/webxr/XRHandModelFactory.cjs.js +1 -0
  822. package/webxr/XRHandModelFactory.js +31 -28
  823. package/webxr/XRHandPrimitiveModel.cjs.js +1 -0
  824. package/webxr/XRHandPrimitiveModel.js +27 -41
  825. package/animation/AnimationClipCreator.mjs +0 -57
  826. package/animation/CCDIKSolver.mjs +0 -223
  827. package/animation/MMDAnimationHelper.mjs +0 -514
  828. package/animation/MMDPhysics.mjs +0 -769
  829. package/cameras/CinematicCamera.mjs +0 -129
  830. package/controls/ArcballControls.mjs +0 -1737
  831. package/controls/DeviceOrientationControls.mjs +0 -74
  832. package/controls/DragControls.mjs +0 -172
  833. package/controls/FirstPersonControls.mjs +0 -220
  834. package/controls/FlyControls.mjs +0 -239
  835. package/controls/OrbitControls.mjs +0 -731
  836. package/controls/PointerLockControls.mjs +0 -88
  837. package/controls/TrackballControls.mjs +0 -481
  838. package/controls/TransformControls.mjs +0 -1068
  839. package/controls/experimental/CameraControls.mjs +0 -673
  840. package/csm/CSM.mjs +0 -244
  841. package/csm/CSMFrustum.mjs +0 -75
  842. package/csm/CSMHelper.mjs +0 -114
  843. package/csm/CSMShader.mjs +0 -251
  844. package/curves/CurveExtras.mjs +0 -224
  845. package/curves/NURBSCurve.mjs +0 -35
  846. package/curves/NURBSSurface.mjs +0 -28
  847. package/curves/NURBSUtils.mjs +0 -226
  848. package/deprecated/Geometry.mjs +0 -966
  849. package/effects/AnaglyphEffect.mjs +0 -120
  850. package/effects/AsciiEffect.mjs +0 -173
  851. package/effects/OutlineEffect.mjs +0 -295
  852. package/effects/ParallaxBarrierEffect.mjs +0 -64
  853. package/effects/PeppersGhostEffect.mjs +0 -85
  854. package/effects/StereoEffect.mjs +0 -32
  855. package/environments/RoomEnvironment.mjs +0 -78
  856. package/exporters/ColladaExporter.mjs +0 -299
  857. package/exporters/DRACOExporter.mjs +0 -132
  858. package/exporters/GLTFExporter.mjs +0 -1381
  859. package/exporters/MMDExporter.mjs +0 -102
  860. package/exporters/OBJExporter.mjs +0 -166
  861. package/exporters/PLYExporter.mjs +0 -278
  862. package/exporters/STLExporter.mjs +0 -129
  863. package/exporters/USDZExporter.mjs +0 -328
  864. package/geometries/BoxLineGeometry.mjs +0 -45
  865. package/geometries/ConvexGeometry.mjs +0 -29
  866. package/geometries/DecalGeometry.mjs +0 -184
  867. package/geometries/LightningStrike.mjs +0 -547
  868. package/geometries/ParametricGeometries.mjs +0 -129
  869. package/geometries/ParametricGeometry.mjs +0 -63
  870. package/geometries/RoundedBoxGeometry.mjs +0 -91
  871. package/geometries/TeapotGeometry.mjs +0 -1557
  872. package/geometries/TextGeometry.mjs +0 -23
  873. package/helpers/LightProbeHelper.mjs +0 -72
  874. package/helpers/PositionalAudioHelper.mjs +0 -68
  875. package/helpers/RectAreaLightHelper.mjs +0 -44
  876. package/helpers/VertexNormalsHelper.mjs +0 -54
  877. package/helpers/VertexTangentsHelper.mjs +0 -45
  878. package/index.mjs +0 -969
  879. package/interactive/SelectionBox.mjs +0 -137
  880. package/interactive/SelectionHelper.mjs +0 -54
  881. package/libs/MeshoptDecoder.mjs +0 -210
  882. package/libs/MotionControllers.mjs +0 -261
  883. package/lights/LightProbeGenerator.mjs +0 -145
  884. package/lights/RectAreaLightUniformsLib.mjs +0 -32842
  885. package/lines/Line2.mjs +0 -13
  886. package/lines/LineGeometry.mjs +0 -44
  887. package/lines/LineMaterial.mjs +0 -539
  888. package/lines/LineSegments2.mjs +0 -202
  889. package/lines/LineSegmentsGeometry.mjs +0 -124
  890. package/lines/Wireframe.mjs +0 -31
  891. package/lines/WireframeGeometry2.mjs +0 -13
  892. package/loaders/3DMLoader.mjs +0 -802
  893. package/loaders/3MFLoader.mjs +0 -837
  894. package/loaders/AMFLoader.mjs +0 -284
  895. package/loaders/AssimpLoader.mjs +0 -1396
  896. package/loaders/BVHLoader.mjs +0 -207
  897. package/loaders/BasisTextureLoader.mjs +0 -474
  898. package/loaders/ColladaLoader.mjs +0 -2403
  899. package/loaders/DDSLoader.mjs +0 -148
  900. package/loaders/DRACOLoader.mjs +0 -340
  901. package/loaders/EXRLoader.mjs +0 -1351
  902. package/loaders/FBXLoader.mjs +0 -2362
  903. package/loaders/FontLoader.mjs +0 -111
  904. package/loaders/GCodeLoader.mjs +0 -141
  905. package/loaders/GLTFLoader.mjs +0 -2316
  906. package/loaders/HDRCubeTextureLoader.mjs +0 -77
  907. package/loaders/KMZLoader.mjs +0 -75
  908. package/loaders/KTX2Loader.mjs +0 -427
  909. package/loaders/KTXLoader.mjs +0 -87
  910. package/loaders/LDrawLoader.mjs +0 -1409
  911. package/loaders/LUT3dlLoader.mjs +0 -100
  912. package/loaders/LUTCubeLoader.mjs +0 -104
  913. package/loaders/LWOLoader.mjs +0 -625
  914. package/loaders/LottieLoader.mjs +0 -47
  915. package/loaders/MD2Loader.mjs +0 -359
  916. package/loaders/MDDLoader.mjs +0 -58
  917. package/loaders/MMDLoader.mjs +0 -998
  918. package/loaders/MTLLoader.mjs +0 -280
  919. package/loaders/NRRDLoader.mjs +0 -401
  920. package/loaders/NodeMaterialLoader.mjs +0 -146
  921. package/loaders/OBJLoader.mjs +0 -487
  922. package/loaders/PCDLoader.mjs +0 -248
  923. package/loaders/PDBLoader.mjs +0 -246
  924. package/loaders/PLYLoader.mjs +0 -317
  925. package/loaders/PRWMLoader.mjs +0 -160
  926. package/loaders/PVRLoader.mjs +0 -131
  927. package/loaders/RGBELoader.mjs +0 -244
  928. package/loaders/RGBMLoader.mjs +0 -998
  929. package/loaders/STLLoader.mjs +0 -190
  930. package/loaders/SVGLoader.mjs +0 -1709
  931. package/loaders/TDSLoader.mjs +0 -480
  932. package/loaders/TGALoader.mjs +0 -285
  933. package/loaders/TTFLoader.mjs +0 -131
  934. package/loaders/TiltLoader.mjs +0 -373
  935. package/loaders/VOXLoader.mjs +0 -431
  936. package/loaders/VRMLLoader.mjs +0 -2093
  937. package/loaders/VRMLoader.mjs +0 -38
  938. package/loaders/VTKLoader.mjs +0 -646
  939. package/loaders/XLoader.mjs +0 -1258
  940. package/loaders/XYZLoader.mjs +0 -60
  941. package/loaders/lwo/IFFParser.mjs +0 -697
  942. package/loaders/lwo/LWO2Parser.mjs +0 -327
  943. package/loaders/lwo/LWO3Parser.mjs +0 -298
  944. package/math/Capsule.mjs +0 -100
  945. package/math/ColorConverter.mjs +0 -51
  946. package/math/ConvexHull.mjs +0 -574
  947. package/math/ImprovedNoise.mjs +0 -302
  948. package/math/Lut.mjs +0 -135
  949. package/math/MeshSurfaceSampler.mjs +0 -107
  950. package/math/OBB.mjs +0 -235
  951. package/math/Octree.mjs +0 -278
  952. package/math/SimplexNoise.mjs +0 -425
  953. package/misc/ConvexObjectBreaker.mjs +0 -292
  954. package/misc/GPUComputationRenderer.mjs +0 -171
  955. package/misc/Gyroscope.mjs +0 -35
  956. package/misc/MD2Character.mjs +0 -162
  957. package/misc/MD2CharacterComplex.mjs +0 -328
  958. package/misc/MorphAnimMesh.mjs +0 -40
  959. package/misc/MorphBlendMesh.mjs +0 -179
  960. package/misc/ProgressiveLightmap.mjs +0 -166
  961. package/misc/RollerCoaster.mjs +0 -346
  962. package/misc/TubePainter.mjs +0 -123
  963. package/misc/Volume.mjs +0 -244
  964. package/misc/VolumeSlice.mjs +0 -106
  965. package/misc/WebGL.mjs +0 -74
  966. package/modifiers/CurveModifier.mjs +0 -182
  967. package/modifiers/EdgeSplitModifier.mjs +0 -162
  968. package/modifiers/SimplifyModifier.mjs +0 -282
  969. package/modifiers/TessellateModifier.mjs +0 -206
  970. package/nodes/Nodes.mjs +0 -400
  971. package/nodes/ShaderNode.mjs +0 -408
  972. package/nodes/accessors/BufferNode.mjs +0 -15
  973. package/nodes/accessors/CameraNode.mjs +0 -44
  974. package/nodes/accessors/CubeTextureNode.mjs +0 -42
  975. package/nodes/accessors/MaterialNode.mjs +0 -71
  976. package/nodes/accessors/MaterialReferenceNode.mjs +0 -14
  977. package/nodes/accessors/ModelNode.mjs +0 -9
  978. package/nodes/accessors/ModelViewProjectionNode.mjs +0 -24
  979. package/nodes/accessors/NormalNode.mjs +0 -62
  980. package/nodes/accessors/Object3DNode.mjs +0 -76
  981. package/nodes/accessors/PointUVNode.mjs +0 -13
  982. package/nodes/accessors/PositionNode.mjs +0 -65
  983. package/nodes/accessors/ReferenceNode.mjs +0 -37
  984. package/nodes/accessors/ReflectNode.mjs +0 -43
  985. package/nodes/accessors/SkinningNode.mjs +0 -58
  986. package/nodes/accessors/TextureNode.mjs +0 -54
  987. package/nodes/accessors/UVNode.mjs +0 -23
  988. package/nodes/core/ArrayUniformNode.mjs +0 -14
  989. package/nodes/core/AttributeNode.mjs +0 -30
  990. package/nodes/core/BypassNode.mjs +0 -22
  991. package/nodes/core/CodeNode.mjs +0 -28
  992. package/nodes/core/ConstNode.mjs +0 -14
  993. package/nodes/core/ContextNode.mjs +0 -22
  994. package/nodes/core/ExpressionNode.mjs +0 -19
  995. package/nodes/core/FunctionCallNode.mjs +0 -37
  996. package/nodes/core/FunctionNode.mjs +0 -56
  997. package/nodes/core/InputNode.mjs +0 -38
  998. package/nodes/core/Node.mjs +0 -139
  999. package/nodes/core/NodeAttribute.mjs +0 -10
  1000. package/nodes/core/NodeBuilder.mjs +0 -395
  1001. package/nodes/core/NodeCode.mjs +0 -11
  1002. package/nodes/core/NodeFrame.mjs +0 -35
  1003. package/nodes/core/NodeFunctionInput.mjs +0 -13
  1004. package/nodes/core/NodeKeywords.mjs +0 -44
  1005. package/nodes/core/NodeUniform.mjs +0 -18
  1006. package/nodes/core/NodeUtils.mjs +0 -57
  1007. package/nodes/core/NodeVar.mjs +0 -10
  1008. package/nodes/core/NodeVary.mjs +0 -10
  1009. package/nodes/core/PropertyNode.mjs +0 -21
  1010. package/nodes/core/TempNode.mjs +0 -25
  1011. package/nodes/core/UniformNode.mjs +0 -23
  1012. package/nodes/core/VarNode.mjs +0 -31
  1013. package/nodes/core/VaryNode.mjs +0 -30
  1014. package/nodes/core/constants.mjs +0 -24
  1015. package/nodes/display/ColorSpaceNode.mjs +0 -63
  1016. package/nodes/display/NormalMapNode.mjs +0 -54
  1017. package/nodes/fog/FogNode.mjs +0 -15
  1018. package/nodes/fog/FogRangeNode.mjs +0 -17
  1019. package/nodes/functions/BSDFs.mjs +0 -64
  1020. package/nodes/lights/LightContextNode.mjs +0 -35
  1021. package/nodes/lights/LightNode.mjs +0 -58
  1022. package/nodes/lights/LightsNode.mjs +0 -59
  1023. package/nodes/loaders/NodeLoader.mjs +0 -66
  1024. package/nodes/loaders/NodeMaterialLoader.mjs +0 -24
  1025. package/nodes/loaders/NodeObjectLoader.mjs +0 -40
  1026. package/nodes/materials/LineBasicNodeMaterial.mjs +0 -27
  1027. package/nodes/materials/Materials.mjs +0 -28
  1028. package/nodes/materials/MeshBasicNodeMaterial.mjs +0 -28
  1029. package/nodes/materials/MeshStandardNodeMaterial.mjs +0 -41
  1030. package/nodes/materials/NodeMaterial.mjs +0 -64
  1031. package/nodes/materials/PointsNodeMaterial.mjs +0 -30
  1032. package/nodes/math/CondNode.mjs +0 -38
  1033. package/nodes/math/MathNode.mjs +0 -163
  1034. package/nodes/math/OperatorNode.mjs +0 -103
  1035. package/nodes/procedural/CheckerNode.mjs +0 -21
  1036. package/nodes/utils/ArrayElementNode.mjs +0 -19
  1037. package/nodes/utils/ConvertNode.mjs +0 -25
  1038. package/nodes/utils/JoinNode.mjs +0 -26
  1039. package/nodes/utils/MatcapUVNode.mjs +0 -16
  1040. package/nodes/utils/OscNode.mjs +0 -50
  1041. package/nodes/utils/SplitNode.mjs +0 -45
  1042. package/nodes/utils/SpriteSheetUVNode.mjs +0 -40
  1043. package/nodes/utils/TimerNode.mjs +0 -44
  1044. package/objects/GroundProjectedEnv.mjs +0 -130
  1045. package/objects/Lensflare.mjs +0 -262
  1046. package/objects/LightningStorm.mjs +0 -110
  1047. package/objects/MarchingCubes.mjs +0 -457
  1048. package/objects/Reflector.mjs +0 -166
  1049. package/objects/ReflectorForSSRPass.mjs +0 -247
  1050. package/objects/ReflectorRTT.mjs +0 -10
  1051. package/objects/Refractor.mjs +0 -178
  1052. package/objects/ShadowMesh.mjs +0 -41
  1053. package/objects/Sky.mjs +0 -124
  1054. package/objects/Water.mjs +0 -235
  1055. package/objects/Water2.mjs +0 -252
  1056. package/offscreen/jank.mjs +0 -27
  1057. package/offscreen/offscreen.mjs +0 -5
  1058. package/offscreen/scene.mjs +0 -52
  1059. package/physics/AmmoPhysics.mjs +0 -165
  1060. package/postprocessing/AdaptiveToneMappingPass.mjs +0 -221
  1061. package/postprocessing/AfterimagePass.mjs +0 -55
  1062. package/postprocessing/BloomPass.mjs +0 -90
  1063. package/postprocessing/BokehPass.mjs +0 -76
  1064. package/postprocessing/ClearPass.mjs +0 -27
  1065. package/postprocessing/CubeTexturePass.mjs +0 -49
  1066. package/postprocessing/DotScreenPass.mjs +0 -40
  1067. package/postprocessing/EffectComposer.mjs +0 -139
  1068. package/postprocessing/FilmPass.mjs +0 -42
  1069. package/postprocessing/GlitchPass.mjs +0 -75
  1070. package/postprocessing/HalftonePass.mjs +0 -44
  1071. package/postprocessing/LUTPass.mjs +0 -136
  1072. package/postprocessing/MaskPass.mjs +0 -60
  1073. package/postprocessing/OutlinePass.mjs +0 -438
  1074. package/postprocessing/Pass.mjs +0 -37
  1075. package/postprocessing/RenderPass.mjs +0 -48
  1076. package/postprocessing/RenderPixelatedPass.mjs +0 -199
  1077. package/postprocessing/SAOPass.mjs +0 -282
  1078. package/postprocessing/SMAAPass.mjs +0 -112
  1079. package/postprocessing/SSAARenderPass.mjs +0 -170
  1080. package/postprocessing/SSAOPass.mjs +0 -265
  1081. package/postprocessing/SSRPass.mjs +0 -432
  1082. package/postprocessing/SavePass.mjs +0 -37
  1083. package/postprocessing/ShaderPass.mjs +0 -39
  1084. package/postprocessing/TAARenderPass.mjs +0 -88
  1085. package/postprocessing/TexturePass.mjs +0 -39
  1086. package/postprocessing/UnrealBloomPass.mjs +0 -220
  1087. package/renderers/CSS2DRenderer.mjs +0 -112
  1088. package/renderers/CSS3DRenderer.mjs +0 -133
  1089. package/renderers/Projector.mjs +0 -511
  1090. package/renderers/SVGRenderer.mjs +0 -306
  1091. package/renderers/nodes/accessors/CameraNode.mjs +0 -63
  1092. package/renderers/nodes/accessors/ModelNode.mjs +0 -61
  1093. package/renderers/nodes/accessors/ModelViewProjectionNode.mjs +0 -21
  1094. package/renderers/nodes/accessors/NormalNode.mjs +0 -61
  1095. package/renderers/nodes/accessors/PositionNode.mjs +0 -30
  1096. package/renderers/nodes/accessors/UVNode.mjs +0 -13
  1097. package/renderers/nodes/core/AttributeNode.mjs +0 -35
  1098. package/renderers/nodes/core/InputNode.mjs +0 -31
  1099. package/renderers/nodes/core/Node.mjs +0 -34
  1100. package/renderers/nodes/core/NodeAttribute.mjs +0 -10
  1101. package/renderers/nodes/core/NodeBuilder.mjs +0 -243
  1102. package/renderers/nodes/core/NodeFrame.mjs +0 -35
  1103. package/renderers/nodes/core/NodeSlot.mjs +0 -10
  1104. package/renderers/nodes/core/NodeUniform.mjs +0 -18
  1105. package/renderers/nodes/core/NodeVary.mjs +0 -11
  1106. package/renderers/nodes/core/VaryNode.mjs +0 -22
  1107. package/renderers/nodes/core/constants.mjs +0 -22
  1108. package/renderers/nodes/inputs/ColorNode.mjs +0 -11
  1109. package/renderers/nodes/inputs/FloatNode.mjs +0 -11
  1110. package/renderers/nodes/inputs/Matrix3Node.mjs +0 -12
  1111. package/renderers/nodes/inputs/Matrix4Node.mjs +0 -12
  1112. package/renderers/nodes/inputs/TextureNode.mjs +0 -20
  1113. package/renderers/nodes/inputs/Vector2Node.mjs +0 -11
  1114. package/renderers/nodes/inputs/Vector3Node.mjs +0 -12
  1115. package/renderers/nodes/inputs/Vector4Node.mjs +0 -12
  1116. package/renderers/nodes/math/MathNode.mjs +0 -55
  1117. package/renderers/nodes/math/OperatorNode.mjs +0 -42
  1118. package/renderers/nodes/utils/SwitchNode.mjs +0 -20
  1119. package/renderers/nodes/utils/TimerNode.mjs +0 -14
  1120. package/renderers/webgpu/WebGPU.mjs +0 -24
  1121. package/renderers/webgpu/WebGPUAttributes.mjs +0 -69
  1122. package/renderers/webgpu/WebGPUBackground.mjs +0 -61
  1123. package/renderers/webgpu/WebGPUBinding.mjs +0 -14
  1124. package/renderers/webgpu/WebGPUBindings.mjs +0 -155
  1125. package/renderers/webgpu/WebGPUComputePipelines.mjs +0 -44
  1126. package/renderers/webgpu/WebGPUGeometries.mjs +0 -41
  1127. package/renderers/webgpu/WebGPUInfo.mjs +0 -46
  1128. package/renderers/webgpu/WebGPUObjects.mjs +0 -25
  1129. package/renderers/webgpu/WebGPUProperties.mjs +0 -22
  1130. package/renderers/webgpu/WebGPURenderLists.mjs +0 -119
  1131. package/renderers/webgpu/WebGPURenderPipelines.mjs +0 -545
  1132. package/renderers/webgpu/WebGPURenderer.mjs +0 -574
  1133. package/renderers/webgpu/WebGPUSampledTexture.mjs +0 -40
  1134. package/renderers/webgpu/WebGPUSampler.mjs +0 -15
  1135. package/renderers/webgpu/WebGPUStorageBuffer.mjs +0 -15
  1136. package/renderers/webgpu/WebGPUTextureRenderer.mjs +0 -23
  1137. package/renderers/webgpu/WebGPUTextureUtils.mjs +0 -98
  1138. package/renderers/webgpu/WebGPUTextures.mjs +0 -484
  1139. package/renderers/webgpu/WebGPUUniform.mjs +0 -81
  1140. package/renderers/webgpu/WebGPUUniformsGroup.mjs +0 -176
  1141. package/renderers/webgpu/constants.mjs +0 -230
  1142. package/renderers/webgpu/nodes/ShaderLib.mjs +0 -42
  1143. package/renderers/webgpu/nodes/WebGPUNodeBuilder.mjs +0 -165
  1144. package/renderers/webgpu/nodes/WebGPUNodeUniform.mjs +0 -73
  1145. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.mjs +0 -15
  1146. package/renderers/webgpu/nodes/WebGPUNodes.mjs +0 -40
  1147. package/shaders/ACESFilmicToneMappingShader.mjs +0 -48
  1148. package/shaders/AfterimageShader.mjs +0 -32
  1149. package/shaders/BasicShader.mjs +0 -12
  1150. package/shaders/BleachBypassShader.mjs +0 -35
  1151. package/shaders/BlendShader.mjs +0 -30
  1152. package/shaders/BokehShader.mjs +0 -106
  1153. package/shaders/BokehShader2.mjs +0 -269
  1154. package/shaders/BrightnessContrastShader.mjs +0 -32
  1155. package/shaders/ColorCorrectionShader.mjs +0 -30
  1156. package/shaders/ColorifyShader.mjs +0 -28
  1157. package/shaders/ConvolutionShader.mjs +0 -55
  1158. package/shaders/CopyShader.mjs +0 -25
  1159. package/shaders/DOFMipMapShader.mjs +0 -32
  1160. package/shaders/DepthLimitedBlurShader.mjs +0 -114
  1161. package/shaders/DigitalGlitch.mjs +0 -78
  1162. package/shaders/DotScreenShader.mjs +0 -39
  1163. package/shaders/FXAAShader.mjs +0 -1098
  1164. package/shaders/FilmShader.mjs +0 -42
  1165. package/shaders/FocusShader.mjs +0 -55
  1166. package/shaders/FreiChenShader.mjs +0 -61
  1167. package/shaders/FresnelShader.mjs +0 -47
  1168. package/shaders/GammaCorrectionShader.mjs +0 -23
  1169. package/shaders/GodRaysShader.mjs +0 -146
  1170. package/shaders/HalftoneShader.mjs +0 -212
  1171. package/shaders/HorizontalBlurShader.mjs +0 -43
  1172. package/shaders/HorizontalTiltShiftShader.mjs +0 -37
  1173. package/shaders/HueSaturationShader.mjs +0 -41
  1174. package/shaders/KaleidoShader.mjs +0 -34
  1175. package/shaders/LuminosityHighPassShader.mjs +0 -37
  1176. package/shaders/LuminosityShader.mjs +0 -25
  1177. package/shaders/MirrorShader.mjs +0 -35
  1178. package/shaders/NormalMapShader.mjs +0 -31
  1179. package/shaders/ParallaxShader.mjs +0 -113
  1180. package/shaders/PixelShader.mjs +0 -28
  1181. package/shaders/RGBShiftShader.mjs +0 -30
  1182. package/shaders/SAOShader.mjs +0 -144
  1183. package/shaders/SMAAShader.mjs +0 -272
  1184. package/shaders/SSAOShader.mjs +0 -172
  1185. package/shaders/SSRShader.mjs +0 -324
  1186. package/shaders/SepiaShader.mjs +0 -29
  1187. package/shaders/SobelOperatorShader.mjs +0 -44
  1188. package/shaders/SubsurfaceScatteringShader.mjs +0 -59
  1189. package/shaders/TechnicolorShader.mjs +0 -24
  1190. package/shaders/ToneMapShader.mjs +0 -48
  1191. package/shaders/ToonShader.mjs +0 -188
  1192. package/shaders/TriangleBlurShader.mjs +0 -36
  1193. package/shaders/UnpackDepthRGBAShader.mjs +0 -26
  1194. package/shaders/VerticalBlurShader.mjs +0 -44
  1195. package/shaders/VerticalTiltShiftShader.mjs +0 -37
  1196. package/shaders/VignetteShader.mjs +0 -28
  1197. package/shaders/VolumeShader.mjs +0 -178
  1198. package/shaders/WaterRefractionShader.mjs +0 -57
  1199. package/textures/FlakesTexture.mjs +0 -30
  1200. package/types/helpers.mjs +0 -4
  1201. package/utils/BufferGeometryUtils.mjs +0 -570
  1202. package/utils/GeometryCompressionUtils.mjs +0 -547
  1203. package/utils/GeometryUtils.mjs +0 -108
  1204. package/utils/RoughnessMipmapper.mjs +0 -213
  1205. package/utils/SceneUtils.mjs +0 -36
  1206. package/utils/ShadowMapViewer.mjs +0 -114
  1207. package/utils/SkeletonUtils.mjs +0 -292
  1208. package/utils/UVsDebug.mjs +0 -85
  1209. package/utils/WorkerPool.mjs +0 -62
  1210. package/webxr/ARButton.mjs +0 -119
  1211. package/webxr/OculusHandModel.mjs +0 -71
  1212. package/webxr/OculusHandPointerModel.mjs +0 -207
  1213. package/webxr/Text2D.mjs +0 -31
  1214. package/webxr/VRButton.mjs +0 -105
  1215. package/webxr/XRControllerModelFactory.mjs +0 -146
  1216. package/webxr/XREstimatedLight.mjs +0 -126
  1217. package/webxr/XRHandMeshModel.mjs +0 -73
  1218. package/webxr/XRHandModelFactory.mjs +0 -61
  1219. 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 };