three-stdlib 2.22.9 → 2.23.0

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