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,63 +1,85 @@
1
- "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const THREE = require("three");
4
- const fflate = require("fflate");
5
- const NURBSCurve = require("../curves/NURBSCurve.js");
1
+ import { Loader, LoaderUtils, FileLoader, TextureLoader, RepeatWrapping, ClampToEdgeWrapping, Texture, MeshPhongMaterial, MeshLambertMaterial, Color, sRGBEncoding, EquirectangularReflectionMapping, Matrix4, Group, Bone, PropertyBinding, Object3D, OrthographicCamera, PerspectiveCamera, PointLight, MathUtils, SpotLight, DirectionalLight, SkinnedMesh, Mesh, LineBasicMaterial, Line, Vector3, Skeleton, AmbientLight, BufferGeometry, Float32BufferAttribute, Uint16BufferAttribute, Matrix3, Vector4, AnimationClip, Quaternion, Euler, VectorKeyframeTrack, QuaternionKeyframeTrack, NumberKeyframeTrack } from 'three';
2
+ import { unzlibSync } from 'fflate';
3
+ import { NURBSCurve } from '../curves/NURBSCurve.js';
4
+
5
+ /**
6
+ * Loader loads FBX file and generates Group representing FBX scene.
7
+ * Requires FBX file to be >= 7.0 and in ASCII or >= 6400 in Binary format
8
+ * Versions lower than this may load but will probably have errors
9
+ *
10
+ * Needs Support:
11
+ * Morph normals / blend shape normals
12
+ *
13
+ * FBX format references:
14
+ * https://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_index_html (C++ SDK reference)
15
+ *
16
+ * Binary format specification:
17
+ * https://code.blender.org/2013/08/fbx-binary-file-format-specification/
18
+ */
19
+
6
20
  let fbxTree;
7
21
  let connections;
8
22
  let sceneGraph;
9
- class FBXLoader extends THREE.Loader {
23
+
24
+ class FBXLoader extends Loader {
10
25
  constructor(manager) {
11
26
  super(manager);
12
27
  }
28
+
13
29
  load(url, onLoad, onProgress, onError) {
14
30
  const scope = this;
15
- const path = scope.path === "" ? THREE.LoaderUtils.extractUrlBase(url) : scope.path;
16
- const loader = new THREE.FileLoader(this.manager);
31
+ const path = scope.path === '' ? LoaderUtils.extractUrlBase(url) : scope.path;
32
+ const loader = new FileLoader(this.manager);
17
33
  loader.setPath(scope.path);
18
- loader.setResponseType("arraybuffer");
34
+ loader.setResponseType('arraybuffer');
19
35
  loader.setRequestHeader(scope.requestHeader);
20
36
  loader.setWithCredentials(scope.withCredentials);
21
- loader.load(
22
- url,
23
- function(buffer) {
24
- try {
25
- onLoad(scope.parse(buffer, path));
26
- } catch (e) {
27
- if (onError) {
28
- onError(e);
29
- } else {
30
- console.error(e);
31
- }
32
- scope.manager.itemError(url);
37
+ loader.load(url, function (buffer) {
38
+ try {
39
+ onLoad(scope.parse(buffer, path));
40
+ } catch (e) {
41
+ if (onError) {
42
+ onError(e);
43
+ } else {
44
+ console.error(e);
33
45
  }
34
- },
35
- onProgress,
36
- onError
37
- );
46
+
47
+ scope.manager.itemError(url);
48
+ }
49
+ }, onProgress, onError);
38
50
  }
51
+
39
52
  parse(FBXBuffer, path) {
40
53
  if (isFbxFormatBinary(FBXBuffer)) {
41
54
  fbxTree = new BinaryParser().parse(FBXBuffer);
42
55
  } else {
43
56
  const FBXText = convertArrayBufferToString(FBXBuffer);
57
+
44
58
  if (!isFbxFormatASCII(FBXText)) {
45
- throw new Error("THREE.FBXLoader: Unknown format.");
59
+ throw new Error('THREE.FBXLoader: Unknown format.');
46
60
  }
47
- if (getFbxVersion(FBXText) < 7e3) {
48
- throw new Error("THREE.FBXLoader: FBX version not supported, FileVersion: " + getFbxVersion(FBXText));
61
+
62
+ if (getFbxVersion(FBXText) < 7000) {
63
+ throw new Error('THREE.FBXLoader: FBX version not supported, FileVersion: ' + getFbxVersion(FBXText));
49
64
  }
65
+
50
66
  fbxTree = new TextParser().parse(FBXText);
51
- }
52
- const textureLoader = new THREE.TextureLoader(this.manager).setPath(this.resourcePath || path).setCrossOrigin(this.crossOrigin);
67
+ } // console.log( fbxTree );
68
+
69
+
70
+ const textureLoader = new TextureLoader(this.manager).setPath(this.resourcePath || path).setCrossOrigin(this.crossOrigin);
53
71
  return new FBXTreeParser(textureLoader, this.manager).parse(fbxTree);
54
72
  }
55
- }
73
+
74
+ } // Parse the FBXTree object returned by the BinaryParser or TextParser and return a Group
75
+
76
+
56
77
  class FBXTreeParser {
57
78
  constructor(textureLoader, manager) {
58
79
  this.textureLoader = textureLoader;
59
80
  this.manager = manager;
60
81
  }
82
+
61
83
  parse() {
62
84
  connections = this.parseConnections();
63
85
  const images = this.parseImages();
@@ -67,47 +89,70 @@ class FBXTreeParser {
67
89
  const geometryMap = new GeometryParser().parse(deformers);
68
90
  this.parseScene(deformers, geometryMap, materials);
69
91
  return sceneGraph;
70
- }
92
+ } // Parses FBXTree.Connections which holds parent-child connections between objects (e.g. material -> texture, model->geometry )
93
+ // and details the connection type
94
+
95
+
71
96
  parseConnections() {
72
- const connectionMap = /* @__PURE__ */ new Map();
73
- if ("Connections" in fbxTree) {
97
+ const connectionMap = new Map();
98
+
99
+ if ('Connections' in fbxTree) {
74
100
  const rawConnections = fbxTree.Connections.connections;
75
- rawConnections.forEach(function(rawConnection) {
101
+ rawConnections.forEach(function (rawConnection) {
76
102
  const fromID = rawConnection[0];
77
103
  const toID = rawConnection[1];
78
104
  const relationship = rawConnection[2];
105
+
79
106
  if (!connectionMap.has(fromID)) {
80
107
  connectionMap.set(fromID, {
81
108
  parents: [],
82
109
  children: []
83
110
  });
84
111
  }
85
- const parentRelationship = { ID: toID, relationship };
112
+
113
+ const parentRelationship = {
114
+ ID: toID,
115
+ relationship: relationship
116
+ };
86
117
  connectionMap.get(fromID).parents.push(parentRelationship);
118
+
87
119
  if (!connectionMap.has(toID)) {
88
120
  connectionMap.set(toID, {
89
121
  parents: [],
90
122
  children: []
91
123
  });
92
124
  }
93
- const childRelationship = { ID: fromID, relationship };
125
+
126
+ const childRelationship = {
127
+ ID: fromID,
128
+ relationship: relationship
129
+ };
94
130
  connectionMap.get(toID).children.push(childRelationship);
95
131
  });
96
132
  }
133
+
97
134
  return connectionMap;
98
- }
135
+ } // Parse FBXTree.Objects.Video for embedded image data
136
+ // These images are connected to textures in FBXTree.Objects.Textures
137
+ // via FBXTree.Connections.
138
+
139
+
99
140
  parseImages() {
100
141
  const images = {};
101
142
  const blobs = {};
102
- if ("Video" in fbxTree.Objects) {
143
+
144
+ if ('Video' in fbxTree.Objects) {
103
145
  const videoNodes = fbxTree.Objects.Video;
146
+
104
147
  for (const nodeID in videoNodes) {
105
148
  const videoNode = videoNodes[nodeID];
106
149
  const id = parseInt(nodeID);
107
- images[id] = videoNode.RelativeFilename || videoNode.Filename;
108
- if ("Content" in videoNode) {
150
+ images[id] = videoNode.RelativeFilename || videoNode.Filename; // raw image data is in videoNode.Content
151
+
152
+ if ('Content' in videoNode) {
109
153
  const arrayBufferContent = videoNode.Content instanceof ArrayBuffer && videoNode.Content.byteLength > 0;
110
- const base64Content = typeof videoNode.Content === "string" && videoNode.Content !== "";
154
+ const base64Content = typeof videoNode.Content === 'string' && videoNode.Content !== '';
155
+
111
156
  if (arrayBufferContent || base64Content) {
112
157
  const image = this.parseImage(videoNodes[nodeID]);
113
158
  blobs[videoNode.RelativeFilename || videoNode.Filename] = image;
@@ -115,314 +160,423 @@ class FBXTreeParser {
115
160
  }
116
161
  }
117
162
  }
163
+
118
164
  for (const id in images) {
119
165
  const filename = images[id];
120
- if (blobs[filename] !== void 0)
121
- images[id] = blobs[filename];
122
- else
123
- images[id] = images[id].split("\\").pop();
166
+ if (blobs[filename] !== undefined) images[id] = blobs[filename];else images[id] = images[id].split('\\').pop();
124
167
  }
168
+
125
169
  return images;
126
- }
170
+ } // Parse embedded image data in FBXTree.Video.Content
171
+
172
+
127
173
  parseImage(videoNode) {
128
174
  const content = videoNode.Content;
129
175
  const fileName = videoNode.RelativeFilename || videoNode.Filename;
130
- const extension = fileName.slice(fileName.lastIndexOf(".") + 1).toLowerCase();
176
+ const extension = fileName.slice(fileName.lastIndexOf('.') + 1).toLowerCase();
131
177
  let type;
178
+
132
179
  switch (extension) {
133
- case "bmp":
134
- type = "image/bmp";
180
+ case 'bmp':
181
+ type = 'image/bmp';
135
182
  break;
136
- case "jpg":
137
- case "jpeg":
138
- type = "image/jpeg";
183
+
184
+ case 'jpg':
185
+ case 'jpeg':
186
+ type = 'image/jpeg';
139
187
  break;
140
- case "png":
141
- type = "image/png";
188
+
189
+ case 'png':
190
+ type = 'image/png';
142
191
  break;
143
- case "tif":
144
- type = "image/tiff";
192
+
193
+ case 'tif':
194
+ type = 'image/tiff';
145
195
  break;
146
- case "tga":
147
- if (this.manager.getHandler(".tga") === null) {
148
- console.warn("FBXLoader: TGA loader not found, skipping ", fileName);
196
+
197
+ case 'tga':
198
+ if (this.manager.getHandler('.tga') === null) {
199
+ console.warn('FBXLoader: TGA loader not found, skipping ', fileName);
149
200
  }
150
- type = "image/tga";
201
+
202
+ type = 'image/tga';
151
203
  break;
204
+
152
205
  default:
153
206
  console.warn('FBXLoader: Image type "' + extension + '" is not supported.');
154
207
  return;
155
208
  }
156
- if (typeof content === "string") {
157
- return "data:" + type + ";base64," + content;
209
+
210
+ if (typeof content === 'string') {
211
+ // ASCII format
212
+ return 'data:' + type + ';base64,' + content;
158
213
  } else {
214
+ // Binary Format
159
215
  const array = new Uint8Array(content);
160
- return window.URL.createObjectURL(new Blob([array], { type }));
161
- }
162
- }
216
+ return window.URL.createObjectURL(new Blob([array], {
217
+ type: type
218
+ }));
219
+ }
220
+ } // Parse nodes in FBXTree.Objects.Texture
221
+ // These contain details such as UV scaling, cropping, rotation etc and are connected
222
+ // to images in FBXTree.Objects.Video
223
+
224
+
163
225
  parseTextures(images) {
164
- const textureMap = /* @__PURE__ */ new Map();
165
- if ("Texture" in fbxTree.Objects) {
226
+ const textureMap = new Map();
227
+
228
+ if ('Texture' in fbxTree.Objects) {
166
229
  const textureNodes = fbxTree.Objects.Texture;
230
+
167
231
  for (const nodeID in textureNodes) {
168
232
  const texture = this.parseTexture(textureNodes[nodeID], images);
169
233
  textureMap.set(parseInt(nodeID), texture);
170
234
  }
171
235
  }
236
+
172
237
  return textureMap;
173
- }
238
+ } // Parse individual node in FBXTree.Objects.Texture
239
+
240
+
174
241
  parseTexture(textureNode, images) {
175
242
  const texture = this.loadTexture(textureNode, images);
176
243
  texture.ID = textureNode.id;
177
244
  texture.name = textureNode.attrName;
178
245
  const wrapModeU = textureNode.WrapModeU;
179
246
  const wrapModeV = textureNode.WrapModeV;
180
- const valueU = wrapModeU !== void 0 ? wrapModeU.value : 0;
181
- const valueV = wrapModeV !== void 0 ? wrapModeV.value : 0;
182
- texture.wrapS = valueU === 0 ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;
183
- texture.wrapT = valueV === 0 ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;
184
- if ("Scaling" in textureNode) {
247
+ const valueU = wrapModeU !== undefined ? wrapModeU.value : 0;
248
+ const valueV = wrapModeV !== undefined ? wrapModeV.value : 0; // http://download.autodesk.com/us/fbx/SDKdocs/FBX_SDK_Help/files/fbxsdkref/class_k_fbx_texture.html#889640e63e2e681259ea81061b85143a
249
+ // 0: repeat(default), 1: clamp
250
+
251
+ texture.wrapS = valueU === 0 ? RepeatWrapping : ClampToEdgeWrapping;
252
+ texture.wrapT = valueV === 0 ? RepeatWrapping : ClampToEdgeWrapping;
253
+
254
+ if ('Scaling' in textureNode) {
185
255
  const values = textureNode.Scaling.value;
186
256
  texture.repeat.x = values[0];
187
257
  texture.repeat.y = values[1];
188
258
  }
259
+
189
260
  return texture;
190
- }
261
+ } // load a texture specified as a blob or data URI, or via an external URL using TextureLoader
262
+
263
+
191
264
  loadTexture(textureNode, images) {
192
265
  let fileName;
193
266
  const currentPath = this.textureLoader.path;
194
267
  const children = connections.get(textureNode.id).children;
195
- if (children !== void 0 && children.length > 0 && images[children[0].ID] !== void 0) {
268
+
269
+ if (children !== undefined && children.length > 0 && images[children[0].ID] !== undefined) {
196
270
  fileName = images[children[0].ID];
197
- if (fileName.indexOf("blob:") === 0 || fileName.indexOf("data:") === 0) {
198
- this.textureLoader.setPath(void 0);
271
+
272
+ if (fileName.indexOf('blob:') === 0 || fileName.indexOf('data:') === 0) {
273
+ this.textureLoader.setPath(undefined);
199
274
  }
200
275
  }
276
+
201
277
  let texture;
202
278
  const extension = textureNode.FileName.slice(-3).toLowerCase();
203
- if (extension === "tga") {
204
- const loader = this.manager.getHandler(".tga");
279
+
280
+ if (extension === 'tga') {
281
+ const loader = this.manager.getHandler('.tga');
282
+
205
283
  if (loader === null) {
206
- console.warn("FBXLoader: TGA loader not found, creating placeholder texture for", textureNode.RelativeFilename);
207
- texture = new THREE.Texture();
284
+ console.warn('FBXLoader: TGA loader not found, creating placeholder texture for', textureNode.RelativeFilename);
285
+ texture = new Texture();
208
286
  } else {
209
287
  loader.setPath(this.textureLoader.path);
210
288
  texture = loader.load(fileName);
211
289
  }
212
- } else if (extension === "psd") {
213
- console.warn(
214
- "FBXLoader: PSD textures are not supported, creating placeholder texture for",
215
- textureNode.RelativeFilename
216
- );
217
- texture = new THREE.Texture();
290
+ } else if (extension === 'psd') {
291
+ console.warn('FBXLoader: PSD textures are not supported, creating placeholder texture for', textureNode.RelativeFilename);
292
+ texture = new Texture();
218
293
  } else {
219
294
  texture = this.textureLoader.load(fileName);
220
295
  }
296
+
221
297
  this.textureLoader.setPath(currentPath);
222
298
  return texture;
223
- }
299
+ } // Parse nodes in FBXTree.Objects.Material
300
+
301
+
224
302
  parseMaterials(textureMap) {
225
- const materialMap = /* @__PURE__ */ new Map();
226
- if ("Material" in fbxTree.Objects) {
303
+ const materialMap = new Map();
304
+
305
+ if ('Material' in fbxTree.Objects) {
227
306
  const materialNodes = fbxTree.Objects.Material;
307
+
228
308
  for (const nodeID in materialNodes) {
229
309
  const material = this.parseMaterial(materialNodes[nodeID], textureMap);
230
- if (material !== null)
231
- materialMap.set(parseInt(nodeID), material);
310
+ if (material !== null) materialMap.set(parseInt(nodeID), material);
232
311
  }
233
312
  }
313
+
234
314
  return materialMap;
235
- }
315
+ } // Parse single node in FBXTree.Objects.Material
316
+ // Materials are connected to texture maps in FBXTree.Objects.Textures
317
+ // FBX format currently only supports Lambert and Phong shading models
318
+
319
+
236
320
  parseMaterial(materialNode, textureMap) {
237
321
  const ID = materialNode.id;
238
322
  const name = materialNode.attrName;
239
- let type = materialNode.ShadingModel;
240
- if (typeof type === "object") {
323
+ let type = materialNode.ShadingModel; // Case where FBX wraps shading model in property object.
324
+
325
+ if (typeof type === 'object') {
241
326
  type = type.value;
242
- }
243
- if (!connections.has(ID))
244
- return null;
327
+ } // Ignore unused materials which don't have any connections.
328
+
329
+
330
+ if (!connections.has(ID)) return null;
245
331
  const parameters = this.parseParameters(materialNode, textureMap, ID);
246
332
  let material;
333
+
247
334
  switch (type.toLowerCase()) {
248
- case "phong":
249
- material = new THREE.MeshPhongMaterial();
335
+ case 'phong':
336
+ material = new MeshPhongMaterial();
250
337
  break;
251
- case "lambert":
252
- material = new THREE.MeshLambertMaterial();
338
+
339
+ case 'lambert':
340
+ material = new MeshLambertMaterial();
253
341
  break;
342
+
254
343
  default:
255
344
  console.warn('THREE.FBXLoader: unknown material type "%s". Defaulting to MeshPhongMaterial.', type);
256
- material = new THREE.MeshPhongMaterial();
345
+ material = new MeshPhongMaterial();
257
346
  break;
258
347
  }
348
+
259
349
  material.setValues(parameters);
260
350
  material.name = name;
261
351
  return material;
262
- }
352
+ } // Parse FBX material and return parameters suitable for a three.js material
353
+ // Also parse the texture map and return any textures associated with the material
354
+
355
+
263
356
  parseParameters(materialNode, textureMap, ID) {
264
357
  const parameters = {};
358
+
265
359
  if (materialNode.BumpFactor) {
266
360
  parameters.bumpScale = materialNode.BumpFactor.value;
267
361
  }
362
+
268
363
  if (materialNode.Diffuse) {
269
- parameters.color = new THREE.Color().fromArray(materialNode.Diffuse.value);
270
- } else if (materialNode.DiffuseColor && (materialNode.DiffuseColor.type === "Color" || materialNode.DiffuseColor.type === "ColorRGB")) {
271
- parameters.color = new THREE.Color().fromArray(materialNode.DiffuseColor.value);
364
+ parameters.color = new Color().fromArray(materialNode.Diffuse.value);
365
+ } else if (materialNode.DiffuseColor && (materialNode.DiffuseColor.type === 'Color' || materialNode.DiffuseColor.type === 'ColorRGB')) {
366
+ // The blender exporter exports diffuse here instead of in materialNode.Diffuse
367
+ parameters.color = new Color().fromArray(materialNode.DiffuseColor.value);
272
368
  }
369
+
273
370
  if (materialNode.DisplacementFactor) {
274
371
  parameters.displacementScale = materialNode.DisplacementFactor.value;
275
372
  }
373
+
276
374
  if (materialNode.Emissive) {
277
- parameters.emissive = new THREE.Color().fromArray(materialNode.Emissive.value);
278
- } else if (materialNode.EmissiveColor && (materialNode.EmissiveColor.type === "Color" || materialNode.EmissiveColor.type === "ColorRGB")) {
279
- parameters.emissive = new THREE.Color().fromArray(materialNode.EmissiveColor.value);
375
+ parameters.emissive = new Color().fromArray(materialNode.Emissive.value);
376
+ } else if (materialNode.EmissiveColor && (materialNode.EmissiveColor.type === 'Color' || materialNode.EmissiveColor.type === 'ColorRGB')) {
377
+ // The blender exporter exports emissive color here instead of in materialNode.Emissive
378
+ parameters.emissive = new Color().fromArray(materialNode.EmissiveColor.value);
280
379
  }
380
+
281
381
  if (materialNode.EmissiveFactor) {
282
382
  parameters.emissiveIntensity = parseFloat(materialNode.EmissiveFactor.value);
283
383
  }
384
+
284
385
  if (materialNode.Opacity) {
285
386
  parameters.opacity = parseFloat(materialNode.Opacity.value);
286
387
  }
287
- if (parameters.opacity < 1) {
388
+
389
+ if (parameters.opacity < 1.0) {
288
390
  parameters.transparent = true;
289
391
  }
392
+
290
393
  if (materialNode.ReflectionFactor) {
291
394
  parameters.reflectivity = materialNode.ReflectionFactor.value;
292
395
  }
396
+
293
397
  if (materialNode.Shininess) {
294
398
  parameters.shininess = materialNode.Shininess.value;
295
399
  }
400
+
296
401
  if (materialNode.Specular) {
297
- parameters.specular = new THREE.Color().fromArray(materialNode.Specular.value);
298
- } else if (materialNode.SpecularColor && materialNode.SpecularColor.type === "Color") {
299
- parameters.specular = new THREE.Color().fromArray(materialNode.SpecularColor.value);
402
+ parameters.specular = new Color().fromArray(materialNode.Specular.value);
403
+ } else if (materialNode.SpecularColor && materialNode.SpecularColor.type === 'Color') {
404
+ // The blender exporter exports specular color here instead of in materialNode.Specular
405
+ parameters.specular = new Color().fromArray(materialNode.SpecularColor.value);
300
406
  }
407
+
301
408
  const scope = this;
302
- connections.get(ID).children.forEach(function(child) {
409
+ connections.get(ID).children.forEach(function (child) {
303
410
  const type = child.relationship;
411
+
304
412
  switch (type) {
305
- case "Bump":
413
+ case 'Bump':
306
414
  parameters.bumpMap = scope.getTexture(textureMap, child.ID);
307
415
  break;
308
- case "Maya|TEX_ao_map":
416
+
417
+ case 'Maya|TEX_ao_map':
309
418
  parameters.aoMap = scope.getTexture(textureMap, child.ID);
310
419
  break;
311
- case "DiffuseColor":
312
- case "Maya|TEX_color_map":
420
+
421
+ case 'DiffuseColor':
422
+ case 'Maya|TEX_color_map':
313
423
  parameters.map = scope.getTexture(textureMap, child.ID);
314
- if (parameters.map !== void 0) {
315
- parameters.map.encoding = THREE.sRGBEncoding;
424
+
425
+ if (parameters.map !== undefined) {
426
+ parameters.map.encoding = sRGBEncoding;
316
427
  }
428
+
317
429
  break;
318
- case "DisplacementColor":
430
+
431
+ case 'DisplacementColor':
319
432
  parameters.displacementMap = scope.getTexture(textureMap, child.ID);
320
433
  break;
321
- case "EmissiveColor":
434
+
435
+ case 'EmissiveColor':
322
436
  parameters.emissiveMap = scope.getTexture(textureMap, child.ID);
323
- if (parameters.emissiveMap !== void 0) {
324
- parameters.emissiveMap.encoding = THREE.sRGBEncoding;
437
+
438
+ if (parameters.emissiveMap !== undefined) {
439
+ parameters.emissiveMap.encoding = sRGBEncoding;
325
440
  }
441
+
326
442
  break;
327
- case "NormalMap":
328
- case "Maya|TEX_normal_map":
443
+
444
+ case 'NormalMap':
445
+ case 'Maya|TEX_normal_map':
329
446
  parameters.normalMap = scope.getTexture(textureMap, child.ID);
330
447
  break;
331
- case "ReflectionColor":
448
+
449
+ case 'ReflectionColor':
332
450
  parameters.envMap = scope.getTexture(textureMap, child.ID);
333
- if (parameters.envMap !== void 0) {
334
- parameters.envMap.mapping = THREE.EquirectangularReflectionMapping;
335
- parameters.envMap.encoding = THREE.sRGBEncoding;
451
+
452
+ if (parameters.envMap !== undefined) {
453
+ parameters.envMap.mapping = EquirectangularReflectionMapping;
454
+ parameters.envMap.encoding = sRGBEncoding;
336
455
  }
456
+
337
457
  break;
338
- case "SpecularColor":
458
+
459
+ case 'SpecularColor':
339
460
  parameters.specularMap = scope.getTexture(textureMap, child.ID);
340
- if (parameters.specularMap !== void 0) {
341
- parameters.specularMap.encoding = THREE.sRGBEncoding;
461
+
462
+ if (parameters.specularMap !== undefined) {
463
+ parameters.specularMap.encoding = sRGBEncoding;
342
464
  }
465
+
343
466
  break;
344
- case "TransparentColor":
345
- case "TransparencyFactor":
467
+
468
+ case 'TransparentColor':
469
+ case 'TransparencyFactor':
346
470
  parameters.alphaMap = scope.getTexture(textureMap, child.ID);
347
471
  parameters.transparent = true;
348
472
  break;
349
- case "AmbientColor":
350
- case "ShininessExponent":
351
- case "SpecularFactor":
352
- case "VectorDisplacementColor":
473
+
474
+ case 'AmbientColor':
475
+ case 'ShininessExponent': // AKA glossiness map
476
+
477
+ case 'SpecularFactor': // AKA specularLevel
478
+
479
+ case 'VectorDisplacementColor': // NOTE: Seems to be a copy of DisplacementColor
480
+
353
481
  default:
354
- console.warn("THREE.FBXLoader: %s map is not supported in three.js, skipping texture.", type);
482
+ console.warn('THREE.FBXLoader: %s map is not supported in three.js, skipping texture.', type);
355
483
  break;
356
484
  }
357
485
  });
358
486
  return parameters;
359
- }
487
+ } // get a texture from the textureMap for use by a material.
488
+
489
+
360
490
  getTexture(textureMap, id) {
361
- if ("LayeredTexture" in fbxTree.Objects && id in fbxTree.Objects.LayeredTexture) {
362
- console.warn("THREE.FBXLoader: layered textures are not supported in three.js. Discarding all but first layer.");
491
+ // if the texture is a layered texture, just use the first layer and issue a warning
492
+ if ('LayeredTexture' in fbxTree.Objects && id in fbxTree.Objects.LayeredTexture) {
493
+ console.warn('THREE.FBXLoader: layered textures are not supported in three.js. Discarding all but first layer.');
363
494
  id = connections.get(id).children[0].ID;
364
495
  }
496
+
365
497
  return textureMap.get(id);
366
- }
498
+ } // Parse nodes in FBXTree.Objects.Deformer
499
+ // Deformer node can contain skinning or Vertex Cache animation data, however only skinning is supported here
500
+ // Generates map of Skeleton-like objects for use later when generating and binding skeletons.
501
+
502
+
367
503
  parseDeformers() {
368
504
  const skeletons = {};
369
505
  const morphTargets = {};
370
- if ("Deformer" in fbxTree.Objects) {
506
+
507
+ if ('Deformer' in fbxTree.Objects) {
371
508
  const DeformerNodes = fbxTree.Objects.Deformer;
509
+
372
510
  for (const nodeID in DeformerNodes) {
373
511
  const deformerNode = DeformerNodes[nodeID];
374
512
  const relationships = connections.get(parseInt(nodeID));
375
- if (deformerNode.attrType === "Skin") {
513
+
514
+ if (deformerNode.attrType === 'Skin') {
376
515
  const skeleton = this.parseSkeleton(relationships, DeformerNodes);
377
516
  skeleton.ID = nodeID;
517
+
378
518
  if (relationships.parents.length > 1) {
379
- console.warn("THREE.FBXLoader: skeleton attached to more than one geometry is not supported.");
519
+ console.warn('THREE.FBXLoader: skeleton attached to more than one geometry is not supported.');
380
520
  }
521
+
381
522
  skeleton.geometryID = relationships.parents[0].ID;
382
523
  skeletons[nodeID] = skeleton;
383
- } else if (deformerNode.attrType === "BlendShape") {
524
+ } else if (deformerNode.attrType === 'BlendShape') {
384
525
  const morphTarget = {
385
526
  id: nodeID
386
527
  };
387
528
  morphTarget.rawTargets = this.parseMorphTargets(relationships, DeformerNodes);
388
529
  morphTarget.id = nodeID;
530
+
389
531
  if (relationships.parents.length > 1) {
390
- console.warn("THREE.FBXLoader: morph target attached to more than one geometry is not supported.");
532
+ console.warn('THREE.FBXLoader: morph target attached to more than one geometry is not supported.');
391
533
  }
534
+
392
535
  morphTargets[nodeID] = morphTarget;
393
536
  }
394
537
  }
395
538
  }
539
+
396
540
  return {
397
- skeletons,
398
- morphTargets
541
+ skeletons: skeletons,
542
+ morphTargets: morphTargets
399
543
  };
400
- }
544
+ } // Parse single nodes in FBXTree.Objects.Deformer
545
+ // The top level skeleton node has type 'Skin' and sub nodes have type 'Cluster'
546
+ // Each skin node represents a skeleton and each cluster node represents a bone
547
+
548
+
401
549
  parseSkeleton(relationships, deformerNodes) {
402
550
  const rawBones = [];
403
- relationships.children.forEach(function(child) {
551
+ relationships.children.forEach(function (child) {
404
552
  const boneNode = deformerNodes[child.ID];
405
- if (boneNode.attrType !== "Cluster")
406
- return;
553
+ if (boneNode.attrType !== 'Cluster') return;
407
554
  const rawBone = {
408
555
  ID: child.ID,
409
556
  indices: [],
410
557
  weights: [],
411
- transformLink: new THREE.Matrix4().fromArray(boneNode.TransformLink.a)
558
+ transformLink: new Matrix4().fromArray(boneNode.TransformLink.a) // transform: new Matrix4().fromArray( boneNode.Transform.a ),
559
+ // linkMode: boneNode.Mode,
560
+
412
561
  };
413
- if ("Indexes" in boneNode) {
562
+
563
+ if ('Indexes' in boneNode) {
414
564
  rawBone.indices = boneNode.Indexes.a;
415
565
  rawBone.weights = boneNode.Weights.a;
416
566
  }
567
+
417
568
  rawBones.push(rawBone);
418
569
  });
419
570
  return {
420
- rawBones,
571
+ rawBones: rawBones,
421
572
  bones: []
422
573
  };
423
- }
574
+ } // The top level morph deformer node has type "BlendShape" and sub nodes have type "BlendShapeChannel"
575
+
576
+
424
577
  parseMorphTargets(relationships, deformerNodes) {
425
578
  const rawMorphTargets = [];
579
+
426
580
  for (let i = 0; i < relationships.children.length; i++) {
427
581
  const child = relationships.children[i];
428
582
  const morphTargetNode = deformerNodes[child.ID];
@@ -432,105 +586,126 @@ class FBXTreeParser {
432
586
  id: morphTargetNode.id,
433
587
  fullWeights: morphTargetNode.FullWeights.a
434
588
  };
435
- if (morphTargetNode.attrType !== "BlendShapeChannel")
436
- return;
437
- rawMorphTarget.geoID = connections.get(parseInt(child.ID)).children.filter(function(child2) {
438
- return child2.relationship === void 0;
589
+ if (morphTargetNode.attrType !== 'BlendShapeChannel') return;
590
+ rawMorphTarget.geoID = connections.get(parseInt(child.ID)).children.filter(function (child) {
591
+ return child.relationship === undefined;
439
592
  })[0].ID;
440
593
  rawMorphTargets.push(rawMorphTarget);
441
594
  }
595
+
442
596
  return rawMorphTargets;
443
- }
597
+ } // create the main Group() to be returned by the loader
598
+
599
+
444
600
  parseScene(deformers, geometryMap, materialMap) {
445
- sceneGraph = new THREE.Group();
601
+ sceneGraph = new Group();
446
602
  const modelMap = this.parseModels(deformers.skeletons, geometryMap, materialMap);
447
603
  const modelNodes = fbxTree.Objects.Model;
448
604
  const scope = this;
449
- modelMap.forEach(function(model) {
605
+ modelMap.forEach(function (model) {
450
606
  const modelNode = modelNodes[model.ID];
451
607
  scope.setLookAtProperties(model, modelNode);
452
608
  const parentConnections = connections.get(model.ID).parents;
453
- parentConnections.forEach(function(connection) {
609
+ parentConnections.forEach(function (connection) {
454
610
  const parent = modelMap.get(connection.ID);
455
- if (parent !== void 0)
456
- parent.add(model);
611
+ if (parent !== undefined) parent.add(model);
457
612
  });
613
+
458
614
  if (model.parent === null) {
459
615
  sceneGraph.add(model);
460
616
  }
461
617
  });
462
618
  this.bindSkeleton(deformers.skeletons, geometryMap, modelMap);
463
619
  this.createAmbientLight();
464
- sceneGraph.traverse(function(node) {
620
+ sceneGraph.traverse(function (node) {
465
621
  if (node.userData.transformData) {
466
622
  if (node.parent) {
467
623
  node.userData.transformData.parentMatrix = node.parent.matrix;
468
624
  node.userData.transformData.parentMatrixWorld = node.parent.matrixWorld;
469
625
  }
626
+
470
627
  const transform = generateTransform(node.userData.transformData);
471
628
  node.applyMatrix4(transform);
472
629
  node.updateWorldMatrix();
473
630
  }
474
631
  });
475
- const animations = new AnimationParser().parse();
632
+ const animations = new AnimationParser().parse(); // if all the models where already combined in a single group, just return that
633
+
476
634
  if (sceneGraph.children.length === 1 && sceneGraph.children[0].isGroup) {
477
635
  sceneGraph.children[0].animations = animations;
478
636
  sceneGraph = sceneGraph.children[0];
479
637
  }
638
+
480
639
  sceneGraph.animations = animations;
481
- }
640
+ } // parse nodes in FBXTree.Objects.Model
641
+
642
+
482
643
  parseModels(skeletons, geometryMap, materialMap) {
483
- const modelMap = /* @__PURE__ */ new Map();
644
+ const modelMap = new Map();
484
645
  const modelNodes = fbxTree.Objects.Model;
646
+
485
647
  for (const nodeID in modelNodes) {
486
648
  const id = parseInt(nodeID);
487
649
  const node = modelNodes[nodeID];
488
650
  const relationships = connections.get(id);
489
651
  let model = this.buildSkeleton(relationships, skeletons, id, node.attrName);
652
+
490
653
  if (!model) {
491
654
  switch (node.attrType) {
492
- case "Camera":
655
+ case 'Camera':
493
656
  model = this.createCamera(relationships);
494
657
  break;
495
- case "Light":
658
+
659
+ case 'Light':
496
660
  model = this.createLight(relationships);
497
661
  break;
498
- case "Mesh":
662
+
663
+ case 'Mesh':
499
664
  model = this.createMesh(relationships, geometryMap, materialMap);
500
665
  break;
501
- case "NurbsCurve":
666
+
667
+ case 'NurbsCurve':
502
668
  model = this.createCurve(relationships, geometryMap);
503
669
  break;
504
- case "LimbNode":
505
- case "Root":
506
- model = new THREE.Bone();
670
+
671
+ case 'LimbNode':
672
+ case 'Root':
673
+ model = new Bone();
507
674
  break;
508
- case "Null":
675
+
676
+ case 'Null':
509
677
  default:
510
- model = new THREE.Group();
678
+ model = new Group();
511
679
  break;
512
680
  }
513
- model.name = node.attrName ? THREE.PropertyBinding.sanitizeNodeName(node.attrName) : "";
681
+
682
+ model.name = node.attrName ? PropertyBinding.sanitizeNodeName(node.attrName) : '';
514
683
  model.ID = id;
515
684
  }
685
+
516
686
  this.getTransformData(model, node);
517
687
  modelMap.set(id, model);
518
688
  }
689
+
519
690
  return modelMap;
520
691
  }
692
+
521
693
  buildSkeleton(relationships, skeletons, id, name) {
522
694
  let bone = null;
523
- relationships.parents.forEach(function(parent) {
695
+ relationships.parents.forEach(function (parent) {
524
696
  for (const ID in skeletons) {
525
697
  const skeleton = skeletons[ID];
526
- skeleton.rawBones.forEach(function(rawBone, i) {
698
+ skeleton.rawBones.forEach(function (rawBone, i) {
527
699
  if (rawBone.ID === parent.ID) {
528
700
  const subBone = bone;
529
- bone = new THREE.Bone();
530
- bone.matrixWorld.copy(rawBone.transformLink);
531
- bone.name = name ? THREE.PropertyBinding.sanitizeNodeName(name) : "";
701
+ bone = new Bone();
702
+ bone.matrixWorld.copy(rawBone.transformLink); // set name and id here - otherwise in cases where "subBone" is created it will not have a name / id
703
+
704
+ bone.name = name ? PropertyBinding.sanitizeNodeName(name) : '';
532
705
  bone.ID = id;
533
- skeleton.bones[i] = bone;
706
+ skeleton.bones[i] = bone; // In cases where a bone is shared between multiple meshes
707
+ // duplicate the bone here and and it as a child of the first bone
708
+
534
709
  if (subBone !== null) {
535
710
  bone.add(subBone);
536
711
  }
@@ -539,415 +714,502 @@ class FBXTreeParser {
539
714
  }
540
715
  });
541
716
  return bone;
542
- }
717
+ } // create a PerspectiveCamera or OrthographicCamera
718
+
719
+
543
720
  createCamera(relationships) {
544
721
  let model;
545
722
  let cameraAttribute;
546
- relationships.children.forEach(function(child) {
723
+ relationships.children.forEach(function (child) {
547
724
  const attr = fbxTree.Objects.NodeAttribute[child.ID];
548
- if (attr !== void 0) {
725
+
726
+ if (attr !== undefined) {
549
727
  cameraAttribute = attr;
550
728
  }
551
729
  });
552
- if (cameraAttribute === void 0) {
553
- model = new THREE.Object3D();
730
+
731
+ if (cameraAttribute === undefined) {
732
+ model = new Object3D();
554
733
  } else {
555
734
  let type = 0;
556
- if (cameraAttribute.CameraProjectionType !== void 0 && cameraAttribute.CameraProjectionType.value === 1) {
735
+
736
+ if (cameraAttribute.CameraProjectionType !== undefined && cameraAttribute.CameraProjectionType.value === 1) {
557
737
  type = 1;
558
738
  }
739
+
559
740
  let nearClippingPlane = 1;
560
- if (cameraAttribute.NearPlane !== void 0) {
561
- nearClippingPlane = cameraAttribute.NearPlane.value / 1e3;
741
+
742
+ if (cameraAttribute.NearPlane !== undefined) {
743
+ nearClippingPlane = cameraAttribute.NearPlane.value / 1000;
562
744
  }
563
- let farClippingPlane = 1e3;
564
- if (cameraAttribute.FarPlane !== void 0) {
565
- farClippingPlane = cameraAttribute.FarPlane.value / 1e3;
745
+
746
+ let farClippingPlane = 1000;
747
+
748
+ if (cameraAttribute.FarPlane !== undefined) {
749
+ farClippingPlane = cameraAttribute.FarPlane.value / 1000;
566
750
  }
751
+
567
752
  let width = window.innerWidth;
568
753
  let height = window.innerHeight;
569
- if (cameraAttribute.AspectWidth !== void 0 && cameraAttribute.AspectHeight !== void 0) {
754
+
755
+ if (cameraAttribute.AspectWidth !== undefined && cameraAttribute.AspectHeight !== undefined) {
570
756
  width = cameraAttribute.AspectWidth.value;
571
757
  height = cameraAttribute.AspectHeight.value;
572
758
  }
759
+
573
760
  const aspect = width / height;
574
761
  let fov = 45;
575
- if (cameraAttribute.FieldOfView !== void 0) {
762
+
763
+ if (cameraAttribute.FieldOfView !== undefined) {
576
764
  fov = cameraAttribute.FieldOfView.value;
577
765
  }
766
+
578
767
  const focalLength = cameraAttribute.FocalLength ? cameraAttribute.FocalLength.value : null;
768
+
579
769
  switch (type) {
580
770
  case 0:
581
- model = new THREE.PerspectiveCamera(fov, aspect, nearClippingPlane, farClippingPlane);
582
- if (focalLength !== null)
583
- model.setFocalLength(focalLength);
771
+ // Perspective
772
+ model = new PerspectiveCamera(fov, aspect, nearClippingPlane, farClippingPlane);
773
+ if (focalLength !== null) model.setFocalLength(focalLength);
584
774
  break;
775
+
585
776
  case 1:
586
- model = new THREE.OrthographicCamera(
587
- -width / 2,
588
- width / 2,
589
- height / 2,
590
- -height / 2,
591
- nearClippingPlane,
592
- farClippingPlane
593
- );
777
+ // Orthographic
778
+ model = new OrthographicCamera(-width / 2, width / 2, height / 2, -height / 2, nearClippingPlane, farClippingPlane);
594
779
  break;
780
+
595
781
  default:
596
- console.warn("THREE.FBXLoader: Unknown camera type " + type + ".");
597
- model = new THREE.Object3D();
782
+ console.warn('THREE.FBXLoader: Unknown camera type ' + type + '.');
783
+ model = new Object3D();
598
784
  break;
599
785
  }
600
786
  }
787
+
601
788
  return model;
602
- }
789
+ } // Create a DirectionalLight, PointLight or SpotLight
790
+
791
+
603
792
  createLight(relationships) {
604
793
  let model;
605
794
  let lightAttribute;
606
- relationships.children.forEach(function(child) {
795
+ relationships.children.forEach(function (child) {
607
796
  const attr = fbxTree.Objects.NodeAttribute[child.ID];
608
- if (attr !== void 0) {
797
+
798
+ if (attr !== undefined) {
609
799
  lightAttribute = attr;
610
800
  }
611
801
  });
612
- if (lightAttribute === void 0) {
613
- model = new THREE.Object3D();
802
+
803
+ if (lightAttribute === undefined) {
804
+ model = new Object3D();
614
805
  } else {
615
- let type;
616
- if (lightAttribute.LightType === void 0) {
806
+ let type; // LightType can be undefined for Point lights
807
+
808
+ if (lightAttribute.LightType === undefined) {
617
809
  type = 0;
618
810
  } else {
619
811
  type = lightAttribute.LightType.value;
620
812
  }
621
- let color = 16777215;
622
- if (lightAttribute.Color !== void 0) {
623
- color = new THREE.Color().fromArray(lightAttribute.Color.value);
813
+
814
+ let color = 0xffffff;
815
+
816
+ if (lightAttribute.Color !== undefined) {
817
+ color = new Color().fromArray(lightAttribute.Color.value);
624
818
  }
625
- let intensity = lightAttribute.Intensity === void 0 ? 1 : lightAttribute.Intensity.value / 100;
626
- if (lightAttribute.CastLightOnObject !== void 0 && lightAttribute.CastLightOnObject.value === 0) {
819
+
820
+ let intensity = lightAttribute.Intensity === undefined ? 1 : lightAttribute.Intensity.value / 100; // light disabled
821
+
822
+ if (lightAttribute.CastLightOnObject !== undefined && lightAttribute.CastLightOnObject.value === 0) {
627
823
  intensity = 0;
628
824
  }
825
+
629
826
  let distance = 0;
630
- if (lightAttribute.FarAttenuationEnd !== void 0) {
631
- if (lightAttribute.EnableFarAttenuation !== void 0 && lightAttribute.EnableFarAttenuation.value === 0) {
827
+
828
+ if (lightAttribute.FarAttenuationEnd !== undefined) {
829
+ if (lightAttribute.EnableFarAttenuation !== undefined && lightAttribute.EnableFarAttenuation.value === 0) {
632
830
  distance = 0;
633
831
  } else {
634
832
  distance = lightAttribute.FarAttenuationEnd.value;
635
833
  }
636
- }
834
+ } // TODO: could this be calculated linearly from FarAttenuationStart to FarAttenuationEnd?
835
+
836
+
637
837
  const decay = 1;
838
+
638
839
  switch (type) {
639
840
  case 0:
640
- model = new THREE.PointLight(color, intensity, distance, decay);
841
+ // Point
842
+ model = new PointLight(color, intensity, distance, decay);
641
843
  break;
844
+
642
845
  case 1:
643
- model = new THREE.DirectionalLight(color, intensity);
846
+ // Directional
847
+ model = new DirectionalLight(color, intensity);
644
848
  break;
849
+
645
850
  case 2:
851
+ // Spot
646
852
  let angle = Math.PI / 3;
647
- if (lightAttribute.InnerAngle !== void 0) {
648
- angle = THREE.MathUtils.degToRad(lightAttribute.InnerAngle.value);
853
+
854
+ if (lightAttribute.InnerAngle !== undefined) {
855
+ angle = MathUtils.degToRad(lightAttribute.InnerAngle.value);
649
856
  }
857
+
650
858
  let penumbra = 0;
651
- if (lightAttribute.OuterAngle !== void 0) {
652
- penumbra = THREE.MathUtils.degToRad(lightAttribute.OuterAngle.value);
859
+
860
+ if (lightAttribute.OuterAngle !== undefined) {
861
+ // TODO: this is not correct - FBX calculates outer and inner angle in degrees
862
+ // with OuterAngle > InnerAngle && OuterAngle <= Math.PI
863
+ // while three.js uses a penumbra between (0, 1) to attenuate the inner angle
864
+ penumbra = MathUtils.degToRad(lightAttribute.OuterAngle.value);
653
865
  penumbra = Math.max(penumbra, 1);
654
866
  }
655
- model = new THREE.SpotLight(color, intensity, distance, angle, penumbra, decay);
867
+
868
+ model = new SpotLight(color, intensity, distance, angle, penumbra, decay);
656
869
  break;
870
+
657
871
  default:
658
- console.warn(
659
- "THREE.FBXLoader: Unknown light type " + lightAttribute.LightType.value + ", defaulting to a PointLight."
660
- );
661
- model = new THREE.PointLight(color, intensity);
872
+ console.warn('THREE.FBXLoader: Unknown light type ' + lightAttribute.LightType.value + ', defaulting to a PointLight.');
873
+ model = new PointLight(color, intensity);
662
874
  break;
663
875
  }
664
- if (lightAttribute.CastShadows !== void 0 && lightAttribute.CastShadows.value === 1) {
876
+
877
+ if (lightAttribute.CastShadows !== undefined && lightAttribute.CastShadows.value === 1) {
665
878
  model.castShadow = true;
666
879
  }
667
880
  }
881
+
668
882
  return model;
669
883
  }
884
+
670
885
  createMesh(relationships, geometryMap, materialMap) {
671
886
  let model;
672
887
  let geometry = null;
673
888
  let material = null;
674
- const materials = [];
675
- relationships.children.forEach(function(child) {
889
+ const materials = []; // get geometry and materials(s) from connections
890
+
891
+ relationships.children.forEach(function (child) {
676
892
  if (geometryMap.has(child.ID)) {
677
893
  geometry = geometryMap.get(child.ID);
678
894
  }
895
+
679
896
  if (materialMap.has(child.ID)) {
680
897
  materials.push(materialMap.get(child.ID));
681
898
  }
682
899
  });
900
+
683
901
  if (materials.length > 1) {
684
902
  material = materials;
685
903
  } else if (materials.length > 0) {
686
904
  material = materials[0];
687
905
  } else {
688
- material = new THREE.MeshPhongMaterial({ color: 13421772 });
906
+ material = new MeshPhongMaterial({
907
+ color: 0xcccccc
908
+ });
689
909
  materials.push(material);
690
910
  }
691
- if ("color" in geometry.attributes) {
692
- materials.forEach(function(material2) {
693
- material2.vertexColors = true;
911
+
912
+ if ('color' in geometry.attributes) {
913
+ materials.forEach(function (material) {
914
+ material.vertexColors = true;
694
915
  });
695
916
  }
917
+
696
918
  if (geometry.FBX_Deformer) {
697
- model = new THREE.SkinnedMesh(geometry, material);
919
+ model = new SkinnedMesh(geometry, material);
698
920
  model.normalizeSkinWeights();
699
921
  } else {
700
- model = new THREE.Mesh(geometry, material);
922
+ model = new Mesh(geometry, material);
701
923
  }
924
+
702
925
  return model;
703
926
  }
927
+
704
928
  createCurve(relationships, geometryMap) {
705
- const geometry = relationships.children.reduce(function(geo, child) {
706
- if (geometryMap.has(child.ID))
707
- geo = geometryMap.get(child.ID);
929
+ const geometry = relationships.children.reduce(function (geo, child) {
930
+ if (geometryMap.has(child.ID)) geo = geometryMap.get(child.ID);
708
931
  return geo;
709
- }, null);
710
- const material = new THREE.LineBasicMaterial({ color: 3342591, linewidth: 1 });
711
- return new THREE.Line(geometry, material);
712
- }
932
+ }, null); // FBX does not list materials for Nurbs lines, so we'll just put our own in here.
933
+
934
+ const material = new LineBasicMaterial({
935
+ color: 0x3300ff,
936
+ linewidth: 1
937
+ });
938
+ return new Line(geometry, material);
939
+ } // parse the model node for transform data
940
+
941
+
713
942
  getTransformData(model, modelNode) {
714
943
  const transformData = {};
715
- if ("InheritType" in modelNode)
716
- transformData.inheritType = parseInt(modelNode.InheritType.value);
717
- if ("RotationOrder" in modelNode)
718
- transformData.eulerOrder = getEulerOrder(modelNode.RotationOrder.value);
719
- else
720
- transformData.eulerOrder = "ZYX";
721
- if ("Lcl_Translation" in modelNode)
722
- transformData.translation = modelNode.Lcl_Translation.value;
723
- if ("PreRotation" in modelNode)
724
- transformData.preRotation = modelNode.PreRotation.value;
725
- if ("Lcl_Rotation" in modelNode)
726
- transformData.rotation = modelNode.Lcl_Rotation.value;
727
- if ("PostRotation" in modelNode)
728
- transformData.postRotation = modelNode.PostRotation.value;
729
- if ("Lcl_Scaling" in modelNode)
730
- transformData.scale = modelNode.Lcl_Scaling.value;
731
- if ("ScalingOffset" in modelNode)
732
- transformData.scalingOffset = modelNode.ScalingOffset.value;
733
- if ("ScalingPivot" in modelNode)
734
- transformData.scalingPivot = modelNode.ScalingPivot.value;
735
- if ("RotationOffset" in modelNode)
736
- transformData.rotationOffset = modelNode.RotationOffset.value;
737
- if ("RotationPivot" in modelNode)
738
- transformData.rotationPivot = modelNode.RotationPivot.value;
944
+ if ('InheritType' in modelNode) transformData.inheritType = parseInt(modelNode.InheritType.value);
945
+ if ('RotationOrder' in modelNode) transformData.eulerOrder = getEulerOrder(modelNode.RotationOrder.value);else transformData.eulerOrder = 'ZYX';
946
+ if ('Lcl_Translation' in modelNode) transformData.translation = modelNode.Lcl_Translation.value;
947
+ if ('PreRotation' in modelNode) transformData.preRotation = modelNode.PreRotation.value;
948
+ if ('Lcl_Rotation' in modelNode) transformData.rotation = modelNode.Lcl_Rotation.value;
949
+ if ('PostRotation' in modelNode) transformData.postRotation = modelNode.PostRotation.value;
950
+ if ('Lcl_Scaling' in modelNode) transformData.scale = modelNode.Lcl_Scaling.value;
951
+ if ('ScalingOffset' in modelNode) transformData.scalingOffset = modelNode.ScalingOffset.value;
952
+ if ('ScalingPivot' in modelNode) transformData.scalingPivot = modelNode.ScalingPivot.value;
953
+ if ('RotationOffset' in modelNode) transformData.rotationOffset = modelNode.RotationOffset.value;
954
+ if ('RotationPivot' in modelNode) transformData.rotationPivot = modelNode.RotationPivot.value;
739
955
  model.userData.transformData = transformData;
740
956
  }
957
+
741
958
  setLookAtProperties(model, modelNode) {
742
- if ("LookAtProperty" in modelNode) {
959
+ if ('LookAtProperty' in modelNode) {
743
960
  const children = connections.get(model.ID).children;
744
- children.forEach(function(child) {
745
- if (child.relationship === "LookAtProperty") {
961
+ children.forEach(function (child) {
962
+ if (child.relationship === 'LookAtProperty') {
746
963
  const lookAtTarget = fbxTree.Objects.Model[child.ID];
747
- if ("Lcl_Translation" in lookAtTarget) {
748
- const pos = lookAtTarget.Lcl_Translation.value;
749
- if (model.target !== void 0) {
964
+
965
+ if ('Lcl_Translation' in lookAtTarget) {
966
+ const pos = lookAtTarget.Lcl_Translation.value; // DirectionalLight, SpotLight
967
+
968
+ if (model.target !== undefined) {
750
969
  model.target.position.fromArray(pos);
751
970
  sceneGraph.add(model.target);
752
971
  } else {
753
- model.lookAt(new THREE.Vector3().fromArray(pos));
972
+ // Cameras and other Object3Ds
973
+ model.lookAt(new Vector3().fromArray(pos));
754
974
  }
755
975
  }
756
976
  }
757
977
  });
758
978
  }
759
979
  }
980
+
760
981
  bindSkeleton(skeletons, geometryMap, modelMap) {
761
982
  const bindMatrices = this.parsePoseNodes();
983
+
762
984
  for (const ID in skeletons) {
763
985
  const skeleton = skeletons[ID];
764
986
  const parents = connections.get(parseInt(skeleton.ID)).parents;
765
- parents.forEach(function(parent) {
987
+ parents.forEach(function (parent) {
766
988
  if (geometryMap.has(parent.ID)) {
767
989
  const geoID = parent.ID;
768
990
  const geoRelationships = connections.get(geoID);
769
- geoRelationships.parents.forEach(function(geoConnParent) {
991
+ geoRelationships.parents.forEach(function (geoConnParent) {
770
992
  if (modelMap.has(geoConnParent.ID)) {
771
993
  const model = modelMap.get(geoConnParent.ID);
772
- model.bind(new THREE.Skeleton(skeleton.bones), bindMatrices[geoConnParent.ID]);
994
+ model.bind(new Skeleton(skeleton.bones), bindMatrices[geoConnParent.ID]);
773
995
  }
774
996
  });
775
997
  }
776
998
  });
777
999
  }
778
1000
  }
1001
+
779
1002
  parsePoseNodes() {
780
1003
  const bindMatrices = {};
781
- if ("Pose" in fbxTree.Objects) {
1004
+
1005
+ if ('Pose' in fbxTree.Objects) {
782
1006
  const BindPoseNode = fbxTree.Objects.Pose;
1007
+
783
1008
  for (const nodeID in BindPoseNode) {
784
- if (BindPoseNode[nodeID].attrType === "BindPose" && BindPoseNode[nodeID].NbPoseNodes > 0) {
1009
+ if (BindPoseNode[nodeID].attrType === 'BindPose' && BindPoseNode[nodeID].NbPoseNodes > 0) {
785
1010
  const poseNodes = BindPoseNode[nodeID].PoseNode;
1011
+
786
1012
  if (Array.isArray(poseNodes)) {
787
- poseNodes.forEach(function(poseNode) {
788
- bindMatrices[poseNode.Node] = new THREE.Matrix4().fromArray(poseNode.Matrix.a);
1013
+ poseNodes.forEach(function (poseNode) {
1014
+ bindMatrices[poseNode.Node] = new Matrix4().fromArray(poseNode.Matrix.a);
789
1015
  });
790
1016
  } else {
791
- bindMatrices[poseNodes.Node] = new THREE.Matrix4().fromArray(poseNodes.Matrix.a);
1017
+ bindMatrices[poseNodes.Node] = new Matrix4().fromArray(poseNodes.Matrix.a);
792
1018
  }
793
1019
  }
794
1020
  }
795
1021
  }
1022
+
796
1023
  return bindMatrices;
797
- }
1024
+ } // Parse ambient color in FBXTree.GlobalSettings - if it's not set to black (default), create an ambient light
1025
+
1026
+
798
1027
  createAmbientLight() {
799
- if ("GlobalSettings" in fbxTree && "AmbientColor" in fbxTree.GlobalSettings) {
1028
+ if ('GlobalSettings' in fbxTree && 'AmbientColor' in fbxTree.GlobalSettings) {
800
1029
  const ambientColor = fbxTree.GlobalSettings.AmbientColor.value;
801
1030
  const r = ambientColor[0];
802
1031
  const g = ambientColor[1];
803
1032
  const b = ambientColor[2];
1033
+
804
1034
  if (r !== 0 || g !== 0 || b !== 0) {
805
- const color = new THREE.Color(r, g, b);
806
- sceneGraph.add(new THREE.AmbientLight(color, 1));
1035
+ const color = new Color(r, g, b);
1036
+ sceneGraph.add(new AmbientLight(color, 1));
807
1037
  }
808
1038
  }
809
1039
  }
810
- }
1040
+
1041
+ } // parse Geometry data from FBXTree and return map of BufferGeometries
1042
+
1043
+
811
1044
  class GeometryParser {
1045
+ // Parse nodes in FBXTree.Objects.Geometry
812
1046
  parse(deformers) {
813
- const geometryMap = /* @__PURE__ */ new Map();
814
- if ("Geometry" in fbxTree.Objects) {
1047
+ const geometryMap = new Map();
1048
+
1049
+ if ('Geometry' in fbxTree.Objects) {
815
1050
  const geoNodes = fbxTree.Objects.Geometry;
1051
+
816
1052
  for (const nodeID in geoNodes) {
817
1053
  const relationships = connections.get(parseInt(nodeID));
818
1054
  const geo = this.parseGeometry(relationships, geoNodes[nodeID], deformers);
819
1055
  geometryMap.set(parseInt(nodeID), geo);
820
1056
  }
821
1057
  }
1058
+
822
1059
  return geometryMap;
823
- }
1060
+ } // Parse single node in FBXTree.Objects.Geometry
1061
+
1062
+
824
1063
  parseGeometry(relationships, geoNode, deformers) {
825
1064
  switch (geoNode.attrType) {
826
- case "Mesh":
1065
+ case 'Mesh':
827
1066
  return this.parseMeshGeometry(relationships, geoNode, deformers);
828
- break;
829
- case "NurbsCurve":
1067
+
1068
+ case 'NurbsCurve':
830
1069
  return this.parseNurbsGeometry(geoNode);
831
- break;
832
1070
  }
833
- }
1071
+ } // Parse single node mesh geometry in FBXTree.Objects.Geometry
1072
+
1073
+
834
1074
  parseMeshGeometry(relationships, geoNode, deformers) {
835
1075
  const skeletons = deformers.skeletons;
836
1076
  const morphTargets = [];
837
- const modelNodes = relationships.parents.map(function(parent) {
1077
+ const modelNodes = relationships.parents.map(function (parent) {
838
1078
  return fbxTree.Objects.Model[parent.ID];
839
- });
840
- if (modelNodes.length === 0)
841
- return;
842
- const skeleton = relationships.children.reduce(function(skeleton2, child) {
843
- if (skeletons[child.ID] !== void 0)
844
- skeleton2 = skeletons[child.ID];
845
- return skeleton2;
1079
+ }); // don't create geometry if it is not associated with any models
1080
+
1081
+ if (modelNodes.length === 0) return;
1082
+ const skeleton = relationships.children.reduce(function (skeleton, child) {
1083
+ if (skeletons[child.ID] !== undefined) skeleton = skeletons[child.ID];
1084
+ return skeleton;
846
1085
  }, null);
847
- relationships.children.forEach(function(child) {
848
- if (deformers.morphTargets[child.ID] !== void 0) {
1086
+ relationships.children.forEach(function (child) {
1087
+ if (deformers.morphTargets[child.ID] !== undefined) {
849
1088
  morphTargets.push(deformers.morphTargets[child.ID]);
850
1089
  }
851
- });
1090
+ }); // Assume one model and get the preRotation from that
1091
+ // if there is more than one model associated with the geometry this may cause problems
1092
+
852
1093
  const modelNode = modelNodes[0];
853
1094
  const transformData = {};
854
- if ("RotationOrder" in modelNode)
855
- transformData.eulerOrder = getEulerOrder(modelNode.RotationOrder.value);
856
- if ("InheritType" in modelNode)
857
- transformData.inheritType = parseInt(modelNode.InheritType.value);
858
- if ("GeometricTranslation" in modelNode)
859
- transformData.translation = modelNode.GeometricTranslation.value;
860
- if ("GeometricRotation" in modelNode)
861
- transformData.rotation = modelNode.GeometricRotation.value;
862
- if ("GeometricScaling" in modelNode)
863
- transformData.scale = modelNode.GeometricScaling.value;
1095
+ if ('RotationOrder' in modelNode) transformData.eulerOrder = getEulerOrder(modelNode.RotationOrder.value);
1096
+ if ('InheritType' in modelNode) transformData.inheritType = parseInt(modelNode.InheritType.value);
1097
+ if ('GeometricTranslation' in modelNode) transformData.translation = modelNode.GeometricTranslation.value;
1098
+ if ('GeometricRotation' in modelNode) transformData.rotation = modelNode.GeometricRotation.value;
1099
+ if ('GeometricScaling' in modelNode) transformData.scale = modelNode.GeometricScaling.value;
864
1100
  const transform = generateTransform(transformData);
865
1101
  return this.genGeometry(geoNode, skeleton, morphTargets, transform);
866
- }
1102
+ } // Generate a BufferGeometry from a node in FBXTree.Objects.Geometry
1103
+
1104
+
867
1105
  genGeometry(geoNode, skeleton, morphTargets, preTransform) {
868
- const geo = new THREE.BufferGeometry();
869
- if (geoNode.attrName)
870
- geo.name = geoNode.attrName;
1106
+ const geo = new BufferGeometry();
1107
+ if (geoNode.attrName) geo.name = geoNode.attrName;
871
1108
  const geoInfo = this.parseGeoNode(geoNode, skeleton);
872
1109
  const buffers = this.genBuffers(geoInfo);
873
- const positionAttribute = new THREE.Float32BufferAttribute(buffers.vertex, 3);
1110
+ const positionAttribute = new Float32BufferAttribute(buffers.vertex, 3);
874
1111
  positionAttribute.applyMatrix4(preTransform);
875
- geo.setAttribute("position", positionAttribute);
1112
+ geo.setAttribute('position', positionAttribute);
1113
+
876
1114
  if (buffers.colors.length > 0) {
877
- geo.setAttribute("color", new THREE.Float32BufferAttribute(buffers.colors, 3));
1115
+ geo.setAttribute('color', new Float32BufferAttribute(buffers.colors, 3));
878
1116
  }
1117
+
879
1118
  if (skeleton) {
880
- geo.setAttribute("skinIndex", new THREE.Uint16BufferAttribute(buffers.weightsIndices, 4));
881
- geo.setAttribute("skinWeight", new THREE.Float32BufferAttribute(buffers.vertexWeights, 4));
1119
+ geo.setAttribute('skinIndex', new Uint16BufferAttribute(buffers.weightsIndices, 4));
1120
+ geo.setAttribute('skinWeight', new Float32BufferAttribute(buffers.vertexWeights, 4)); // used later to bind the skeleton to the model
1121
+
882
1122
  geo.FBX_Deformer = skeleton;
883
1123
  }
1124
+
884
1125
  if (buffers.normal.length > 0) {
885
- const normalMatrix = new THREE.Matrix3().getNormalMatrix(preTransform);
886
- const normalAttribute = new THREE.Float32BufferAttribute(buffers.normal, 3);
1126
+ const normalMatrix = new Matrix3().getNormalMatrix(preTransform);
1127
+ const normalAttribute = new Float32BufferAttribute(buffers.normal, 3);
887
1128
  normalAttribute.applyNormalMatrix(normalMatrix);
888
- geo.setAttribute("normal", normalAttribute);
1129
+ geo.setAttribute('normal', normalAttribute);
889
1130
  }
890
- buffers.uvs.forEach(function(uvBuffer, i) {
891
- let name = "uv" + (i + 1).toString();
1131
+
1132
+ buffers.uvs.forEach(function (uvBuffer, i) {
1133
+ // subsequent uv buffers are called 'uv1', 'uv2', ...
1134
+ let name = 'uv' + (i + 1).toString(); // the first uv buffer is just called 'uv'
1135
+
892
1136
  if (i === 0) {
893
- name = "uv";
1137
+ name = 'uv';
894
1138
  }
895
- geo.setAttribute(name, new THREE.Float32BufferAttribute(buffers.uvs[i], 2));
1139
+
1140
+ geo.setAttribute(name, new Float32BufferAttribute(buffers.uvs[i], 2));
896
1141
  });
897
- if (geoInfo.material && geoInfo.material.mappingType !== "AllSame") {
1142
+
1143
+ if (geoInfo.material && geoInfo.material.mappingType !== 'AllSame') {
1144
+ // Convert the material indices of each vertex into rendering groups on the geometry.
898
1145
  let prevMaterialIndex = buffers.materialIndex[0];
899
1146
  let startIndex = 0;
900
- buffers.materialIndex.forEach(function(currentIndex, i) {
1147
+ buffers.materialIndex.forEach(function (currentIndex, i) {
901
1148
  if (currentIndex !== prevMaterialIndex) {
902
1149
  geo.addGroup(startIndex, i - startIndex, prevMaterialIndex);
903
1150
  prevMaterialIndex = currentIndex;
904
1151
  startIndex = i;
905
1152
  }
906
- });
1153
+ }); // the loop above doesn't add the last group, do that here.
1154
+
907
1155
  if (geo.groups.length > 0) {
908
1156
  const lastGroup = geo.groups[geo.groups.length - 1];
909
1157
  const lastIndex = lastGroup.start + lastGroup.count;
1158
+
910
1159
  if (lastIndex !== buffers.materialIndex.length) {
911
1160
  geo.addGroup(lastIndex, buffers.materialIndex.length - lastIndex, prevMaterialIndex);
912
1161
  }
913
- }
1162
+ } // case where there are multiple materials but the whole geometry is only
1163
+ // using one of them
1164
+
1165
+
914
1166
  if (geo.groups.length === 0) {
915
1167
  geo.addGroup(0, buffers.materialIndex.length, buffers.materialIndex[0]);
916
1168
  }
917
1169
  }
1170
+
918
1171
  this.addMorphTargets(geo, geoNode, morphTargets, preTransform);
919
1172
  return geo;
920
1173
  }
1174
+
921
1175
  parseGeoNode(geoNode, skeleton) {
922
1176
  const geoInfo = {};
923
- geoInfo.vertexPositions = geoNode.Vertices !== void 0 ? geoNode.Vertices.a : [];
924
- geoInfo.vertexIndices = geoNode.PolygonVertexIndex !== void 0 ? geoNode.PolygonVertexIndex.a : [];
1177
+ geoInfo.vertexPositions = geoNode.Vertices !== undefined ? geoNode.Vertices.a : [];
1178
+ geoInfo.vertexIndices = geoNode.PolygonVertexIndex !== undefined ? geoNode.PolygonVertexIndex.a : [];
1179
+
925
1180
  if (geoNode.LayerElementColor) {
926
1181
  geoInfo.color = this.parseVertexColors(geoNode.LayerElementColor[0]);
927
1182
  }
1183
+
928
1184
  if (geoNode.LayerElementMaterial) {
929
1185
  geoInfo.material = this.parseMaterialIndices(geoNode.LayerElementMaterial[0]);
930
1186
  }
1187
+
931
1188
  if (geoNode.LayerElementNormal) {
932
1189
  geoInfo.normal = this.parseNormals(geoNode.LayerElementNormal[0]);
933
1190
  }
1191
+
934
1192
  if (geoNode.LayerElementUV) {
935
1193
  geoInfo.uv = [];
936
1194
  let i = 0;
1195
+
937
1196
  while (geoNode.LayerElementUV[i]) {
938
1197
  if (geoNode.LayerElementUV[i].UV) {
939
1198
  geoInfo.uv.push(this.parseUVs(geoNode.LayerElementUV[i]));
940
1199
  }
1200
+
941
1201
  i++;
942
1202
  }
943
1203
  }
1204
+
944
1205
  geoInfo.weightTable = {};
1206
+
945
1207
  if (skeleton !== null) {
946
1208
  geoInfo.skeleton = skeleton;
947
- skeleton.rawBones.forEach(function(rawBone, i) {
948
- rawBone.indices.forEach(function(index, j) {
949
- if (geoInfo.weightTable[index] === void 0)
950
- geoInfo.weightTable[index] = [];
1209
+ skeleton.rawBones.forEach(function (rawBone, i) {
1210
+ // loop over the bone's vertex indices and weights
1211
+ rawBone.indices.forEach(function (index, j) {
1212
+ if (geoInfo.weightTable[index] === undefined) geoInfo.weightTable[index] = [];
951
1213
  geoInfo.weightTable[index].push({
952
1214
  id: i,
953
1215
  weight: rawBone.weights[j]
@@ -955,8 +1217,10 @@ class GeometryParser {
955
1217
  });
956
1218
  });
957
1219
  }
1220
+
958
1221
  return geoInfo;
959
1222
  }
1223
+
960
1224
  genBuffers(geoInfo) {
961
1225
  const buffers = {
962
1226
  vertex: [],
@@ -969,7 +1233,8 @@ class GeometryParser {
969
1233
  };
970
1234
  let polygonIndex = 0;
971
1235
  let faceLength = 0;
972
- let displayedWeightsWarning = false;
1236
+ let displayedWeightsWarning = false; // these will hold data for a single face
1237
+
973
1238
  let facePositionIndexes = [];
974
1239
  let faceNormals = [];
975
1240
  let faceColors = [];
@@ -977,40 +1242,51 @@ class GeometryParser {
977
1242
  let faceWeights = [];
978
1243
  let faceWeightIndices = [];
979
1244
  const scope = this;
980
- geoInfo.vertexIndices.forEach(function(vertexIndex, polygonVertexIndex) {
1245
+ geoInfo.vertexIndices.forEach(function (vertexIndex, polygonVertexIndex) {
981
1246
  let materialIndex;
982
- let endOfFace = false;
1247
+ let endOfFace = false; // Face index and vertex index arrays are combined in a single array
1248
+ // A cube with quad faces looks like this:
1249
+ // PolygonVertexIndex: *24 {
1250
+ // a: 0, 1, 3, -3, 2, 3, 5, -5, 4, 5, 7, -7, 6, 7, 1, -1, 1, 7, 5, -4, 6, 0, 2, -5
1251
+ // }
1252
+ // Negative numbers mark the end of a face - first face here is 0, 1, 3, -3
1253
+ // to find index of last vertex bit shift the index: ^ - 1
1254
+
983
1255
  if (vertexIndex < 0) {
984
- vertexIndex = vertexIndex ^ -1;
1256
+ vertexIndex = vertexIndex ^ -1; // equivalent to ( x * -1 ) - 1
1257
+
985
1258
  endOfFace = true;
986
1259
  }
1260
+
987
1261
  let weightIndices = [];
988
1262
  let weights = [];
989
1263
  facePositionIndexes.push(vertexIndex * 3, vertexIndex * 3 + 1, vertexIndex * 3 + 2);
1264
+
990
1265
  if (geoInfo.color) {
991
1266
  const data = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.color);
992
1267
  faceColors.push(data[0], data[1], data[2]);
993
1268
  }
1269
+
994
1270
  if (geoInfo.skeleton) {
995
- if (geoInfo.weightTable[vertexIndex] !== void 0) {
996
- geoInfo.weightTable[vertexIndex].forEach(function(wt) {
1271
+ if (geoInfo.weightTable[vertexIndex] !== undefined) {
1272
+ geoInfo.weightTable[vertexIndex].forEach(function (wt) {
997
1273
  weights.push(wt.weight);
998
1274
  weightIndices.push(wt.id);
999
1275
  });
1000
1276
  }
1277
+
1001
1278
  if (weights.length > 4) {
1002
1279
  if (!displayedWeightsWarning) {
1003
- console.warn(
1004
- "THREE.FBXLoader: Vertex has more than 4 skinning weights assigned to vertex. Deleting additional weights."
1005
- );
1280
+ console.warn('THREE.FBXLoader: Vertex has more than 4 skinning weights assigned to vertex. Deleting additional weights.');
1006
1281
  displayedWeightsWarning = true;
1007
1282
  }
1283
+
1008
1284
  const wIndex = [0, 0, 0, 0];
1009
1285
  const Weight = [0, 0, 0, 0];
1010
- weights.forEach(function(weight, weightIndex) {
1286
+ weights.forEach(function (weight, weightIndex) {
1011
1287
  let currentWeight = weight;
1012
1288
  let currentIndex = weightIndices[weightIndex];
1013
- Weight.forEach(function(comparedWeight, comparedWeightIndex, comparedWeightArray) {
1289
+ Weight.forEach(function (comparedWeight, comparedWeightIndex, comparedWeightArray) {
1014
1290
  if (currentWeight > comparedWeight) {
1015
1291
  comparedWeightArray[comparedWeightIndex] = currentWeight;
1016
1292
  currentWeight = comparedWeight;
@@ -1022,49 +1298,49 @@ class GeometryParser {
1022
1298
  });
1023
1299
  weightIndices = wIndex;
1024
1300
  weights = Weight;
1025
- }
1301
+ } // if the weight array is shorter than 4 pad with 0s
1302
+
1303
+
1026
1304
  while (weights.length < 4) {
1027
1305
  weights.push(0);
1028
1306
  weightIndices.push(0);
1029
1307
  }
1308
+
1030
1309
  for (let i = 0; i < 4; ++i) {
1031
1310
  faceWeights.push(weights[i]);
1032
1311
  faceWeightIndices.push(weightIndices[i]);
1033
1312
  }
1034
1313
  }
1314
+
1035
1315
  if (geoInfo.normal) {
1036
1316
  const data = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.normal);
1037
1317
  faceNormals.push(data[0], data[1], data[2]);
1038
1318
  }
1039
- if (geoInfo.material && geoInfo.material.mappingType !== "AllSame") {
1319
+
1320
+ if (geoInfo.material && geoInfo.material.mappingType !== 'AllSame') {
1040
1321
  materialIndex = getData(polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.material)[0];
1041
1322
  }
1323
+
1042
1324
  if (geoInfo.uv) {
1043
- geoInfo.uv.forEach(function(uv, i) {
1325
+ geoInfo.uv.forEach(function (uv, i) {
1044
1326
  const data = getData(polygonVertexIndex, polygonIndex, vertexIndex, uv);
1045
- if (faceUVs[i] === void 0) {
1327
+
1328
+ if (faceUVs[i] === undefined) {
1046
1329
  faceUVs[i] = [];
1047
1330
  }
1331
+
1048
1332
  faceUVs[i].push(data[0]);
1049
1333
  faceUVs[i].push(data[1]);
1050
1334
  });
1051
1335
  }
1336
+
1052
1337
  faceLength++;
1338
+
1053
1339
  if (endOfFace) {
1054
- scope.genFace(
1055
- buffers,
1056
- geoInfo,
1057
- facePositionIndexes,
1058
- materialIndex,
1059
- faceNormals,
1060
- faceColors,
1061
- faceUVs,
1062
- faceWeights,
1063
- faceWeightIndices,
1064
- faceLength
1065
- );
1340
+ scope.genFace(buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength);
1066
1341
  polygonIndex++;
1067
- faceLength = 0;
1342
+ faceLength = 0; // reset arrays for the next face
1343
+
1068
1344
  facePositionIndexes = [];
1069
1345
  faceNormals = [];
1070
1346
  faceColors = [];
@@ -1074,7 +1350,9 @@ class GeometryParser {
1074
1350
  }
1075
1351
  });
1076
1352
  return buffers;
1077
- }
1353
+ } // Generate data for a single face in a geometry. If the face is a quad then split it into 2 tris
1354
+
1355
+
1078
1356
  genFace(buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength) {
1079
1357
  for (let i = 2; i < faceLength; i++) {
1080
1358
  buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[0]]);
@@ -1086,6 +1364,7 @@ class GeometryParser {
1086
1364
  buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i * 3]]);
1087
1365
  buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i * 3 + 1]]);
1088
1366
  buffers.vertex.push(geoInfo.vertexPositions[facePositionIndexes[i * 3 + 2]]);
1367
+
1089
1368
  if (geoInfo.skeleton) {
1090
1369
  buffers.vertexWeights.push(faceWeights[0]);
1091
1370
  buffers.vertexWeights.push(faceWeights[1]);
@@ -1112,6 +1391,7 @@ class GeometryParser {
1112
1391
  buffers.weightsIndices.push(faceWeightIndices[i * 4 + 2]);
1113
1392
  buffers.weightsIndices.push(faceWeightIndices[i * 4 + 3]);
1114
1393
  }
1394
+
1115
1395
  if (geoInfo.color) {
1116
1396
  buffers.colors.push(faceColors[0]);
1117
1397
  buffers.colors.push(faceColors[1]);
@@ -1123,11 +1403,13 @@ class GeometryParser {
1123
1403
  buffers.colors.push(faceColors[i * 3 + 1]);
1124
1404
  buffers.colors.push(faceColors[i * 3 + 2]);
1125
1405
  }
1126
- if (geoInfo.material && geoInfo.material.mappingType !== "AllSame") {
1406
+
1407
+ if (geoInfo.material && geoInfo.material.mappingType !== 'AllSame') {
1127
1408
  buffers.materialIndex.push(materialIndex);
1128
1409
  buffers.materialIndex.push(materialIndex);
1129
1410
  buffers.materialIndex.push(materialIndex);
1130
1411
  }
1412
+
1131
1413
  if (geoInfo.normal) {
1132
1414
  buffers.normal.push(faceNormals[0]);
1133
1415
  buffers.normal.push(faceNormals[1]);
@@ -1139,10 +1421,10 @@ class GeometryParser {
1139
1421
  buffers.normal.push(faceNormals[i * 3 + 1]);
1140
1422
  buffers.normal.push(faceNormals[i * 3 + 2]);
1141
1423
  }
1424
+
1142
1425
  if (geoInfo.uv) {
1143
- geoInfo.uv.forEach(function(uv, j) {
1144
- if (buffers.uvs[j] === void 0)
1145
- buffers.uvs[j] = [];
1426
+ geoInfo.uv.forEach(function (uv, j) {
1427
+ if (buffers.uvs[j] === undefined) buffers.uvs[j] = [];
1146
1428
  buffers.uvs[j].push(faceUVs[j][0]);
1147
1429
  buffers.uvs[j].push(faceUVs[j][1]);
1148
1430
  buffers.uvs[j].push(faceUVs[j][(i - 1) * 2]);
@@ -1153,181 +1435,234 @@ class GeometryParser {
1153
1435
  }
1154
1436
  }
1155
1437
  }
1438
+
1156
1439
  addMorphTargets(parentGeo, parentGeoNode, morphTargets, preTransform) {
1157
- if (morphTargets.length === 0)
1158
- return;
1440
+ if (morphTargets.length === 0) return;
1159
1441
  parentGeo.morphTargetsRelative = true;
1160
- parentGeo.morphAttributes.position = [];
1442
+ parentGeo.morphAttributes.position = []; // parentGeo.morphAttributes.normal = []; // not implemented
1443
+
1161
1444
  const scope = this;
1162
- morphTargets.forEach(function(morphTarget) {
1163
- morphTarget.rawTargets.forEach(function(rawTarget) {
1445
+ morphTargets.forEach(function (morphTarget) {
1446
+ morphTarget.rawTargets.forEach(function (rawTarget) {
1164
1447
  const morphGeoNode = fbxTree.Objects.Geometry[rawTarget.geoID];
1165
- if (morphGeoNode !== void 0) {
1448
+
1449
+ if (morphGeoNode !== undefined) {
1166
1450
  scope.genMorphGeometry(parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name);
1167
1451
  }
1168
1452
  });
1169
1453
  });
1170
- }
1454
+ } // a morph geometry node is similar to a standard node, and the node is also contained
1455
+ // in FBXTree.Objects.Geometry, however it can only have attributes for position, normal
1456
+ // and a special attribute Index defining which vertices of the original geometry are affected
1457
+ // Normal and position attributes only have data for the vertices that are affected by the morph
1458
+
1459
+
1171
1460
  genMorphGeometry(parentGeo, parentGeoNode, morphGeoNode, preTransform, name) {
1172
- const vertexIndices = parentGeoNode.PolygonVertexIndex !== void 0 ? parentGeoNode.PolygonVertexIndex.a : [];
1173
- const morphPositionsSparse = morphGeoNode.Vertices !== void 0 ? morphGeoNode.Vertices.a : [];
1174
- const indices = morphGeoNode.Indexes !== void 0 ? morphGeoNode.Indexes.a : [];
1461
+ const vertexIndices = parentGeoNode.PolygonVertexIndex !== undefined ? parentGeoNode.PolygonVertexIndex.a : [];
1462
+ const morphPositionsSparse = morphGeoNode.Vertices !== undefined ? morphGeoNode.Vertices.a : [];
1463
+ const indices = morphGeoNode.Indexes !== undefined ? morphGeoNode.Indexes.a : [];
1175
1464
  const length = parentGeo.attributes.position.count * 3;
1176
1465
  const morphPositions = new Float32Array(length);
1466
+
1177
1467
  for (let i = 0; i < indices.length; i++) {
1178
1468
  const morphIndex = indices[i] * 3;
1179
1469
  morphPositions[morphIndex] = morphPositionsSparse[i * 3];
1180
1470
  morphPositions[morphIndex + 1] = morphPositionsSparse[i * 3 + 1];
1181
1471
  morphPositions[morphIndex + 2] = morphPositionsSparse[i * 3 + 2];
1182
- }
1472
+ } // TODO: add morph normal support
1473
+
1474
+
1183
1475
  const morphGeoInfo = {
1184
- vertexIndices,
1476
+ vertexIndices: vertexIndices,
1185
1477
  vertexPositions: morphPositions
1186
1478
  };
1187
1479
  const morphBuffers = this.genBuffers(morphGeoInfo);
1188
- const positionAttribute = new THREE.Float32BufferAttribute(morphBuffers.vertex, 3);
1480
+ const positionAttribute = new Float32BufferAttribute(morphBuffers.vertex, 3);
1189
1481
  positionAttribute.name = name || morphGeoNode.attrName;
1190
1482
  positionAttribute.applyMatrix4(preTransform);
1191
1483
  parentGeo.morphAttributes.position.push(positionAttribute);
1192
- }
1484
+ } // Parse normal from FBXTree.Objects.Geometry.LayerElementNormal if it exists
1485
+
1486
+
1193
1487
  parseNormals(NormalNode) {
1194
1488
  const mappingType = NormalNode.MappingInformationType;
1195
1489
  const referenceType = NormalNode.ReferenceInformationType;
1196
1490
  const buffer = NormalNode.Normals.a;
1197
1491
  let indexBuffer = [];
1198
- if (referenceType === "IndexToDirect") {
1199
- if ("NormalIndex" in NormalNode) {
1492
+
1493
+ if (referenceType === 'IndexToDirect') {
1494
+ if ('NormalIndex' in NormalNode) {
1200
1495
  indexBuffer = NormalNode.NormalIndex.a;
1201
- } else if ("NormalsIndex" in NormalNode) {
1496
+ } else if ('NormalsIndex' in NormalNode) {
1202
1497
  indexBuffer = NormalNode.NormalsIndex.a;
1203
1498
  }
1204
1499
  }
1500
+
1205
1501
  return {
1206
1502
  dataSize: 3,
1207
- buffer,
1503
+ buffer: buffer,
1208
1504
  indices: indexBuffer,
1209
- mappingType,
1210
- referenceType
1505
+ mappingType: mappingType,
1506
+ referenceType: referenceType
1211
1507
  };
1212
- }
1508
+ } // Parse UVs from FBXTree.Objects.Geometry.LayerElementUV if it exists
1509
+
1510
+
1213
1511
  parseUVs(UVNode) {
1214
1512
  const mappingType = UVNode.MappingInformationType;
1215
1513
  const referenceType = UVNode.ReferenceInformationType;
1216
1514
  const buffer = UVNode.UV.a;
1217
1515
  let indexBuffer = [];
1218
- if (referenceType === "IndexToDirect") {
1516
+
1517
+ if (referenceType === 'IndexToDirect') {
1219
1518
  indexBuffer = UVNode.UVIndex.a;
1220
1519
  }
1520
+
1221
1521
  return {
1222
1522
  dataSize: 2,
1223
- buffer,
1523
+ buffer: buffer,
1224
1524
  indices: indexBuffer,
1225
- mappingType,
1226
- referenceType
1525
+ mappingType: mappingType,
1526
+ referenceType: referenceType
1227
1527
  };
1228
- }
1528
+ } // Parse Vertex Colors from FBXTree.Objects.Geometry.LayerElementColor if it exists
1529
+
1530
+
1229
1531
  parseVertexColors(ColorNode) {
1230
1532
  const mappingType = ColorNode.MappingInformationType;
1231
1533
  const referenceType = ColorNode.ReferenceInformationType;
1232
1534
  const buffer = ColorNode.Colors.a;
1233
1535
  let indexBuffer = [];
1234
- if (referenceType === "IndexToDirect") {
1536
+
1537
+ if (referenceType === 'IndexToDirect') {
1235
1538
  indexBuffer = ColorNode.ColorIndex.a;
1236
1539
  }
1540
+
1237
1541
  return {
1238
1542
  dataSize: 4,
1239
- buffer,
1543
+ buffer: buffer,
1240
1544
  indices: indexBuffer,
1241
- mappingType,
1242
- referenceType
1545
+ mappingType: mappingType,
1546
+ referenceType: referenceType
1243
1547
  };
1244
- }
1548
+ } // Parse mapping and material data in FBXTree.Objects.Geometry.LayerElementMaterial if it exists
1549
+
1550
+
1245
1551
  parseMaterialIndices(MaterialNode) {
1246
1552
  const mappingType = MaterialNode.MappingInformationType;
1247
1553
  const referenceType = MaterialNode.ReferenceInformationType;
1248
- if (mappingType === "NoMappingInformation") {
1554
+
1555
+ if (mappingType === 'NoMappingInformation') {
1249
1556
  return {
1250
1557
  dataSize: 1,
1251
1558
  buffer: [0],
1252
1559
  indices: [0],
1253
- mappingType: "AllSame",
1254
- referenceType
1560
+ mappingType: 'AllSame',
1561
+ referenceType: referenceType
1255
1562
  };
1256
1563
  }
1257
- const materialIndexBuffer = MaterialNode.Materials.a;
1564
+
1565
+ const materialIndexBuffer = MaterialNode.Materials.a; // Since materials are stored as indices, there's a bit of a mismatch between FBX and what
1566
+ // we expect.So we create an intermediate buffer that points to the index in the buffer,
1567
+ // for conforming with the other functions we've written for other data.
1568
+
1258
1569
  const materialIndices = [];
1570
+
1259
1571
  for (let i = 0; i < materialIndexBuffer.length; ++i) {
1260
1572
  materialIndices.push(i);
1261
1573
  }
1574
+
1262
1575
  return {
1263
1576
  dataSize: 1,
1264
1577
  buffer: materialIndexBuffer,
1265
1578
  indices: materialIndices,
1266
- mappingType,
1267
- referenceType
1579
+ mappingType: mappingType,
1580
+ referenceType: referenceType
1268
1581
  };
1269
- }
1582
+ } // Generate a NurbGeometry from a node in FBXTree.Objects.Geometry
1583
+
1584
+
1270
1585
  parseNurbsGeometry(geoNode) {
1271
- if (NURBSCurve.NURBSCurve === void 0) {
1272
- console.error(
1273
- "THREE.FBXLoader: The loader relies on NURBSCurve for any nurbs present in the model. Nurbs will show up as empty geometry."
1274
- );
1275
- return new THREE.BufferGeometry();
1586
+ if (NURBSCurve === undefined) {
1587
+ console.error('THREE.FBXLoader: The loader relies on NURBSCurve for any nurbs present in the model. Nurbs will show up as empty geometry.');
1588
+ return new BufferGeometry();
1276
1589
  }
1590
+
1277
1591
  const order = parseInt(geoNode.Order);
1592
+
1278
1593
  if (isNaN(order)) {
1279
- console.error("THREE.FBXLoader: Invalid Order %s given for geometry ID: %s", geoNode.Order, geoNode.id);
1280
- return new THREE.BufferGeometry();
1594
+ console.error('THREE.FBXLoader: Invalid Order %s given for geometry ID: %s', geoNode.Order, geoNode.id);
1595
+ return new BufferGeometry();
1281
1596
  }
1597
+
1282
1598
  const degree = order - 1;
1283
1599
  const knots = geoNode.KnotVector.a;
1284
1600
  const controlPoints = [];
1285
1601
  const pointsValues = geoNode.Points.a;
1602
+
1286
1603
  for (let i = 0, l = pointsValues.length; i < l; i += 4) {
1287
- controlPoints.push(new THREE.Vector4().fromArray(pointsValues, i));
1604
+ controlPoints.push(new Vector4().fromArray(pointsValues, i));
1288
1605
  }
1606
+
1289
1607
  let startKnot, endKnot;
1290
- if (geoNode.Form === "Closed") {
1608
+
1609
+ if (geoNode.Form === 'Closed') {
1291
1610
  controlPoints.push(controlPoints[0]);
1292
- } else if (geoNode.Form === "Periodic") {
1611
+ } else if (geoNode.Form === 'Periodic') {
1293
1612
  startKnot = degree;
1294
1613
  endKnot = knots.length - 1 - startKnot;
1614
+
1295
1615
  for (let i = 0; i < degree; ++i) {
1296
1616
  controlPoints.push(controlPoints[i]);
1297
1617
  }
1298
1618
  }
1299
- const curve = new NURBSCurve.NURBSCurve(degree, knots, controlPoints, startKnot, endKnot);
1619
+
1620
+ const curve = new NURBSCurve(degree, knots, controlPoints, startKnot, endKnot);
1300
1621
  const points = curve.getPoints(controlPoints.length * 12);
1301
- return new THREE.BufferGeometry().setFromPoints(points);
1622
+ return new BufferGeometry().setFromPoints(points);
1302
1623
  }
1303
- }
1624
+
1625
+ } // parse animation data from FBXTree
1626
+
1627
+
1304
1628
  class AnimationParser {
1629
+ // take raw animation clips and turn them into three.js animation clips
1305
1630
  parse() {
1306
1631
  const animationClips = [];
1307
1632
  const rawClips = this.parseClips();
1308
- if (rawClips !== void 0) {
1633
+
1634
+ if (rawClips !== undefined) {
1309
1635
  for (const key in rawClips) {
1310
1636
  const rawClip = rawClips[key];
1311
1637
  const clip = this.addClip(rawClip);
1312
1638
  animationClips.push(clip);
1313
1639
  }
1314
1640
  }
1641
+
1315
1642
  return animationClips;
1316
1643
  }
1644
+
1317
1645
  parseClips() {
1318
- if (fbxTree.Objects.AnimationCurve === void 0)
1319
- return void 0;
1646
+ // since the actual transformation data is stored in FBXTree.Objects.AnimationCurve,
1647
+ // if this is undefined we can safely assume there are no animations
1648
+ if (fbxTree.Objects.AnimationCurve === undefined) return undefined;
1320
1649
  const curveNodesMap = this.parseAnimationCurveNodes();
1321
1650
  this.parseAnimationCurves(curveNodesMap);
1322
1651
  const layersMap = this.parseAnimationLayers(curveNodesMap);
1323
1652
  const rawClips = this.parseAnimStacks(layersMap);
1324
1653
  return rawClips;
1325
- }
1654
+ } // parse nodes in FBXTree.Objects.AnimationCurveNode
1655
+ // each AnimationCurveNode holds data for an animation transform for a model (e.g. left arm rotation )
1656
+ // and is referenced by an AnimationLayer
1657
+
1658
+
1326
1659
  parseAnimationCurveNodes() {
1327
1660
  const rawCurveNodes = fbxTree.Objects.AnimationCurveNode;
1328
- const curveNodesMap = /* @__PURE__ */ new Map();
1661
+ const curveNodesMap = new Map();
1662
+
1329
1663
  for (const nodeID in rawCurveNodes) {
1330
1664
  const rawCurveNode = rawCurveNodes[nodeID];
1665
+
1331
1666
  if (rawCurveNode.attrName.match(/S|R|T|DeformPercent/) !== null) {
1332
1667
  const curveNode = {
1333
1668
  id: rawCurveNode.id,
@@ -1337,10 +1672,21 @@ class AnimationParser {
1337
1672
  curveNodesMap.set(curveNode.id, curveNode);
1338
1673
  }
1339
1674
  }
1675
+
1340
1676
  return curveNodesMap;
1341
- }
1677
+ } // parse nodes in FBXTree.Objects.AnimationCurve and connect them up to
1678
+ // previously parsed AnimationCurveNodes. Each AnimationCurve holds data for a single animated
1679
+ // axis ( e.g. times and values of x rotation)
1680
+
1681
+
1342
1682
  parseAnimationCurves(curveNodesMap) {
1343
- const rawCurves = fbxTree.Objects.AnimationCurve;
1683
+ const rawCurves = fbxTree.Objects.AnimationCurve; // TODO: Many values are identical up to roundoff error, but won't be optimised
1684
+ // e.g. position times: [0, 0.4, 0. 8]
1685
+ // position values: [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.235384487103147e-7, 93.67520904541016, -0.9982695579528809]
1686
+ // clearly, this should be optimised to
1687
+ // times: [0], positions [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809]
1688
+ // this shows up in nearly every FBX file, and generally time array is length > 100
1689
+
1344
1690
  for (const nodeID in rawCurves) {
1345
1691
  const animationCurve = {
1346
1692
  id: rawCurves[nodeID].id,
@@ -1348,83 +1694,96 @@ class AnimationParser {
1348
1694
  values: rawCurves[nodeID].KeyValueFloat.a
1349
1695
  };
1350
1696
  const relationships = connections.get(animationCurve.id);
1351
- if (relationships !== void 0) {
1697
+
1698
+ if (relationships !== undefined) {
1352
1699
  const animationCurveID = relationships.parents[0].ID;
1353
1700
  const animationCurveRelationship = relationships.parents[0].relationship;
1701
+
1354
1702
  if (animationCurveRelationship.match(/X/)) {
1355
- curveNodesMap.get(animationCurveID).curves["x"] = animationCurve;
1703
+ curveNodesMap.get(animationCurveID).curves['x'] = animationCurve;
1356
1704
  } else if (animationCurveRelationship.match(/Y/)) {
1357
- curveNodesMap.get(animationCurveID).curves["y"] = animationCurve;
1705
+ curveNodesMap.get(animationCurveID).curves['y'] = animationCurve;
1358
1706
  } else if (animationCurveRelationship.match(/Z/)) {
1359
- curveNodesMap.get(animationCurveID).curves["z"] = animationCurve;
1707
+ curveNodesMap.get(animationCurveID).curves['z'] = animationCurve;
1360
1708
  } else if (animationCurveRelationship.match(/d|DeformPercent/) && curveNodesMap.has(animationCurveID)) {
1361
- curveNodesMap.get(animationCurveID).curves["morph"] = animationCurve;
1709
+ curveNodesMap.get(animationCurveID).curves['morph'] = animationCurve;
1362
1710
  }
1363
1711
  }
1364
1712
  }
1365
- }
1713
+ } // parse nodes in FBXTree.Objects.AnimationLayer. Each layers holds references
1714
+ // to various AnimationCurveNodes and is referenced by an AnimationStack node
1715
+ // note: theoretically a stack can have multiple layers, however in practice there always seems to be one per stack
1716
+
1717
+
1366
1718
  parseAnimationLayers(curveNodesMap) {
1367
1719
  const rawLayers = fbxTree.Objects.AnimationLayer;
1368
- const layersMap = /* @__PURE__ */ new Map();
1720
+ const layersMap = new Map();
1721
+
1369
1722
  for (const nodeID in rawLayers) {
1370
1723
  const layerCurveNodes = [];
1371
1724
  const connection = connections.get(parseInt(nodeID));
1372
- if (connection !== void 0) {
1725
+
1726
+ if (connection !== undefined) {
1727
+ // all the animationCurveNodes used in the layer
1373
1728
  const children = connection.children;
1374
- children.forEach(function(child, i) {
1729
+ children.forEach(function (child, i) {
1375
1730
  if (curveNodesMap.has(child.ID)) {
1376
- const curveNode = curveNodesMap.get(child.ID);
1377
- if (curveNode.curves.x !== void 0 || curveNode.curves.y !== void 0 || curveNode.curves.z !== void 0) {
1378
- if (layerCurveNodes[i] === void 0) {
1379
- const modelID = connections.get(child.ID).parents.filter(function(parent) {
1380
- return parent.relationship !== void 0;
1731
+ const curveNode = curveNodesMap.get(child.ID); // check that the curves are defined for at least one axis, otherwise ignore the curveNode
1732
+
1733
+ if (curveNode.curves.x !== undefined || curveNode.curves.y !== undefined || curveNode.curves.z !== undefined) {
1734
+ if (layerCurveNodes[i] === undefined) {
1735
+ const modelID = connections.get(child.ID).parents.filter(function (parent) {
1736
+ return parent.relationship !== undefined;
1381
1737
  })[0].ID;
1382
- if (modelID !== void 0) {
1738
+
1739
+ if (modelID !== undefined) {
1383
1740
  const rawModel = fbxTree.Objects.Model[modelID.toString()];
1384
- if (rawModel === void 0) {
1385
- console.warn("THREE.FBXLoader: Encountered a unused curve.", child);
1741
+
1742
+ if (rawModel === undefined) {
1743
+ console.warn('THREE.FBXLoader: Encountered a unused curve.', child);
1386
1744
  return;
1387
1745
  }
1746
+
1388
1747
  const node = {
1389
- modelName: rawModel.attrName ? THREE.PropertyBinding.sanitizeNodeName(rawModel.attrName) : "",
1748
+ modelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName(rawModel.attrName) : '',
1390
1749
  ID: rawModel.id,
1391
1750
  initialPosition: [0, 0, 0],
1392
1751
  initialRotation: [0, 0, 0],
1393
1752
  initialScale: [1, 1, 1]
1394
1753
  };
1395
- sceneGraph.traverse(function(child2) {
1396
- if (child2.ID === rawModel.id) {
1397
- node.transform = child2.matrix;
1398
- if (child2.userData.transformData)
1399
- node.eulerOrder = child2.userData.transformData.eulerOrder;
1754
+ sceneGraph.traverse(function (child) {
1755
+ if (child.ID === rawModel.id) {
1756
+ node.transform = child.matrix;
1757
+ if (child.userData.transformData) node.eulerOrder = child.userData.transformData.eulerOrder;
1400
1758
  }
1401
1759
  });
1402
- if (!node.transform)
1403
- node.transform = new THREE.Matrix4();
1404
- if ("PreRotation" in rawModel)
1405
- node.preRotation = rawModel.PreRotation.value;
1406
- if ("PostRotation" in rawModel)
1407
- node.postRotation = rawModel.PostRotation.value;
1760
+ if (!node.transform) node.transform = new Matrix4(); // if the animated model is pre rotated, we'll have to apply the pre rotations to every
1761
+ // animation value as well
1762
+
1763
+ if ('PreRotation' in rawModel) node.preRotation = rawModel.PreRotation.value;
1764
+ if ('PostRotation' in rawModel) node.postRotation = rawModel.PostRotation.value;
1408
1765
  layerCurveNodes[i] = node;
1409
1766
  }
1410
1767
  }
1411
- if (layerCurveNodes[i])
1412
- layerCurveNodes[i][curveNode.attr] = curveNode;
1413
- } else if (curveNode.curves.morph !== void 0) {
1414
- if (layerCurveNodes[i] === void 0) {
1415
- const deformerID = connections.get(child.ID).parents.filter(function(parent) {
1416
- return parent.relationship !== void 0;
1768
+
1769
+ if (layerCurveNodes[i]) layerCurveNodes[i][curveNode.attr] = curveNode;
1770
+ } else if (curveNode.curves.morph !== undefined) {
1771
+ if (layerCurveNodes[i] === undefined) {
1772
+ const deformerID = connections.get(child.ID).parents.filter(function (parent) {
1773
+ return parent.relationship !== undefined;
1417
1774
  })[0].ID;
1418
1775
  const morpherID = connections.get(deformerID).parents[0].ID;
1419
- const geoID = connections.get(morpherID).parents[0].ID;
1776
+ const geoID = connections.get(morpherID).parents[0].ID; // assuming geometry is not used in more than one model
1777
+
1420
1778
  const modelID = connections.get(geoID).parents[0].ID;
1421
1779
  const rawModel = fbxTree.Objects.Model[modelID];
1422
1780
  const node = {
1423
- modelName: rawModel.attrName ? THREE.PropertyBinding.sanitizeNodeName(rawModel.attrName) : "",
1781
+ modelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName(rawModel.attrName) : '',
1424
1782
  morphName: fbxTree.Objects.Deformer[deformerID].attrName
1425
1783
  };
1426
1784
  layerCurveNodes[i] = node;
1427
1785
  }
1786
+
1428
1787
  layerCurveNodes[i][curveNode.attr] = curveNode;
1429
1788
  }
1430
1789
  }
@@ -1432,182 +1791,194 @@ class AnimationParser {
1432
1791
  layersMap.set(parseInt(nodeID), layerCurveNodes);
1433
1792
  }
1434
1793
  }
1794
+
1435
1795
  return layersMap;
1436
- }
1796
+ } // parse nodes in FBXTree.Objects.AnimationStack. These are the top level node in the animation
1797
+ // hierarchy. Each Stack node will be used to create a AnimationClip
1798
+
1799
+
1437
1800
  parseAnimStacks(layersMap) {
1438
- const rawStacks = fbxTree.Objects.AnimationStack;
1801
+ const rawStacks = fbxTree.Objects.AnimationStack; // connect the stacks (clips) up to the layers
1802
+
1439
1803
  const rawClips = {};
1804
+
1440
1805
  for (const nodeID in rawStacks) {
1441
1806
  const children = connections.get(parseInt(nodeID)).children;
1807
+
1442
1808
  if (children.length > 1) {
1443
- console.warn(
1444
- "THREE.FBXLoader: Encountered an animation stack with multiple layers, this is currently not supported. Ignoring subsequent layers."
1445
- );
1809
+ // it seems like stacks will always be associated with a single layer. But just in case there are files
1810
+ // where there are multiple layers per stack, we'll display a warning
1811
+ console.warn('THREE.FBXLoader: Encountered an animation stack with multiple layers, this is currently not supported. Ignoring subsequent layers.');
1446
1812
  }
1813
+
1447
1814
  const layer = layersMap.get(children[0].ID);
1448
1815
  rawClips[nodeID] = {
1449
1816
  name: rawStacks[nodeID].attrName,
1450
- layer
1817
+ layer: layer
1451
1818
  };
1452
1819
  }
1820
+
1453
1821
  return rawClips;
1454
1822
  }
1823
+
1455
1824
  addClip(rawClip) {
1456
1825
  let tracks = [];
1457
1826
  const scope = this;
1458
- rawClip.layer.forEach(function(rawTracks) {
1827
+ rawClip.layer.forEach(function (rawTracks) {
1459
1828
  tracks = tracks.concat(scope.generateTracks(rawTracks));
1460
1829
  });
1461
- return new THREE.AnimationClip(rawClip.name, -1, tracks);
1830
+ return new AnimationClip(rawClip.name, -1, tracks);
1462
1831
  }
1832
+
1463
1833
  generateTracks(rawTracks) {
1464
1834
  const tracks = [];
1465
- let initialPosition = new THREE.Vector3();
1466
- let initialRotation = new THREE.Quaternion();
1467
- let initialScale = new THREE.Vector3();
1468
- if (rawTracks.transform)
1469
- rawTracks.transform.decompose(initialPosition, initialRotation, initialScale);
1835
+ let initialPosition = new Vector3();
1836
+ let initialRotation = new Quaternion();
1837
+ let initialScale = new Vector3();
1838
+ if (rawTracks.transform) rawTracks.transform.decompose(initialPosition, initialRotation, initialScale);
1470
1839
  initialPosition = initialPosition.toArray();
1471
- initialRotation = new THREE.Euler().setFromQuaternion(initialRotation, rawTracks.eulerOrder).toArray();
1840
+ initialRotation = new Euler().setFromQuaternion(initialRotation, rawTracks.eulerOrder).toArray();
1472
1841
  initialScale = initialScale.toArray();
1473
- if (rawTracks.T !== void 0 && Object.keys(rawTracks.T.curves).length > 0) {
1474
- const positionTrack = this.generateVectorTrack(
1475
- rawTracks.modelName,
1476
- rawTracks.T.curves,
1477
- initialPosition,
1478
- "position"
1479
- );
1480
- if (positionTrack !== void 0)
1481
- tracks.push(positionTrack);
1482
- }
1483
- if (rawTracks.R !== void 0 && Object.keys(rawTracks.R.curves).length > 0) {
1484
- const rotationTrack = this.generateRotationTrack(
1485
- rawTracks.modelName,
1486
- rawTracks.R.curves,
1487
- initialRotation,
1488
- rawTracks.preRotation,
1489
- rawTracks.postRotation,
1490
- rawTracks.eulerOrder
1491
- );
1492
- if (rotationTrack !== void 0)
1493
- tracks.push(rotationTrack);
1494
- }
1495
- if (rawTracks.S !== void 0 && Object.keys(rawTracks.S.curves).length > 0) {
1496
- const scaleTrack = this.generateVectorTrack(rawTracks.modelName, rawTracks.S.curves, initialScale, "scale");
1497
- if (scaleTrack !== void 0)
1498
- tracks.push(scaleTrack);
1499
- }
1500
- if (rawTracks.DeformPercent !== void 0) {
1842
+
1843
+ if (rawTracks.T !== undefined && Object.keys(rawTracks.T.curves).length > 0) {
1844
+ const positionTrack = this.generateVectorTrack(rawTracks.modelName, rawTracks.T.curves, initialPosition, 'position');
1845
+ if (positionTrack !== undefined) tracks.push(positionTrack);
1846
+ }
1847
+
1848
+ if (rawTracks.R !== undefined && Object.keys(rawTracks.R.curves).length > 0) {
1849
+ const rotationTrack = this.generateRotationTrack(rawTracks.modelName, rawTracks.R.curves, initialRotation, rawTracks.preRotation, rawTracks.postRotation, rawTracks.eulerOrder);
1850
+ if (rotationTrack !== undefined) tracks.push(rotationTrack);
1851
+ }
1852
+
1853
+ if (rawTracks.S !== undefined && Object.keys(rawTracks.S.curves).length > 0) {
1854
+ const scaleTrack = this.generateVectorTrack(rawTracks.modelName, rawTracks.S.curves, initialScale, 'scale');
1855
+ if (scaleTrack !== undefined) tracks.push(scaleTrack);
1856
+ }
1857
+
1858
+ if (rawTracks.DeformPercent !== undefined) {
1501
1859
  const morphTrack = this.generateMorphTrack(rawTracks);
1502
- if (morphTrack !== void 0)
1503
- tracks.push(morphTrack);
1860
+ if (morphTrack !== undefined) tracks.push(morphTrack);
1504
1861
  }
1862
+
1505
1863
  return tracks;
1506
1864
  }
1865
+
1507
1866
  generateVectorTrack(modelName, curves, initialValue, type) {
1508
1867
  const times = this.getTimesForAllAxes(curves);
1509
1868
  const values = this.getKeyframeTrackValues(times, curves, initialValue);
1510
- return new THREE.VectorKeyframeTrack(modelName + "." + type, times, values);
1869
+ return new VectorKeyframeTrack(modelName + '.' + type, times, values);
1511
1870
  }
1871
+
1512
1872
  generateRotationTrack(modelName, curves, initialValue, preRotation, postRotation, eulerOrder) {
1513
- if (curves.x !== void 0) {
1873
+ if (curves.x !== undefined) {
1514
1874
  this.interpolateRotations(curves.x);
1515
- curves.x.values = curves.x.values.map(THREE.MathUtils.degToRad);
1875
+ curves.x.values = curves.x.values.map(MathUtils.degToRad);
1516
1876
  }
1517
- if (curves.y !== void 0) {
1877
+
1878
+ if (curves.y !== undefined) {
1518
1879
  this.interpolateRotations(curves.y);
1519
- curves.y.values = curves.y.values.map(THREE.MathUtils.degToRad);
1880
+ curves.y.values = curves.y.values.map(MathUtils.degToRad);
1520
1881
  }
1521
- if (curves.z !== void 0) {
1882
+
1883
+ if (curves.z !== undefined) {
1522
1884
  this.interpolateRotations(curves.z);
1523
- curves.z.values = curves.z.values.map(THREE.MathUtils.degToRad);
1885
+ curves.z.values = curves.z.values.map(MathUtils.degToRad);
1524
1886
  }
1887
+
1525
1888
  const times = this.getTimesForAllAxes(curves);
1526
1889
  const values = this.getKeyframeTrackValues(times, curves, initialValue);
1527
- if (preRotation !== void 0) {
1528
- preRotation = preRotation.map(THREE.MathUtils.degToRad);
1890
+
1891
+ if (preRotation !== undefined) {
1892
+ preRotation = preRotation.map(MathUtils.degToRad);
1529
1893
  preRotation.push(eulerOrder);
1530
- preRotation = new THREE.Euler().fromArray(preRotation);
1531
- preRotation = new THREE.Quaternion().setFromEuler(preRotation);
1894
+ preRotation = new Euler().fromArray(preRotation);
1895
+ preRotation = new Quaternion().setFromEuler(preRotation);
1532
1896
  }
1533
- if (postRotation !== void 0) {
1534
- postRotation = postRotation.map(THREE.MathUtils.degToRad);
1897
+
1898
+ if (postRotation !== undefined) {
1899
+ postRotation = postRotation.map(MathUtils.degToRad);
1535
1900
  postRotation.push(eulerOrder);
1536
- postRotation = new THREE.Euler().fromArray(postRotation);
1537
- postRotation = new THREE.Quaternion().setFromEuler(postRotation).invert();
1901
+ postRotation = new Euler().fromArray(postRotation);
1902
+ postRotation = new Quaternion().setFromEuler(postRotation).invert();
1538
1903
  }
1539
- const quaternion = new THREE.Quaternion();
1540
- const euler = new THREE.Euler();
1904
+
1905
+ const quaternion = new Quaternion();
1906
+ const euler = new Euler();
1541
1907
  const quaternionValues = [];
1908
+
1542
1909
  for (let i = 0; i < values.length; i += 3) {
1543
1910
  euler.set(values[i], values[i + 1], values[i + 2], eulerOrder);
1544
1911
  quaternion.setFromEuler(euler);
1545
- if (preRotation !== void 0)
1546
- quaternion.premultiply(preRotation);
1547
- if (postRotation !== void 0)
1548
- quaternion.multiply(postRotation);
1912
+ if (preRotation !== undefined) quaternion.premultiply(preRotation);
1913
+ if (postRotation !== undefined) quaternion.multiply(postRotation);
1549
1914
  quaternion.toArray(quaternionValues, i / 3 * 4);
1550
1915
  }
1551
- return new THREE.QuaternionKeyframeTrack(modelName + ".quaternion", times, quaternionValues);
1916
+
1917
+ return new QuaternionKeyframeTrack(modelName + '.quaternion', times, quaternionValues);
1552
1918
  }
1919
+
1553
1920
  generateMorphTrack(rawTracks) {
1554
1921
  const curves = rawTracks.DeformPercent.curves.morph;
1555
- const values = curves.values.map(function(val) {
1922
+ const values = curves.values.map(function (val) {
1556
1923
  return val / 100;
1557
1924
  });
1558
1925
  const morphNum = sceneGraph.getObjectByName(rawTracks.modelName).morphTargetDictionary[rawTracks.morphName];
1559
- return new THREE.NumberKeyframeTrack(
1560
- rawTracks.modelName + ".morphTargetInfluences[" + morphNum + "]",
1561
- curves.times,
1562
- values
1563
- );
1564
- }
1926
+ return new NumberKeyframeTrack(rawTracks.modelName + '.morphTargetInfluences[' + morphNum + ']', curves.times, values);
1927
+ } // For all animated objects, times are defined separately for each axis
1928
+ // Here we'll combine the times into one sorted array without duplicates
1929
+
1930
+
1565
1931
  getTimesForAllAxes(curves) {
1566
- let times = [];
1567
- if (curves.x !== void 0)
1568
- times = times.concat(curves.x.times);
1569
- if (curves.y !== void 0)
1570
- times = times.concat(curves.y.times);
1571
- if (curves.z !== void 0)
1572
- times = times.concat(curves.z.times);
1573
- times = times.sort(function(a, b) {
1932
+ let times = []; // first join together the times for each axis, if defined
1933
+
1934
+ if (curves.x !== undefined) times = times.concat(curves.x.times);
1935
+ if (curves.y !== undefined) times = times.concat(curves.y.times);
1936
+ if (curves.z !== undefined) times = times.concat(curves.z.times); // then sort them
1937
+
1938
+ times = times.sort(function (a, b) {
1574
1939
  return a - b;
1575
- });
1940
+ }); // and remove duplicates
1941
+
1576
1942
  if (times.length > 1) {
1577
1943
  let targetIndex = 1;
1578
1944
  let lastValue = times[0];
1945
+
1579
1946
  for (let i = 1; i < times.length; i++) {
1580
1947
  const currentValue = times[i];
1948
+
1581
1949
  if (currentValue !== lastValue) {
1582
1950
  times[targetIndex] = currentValue;
1583
1951
  lastValue = currentValue;
1584
1952
  targetIndex++;
1585
1953
  }
1586
1954
  }
1955
+
1587
1956
  times = times.slice(0, targetIndex);
1588
1957
  }
1958
+
1589
1959
  return times;
1590
1960
  }
1961
+
1591
1962
  getKeyframeTrackValues(times, curves, initialValue) {
1592
1963
  const prevValue = initialValue;
1593
1964
  const values = [];
1594
1965
  let xIndex = -1;
1595
1966
  let yIndex = -1;
1596
1967
  let zIndex = -1;
1597
- times.forEach(function(time) {
1598
- if (curves.x)
1599
- xIndex = curves.x.times.indexOf(time);
1600
- if (curves.y)
1601
- yIndex = curves.y.times.indexOf(time);
1602
- if (curves.z)
1603
- zIndex = curves.z.times.indexOf(time);
1968
+ times.forEach(function (time) {
1969
+ if (curves.x) xIndex = curves.x.times.indexOf(time);
1970
+ if (curves.y) yIndex = curves.y.times.indexOf(time);
1971
+ if (curves.z) zIndex = curves.z.times.indexOf(time); // if there is an x value defined for this frame, use that
1972
+
1604
1973
  if (xIndex !== -1) {
1605
1974
  const xValue = curves.x.values[xIndex];
1606
1975
  values.push(xValue);
1607
1976
  prevValue[0] = xValue;
1608
1977
  } else {
1978
+ // otherwise use the x value from the previous frame
1609
1979
  values.push(prevValue[0]);
1610
1980
  }
1981
+
1611
1982
  if (yIndex !== -1) {
1612
1983
  const yValue = curves.y.values[yIndex];
1613
1984
  values.push(yValue);
@@ -1615,6 +1986,7 @@ class AnimationParser {
1615
1986
  } else {
1616
1987
  values.push(prevValue[1]);
1617
1988
  }
1989
+
1618
1990
  if (zIndex !== -1) {
1619
1991
  const zValue = curves.z.values[zIndex];
1620
1992
  values.push(zValue);
@@ -1624,12 +1996,17 @@ class AnimationParser {
1624
1996
  }
1625
1997
  });
1626
1998
  return values;
1627
- }
1999
+ } // Rotations are defined as Euler angles which can have values of any size
2000
+ // These will be converted to quaternions which don't support values greater than
2001
+ // PI, so we'll interpolate large rotations
2002
+
2003
+
1628
2004
  interpolateRotations(curve) {
1629
2005
  for (let i = 1; i < curve.values.length; i++) {
1630
2006
  const initialValue = curve.values[i - 1];
1631
2007
  const valuesSpan = curve.values[i] - initialValue;
1632
2008
  const absoluteSpan = Math.abs(valuesSpan);
2009
+
1633
2010
  if (absoluteSpan >= 180) {
1634
2011
  const numSubIntervals = absoluteSpan / 180;
1635
2012
  const step = valuesSpan / numSubIntervals;
@@ -1640,56 +2017,67 @@ class AnimationParser {
1640
2017
  let nextTime = initialTime + interval;
1641
2018
  const interpolatedTimes = [];
1642
2019
  const interpolatedValues = [];
2020
+
1643
2021
  while (nextTime < curve.times[i]) {
1644
2022
  interpolatedTimes.push(nextTime);
1645
2023
  nextTime += interval;
1646
2024
  interpolatedValues.push(nextValue);
1647
2025
  nextValue += step;
1648
2026
  }
2027
+
1649
2028
  curve.times = inject(curve.times, i, interpolatedTimes);
1650
2029
  curve.values = inject(curve.values, i, interpolatedValues);
1651
2030
  }
1652
2031
  }
1653
2032
  }
1654
- }
2033
+
2034
+ } // parse an FBX file in ASCII format
2035
+
2036
+
1655
2037
  class TextParser {
1656
2038
  getPrevNode() {
1657
2039
  return this.nodeStack[this.currentIndent - 2];
1658
2040
  }
2041
+
1659
2042
  getCurrentNode() {
1660
2043
  return this.nodeStack[this.currentIndent - 1];
1661
2044
  }
2045
+
1662
2046
  getCurrentProp() {
1663
2047
  return this.currentProp;
1664
2048
  }
2049
+
1665
2050
  pushStack(node) {
1666
2051
  this.nodeStack.push(node);
1667
2052
  this.currentIndent += 1;
1668
2053
  }
2054
+
1669
2055
  popStack() {
1670
2056
  this.nodeStack.pop();
1671
2057
  this.currentIndent -= 1;
1672
2058
  }
2059
+
1673
2060
  setCurrentProp(val, name) {
1674
2061
  this.currentProp = val;
1675
2062
  this.currentPropName = name;
1676
2063
  }
2064
+
1677
2065
  parse(text) {
1678
2066
  this.currentIndent = 0;
1679
2067
  this.allNodes = new FBXTree();
1680
2068
  this.nodeStack = [];
1681
2069
  this.currentProp = [];
1682
- this.currentPropName = "";
2070
+ this.currentPropName = '';
1683
2071
  const scope = this;
1684
2072
  const split = text.split(/[\r\n]+/);
1685
- split.forEach(function(line, i) {
2073
+ split.forEach(function (line, i) {
1686
2074
  const matchComment = line.match(/^[\s\t]*;/);
1687
2075
  const matchEmpty = line.match(/^[\s\t]*$/);
1688
- if (matchComment || matchEmpty)
1689
- return;
1690
- const matchBeginning = line.match("^\\t{" + scope.currentIndent + "}(\\w+):(.*){", "");
1691
- const matchProperty = line.match("^\\t{" + scope.currentIndent + "}(\\w+):[\\s\\t\\r\\n](.*)");
1692
- const matchEnd = line.match("^\\t{" + (scope.currentIndent - 1) + "}}");
2076
+ if (matchComment || matchEmpty) return;
2077
+ const matchBeginning = line.match('^\\t{' + scope.currentIndent + '}(\\w+):(.*){', '');
2078
+ const matchProperty = line.match('^\\t{' + scope.currentIndent + '}(\\w+):[\\s\\t\\r\\n](.*)');
2079
+ const matchEnd = line.match('^\\t{' + (scope.currentIndent - 1) + '}}');
2080
+
1693
2081
  if (matchBeginning) {
1694
2082
  scope.parseNodeBegin(line, matchBeginning);
1695
2083
  } else if (matchProperty) {
@@ -1697,141 +2085,179 @@ class TextParser {
1697
2085
  } else if (matchEnd) {
1698
2086
  scope.popStack();
1699
2087
  } else if (line.match(/^[^\s\t}]/)) {
2088
+ // large arrays are split over multiple lines terminated with a ',' character
2089
+ // if this is encountered the line needs to be joined to the previous line
1700
2090
  scope.parseNodePropertyContinued(line);
1701
2091
  }
1702
2092
  });
1703
2093
  return this.allNodes;
1704
2094
  }
2095
+
1705
2096
  parseNodeBegin(line, property) {
1706
- const nodeName = property[1].trim().replace(/^"/, "").replace(/"$/, "");
1707
- const nodeAttrs = property[2].split(",").map(function(attr) {
1708
- return attr.trim().replace(/^"/, "").replace(/"$/, "");
2097
+ const nodeName = property[1].trim().replace(/^"/, '').replace(/"$/, '');
2098
+ const nodeAttrs = property[2].split(',').map(function (attr) {
2099
+ return attr.trim().replace(/^"/, '').replace(/"$/, '');
1709
2100
  });
1710
- const node = { name: nodeName };
2101
+ const node = {
2102
+ name: nodeName
2103
+ };
1711
2104
  const attrs = this.parseNodeAttr(nodeAttrs);
1712
- const currentNode = this.getCurrentNode();
2105
+ const currentNode = this.getCurrentNode(); // a top node
2106
+
1713
2107
  if (this.currentIndent === 0) {
1714
2108
  this.allNodes.add(nodeName, node);
1715
2109
  } else {
2110
+ // a subnode
2111
+ // if the subnode already exists, append it
1716
2112
  if (nodeName in currentNode) {
1717
- if (nodeName === "PoseNode") {
2113
+ // special case Pose needs PoseNodes as an array
2114
+ if (nodeName === 'PoseNode') {
1718
2115
  currentNode.PoseNode.push(node);
1719
- } else if (currentNode[nodeName].id !== void 0) {
2116
+ } else if (currentNode[nodeName].id !== undefined) {
1720
2117
  currentNode[nodeName] = {};
1721
2118
  currentNode[nodeName][currentNode[nodeName].id] = currentNode[nodeName];
1722
2119
  }
1723
- if (attrs.id !== "")
1724
- currentNode[nodeName][attrs.id] = node;
1725
- } else if (typeof attrs.id === "number") {
2120
+
2121
+ if (attrs.id !== '') currentNode[nodeName][attrs.id] = node;
2122
+ } else if (typeof attrs.id === 'number') {
1726
2123
  currentNode[nodeName] = {};
1727
2124
  currentNode[nodeName][attrs.id] = node;
1728
- } else if (nodeName !== "Properties70") {
1729
- if (nodeName === "PoseNode")
1730
- currentNode[nodeName] = [node];
1731
- else
1732
- currentNode[nodeName] = node;
1733
- }
1734
- }
1735
- if (typeof attrs.id === "number")
1736
- node.id = attrs.id;
1737
- if (attrs.name !== "")
1738
- node.attrName = attrs.name;
1739
- if (attrs.type !== "")
1740
- node.attrType = attrs.type;
2125
+ } else if (nodeName !== 'Properties70') {
2126
+ if (nodeName === 'PoseNode') currentNode[nodeName] = [node];else currentNode[nodeName] = node;
2127
+ }
2128
+ }
2129
+
2130
+ if (typeof attrs.id === 'number') node.id = attrs.id;
2131
+ if (attrs.name !== '') node.attrName = attrs.name;
2132
+ if (attrs.type !== '') node.attrType = attrs.type;
1741
2133
  this.pushStack(node);
1742
2134
  }
2135
+
1743
2136
  parseNodeAttr(attrs) {
1744
2137
  let id = attrs[0];
1745
- if (attrs[0] !== "") {
2138
+
2139
+ if (attrs[0] !== '') {
1746
2140
  id = parseInt(attrs[0]);
2141
+
1747
2142
  if (isNaN(id)) {
1748
2143
  id = attrs[0];
1749
2144
  }
1750
2145
  }
1751
- let name = "", type = "";
2146
+
2147
+ let name = '',
2148
+ type = '';
2149
+
1752
2150
  if (attrs.length > 1) {
1753
- name = attrs[1].replace(/^(\w+)::/, "");
2151
+ name = attrs[1].replace(/^(\w+)::/, '');
1754
2152
  type = attrs[2];
1755
2153
  }
1756
- return { id, name, type };
2154
+
2155
+ return {
2156
+ id: id,
2157
+ name: name,
2158
+ type: type
2159
+ };
1757
2160
  }
2161
+
1758
2162
  parseNodeProperty(line, property, contentLine) {
1759
- let propName = property[1].replace(/^"/, "").replace(/"$/, "").trim();
1760
- let propValue = property[2].replace(/^"/, "").replace(/"$/, "").trim();
1761
- if (propName === "Content" && propValue === ",") {
1762
- propValue = contentLine.replace(/"/g, "").replace(/,$/, "").trim();
1763
- }
2163
+ let propName = property[1].replace(/^"/, '').replace(/"$/, '').trim();
2164
+ let propValue = property[2].replace(/^"/, '').replace(/"$/, '').trim(); // for special case: base64 image data follows "Content: ," line
2165
+ // Content: ,
2166
+ // "/9j/4RDaRXhpZgAATU0A..."
2167
+
2168
+ if (propName === 'Content' && propValue === ',') {
2169
+ propValue = contentLine.replace(/"/g, '').replace(/,$/, '').trim();
2170
+ }
2171
+
1764
2172
  const currentNode = this.getCurrentNode();
1765
2173
  const parentName = currentNode.name;
1766
- if (parentName === "Properties70") {
2174
+
2175
+ if (parentName === 'Properties70') {
1767
2176
  this.parseNodeSpecialProperty(line, propName, propValue);
1768
2177
  return;
1769
- }
1770
- if (propName === "C") {
1771
- const connProps = propValue.split(",").slice(1);
2178
+ } // Connections
2179
+
2180
+
2181
+ if (propName === 'C') {
2182
+ const connProps = propValue.split(',').slice(1);
1772
2183
  const from = parseInt(connProps[0]);
1773
2184
  const to = parseInt(connProps[1]);
1774
- let rest = propValue.split(",").slice(3);
1775
- rest = rest.map(function(elem) {
1776
- return elem.trim().replace(/^"/, "");
2185
+ let rest = propValue.split(',').slice(3);
2186
+ rest = rest.map(function (elem) {
2187
+ return elem.trim().replace(/^"/, '');
1777
2188
  });
1778
- propName = "connections";
2189
+ propName = 'connections';
1779
2190
  propValue = [from, to];
1780
2191
  append(propValue, rest);
1781
- if (currentNode[propName] === void 0) {
2192
+
2193
+ if (currentNode[propName] === undefined) {
1782
2194
  currentNode[propName] = [];
1783
2195
  }
1784
- }
1785
- if (propName === "Node")
1786
- currentNode.id = propValue;
2196
+ } // Node
2197
+
2198
+
2199
+ if (propName === 'Node') currentNode.id = propValue; // connections
2200
+
1787
2201
  if (propName in currentNode && Array.isArray(currentNode[propName])) {
1788
2202
  currentNode[propName].push(propValue);
1789
2203
  } else {
1790
- if (propName !== "a")
1791
- currentNode[propName] = propValue;
1792
- else
1793
- currentNode.a = propValue;
2204
+ if (propName !== 'a') currentNode[propName] = propValue;else currentNode.a = propValue;
1794
2205
  }
1795
- this.setCurrentProp(currentNode, propName);
1796
- if (propName === "a" && propValue.slice(-1) !== ",") {
2206
+
2207
+ this.setCurrentProp(currentNode, propName); // convert string to array, unless it ends in ',' in which case more will be added to it
2208
+
2209
+ if (propName === 'a' && propValue.slice(-1) !== ',') {
1797
2210
  currentNode.a = parseNumberArray(propValue);
1798
2211
  }
1799
2212
  }
2213
+
1800
2214
  parseNodePropertyContinued(line) {
1801
2215
  const currentNode = this.getCurrentNode();
1802
- currentNode.a += line;
1803
- if (line.slice(-1) !== ",") {
2216
+ currentNode.a += line; // if the line doesn't end in ',' we have reached the end of the property value
2217
+ // so convert the string to an array
2218
+
2219
+ if (line.slice(-1) !== ',') {
1804
2220
  currentNode.a = parseNumberArray(currentNode.a);
1805
2221
  }
1806
- }
2222
+ } // parse "Property70"
2223
+
2224
+
1807
2225
  parseNodeSpecialProperty(line, propName, propValue) {
1808
- const props = propValue.split('",').map(function(prop) {
1809
- return prop.trim().replace(/^\"/, "").replace(/\s/, "_");
2226
+ // split this
2227
+ // P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1
2228
+ // into array like below
2229
+ // ["Lcl Scaling", "Lcl Scaling", "", "A", "1,1,1" ]
2230
+ const props = propValue.split('",').map(function (prop) {
2231
+ return prop.trim().replace(/^\"/, '').replace(/\s/, '_');
1810
2232
  });
1811
2233
  const innerPropName = props[0];
1812
2234
  const innerPropType1 = props[1];
1813
2235
  const innerPropType2 = props[2];
1814
2236
  const innerPropFlag = props[3];
1815
- let innerPropValue = props[4];
2237
+ let innerPropValue = props[4]; // cast values where needed, otherwise leave as strings
2238
+
1816
2239
  switch (innerPropType1) {
1817
- case "int":
1818
- case "enum":
1819
- case "bool":
1820
- case "ULongLong":
1821
- case "double":
1822
- case "Number":
1823
- case "FieldOfView":
2240
+ case 'int':
2241
+ case 'enum':
2242
+ case 'bool':
2243
+ case 'ULongLong':
2244
+ case 'double':
2245
+ case 'Number':
2246
+ case 'FieldOfView':
1824
2247
  innerPropValue = parseFloat(innerPropValue);
1825
2248
  break;
1826
- case "Color":
1827
- case "ColorRGB":
1828
- case "Vector3D":
1829
- case "Lcl_Translation":
1830
- case "Lcl_Rotation":
1831
- case "Lcl_Scaling":
2249
+
2250
+ case 'Color':
2251
+ case 'ColorRGB':
2252
+ case 'Vector3D':
2253
+ case 'Lcl_Translation':
2254
+ case 'Lcl_Rotation':
2255
+ case 'Lcl_Scaling':
1832
2256
  innerPropValue = parseNumberArray(innerPropValue);
1833
2257
  break;
1834
- }
2258
+ } // CAUTION: these props must append to parent's parent
2259
+
2260
+
1835
2261
  this.getPrevNode()[innerPropName] = {
1836
2262
  type: innerPropType1,
1837
2263
  type2: innerPropType2,
@@ -1840,272 +2266,361 @@ class TextParser {
1840
2266
  };
1841
2267
  this.setCurrentProp(this.getPrevNode(), innerPropName);
1842
2268
  }
1843
- }
2269
+
2270
+ } // Parse an FBX file in Binary format
2271
+
2272
+
1844
2273
  class BinaryParser {
1845
2274
  parse(buffer) {
1846
2275
  const reader = new BinaryReader(buffer);
1847
- reader.skip(23);
2276
+ reader.skip(23); // skip magic 23 bytes
2277
+
1848
2278
  const version = reader.getUint32();
2279
+
1849
2280
  if (version < 6400) {
1850
- throw new Error("THREE.FBXLoader: FBX version not supported, FileVersion: " + version);
2281
+ throw new Error('THREE.FBXLoader: FBX version not supported, FileVersion: ' + version);
1851
2282
  }
2283
+
1852
2284
  const allNodes = new FBXTree();
2285
+
1853
2286
  while (!this.endOfContent(reader)) {
1854
2287
  const node = this.parseNode(reader, version);
1855
- if (node !== null)
1856
- allNodes.add(node.name, node);
2288
+ if (node !== null) allNodes.add(node.name, node);
1857
2289
  }
2290
+
1858
2291
  return allNodes;
1859
- }
2292
+ } // Check if reader has reached the end of content.
2293
+
2294
+
1860
2295
  endOfContent(reader) {
2296
+ // footer size: 160bytes + 16-byte alignment padding
2297
+ // - 16bytes: magic
2298
+ // - padding til 16-byte alignment (at least 1byte?)
2299
+ // (seems like some exporters embed fixed 15 or 16bytes?)
2300
+ // - 4bytes: magic
2301
+ // - 4bytes: version
2302
+ // - 120bytes: zero
2303
+ // - 16bytes: magic
1861
2304
  if (reader.size() % 16 === 0) {
1862
- return (reader.getOffset() + 160 + 16 & ~15) >= reader.size();
2305
+ return (reader.getOffset() + 160 + 16 & ~0xf) >= reader.size();
1863
2306
  } else {
1864
2307
  return reader.getOffset() + 160 + 16 >= reader.size();
1865
2308
  }
1866
- }
2309
+ } // recursively parse nodes until the end of the file is reached
2310
+
2311
+
1867
2312
  parseNode(reader, version) {
1868
- const node = {};
2313
+ const node = {}; // The first three data sizes depends on version.
2314
+
1869
2315
  const endOffset = version >= 7500 ? reader.getUint64() : reader.getUint32();
1870
2316
  const numProperties = version >= 7500 ? reader.getUint64() : reader.getUint32();
1871
- version >= 7500 ? reader.getUint64() : reader.getUint32();
2317
+ version >= 7500 ? reader.getUint64() : reader.getUint32(); // the returned propertyListLen is not used
2318
+
1872
2319
  const nameLen = reader.getUint8();
1873
- const name = reader.getString(nameLen);
1874
- if (endOffset === 0)
1875
- return null;
2320
+ const name = reader.getString(nameLen); // Regards this node as NULL-record if endOffset is zero
2321
+
2322
+ if (endOffset === 0) return null;
1876
2323
  const propertyList = [];
2324
+
1877
2325
  for (let i = 0; i < numProperties; i++) {
1878
2326
  propertyList.push(this.parseProperty(reader));
1879
- }
1880
- const id = propertyList.length > 0 ? propertyList[0] : "";
1881
- const attrName = propertyList.length > 1 ? propertyList[1] : "";
1882
- const attrType = propertyList.length > 2 ? propertyList[2] : "";
2327
+ } // Regards the first three elements in propertyList as id, attrName, and attrType
2328
+
2329
+
2330
+ const id = propertyList.length > 0 ? propertyList[0] : '';
2331
+ const attrName = propertyList.length > 1 ? propertyList[1] : '';
2332
+ const attrType = propertyList.length > 2 ? propertyList[2] : ''; // check if this node represents just a single property
2333
+ // like (name, 0) set or (name2, [0, 1, 2]) set of {name: 0, name2: [0, 1, 2]}
2334
+
1883
2335
  node.singleProperty = numProperties === 1 && reader.getOffset() === endOffset ? true : false;
2336
+
1884
2337
  while (endOffset > reader.getOffset()) {
1885
2338
  const subNode = this.parseNode(reader, version);
1886
- if (subNode !== null)
1887
- this.parseSubNode(name, node, subNode);
1888
- }
1889
- node.propertyList = propertyList;
1890
- if (typeof id === "number")
1891
- node.id = id;
1892
- if (attrName !== "")
1893
- node.attrName = attrName;
1894
- if (attrType !== "")
1895
- node.attrType = attrType;
1896
- if (name !== "")
1897
- node.name = name;
2339
+ if (subNode !== null) this.parseSubNode(name, node, subNode);
2340
+ }
2341
+
2342
+ node.propertyList = propertyList; // raw property list used by parent
2343
+
2344
+ if (typeof id === 'number') node.id = id;
2345
+ if (attrName !== '') node.attrName = attrName;
2346
+ if (attrType !== '') node.attrType = attrType;
2347
+ if (name !== '') node.name = name;
1898
2348
  return node;
1899
2349
  }
2350
+
1900
2351
  parseSubNode(name, node, subNode) {
2352
+ // special case: child node is single property
1901
2353
  if (subNode.singleProperty === true) {
1902
2354
  const value = subNode.propertyList[0];
2355
+
1903
2356
  if (Array.isArray(value)) {
1904
2357
  node[subNode.name] = subNode;
1905
2358
  subNode.a = value;
1906
2359
  } else {
1907
2360
  node[subNode.name] = value;
1908
2361
  }
1909
- } else if (name === "Connections" && subNode.name === "C") {
2362
+ } else if (name === 'Connections' && subNode.name === 'C') {
1910
2363
  const array = [];
1911
- subNode.propertyList.forEach(function(property, i) {
1912
- if (i !== 0)
1913
- array.push(property);
2364
+ subNode.propertyList.forEach(function (property, i) {
2365
+ // first Connection is FBX type (OO, OP, etc.). We'll discard these
2366
+ if (i !== 0) array.push(property);
1914
2367
  });
1915
- if (node.connections === void 0) {
2368
+
2369
+ if (node.connections === undefined) {
1916
2370
  node.connections = [];
1917
2371
  }
2372
+
1918
2373
  node.connections.push(array);
1919
- } else if (subNode.name === "Properties70") {
2374
+ } else if (subNode.name === 'Properties70') {
1920
2375
  const keys = Object.keys(subNode);
1921
- keys.forEach(function(key) {
2376
+ keys.forEach(function (key) {
1922
2377
  node[key] = subNode[key];
1923
2378
  });
1924
- } else if (name === "Properties70" && subNode.name === "P") {
2379
+ } else if (name === 'Properties70' && subNode.name === 'P') {
1925
2380
  let innerPropName = subNode.propertyList[0];
1926
2381
  let innerPropType1 = subNode.propertyList[1];
1927
2382
  const innerPropType2 = subNode.propertyList[2];
1928
2383
  const innerPropFlag = subNode.propertyList[3];
1929
2384
  let innerPropValue;
1930
- if (innerPropName.indexOf("Lcl ") === 0)
1931
- innerPropName = innerPropName.replace("Lcl ", "Lcl_");
1932
- if (innerPropType1.indexOf("Lcl ") === 0)
1933
- innerPropType1 = innerPropType1.replace("Lcl ", "Lcl_");
1934
- if (innerPropType1 === "Color" || innerPropType1 === "ColorRGB" || innerPropType1 === "Vector" || innerPropType1 === "Vector3D" || innerPropType1.indexOf("Lcl_") === 0) {
2385
+ if (innerPropName.indexOf('Lcl ') === 0) innerPropName = innerPropName.replace('Lcl ', 'Lcl_');
2386
+ if (innerPropType1.indexOf('Lcl ') === 0) innerPropType1 = innerPropType1.replace('Lcl ', 'Lcl_');
2387
+
2388
+ if (innerPropType1 === 'Color' || innerPropType1 === 'ColorRGB' || innerPropType1 === 'Vector' || innerPropType1 === 'Vector3D' || innerPropType1.indexOf('Lcl_') === 0) {
1935
2389
  innerPropValue = [subNode.propertyList[4], subNode.propertyList[5], subNode.propertyList[6]];
1936
2390
  } else {
1937
2391
  innerPropValue = subNode.propertyList[4];
1938
- }
2392
+ } // this will be copied to parent, see above
2393
+
2394
+
1939
2395
  node[innerPropName] = {
1940
2396
  type: innerPropType1,
1941
2397
  type2: innerPropType2,
1942
2398
  flag: innerPropFlag,
1943
2399
  value: innerPropValue
1944
2400
  };
1945
- } else if (node[subNode.name] === void 0) {
1946
- if (typeof subNode.id === "number") {
2401
+ } else if (node[subNode.name] === undefined) {
2402
+ if (typeof subNode.id === 'number') {
1947
2403
  node[subNode.name] = {};
1948
2404
  node[subNode.name][subNode.id] = subNode;
1949
2405
  } else {
1950
2406
  node[subNode.name] = subNode;
1951
2407
  }
1952
2408
  } else {
1953
- if (subNode.name === "PoseNode") {
2409
+ if (subNode.name === 'PoseNode') {
1954
2410
  if (!Array.isArray(node[subNode.name])) {
1955
2411
  node[subNode.name] = [node[subNode.name]];
1956
2412
  }
2413
+
1957
2414
  node[subNode.name].push(subNode);
1958
- } else if (node[subNode.name][subNode.id] === void 0) {
2415
+ } else if (node[subNode.name][subNode.id] === undefined) {
1959
2416
  node[subNode.name][subNode.id] = subNode;
1960
2417
  }
1961
2418
  }
1962
2419
  }
2420
+
1963
2421
  parseProperty(reader) {
1964
2422
  const type = reader.getString(1);
1965
2423
  let length;
2424
+
1966
2425
  switch (type) {
1967
- case "C":
2426
+ case 'C':
1968
2427
  return reader.getBoolean();
1969
- case "D":
2428
+
2429
+ case 'D':
1970
2430
  return reader.getFloat64();
1971
- case "F":
2431
+
2432
+ case 'F':
1972
2433
  return reader.getFloat32();
1973
- case "I":
2434
+
2435
+ case 'I':
1974
2436
  return reader.getInt32();
1975
- case "L":
2437
+
2438
+ case 'L':
1976
2439
  return reader.getInt64();
1977
- case "R":
2440
+
2441
+ case 'R':
1978
2442
  length = reader.getUint32();
1979
2443
  return reader.getArrayBuffer(length);
1980
- case "S":
2444
+
2445
+ case 'S':
1981
2446
  length = reader.getUint32();
1982
2447
  return reader.getString(length);
1983
- case "Y":
2448
+
2449
+ case 'Y':
1984
2450
  return reader.getInt16();
1985
- case "b":
1986
- case "c":
1987
- case "d":
1988
- case "f":
1989
- case "i":
1990
- case "l":
2451
+
2452
+ case 'b':
2453
+ case 'c':
2454
+ case 'd':
2455
+ case 'f':
2456
+ case 'i':
2457
+ case 'l':
1991
2458
  const arrayLength = reader.getUint32();
1992
- const encoding = reader.getUint32();
2459
+ const encoding = reader.getUint32(); // 0: non-compressed, 1: compressed
2460
+
1993
2461
  const compressedLength = reader.getUint32();
2462
+
1994
2463
  if (encoding === 0) {
1995
2464
  switch (type) {
1996
- case "b":
1997
- case "c":
2465
+ case 'b':
2466
+ case 'c':
1998
2467
  return reader.getBooleanArray(arrayLength);
1999
- case "d":
2468
+
2469
+ case 'd':
2000
2470
  return reader.getFloat64Array(arrayLength);
2001
- case "f":
2471
+
2472
+ case 'f':
2002
2473
  return reader.getFloat32Array(arrayLength);
2003
- case "i":
2474
+
2475
+ case 'i':
2004
2476
  return reader.getInt32Array(arrayLength);
2005
- case "l":
2477
+
2478
+ case 'l':
2006
2479
  return reader.getInt64Array(arrayLength);
2007
2480
  }
2008
2481
  }
2009
- const data = fflate.unzlibSync(new Uint8Array(reader.getArrayBuffer(compressedLength)));
2482
+
2483
+ const data = unzlibSync(new Uint8Array(reader.getArrayBuffer(compressedLength))); // eslint-disable-line no-undef
2484
+
2010
2485
  const reader2 = new BinaryReader(data.buffer);
2486
+
2011
2487
  switch (type) {
2012
- case "b":
2013
- case "c":
2488
+ case 'b':
2489
+ case 'c':
2014
2490
  return reader2.getBooleanArray(arrayLength);
2015
- case "d":
2491
+
2492
+ case 'd':
2016
2493
  return reader2.getFloat64Array(arrayLength);
2017
- case "f":
2494
+
2495
+ case 'f':
2018
2496
  return reader2.getFloat32Array(arrayLength);
2019
- case "i":
2497
+
2498
+ case 'i':
2020
2499
  return reader2.getInt32Array(arrayLength);
2021
- case "l":
2500
+
2501
+ case 'l':
2022
2502
  return reader2.getInt64Array(arrayLength);
2023
2503
  }
2504
+
2024
2505
  default:
2025
- throw new Error("THREE.FBXLoader: Unknown property type " + type);
2506
+ throw new Error('THREE.FBXLoader: Unknown property type ' + type);
2026
2507
  }
2027
2508
  }
2509
+
2028
2510
  }
2511
+
2029
2512
  class BinaryReader {
2030
2513
  constructor(buffer, littleEndian) {
2031
2514
  this.dv = new DataView(buffer);
2032
2515
  this.offset = 0;
2033
- this.littleEndian = littleEndian !== void 0 ? littleEndian : true;
2516
+ this.littleEndian = littleEndian !== undefined ? littleEndian : true;
2034
2517
  }
2518
+
2035
2519
  getOffset() {
2036
2520
  return this.offset;
2037
2521
  }
2522
+
2038
2523
  size() {
2039
2524
  return this.dv.buffer.byteLength;
2040
2525
  }
2526
+
2041
2527
  skip(length) {
2042
2528
  this.offset += length;
2043
- }
2529
+ } // seems like true/false representation depends on exporter.
2530
+ // true: 1 or 'Y'(=0x59), false: 0 or 'T'(=0x54)
2531
+ // then sees LSB.
2532
+
2533
+
2044
2534
  getBoolean() {
2045
2535
  return (this.getUint8() & 1) === 1;
2046
2536
  }
2537
+
2047
2538
  getBooleanArray(size) {
2048
2539
  const a = [];
2540
+
2049
2541
  for (let i = 0; i < size; i++) {
2050
2542
  a.push(this.getBoolean());
2051
2543
  }
2544
+
2052
2545
  return a;
2053
2546
  }
2547
+
2054
2548
  getUint8() {
2055
2549
  const value = this.dv.getUint8(this.offset);
2056
2550
  this.offset += 1;
2057
2551
  return value;
2058
2552
  }
2553
+
2059
2554
  getInt16() {
2060
2555
  const value = this.dv.getInt16(this.offset, this.littleEndian);
2061
2556
  this.offset += 2;
2062
2557
  return value;
2063
2558
  }
2559
+
2064
2560
  getInt32() {
2065
2561
  const value = this.dv.getInt32(this.offset, this.littleEndian);
2066
2562
  this.offset += 4;
2067
2563
  return value;
2068
2564
  }
2565
+
2069
2566
  getInt32Array(size) {
2070
2567
  const a = [];
2568
+
2071
2569
  for (let i = 0; i < size; i++) {
2072
2570
  a.push(this.getInt32());
2073
2571
  }
2572
+
2074
2573
  return a;
2075
2574
  }
2575
+
2076
2576
  getUint32() {
2077
2577
  const value = this.dv.getUint32(this.offset, this.littleEndian);
2078
2578
  this.offset += 4;
2079
2579
  return value;
2080
- }
2580
+ } // JavaScript doesn't support 64-bit integer so calculate this here
2581
+ // 1 << 32 will return 1 so using multiply operation instead here.
2582
+ // There's a possibility that this method returns wrong value if the value
2583
+ // is out of the range between Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER.
2584
+ // TODO: safely handle 64-bit integer
2585
+
2586
+
2081
2587
  getInt64() {
2082
2588
  let low, high;
2589
+
2083
2590
  if (this.littleEndian) {
2084
2591
  low = this.getUint32();
2085
2592
  high = this.getUint32();
2086
2593
  } else {
2087
2594
  high = this.getUint32();
2088
2595
  low = this.getUint32();
2089
- }
2090
- if (high & 2147483648) {
2091
- high = ~high & 4294967295;
2092
- low = ~low & 4294967295;
2093
- if (low === 4294967295)
2094
- high = high + 1 & 4294967295;
2095
- low = low + 1 & 4294967295;
2096
- return -(high * 4294967296 + low);
2097
- }
2098
- return high * 4294967296 + low;
2099
- }
2596
+ } // calculate negative value
2597
+
2598
+
2599
+ if (high & 0x80000000) {
2600
+ high = ~high & 0xffffffff;
2601
+ low = ~low & 0xffffffff;
2602
+ if (low === 0xffffffff) high = high + 1 & 0xffffffff;
2603
+ low = low + 1 & 0xffffffff;
2604
+ return -(high * 0x100000000 + low);
2605
+ }
2606
+
2607
+ return high * 0x100000000 + low;
2608
+ }
2609
+
2100
2610
  getInt64Array(size) {
2101
2611
  const a = [];
2612
+
2102
2613
  for (let i = 0; i < size; i++) {
2103
2614
  a.push(this.getInt64());
2104
2615
  }
2616
+
2105
2617
  return a;
2106
- }
2618
+ } // Note: see getInt64() comment
2619
+
2620
+
2107
2621
  getUint64() {
2108
2622
  let low, high;
2623
+
2109
2624
  if (this.littleEndian) {
2110
2625
  low = this.getUint32();
2111
2626
  high = this.getUint32();
@@ -2113,250 +2628,290 @@ class BinaryReader {
2113
2628
  high = this.getUint32();
2114
2629
  low = this.getUint32();
2115
2630
  }
2116
- return high * 4294967296 + low;
2631
+
2632
+ return high * 0x100000000 + low;
2117
2633
  }
2634
+
2118
2635
  getFloat32() {
2119
2636
  const value = this.dv.getFloat32(this.offset, this.littleEndian);
2120
2637
  this.offset += 4;
2121
2638
  return value;
2122
2639
  }
2640
+
2123
2641
  getFloat32Array(size) {
2124
2642
  const a = [];
2643
+
2125
2644
  for (let i = 0; i < size; i++) {
2126
2645
  a.push(this.getFloat32());
2127
2646
  }
2647
+
2128
2648
  return a;
2129
2649
  }
2650
+
2130
2651
  getFloat64() {
2131
2652
  const value = this.dv.getFloat64(this.offset, this.littleEndian);
2132
2653
  this.offset += 8;
2133
2654
  return value;
2134
2655
  }
2656
+
2135
2657
  getFloat64Array(size) {
2136
2658
  const a = [];
2659
+
2137
2660
  for (let i = 0; i < size; i++) {
2138
2661
  a.push(this.getFloat64());
2139
2662
  }
2663
+
2140
2664
  return a;
2141
2665
  }
2666
+
2142
2667
  getArrayBuffer(size) {
2143
2668
  const value = this.dv.buffer.slice(this.offset, this.offset + size);
2144
2669
  this.offset += size;
2145
2670
  return value;
2146
2671
  }
2672
+
2147
2673
  getString(size) {
2674
+ // note: safari 9 doesn't support Uint8Array.indexOf; create intermediate array instead
2148
2675
  let a = [];
2676
+
2149
2677
  for (let i = 0; i < size; i++) {
2150
2678
  a[i] = this.getUint8();
2151
2679
  }
2680
+
2152
2681
  const nullByte = a.indexOf(0);
2153
- if (nullByte >= 0)
2154
- a = a.slice(0, nullByte);
2155
- return THREE.LoaderUtils.decodeText(new Uint8Array(a));
2156
- }
2157
- }
2682
+ if (nullByte >= 0) a = a.slice(0, nullByte);
2683
+ return LoaderUtils.decodeText(new Uint8Array(a));
2684
+ }
2685
+
2686
+ } // FBXTree holds a representation of the FBX data, returned by the TextParser ( FBX ASCII format)
2687
+ // and BinaryParser( FBX Binary format)
2688
+
2689
+
2158
2690
  class FBXTree {
2159
2691
  add(key, val) {
2160
2692
  this[key] = val;
2161
2693
  }
2162
- }
2694
+
2695
+ } // ************** UTILITY FUNCTIONS **************
2696
+
2697
+
2163
2698
  function isFbxFormatBinary(buffer) {
2164
- const CORRECT = "Kaydara FBX Binary \0";
2699
+ const CORRECT = 'Kaydara\u0020FBX\u0020Binary\u0020\u0020\0';
2165
2700
  return buffer.byteLength >= CORRECT.length && CORRECT === convertArrayBufferToString(buffer, 0, CORRECT.length);
2166
2701
  }
2702
+
2167
2703
  function isFbxFormatASCII(text) {
2168
- const CORRECT = [
2169
- "K",
2170
- "a",
2171
- "y",
2172
- "d",
2173
- "a",
2174
- "r",
2175
- "a",
2176
- "\\",
2177
- "F",
2178
- "B",
2179
- "X",
2180
- "\\",
2181
- "B",
2182
- "i",
2183
- "n",
2184
- "a",
2185
- "r",
2186
- "y",
2187
- "\\",
2188
- "\\"
2189
- ];
2704
+ const CORRECT = ['K', 'a', 'y', 'd', 'a', 'r', 'a', '\\', 'F', 'B', 'X', '\\', 'B', 'i', 'n', 'a', 'r', 'y', '\\', '\\'];
2190
2705
  let cursor = 0;
2706
+
2191
2707
  function read(offset) {
2192
2708
  const result = text[offset - 1];
2193
2709
  text = text.slice(cursor + offset);
2194
2710
  cursor++;
2195
2711
  return result;
2196
2712
  }
2713
+
2197
2714
  for (let i = 0; i < CORRECT.length; ++i) {
2198
2715
  const num = read(1);
2716
+
2199
2717
  if (num === CORRECT[i]) {
2200
2718
  return false;
2201
2719
  }
2202
2720
  }
2721
+
2203
2722
  return true;
2204
2723
  }
2724
+
2205
2725
  function getFbxVersion(text) {
2206
2726
  const versionRegExp = /FBXVersion: (\d+)/;
2207
2727
  const match = text.match(versionRegExp);
2728
+
2208
2729
  if (match) {
2209
2730
  const version = parseInt(match[1]);
2210
2731
  return version;
2211
2732
  }
2212
- throw new Error("THREE.FBXLoader: Cannot find the version number for the file given.");
2213
- }
2733
+
2734
+ throw new Error('THREE.FBXLoader: Cannot find the version number for the file given.');
2735
+ } // Converts FBX ticks into real time seconds.
2736
+
2737
+
2214
2738
  function convertFBXTimeToSeconds(time) {
2215
- return time / 46186158e3;
2739
+ return time / 46186158000;
2216
2740
  }
2217
- const dataArray = [];
2741
+
2742
+ const dataArray = []; // extracts the data from the correct position in the FBX array based on indexing type
2743
+
2218
2744
  function getData(polygonVertexIndex, polygonIndex, vertexIndex, infoObject) {
2219
2745
  let index;
2746
+
2220
2747
  switch (infoObject.mappingType) {
2221
- case "ByPolygonVertex":
2748
+ case 'ByPolygonVertex':
2222
2749
  index = polygonVertexIndex;
2223
2750
  break;
2224
- case "ByPolygon":
2751
+
2752
+ case 'ByPolygon':
2225
2753
  index = polygonIndex;
2226
2754
  break;
2227
- case "ByVertice":
2755
+
2756
+ case 'ByVertice':
2228
2757
  index = vertexIndex;
2229
2758
  break;
2230
- case "AllSame":
2759
+
2760
+ case 'AllSame':
2231
2761
  index = infoObject.indices[0];
2232
2762
  break;
2763
+
2233
2764
  default:
2234
- console.warn("THREE.FBXLoader: unknown attribute mapping type " + infoObject.mappingType);
2765
+ console.warn('THREE.FBXLoader: unknown attribute mapping type ' + infoObject.mappingType);
2235
2766
  }
2236
- if (infoObject.referenceType === "IndexToDirect")
2237
- index = infoObject.indices[index];
2767
+
2768
+ if (infoObject.referenceType === 'IndexToDirect') index = infoObject.indices[index];
2238
2769
  const from = index * infoObject.dataSize;
2239
2770
  const to = from + infoObject.dataSize;
2240
2771
  return slice(dataArray, infoObject.buffer, from, to);
2241
2772
  }
2242
- const tempEuler = new THREE.Euler();
2243
- const tempVec = new THREE.Vector3();
2773
+
2774
+ const tempEuler = new Euler();
2775
+ const tempVec = new Vector3(); // generate transformation from FBX transform data
2776
+ // ref: https://help.autodesk.com/view/FBX/2017/ENU/?guid=__files_GUID_10CDD63C_79C1_4F2D_BB28_AD2BE65A02ED_htm
2777
+ // ref: http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/index.html?url=cpp_ref/_transformations_2main_8cxx-example.html,topicNumber=cpp_ref__transformations_2main_8cxx_example_htmlfc10a1e1-b18d-4e72-9dc0-70d0f1959f5e
2778
+
2244
2779
  function generateTransform(transformData) {
2245
- const lTranslationM = new THREE.Matrix4();
2246
- const lPreRotationM = new THREE.Matrix4();
2247
- const lRotationM = new THREE.Matrix4();
2248
- const lPostRotationM = new THREE.Matrix4();
2249
- const lScalingM = new THREE.Matrix4();
2250
- const lScalingPivotM = new THREE.Matrix4();
2251
- const lScalingOffsetM = new THREE.Matrix4();
2252
- const lRotationOffsetM = new THREE.Matrix4();
2253
- const lRotationPivotM = new THREE.Matrix4();
2254
- const lParentGX = new THREE.Matrix4();
2255
- const lParentLX = new THREE.Matrix4();
2256
- const lGlobalT = new THREE.Matrix4();
2780
+ const lTranslationM = new Matrix4();
2781
+ const lPreRotationM = new Matrix4();
2782
+ const lRotationM = new Matrix4();
2783
+ const lPostRotationM = new Matrix4();
2784
+ const lScalingM = new Matrix4();
2785
+ const lScalingPivotM = new Matrix4();
2786
+ const lScalingOffsetM = new Matrix4();
2787
+ const lRotationOffsetM = new Matrix4();
2788
+ const lRotationPivotM = new Matrix4();
2789
+ const lParentGX = new Matrix4();
2790
+ const lParentLX = new Matrix4();
2791
+ const lGlobalT = new Matrix4();
2257
2792
  const inheritType = transformData.inheritType ? transformData.inheritType : 0;
2258
- if (transformData.translation)
2259
- lTranslationM.setPosition(tempVec.fromArray(transformData.translation));
2793
+ if (transformData.translation) lTranslationM.setPosition(tempVec.fromArray(transformData.translation));
2794
+
2260
2795
  if (transformData.preRotation) {
2261
- const array = transformData.preRotation.map(THREE.MathUtils.degToRad);
2796
+ const array = transformData.preRotation.map(MathUtils.degToRad);
2262
2797
  array.push(transformData.eulerOrder);
2263
2798
  lPreRotationM.makeRotationFromEuler(tempEuler.fromArray(array));
2264
2799
  }
2800
+
2265
2801
  if (transformData.rotation) {
2266
- const array = transformData.rotation.map(THREE.MathUtils.degToRad);
2802
+ const array = transformData.rotation.map(MathUtils.degToRad);
2267
2803
  array.push(transformData.eulerOrder);
2268
2804
  lRotationM.makeRotationFromEuler(tempEuler.fromArray(array));
2269
2805
  }
2806
+
2270
2807
  if (transformData.postRotation) {
2271
- const array = transformData.postRotation.map(THREE.MathUtils.degToRad);
2808
+ const array = transformData.postRotation.map(MathUtils.degToRad);
2272
2809
  array.push(transformData.eulerOrder);
2273
2810
  lPostRotationM.makeRotationFromEuler(tempEuler.fromArray(array));
2274
2811
  lPostRotationM.invert();
2275
2812
  }
2276
- if (transformData.scale)
2277
- lScalingM.scale(tempVec.fromArray(transformData.scale));
2278
- if (transformData.scalingOffset)
2279
- lScalingOffsetM.setPosition(tempVec.fromArray(transformData.scalingOffset));
2280
- if (transformData.scalingPivot)
2281
- lScalingPivotM.setPosition(tempVec.fromArray(transformData.scalingPivot));
2282
- if (transformData.rotationOffset)
2283
- lRotationOffsetM.setPosition(tempVec.fromArray(transformData.rotationOffset));
2284
- if (transformData.rotationPivot)
2285
- lRotationPivotM.setPosition(tempVec.fromArray(transformData.rotationPivot));
2813
+
2814
+ if (transformData.scale) lScalingM.scale(tempVec.fromArray(transformData.scale)); // Pivots and offsets
2815
+
2816
+ if (transformData.scalingOffset) lScalingOffsetM.setPosition(tempVec.fromArray(transformData.scalingOffset));
2817
+ if (transformData.scalingPivot) lScalingPivotM.setPosition(tempVec.fromArray(transformData.scalingPivot));
2818
+ if (transformData.rotationOffset) lRotationOffsetM.setPosition(tempVec.fromArray(transformData.rotationOffset));
2819
+ if (transformData.rotationPivot) lRotationPivotM.setPosition(tempVec.fromArray(transformData.rotationPivot)); // parent transform
2820
+
2286
2821
  if (transformData.parentMatrixWorld) {
2287
2822
  lParentLX.copy(transformData.parentMatrix);
2288
2823
  lParentGX.copy(transformData.parentMatrixWorld);
2289
2824
  }
2290
- const lLRM = lPreRotationM.clone().multiply(lRotationM).multiply(lPostRotationM);
2291
- const lParentGRM = new THREE.Matrix4();
2292
- lParentGRM.extractRotation(lParentGX);
2293
- const lParentTM = new THREE.Matrix4();
2825
+
2826
+ const lLRM = lPreRotationM.clone().multiply(lRotationM).multiply(lPostRotationM); // Global Rotation
2827
+
2828
+ const lParentGRM = new Matrix4();
2829
+ lParentGRM.extractRotation(lParentGX); // Global Shear*Scaling
2830
+
2831
+ const lParentTM = new Matrix4();
2294
2832
  lParentTM.copyPosition(lParentGX);
2295
2833
  const lParentGRSM = lParentTM.clone().invert().multiply(lParentGX);
2296
2834
  const lParentGSM = lParentGRM.clone().invert().multiply(lParentGRSM);
2297
2835
  const lLSM = lScalingM;
2298
- const lGlobalRS = new THREE.Matrix4();
2836
+ const lGlobalRS = new Matrix4();
2837
+
2299
2838
  if (inheritType === 0) {
2300
2839
  lGlobalRS.copy(lParentGRM).multiply(lLRM).multiply(lParentGSM).multiply(lLSM);
2301
2840
  } else if (inheritType === 1) {
2302
2841
  lGlobalRS.copy(lParentGRM).multiply(lParentGSM).multiply(lLRM).multiply(lLSM);
2303
2842
  } else {
2304
- const lParentLSM = new THREE.Matrix4().scale(new THREE.Vector3().setFromMatrixScale(lParentLX));
2843
+ const lParentLSM = new Matrix4().scale(new Vector3().setFromMatrixScale(lParentLX));
2305
2844
  const lParentLSM_inv = lParentLSM.clone().invert();
2306
2845
  const lParentGSM_noLocal = lParentGSM.clone().multiply(lParentLSM_inv);
2307
2846
  lGlobalRS.copy(lParentGRM).multiply(lLRM).multiply(lParentGSM_noLocal).multiply(lLSM);
2308
2847
  }
2848
+
2309
2849
  const lRotationPivotM_inv = lRotationPivotM.clone().invert();
2310
- const lScalingPivotM_inv = lScalingPivotM.clone().invert();
2850
+ const lScalingPivotM_inv = lScalingPivotM.clone().invert(); // Calculate the local transform matrix
2851
+
2311
2852
  let lTransform = lTranslationM.clone().multiply(lRotationOffsetM).multiply(lRotationPivotM).multiply(lPreRotationM).multiply(lRotationM).multiply(lPostRotationM).multiply(lRotationPivotM_inv).multiply(lScalingOffsetM).multiply(lScalingPivotM).multiply(lScalingM).multiply(lScalingPivotM_inv);
2312
- const lLocalTWithAllPivotAndOffsetInfo = new THREE.Matrix4().copyPosition(lTransform);
2853
+ const lLocalTWithAllPivotAndOffsetInfo = new Matrix4().copyPosition(lTransform);
2313
2854
  const lGlobalTranslation = lParentGX.clone().multiply(lLocalTWithAllPivotAndOffsetInfo);
2314
2855
  lGlobalT.copyPosition(lGlobalTranslation);
2315
- lTransform = lGlobalT.clone().multiply(lGlobalRS);
2856
+ lTransform = lGlobalT.clone().multiply(lGlobalRS); // from global to local
2857
+
2316
2858
  lTransform.premultiply(lParentGX.invert());
2317
2859
  return lTransform;
2318
- }
2860
+ } // Returns the three.js intrinsic Euler order corresponding to FBX extrinsic Euler order
2861
+ // ref: http://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_class_fbx_euler_html
2862
+
2863
+
2319
2864
  function getEulerOrder(order) {
2320
2865
  order = order || 0;
2321
- const enums = [
2322
- "ZYX",
2323
- "YZX",
2324
- "XZY",
2325
- "ZXY",
2326
- "YXZ",
2327
- "XYZ"
2866
+ const enums = ['ZYX', // -> XYZ extrinsic
2867
+ 'YZX', // -> XZY extrinsic
2868
+ 'XZY', // -> YZX extrinsic
2869
+ 'ZXY', // -> YXZ extrinsic
2870
+ 'YXZ', // -> ZXY extrinsic
2871
+ 'XYZ' // -> ZYX extrinsic
2872
+ //'SphericXYZ', // not possible to support
2328
2873
  ];
2874
+
2329
2875
  if (order === 6) {
2330
- console.warn("THREE.FBXLoader: unsupported Euler Order: Spherical XYZ. Animations and rotations may be incorrect.");
2876
+ console.warn('THREE.FBXLoader: unsupported Euler Order: Spherical XYZ. Animations and rotations may be incorrect.');
2331
2877
  return enums[0];
2332
2878
  }
2879
+
2333
2880
  return enums[order];
2334
- }
2881
+ } // Parses comma separated list of numbers and returns them an array.
2882
+ // Used internally by the TextParser
2883
+
2884
+
2335
2885
  function parseNumberArray(value) {
2336
- const array = value.split(",").map(function(val) {
2886
+ const array = value.split(',').map(function (val) {
2337
2887
  return parseFloat(val);
2338
2888
  });
2339
2889
  return array;
2340
2890
  }
2891
+
2341
2892
  function convertArrayBufferToString(buffer, from, to) {
2342
- if (from === void 0)
2343
- from = 0;
2344
- if (to === void 0)
2345
- to = buffer.byteLength;
2346
- return THREE.LoaderUtils.decodeText(new Uint8Array(buffer, from, to));
2893
+ if (from === undefined) from = 0;
2894
+ if (to === undefined) to = buffer.byteLength;
2895
+ return LoaderUtils.decodeText(new Uint8Array(buffer, from, to));
2347
2896
  }
2897
+
2348
2898
  function append(a, b) {
2349
2899
  for (let i = 0, j = a.length, l = b.length; i < l; i++, j++) {
2350
2900
  a[j] = b[i];
2351
2901
  }
2352
2902
  }
2903
+
2353
2904
  function slice(a, b, from, to) {
2354
2905
  for (let i = from, j = 0; i < to; i++, j++) {
2355
2906
  a[j] = b[i];
2356
2907
  }
2908
+
2357
2909
  return a;
2358
- }
2910
+ } // inject array a2 into array a1 at index
2911
+
2912
+
2359
2913
  function inject(a1, index, a2) {
2360
2914
  return a1.slice(0, index).concat(a2).concat(a1.slice(index));
2361
2915
  }
2362
- exports.FBXLoader = FBXLoader;
2916
+
2917
+ export { FBXLoader };