three-stdlib 2.22.9 → 2.22.10

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