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