three-stdlib 2.22.9 → 2.22.10

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 (629) hide show
  1. package/dist/animation/AnimationClipCreator.js +49 -50
  2. package/dist/animation/AnimationClipCreator.mjs +49 -50
  3. package/dist/animation/CCDIKSolver.d.ts +9 -4
  4. package/dist/animation/CCDIKSolver.js +193 -148
  5. package/dist/animation/CCDIKSolver.mjs +194 -149
  6. package/dist/animation/MMDAnimationHelper.js +613 -515
  7. package/dist/animation/MMDAnimationHelper.mjs +613 -515
  8. package/dist/animation/MMDPhysics.d.ts +6 -1
  9. package/dist/animation/MMDPhysics.js +728 -718
  10. package/dist/animation/MMDPhysics.mjs +729 -719
  11. package/dist/cameras/CinematicCamera.d.ts +2 -2
  12. package/dist/controls/ArcballControls.d.ts +1 -1
  13. package/dist/controls/ArcballControls.js +38 -44
  14. package/dist/controls/ArcballControls.mjs +39 -45
  15. package/dist/controls/DeviceOrientationControls.js +2 -1
  16. package/dist/controls/DeviceOrientationControls.mjs +2 -1
  17. package/dist/controls/FirstPersonControls.d.ts +1 -1
  18. package/dist/controls/FirstPersonControls.js +1 -1
  19. package/dist/controls/FirstPersonControls.mjs +1 -1
  20. package/dist/controls/PointerLockControls.js +2 -2
  21. package/dist/controls/PointerLockControls.mjs +2 -2
  22. package/dist/controls/TransformControls.d.ts +1 -1
  23. package/dist/controls/experimental/CameraControls.d.ts +1 -1
  24. package/dist/csm/CSM.js +4 -4
  25. package/dist/csm/CSM.mjs +4 -4
  26. package/dist/csm/CSMFrustum.js +1 -1
  27. package/dist/csm/CSMFrustum.mjs +1 -1
  28. package/dist/csm/CSMShader.js +14 -10
  29. package/dist/csm/CSMShader.mjs +14 -10
  30. package/dist/curves/CurveExtras.js +52 -62
  31. package/dist/curves/CurveExtras.mjs +53 -63
  32. package/dist/curves/NURBSUtils.d.ts +18 -20
  33. package/dist/curves/NURBSUtils.js +17 -17
  34. package/dist/curves/NURBSUtils.mjs +17 -17
  35. package/dist/deprecated/Geometry.js +26 -26
  36. package/dist/deprecated/Geometry.mjs +27 -27
  37. package/dist/effects/AnaglyphEffect.js +95 -114
  38. package/dist/effects/AnaglyphEffect.mjs +95 -114
  39. package/dist/effects/AsciiEffect.js +144 -162
  40. package/dist/effects/AsciiEffect.mjs +144 -162
  41. package/dist/effects/OutlineEffect.js +253 -276
  42. package/dist/effects/OutlineEffect.mjs +253 -276
  43. package/dist/effects/ParallaxBarrierEffect.js +61 -60
  44. package/dist/effects/ParallaxBarrierEffect.mjs +61 -60
  45. package/dist/effects/PeppersGhostEffect.js +84 -81
  46. package/dist/effects/PeppersGhostEffect.mjs +84 -81
  47. package/dist/effects/StereoEffect.js +31 -28
  48. package/dist/effects/StereoEffect.mjs +31 -28
  49. package/dist/environments/RoomEnvironment.d.ts +6 -5
  50. package/dist/exporters/GLTFExporter.d.ts +109 -441
  51. package/dist/exporters/GLTFExporter.js +912 -581
  52. package/dist/exporters/GLTFExporter.mjs +912 -581
  53. package/dist/geometries/ConvexGeometry.js +0 -3
  54. package/dist/geometries/ConvexGeometry.mjs +0 -3
  55. package/dist/geometries/LightningStrike.d.ts +3 -3
  56. package/dist/geometries/LightningStrike.js +80 -75
  57. package/dist/geometries/LightningStrike.mjs +80 -75
  58. package/dist/geometries/ParametricGeometries.js +75 -74
  59. package/dist/geometries/ParametricGeometries.mjs +75 -74
  60. package/dist/geometries/RoundedBoxGeometry.js +1 -1
  61. package/dist/geometries/RoundedBoxGeometry.mjs +1 -1
  62. package/dist/geometries/TextGeometry.d.ts +1 -1
  63. package/dist/helpers/RectAreaLightHelper.d.ts +4 -3
  64. package/dist/helpers/RectAreaLightHelper.js +2 -2
  65. package/dist/helpers/RectAreaLightHelper.mjs +2 -2
  66. package/dist/helpers/VertexNormalsHelper.d.ts +3 -0
  67. package/dist/helpers/VertexNormalsHelper.js +15 -22
  68. package/dist/helpers/VertexNormalsHelper.mjs +16 -23
  69. package/dist/helpers/VertexTangentsHelper.d.ts +3 -0
  70. package/dist/helpers/VertexTangentsHelper.js +12 -14
  71. package/dist/helpers/VertexTangentsHelper.mjs +12 -14
  72. package/dist/index.d.ts +1 -66
  73. package/dist/index.js +5 -370
  74. package/dist/index.mjs +9 -374
  75. package/dist/interactive/InteractiveGroup.js +1 -1
  76. package/dist/interactive/InteractiveGroup.mjs +1 -1
  77. package/dist/interactive/SelectionBox.js +122 -125
  78. package/dist/interactive/SelectionBox.mjs +122 -125
  79. package/dist/interactive/SelectionHelper.js +45 -48
  80. package/dist/interactive/SelectionHelper.mjs +45 -48
  81. package/dist/libs/MeshoptDecoder.d.ts +1 -1
  82. package/dist/libs/MotionControllers.d.ts +15 -14
  83. package/dist/libs/MotionControllers.js +10 -10
  84. package/dist/libs/MotionControllers.mjs +10 -10
  85. package/dist/lights/LightProbeGenerator.js +43 -43
  86. package/dist/lights/LightProbeGenerator.mjs +43 -43
  87. package/dist/lights/RectAreaLightUniformsLib.js +9 -5
  88. package/dist/lights/RectAreaLightUniformsLib.mjs +9 -5
  89. package/dist/lines/LineMaterial.js +271 -271
  90. package/dist/lines/LineMaterial.mjs +272 -272
  91. package/dist/lines/LineSegments2.js +12 -12
  92. package/dist/lines/LineSegments2.mjs +12 -12
  93. package/dist/lines/LineSegmentsGeometry.js +2 -2
  94. package/dist/lines/LineSegmentsGeometry.mjs +2 -2
  95. package/dist/lines/Wireframe.js +2 -2
  96. package/dist/lines/Wireframe.mjs +2 -2
  97. package/dist/loaders/3DMLoader.d.ts +2 -1
  98. package/dist/loaders/3MFLoader.d.ts +2 -1
  99. package/dist/loaders/AMFLoader.d.ts +2 -1
  100. package/dist/loaders/AssimpLoader.d.ts +20 -0
  101. package/dist/loaders/AssimpLoader.js +520 -482
  102. package/dist/loaders/AssimpLoader.mjs +520 -482
  103. package/dist/loaders/BVHLoader.d.ts +2 -1
  104. package/dist/loaders/BasisTextureLoader.d.ts +2 -1
  105. package/dist/loaders/BasisTextureLoader.js +23 -14
  106. package/dist/loaders/BasisTextureLoader.mjs +24 -15
  107. package/dist/loaders/ColladaLoader.d.ts +2 -1
  108. package/dist/loaders/DRACOLoader.d.ts +2 -1
  109. package/dist/loaders/FBXLoader.d.ts +2 -1
  110. package/dist/loaders/FBXLoader.js +2 -2
  111. package/dist/loaders/FBXLoader.mjs +2 -2
  112. package/dist/loaders/FontLoader.d.ts +4 -4
  113. package/dist/loaders/FontLoader.js +2 -1
  114. package/dist/loaders/FontLoader.mjs +2 -1
  115. package/dist/loaders/GCodeLoader.d.ts +2 -1
  116. package/dist/loaders/GLTFLoader.d.ts +11 -9
  117. package/dist/loaders/GLTFLoader.js +2 -2
  118. package/dist/loaders/GLTFLoader.mjs +2 -2
  119. package/dist/loaders/HDRCubeTextureLoader.d.ts +2 -1
  120. package/dist/loaders/KMZLoader.d.ts +2 -1
  121. package/dist/loaders/KTX2Loader.js +34 -15
  122. package/dist/loaders/KTX2Loader.mjs +35 -16
  123. package/dist/loaders/LDrawLoader.d.ts +2 -1
  124. package/dist/loaders/LDrawLoader.js +3 -3
  125. package/dist/loaders/LDrawLoader.mjs +3 -3
  126. package/dist/loaders/LUT3dlLoader.d.ts +3 -2
  127. package/dist/loaders/LUTCubeLoader.d.ts +3 -2
  128. package/dist/loaders/LWOLoader.d.ts +2 -1
  129. package/dist/loaders/LottieLoader.d.ts +2 -1
  130. package/dist/loaders/MD2Loader.d.ts +2 -1
  131. package/dist/loaders/MDDLoader.d.ts +2 -1
  132. package/dist/loaders/MMDLoader.d.ts +2 -1
  133. package/dist/loaders/MTLLoader.d.ts +2 -1
  134. package/dist/loaders/OBJLoader.d.ts +2 -1
  135. package/dist/loaders/OBJLoader.js +5 -5
  136. package/dist/loaders/OBJLoader.mjs +5 -5
  137. package/dist/loaders/PCDLoader.d.ts +2 -1
  138. package/dist/loaders/PDBLoader.d.ts +2 -1
  139. package/dist/loaders/PLYLoader.d.ts +2 -1
  140. package/dist/loaders/PRWMLoader.d.ts +2 -1
  141. package/dist/loaders/RGBMLoader.js +924 -918
  142. package/dist/loaders/RGBMLoader.mjs +924 -918
  143. package/dist/loaders/STLLoader.d.ts +2 -1
  144. package/dist/loaders/SVGLoader.d.ts +2 -1
  145. package/dist/loaders/TDSLoader.d.ts +2 -1
  146. package/dist/loaders/TTFLoader.d.ts +2 -1
  147. package/dist/loaders/TiltLoader.d.ts +2 -1
  148. package/dist/loaders/TiltLoader.js +3 -1
  149. package/dist/loaders/TiltLoader.mjs +3 -1
  150. package/dist/loaders/VOXLoader.d.ts +4 -2
  151. package/dist/loaders/VRMLLoader.d.ts +2 -1
  152. package/dist/loaders/VRMLoader.d.ts +20 -0
  153. package/dist/loaders/VTKLoader.d.ts +2 -1
  154. package/dist/loaders/XLoader.d.ts +20 -0
  155. package/dist/loaders/XLoader.js +1 -1
  156. package/dist/loaders/XLoader.mjs +1 -1
  157. package/dist/loaders/XYZLoader.d.ts +2 -1
  158. package/dist/loaders/lwo/IFFParser.js +104 -110
  159. package/dist/loaders/lwo/IFFParser.mjs +104 -110
  160. package/dist/loaders/lwo/LWO2Parser.js +18 -33
  161. package/dist/loaders/lwo/LWO2Parser.mjs +18 -33
  162. package/dist/loaders/lwo/LWO3Parser.js +17 -33
  163. package/dist/loaders/lwo/LWO3Parser.mjs +17 -33
  164. package/dist/math/Capsule.d.ts +1 -1
  165. package/dist/math/Capsule.js +90 -92
  166. package/dist/math/Capsule.mjs +90 -92
  167. package/dist/math/ColorConverter.js +26 -36
  168. package/dist/math/ColorConverter.mjs +26 -36
  169. package/dist/math/ConvexHull.js +16 -17
  170. package/dist/math/ConvexHull.mjs +17 -18
  171. package/dist/math/ImprovedNoise.js +41 -39
  172. package/dist/math/ImprovedNoise.mjs +41 -39
  173. package/dist/math/Lut.js +65 -63
  174. package/dist/math/Lut.mjs +66 -64
  175. package/dist/math/MeshSurfaceSampler.d.ts +3 -0
  176. package/dist/math/MeshSurfaceSampler.js +85 -89
  177. package/dist/math/MeshSurfaceSampler.mjs +85 -89
  178. package/dist/math/OBB.js +68 -88
  179. package/dist/math/OBB.mjs +68 -88
  180. package/dist/math/Octree.js +240 -245
  181. package/dist/math/Octree.mjs +240 -245
  182. package/dist/misc/ConvexObjectBreaker.js +114 -120
  183. package/dist/misc/ConvexObjectBreaker.mjs +115 -121
  184. package/dist/misc/GPUComputationRenderer.d.ts +1 -0
  185. package/dist/misc/GPUComputationRenderer.js +191 -157
  186. package/dist/misc/GPUComputationRenderer.mjs +192 -158
  187. package/dist/misc/Gyroscope.js +16 -18
  188. package/dist/misc/Gyroscope.mjs +17 -19
  189. package/dist/misc/MD2Character.js +88 -86
  190. package/dist/misc/MD2Character.mjs +89 -87
  191. package/dist/misc/MD2CharacterComplex.js +106 -105
  192. package/dist/misc/MD2CharacterComplex.mjs +107 -106
  193. package/dist/misc/MorphAnimMesh.d.ts +1 -1
  194. package/dist/misc/MorphAnimMesh.js +33 -33
  195. package/dist/misc/MorphAnimMesh.mjs +33 -33
  196. package/dist/misc/MorphBlendMesh.js +68 -68
  197. package/dist/misc/MorphBlendMesh.mjs +68 -68
  198. package/dist/misc/ProgressiveLightmap.d.ts +1 -2
  199. package/dist/misc/RollerCoaster.js +321 -314
  200. package/dist/misc/RollerCoaster.mjs +322 -315
  201. package/dist/misc/Volume.d.ts +1 -1
  202. package/dist/misc/Volume.js +169 -166
  203. package/dist/misc/Volume.mjs +170 -167
  204. package/dist/misc/VolumeSlice.js +50 -51
  205. package/dist/misc/VolumeSlice.mjs +50 -51
  206. package/dist/modifiers/CurveModifier.d.ts +2 -2
  207. package/dist/modifiers/CurveModifier.js +1 -1
  208. package/dist/modifiers/CurveModifier.mjs +1 -1
  209. package/dist/modifiers/SimplifyModifier.js +2 -1
  210. package/dist/modifiers/SimplifyModifier.mjs +2 -1
  211. package/dist/objects/Lensflare.js +32 -21
  212. package/dist/objects/Lensflare.mjs +33 -22
  213. package/dist/objects/LightningStorm.d.ts +3 -3
  214. package/dist/objects/LightningStorm.js +3 -3
  215. package/dist/objects/LightningStorm.mjs +3 -3
  216. package/dist/objects/MarchingCubes.d.ts +1 -0
  217. package/dist/objects/MarchingCubes.js +4362 -10
  218. package/dist/objects/MarchingCubes.mjs +4363 -11
  219. package/dist/objects/Reflector.d.ts +5 -2
  220. package/dist/objects/Reflector.js +39 -12
  221. package/dist/objects/Reflector.mjs +40 -13
  222. package/dist/objects/ReflectorForSSRPass.js +25 -21
  223. package/dist/objects/ReflectorForSSRPass.mjs +26 -22
  224. package/dist/objects/ReflectorRTT.d.ts +6 -0
  225. package/dist/objects/Refractor.d.ts +5 -2
  226. package/dist/objects/Refractor.js +39 -12
  227. package/dist/objects/Refractor.mjs +40 -13
  228. package/dist/objects/ShadowMesh.d.ts +6 -3
  229. package/dist/objects/ShadowMesh.js +7 -3
  230. package/dist/objects/ShadowMesh.mjs +8 -4
  231. package/dist/objects/Sky.js +181 -137
  232. package/dist/objects/Sky.mjs +182 -138
  233. package/dist/objects/Water.d.ts +3 -3
  234. package/dist/objects/Water.js +3 -2
  235. package/dist/objects/Water.mjs +3 -2
  236. package/dist/objects/Water2.d.ts +2 -2
  237. package/dist/objects/Water2.js +16 -18
  238. package/dist/objects/Water2.mjs +17 -19
  239. package/dist/postprocessing/AdaptiveToneMappingPass.d.ts +2 -2
  240. package/dist/postprocessing/AdaptiveToneMappingPass.js +105 -112
  241. package/dist/postprocessing/AdaptiveToneMappingPass.mjs +107 -114
  242. package/dist/postprocessing/BokehPass.d.ts +1 -1
  243. package/dist/postprocessing/ClearPass.d.ts +3 -3
  244. package/dist/postprocessing/CubeTexturePass.js +37 -33
  245. package/dist/postprocessing/CubeTexturePass.mjs +37 -33
  246. package/dist/postprocessing/HalftonePass.d.ts +1 -1
  247. package/dist/postprocessing/LUTPass.d.ts +3 -3
  248. package/dist/postprocessing/RenderPixelatedPass.d.ts +28 -0
  249. package/dist/postprocessing/SAOPass.d.ts +5 -6
  250. package/dist/postprocessing/SAOPass.js +151 -145
  251. package/dist/postprocessing/SAOPass.mjs +153 -147
  252. package/dist/postprocessing/SSAARenderPass.d.ts +5 -5
  253. package/dist/postprocessing/SSAARenderPass.js +78 -55
  254. package/dist/postprocessing/SSAARenderPass.mjs +80 -57
  255. package/dist/postprocessing/SSAOPass.d.ts +4 -5
  256. package/dist/postprocessing/SSAOPass.js +17 -10
  257. package/dist/postprocessing/SSAOPass.mjs +17 -10
  258. package/dist/postprocessing/SSRPass.d.ts +6 -7
  259. package/dist/postprocessing/SSRPass.js +235 -262
  260. package/dist/postprocessing/SSRPass.mjs +237 -264
  261. package/dist/postprocessing/TAARenderPass.d.ts +2 -2
  262. package/dist/postprocessing/TAARenderPass.js +106 -27
  263. package/dist/postprocessing/TAARenderPass.mjs +107 -28
  264. package/dist/postprocessing/TexturePass.d.ts +2 -2
  265. package/dist/postprocessing/TexturePass.js +24 -22
  266. package/dist/postprocessing/TexturePass.mjs +25 -23
  267. package/dist/postprocessing/UnrealBloomPass.js +175 -118
  268. package/dist/postprocessing/UnrealBloomPass.mjs +177 -120
  269. package/dist/renderers/CSS2DRenderer.d.ts +2 -1
  270. package/dist/renderers/CSS2DRenderer.js +5 -4
  271. package/dist/renderers/CSS2DRenderer.mjs +6 -5
  272. package/dist/renderers/CSS3DRenderer.d.ts +1 -1
  273. package/dist/renderers/CSS3DRenderer.js +147 -113
  274. package/dist/renderers/CSS3DRenderer.mjs +148 -114
  275. package/dist/renderers/Projector.js +377 -389
  276. package/dist/renderers/Projector.mjs +377 -389
  277. package/dist/renderers/SVGRenderer.js +280 -275
  278. package/dist/renderers/SVGRenderer.mjs +280 -275
  279. package/dist/shaders/ACESFilmicToneMappingShader.d.ts +1 -1
  280. package/dist/shaders/AfterimageShader.d.ts +1 -1
  281. package/dist/shaders/BasicShader.d.ts +1 -1
  282. package/dist/shaders/BleachBypassShader.d.ts +1 -1
  283. package/dist/shaders/BokehShader.d.ts +2 -2
  284. package/dist/shaders/BokehShader2.d.ts +2 -2
  285. package/dist/shaders/BokehShader2.js +1 -1
  286. package/dist/shaders/BokehShader2.mjs +1 -1
  287. package/dist/shaders/ColorCorrectionShader.js +3 -3
  288. package/dist/shaders/ColorCorrectionShader.mjs +3 -3
  289. package/dist/shaders/ColorifyShader.js +1 -1
  290. package/dist/shaders/ColorifyShader.mjs +1 -1
  291. package/dist/shaders/ConvolutionShader.d.ts +2 -2
  292. package/dist/shaders/ConvolutionShader.js +1 -1
  293. package/dist/shaders/ConvolutionShader.mjs +1 -1
  294. package/dist/shaders/CopyShader.d.ts +1 -1
  295. package/dist/shaders/DepthLimitedBlurShader.d.ts +2 -2
  296. package/dist/shaders/DepthLimitedBlurShader.js +2 -2
  297. package/dist/shaders/DepthLimitedBlurShader.mjs +2 -2
  298. package/dist/shaders/DotScreenShader.js +2 -2
  299. package/dist/shaders/DotScreenShader.mjs +2 -2
  300. package/dist/shaders/FXAAShader.js +1 -1
  301. package/dist/shaders/FXAAShader.mjs +1 -1
  302. package/dist/shaders/FreiChenShader.js +1 -1
  303. package/dist/shaders/FreiChenShader.mjs +1 -1
  304. package/dist/shaders/GammaCorrectionShader.d.ts +1 -1
  305. package/dist/shaders/GodRaysShader.js +4 -4
  306. package/dist/shaders/GodRaysShader.mjs +4 -4
  307. package/dist/shaders/HorizontalBlurShader.d.ts +1 -1
  308. package/dist/shaders/LuminosityHighPassShader.js +1 -1
  309. package/dist/shaders/LuminosityHighPassShader.mjs +1 -1
  310. package/dist/shaders/NormalMapShader.js +2 -2
  311. package/dist/shaders/NormalMapShader.mjs +2 -2
  312. package/dist/shaders/SAOShader.d.ts +2 -2
  313. package/dist/shaders/SAOShader.js +3 -3
  314. package/dist/shaders/SAOShader.mjs +3 -3
  315. package/dist/shaders/SMAAShader.js +3 -3
  316. package/dist/shaders/SMAAShader.mjs +3 -3
  317. package/dist/shaders/SSAOShader.js +4 -4
  318. package/dist/shaders/SSAOShader.mjs +4 -4
  319. package/dist/shaders/SSRShader.js +4 -4
  320. package/dist/shaders/SSRShader.mjs +4 -4
  321. package/dist/shaders/SobelOperatorShader.js +1 -1
  322. package/dist/shaders/SobelOperatorShader.mjs +1 -1
  323. package/dist/shaders/SubsurfaceScatteringShader.d.ts +2 -2
  324. package/dist/shaders/SubsurfaceScatteringShader.js +91 -52
  325. package/dist/shaders/SubsurfaceScatteringShader.mjs +91 -52
  326. package/dist/shaders/ToonShader.js +25 -25
  327. package/dist/shaders/ToonShader.mjs +25 -25
  328. package/dist/shaders/TriangleBlurShader.js +1 -1
  329. package/dist/shaders/TriangleBlurShader.mjs +1 -1
  330. package/dist/shaders/VerticalBlurShader.d.ts +1 -1
  331. package/dist/shaders/VolumeShader.js +2 -2
  332. package/dist/shaders/VolumeShader.mjs +2 -2
  333. package/dist/shaders/types.d.ts +2 -2
  334. package/dist/types/Loader.d.ts +4 -0
  335. package/dist/types/Loader.js +26 -0
  336. package/dist/types/Loader.mjs +9 -0
  337. package/dist/types/shared.d.ts +2 -2
  338. package/dist/types/utils.d.ts +1 -1
  339. package/dist/utils/BufferGeometryUtils.d.ts +2 -2
  340. package/dist/utils/BufferGeometryUtils.js +1 -1
  341. package/dist/utils/BufferGeometryUtils.mjs +1 -1
  342. package/dist/utils/RoughnessMipmapper.d.ts +8 -0
  343. package/dist/utils/RoughnessMipmapper.js +79 -75
  344. package/dist/utils/RoughnessMipmapper.mjs +79 -75
  345. package/dist/utils/ShadowMapViewer.js +103 -106
  346. package/dist/utils/ShadowMapViewer.mjs +103 -106
  347. package/dist/utils/SkeletonUtils.d.ts +5 -21
  348. package/dist/utils/SkeletonUtils.js +182 -263
  349. package/dist/utils/SkeletonUtils.mjs +183 -264
  350. package/dist/utils/UVsDebug.js +37 -42
  351. package/dist/utils/UVsDebug.mjs +37 -42
  352. package/dist/webxr/ARButton.d.ts +2 -1
  353. package/dist/webxr/OculusHandModel.d.ts +2 -1
  354. package/dist/webxr/OculusHandPointerModel.d.ts +2 -2
  355. package/dist/webxr/OculusHandPointerModel.js +2 -2
  356. package/dist/webxr/OculusHandPointerModel.mjs +2 -2
  357. package/dist/webxr/VRButton.d.ts +2 -1
  358. package/dist/webxr/XRHandPrimitiveModel.js +2 -2
  359. package/dist/webxr/XRHandPrimitiveModel.mjs +2 -2
  360. package/package.json +5 -6
  361. package/dist/custom.d.ts +0 -5
  362. package/dist/loaders/NodeMaterialLoader.js +0 -146
  363. package/dist/loaders/NodeMaterialLoader.mjs +0 -146
  364. package/dist/nodes/Nodes.js +0 -347
  365. package/dist/nodes/Nodes.mjs +0 -347
  366. package/dist/nodes/ShaderNode.js +0 -408
  367. package/dist/nodes/ShaderNode.mjs +0 -408
  368. package/dist/nodes/accessors/BufferNode.js +0 -14
  369. package/dist/nodes/accessors/BufferNode.mjs +0 -15
  370. package/dist/nodes/accessors/CameraNode.js +0 -43
  371. package/dist/nodes/accessors/CameraNode.mjs +0 -44
  372. package/dist/nodes/accessors/CubeTextureNode.js +0 -41
  373. package/dist/nodes/accessors/CubeTextureNode.mjs +0 -42
  374. package/dist/nodes/accessors/MaterialNode.js +0 -70
  375. package/dist/nodes/accessors/MaterialNode.mjs +0 -71
  376. package/dist/nodes/accessors/MaterialReferenceNode.js +0 -13
  377. package/dist/nodes/accessors/MaterialReferenceNode.mjs +0 -14
  378. package/dist/nodes/accessors/ModelNode.js +0 -8
  379. package/dist/nodes/accessors/ModelNode.mjs +0 -9
  380. package/dist/nodes/accessors/ModelViewProjectionNode.js +0 -23
  381. package/dist/nodes/accessors/ModelViewProjectionNode.mjs +0 -24
  382. package/dist/nodes/accessors/NormalNode.js +0 -61
  383. package/dist/nodes/accessors/NormalNode.mjs +0 -62
  384. package/dist/nodes/accessors/Object3DNode.js +0 -75
  385. package/dist/nodes/accessors/Object3DNode.mjs +0 -76
  386. package/dist/nodes/accessors/PointUVNode.js +0 -12
  387. package/dist/nodes/accessors/PointUVNode.mjs +0 -13
  388. package/dist/nodes/accessors/PositionNode.js +0 -64
  389. package/dist/nodes/accessors/PositionNode.mjs +0 -65
  390. package/dist/nodes/accessors/ReferenceNode.js +0 -36
  391. package/dist/nodes/accessors/ReferenceNode.mjs +0 -37
  392. package/dist/nodes/accessors/ReflectNode.js +0 -42
  393. package/dist/nodes/accessors/ReflectNode.mjs +0 -43
  394. package/dist/nodes/accessors/SkinningNode.js +0 -57
  395. package/dist/nodes/accessors/SkinningNode.mjs +0 -58
  396. package/dist/nodes/accessors/TextureNode.js +0 -53
  397. package/dist/nodes/accessors/TextureNode.mjs +0 -54
  398. package/dist/nodes/accessors/UVNode.js +0 -22
  399. package/dist/nodes/accessors/UVNode.mjs +0 -23
  400. package/dist/nodes/core/ArrayUniformNode.js +0 -13
  401. package/dist/nodes/core/ArrayUniformNode.mjs +0 -14
  402. package/dist/nodes/core/AttributeNode.js +0 -29
  403. package/dist/nodes/core/AttributeNode.mjs +0 -30
  404. package/dist/nodes/core/BypassNode.js +0 -21
  405. package/dist/nodes/core/BypassNode.mjs +0 -22
  406. package/dist/nodes/core/CodeNode.js +0 -27
  407. package/dist/nodes/core/CodeNode.mjs +0 -28
  408. package/dist/nodes/core/ConstNode.js +0 -13
  409. package/dist/nodes/core/ConstNode.mjs +0 -14
  410. package/dist/nodes/core/ContextNode.js +0 -21
  411. package/dist/nodes/core/ContextNode.mjs +0 -22
  412. package/dist/nodes/core/ExpressionNode.js +0 -18
  413. package/dist/nodes/core/ExpressionNode.mjs +0 -19
  414. package/dist/nodes/core/FunctionCallNode.js +0 -36
  415. package/dist/nodes/core/FunctionCallNode.mjs +0 -37
  416. package/dist/nodes/core/FunctionNode.js +0 -55
  417. package/dist/nodes/core/FunctionNode.mjs +0 -56
  418. package/dist/nodes/core/InputNode.js +0 -37
  419. package/dist/nodes/core/InputNode.mjs +0 -38
  420. package/dist/nodes/core/Node.js +0 -138
  421. package/dist/nodes/core/Node.mjs +0 -139
  422. package/dist/nodes/core/NodeAttribute.js +0 -9
  423. package/dist/nodes/core/NodeAttribute.mjs +0 -10
  424. package/dist/nodes/core/NodeBuilder.js +0 -402
  425. package/dist/nodes/core/NodeBuilder.mjs +0 -402
  426. package/dist/nodes/core/NodeCode.js +0 -10
  427. package/dist/nodes/core/NodeCode.mjs +0 -11
  428. package/dist/nodes/core/NodeFrame.js +0 -34
  429. package/dist/nodes/core/NodeFrame.mjs +0 -35
  430. package/dist/nodes/core/NodeFunctionInput.js +0 -12
  431. package/dist/nodes/core/NodeFunctionInput.mjs +0 -13
  432. package/dist/nodes/core/NodeKeywords.js +0 -43
  433. package/dist/nodes/core/NodeKeywords.mjs +0 -44
  434. package/dist/nodes/core/NodeUniform.js +0 -17
  435. package/dist/nodes/core/NodeUniform.mjs +0 -18
  436. package/dist/nodes/core/NodeUtils.js +0 -57
  437. package/dist/nodes/core/NodeUtils.mjs +0 -57
  438. package/dist/nodes/core/NodeVar.js +0 -9
  439. package/dist/nodes/core/NodeVar.mjs +0 -10
  440. package/dist/nodes/core/NodeVary.js +0 -9
  441. package/dist/nodes/core/NodeVary.mjs +0 -10
  442. package/dist/nodes/core/PropertyNode.js +0 -20
  443. package/dist/nodes/core/PropertyNode.mjs +0 -21
  444. package/dist/nodes/core/TempNode.js +0 -24
  445. package/dist/nodes/core/TempNode.mjs +0 -25
  446. package/dist/nodes/core/UniformNode.js +0 -22
  447. package/dist/nodes/core/UniformNode.mjs +0 -23
  448. package/dist/nodes/core/VarNode.js +0 -30
  449. package/dist/nodes/core/VarNode.mjs +0 -31
  450. package/dist/nodes/core/VaryNode.js +0 -29
  451. package/dist/nodes/core/VaryNode.mjs +0 -30
  452. package/dist/nodes/core/constants.js +0 -24
  453. package/dist/nodes/core/constants.mjs +0 -24
  454. package/dist/nodes/display/ColorSpaceNode.js +0 -62
  455. package/dist/nodes/display/ColorSpaceNode.mjs +0 -62
  456. package/dist/nodes/display/NormalMapNode.js +0 -53
  457. package/dist/nodes/display/NormalMapNode.mjs +0 -54
  458. package/dist/nodes/fog/FogNode.js +0 -14
  459. package/dist/nodes/fog/FogNode.mjs +0 -15
  460. package/dist/nodes/fog/FogRangeNode.js +0 -16
  461. package/dist/nodes/fog/FogRangeNode.mjs +0 -17
  462. package/dist/nodes/functions/BSDFs.js +0 -64
  463. package/dist/nodes/functions/BSDFs.mjs +0 -64
  464. package/dist/nodes/lights/LightContextNode.js +0 -34
  465. package/dist/nodes/lights/LightContextNode.mjs +0 -35
  466. package/dist/nodes/lights/LightNode.js +0 -57
  467. package/dist/nodes/lights/LightNode.mjs +0 -58
  468. package/dist/nodes/lights/LightsNode.js +0 -58
  469. package/dist/nodes/lights/LightsNode.mjs +0 -59
  470. package/dist/nodes/loaders/NodeLoader.js +0 -195
  471. package/dist/nodes/loaders/NodeLoader.mjs +0 -196
  472. package/dist/nodes/loaders/NodeMaterialLoader.js +0 -23
  473. package/dist/nodes/loaders/NodeMaterialLoader.mjs +0 -24
  474. package/dist/nodes/loaders/NodeObjectLoader.js +0 -39
  475. package/dist/nodes/loaders/NodeObjectLoader.mjs +0 -40
  476. package/dist/nodes/materials/LineBasicNodeMaterial.js +0 -26
  477. package/dist/nodes/materials/LineBasicNodeMaterial.mjs +0 -27
  478. package/dist/nodes/materials/Materials.js +0 -24
  479. package/dist/nodes/materials/Materials.mjs +0 -24
  480. package/dist/nodes/materials/MeshBasicNodeMaterial.js +0 -27
  481. package/dist/nodes/materials/MeshBasicNodeMaterial.mjs +0 -28
  482. package/dist/nodes/materials/MeshStandardNodeMaterial.js +0 -40
  483. package/dist/nodes/materials/MeshStandardNodeMaterial.mjs +0 -41
  484. package/dist/nodes/materials/NodeMaterial.js +0 -63
  485. package/dist/nodes/materials/NodeMaterial.mjs +0 -64
  486. package/dist/nodes/materials/PointsNodeMaterial.js +0 -29
  487. package/dist/nodes/materials/PointsNodeMaterial.mjs +0 -30
  488. package/dist/nodes/math/CondNode.js +0 -40
  489. package/dist/nodes/math/CondNode.mjs +0 -41
  490. package/dist/nodes/math/MathNode.js +0 -165
  491. package/dist/nodes/math/MathNode.mjs +0 -166
  492. package/dist/nodes/math/OperatorNode.js +0 -102
  493. package/dist/nodes/math/OperatorNode.mjs +0 -103
  494. package/dist/nodes/procedural/CheckerNode.js +0 -20
  495. package/dist/nodes/procedural/CheckerNode.mjs +0 -21
  496. package/dist/nodes/utils/ArrayElementNode.js +0 -18
  497. package/dist/nodes/utils/ArrayElementNode.mjs +0 -19
  498. package/dist/nodes/utils/ConvertNode.js +0 -24
  499. package/dist/nodes/utils/ConvertNode.mjs +0 -25
  500. package/dist/nodes/utils/JoinNode.js +0 -25
  501. package/dist/nodes/utils/JoinNode.mjs +0 -26
  502. package/dist/nodes/utils/MatcapUVNode.js +0 -15
  503. package/dist/nodes/utils/MatcapUVNode.mjs +0 -16
  504. package/dist/nodes/utils/OscNode.js +0 -49
  505. package/dist/nodes/utils/OscNode.mjs +0 -50
  506. package/dist/nodes/utils/SplitNode.js +0 -44
  507. package/dist/nodes/utils/SplitNode.mjs +0 -45
  508. package/dist/nodes/utils/SpriteSheetUVNode.js +0 -39
  509. package/dist/nodes/utils/SpriteSheetUVNode.mjs +0 -40
  510. package/dist/nodes/utils/TimerNode.js +0 -43
  511. package/dist/nodes/utils/TimerNode.mjs +0 -44
  512. package/dist/offscreen/jank.js +0 -26
  513. package/dist/offscreen/jank.mjs +0 -27
  514. package/dist/offscreen/offscreen.js +0 -8
  515. package/dist/offscreen/offscreen.mjs +0 -7
  516. package/dist/offscreen/scene.js +0 -68
  517. package/dist/offscreen/scene.mjs +0 -52
  518. package/dist/renderers/nodes/accessors/CameraNode.js +0 -62
  519. package/dist/renderers/nodes/accessors/CameraNode.mjs +0 -63
  520. package/dist/renderers/nodes/accessors/ModelNode.js +0 -60
  521. package/dist/renderers/nodes/accessors/ModelNode.mjs +0 -61
  522. package/dist/renderers/nodes/accessors/ModelViewProjectionNode.js +0 -20
  523. package/dist/renderers/nodes/accessors/ModelViewProjectionNode.mjs +0 -21
  524. package/dist/renderers/nodes/accessors/NormalNode.js +0 -60
  525. package/dist/renderers/nodes/accessors/NormalNode.mjs +0 -61
  526. package/dist/renderers/nodes/accessors/PositionNode.js +0 -29
  527. package/dist/renderers/nodes/accessors/PositionNode.mjs +0 -30
  528. package/dist/renderers/nodes/accessors/UVNode.js +0 -12
  529. package/dist/renderers/nodes/accessors/UVNode.mjs +0 -13
  530. package/dist/renderers/nodes/core/AttributeNode.js +0 -34
  531. package/dist/renderers/nodes/core/AttributeNode.mjs +0 -35
  532. package/dist/renderers/nodes/core/InputNode.js +0 -30
  533. package/dist/renderers/nodes/core/InputNode.mjs +0 -31
  534. package/dist/renderers/nodes/core/Node.js +0 -33
  535. package/dist/renderers/nodes/core/Node.mjs +0 -34
  536. package/dist/renderers/nodes/core/NodeAttribute.js +0 -9
  537. package/dist/renderers/nodes/core/NodeAttribute.mjs +0 -10
  538. package/dist/renderers/nodes/core/NodeBuilder.js +0 -248
  539. package/dist/renderers/nodes/core/NodeBuilder.mjs +0 -249
  540. package/dist/renderers/nodes/core/NodeFrame.js +0 -34
  541. package/dist/renderers/nodes/core/NodeFrame.mjs +0 -35
  542. package/dist/renderers/nodes/core/NodeSlot.js +0 -9
  543. package/dist/renderers/nodes/core/NodeSlot.mjs +0 -10
  544. package/dist/renderers/nodes/core/NodeUniform.js +0 -17
  545. package/dist/renderers/nodes/core/NodeUniform.mjs +0 -18
  546. package/dist/renderers/nodes/core/NodeVary.js +0 -10
  547. package/dist/renderers/nodes/core/NodeVary.mjs +0 -11
  548. package/dist/renderers/nodes/core/VaryNode.js +0 -21
  549. package/dist/renderers/nodes/core/VaryNode.mjs +0 -22
  550. package/dist/renderers/nodes/core/constants.js +0 -22
  551. package/dist/renderers/nodes/core/constants.mjs +0 -22
  552. package/dist/renderers/nodes/inputs/ColorNode.js +0 -10
  553. package/dist/renderers/nodes/inputs/ColorNode.mjs +0 -11
  554. package/dist/renderers/nodes/inputs/FloatNode.js +0 -10
  555. package/dist/renderers/nodes/inputs/FloatNode.mjs +0 -11
  556. package/dist/renderers/nodes/inputs/Matrix3Node.js +0 -11
  557. package/dist/renderers/nodes/inputs/Matrix3Node.mjs +0 -12
  558. package/dist/renderers/nodes/inputs/Matrix4Node.js +0 -11
  559. package/dist/renderers/nodes/inputs/Matrix4Node.mjs +0 -12
  560. package/dist/renderers/nodes/inputs/TextureNode.js +0 -19
  561. package/dist/renderers/nodes/inputs/TextureNode.mjs +0 -20
  562. package/dist/renderers/nodes/inputs/Vector2Node.js +0 -10
  563. package/dist/renderers/nodes/inputs/Vector2Node.mjs +0 -11
  564. package/dist/renderers/nodes/inputs/Vector3Node.js +0 -11
  565. package/dist/renderers/nodes/inputs/Vector3Node.mjs +0 -12
  566. package/dist/renderers/nodes/inputs/Vector4Node.js +0 -11
  567. package/dist/renderers/nodes/inputs/Vector4Node.mjs +0 -12
  568. package/dist/renderers/nodes/math/MathNode.js +0 -54
  569. package/dist/renderers/nodes/math/MathNode.mjs +0 -55
  570. package/dist/renderers/nodes/math/OperatorNode.js +0 -41
  571. package/dist/renderers/nodes/math/OperatorNode.mjs +0 -42
  572. package/dist/renderers/nodes/utils/SwitchNode.js +0 -19
  573. package/dist/renderers/nodes/utils/SwitchNode.mjs +0 -20
  574. package/dist/renderers/nodes/utils/TimerNode.js +0 -13
  575. package/dist/renderers/nodes/utils/TimerNode.mjs +0 -14
  576. package/dist/renderers/webgpu/WebGPU.js +0 -23
  577. package/dist/renderers/webgpu/WebGPU.mjs +0 -24
  578. package/dist/renderers/webgpu/WebGPUAttributes.js +0 -68
  579. package/dist/renderers/webgpu/WebGPUAttributes.mjs +0 -69
  580. package/dist/renderers/webgpu/WebGPUBackground.js +0 -60
  581. package/dist/renderers/webgpu/WebGPUBackground.mjs +0 -61
  582. package/dist/renderers/webgpu/WebGPUBinding.js +0 -13
  583. package/dist/renderers/webgpu/WebGPUBinding.mjs +0 -14
  584. package/dist/renderers/webgpu/WebGPUBindings.js +0 -154
  585. package/dist/renderers/webgpu/WebGPUBindings.mjs +0 -155
  586. package/dist/renderers/webgpu/WebGPUComputePipelines.js +0 -43
  587. package/dist/renderers/webgpu/WebGPUComputePipelines.mjs +0 -44
  588. package/dist/renderers/webgpu/WebGPUGeometries.js +0 -40
  589. package/dist/renderers/webgpu/WebGPUGeometries.mjs +0 -41
  590. package/dist/renderers/webgpu/WebGPUInfo.js +0 -45
  591. package/dist/renderers/webgpu/WebGPUInfo.mjs +0 -46
  592. package/dist/renderers/webgpu/WebGPUObjects.js +0 -24
  593. package/dist/renderers/webgpu/WebGPUObjects.mjs +0 -25
  594. package/dist/renderers/webgpu/WebGPUProperties.js +0 -21
  595. package/dist/renderers/webgpu/WebGPUProperties.mjs +0 -22
  596. package/dist/renderers/webgpu/WebGPURenderLists.js +0 -118
  597. package/dist/renderers/webgpu/WebGPURenderLists.mjs +0 -119
  598. package/dist/renderers/webgpu/WebGPURenderPipelines.js +0 -545
  599. package/dist/renderers/webgpu/WebGPURenderPipelines.mjs +0 -546
  600. package/dist/renderers/webgpu/WebGPURenderer.js +0 -596
  601. package/dist/renderers/webgpu/WebGPURenderer.mjs +0 -575
  602. package/dist/renderers/webgpu/WebGPUSampledTexture.js +0 -40
  603. package/dist/renderers/webgpu/WebGPUSampledTexture.mjs +0 -40
  604. package/dist/renderers/webgpu/WebGPUSampler.js +0 -14
  605. package/dist/renderers/webgpu/WebGPUSampler.mjs +0 -15
  606. package/dist/renderers/webgpu/WebGPUStorageBuffer.js +0 -14
  607. package/dist/renderers/webgpu/WebGPUStorageBuffer.mjs +0 -15
  608. package/dist/renderers/webgpu/WebGPUTextureRenderer.js +0 -22
  609. package/dist/renderers/webgpu/WebGPUTextureRenderer.mjs +0 -23
  610. package/dist/renderers/webgpu/WebGPUTextureUtils.js +0 -97
  611. package/dist/renderers/webgpu/WebGPUTextureUtils.mjs +0 -98
  612. package/dist/renderers/webgpu/WebGPUTextures.js +0 -483
  613. package/dist/renderers/webgpu/WebGPUTextures.mjs +0 -484
  614. package/dist/renderers/webgpu/WebGPUUniform.js +0 -81
  615. package/dist/renderers/webgpu/WebGPUUniform.mjs +0 -81
  616. package/dist/renderers/webgpu/WebGPUUniformsGroup.js +0 -175
  617. package/dist/renderers/webgpu/WebGPUUniformsGroup.mjs +0 -176
  618. package/dist/renderers/webgpu/constants.js +0 -241
  619. package/dist/renderers/webgpu/constants.mjs +0 -241
  620. package/dist/renderers/webgpu/nodes/ShaderLib.js +0 -41
  621. package/dist/renderers/webgpu/nodes/ShaderLib.mjs +0 -42
  622. package/dist/renderers/webgpu/nodes/WebGPUNodeBuilder.js +0 -164
  623. package/dist/renderers/webgpu/nodes/WebGPUNodeBuilder.mjs +0 -165
  624. package/dist/renderers/webgpu/nodes/WebGPUNodeUniform.js +0 -73
  625. package/dist/renderers/webgpu/nodes/WebGPUNodeUniform.mjs +0 -73
  626. package/dist/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.js +0 -14
  627. package/dist/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.mjs +0 -15
  628. package/dist/renderers/webgpu/nodes/WebGPUNodes.js +0 -39
  629. package/dist/renderers/webgpu/nodes/WebGPUNodes.mjs +0 -40
@@ -1,15 +1,89 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
- var __publicField = (obj, key, value) => {
5
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
- return value;
7
- };
8
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
9
3
  const THREE = require("three");
4
+ let _renderer;
5
+ let fullscreenQuadGeometry;
6
+ let fullscreenQuadMaterial;
7
+ let fullscreenQuad;
8
+ function decompress(texture, maxTextureSize = Infinity, renderer = null) {
9
+ if (!fullscreenQuadGeometry)
10
+ fullscreenQuadGeometry = new THREE.PlaneGeometry(2, 2, 1, 1);
11
+ if (!fullscreenQuadMaterial)
12
+ fullscreenQuadMaterial = new THREE.ShaderMaterial({
13
+ uniforms: { blitTexture: new THREE.Uniform(texture) },
14
+ vertexShader: (
15
+ /* glsl */
16
+ `
17
+ varying vec2 vUv;
18
+ void main(){
19
+ vUv = uv;
20
+ gl_Position = vec4(position.xy * 1.0,0.,.999999);
21
+ }
22
+ `
23
+ ),
24
+ fragmentShader: (
25
+ /* glsl */
26
+ `
27
+ uniform sampler2D blitTexture;
28
+ varying vec2 vUv;
29
+
30
+ void main(){
31
+ gl_FragColor = vec4(vUv.xy, 0, 1);
32
+
33
+ #ifdef IS_SRGB
34
+ gl_FragColor = LinearTosRGB( texture2D( blitTexture, vUv) );
35
+ #else
36
+ gl_FragColor = texture2D( blitTexture, vUv);
37
+ #endif
38
+ }
39
+ `
40
+ )
41
+ });
42
+ fullscreenQuadMaterial.uniforms.blitTexture.value = texture;
43
+ fullscreenQuadMaterial.defines.IS_SRGB = "colorSpace" in texture ? texture.colorSpace === "srgb" : texture.encoding === 3001;
44
+ fullscreenQuadMaterial.needsUpdate = true;
45
+ if (!fullscreenQuad) {
46
+ fullscreenQuad = new THREE.Mesh(fullscreenQuadGeometry, fullscreenQuadMaterial);
47
+ fullscreenQuad.frustrumCulled = false;
48
+ }
49
+ const _camera = new THREE.PerspectiveCamera();
50
+ const _scene = new THREE.Scene();
51
+ _scene.add(fullscreenQuad);
52
+ if (!renderer) {
53
+ renderer = _renderer = new THREE.WebGLRenderer({ antialias: false });
54
+ }
55
+ renderer.setSize(Math.min(texture.image.width, maxTextureSize), Math.min(texture.image.height, maxTextureSize));
56
+ renderer.clear();
57
+ renderer.render(_scene, _camera);
58
+ const readableTexture = new THREE.Texture(renderer.domElement);
59
+ readableTexture.minFilter = texture.minFilter;
60
+ readableTexture.magFilter = texture.magFilter;
61
+ readableTexture.wrapS = texture.wrapS;
62
+ readableTexture.wrapT = texture.wrapT;
63
+ readableTexture.name = texture.name;
64
+ if (_renderer) {
65
+ _renderer.dispose();
66
+ _renderer = null;
67
+ }
68
+ return readableTexture;
69
+ }
70
+ const KHR_mesh_quantization_ExtraAttrTypes = {
71
+ POSITION: [
72
+ "byte",
73
+ "byte normalized",
74
+ "unsigned byte",
75
+ "unsigned byte normalized",
76
+ "short",
77
+ "short normalized",
78
+ "unsigned short",
79
+ "unsigned short normalized"
80
+ ],
81
+ NORMAL: ["byte normalized", "short normalized"],
82
+ TANGENT: ["byte normalized", "short normalized"],
83
+ TEXCOORD: ["byte", "byte normalized", "unsigned byte", "short", "short normalized", "unsigned short"]
84
+ };
10
85
  class GLTFExporter {
11
86
  constructor() {
12
- __publicField(this, "pluginCallbacks");
13
87
  this.pluginCallbacks = [];
14
88
  this.register(function(writer) {
15
89
  return new GLTFLightExtension(writer);
@@ -17,15 +91,33 @@ class GLTFExporter {
17
91
  this.register(function(writer) {
18
92
  return new GLTFMaterialsUnlitExtension(writer);
19
93
  });
20
- this.register(function(writer) {
21
- return new GLTFMaterialsPBRSpecularGlossiness(writer);
22
- });
23
94
  this.register(function(writer) {
24
95
  return new GLTFMaterialsTransmissionExtension(writer);
25
96
  });
26
97
  this.register(function(writer) {
27
98
  return new GLTFMaterialsVolumeExtension(writer);
28
99
  });
100
+ this.register(function(writer) {
101
+ return new GLTFMaterialsIorExtension(writer);
102
+ });
103
+ this.register(function(writer) {
104
+ return new GLTFMaterialsSpecularExtension(writer);
105
+ });
106
+ this.register(function(writer) {
107
+ return new GLTFMaterialsClearcoatExtension(writer);
108
+ });
109
+ this.register(function(writer) {
110
+ return new GLTFMaterialsIridescenceExtension(writer);
111
+ });
112
+ this.register(function(writer) {
113
+ return new GLTFMaterialsSheenExtension(writer);
114
+ });
115
+ this.register(function(writer) {
116
+ return new GLTFMaterialsAnisotropyExtension(writer);
117
+ });
118
+ this.register(function(writer) {
119
+ return new GLTFMaterialsEmissiveStrengthExtension(writer);
120
+ });
29
121
  }
30
122
  register(callback) {
31
123
  if (this.pluginCallbacks.indexOf(callback) === -1) {
@@ -39,126 +131,29 @@ class GLTFExporter {
39
131
  }
40
132
  return this;
41
133
  }
42
- parse(input, onDone, options) {
134
+ /**
135
+ * Parse scenes and generate GLTF output
136
+ * @param {Scene or [THREE.Scenes]} input Scene or Array of THREE.Scenes
137
+ * @param {Function} onDone Callback on completed
138
+ * @param {Function} onError Callback on errors
139
+ * @param {Object} options options
140
+ */
141
+ parse(input, onDone, onError, options) {
43
142
  const writer = new GLTFWriter();
44
143
  const plugins = [];
45
144
  for (let i = 0, il = this.pluginCallbacks.length; i < il; i++) {
46
145
  plugins.push(this.pluginCallbacks[i](writer));
47
146
  }
48
147
  writer.setPlugins(plugins);
49
- writer.write(input, onDone, options);
148
+ writer.write(input, onDone, options).catch(onError);
50
149
  }
51
- }
52
- /**
53
- * Static utility functions
54
- */
55
- __publicField(GLTFExporter, "Utils", {
56
- insertKeyframe: function(track, time) {
57
- const tolerance = 1e-3;
58
- const valueSize = track.getValueSize();
59
- const times = new track.TimeBufferType(track.times.length + 1);
60
- const values = new track.ValueBufferType(track.values.length + valueSize);
61
- const interpolant = track.createInterpolant(new track.ValueBufferType(valueSize));
62
- let index;
63
- if (track.times.length === 0) {
64
- times[0] = time;
65
- for (let i = 0; i < valueSize; i++) {
66
- values[i] = 0;
67
- }
68
- index = 0;
69
- } else if (time < track.times[0]) {
70
- if (Math.abs(track.times[0] - time) < tolerance)
71
- return 0;
72
- times[0] = time;
73
- times.set(track.times, 1);
74
- values.set(interpolant.evaluate(time), 0);
75
- values.set(track.values, valueSize);
76
- index = 0;
77
- } else if (time > track.times[track.times.length - 1]) {
78
- if (Math.abs(track.times[track.times.length - 1] - time) < tolerance) {
79
- return track.times.length - 1;
80
- }
81
- times[times.length - 1] = time;
82
- times.set(track.times, 0);
83
- values.set(track.values, 0);
84
- values.set(interpolant.evaluate(time), track.values.length);
85
- index = times.length - 1;
86
- } else {
87
- for (let i = 0; i < track.times.length; i++) {
88
- if (Math.abs(track.times[i] - time) < tolerance)
89
- return i;
90
- if (track.times[i] < time && track.times[i + 1] > time) {
91
- times.set(track.times.slice(0, i + 1), 0);
92
- times[i + 1] = time;
93
- times.set(track.times.slice(i + 1), i + 2);
94
- values.set(track.values.slice(0, (i + 1) * valueSize), 0);
95
- values.set(interpolant.evaluate(time), (i + 1) * valueSize);
96
- values.set(track.values.slice((i + 1) * valueSize), (i + 2) * valueSize);
97
- index = i + 1;
98
- break;
99
- }
100
- }
101
- }
102
- track.times = times;
103
- track.values = values;
104
- return index;
105
- },
106
- mergeMorphTargetTracks: function(clip, root) {
107
- const tracks = [];
108
- const mergedTracks = {};
109
- const sourceTracks = clip.tracks;
110
- for (let i = 0; i < sourceTracks.length; ++i) {
111
- let sourceTrack = sourceTracks[i];
112
- const sourceTrackBinding = THREE.PropertyBinding.parseTrackName(sourceTrack.name);
113
- const sourceTrackNode = THREE.PropertyBinding.findNode(root, sourceTrackBinding.nodeName);
114
- if (sourceTrackBinding.propertyName !== "morphTargetInfluences" || sourceTrackBinding.propertyIndex === void 0) {
115
- tracks.push(sourceTrack);
116
- continue;
117
- }
118
- if (
119
- // @ts-expect-error
120
- sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete && // @ts-expect-error
121
- sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear
122
- ) {
123
- if (sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline) {
124
- throw new Error("THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.");
125
- }
126
- console.warn("THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.");
127
- sourceTrack = sourceTrack.clone();
128
- sourceTrack.setInterpolation(THREE.InterpolateLinear);
129
- }
130
- const targetCount = sourceTrackNode.morphTargetInfluences.length;
131
- const targetIndex = sourceTrackNode.morphTargetDictionary[sourceTrackBinding.propertyIndex];
132
- if (targetIndex === void 0) {
133
- throw new Error("THREE.GLTFExporter: Morph target name not found: " + sourceTrackBinding.propertyIndex);
134
- }
135
- let mergedTrack;
136
- if (mergedTracks[sourceTrackNode.uuid] === void 0) {
137
- mergedTrack = sourceTrack.clone();
138
- const values = new mergedTrack.ValueBufferType(targetCount * mergedTrack.times.length);
139
- for (let j = 0; j < mergedTrack.times.length; j++) {
140
- values[j * targetCount + targetIndex] = mergedTrack.values[j];
141
- }
142
- mergedTrack.name = (sourceTrackBinding.nodeName || "") + ".morphTargetInfluences";
143
- mergedTrack.values = values;
144
- mergedTracks[sourceTrackNode.uuid] = mergedTrack;
145
- tracks.push(mergedTrack);
146
- continue;
147
- }
148
- const sourceInterpolant = sourceTrack.createInterpolant(new sourceTrack.ValueBufferType(1));
149
- mergedTrack = mergedTracks[sourceTrackNode.uuid];
150
- for (let j = 0; j < mergedTrack.times.length; j++) {
151
- mergedTrack.values[j * targetCount + targetIndex] = sourceInterpolant.evaluate(mergedTrack.times[j]);
152
- }
153
- for (let j = 0; j < sourceTrack.times.length; j++) {
154
- const keyframeIndex = this.insertKeyframe(mergedTrack, sourceTrack.times[j]);
155
- mergedTrack.values[keyframeIndex * targetCount + targetIndex] = sourceTrack.values[j];
156
- }
157
- }
158
- clip.tracks = tracks;
159
- return clip;
150
+ parseAsync(input, options) {
151
+ const scope = this;
152
+ return new Promise(function(resolve, reject) {
153
+ scope.parse(input, resolve, reject, options);
154
+ });
160
155
  }
161
- });
156
+ }
162
157
  const WEBGL_CONSTANTS = {
163
158
  POINTS: 0,
164
159
  LINES: 1,
@@ -167,10 +162,13 @@ const WEBGL_CONSTANTS = {
167
162
  TRIANGLES: 4,
168
163
  TRIANGLE_STRIP: 5,
169
164
  TRIANGLE_FAN: 6,
165
+ BYTE: 5120,
170
166
  UNSIGNED_BYTE: 5121,
167
+ SHORT: 5122,
171
168
  UNSIGNED_SHORT: 5123,
172
- FLOAT: 5126,
169
+ INT: 5124,
173
170
  UNSIGNED_INT: 5125,
171
+ FLOAT: 5126,
174
172
  ARRAY_BUFFER: 34962,
175
173
  ELEMENT_ARRAY_BUFFER: 34963,
176
174
  NEAREST: 9728,
@@ -183,6 +181,7 @@ const WEBGL_CONSTANTS = {
183
181
  MIRRORED_REPEAT: 33648,
184
182
  REPEAT: 10497
185
183
  };
184
+ const KHR_MESH_QUANTIZATION = "KHR_mesh_quantization";
186
185
  const THREE_TO_WEBGL = {};
187
186
  THREE_TO_WEBGL[THREE.NearestFilter] = WEBGL_CONSTANTS.NEAREST;
188
187
  THREE_TO_WEBGL[THREE.NearestMipmapNearestFilter] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST;
@@ -199,35 +198,103 @@ const PATH_PROPERTIES = {
199
198
  quaternion: "rotation",
200
199
  morphTargetInfluences: "weights"
201
200
  };
201
+ const DEFAULT_SPECULAR_COLOR = new THREE.Color();
202
202
  const GLB_HEADER_BYTES = 12;
203
203
  const GLB_HEADER_MAGIC = 1179937895;
204
204
  const GLB_VERSION = 2;
205
205
  const GLB_CHUNK_PREFIX_BYTES = 8;
206
206
  const GLB_CHUNK_TYPE_JSON = 1313821514;
207
207
  const GLB_CHUNK_TYPE_BIN = 5130562;
208
+ function equalArray(array1, array2) {
209
+ return array1.length === array2.length && array1.every(function(element, index) {
210
+ return element === array2[index];
211
+ });
212
+ }
213
+ function stringToArrayBuffer(text) {
214
+ return new TextEncoder().encode(text).buffer;
215
+ }
216
+ function isIdentityMatrix(matrix) {
217
+ return equalArray(matrix.elements, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
218
+ }
219
+ function getMinMax(attribute, start, count) {
220
+ const output = {
221
+ min: new Array(attribute.itemSize).fill(Number.POSITIVE_INFINITY),
222
+ max: new Array(attribute.itemSize).fill(Number.NEGATIVE_INFINITY)
223
+ };
224
+ for (let i = start; i < start + count; i++) {
225
+ for (let a = 0; a < attribute.itemSize; a++) {
226
+ let value;
227
+ if (attribute.itemSize > 4) {
228
+ value = attribute.array[i * attribute.itemSize + a];
229
+ } else {
230
+ if (a === 0)
231
+ value = attribute.getX(i);
232
+ else if (a === 1)
233
+ value = attribute.getY(i);
234
+ else if (a === 2)
235
+ value = attribute.getZ(i);
236
+ else if (a === 3)
237
+ value = attribute.getW(i);
238
+ if (attribute.normalized === true) {
239
+ value = THREE.MathUtils.normalize(value, attribute.array);
240
+ }
241
+ }
242
+ output.min[a] = Math.min(output.min[a], value);
243
+ output.max[a] = Math.max(output.max[a], value);
244
+ }
245
+ }
246
+ return output;
247
+ }
248
+ function getPaddedBufferSize(bufferSize) {
249
+ return Math.ceil(bufferSize / 4) * 4;
250
+ }
251
+ function getPaddedArrayBuffer(arrayBuffer, paddingByte = 0) {
252
+ const paddedLength = getPaddedBufferSize(arrayBuffer.byteLength);
253
+ if (paddedLength !== arrayBuffer.byteLength) {
254
+ const array = new Uint8Array(paddedLength);
255
+ array.set(new Uint8Array(arrayBuffer));
256
+ if (paddingByte !== 0) {
257
+ for (let i = arrayBuffer.byteLength; i < paddedLength; i++) {
258
+ array[i] = paddingByte;
259
+ }
260
+ }
261
+ return array.buffer;
262
+ }
263
+ return arrayBuffer;
264
+ }
265
+ function getCanvas() {
266
+ if (typeof document === "undefined" && typeof OffscreenCanvas !== "undefined") {
267
+ return new OffscreenCanvas(1, 1);
268
+ }
269
+ return document.createElement("canvas");
270
+ }
271
+ function getToBlobPromise(canvas, mimeType) {
272
+ if (canvas.toBlob !== void 0) {
273
+ return new Promise((resolve) => canvas.toBlob(resolve, mimeType));
274
+ }
275
+ let quality;
276
+ if (mimeType === "image/jpeg") {
277
+ quality = 0.92;
278
+ } else if (mimeType === "image/webp") {
279
+ quality = 0.8;
280
+ }
281
+ return canvas.convertToBlob({
282
+ type: mimeType,
283
+ quality
284
+ });
285
+ }
208
286
  class GLTFWriter {
209
287
  constructor() {
210
- __publicField(this, "plugins");
211
- __publicField(this, "options");
212
- __publicField(this, "pending");
213
- __publicField(this, "buffers");
214
- __publicField(this, "byteOffset");
215
- __publicField(this, "nodeMap");
216
- __publicField(this, "skins");
217
- __publicField(this, "extensionsUsed");
218
- __publicField(this, "uids");
219
- __publicField(this, "uid");
220
- __publicField(this, "json");
221
- __publicField(this, "cache");
222
- __publicField(this, "cachedCanvas");
223
288
  this.plugins = [];
224
289
  this.options = {};
225
290
  this.pending = [];
226
291
  this.buffers = [];
227
292
  this.byteOffset = 0;
293
+ this.buffers = [];
228
294
  this.nodeMap = /* @__PURE__ */ new Map();
229
295
  this.skins = [];
230
296
  this.extensionsUsed = {};
297
+ this.extensionsRequired = {};
231
298
  this.uids = /* @__PURE__ */ new Map();
232
299
  this.uid = 0;
233
300
  this.json = {
@@ -244,7 +311,6 @@ class GLTFWriter {
244
311
  textures: /* @__PURE__ */ new Map(),
245
312
  images: /* @__PURE__ */ new Map()
246
313
  };
247
- this.cachedCanvas = null;
248
314
  }
249
315
  setPlugins(plugins) {
250
316
  this.plugins = plugins;
@@ -255,85 +321,79 @@ class GLTFWriter {
255
321
  * @param {Function} onDone Callback on completed
256
322
  * @param {Object} options options
257
323
  */
258
- write(input, onDone, options) {
324
+ async write(input, onDone, options = {}) {
259
325
  this.options = Object.assign(
260
- {},
261
326
  {
262
327
  // default options
263
328
  binary: false,
264
329
  trs: false,
265
330
  onlyVisible: true,
266
- truncateDrawRange: true,
267
- embedImages: true,
268
331
  maxTextureSize: Infinity,
269
332
  animations: [],
270
333
  includeCustomExtensions: false
271
334
  },
272
335
  options
273
336
  );
274
- if (this.options.animations !== void 0 && this.options.animations.length > 0) {
337
+ if (this.options.animations.length > 0) {
275
338
  this.options.trs = true;
276
339
  }
277
340
  this.processInput(input);
341
+ await Promise.all(this.pending);
278
342
  const writer = this;
279
- Promise.all(this.pending).then(() => {
280
- const buffers = writer.buffers;
281
- const json = writer.json;
282
- const options2 = writer.options;
283
- const extensionsUsed = writer.extensionsUsed;
284
- const blob = new Blob(buffers, { type: "application/octet-stream" });
285
- const extensionsUsedList = Object.keys(extensionsUsed);
286
- if (extensionsUsedList.length > 0)
287
- json.extensionsUsed = extensionsUsedList;
288
- if (json.buffers && json.buffers.length > 0)
289
- json.buffers[0].byteLength = blob.size;
290
- if (options2.binary) {
291
- const reader = new window.FileReader();
292
- reader.readAsArrayBuffer(blob);
293
- reader.onloadend = () => {
294
- if (reader.result !== null && typeof reader.result !== "string") {
295
- const binaryChunk = this.getPaddedArrayBuffer(reader.result);
296
- const binaryChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES));
297
- binaryChunkPrefix.setUint32(0, binaryChunk.byteLength, true);
298
- binaryChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_BIN, true);
299
- const jsonChunk = this.getPaddedArrayBuffer(this.stringToArrayBuffer(JSON.stringify(json)), 32);
300
- const jsonChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES));
301
- jsonChunkPrefix.setUint32(0, jsonChunk.byteLength, true);
302
- jsonChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_JSON, true);
303
- const header = new ArrayBuffer(GLB_HEADER_BYTES);
304
- const headerView = new DataView(header);
305
- headerView.setUint32(0, GLB_HEADER_MAGIC, true);
306
- headerView.setUint32(4, GLB_VERSION, true);
307
- const totalByteLength = GLB_HEADER_BYTES + jsonChunkPrefix.byteLength + jsonChunk.byteLength + binaryChunkPrefix.byteLength + binaryChunk.byteLength;
308
- headerView.setUint32(8, totalByteLength, true);
309
- const glbBlob = new Blob([header, jsonChunkPrefix, jsonChunk, binaryChunkPrefix, binaryChunk], {
310
- type: "application/octet-stream"
311
- });
312
- const glbReader = new window.FileReader();
313
- glbReader.readAsArrayBuffer(glbBlob);
314
- glbReader.onloadend = function() {
315
- if (glbReader.result !== null && typeof glbReader.result !== "string") {
316
- onDone(glbReader.result);
317
- }
318
- };
319
- }
343
+ const buffers = writer.buffers;
344
+ const json = writer.json;
345
+ options = writer.options;
346
+ const extensionsUsed = writer.extensionsUsed;
347
+ const extensionsRequired = writer.extensionsRequired;
348
+ const blob = new Blob(buffers, { type: "application/octet-stream" });
349
+ const extensionsUsedList = Object.keys(extensionsUsed);
350
+ const extensionsRequiredList = Object.keys(extensionsRequired);
351
+ if (extensionsUsedList.length > 0)
352
+ json.extensionsUsed = extensionsUsedList;
353
+ if (extensionsRequiredList.length > 0)
354
+ json.extensionsRequired = extensionsRequiredList;
355
+ if (json.buffers && json.buffers.length > 0)
356
+ json.buffers[0].byteLength = blob.size;
357
+ if (options.binary === true) {
358
+ const reader = new FileReader();
359
+ reader.readAsArrayBuffer(blob);
360
+ reader.onloadend = function() {
361
+ const binaryChunk = getPaddedArrayBuffer(reader.result);
362
+ const binaryChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES));
363
+ binaryChunkPrefix.setUint32(0, binaryChunk.byteLength, true);
364
+ binaryChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_BIN, true);
365
+ const jsonChunk = getPaddedArrayBuffer(stringToArrayBuffer(JSON.stringify(json)), 32);
366
+ const jsonChunkPrefix = new DataView(new ArrayBuffer(GLB_CHUNK_PREFIX_BYTES));
367
+ jsonChunkPrefix.setUint32(0, jsonChunk.byteLength, true);
368
+ jsonChunkPrefix.setUint32(4, GLB_CHUNK_TYPE_JSON, true);
369
+ const header = new ArrayBuffer(GLB_HEADER_BYTES);
370
+ const headerView = new DataView(header);
371
+ headerView.setUint32(0, GLB_HEADER_MAGIC, true);
372
+ headerView.setUint32(4, GLB_VERSION, true);
373
+ const totalByteLength = GLB_HEADER_BYTES + jsonChunkPrefix.byteLength + jsonChunk.byteLength + binaryChunkPrefix.byteLength + binaryChunk.byteLength;
374
+ headerView.setUint32(8, totalByteLength, true);
375
+ const glbBlob = new Blob([header, jsonChunkPrefix, jsonChunk, binaryChunkPrefix, binaryChunk], {
376
+ type: "application/octet-stream"
377
+ });
378
+ const glbReader = new FileReader();
379
+ glbReader.readAsArrayBuffer(glbBlob);
380
+ glbReader.onloadend = function() {
381
+ onDone(glbReader.result);
320
382
  };
321
- } else {
322
- if (json.buffers && json.buffers.length > 0) {
323
- const reader = new window.FileReader();
324
- reader.readAsDataURL(blob);
325
- reader.onloadend = function() {
326
- const base64data = reader.result;
327
- if (json.buffers !== void 0 && base64data !== null) {
328
- json.buffers[0].uri = base64data;
329
- onDone(json);
330
- }
331
- };
332
- } else {
383
+ };
384
+ } else {
385
+ if (json.buffers && json.buffers.length > 0) {
386
+ const reader = new FileReader();
387
+ reader.readAsDataURL(blob);
388
+ reader.onloadend = function() {
389
+ const base64data = reader.result;
390
+ json.buffers[0].uri = base64data;
333
391
  onDone(json);
334
- }
392
+ };
393
+ } else {
394
+ onDone(json);
335
395
  }
336
- });
396
+ }
337
397
  }
338
398
  /**
339
399
  * Serializes a userData.
@@ -360,23 +420,25 @@ class GLTFWriter {
360
420
  if (Object.keys(json).length > 0)
361
421
  objectDef.extras = json;
362
422
  } catch (error) {
363
- if (error instanceof Error) {
364
- console.warn(
365
- "THREE.GLTFExporter: userData of '" + object.name + "' won't be serialized because of JSON.stringify error - " + error.message
366
- );
367
- }
423
+ console.warn(
424
+ "THREE.GLTFExporter: userData of '" + object.name + "' won't be serialized because of JSON.stringify error - " + error.message
425
+ );
368
426
  }
369
427
  }
370
428
  /**
371
- * Assign and return a temporal unique id for an object
372
- * especially which doesn't have .uuid
429
+ * Returns ids for buffer attributes.
373
430
  * @param {Object} object
374
431
  * @return {Integer}
375
432
  */
376
- getUID(object) {
377
- if (!this.uids.has(object))
378
- this.uids.set(object, this.uid++);
379
- return this.uids.get(object);
433
+ getUID(attribute, isRelativeCopy = false) {
434
+ if (this.uids.has(attribute) === false) {
435
+ const uids2 = /* @__PURE__ */ new Map();
436
+ uids2.set(true, this.uid++);
437
+ uids2.set(false, this.uid++);
438
+ this.uids.set(attribute, uids2);
439
+ }
440
+ const uids = this.uids.get(attribute);
441
+ return uids.get(isRelativeCopy);
380
442
  }
381
443
  /**
382
444
  * Checks if normal attribute values are normalized.
@@ -448,6 +510,64 @@ class GLTFWriter {
448
510
  this.extensionsUsed["KHR_texture_transform"] = true;
449
511
  }
450
512
  }
513
+ buildMetalRoughTexture(metalnessMap, roughnessMap) {
514
+ if (metalnessMap === roughnessMap)
515
+ return metalnessMap;
516
+ function getEncodingConversion(map) {
517
+ if (map.colorSpace === THREE.SRGBColorSpace) {
518
+ return function SRGBToLinear(c) {
519
+ return c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);
520
+ };
521
+ }
522
+ return function LinearToLinear(c) {
523
+ return c;
524
+ };
525
+ }
526
+ console.warn("THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.");
527
+ if (metalnessMap instanceof THREE.CompressedTexture) {
528
+ metalnessMap = decompress(metalnessMap);
529
+ }
530
+ if (roughnessMap instanceof THREE.CompressedTexture) {
531
+ roughnessMap = decompress(roughnessMap);
532
+ }
533
+ const metalness = metalnessMap ? metalnessMap.image : null;
534
+ const roughness = roughnessMap ? roughnessMap.image : null;
535
+ const width = Math.max(metalness ? metalness.width : 0, roughness ? roughness.width : 0);
536
+ const height = Math.max(metalness ? metalness.height : 0, roughness ? roughness.height : 0);
537
+ const canvas = getCanvas();
538
+ canvas.width = width;
539
+ canvas.height = height;
540
+ const context = canvas.getContext("2d");
541
+ context.fillStyle = "#00ffff";
542
+ context.fillRect(0, 0, width, height);
543
+ const composite = context.getImageData(0, 0, width, height);
544
+ if (metalness) {
545
+ context.drawImage(metalness, 0, 0, width, height);
546
+ const convert = getEncodingConversion(metalnessMap);
547
+ const data = context.getImageData(0, 0, width, height).data;
548
+ for (let i = 2; i < data.length; i += 4) {
549
+ composite.data[i] = convert(data[i] / 256) * 256;
550
+ }
551
+ }
552
+ if (roughness) {
553
+ context.drawImage(roughness, 0, 0, width, height);
554
+ const convert = getEncodingConversion(roughnessMap);
555
+ const data = context.getImageData(0, 0, width, height).data;
556
+ for (let i = 1; i < data.length; i += 4) {
557
+ composite.data[i] = convert(data[i] / 256) * 256;
558
+ }
559
+ }
560
+ context.putImageData(composite, 0, 0);
561
+ const reference = metalnessMap || roughnessMap;
562
+ const texture = reference.clone();
563
+ texture.source = new THREE.Source(canvas);
564
+ texture.colorSpace = THREE.NoColorSpace;
565
+ texture.channel = (metalnessMap || roughnessMap).channel;
566
+ if (metalnessMap && roughnessMap && metalnessMap.channel !== roughnessMap.channel) {
567
+ console.warn("THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match.");
568
+ }
569
+ return texture;
570
+ }
451
571
  /**
452
572
  * Process a buffer to append to the default one.
453
573
  * @param {ArrayBuffer} buffer
@@ -475,14 +595,19 @@ class GLTFWriter {
475
595
  if (!json.bufferViews)
476
596
  json.bufferViews = [];
477
597
  let componentSize;
478
- if (componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE) {
479
- componentSize = 1;
480
- } else if (componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT) {
481
- componentSize = 2;
482
- } else {
483
- componentSize = 4;
484
- }
485
- const byteLength = this.getPaddedBufferSize(count * attribute.itemSize * componentSize);
598
+ switch (componentType) {
599
+ case WEBGL_CONSTANTS.BYTE:
600
+ case WEBGL_CONSTANTS.UNSIGNED_BYTE:
601
+ componentSize = 1;
602
+ break;
603
+ case WEBGL_CONSTANTS.SHORT:
604
+ case WEBGL_CONSTANTS.UNSIGNED_SHORT:
605
+ componentSize = 2;
606
+ break;
607
+ default:
608
+ componentSize = 4;
609
+ }
610
+ const byteLength = getPaddedBufferSize(count * attribute.itemSize * componentSize);
486
611
  const dataView = new DataView(new ArrayBuffer(byteLength));
487
612
  let offset = 0;
488
613
  for (let i = start; i < start + count; i++) {
@@ -499,18 +624,25 @@ class GLTFWriter {
499
624
  value = attribute.getZ(i);
500
625
  else if (a === 3)
501
626
  value = attribute.getW(i);
502
- }
503
- if (value !== void 0) {
504
- if (componentType === WEBGL_CONSTANTS.FLOAT) {
505
- dataView.setFloat32(offset, value, true);
506
- } else if (componentType === WEBGL_CONSTANTS.UNSIGNED_INT) {
507
- dataView.setUint32(offset, value, true);
508
- } else if (componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT) {
509
- dataView.setUint16(offset, value, true);
510
- } else if (componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE) {
511
- dataView.setUint8(offset, value);
627
+ if (attribute.normalized === true) {
628
+ value = THREE.MathUtils.normalize(value, attribute.array);
512
629
  }
513
630
  }
631
+ if (componentType === WEBGL_CONSTANTS.FLOAT) {
632
+ dataView.setFloat32(offset, value, true);
633
+ } else if (componentType === WEBGL_CONSTANTS.INT) {
634
+ dataView.setInt32(offset, value, true);
635
+ } else if (componentType === WEBGL_CONSTANTS.UNSIGNED_INT) {
636
+ dataView.setUint32(offset, value, true);
637
+ } else if (componentType === WEBGL_CONSTANTS.SHORT) {
638
+ dataView.setInt16(offset, value, true);
639
+ } else if (componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT) {
640
+ dataView.setUint16(offset, value, true);
641
+ } else if (componentType === WEBGL_CONSTANTS.BYTE) {
642
+ dataView.setInt8(offset, value);
643
+ } else if (componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE) {
644
+ dataView.setUint8(offset, value);
645
+ }
514
646
  offset += componentSize;
515
647
  }
516
648
  }
@@ -542,20 +674,18 @@ class GLTFWriter {
542
674
  const json = writer.json;
543
675
  if (!json.bufferViews)
544
676
  json.bufferViews = [];
545
- return new Promise((resolve) => {
546
- const reader = new window.FileReader();
677
+ return new Promise(function(resolve) {
678
+ const reader = new FileReader();
547
679
  reader.readAsArrayBuffer(blob);
548
- reader.onloadend = () => {
549
- if (reader.result !== null && typeof reader.result !== "string" && json.bufferViews !== void 0) {
550
- const buffer = this.getPaddedArrayBuffer(reader.result);
551
- const bufferViewDef = {
552
- buffer: writer.processBuffer(buffer),
553
- byteOffset: writer.byteOffset,
554
- byteLength: buffer.byteLength
555
- };
556
- writer.byteOffset += buffer.byteLength;
557
- resolve(json.bufferViews.push(bufferViewDef) - 1);
558
- }
680
+ reader.onloadend = function() {
681
+ const buffer = getPaddedArrayBuffer(reader.result);
682
+ const bufferViewDef = {
683
+ buffer: writer.processBuffer(buffer),
684
+ byteOffset: writer.byteOffset,
685
+ byteLength: buffer.byteLength
686
+ };
687
+ writer.byteOffset += buffer.byteLength;
688
+ resolve(json.bufferViews.push(bufferViewDef) - 1);
559
689
  };
560
690
  });
561
691
  }
@@ -568,139 +698,135 @@ class GLTFWriter {
568
698
  * @return {Integer|null} Index of the processed accessor on the "accessors" array
569
699
  */
570
700
  processAccessor(attribute, geometry, start, count) {
571
- const options = this.options;
572
701
  const json = this.json;
573
702
  const types = {
574
703
  1: "SCALAR",
575
704
  2: "VEC2",
576
705
  3: "VEC3",
577
706
  4: "VEC4",
707
+ 9: "MAT3",
578
708
  16: "MAT4"
579
709
  };
580
710
  let componentType;
581
711
  if (attribute.array.constructor === Float32Array) {
582
712
  componentType = WEBGL_CONSTANTS.FLOAT;
713
+ } else if (attribute.array.constructor === Int32Array) {
714
+ componentType = WEBGL_CONSTANTS.INT;
583
715
  } else if (attribute.array.constructor === Uint32Array) {
584
716
  componentType = WEBGL_CONSTANTS.UNSIGNED_INT;
717
+ } else if (attribute.array.constructor === Int16Array) {
718
+ componentType = WEBGL_CONSTANTS.SHORT;
585
719
  } else if (attribute.array.constructor === Uint16Array) {
586
720
  componentType = WEBGL_CONSTANTS.UNSIGNED_SHORT;
721
+ } else if (attribute.array.constructor === Int8Array) {
722
+ componentType = WEBGL_CONSTANTS.BYTE;
587
723
  } else if (attribute.array.constructor === Uint8Array) {
588
724
  componentType = WEBGL_CONSTANTS.UNSIGNED_BYTE;
589
725
  } else {
590
- throw new Error("THREE.GLTFExporter: Unsupported bufferAttribute component type.");
726
+ throw new Error(
727
+ "THREE.GLTFExporter: Unsupported bufferAttribute component type: " + attribute.array.constructor.name
728
+ );
591
729
  }
592
730
  if (start === void 0)
593
731
  start = 0;
594
732
  if (count === void 0)
595
733
  count = attribute.count;
596
- if (options.truncateDrawRange && geometry !== void 0 && geometry.index === null) {
597
- const end = start + count;
598
- const end2 = geometry.drawRange.count === Infinity ? attribute.count : geometry.drawRange.start + geometry.drawRange.count;
599
- start = Math.max(start, geometry.drawRange.start);
600
- count = Math.min(end, end2) - start;
601
- if (count < 0)
602
- count = 0;
603
- }
604
734
  if (count === 0)
605
735
  return null;
606
- const minMax = this.getMinMax(attribute, start, count);
736
+ const minMax = getMinMax(attribute, start, count);
607
737
  let bufferViewTarget;
608
738
  if (geometry !== void 0) {
609
739
  bufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER;
610
740
  }
611
- if (bufferViewTarget !== void 0) {
612
- const bufferView = this.processBufferView(attribute, componentType, start, count, bufferViewTarget);
613
- const accessorDef = {
614
- bufferView: bufferView.id,
615
- byteOffset: bufferView.byteOffset,
616
- componentType,
617
- count,
618
- max: minMax.max,
619
- min: minMax.min,
620
- type: types[attribute.itemSize]
621
- };
622
- if (attribute.normalized)
623
- accessorDef.normalized = true;
624
- if (!json.accessors)
625
- json.accessors = [];
626
- return json.accessors.push(accessorDef) - 1;
627
- }
741
+ const bufferView = this.processBufferView(attribute, componentType, start, count, bufferViewTarget);
742
+ const accessorDef = {
743
+ bufferView: bufferView.id,
744
+ byteOffset: bufferView.byteOffset,
745
+ componentType,
746
+ count,
747
+ max: minMax.max,
748
+ min: minMax.min,
749
+ type: types[attribute.itemSize]
750
+ };
751
+ if (attribute.normalized === true)
752
+ accessorDef.normalized = true;
753
+ if (!json.accessors)
754
+ json.accessors = [];
755
+ return json.accessors.push(accessorDef) - 1;
628
756
  }
629
757
  /**
630
758
  * Process image
631
759
  * @param {Image} image to process
632
760
  * @param {Integer} format of the image (RGBAFormat)
633
761
  * @param {Boolean} flipY before writing out the image
762
+ * @param {String} mimeType export format
634
763
  * @return {Integer} Index of the processed texture in the "images" array
635
764
  */
636
- processImage(image, format, flipY) {
637
- const writer = this;
638
- const cache = writer.cache;
639
- const json = writer.json;
640
- const options = writer.options;
641
- const pending = writer.pending;
642
- if (!cache.images.has(image))
643
- cache.images.set(image, {});
644
- const cachedImages = cache.images.get(image);
645
- const mimeType = format === THREE.RGBAFormat ? "image/png" : "image/jpeg";
646
- const key = mimeType + ":flipY/" + flipY.toString();
647
- if (cachedImages !== void 0 && cachedImages[key] !== void 0)
648
- return cachedImages[key];
649
- if (!json.images)
650
- json.images = [];
651
- const imageDef = { mimeType };
652
- if (options.embedImages && options.maxTextureSize !== void 0) {
653
- const canvas = this.cachedCanvas = this.cachedCanvas || document.createElement("canvas");
765
+ processImage(image, format, flipY, mimeType = "image/png") {
766
+ if (image !== null) {
767
+ const writer = this;
768
+ const cache = writer.cache;
769
+ const json = writer.json;
770
+ const options = writer.options;
771
+ const pending = writer.pending;
772
+ if (!cache.images.has(image))
773
+ cache.images.set(image, {});
774
+ const cachedImages = cache.images.get(image);
775
+ const key = mimeType + ":flipY/" + flipY.toString();
776
+ if (cachedImages[key] !== void 0)
777
+ return cachedImages[key];
778
+ if (!json.images)
779
+ json.images = [];
780
+ const imageDef = { mimeType };
781
+ const canvas = getCanvas();
654
782
  canvas.width = Math.min(image.width, options.maxTextureSize);
655
783
  canvas.height = Math.min(image.height, options.maxTextureSize);
656
784
  const ctx = canvas.getContext("2d");
657
- if (flipY) {
658
- ctx == null ? void 0 : ctx.translate(0, canvas.height);
659
- ctx == null ? void 0 : ctx.scale(1, -1);
785
+ if (flipY === true) {
786
+ ctx.translate(0, canvas.height);
787
+ ctx.scale(1, -1);
660
788
  }
661
- if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image instanceof HTMLCanvasElement || typeof OffscreenCanvas !== "undefined" && image instanceof OffscreenCanvas || typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap) {
662
- ctx == null ? void 0 : ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
663
- } else {
789
+ if (image.data !== void 0) {
664
790
  if (format !== THREE.RGBAFormat) {
665
- console.error("GLTFExporter: Only RGBA format is supported.");
791
+ console.error("GLTFExporter: Only RGBAFormat is supported.", format);
666
792
  }
667
793
  if (image.width > options.maxTextureSize || image.height > options.maxTextureSize) {
668
794
  console.warn("GLTFExporter: Image size is bigger than maxTextureSize", image);
669
795
  }
670
796
  const data = new Uint8ClampedArray(image.height * image.width * 4);
671
- if (image instanceof ImageData) {
672
- for (let i = 0; i < data.length; i += 4) {
673
- data[i + 0] = image.data[i + 0];
674
- data[i + 1] = image.data[i + 1];
675
- data[i + 2] = image.data[i + 2];
676
- data[i + 3] = image.data[i + 3];
677
- }
797
+ for (let i = 0; i < data.length; i += 4) {
798
+ data[i + 0] = image.data[i + 0];
799
+ data[i + 1] = image.data[i + 1];
800
+ data[i + 2] = image.data[i + 2];
801
+ data[i + 3] = image.data[i + 3];
678
802
  }
679
- ctx == null ? void 0 : ctx.putImageData(new ImageData(data, image.width, image.height), 0, 0);
803
+ ctx.putImageData(new ImageData(data, image.width, image.height), 0, 0);
804
+ } else {
805
+ ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
680
806
  }
681
- if (options.binary) {
807
+ if (options.binary === true) {
682
808
  pending.push(
683
- new Promise(function(resolve) {
684
- canvas.toBlob(function(blob) {
685
- if (blob !== null) {
686
- writer.processBufferViewImage(blob).then(function(bufferViewIndex) {
687
- imageDef.bufferView = bufferViewIndex;
688
- resolve();
689
- });
690
- }
691
- }, mimeType);
809
+ getToBlobPromise(canvas, mimeType).then((blob) => writer.processBufferViewImage(blob)).then((bufferViewIndex) => {
810
+ imageDef.bufferView = bufferViewIndex;
692
811
  })
693
812
  );
694
813
  } else {
695
- imageDef.uri = canvas.toDataURL(mimeType);
814
+ if (canvas.toDataURL !== void 0) {
815
+ imageDef.uri = canvas.toDataURL(mimeType);
816
+ } else {
817
+ pending.push(
818
+ getToBlobPromise(canvas, mimeType).then((blob) => new FileReader().readAsDataURL(blob)).then((dataURL) => {
819
+ imageDef.uri = dataURL;
820
+ })
821
+ );
822
+ }
696
823
  }
697
- } else if (image instanceof Image) {
698
- imageDef.uri = image.src;
699
- }
700
- const index = json.images.push(imageDef) - 1;
701
- if (cachedImages !== void 0)
824
+ const index = json.images.push(imageDef) - 1;
702
825
  cachedImages[key] = index;
703
- return index;
826
+ return index;
827
+ } else {
828
+ throw new Error("THREE.GLTFExporter: No valid image data found. Unable to process texture.");
829
+ }
704
830
  }
705
831
  /**
706
832
  * Process sampler
@@ -725,15 +851,23 @@ class GLTFWriter {
725
851
  * @return {Integer} Index of the processed texture in the "textures" array
726
852
  */
727
853
  processTexture(map) {
854
+ const writer = this;
855
+ const options = writer.options;
728
856
  const cache = this.cache;
729
857
  const json = this.json;
730
858
  if (cache.textures.has(map))
731
859
  return cache.textures.get(map);
732
860
  if (!json.textures)
733
861
  json.textures = [];
862
+ if (map instanceof THREE.CompressedTexture) {
863
+ map = decompress(map, options.maxTextureSize);
864
+ }
865
+ let mimeType = map.userData.mimeType;
866
+ if (mimeType === "image/webp")
867
+ mimeType = "image/png";
734
868
  const textureDef = {
735
869
  sampler: this.processSampler(map),
736
- source: this.processImage(map.image, map.format, map.flipY)
870
+ source: this.processImage(map.image, map.format, map.flipY, mimeType)
737
871
  };
738
872
  if (map.name)
739
873
  textureDef.name = map.name;
@@ -754,74 +888,74 @@ class GLTFWriter {
754
888
  const json = this.json;
755
889
  if (cache.materials.has(material))
756
890
  return cache.materials.get(material);
757
- if (material instanceof THREE.ShaderMaterial && material.isShaderMaterial) {
891
+ if (material.isShaderMaterial) {
758
892
  console.warn("GLTFExporter: THREE.ShaderMaterial not supported.");
759
893
  return null;
760
894
  }
761
895
  if (!json.materials)
762
896
  json.materials = [];
763
897
  const materialDef = { pbrMetallicRoughness: {} };
764
- if (!(material instanceof THREE.MeshStandardMaterial && material.isMeshStandardMaterial && material instanceof THREE.MeshBasicMaterial && // @ts-expect-error
765
- material.isMeshBasicMaterial)) {
898
+ if (material.isMeshStandardMaterial !== true && material.isMeshBasicMaterial !== true) {
766
899
  console.warn("GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.");
767
900
  }
768
- if (material instanceof THREE.MeshStandardMaterial || material instanceof THREE.MeshPhysicalMaterial) {
769
- const color = material.color.toArray().concat([material.opacity]);
770
- if (!this.equalArray(color, [1, 1, 1, 1])) {
771
- materialDef.pbrMetallicRoughness.baseColorFactor = color;
772
- }
901
+ const color = material.color.toArray().concat([material.opacity]);
902
+ if (!equalArray(color, [1, 1, 1, 1])) {
903
+ materialDef.pbrMetallicRoughness.baseColorFactor = color;
773
904
  }
774
- if (material instanceof THREE.MeshStandardMaterial && material.isMeshStandardMaterial) {
905
+ if (material.isMeshStandardMaterial) {
775
906
  materialDef.pbrMetallicRoughness.metallicFactor = material.metalness;
776
907
  materialDef.pbrMetallicRoughness.roughnessFactor = material.roughness;
777
908
  } else {
778
909
  materialDef.pbrMetallicRoughness.metallicFactor = 0.5;
779
910
  materialDef.pbrMetallicRoughness.roughnessFactor = 0.5;
780
911
  }
781
- if (material instanceof THREE.MeshStandardMaterial && material.metalnessMap || material instanceof THREE.MeshStandardMaterial && material.roughnessMap) {
782
- if (material.metalnessMap === material.roughnessMap && material.metalnessMap !== null) {
783
- const metalRoughMapDef = { index: this.processTexture(material.metalnessMap) };
784
- this.applyTextureTransform(metalRoughMapDef, material.metalnessMap);
785
- materialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;
786
- } else {
787
- console.warn(
788
- "THREE.GLTFExporter: Ignoring metalnessMap and roughnessMap because they are not the same Texture."
789
- );
790
- }
912
+ if (material.metalnessMap || material.roughnessMap) {
913
+ const metalRoughTexture = this.buildMetalRoughTexture(material.metalnessMap, material.roughnessMap);
914
+ const metalRoughMapDef = {
915
+ index: this.processTexture(metalRoughTexture),
916
+ channel: metalRoughTexture.channel
917
+ };
918
+ this.applyTextureTransform(metalRoughMapDef, metalRoughTexture);
919
+ materialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;
791
920
  }
792
- if ((material instanceof THREE.MeshStandardMaterial || material instanceof THREE.MeshPhysicalMaterial) && material.map) {
793
- const baseColorMapDef = { index: this.processTexture(material.map) };
921
+ if (material.map) {
922
+ const baseColorMapDef = {
923
+ index: this.processTexture(material.map),
924
+ texCoord: material.map.channel
925
+ };
794
926
  this.applyTextureTransform(baseColorMapDef, material.map);
795
927
  materialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;
796
928
  }
797
- if ((material instanceof THREE.MeshStandardMaterial || material instanceof THREE.MeshPhysicalMaterial) && material.emissive) {
798
- const emissive = material.emissive.clone().multiplyScalar(material.emissiveIntensity);
929
+ if (material.emissive) {
930
+ const emissive = material.emissive;
799
931
  const maxEmissiveComponent = Math.max(emissive.r, emissive.g, emissive.b);
800
- if (maxEmissiveComponent > 1) {
801
- emissive.multiplyScalar(1 / maxEmissiveComponent);
802
- console.warn("THREE.GLTFExporter: Some emissive components exceed 1; emissive has been limited");
803
- }
804
932
  if (maxEmissiveComponent > 0) {
805
- materialDef.emissiveFactor = emissive.toArray();
933
+ materialDef.emissiveFactor = material.emissive.toArray();
806
934
  }
807
935
  if (material.emissiveMap) {
808
- const emissiveMapDef = { index: this.processTexture(material.emissiveMap) };
936
+ const emissiveMapDef = {
937
+ index: this.processTexture(material.emissiveMap),
938
+ texCoord: material.emissiveMap.channel
939
+ };
809
940
  this.applyTextureTransform(emissiveMapDef, material.emissiveMap);
810
941
  materialDef.emissiveTexture = emissiveMapDef;
811
942
  }
812
943
  }
813
- if ((material instanceof THREE.MeshMatcapMaterial || material instanceof THREE.MeshNormalMaterial || material instanceof THREE.MeshPhongMaterial || material instanceof THREE.MeshStandardMaterial || material instanceof THREE.MeshToonMaterial) && material.normalMap) {
814
- const normalMapDef = { index: this.processTexture(material.normalMap) };
944
+ if (material.normalMap) {
945
+ const normalMapDef = {
946
+ index: this.processTexture(material.normalMap),
947
+ texCoord: material.normalMap.channel
948
+ };
815
949
  if (material.normalScale && material.normalScale.x !== 1) {
816
950
  normalMapDef.scale = material.normalScale.x;
817
951
  }
818
952
  this.applyTextureTransform(normalMapDef, material.normalMap);
819
953
  materialDef.normalTexture = normalMapDef;
820
954
  }
821
- if ((material instanceof THREE.MeshBasicMaterial || material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial || material instanceof THREE.MeshStandardMaterial || material instanceof THREE.MeshToonMaterial) && material.aoMap) {
955
+ if (material.aoMap) {
822
956
  const occlusionMapDef = {
823
957
  index: this.processTexture(material.aoMap),
824
- texCoord: 1
958
+ texCoord: material.aoMap.channel
825
959
  };
826
960
  if (material.aoMapIntensity !== 1) {
827
961
  occlusionMapDef.strength = material.aoMapIntensity;
@@ -870,19 +1004,16 @@ class GLTFWriter {
870
1004
  return cache.meshes.get(meshCacheKey);
871
1005
  const geometry = mesh.geometry;
872
1006
  let mode;
873
- if (mesh instanceof THREE.LineSegments && mesh.isLineSegments) {
1007
+ if (mesh.isLineSegments) {
874
1008
  mode = WEBGL_CONSTANTS.LINES;
875
- } else if (mesh instanceof THREE.LineLoop && mesh.isLineLoop) {
1009
+ } else if (mesh.isLineLoop) {
876
1010
  mode = WEBGL_CONSTANTS.LINE_LOOP;
877
- } else if (mesh instanceof THREE.Line && mesh.isLine) {
1011
+ } else if (mesh.isLine) {
878
1012
  mode = WEBGL_CONSTANTS.LINE_STRIP;
879
- } else if (mesh instanceof THREE.Points && mesh.isPoints) {
1013
+ } else if (mesh.isPoints) {
880
1014
  mode = WEBGL_CONSTANTS.POINTS;
881
1015
  } else {
882
- mode = (mesh.material instanceof THREE.MeshBasicMaterial || mesh.material instanceof THREE.MeshDepthMaterial || mesh.material instanceof THREE.MeshLambertMaterial || mesh.material instanceof THREE.MeshNormalMaterial || mesh.material instanceof THREE.MeshPhongMaterial || mesh.material instanceof THREE.MeshStandardMaterial || mesh.material instanceof THREE.MeshToonMaterial || mesh.material instanceof THREE.ShaderMaterial) && mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES;
883
- }
884
- if (!geometry.isBufferGeometry) {
885
- throw new Error("THREE.GLTFExporter: Geometry is not of type THREE.BufferGeometry.");
1016
+ mode = mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES;
886
1017
  }
887
1018
  const meshDef = {};
888
1019
  const attributes = {};
@@ -890,19 +1021,19 @@ class GLTFWriter {
890
1021
  const targets = [];
891
1022
  const nameConversion = {
892
1023
  uv: "TEXCOORD_0",
893
- uv2: "TEXCOORD_1",
1024
+ [THREE.REVISION.replace(/\D+/g, "") >= 152 ? "uv1" : "uv2"]: "TEXCOORD_1",
894
1025
  color: "COLOR_0",
895
1026
  skinWeight: "WEIGHTS_0",
896
1027
  skinIndex: "JOINTS_0"
897
1028
  };
898
1029
  const originalNormal = geometry.getAttribute("normal");
899
- if (originalNormal !== void 0 && !(originalNormal instanceof THREE.InterleavedBufferAttribute) && !this.isNormalizedNormalAttribute(originalNormal)) {
1030
+ if (originalNormal !== void 0 && !this.isNormalizedNormalAttribute(originalNormal)) {
900
1031
  console.warn("THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.");
901
1032
  geometry.setAttribute("normal", this.createNormalizedNormalAttribute(originalNormal));
902
1033
  }
903
1034
  let modifiedAttribute = null;
904
1035
  for (let attributeName in geometry.attributes) {
905
- if (attributeName.substr(0, 5) === "morph")
1036
+ if (attributeName.slice(0, 5) === "morph")
906
1037
  continue;
907
1038
  const attribute = geometry.attributes[attributeName];
908
1039
  attributeName = nameConversion[attributeName] || attributeName.toUpperCase();
@@ -919,8 +1050,11 @@ class GLTFWriter {
919
1050
  console.warn('GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.');
920
1051
  modifiedAttribute = new THREE.BufferAttribute(new Uint16Array(array), attribute.itemSize, attribute.normalized);
921
1052
  }
922
- const accessor = modifiedAttribute !== null && this.processAccessor(modifiedAttribute || attribute, geometry);
923
- if (accessor) {
1053
+ const accessor = this.processAccessor(modifiedAttribute || attribute, geometry);
1054
+ if (accessor !== null) {
1055
+ if (!attributeName.startsWith("_")) {
1056
+ this.detectMeshQuantization(attributeName, attribute);
1057
+ }
924
1058
  attributes[attributeName] = accessor;
925
1059
  cache.attributes.set(this.getUID(attribute), accessor);
926
1060
  }
@@ -952,26 +1086,27 @@ class GLTFWriter {
952
1086
  const attribute = geometry.morphAttributes[attributeName][i];
953
1087
  const gltfAttributeName = attributeName.toUpperCase();
954
1088
  const baseAttribute = geometry.attributes[attributeName];
955
- if (cache.attributes.has(this.getUID(attribute))) {
956
- target[gltfAttributeName] = cache.attributes.get(this.getUID(attribute));
1089
+ if (cache.attributes.has(this.getUID(attribute, true))) {
1090
+ target[gltfAttributeName] = cache.attributes.get(this.getUID(attribute, true));
957
1091
  continue;
958
1092
  }
959
1093
  const relativeAttribute = attribute.clone();
960
1094
  if (!geometry.morphTargetsRelative) {
961
1095
  for (let j = 0, jl = attribute.count; j < jl; j++) {
962
- relativeAttribute.setXYZ(
963
- j,
964
- attribute.getX(j) - baseAttribute.getX(j),
965
- attribute.getY(j) - baseAttribute.getY(j),
966
- attribute.getZ(j) - baseAttribute.getZ(j)
967
- );
1096
+ for (let a = 0; a < attribute.itemSize; a++) {
1097
+ if (a === 0)
1098
+ relativeAttribute.setX(j, attribute.getX(j) - baseAttribute.getX(j));
1099
+ if (a === 1)
1100
+ relativeAttribute.setY(j, attribute.getY(j) - baseAttribute.getY(j));
1101
+ if (a === 2)
1102
+ relativeAttribute.setZ(j, attribute.getZ(j) - baseAttribute.getZ(j));
1103
+ if (a === 3)
1104
+ relativeAttribute.setW(j, attribute.getW(j) - baseAttribute.getW(j));
1105
+ }
968
1106
  }
969
1107
  }
970
- const accessor = this.processAccessor(relativeAttribute, geometry);
971
- if (accessor != void 0) {
972
- target[gltfAttributeName] = accessor;
973
- }
974
- cache.attributes.set(this.getUID(baseAttribute), target[gltfAttributeName]);
1108
+ target[gltfAttributeName] = this.processAccessor(relativeAttribute, geometry);
1109
+ cache.attributes.set(this.getUID(baseAttribute, true), target[gltfAttributeName]);
975
1110
  }
976
1111
  targets.push(target);
977
1112
  weights.push(mesh.morphTargetInfluences[i]);
@@ -994,15 +1129,13 @@ class GLTFWriter {
994
1129
  mode,
995
1130
  attributes
996
1131
  };
997
- if (geometry instanceof THREE.Object3D || geometry instanceof THREE.Material) {
998
- this.serializeUserData(geometry, primitive);
999
- }
1132
+ this.serializeUserData(geometry, primitive);
1000
1133
  if (targets.length > 0)
1001
1134
  primitive.targets = targets;
1002
1135
  if (geometry.index !== null) {
1003
1136
  let cacheKey = this.getUID(geometry.index);
1004
1137
  if (groups[i].start !== void 0 || groups[i].count !== void 0) {
1005
- cacheKey += `:${groups[i].start}:${groups[i].count}`;
1138
+ cacheKey += ":" + groups[i].start + ":" + groups[i].count;
1006
1139
  }
1007
1140
  if (cache.attributes.has(cacheKey)) {
1008
1141
  primitive.indices = cache.attributes.get(cacheKey);
@@ -1013,16 +1146,10 @@ class GLTFWriter {
1013
1146
  if (primitive.indices === null)
1014
1147
  delete primitive.indices;
1015
1148
  }
1016
- const materialIndex = groups[i].materialIndex;
1017
- if (materialIndex !== void 0 && Array.isArray(materials)) {
1018
- const targetMaterials = materials[materialIndex];
1019
- if (!Array.isArray(targetMaterials)) {
1020
- const material = this.processMaterial(targetMaterials);
1021
- if (material !== null)
1022
- primitive.material = material;
1023
- primitives.push(primitive);
1024
- }
1025
- }
1149
+ const material = this.processMaterial(materials[groups[i].materialIndex]);
1150
+ if (material !== null)
1151
+ primitive.material = material;
1152
+ primitives.push(primitive);
1026
1153
  }
1027
1154
  meshDef.primitives = primitives;
1028
1155
  if (!json.meshes)
@@ -1034,6 +1161,45 @@ class GLTFWriter {
1034
1161
  cache.meshes.set(meshCacheKey, index);
1035
1162
  return index;
1036
1163
  }
1164
+ /**
1165
+ * If a vertex attribute with a
1166
+ * [non-standard data type](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview)
1167
+ * is used, it is checked whether it is a valid data type according to the
1168
+ * [KHR_mesh_quantization](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md)
1169
+ * extension.
1170
+ * In this case the extension is automatically added to the list of used extensions.
1171
+ *
1172
+ * @param {string} attributeName
1173
+ * @param {THREE.BufferAttribute} attribute
1174
+ */
1175
+ detectMeshQuantization(attributeName, attribute) {
1176
+ if (this.extensionsUsed[KHR_MESH_QUANTIZATION])
1177
+ return;
1178
+ let attrType = void 0;
1179
+ switch (attribute.array.constructor) {
1180
+ case Int8Array:
1181
+ attrType = "byte";
1182
+ break;
1183
+ case Uint8Array:
1184
+ attrType = "unsigned byte";
1185
+ break;
1186
+ case Int16Array:
1187
+ attrType = "short";
1188
+ break;
1189
+ case Uint16Array:
1190
+ attrType = "unsigned short";
1191
+ break;
1192
+ default:
1193
+ return;
1194
+ }
1195
+ if (attribute.normalized)
1196
+ attrType += " normalized";
1197
+ const attrNamePrefix = attributeName.split("_", 1)[0];
1198
+ if (KHR_mesh_quantization_ExtraAttrTypes[attrNamePrefix] && KHR_mesh_quantization_ExtraAttrTypes[attrNamePrefix].includes(attrType)) {
1199
+ this.extensionsUsed[KHR_MESH_QUANTIZATION] = true;
1200
+ this.extensionsRequired[KHR_MESH_QUANTIZATION] = true;
1201
+ }
1202
+ }
1037
1203
  /**
1038
1204
  * Process camera
1039
1205
  * @param {THREE.Camera} camera Camera to process
@@ -1043,18 +1209,18 @@ class GLTFWriter {
1043
1209
  const json = this.json;
1044
1210
  if (!json.cameras)
1045
1211
  json.cameras = [];
1046
- const isOrtho = camera instanceof THREE.OrthographicCamera && camera.isOrthographicCamera;
1212
+ const isOrtho = camera.isOrthographicCamera;
1047
1213
  const cameraDef = {
1048
1214
  type: isOrtho ? "orthographic" : "perspective"
1049
1215
  };
1050
- if (camera instanceof THREE.OrthographicCamera && isOrtho) {
1216
+ if (isOrtho) {
1051
1217
  cameraDef.orthographic = {
1052
1218
  xmag: camera.right * 2,
1053
1219
  ymag: camera.top * 2,
1054
1220
  zfar: camera.far <= 0 ? 1e-3 : camera.far,
1055
1221
  znear: camera.near < 0 ? 0 : camera.near
1056
1222
  };
1057
- } else if (camera instanceof THREE.PerspectiveCamera) {
1223
+ } else {
1058
1224
  cameraDef.perspective = {
1059
1225
  aspectRatio: camera.aspect,
1060
1226
  yfov: THREE.MathUtils.degToRad(camera.fov),
@@ -1091,7 +1257,7 @@ class GLTFWriter {
1091
1257
  let trackNode = THREE.PropertyBinding.findNode(root, trackBinding.nodeName);
1092
1258
  const trackProperty = PATH_PROPERTIES[trackBinding.propertyName];
1093
1259
  if (trackBinding.objectName === "bones") {
1094
- if (trackNode.isSkinnedMesh) {
1260
+ if (trackNode.isSkinnedMesh === true) {
1095
1261
  trackNode = trackNode.skeleton.getBoneByName(trackBinding.objectIndex);
1096
1262
  } else {
1097
1263
  trackNode = void 0;
@@ -1107,7 +1273,7 @@ class GLTFWriter {
1107
1273
  outputItemSize /= trackNode.morphTargetInfluences.length;
1108
1274
  }
1109
1275
  let interpolation;
1110
- if (track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline) {
1276
+ if (track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true) {
1111
1277
  interpolation = "CUBICSPLINE";
1112
1278
  outputItemSize /= 3;
1113
1279
  } else if (track.getInterpolation() === THREE.InterpolateDiscrete) {
@@ -1142,34 +1308,30 @@ class GLTFWriter {
1142
1308
  processSkin(object) {
1143
1309
  const json = this.json;
1144
1310
  const nodeMap = this.nodeMap;
1145
- if (json.nodes !== void 0 && object instanceof THREE.SkinnedMesh) {
1146
- const node = json.nodes[nodeMap.get(object)];
1147
- const skeleton = object.skeleton;
1148
- if (skeleton === void 0)
1149
- return null;
1150
- const rootJoint = object.skeleton.bones[0];
1151
- if (rootJoint === void 0)
1152
- return null;
1153
- const joints = [];
1154
- const inverseBindMatrices = new Float32Array(skeleton.bones.length * 16);
1155
- const temporaryBoneInverse = new THREE.Matrix4();
1156
- for (let i = 0; i < skeleton.bones.length; ++i) {
1157
- joints.push(nodeMap.get(skeleton.bones[i]));
1158
- temporaryBoneInverse.copy(skeleton.boneInverses[i]);
1159
- temporaryBoneInverse.multiply(object.bindMatrix).toArray(inverseBindMatrices, i * 16);
1160
- }
1161
- if (json.skins === void 0)
1162
- json.skins = [];
1163
- json.skins.push({
1164
- inverseBindMatrices: this.processAccessor(new THREE.BufferAttribute(inverseBindMatrices, 16)),
1165
- joints,
1166
- skeleton: nodeMap.get(rootJoint)
1167
- });
1168
- const skinIndex = node.skin = json.skins.length - 1;
1169
- return skinIndex;
1170
- } else {
1311
+ const node = json.nodes[nodeMap.get(object)];
1312
+ const skeleton = object.skeleton;
1313
+ if (skeleton === void 0)
1171
1314
  return null;
1172
- }
1315
+ const rootJoint = object.skeleton.bones[0];
1316
+ if (rootJoint === void 0)
1317
+ return null;
1318
+ const joints = [];
1319
+ const inverseBindMatrices = new Float32Array(skeleton.bones.length * 16);
1320
+ const temporaryBoneInverse = new THREE.Matrix4();
1321
+ for (let i = 0; i < skeleton.bones.length; ++i) {
1322
+ joints.push(nodeMap.get(skeleton.bones[i]));
1323
+ temporaryBoneInverse.copy(skeleton.boneInverses[i]);
1324
+ temporaryBoneInverse.multiply(object.bindMatrix).toArray(inverseBindMatrices, i * 16);
1325
+ }
1326
+ if (json.skins === void 0)
1327
+ json.skins = [];
1328
+ json.skins.push({
1329
+ inverseBindMatrices: this.processAccessor(new THREE.BufferAttribute(inverseBindMatrices, 16)),
1330
+ joints,
1331
+ skeleton: nodeMap.get(rootJoint)
1332
+ });
1333
+ const skinIndex = node.skin = json.skins.length - 1;
1334
+ return skinIndex;
1173
1335
  }
1174
1336
  /**
1175
1337
  * Process Object3D node
@@ -1187,40 +1349,40 @@ class GLTFWriter {
1187
1349
  const rotation = object.quaternion.toArray();
1188
1350
  const position = object.position.toArray();
1189
1351
  const scale = object.scale.toArray();
1190
- if (!this.equalArray(rotation, [0, 0, 0, 1])) {
1352
+ if (!equalArray(rotation, [0, 0, 0, 1])) {
1191
1353
  nodeDef.rotation = rotation;
1192
1354
  }
1193
- if (!this.equalArray(position, [0, 0, 0])) {
1355
+ if (!equalArray(position, [0, 0, 0])) {
1194
1356
  nodeDef.translation = position;
1195
1357
  }
1196
- if (!this.equalArray(scale, [1, 1, 1])) {
1358
+ if (!equalArray(scale, [1, 1, 1])) {
1197
1359
  nodeDef.scale = scale;
1198
1360
  }
1199
1361
  } else {
1200
1362
  if (object.matrixAutoUpdate) {
1201
1363
  object.updateMatrix();
1202
1364
  }
1203
- if (!this.isIdentityMatrix(object.matrix)) {
1365
+ if (isIdentityMatrix(object.matrix) === false) {
1204
1366
  nodeDef.matrix = object.matrix.elements;
1205
1367
  }
1206
1368
  }
1207
1369
  if (object.name !== "")
1208
1370
  nodeDef.name = String(object.name);
1209
1371
  this.serializeUserData(object, nodeDef);
1210
- if ((object instanceof THREE.Mesh && object.isMesh || object instanceof THREE.Line && object.isLine || object instanceof THREE.Points && object.isPoints) && object instanceof THREE.Mesh) {
1372
+ if (object.isMesh || object.isLine || object.isPoints) {
1211
1373
  const meshIndex = this.processMesh(object);
1212
1374
  if (meshIndex !== null)
1213
1375
  nodeDef.mesh = meshIndex;
1214
- } else if (object instanceof THREE.Camera && object.isCamera) {
1376
+ } else if (object.isCamera) {
1215
1377
  nodeDef.camera = this.processCamera(object);
1216
1378
  }
1217
- if (object instanceof THREE.SkinnedMesh && object.isSkinnedMesh)
1379
+ if (object.isSkinnedMesh)
1218
1380
  this.skins.push(object);
1219
1381
  if (object.children.length > 0) {
1220
1382
  const children = [];
1221
1383
  for (let i = 0, l = object.children.length; i < l; i++) {
1222
1384
  const child = object.children[i];
1223
- if (child.visible || !options.onlyVisible) {
1385
+ if (child.visible || options.onlyVisible === false) {
1224
1386
  const nodeIndex2 = this.processNode(child);
1225
1387
  if (nodeIndex2 !== null)
1226
1388
  children.push(nodeIndex2);
@@ -1254,7 +1416,7 @@ class GLTFWriter {
1254
1416
  const nodes = [];
1255
1417
  for (let i = 0, l = scene.children.length; i < l; i++) {
1256
1418
  const child = scene.children[i];
1257
- if (child.visible || !options.onlyVisible) {
1419
+ if (child.visible || options.onlyVisible === false) {
1258
1420
  const nodeIndex = this.processNode(child);
1259
1421
  if (nodeIndex !== null)
1260
1422
  nodes.push(nodeIndex);
@@ -1264,6 +1426,10 @@ class GLTFWriter {
1264
1426
  sceneDef.nodes = nodes;
1265
1427
  this.serializeUserData(scene, sceneDef);
1266
1428
  }
1429
+ /**
1430
+ * Creates a Scene to hold a list of objects and parse it
1431
+ * @param {Array} objects List of objects to process
1432
+ */
1267
1433
  processObjects(objects) {
1268
1434
  const scene = new THREE.Scene();
1269
1435
  scene.name = "AuxScene";
@@ -1283,9 +1449,8 @@ class GLTFWriter {
1283
1449
  });
1284
1450
  const objectsWithoutScene = [];
1285
1451
  for (let i = 0; i < input.length; i++) {
1286
- const inputScene = input[i];
1287
- if (inputScene instanceof THREE.Scene) {
1288
- this.processScene(inputScene);
1452
+ if (input[i] instanceof THREE.Scene) {
1453
+ this.processScene(input[i]);
1289
1454
  } else {
1290
1455
  objectsWithoutScene.push(input[i]);
1291
1456
  }
@@ -1295,7 +1460,7 @@ class GLTFWriter {
1295
1460
  for (let i = 0; i < this.skins.length; ++i) {
1296
1461
  this.processSkin(this.skins[i]);
1297
1462
  }
1298
- for (let i = 0; options.animations !== void 0 && i < options.animations.length; ++i) {
1463
+ for (let i = 0; i < options.animations.length; ++i) {
1299
1464
  this.processAnimation(options.animations[i], input[0]);
1300
1465
  }
1301
1466
  this._invokeAll(function(ext) {
@@ -1307,108 +1472,16 @@ class GLTFWriter {
1307
1472
  func(this.plugins[i]);
1308
1473
  }
1309
1474
  }
1310
- //------------------------------------------------------------------------------
1311
- // Utility functions
1312
- //------------------------------------------------------------------------------
1313
- /**
1314
- * Compare two arrays
1315
- * @param {Array} array1 Array 1 to compare
1316
- * @param {Array} array2 Array 2 to compare
1317
- * @return {Boolean} Returns true if both arrays are equal
1318
- */
1319
- equalArray(array1, array2) {
1320
- return array1.length === array2.length && array1.every(function(element, index) {
1321
- return element === array2[index];
1322
- });
1323
- }
1324
- /**
1325
- * Converts a string to an ArrayBuffer.
1326
- * @param {string} text
1327
- * @return {ArrayBuffer}
1328
- */
1329
- stringToArrayBuffer(text) {
1330
- if (window.TextEncoder !== void 0) {
1331
- return new TextEncoder().encode(text).buffer;
1332
- }
1333
- const array = new Uint8Array(new ArrayBuffer(text.length));
1334
- for (let i = 0, il = text.length; i < il; i++) {
1335
- const value = text.charCodeAt(i);
1336
- array[i] = value > 255 ? 32 : value;
1337
- }
1338
- return array.buffer;
1339
- }
1340
- isIdentityMatrix(matrix) {
1341
- return this.equalArray(matrix.elements, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
1342
- }
1343
- getMinMax(attribute, start, count) {
1344
- const output = {
1345
- min: new Array(attribute.itemSize).fill(Number.POSITIVE_INFINITY),
1346
- max: new Array(attribute.itemSize).fill(Number.NEGATIVE_INFINITY)
1347
- };
1348
- for (let i = start; i < start + count; i++) {
1349
- for (let a = 0; a < attribute.itemSize; a++) {
1350
- let value;
1351
- if (attribute.itemSize > 4) {
1352
- value = attribute.array[i * attribute.itemSize + a];
1353
- } else {
1354
- if (a === 0)
1355
- value = attribute.getX(i);
1356
- else if (a === 1)
1357
- value = attribute.getY(i);
1358
- else if (a === 2)
1359
- value = attribute.getZ(i);
1360
- else if (a === 3)
1361
- value = attribute.getW(i);
1362
- }
1363
- if (value !== void 0) {
1364
- output.min[a] = Math.min(output.min[a], value);
1365
- output.max[a] = Math.max(output.max[a], value);
1366
- }
1367
- }
1368
- }
1369
- return output;
1370
- }
1371
- /**
1372
- * Get the required size + padding for a buffer, rounded to the next 4-byte boundary.
1373
- * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment
1374
- */
1375
- getPaddedBufferSize(bufferSize) {
1376
- return Math.ceil(bufferSize / 4) * 4;
1377
- }
1378
- /**
1379
- * Returns a buffer aligned to 4-byte boundary.
1380
- *
1381
- * @param {ArrayBuffer} arrayBuffer Buffer to pad
1382
- * @param {Integer} paddingByte (Optional)
1383
- * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer
1384
- */
1385
- getPaddedArrayBuffer(arrayBuffer, paddingByte = 0) {
1386
- const paddedLength = this.getPaddedBufferSize(arrayBuffer.byteLength);
1387
- if (paddedLength !== arrayBuffer.byteLength) {
1388
- const array = new Uint8Array(paddedLength);
1389
- array.set(new Uint8Array(arrayBuffer));
1390
- if (paddingByte !== 0) {
1391
- for (let i = arrayBuffer.byteLength; i < paddedLength; i++) {
1392
- array[i] = paddingByte;
1393
- }
1394
- }
1395
- return array.buffer;
1396
- }
1397
- return arrayBuffer;
1398
- }
1399
1475
  }
1400
1476
  class GLTFLightExtension {
1401
1477
  constructor(writer) {
1402
- __publicField(this, "writer");
1403
- __publicField(this, "name");
1404
1478
  this.writer = writer;
1405
1479
  this.name = "KHR_lights_punctual";
1406
1480
  }
1407
1481
  writeNode(light, nodeDef) {
1408
1482
  if (!light.isLight)
1409
1483
  return;
1410
- if (!(light instanceof THREE.DirectionalLight && light.isDirectionalLight) && // @ts-expect-error
1411
- !(light instanceof THREE.PointLight && light.isPointLight) && !(light instanceof THREE.SpotLight && light.isSpotLight)) {
1484
+ if (!light.isDirectionalLight && !light.isPointLight && !light.isSpotLight) {
1412
1485
  console.warn("THREE.GLTFExporter: Only directional, point, and spot lights are supported.", light);
1413
1486
  return;
1414
1487
  }
@@ -1420,14 +1493,13 @@ class GLTFLightExtension {
1420
1493
  lightDef.name = light.name;
1421
1494
  lightDef.color = light.color.toArray();
1422
1495
  lightDef.intensity = light.intensity;
1423
- if (light instanceof THREE.DirectionalLight && light.isDirectionalLight) {
1496
+ if (light.isDirectionalLight) {
1424
1497
  lightDef.type = "directional";
1425
- } else if (light instanceof THREE.PointLight && // @ts-expect-error
1426
- light.isPointLight) {
1498
+ } else if (light.isPointLight) {
1427
1499
  lightDef.type = "point";
1428
1500
  if (light.distance > 0)
1429
1501
  lightDef.range = light.distance;
1430
- } else if (light instanceof THREE.SpotLight && light.isSpotLight) {
1502
+ } else if (light.isSpotLight) {
1431
1503
  lightDef.type = "spot";
1432
1504
  if (light.distance > 0)
1433
1505
  lightDef.range = light.distance;
@@ -1435,12 +1507,12 @@ class GLTFLightExtension {
1435
1507
  lightDef.spot.innerConeAngle = (light.penumbra - 1) * light.angle * -1;
1436
1508
  lightDef.spot.outerConeAngle = light.angle;
1437
1509
  }
1438
- if (!(light instanceof THREE.DirectionalLight) && light.decay !== void 0 && light.decay !== 2) {
1510
+ if (light.decay !== void 0 && light.decay !== 2) {
1439
1511
  console.warn(
1440
1512
  "THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, and expects light.decay=2."
1441
1513
  );
1442
1514
  }
1443
- if (!(light instanceof THREE.PointLight) && light.target && (light.target.parent !== light || light.target.position.x !== 0 || light.target.position.y !== 0 || light.target.position.z !== -1)) {
1515
+ if (light.target && (light.target.parent !== light || light.target.position.x !== 0 || light.target.position.y !== 0 || light.target.position.z !== -1)) {
1444
1516
  console.warn(
1445
1517
  "THREE.GLTFExporter: Light direction may be lost. For best results, make light.target a child of the light with position 0,0,-1."
1446
1518
  );
@@ -1450,26 +1522,20 @@ class GLTFLightExtension {
1450
1522
  json.extensions[this.name] = { lights: [] };
1451
1523
  extensionsUsed[this.name] = true;
1452
1524
  }
1453
- if (json.extensions !== void 0) {
1454
- const lights = json.extensions[this.name].lights;
1455
- lights.push(lightDef);
1456
- nodeDef.extensions = nodeDef.extensions || {};
1457
- nodeDef.extensions[this.name] = { light: lights.length - 1 };
1458
- }
1525
+ const lights = json.extensions[this.name].lights;
1526
+ lights.push(lightDef);
1527
+ nodeDef.extensions = nodeDef.extensions || {};
1528
+ nodeDef.extensions[this.name] = { light: lights.length - 1 };
1459
1529
  }
1460
1530
  }
1461
1531
  class GLTFMaterialsUnlitExtension {
1462
1532
  constructor(writer) {
1463
- __publicField(this, "writer");
1464
- __publicField(this, "name");
1465
1533
  this.writer = writer;
1466
1534
  this.name = "KHR_materials_unlit";
1467
1535
  }
1468
1536
  writeMaterial(material, materialDef) {
1469
- if (!(material instanceof THREE.MeshBasicMaterial && // @ts-expect-error
1470
- material.isMeshBasicMaterial)) {
1537
+ if (!material.isMeshBasicMaterial)
1471
1538
  return;
1472
- }
1473
1539
  const writer = this.writer;
1474
1540
  const extensionsUsed = writer.extensionsUsed;
1475
1541
  materialDef.extensions = materialDef.extensions || {};
@@ -1479,36 +1545,78 @@ class GLTFMaterialsUnlitExtension {
1479
1545
  materialDef.pbrMetallicRoughness.roughnessFactor = 0.9;
1480
1546
  }
1481
1547
  }
1482
- class GLTFMaterialsPBRSpecularGlossiness {
1548
+ class GLTFMaterialsClearcoatExtension {
1483
1549
  constructor(writer) {
1484
- __publicField(this, "writer");
1485
- __publicField(this, "name");
1486
1550
  this.writer = writer;
1487
- this.name = "KHR_materials_pbrSpecularGlossiness";
1551
+ this.name = "KHR_materials_clearcoat";
1488
1552
  }
1489
1553
  writeMaterial(material, materialDef) {
1490
- if (!material.isGLTFSpecularGlossinessMaterial)
1554
+ if (!material.isMeshPhysicalMaterial || material.clearcoat === 0)
1491
1555
  return;
1492
1556
  const writer = this.writer;
1493
1557
  const extensionsUsed = writer.extensionsUsed;
1494
1558
  const extensionDef = {};
1495
- if (materialDef.pbrMetallicRoughness.baseColorFactor) {
1496
- extensionDef.diffuseFactor = materialDef.pbrMetallicRoughness.baseColorFactor;
1497
- }
1498
- if (material instanceof THREE.MeshPhongMaterial) {
1499
- const specularFactor = [1, 1, 1];
1500
- material.specular.toArray(specularFactor, 0);
1501
- extensionDef.specularFactor = specularFactor;
1502
- extensionDef.glossinessFactor = // @ts-expect-error
1503
- material.glossiness;
1559
+ extensionDef.clearcoatFactor = material.clearcoat;
1560
+ if (material.clearcoatMap) {
1561
+ const clearcoatMapDef = {
1562
+ index: writer.processTexture(material.clearcoatMap),
1563
+ texCoord: material.clearcoatMap.channel
1564
+ };
1565
+ writer.applyTextureTransform(clearcoatMapDef, material.clearcoatMap);
1566
+ extensionDef.clearcoatTexture = clearcoatMapDef;
1567
+ }
1568
+ extensionDef.clearcoatRoughnessFactor = material.clearcoatRoughness;
1569
+ if (material.clearcoatRoughnessMap) {
1570
+ const clearcoatRoughnessMapDef = {
1571
+ index: writer.processTexture(material.clearcoatRoughnessMap),
1572
+ texCoord: material.clearcoatRoughnessMap.channel
1573
+ };
1574
+ writer.applyTextureTransform(clearcoatRoughnessMapDef, material.clearcoatRoughnessMap);
1575
+ extensionDef.clearcoatRoughnessTexture = clearcoatRoughnessMapDef;
1504
1576
  }
1505
- if (materialDef.pbrMetallicRoughness.baseColorTexture) {
1506
- extensionDef.diffuseTexture = materialDef.pbrMetallicRoughness.baseColorTexture;
1577
+ if (material.clearcoatNormalMap) {
1578
+ const clearcoatNormalMapDef = {
1579
+ index: writer.processTexture(material.clearcoatNormalMap),
1580
+ texCoord: material.clearcoatNormalMap.channel
1581
+ };
1582
+ writer.applyTextureTransform(clearcoatNormalMapDef, material.clearcoatNormalMap);
1583
+ extensionDef.clearcoatNormalTexture = clearcoatNormalMapDef;
1507
1584
  }
1508
- if ((material instanceof THREE.MeshBasicMaterial || material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial) && material.specularMap) {
1509
- const specularMapDef = { index: writer.processTexture(material.specularMap) };
1510
- writer.applyTextureTransform(specularMapDef, material.specularMap);
1511
- extensionDef.specularGlossinessTexture = specularMapDef;
1585
+ materialDef.extensions = materialDef.extensions || {};
1586
+ materialDef.extensions[this.name] = extensionDef;
1587
+ extensionsUsed[this.name] = true;
1588
+ }
1589
+ }
1590
+ class GLTFMaterialsIridescenceExtension {
1591
+ constructor(writer) {
1592
+ this.writer = writer;
1593
+ this.name = "KHR_materials_iridescence";
1594
+ }
1595
+ writeMaterial(material, materialDef) {
1596
+ if (!material.isMeshPhysicalMaterial || material.iridescence === 0)
1597
+ return;
1598
+ const writer = this.writer;
1599
+ const extensionsUsed = writer.extensionsUsed;
1600
+ const extensionDef = {};
1601
+ extensionDef.iridescenceFactor = material.iridescence;
1602
+ if (material.iridescenceMap) {
1603
+ const iridescenceMapDef = {
1604
+ index: writer.processTexture(material.iridescenceMap),
1605
+ texCoord: material.iridescenceMap.channel
1606
+ };
1607
+ writer.applyTextureTransform(iridescenceMapDef, material.iridescenceMap);
1608
+ extensionDef.iridescenceTexture = iridescenceMapDef;
1609
+ }
1610
+ extensionDef.iridescenceIor = material.iridescenceIOR;
1611
+ extensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessRange[0];
1612
+ extensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessRange[1];
1613
+ if (material.iridescenceThicknessMap) {
1614
+ const iridescenceThicknessMapDef = {
1615
+ index: writer.processTexture(material.iridescenceThicknessMap),
1616
+ texCoord: material.iridescenceThicknessMap.channel
1617
+ };
1618
+ writer.applyTextureTransform(iridescenceThicknessMapDef, material.iridescenceThicknessMap);
1619
+ extensionDef.iridescenceThicknessTexture = iridescenceThicknessMapDef;
1512
1620
  }
1513
1621
  materialDef.extensions = materialDef.extensions || {};
1514
1622
  materialDef.extensions[this.name] = extensionDef;
@@ -1517,22 +1625,21 @@ class GLTFMaterialsPBRSpecularGlossiness {
1517
1625
  }
1518
1626
  class GLTFMaterialsTransmissionExtension {
1519
1627
  constructor(writer) {
1520
- __publicField(this, "writer");
1521
- __publicField(this, "name");
1522
1628
  this.writer = writer;
1523
1629
  this.name = "KHR_materials_transmission";
1524
1630
  }
1525
1631
  writeMaterial(material, materialDef) {
1526
- if (!(material instanceof THREE.MeshPhysicalMaterial && // @ts-expect-error
1527
- material.isMeshPhysicalMaterial) || material.transmission === 0) {
1632
+ if (!material.isMeshPhysicalMaterial || material.transmission === 0)
1528
1633
  return;
1529
- }
1530
1634
  const writer = this.writer;
1531
1635
  const extensionsUsed = writer.extensionsUsed;
1532
1636
  const extensionDef = {};
1533
1637
  extensionDef.transmissionFactor = material.transmission;
1534
1638
  if (material.transmissionMap) {
1535
- const transmissionMapDef = { index: writer.processTexture(material.transmissionMap) };
1639
+ const transmissionMapDef = {
1640
+ index: writer.processTexture(material.transmissionMap),
1641
+ texCoord: material.transmissionMap.channel
1642
+ };
1536
1643
  writer.applyTextureTransform(transmissionMapDef, material.transmissionMap);
1537
1644
  extensionDef.transmissionTexture = transmissionMapDef;
1538
1645
  }
@@ -1543,33 +1650,257 @@ class GLTFMaterialsTransmissionExtension {
1543
1650
  }
1544
1651
  class GLTFMaterialsVolumeExtension {
1545
1652
  constructor(writer) {
1546
- __publicField(this, "writer");
1547
- __publicField(this, "name");
1548
1653
  this.writer = writer;
1549
1654
  this.name = "KHR_materials_volume";
1550
1655
  }
1551
1656
  writeMaterial(material, materialDef) {
1552
- if (!(material instanceof THREE.MeshPhysicalMaterial && // @ts-expect-error
1553
- material.isMeshPhysicalMaterial) || material.thickness === 0) {
1657
+ if (!material.isMeshPhysicalMaterial || material.transmission === 0)
1554
1658
  return;
1555
- }
1556
1659
  const writer = this.writer;
1557
1660
  const extensionsUsed = writer.extensionsUsed;
1558
1661
  const extensionDef = {};
1559
- extensionDef.thickness = material.thickness;
1662
+ extensionDef.thicknessFactor = material.thickness;
1560
1663
  if (material.thicknessMap) {
1561
1664
  const thicknessMapDef = {
1562
- index: writer.processTexture(material.thicknessMap)
1665
+ index: writer.processTexture(material.thicknessMap),
1666
+ texCoord: material.thicknessMap.channel
1563
1667
  };
1564
1668
  writer.applyTextureTransform(thicknessMapDef, material.thicknessMap);
1565
1669
  extensionDef.thicknessTexture = thicknessMapDef;
1566
1670
  }
1567
1671
  extensionDef.attenuationDistance = material.attenuationDistance;
1568
- extensionDef.attenuationColor = //@ts-expect-error
1569
- material.attenuationTint.toArray();
1672
+ extensionDef.attenuationColor = material.attenuationColor.toArray();
1570
1673
  materialDef.extensions = materialDef.extensions || {};
1571
1674
  materialDef.extensions[this.name] = extensionDef;
1572
1675
  extensionsUsed[this.name] = true;
1573
1676
  }
1574
1677
  }
1678
+ class GLTFMaterialsIorExtension {
1679
+ constructor(writer) {
1680
+ this.writer = writer;
1681
+ this.name = "KHR_materials_ior";
1682
+ }
1683
+ writeMaterial(material, materialDef) {
1684
+ if (!material.isMeshPhysicalMaterial || material.ior === 1.5)
1685
+ return;
1686
+ const writer = this.writer;
1687
+ const extensionsUsed = writer.extensionsUsed;
1688
+ const extensionDef = {};
1689
+ extensionDef.ior = material.ior;
1690
+ materialDef.extensions = materialDef.extensions || {};
1691
+ materialDef.extensions[this.name] = extensionDef;
1692
+ extensionsUsed[this.name] = true;
1693
+ }
1694
+ }
1695
+ class GLTFMaterialsSpecularExtension {
1696
+ constructor(writer) {
1697
+ this.writer = writer;
1698
+ this.name = "KHR_materials_specular";
1699
+ }
1700
+ writeMaterial(material, materialDef) {
1701
+ if (!material.isMeshPhysicalMaterial || material.specularIntensity === 1 && material.specularColor.equals(DEFAULT_SPECULAR_COLOR) && !material.specularIntensityMap && !material.specularColorTexture)
1702
+ return;
1703
+ const writer = this.writer;
1704
+ const extensionsUsed = writer.extensionsUsed;
1705
+ const extensionDef = {};
1706
+ if (material.specularIntensityMap) {
1707
+ const specularIntensityMapDef = {
1708
+ index: writer.processTexture(material.specularIntensityMap),
1709
+ texCoord: material.specularIntensityMap.channel
1710
+ };
1711
+ writer.applyTextureTransform(specularIntensityMapDef, material.specularIntensityMap);
1712
+ extensionDef.specularTexture = specularIntensityMapDef;
1713
+ }
1714
+ if (material.specularColorMap) {
1715
+ const specularColorMapDef = {
1716
+ index: writer.processTexture(material.specularColorMap),
1717
+ texCoord: material.specularColorMap.channel
1718
+ };
1719
+ writer.applyTextureTransform(specularColorMapDef, material.specularColorMap);
1720
+ extensionDef.specularColorTexture = specularColorMapDef;
1721
+ }
1722
+ extensionDef.specularFactor = material.specularIntensity;
1723
+ extensionDef.specularColorFactor = material.specularColor.toArray();
1724
+ materialDef.extensions = materialDef.extensions || {};
1725
+ materialDef.extensions[this.name] = extensionDef;
1726
+ extensionsUsed[this.name] = true;
1727
+ }
1728
+ }
1729
+ class GLTFMaterialsSheenExtension {
1730
+ constructor(writer) {
1731
+ this.writer = writer;
1732
+ this.name = "KHR_materials_sheen";
1733
+ }
1734
+ writeMaterial(material, materialDef) {
1735
+ if (!material.isMeshPhysicalMaterial || material.sheen == 0)
1736
+ return;
1737
+ const writer = this.writer;
1738
+ const extensionsUsed = writer.extensionsUsed;
1739
+ const extensionDef = {};
1740
+ if (material.sheenRoughnessMap) {
1741
+ const sheenRoughnessMapDef = {
1742
+ index: writer.processTexture(material.sheenRoughnessMap),
1743
+ texCoord: material.sheenRoughnessMap.channel
1744
+ };
1745
+ writer.applyTextureTransform(sheenRoughnessMapDef, material.sheenRoughnessMap);
1746
+ extensionDef.sheenRoughnessTexture = sheenRoughnessMapDef;
1747
+ }
1748
+ if (material.sheenColorMap) {
1749
+ const sheenColorMapDef = {
1750
+ index: writer.processTexture(material.sheenColorMap),
1751
+ texCoord: material.sheenColorMap.channel
1752
+ };
1753
+ writer.applyTextureTransform(sheenColorMapDef, material.sheenColorMap);
1754
+ extensionDef.sheenColorTexture = sheenColorMapDef;
1755
+ }
1756
+ extensionDef.sheenRoughnessFactor = material.sheenRoughness;
1757
+ extensionDef.sheenColorFactor = material.sheenColor.toArray();
1758
+ materialDef.extensions = materialDef.extensions || {};
1759
+ materialDef.extensions[this.name] = extensionDef;
1760
+ extensionsUsed[this.name] = true;
1761
+ }
1762
+ }
1763
+ class GLTFMaterialsAnisotropyExtension {
1764
+ constructor(writer) {
1765
+ this.writer = writer;
1766
+ this.name = "KHR_materials_anisotropy";
1767
+ }
1768
+ writeMaterial(material, materialDef) {
1769
+ if (!material.isMeshPhysicalMaterial || material.anisotropy == 0)
1770
+ return;
1771
+ const writer = this.writer;
1772
+ const extensionsUsed = writer.extensionsUsed;
1773
+ const extensionDef = {};
1774
+ if (material.anisotropyMap) {
1775
+ const anisotropyMapDef = { index: writer.processTexture(material.anisotropyMap) };
1776
+ writer.applyTextureTransform(anisotropyMapDef, material.anisotropyMap);
1777
+ extensionDef.anisotropyTexture = anisotropyMapDef;
1778
+ }
1779
+ extensionDef.anisotropyStrength = material.anisotropy;
1780
+ extensionDef.anisotropyRotation = material.anisotropyRotation;
1781
+ materialDef.extensions = materialDef.extensions || {};
1782
+ materialDef.extensions[this.name] = extensionDef;
1783
+ extensionsUsed[this.name] = true;
1784
+ }
1785
+ }
1786
+ class GLTFMaterialsEmissiveStrengthExtension {
1787
+ constructor(writer) {
1788
+ this.writer = writer;
1789
+ this.name = "KHR_materials_emissive_strength";
1790
+ }
1791
+ writeMaterial(material, materialDef) {
1792
+ if (!material.isMeshStandardMaterial || material.emissiveIntensity === 1)
1793
+ return;
1794
+ const writer = this.writer;
1795
+ const extensionsUsed = writer.extensionsUsed;
1796
+ const extensionDef = {};
1797
+ extensionDef.emissiveStrength = material.emissiveIntensity;
1798
+ materialDef.extensions = materialDef.extensions || {};
1799
+ materialDef.extensions[this.name] = extensionDef;
1800
+ extensionsUsed[this.name] = true;
1801
+ }
1802
+ }
1803
+ GLTFExporter.Utils = {
1804
+ insertKeyframe: function(track, time) {
1805
+ const tolerance = 1e-3;
1806
+ const valueSize = track.getValueSize();
1807
+ const times = new track.TimeBufferType(track.times.length + 1);
1808
+ const values = new track.ValueBufferType(track.values.length + valueSize);
1809
+ const interpolant = track.createInterpolant(new track.ValueBufferType(valueSize));
1810
+ let index;
1811
+ if (track.times.length === 0) {
1812
+ times[0] = time;
1813
+ for (let i = 0; i < valueSize; i++) {
1814
+ values[i] = 0;
1815
+ }
1816
+ index = 0;
1817
+ } else if (time < track.times[0]) {
1818
+ if (Math.abs(track.times[0] - time) < tolerance)
1819
+ return 0;
1820
+ times[0] = time;
1821
+ times.set(track.times, 1);
1822
+ values.set(interpolant.evaluate(time), 0);
1823
+ values.set(track.values, valueSize);
1824
+ index = 0;
1825
+ } else if (time > track.times[track.times.length - 1]) {
1826
+ if (Math.abs(track.times[track.times.length - 1] - time) < tolerance) {
1827
+ return track.times.length - 1;
1828
+ }
1829
+ times[times.length - 1] = time;
1830
+ times.set(track.times, 0);
1831
+ values.set(track.values, 0);
1832
+ values.set(interpolant.evaluate(time), track.values.length);
1833
+ index = times.length - 1;
1834
+ } else {
1835
+ for (let i = 0; i < track.times.length; i++) {
1836
+ if (Math.abs(track.times[i] - time) < tolerance)
1837
+ return i;
1838
+ if (track.times[i] < time && track.times[i + 1] > time) {
1839
+ times.set(track.times.slice(0, i + 1), 0);
1840
+ times[i + 1] = time;
1841
+ times.set(track.times.slice(i + 1), i + 2);
1842
+ values.set(track.values.slice(0, (i + 1) * valueSize), 0);
1843
+ values.set(interpolant.evaluate(time), (i + 1) * valueSize);
1844
+ values.set(track.values.slice((i + 1) * valueSize), (i + 2) * valueSize);
1845
+ index = i + 1;
1846
+ break;
1847
+ }
1848
+ }
1849
+ }
1850
+ track.times = times;
1851
+ track.values = values;
1852
+ return index;
1853
+ },
1854
+ mergeMorphTargetTracks: function(clip, root) {
1855
+ const tracks = [];
1856
+ const mergedTracks = {};
1857
+ const sourceTracks = clip.tracks;
1858
+ for (let i = 0; i < sourceTracks.length; ++i) {
1859
+ let sourceTrack = sourceTracks[i];
1860
+ const sourceTrackBinding = THREE.PropertyBinding.parseTrackName(sourceTrack.name);
1861
+ const sourceTrackNode = THREE.PropertyBinding.findNode(root, sourceTrackBinding.nodeName);
1862
+ if (sourceTrackBinding.propertyName !== "morphTargetInfluences" || sourceTrackBinding.propertyIndex === void 0) {
1863
+ tracks.push(sourceTrack);
1864
+ continue;
1865
+ }
1866
+ if (sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete && sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear) {
1867
+ if (sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline) {
1868
+ throw new Error("THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.");
1869
+ }
1870
+ console.warn("THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.");
1871
+ sourceTrack = sourceTrack.clone();
1872
+ sourceTrack.setInterpolation(THREE.InterpolateLinear);
1873
+ }
1874
+ const targetCount = sourceTrackNode.morphTargetInfluences.length;
1875
+ const targetIndex = sourceTrackNode.morphTargetDictionary[sourceTrackBinding.propertyIndex];
1876
+ if (targetIndex === void 0) {
1877
+ throw new Error("THREE.GLTFExporter: Morph target name not found: " + sourceTrackBinding.propertyIndex);
1878
+ }
1879
+ let mergedTrack;
1880
+ if (mergedTracks[sourceTrackNode.uuid] === void 0) {
1881
+ mergedTrack = sourceTrack.clone();
1882
+ const values = new mergedTrack.ValueBufferType(targetCount * mergedTrack.times.length);
1883
+ for (let j = 0; j < mergedTrack.times.length; j++) {
1884
+ values[j * targetCount + targetIndex] = mergedTrack.values[j];
1885
+ }
1886
+ mergedTrack.name = (sourceTrackBinding.nodeName || "") + ".morphTargetInfluences";
1887
+ mergedTrack.values = values;
1888
+ mergedTracks[sourceTrackNode.uuid] = mergedTrack;
1889
+ tracks.push(mergedTrack);
1890
+ continue;
1891
+ }
1892
+ const sourceInterpolant = sourceTrack.createInterpolant(new sourceTrack.ValueBufferType(1));
1893
+ mergedTrack = mergedTracks[sourceTrackNode.uuid];
1894
+ for (let j = 0; j < mergedTrack.times.length; j++) {
1895
+ mergedTrack.values[j * targetCount + targetIndex] = sourceInterpolant.evaluate(mergedTrack.times[j]);
1896
+ }
1897
+ for (let j = 0; j < sourceTrack.times.length; j++) {
1898
+ const keyframeIndex = this.insertKeyframe(mergedTrack, sourceTrack.times[j]);
1899
+ mergedTrack.values[keyframeIndex * targetCount + targetIndex] = sourceTrack.values[j];
1900
+ }
1901
+ }
1902
+ clip.tracks = tracks;
1903
+ return clip;
1904
+ }
1905
+ };
1575
1906
  exports.GLTFExporter = GLTFExporter;