@needle-tools/three 0.145.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1160) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/build/three.cjs +36042 -0
  4. package/build/three.js +36048 -0
  5. package/build/three.min.js +6 -0
  6. package/build/three.module.js +49769 -0
  7. package/examples/fonts/LICENSE +13 -0
  8. package/examples/fonts/README.md +11 -0
  9. package/examples/fonts/droid/NOTICE +190 -0
  10. package/examples/fonts/droid/README.txt +18 -0
  11. package/examples/fonts/droid/droid_sans_bold.typeface.json +1 -0
  12. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +1 -0
  13. package/examples/fonts/droid/droid_sans_regular.typeface.json +1 -0
  14. package/examples/fonts/droid/droid_serif_bold.typeface.json +1 -0
  15. package/examples/fonts/droid/droid_serif_regular.typeface.json +1 -0
  16. package/examples/fonts/gentilis_bold.typeface.json +1 -0
  17. package/examples/fonts/gentilis_regular.typeface.json +1 -0
  18. package/examples/fonts/helvetiker_bold.typeface.json +1 -0
  19. package/examples/fonts/helvetiker_regular.typeface.json +1 -0
  20. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff +0 -0
  21. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2 +0 -0
  22. package/examples/fonts/open-sans/open-sans.css +9 -0
  23. package/examples/fonts/optimer_bold.typeface.json +1 -0
  24. package/examples/fonts/optimer_regular.typeface.json +1 -0
  25. package/examples/fonts/tabler-icons/fonts/tabler-icons.eot +0 -0
  26. package/examples/fonts/tabler-icons/fonts/tabler-icons.svg +3966 -0
  27. package/examples/fonts/tabler-icons/fonts/tabler-icons.ttf +0 -0
  28. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff +0 -0
  29. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff2 +0 -0
  30. package/examples/fonts/tabler-icons/tabler-icons.min.css +4 -0
  31. package/examples/fonts/ttf/README.md +9 -0
  32. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  33. package/examples/js/animation/AnimationClipCreator.js +97 -0
  34. package/examples/js/animation/CCDIKSolver.js +433 -0
  35. package/examples/js/animation/MMDAnimationHelper.js +1117 -0
  36. package/examples/js/animation/MMDPhysics.js +1238 -0
  37. package/examples/js/cameras/CinematicCamera.js +157 -0
  38. package/examples/js/controls/ArcballControls.js +3037 -0
  39. package/examples/js/controls/DragControls.js +230 -0
  40. package/examples/js/controls/FirstPersonControls.js +334 -0
  41. package/examples/js/controls/FlyControls.js +347 -0
  42. package/examples/js/controls/OrbitControls.js +1075 -0
  43. package/examples/js/controls/PointerLockControls.js +153 -0
  44. package/examples/js/controls/TrackballControls.js +782 -0
  45. package/examples/js/controls/TransformControls.js +1386 -0
  46. package/examples/js/csm/CSM.js +382 -0
  47. package/examples/js/csm/CSMFrustum.js +133 -0
  48. package/examples/js/csm/CSMHelper.js +145 -0
  49. package/examples/js/csm/CSMShader.js +257 -0
  50. package/examples/js/curves/CurveExtras.js +348 -0
  51. package/examples/js/curves/NURBSCurve.js +75 -0
  52. package/examples/js/curves/NURBSSurface.js +54 -0
  53. package/examples/js/curves/NURBSUtils.js +476 -0
  54. package/examples/js/effects/AnaglyphEffect.js +100 -0
  55. package/examples/js/effects/AsciiEffect.js +259 -0
  56. package/examples/js/effects/OutlineEffect.js +454 -0
  57. package/examples/js/effects/ParallaxBarrierEffect.js +75 -0
  58. package/examples/js/effects/PeppersGhostEffect.js +166 -0
  59. package/examples/js/effects/StereoEffect.js +50 -0
  60. package/examples/js/environments/DebugEnvironment.js +53 -0
  61. package/examples/js/environments/RoomEnvironment.js +122 -0
  62. package/examples/js/exporters/ColladaExporter.js +504 -0
  63. package/examples/js/exporters/DRACOExporter.js +212 -0
  64. package/examples/js/exporters/EXRExporter.js +458 -0
  65. package/examples/js/exporters/GLTFExporter.js +2543 -0
  66. package/examples/js/exporters/MMDExporter.js +194 -0
  67. package/examples/js/exporters/OBJExporter.js +251 -0
  68. package/examples/js/exporters/PLYExporter.js +422 -0
  69. package/examples/js/exporters/STLExporter.js +190 -0
  70. package/examples/js/exporters/USDZExporter.js +523 -0
  71. package/examples/js/geometries/BoxLineGeometry.js +60 -0
  72. package/examples/js/geometries/ConvexGeometry.js +48 -0
  73. package/examples/js/geometries/DecalGeometry.js +291 -0
  74. package/examples/js/geometries/LightningStrike.js +874 -0
  75. package/examples/js/geometries/ParametricGeometries.js +215 -0
  76. package/examples/js/geometries/ParametricGeometry.js +108 -0
  77. package/examples/js/geometries/RoundedBoxGeometry.js +140 -0
  78. package/examples/js/geometries/TeapotGeometry.js +331 -0
  79. package/examples/js/geometries/TextGeometry.js +51 -0
  80. package/examples/js/helpers/LightProbeHelper.js +49 -0
  81. package/examples/js/helpers/OctreeHelper.js +74 -0
  82. package/examples/js/helpers/PositionalAudioHelper.js +89 -0
  83. package/examples/js/helpers/RectAreaLightHelper.js +74 -0
  84. package/examples/js/helpers/VertexNormalsHelper.js +72 -0
  85. package/examples/js/helpers/VertexTangentsHelper.js +62 -0
  86. package/examples/js/helpers/ViewHelper.js +266 -0
  87. package/examples/js/interactive/HTMLMesh.js +508 -0
  88. package/examples/js/interactive/InteractiveGroup.js +101 -0
  89. package/examples/js/interactive/SelectionBox.js +262 -0
  90. package/examples/js/interactive/SelectionHelper.js +91 -0
  91. package/examples/js/libs/ammo.wasm.js +822 -0
  92. package/examples/js/libs/ammo.wasm.wasm +0 -0
  93. package/examples/js/libs/basis/README.md +46 -0
  94. package/examples/js/libs/basis/basis_transcoder.js +21 -0
  95. package/examples/js/libs/basis/basis_transcoder.wasm +0 -0
  96. package/examples/js/libs/chevrotain.min.js +3 -0
  97. package/examples/js/libs/draco/README.md +32 -0
  98. package/examples/js/libs/draco/draco_decoder.js +52 -0
  99. package/examples/js/libs/draco/draco_decoder.wasm +0 -0
  100. package/examples/js/libs/draco/draco_encoder.js +33 -0
  101. package/examples/js/libs/draco/draco_wasm_wrapper.js +104 -0
  102. package/examples/js/libs/draco/gltf/draco_decoder.js +48 -0
  103. package/examples/js/libs/draco/gltf/draco_decoder.wasm +0 -0
  104. package/examples/js/libs/draco/gltf/draco_encoder.js +33 -0
  105. package/examples/js/libs/draco/gltf/draco_wasm_wrapper.js +104 -0
  106. package/examples/js/libs/fflate.min.js +7 -0
  107. package/examples/js/libs/ktx-parse.umd.js +1 -0
  108. package/examples/js/libs/lottie_canvas.js +12751 -0
  109. package/examples/js/libs/meshopt_decoder.js +188 -0
  110. package/examples/js/libs/opentype.min.js +1 -0
  111. package/examples/js/libs/stats.min.js +5 -0
  112. package/examples/js/lights/LightProbeGenerator.js +228 -0
  113. package/examples/js/lights/RectAreaLightUniformsLib.js +56 -0
  114. package/examples/js/lines/Line2.js +19 -0
  115. package/examples/js/lines/LineGeometry.js +71 -0
  116. package/examples/js/lines/LineMaterial.js +642 -0
  117. package/examples/js/lines/LineSegments2.js +362 -0
  118. package/examples/js/lines/LineSegmentsGeometry.js +219 -0
  119. package/examples/js/lines/Wireframe.js +52 -0
  120. package/examples/js/lines/WireframeGeometry2.js +18 -0
  121. package/examples/js/loaders/3DMLoader.js +1370 -0
  122. package/examples/js/loaders/3MFLoader.js +1340 -0
  123. package/examples/js/loaders/AMFLoader.js +529 -0
  124. package/examples/js/loaders/BVHLoader.js +394 -0
  125. package/examples/js/loaders/BasisTextureLoader.js +736 -0
  126. package/examples/js/loaders/ColladaLoader.js +3821 -0
  127. package/examples/js/loaders/DDSLoader.js +245 -0
  128. package/examples/js/loaders/DRACOLoader.js +548 -0
  129. package/examples/js/loaders/EXRLoader.js +2136 -0
  130. package/examples/js/loaders/FBXLoader.js +3835 -0
  131. package/examples/js/loaders/FontLoader.js +169 -0
  132. package/examples/js/loaders/GCodeLoader.js +256 -0
  133. package/examples/js/loaders/GLTFLoader.js +4159 -0
  134. package/examples/js/loaders/HDRCubeTextureLoader.js +93 -0
  135. package/examples/js/loaders/KMZLoader.js +125 -0
  136. package/examples/js/loaders/KTXLoader.js +177 -0
  137. package/examples/js/loaders/LDrawLoader.js +2374 -0
  138. package/examples/js/loaders/LUT3dlLoader.js +139 -0
  139. package/examples/js/loaders/LUTCubeLoader.js +140 -0
  140. package/examples/js/loaders/LWOLoader.js +966 -0
  141. package/examples/js/loaders/LogLuvLoader.js +765 -0
  142. package/examples/js/loaders/LottieLoader.js +62 -0
  143. package/examples/js/loaders/MD2Loader.js +249 -0
  144. package/examples/js/loaders/MDDLoader.js +95 -0
  145. package/examples/js/loaders/MMDLoader.js +1924 -0
  146. package/examples/js/loaders/MTLLoader.js +501 -0
  147. package/examples/js/loaders/NRRDLoader.js +649 -0
  148. package/examples/js/loaders/OBJLoader.js +804 -0
  149. package/examples/js/loaders/PCDLoader.js +408 -0
  150. package/examples/js/loaders/PDBLoader.js +313 -0
  151. package/examples/js/loaders/PLYLoader.js +562 -0
  152. package/examples/js/loaders/PRWMLoader.js +260 -0
  153. package/examples/js/loaders/PVRLoader.js +227 -0
  154. package/examples/js/loaders/RGBELoader.js +467 -0
  155. package/examples/js/loaders/RGBMLoader.js +1415 -0
  156. package/examples/js/loaders/STLLoader.js +371 -0
  157. package/examples/js/loaders/SVGLoader.js +2655 -0
  158. package/examples/js/loaders/TDSLoader.js +1029 -0
  159. package/examples/js/loaders/TGALoader.js +486 -0
  160. package/examples/js/loaders/TIFFLoader.js +31 -0
  161. package/examples/js/loaders/TTFLoader.js +211 -0
  162. package/examples/js/loaders/TiltLoader.js +460 -0
  163. package/examples/js/loaders/VOXLoader.js +248 -0
  164. package/examples/js/loaders/VRMLLoader.js +3237 -0
  165. package/examples/js/loaders/VTKLoader.js +1095 -0
  166. package/examples/js/loaders/XYZLoader.js +91 -0
  167. package/examples/js/loaders/lwo/IFFParser.js +1148 -0
  168. package/examples/js/loaders/lwo/LWO2Parser.js +448 -0
  169. package/examples/js/loaders/lwo/LWO3Parser.js +402 -0
  170. package/examples/js/materials/MeshGouraudMaterial.js +385 -0
  171. package/examples/js/math/Capsule.js +120 -0
  172. package/examples/js/math/ColorConverter.js +33 -0
  173. package/examples/js/math/ConvexHull.js +1110 -0
  174. package/examples/js/math/ImprovedNoise.js +66 -0
  175. package/examples/js/math/Lut.js +171 -0
  176. package/examples/js/math/MeshSurfaceSampler.js +193 -0
  177. package/examples/js/math/OBB.js +341 -0
  178. package/examples/js/math/Octree.js +465 -0
  179. package/examples/js/math/SimplexNoise.js +459 -0
  180. package/examples/js/misc/ConvexObjectBreaker.js +485 -0
  181. package/examples/js/misc/GPUComputationRenderer.js +397 -0
  182. package/examples/js/misc/Gyroscope.js +60 -0
  183. package/examples/js/misc/MD2Character.js +244 -0
  184. package/examples/js/misc/MD2CharacterComplex.js +494 -0
  185. package/examples/js/misc/MorphAnimMesh.js +69 -0
  186. package/examples/js/misc/MorphBlendMesh.js +292 -0
  187. package/examples/js/misc/ProgressiveLightMap.js +331 -0
  188. package/examples/js/misc/RollerCoaster.js +437 -0
  189. package/examples/js/misc/TubePainter.js +161 -0
  190. package/examples/js/misc/Volume.js +466 -0
  191. package/examples/js/misc/VolumeSlice.js +224 -0
  192. package/examples/js/modifiers/CurveModifier.js +311 -0
  193. package/examples/js/modifiers/EdgeSplitModifier.js +258 -0
  194. package/examples/js/modifiers/SimplifyModifier.js +468 -0
  195. package/examples/js/modifiers/TessellateModifier.js +283 -0
  196. package/examples/js/objects/GroundProjectedEnv.js +193 -0
  197. package/examples/js/objects/Lensflare.js +347 -0
  198. package/examples/js/objects/LightningStorm.js +209 -0
  199. package/examples/js/objects/MarchingCubes.js +738 -0
  200. package/examples/js/objects/Reflector.js +214 -0
  201. package/examples/js/objects/ReflectorForSSRPass.js +319 -0
  202. package/examples/js/objects/Refractor.js +261 -0
  203. package/examples/js/objects/ShadowMesh.js +60 -0
  204. package/examples/js/objects/Sky.js +223 -0
  205. package/examples/js/objects/Water.js +287 -0
  206. package/examples/js/objects/Water2.js +306 -0
  207. package/examples/js/physics/AmmoPhysics.js +256 -0
  208. package/examples/js/physics/OimoPhysics.js +215 -0
  209. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +342 -0
  210. package/examples/js/postprocessing/AfterimagePass.js +70 -0
  211. package/examples/js/postprocessing/BloomPass.js +114 -0
  212. package/examples/js/postprocessing/BokehPass.js +103 -0
  213. package/examples/js/postprocessing/ClearPass.js +44 -0
  214. package/examples/js/postprocessing/CubeTexturePass.js +57 -0
  215. package/examples/js/postprocessing/DotScreenPass.js +49 -0
  216. package/examples/js/postprocessing/EffectComposer.js +279 -0
  217. package/examples/js/postprocessing/FilmPass.js +50 -0
  218. package/examples/js/postprocessing/GlitchPass.js +105 -0
  219. package/examples/js/postprocessing/HalftonePass.js +75 -0
  220. package/examples/js/postprocessing/LUTPass.js +184 -0
  221. package/examples/js/postprocessing/MaskPass.js +92 -0
  222. package/examples/js/postprocessing/OutlinePass.js +589 -0
  223. package/examples/js/postprocessing/Pass.js +75 -0
  224. package/examples/js/postprocessing/RenderPass.js +74 -0
  225. package/examples/js/postprocessing/SAOPass.js +366 -0
  226. package/examples/js/postprocessing/SMAAPass.js +153 -0
  227. package/examples/js/postprocessing/SSAARenderPass.js +156 -0
  228. package/examples/js/postprocessing/SSAOPass.js +351 -0
  229. package/examples/js/postprocessing/SSRPass.js +550 -0
  230. package/examples/js/postprocessing/SavePass.js +51 -0
  231. package/examples/js/postprocessing/ShaderPass.js +63 -0
  232. package/examples/js/postprocessing/TAARenderPass.js +128 -0
  233. package/examples/js/postprocessing/TexturePass.js +46 -0
  234. package/examples/js/postprocessing/UnrealBloomPass.js +357 -0
  235. package/examples/js/renderers/CSS2DRenderer.js +197 -0
  236. package/examples/js/renderers/CSS3DRenderer.js +258 -0
  237. package/examples/js/renderers/Projector.js +874 -0
  238. package/examples/js/renderers/SVGRenderer.js +537 -0
  239. package/examples/js/shaders/ACESFilmicToneMappingShader.js +92 -0
  240. package/examples/js/shaders/AfterimageShader.js +63 -0
  241. package/examples/js/shaders/BasicShader.js +30 -0
  242. package/examples/js/shaders/BleachBypassShader.js +65 -0
  243. package/examples/js/shaders/BlendShader.js +57 -0
  244. package/examples/js/shaders/BokehShader.js +159 -0
  245. package/examples/js/shaders/BokehShader2.js +428 -0
  246. package/examples/js/shaders/BrightnessContrastShader.js +61 -0
  247. package/examples/js/shaders/ColorCorrectionShader.js +56 -0
  248. package/examples/js/shaders/ColorifyShader.js +51 -0
  249. package/examples/js/shaders/ConvolutionShader.js +97 -0
  250. package/examples/js/shaders/CopyShader.js +48 -0
  251. package/examples/js/shaders/DOFMipMapShader.js +63 -0
  252. package/examples/js/shaders/DepthLimitedBlurShader.js +180 -0
  253. package/examples/js/shaders/DigitalGlitch.js +130 -0
  254. package/examples/js/shaders/DotScreenShader.js +76 -0
  255. package/examples/js/shaders/FXAAShader.js +286 -0
  256. package/examples/js/shaders/FilmShader.js +113 -0
  257. package/examples/js/shaders/FocusShader.js +98 -0
  258. package/examples/js/shaders/FreiChenShader.js +97 -0
  259. package/examples/js/shaders/GammaCorrectionShader.js +44 -0
  260. package/examples/js/shaders/GodRaysShader.js +297 -0
  261. package/examples/js/shaders/HalftoneShader.js +339 -0
  262. package/examples/js/shaders/HorizontalBlurShader.js +62 -0
  263. package/examples/js/shaders/HorizontalTiltShiftShader.js +68 -0
  264. package/examples/js/shaders/HueSaturationShader.js +72 -0
  265. package/examples/js/shaders/KaleidoShader.js +63 -0
  266. package/examples/js/shaders/LuminosityHighPassShader.js +71 -0
  267. package/examples/js/shaders/LuminosityShader.js +49 -0
  268. package/examples/js/shaders/MMDToonShader.js +100 -0
  269. package/examples/js/shaders/MirrorShader.js +59 -0
  270. package/examples/js/shaders/NormalMapShader.js +59 -0
  271. package/examples/js/shaders/PixelShader.js +51 -0
  272. package/examples/js/shaders/RGBShiftShader.js +59 -0
  273. package/examples/js/shaders/SAOShader.js +213 -0
  274. package/examples/js/shaders/SMAAShader.js +466 -0
  275. package/examples/js/shaders/SSAOShader.js +299 -0
  276. package/examples/js/shaders/SSRShader.js +393 -0
  277. package/examples/js/shaders/SepiaShader.js +55 -0
  278. package/examples/js/shaders/SobelOperatorShader.js +92 -0
  279. package/examples/js/shaders/SubsurfaceScatteringShader.js +49 -0
  280. package/examples/js/shaders/TechnicolorShader.js +46 -0
  281. package/examples/js/shaders/ToneMapShader.js +87 -0
  282. package/examples/js/shaders/ToonShader.js +351 -0
  283. package/examples/js/shaders/TriangleBlurShader.js +74 -0
  284. package/examples/js/shaders/UnpackDepthRGBAShader.js +50 -0
  285. package/examples/js/shaders/VerticalBlurShader.js +62 -0
  286. package/examples/js/shaders/VerticalTiltShiftShader.js +68 -0
  287. package/examples/js/shaders/VignetteShader.js +56 -0
  288. package/examples/js/shaders/VolumeShader.js +300 -0
  289. package/examples/js/shaders/WaterRefractionShader.js +88 -0
  290. package/examples/js/textures/FlakesTexture.js +41 -0
  291. package/examples/js/utils/BufferGeometryUtils.js +1094 -0
  292. package/examples/js/utils/CameraUtils.js +86 -0
  293. package/examples/js/utils/GPUStatsPanel.js +134 -0
  294. package/examples/js/utils/GeometryCompressionUtils.js +574 -0
  295. package/examples/js/utils/GeometryUtils.js +173 -0
  296. package/examples/js/utils/LDrawUtils.js +182 -0
  297. package/examples/js/utils/PackedPhongMaterial.js +107 -0
  298. package/examples/js/utils/SceneUtils.js +103 -0
  299. package/examples/js/utils/ShadowMapViewer.js +180 -0
  300. package/examples/js/utils/SkeletonUtils.js +507 -0
  301. package/examples/js/utils/UVsDebug.js +135 -0
  302. package/examples/js/utils/WorkerPool.js +115 -0
  303. package/examples/jsm/animation/AnimationClipCreator.js +114 -0
  304. package/examples/jsm/animation/CCDIKSolver.js +482 -0
  305. package/examples/jsm/animation/MMDAnimationHelper.js +1207 -0
  306. package/examples/jsm/animation/MMDPhysics.js +1406 -0
  307. package/examples/jsm/cameras/CinematicCamera.js +209 -0
  308. package/examples/jsm/capabilities/WebGL.js +91 -0
  309. package/examples/jsm/capabilities/WebGPU.js +39 -0
  310. package/examples/jsm/controls/ArcballControls.js +3216 -0
  311. package/examples/jsm/controls/DragControls.js +220 -0
  312. package/examples/jsm/controls/FirstPersonControls.js +325 -0
  313. package/examples/jsm/controls/FlyControls.js +284 -0
  314. package/examples/jsm/controls/OrbitControls.js +1249 -0
  315. package/examples/jsm/controls/PointerLockControls.js +157 -0
  316. package/examples/jsm/controls/TrackballControls.js +814 -0
  317. package/examples/jsm/controls/TransformControls.js +1558 -0
  318. package/examples/jsm/csm/CSM.js +378 -0
  319. package/examples/jsm/csm/CSMFrustum.js +152 -0
  320. package/examples/jsm/csm/CSMHelper.js +193 -0
  321. package/examples/jsm/csm/CSMShader.js +251 -0
  322. package/examples/jsm/curves/CurveExtras.js +422 -0
  323. package/examples/jsm/curves/NURBSCurve.js +80 -0
  324. package/examples/jsm/curves/NURBSSurface.js +52 -0
  325. package/examples/jsm/curves/NURBSUtils.js +487 -0
  326. package/examples/jsm/effects/AnaglyphEffect.js +168 -0
  327. package/examples/jsm/effects/AsciiEffect.js +266 -0
  328. package/examples/jsm/effects/OutlineEffect.js +553 -0
  329. package/examples/jsm/effects/ParallaxBarrierEffect.js +116 -0
  330. package/examples/jsm/effects/PeppersGhostEffect.js +153 -0
  331. package/examples/jsm/effects/StereoEffect.js +55 -0
  332. package/examples/jsm/environments/DebugEnvironment.js +52 -0
  333. package/examples/jsm/environments/RoomEnvironment.js +144 -0
  334. package/examples/jsm/exporters/ColladaExporter.js +713 -0
  335. package/examples/jsm/exporters/DRACOExporter.js +225 -0
  336. package/examples/jsm/exporters/EXRExporter.js +507 -0
  337. package/examples/jsm/exporters/GLTFExporter.js +2870 -0
  338. package/examples/jsm/exporters/KTX2Exporter.js +281 -0
  339. package/examples/jsm/exporters/MMDExporter.js +217 -0
  340. package/examples/jsm/exporters/OBJExporter.js +284 -0
  341. package/examples/jsm/exporters/PLYExporter.js +521 -0
  342. package/examples/jsm/exporters/STLExporter.js +195 -0
  343. package/examples/jsm/exporters/USDZExporter.js +1112 -0
  344. package/examples/jsm/geometries/BoxLineGeometry.js +69 -0
  345. package/examples/jsm/geometries/ConvexGeometry.js +59 -0
  346. package/examples/jsm/geometries/DecalGeometry.js +356 -0
  347. package/examples/jsm/geometries/LightningStrike.js +1017 -0
  348. package/examples/jsm/geometries/ParametricGeometries.js +254 -0
  349. package/examples/jsm/geometries/ParametricGeometry.js +129 -0
  350. package/examples/jsm/geometries/RoundedBoxGeometry.js +155 -0
  351. package/examples/jsm/geometries/TeapotGeometry.js +704 -0
  352. package/examples/jsm/geometries/TextGeometry.js +57 -0
  353. package/examples/jsm/helpers/LightProbeHelper.js +130 -0
  354. package/examples/jsm/helpers/OctreeHelper.js +72 -0
  355. package/examples/jsm/helpers/PositionalAudioHelper.js +109 -0
  356. package/examples/jsm/helpers/RectAreaLightHelper.js +85 -0
  357. package/examples/jsm/helpers/VertexNormalsHelper.js +96 -0
  358. package/examples/jsm/helpers/VertexTangentsHelper.js +88 -0
  359. package/examples/jsm/helpers/ViewHelper.js +319 -0
  360. package/examples/jsm/interactive/HTMLMesh.js +550 -0
  361. package/examples/jsm/interactive/InteractiveGroup.js +116 -0
  362. package/examples/jsm/interactive/SelectionBox.js +227 -0
  363. package/examples/jsm/interactive/SelectionHelper.js +97 -0
  364. package/examples/jsm/libs/OimoPhysics/OimoPhysics.js +37071 -0
  365. package/examples/jsm/libs/OimoPhysics/index.js +43 -0
  366. package/examples/jsm/libs/chevrotain.module.min.js +141 -0
  367. package/examples/jsm/libs/ecsy.module.js +1792 -0
  368. package/examples/jsm/libs/fflate.module.js +2474 -0
  369. package/examples/jsm/libs/flow.module.js +4552 -0
  370. package/examples/jsm/libs/ktx-parse.module.js +1 -0
  371. package/examples/jsm/libs/lil-gui.module.min.js +8 -0
  372. package/examples/jsm/libs/meshopt_decoder.module.js +178 -0
  373. package/examples/jsm/libs/mikktspace.module.js +128 -0
  374. package/examples/jsm/libs/mmdparser.module.js +11530 -0
  375. package/examples/jsm/libs/motion-controllers.module.js +397 -0
  376. package/examples/jsm/libs/opentype.module.js +14568 -0
  377. package/examples/jsm/libs/potpack.module.js +125 -0
  378. package/examples/jsm/libs/rhino3dm/rhino3dm.js +21 -0
  379. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +16 -0
  380. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  381. package/examples/jsm/libs/stats.module.js +167 -0
  382. package/examples/jsm/libs/tween.module.min.js +3 -0
  383. package/examples/jsm/libs/utif.module.js +1579 -0
  384. package/examples/jsm/libs/zstddec.module.js +1 -0
  385. package/examples/jsm/lights/LightProbeGenerator.js +250 -0
  386. package/examples/jsm/lights/RectAreaLightUniformsLib.js +79 -0
  387. package/examples/jsm/lines/Line2.js +19 -0
  388. package/examples/jsm/lines/LineGeometry.js +79 -0
  389. package/examples/jsm/lines/LineMaterial.js +702 -0
  390. package/examples/jsm/lines/LineSegments2.js +355 -0
  391. package/examples/jsm/lines/LineSegmentsGeometry.js +241 -0
  392. package/examples/jsm/lines/Wireframe.js +56 -0
  393. package/examples/jsm/lines/WireframeGeometry2.js +24 -0
  394. package/examples/jsm/loaders/3DMLoader.js +1495 -0
  395. package/examples/jsm/loaders/3MFLoader.js +1473 -0
  396. package/examples/jsm/loaders/AMFLoader.js +518 -0
  397. package/examples/jsm/loaders/BVHLoader.js +437 -0
  398. package/examples/jsm/loaders/BasisTextureLoader.js +790 -0
  399. package/examples/jsm/loaders/ColladaLoader.js +4092 -0
  400. package/examples/jsm/loaders/DDSLoader.js +274 -0
  401. package/examples/jsm/loaders/DRACOLoader.js +561 -0
  402. package/examples/jsm/loaders/EXRLoader.js +2310 -0
  403. package/examples/jsm/loaders/FBXLoader.js +4137 -0
  404. package/examples/jsm/loaders/FontLoader.js +183 -0
  405. package/examples/jsm/loaders/GCodeLoader.js +262 -0
  406. package/examples/jsm/loaders/GLTFLoader.js +5221 -0
  407. package/examples/jsm/loaders/HDRCubeTextureLoader.js +115 -0
  408. package/examples/jsm/loaders/IFCLoader.js +2431 -0
  409. package/examples/jsm/loaders/KMZLoader.js +130 -0
  410. package/examples/jsm/loaders/KTX2Loader.js +753 -0
  411. package/examples/jsm/loaders/KTXLoader.js +176 -0
  412. package/examples/jsm/loaders/LDrawLoader.js +2464 -0
  413. package/examples/jsm/loaders/LUT3dlLoader.js +151 -0
  414. package/examples/jsm/loaders/LUTCubeLoader.js +153 -0
  415. package/examples/jsm/loaders/LWOLoader.js +1069 -0
  416. package/examples/jsm/loaders/LogLuvLoader.js +606 -0
  417. package/examples/jsm/loaders/LottieLoader.js +73 -0
  418. package/examples/jsm/loaders/MD2Loader.js +399 -0
  419. package/examples/jsm/loaders/MDDLoader.js +102 -0
  420. package/examples/jsm/loaders/MMDLoader.js +2242 -0
  421. package/examples/jsm/loaders/MTLLoader.js +567 -0
  422. package/examples/jsm/loaders/NRRDLoader.js +671 -0
  423. package/examples/jsm/loaders/OBJLoader.js +905 -0
  424. package/examples/jsm/loaders/PCDLoader.js +453 -0
  425. package/examples/jsm/loaders/PDBLoader.js +227 -0
  426. package/examples/jsm/loaders/PLYLoader.js +564 -0
  427. package/examples/jsm/loaders/PRWMLoader.js +299 -0
  428. package/examples/jsm/loaders/PVRLoader.js +251 -0
  429. package/examples/jsm/loaders/RGBELoader.js +468 -0
  430. package/examples/jsm/loaders/RGBMLoader.js +1065 -0
  431. package/examples/jsm/loaders/STLLoader.js +399 -0
  432. package/examples/jsm/loaders/SVGLoader.js +2950 -0
  433. package/examples/jsm/loaders/TDSLoader.js +1124 -0
  434. package/examples/jsm/loaders/TGALoader.js +517 -0
  435. package/examples/jsm/loaders/TIFFLoader.js +36 -0
  436. package/examples/jsm/loaders/TTFLoader.js +221 -0
  437. package/examples/jsm/loaders/TiltLoader.js +514 -0
  438. package/examples/jsm/loaders/USDZLoader.js +618 -0
  439. package/examples/jsm/loaders/VOXLoader.js +305 -0
  440. package/examples/jsm/loaders/VRMLLoader.js +3493 -0
  441. package/examples/jsm/loaders/VTKLoader.js +1154 -0
  442. package/examples/jsm/loaders/XYZLoader.js +100 -0
  443. package/examples/jsm/loaders/ifc/web-ifc-api.js +47504 -0
  444. package/examples/jsm/loaders/ifc/web-ifc.wasm +0 -0
  445. package/examples/jsm/loaders/lwo/IFFParser.js +1218 -0
  446. package/examples/jsm/loaders/lwo/LWO2Parser.js +414 -0
  447. package/examples/jsm/loaders/lwo/LWO3Parser.js +373 -0
  448. package/examples/jsm/materials/MeshGouraudMaterial.js +423 -0
  449. package/examples/jsm/math/Capsule.js +137 -0
  450. package/examples/jsm/math/ColorConverter.js +36 -0
  451. package/examples/jsm/math/ConvexHull.js +1271 -0
  452. package/examples/jsm/math/ImprovedNoise.js +71 -0
  453. package/examples/jsm/math/Lut.js +203 -0
  454. package/examples/jsm/math/MeshSurfaceSampler.js +211 -0
  455. package/examples/jsm/math/OBB.js +423 -0
  456. package/examples/jsm/math/Octree.js +462 -0
  457. package/examples/jsm/math/SimplexNoise.js +444 -0
  458. package/examples/jsm/misc/ConvexObjectBreaker.js +525 -0
  459. package/examples/jsm/misc/GPUComputationRenderer.js +454 -0
  460. package/examples/jsm/misc/Gyroscope.js +66 -0
  461. package/examples/jsm/misc/MD2Character.js +276 -0
  462. package/examples/jsm/misc/MD2CharacterComplex.js +576 -0
  463. package/examples/jsm/misc/MorphAnimMesh.js +75 -0
  464. package/examples/jsm/misc/MorphBlendMesh.js +322 -0
  465. package/examples/jsm/misc/ProgressiveLightMap.js +321 -0
  466. package/examples/jsm/misc/RollerCoaster.js +560 -0
  467. package/examples/jsm/misc/TubePainter.js +205 -0
  468. package/examples/jsm/misc/Volume.js +460 -0
  469. package/examples/jsm/misc/VolumeSlice.js +227 -0
  470. package/examples/jsm/modifiers/CurveModifier.js +325 -0
  471. package/examples/jsm/modifiers/EdgeSplitModifier.js +279 -0
  472. package/examples/jsm/modifiers/SimplifyModifier.js +525 -0
  473. package/examples/jsm/modifiers/TessellateModifier.js +307 -0
  474. package/examples/jsm/node-editor/NodeEditor.js +857 -0
  475. package/examples/jsm/node-editor/accessors/MatcapUVEditor.js +14 -0
  476. package/examples/jsm/node-editor/accessors/NormalEditor.js +30 -0
  477. package/examples/jsm/node-editor/accessors/PositionEditor.js +30 -0
  478. package/examples/jsm/node-editor/accessors/UVEditor.js +25 -0
  479. package/examples/jsm/node-editor/core/BaseNode.js +96 -0
  480. package/examples/jsm/node-editor/core/DataFile.js +59 -0
  481. package/examples/jsm/node-editor/core/FileEditor.js +20 -0
  482. package/examples/jsm/node-editor/core/FileURLEditor.js +29 -0
  483. package/examples/jsm/node-editor/display/BlendEditor.js +44 -0
  484. package/examples/jsm/node-editor/display/NormalMapEditor.js +49 -0
  485. package/examples/jsm/node-editor/examples/animate-uv.json +1 -0
  486. package/examples/jsm/node-editor/examples/fake-top-light.json +1 -0
  487. package/examples/jsm/node-editor/examples/matcap.json +1 -0
  488. package/examples/jsm/node-editor/examples/oscillator-color.json +1 -0
  489. package/examples/jsm/node-editor/examples/rim.json +1 -0
  490. package/examples/jsm/node-editor/inputs/ColorEditor.js +96 -0
  491. package/examples/jsm/node-editor/inputs/FloatEditor.js +23 -0
  492. package/examples/jsm/node-editor/inputs/SliderEditor.js +67 -0
  493. package/examples/jsm/node-editor/inputs/TextureEditor.js +155 -0
  494. package/examples/jsm/node-editor/inputs/Vector2Editor.js +28 -0
  495. package/examples/jsm/node-editor/inputs/Vector3Editor.js +30 -0
  496. package/examples/jsm/node-editor/inputs/Vector4Editor.js +37 -0
  497. package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +84 -0
  498. package/examples/jsm/node-editor/materials/PointsMaterialEditor.js +102 -0
  499. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +118 -0
  500. package/examples/jsm/node-editor/math/AngleEditor.js +40 -0
  501. package/examples/jsm/node-editor/math/DotEditor.js +35 -0
  502. package/examples/jsm/node-editor/math/InvertEditor.js +39 -0
  503. package/examples/jsm/node-editor/math/LimiterEditor.js +62 -0
  504. package/examples/jsm/node-editor/math/NormalizeEditor.js +28 -0
  505. package/examples/jsm/node-editor/math/OperatorEditor.js +63 -0
  506. package/examples/jsm/node-editor/math/PowerEditor.js +44 -0
  507. package/examples/jsm/node-editor/math/TrigonometryEditor.js +45 -0
  508. package/examples/jsm/node-editor/procedural/CheckerEditor.js +27 -0
  509. package/examples/jsm/node-editor/scene/MeshEditor.js +102 -0
  510. package/examples/jsm/node-editor/scene/Object3DEditor.js +160 -0
  511. package/examples/jsm/node-editor/scene/PointsEditor.js +99 -0
  512. package/examples/jsm/node-editor/utils/JoinEditor.js +58 -0
  513. package/examples/jsm/node-editor/utils/OscillatorEditor.js +43 -0
  514. package/examples/jsm/node-editor/utils/PreviewEditor.js +170 -0
  515. package/examples/jsm/node-editor/utils/SplitEditor.js +39 -0
  516. package/examples/jsm/node-editor/utils/TimerEditor.js +58 -0
  517. package/examples/jsm/nodes/Nodes.js +346 -0
  518. package/examples/jsm/nodes/accessors/BitangentNode.js +62 -0
  519. package/examples/jsm/nodes/accessors/BufferNode.js +24 -0
  520. package/examples/jsm/nodes/accessors/CameraNode.js +67 -0
  521. package/examples/jsm/nodes/accessors/CubeTextureNode.js +107 -0
  522. package/examples/jsm/nodes/accessors/InstanceNode.js +58 -0
  523. package/examples/jsm/nodes/accessors/MaterialNode.js +152 -0
  524. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +23 -0
  525. package/examples/jsm/nodes/accessors/ModelNode.js +21 -0
  526. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +30 -0
  527. package/examples/jsm/nodes/accessors/NormalNode.js +79 -0
  528. package/examples/jsm/nodes/accessors/Object3DNode.js +122 -0
  529. package/examples/jsm/nodes/accessors/PointUVNode.js +21 -0
  530. package/examples/jsm/nodes/accessors/PositionNode.js +83 -0
  531. package/examples/jsm/nodes/accessors/ReferenceNode.js +65 -0
  532. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +31 -0
  533. package/examples/jsm/nodes/accessors/SkinningNode.js +109 -0
  534. package/examples/jsm/nodes/accessors/StorageBufferNode.js +21 -0
  535. package/examples/jsm/nodes/accessors/TangentNode.js +95 -0
  536. package/examples/jsm/nodes/accessors/TextureNode.js +100 -0
  537. package/examples/jsm/nodes/accessors/UVNode.js +41 -0
  538. package/examples/jsm/nodes/accessors/UserDataNode.js +23 -0
  539. package/examples/jsm/nodes/core/ArrayUniformNode.js +23 -0
  540. package/examples/jsm/nodes/core/AttributeNode.js +94 -0
  541. package/examples/jsm/nodes/core/BypassNode.js +38 -0
  542. package/examples/jsm/nodes/core/CodeNode.js +50 -0
  543. package/examples/jsm/nodes/core/ConstNode.js +29 -0
  544. package/examples/jsm/nodes/core/ContextNode.js +52 -0
  545. package/examples/jsm/nodes/core/ExpressionNode.js +32 -0
  546. package/examples/jsm/nodes/core/FunctionCallNode.js +82 -0
  547. package/examples/jsm/nodes/core/FunctionNode.js +105 -0
  548. package/examples/jsm/nodes/core/InputNode.js +62 -0
  549. package/examples/jsm/nodes/core/InstanceIndexNode.js +21 -0
  550. package/examples/jsm/nodes/core/Node.js +354 -0
  551. package/examples/jsm/nodes/core/NodeAttribute.js +14 -0
  552. package/examples/jsm/nodes/core/NodeBuilder.js +815 -0
  553. package/examples/jsm/nodes/core/NodeCode.js +15 -0
  554. package/examples/jsm/nodes/core/NodeFrame.js +59 -0
  555. package/examples/jsm/nodes/core/NodeFunction.js +22 -0
  556. package/examples/jsm/nodes/core/NodeFunctionInput.js +17 -0
  557. package/examples/jsm/nodes/core/NodeKeywords.js +80 -0
  558. package/examples/jsm/nodes/core/NodeParser.js +11 -0
  559. package/examples/jsm/nodes/core/NodeUniform.js +28 -0
  560. package/examples/jsm/nodes/core/NodeUtils.js +125 -0
  561. package/examples/jsm/nodes/core/NodeVar.js +14 -0
  562. package/examples/jsm/nodes/core/NodeVarying.js +14 -0
  563. package/examples/jsm/nodes/core/PropertyNode.js +36 -0
  564. package/examples/jsm/nodes/core/TempNode.js +50 -0
  565. package/examples/jsm/nodes/core/UniformNode.js +46 -0
  566. package/examples/jsm/nodes/core/VarNode.js +97 -0
  567. package/examples/jsm/nodes/core/VaryingNode.js +54 -0
  568. package/examples/jsm/nodes/core/constants.js +21 -0
  569. package/examples/jsm/nodes/display/BlendModeNode.js +85 -0
  570. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +84 -0
  571. package/examples/jsm/nodes/display/ColorSpaceNode.js +95 -0
  572. package/examples/jsm/nodes/display/FrontFacingNode.js +21 -0
  573. package/examples/jsm/nodes/display/NormalMapNode.js +93 -0
  574. package/examples/jsm/nodes/display/ToneMappingNode.js +51 -0
  575. package/examples/jsm/nodes/fog/FogNode.js +31 -0
  576. package/examples/jsm/nodes/fog/FogRangeNode.js +27 -0
  577. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +33 -0
  578. package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +9 -0
  579. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +27 -0
  580. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +18 -0
  581. package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +18 -0
  582. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +18 -0
  583. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +94 -0
  584. package/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +22 -0
  585. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +12 -0
  586. package/examples/jsm/nodes/functions/material/getRoughness.js +18 -0
  587. package/examples/jsm/nodes/geometry/RangeNode.js +109 -0
  588. package/examples/jsm/nodes/gpgpu/ComputeNode.js +65 -0
  589. package/examples/jsm/nodes/lighting/AONode.js +25 -0
  590. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +37 -0
  591. package/examples/jsm/nodes/lighting/EnvironmentNode.js +66 -0
  592. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +50 -0
  593. package/examples/jsm/nodes/lighting/LightingContextNode.js +75 -0
  594. package/examples/jsm/nodes/lighting/LightingNode.js +19 -0
  595. package/examples/jsm/nodes/lighting/LightsNode.js +120 -0
  596. package/examples/jsm/nodes/lighting/PunctualLightNode.js +68 -0
  597. package/examples/jsm/nodes/loaders/NodeLoader.js +107 -0
  598. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +73 -0
  599. package/examples/jsm/nodes/loaders/NodeObjectLoader.js +70 -0
  600. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +46 -0
  601. package/examples/jsm/nodes/materials/Materials.js +53 -0
  602. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +48 -0
  603. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +70 -0
  604. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +168 -0
  605. package/examples/jsm/nodes/materials/NodeMaterial.js +229 -0
  606. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +52 -0
  607. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +106 -0
  608. package/examples/jsm/nodes/materialx/DISCLAIMER.md +199 -0
  609. package/examples/jsm/nodes/materialx/MaterialXNodes.js +55 -0
  610. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +56 -0
  611. package/examples/jsm/nodes/materialx/lib/mx_noise.js +617 -0
  612. package/examples/jsm/nodes/math/CondNode.js +60 -0
  613. package/examples/jsm/nodes/math/MathNode.js +243 -0
  614. package/examples/jsm/nodes/math/OperatorNode.js +214 -0
  615. package/examples/jsm/nodes/parsers/GLSLNodeFunction.js +152 -0
  616. package/examples/jsm/nodes/parsers/GLSLNodeParser.js +14 -0
  617. package/examples/jsm/nodes/parsers/WGSLNodeFunction.js +104 -0
  618. package/examples/jsm/nodes/parsers/WGSLNodeParser.js +14 -0
  619. package/examples/jsm/nodes/procedural/CheckerNode.js +34 -0
  620. package/examples/jsm/nodes/shadernode/ShaderNode.js +264 -0
  621. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +299 -0
  622. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +131 -0
  623. package/examples/jsm/nodes/utils/ArrayElementNode.js +31 -0
  624. package/examples/jsm/nodes/utils/ConvertNode.js +47 -0
  625. package/examples/jsm/nodes/utils/JoinNode.js +42 -0
  626. package/examples/jsm/nodes/utils/MatcapUVNode.js +25 -0
  627. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +33 -0
  628. package/examples/jsm/nodes/utils/OscNode.js +74 -0
  629. package/examples/jsm/nodes/utils/RemapNode.js +34 -0
  630. package/examples/jsm/nodes/utils/RotateUVNode.js +32 -0
  631. package/examples/jsm/nodes/utils/SplitNode.js +102 -0
  632. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +58 -0
  633. package/examples/jsm/nodes/utils/TimerNode.js +84 -0
  634. package/examples/jsm/objects/GroundProjectedEnv.js +186 -0
  635. package/examples/jsm/objects/Lensflare.js +378 -0
  636. package/examples/jsm/objects/LightningStorm.js +245 -0
  637. package/examples/jsm/objects/MarchingCubes.js +1172 -0
  638. package/examples/jsm/objects/Reflector.js +269 -0
  639. package/examples/jsm/objects/ReflectorForSSRPass.js +349 -0
  640. package/examples/jsm/objects/Refractor.js +332 -0
  641. package/examples/jsm/objects/ShadowMesh.js +80 -0
  642. package/examples/jsm/objects/Sky.js +219 -0
  643. package/examples/jsm/objects/Water.js +329 -0
  644. package/examples/jsm/objects/Water2.js +358 -0
  645. package/examples/jsm/offscreen/jank.js +45 -0
  646. package/examples/jsm/offscreen/offscreen.js +8 -0
  647. package/examples/jsm/offscreen/scene.js +86 -0
  648. package/examples/jsm/physics/AmmoPhysics.js +286 -0
  649. package/examples/jsm/physics/OimoPhysics.js +231 -0
  650. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +369 -0
  651. package/examples/jsm/postprocessing/AfterimagePass.js +90 -0
  652. package/examples/jsm/postprocessing/BloomPass.js +150 -0
  653. package/examples/jsm/postprocessing/BokehPass.js +131 -0
  654. package/examples/jsm/postprocessing/ClearPass.js +46 -0
  655. package/examples/jsm/postprocessing/CubeTexturePass.js +78 -0
  656. package/examples/jsm/postprocessing/DotScreenPass.js +58 -0
  657. package/examples/jsm/postprocessing/EffectComposer.js +310 -0
  658. package/examples/jsm/postprocessing/FilmPass.js +59 -0
  659. package/examples/jsm/postprocessing/GlitchPass.js +118 -0
  660. package/examples/jsm/postprocessing/HalftonePass.js +77 -0
  661. package/examples/jsm/postprocessing/LUTPass.js +173 -0
  662. package/examples/jsm/postprocessing/MaskPass.js +101 -0
  663. package/examples/jsm/postprocessing/OutlinePass.js +646 -0
  664. package/examples/jsm/postprocessing/Pass.js +80 -0
  665. package/examples/jsm/postprocessing/RenderPass.js +81 -0
  666. package/examples/jsm/postprocessing/SAOPass.js +413 -0
  667. package/examples/jsm/postprocessing/SMAAPass.js +188 -0
  668. package/examples/jsm/postprocessing/SSAARenderPass.js +224 -0
  669. package/examples/jsm/postprocessing/SSAOPass.js +450 -0
  670. package/examples/jsm/postprocessing/SSRPass.js +645 -0
  671. package/examples/jsm/postprocessing/SavePass.js +62 -0
  672. package/examples/jsm/postprocessing/ShaderPass.js +68 -0
  673. package/examples/jsm/postprocessing/TAARenderPass.js +167 -0
  674. package/examples/jsm/postprocessing/TexturePass.js +60 -0
  675. package/examples/jsm/postprocessing/UnrealBloomPass.js +403 -0
  676. package/examples/jsm/renderers/CSS2DRenderer.js +210 -0
  677. package/examples/jsm/renderers/CSS3DRenderer.js +313 -0
  678. package/examples/jsm/renderers/Projector.js +918 -0
  679. package/examples/jsm/renderers/SVGRenderer.js +553 -0
  680. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +26 -0
  681. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +733 -0
  682. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +49 -0
  683. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +129 -0
  684. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +144 -0
  685. package/examples/jsm/renderers/webgpu/WebGPUBinding.js +22 -0
  686. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +255 -0
  687. package/examples/jsm/renderers/webgpu/WebGPUBuffer.js +43 -0
  688. package/examples/jsm/renderers/webgpu/WebGPUBufferUtils.js +33 -0
  689. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +78 -0
  690. package/examples/jsm/renderers/webgpu/WebGPUGeometries.js +82 -0
  691. package/examples/jsm/renderers/webgpu/WebGPUInfo.js +74 -0
  692. package/examples/jsm/renderers/webgpu/WebGPUObjects.js +36 -0
  693. package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +22 -0
  694. package/examples/jsm/renderers/webgpu/WebGPUProperties.js +38 -0
  695. package/examples/jsm/renderers/webgpu/WebGPURenderLists.js +199 -0
  696. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +735 -0
  697. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +296 -0
  698. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +66 -0
  699. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +969 -0
  700. package/examples/jsm/renderers/webgpu/WebGPUSampledTexture.js +73 -0
  701. package/examples/jsm/renderers/webgpu/WebGPUSampler.js +29 -0
  702. package/examples/jsm/renderers/webgpu/WebGPUStorageBuffer.js +20 -0
  703. package/examples/jsm/renderers/webgpu/WebGPUTextureRenderer.js +40 -0
  704. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +183 -0
  705. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +794 -0
  706. package/examples/jsm/renderers/webgpu/WebGPUUniform.js +136 -0
  707. package/examples/jsm/renderers/webgpu/WebGPUUniformBuffer.js +18 -0
  708. package/examples/jsm/renderers/webgpu/WebGPUUniformsGroup.js +299 -0
  709. package/examples/jsm/renderers/webgpu/WebGPUUtils.js +81 -0
  710. package/examples/jsm/renderers/webgpu/constants.js +261 -0
  711. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +801 -0
  712. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeSampledTexture.js +39 -0
  713. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeSampler.js +21 -0
  714. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeUniform.js +135 -0
  715. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +83 -0
  716. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +87 -0
  717. package/examples/jsm/shaders/AfterimageShader.js +56 -0
  718. package/examples/jsm/shaders/BasicShader.js +27 -0
  719. package/examples/jsm/shaders/BleachBypassShader.js +60 -0
  720. package/examples/jsm/shaders/BlendShader.js +48 -0
  721. package/examples/jsm/shaders/BokehShader.js +143 -0
  722. package/examples/jsm/shaders/BokehShader2.js +390 -0
  723. package/examples/jsm/shaders/BrightnessContrastShader.js +54 -0
  724. package/examples/jsm/shaders/ColorCorrectionShader.js +50 -0
  725. package/examples/jsm/shaders/ColorifyShader.js +49 -0
  726. package/examples/jsm/shaders/ConvolutionShader.js +101 -0
  727. package/examples/jsm/shaders/CopyShader.js +43 -0
  728. package/examples/jsm/shaders/DOFMipMapShader.js +54 -0
  729. package/examples/jsm/shaders/DepthLimitedBlurShader.js +166 -0
  730. package/examples/jsm/shaders/DigitalGlitch.js +101 -0
  731. package/examples/jsm/shaders/DotScreenShader.js +68 -0
  732. package/examples/jsm/shaders/FXAAShader.js +286 -0
  733. package/examples/jsm/shaders/FilmShader.js +100 -0
  734. package/examples/jsm/shaders/FocusShader.js +87 -0
  735. package/examples/jsm/shaders/FreiChenShader.js +94 -0
  736. package/examples/jsm/shaders/GammaCorrectionShader.js +41 -0
  737. package/examples/jsm/shaders/GodRaysShader.js +313 -0
  738. package/examples/jsm/shaders/HalftoneShader.js +310 -0
  739. package/examples/jsm/shaders/HorizontalBlurShader.js +57 -0
  740. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +61 -0
  741. package/examples/jsm/shaders/HueSaturationShader.js +65 -0
  742. package/examples/jsm/shaders/KaleidoShader.js +56 -0
  743. package/examples/jsm/shaders/LuminosityHighPassShader.js +64 -0
  744. package/examples/jsm/shaders/LuminosityShader.js +46 -0
  745. package/examples/jsm/shaders/MMDToonShader.js +123 -0
  746. package/examples/jsm/shaders/MirrorShader.js +54 -0
  747. package/examples/jsm/shaders/NormalMapShader.js +53 -0
  748. package/examples/jsm/shaders/PixelShader.js +44 -0
  749. package/examples/jsm/shaders/RGBShiftShader.js +52 -0
  750. package/examples/jsm/shaders/SAOShader.js +188 -0
  751. package/examples/jsm/shaders/SMAAShader.js +460 -0
  752. package/examples/jsm/shaders/SSAOShader.js +288 -0
  753. package/examples/jsm/shaders/SSRShader.js +364 -0
  754. package/examples/jsm/shaders/SepiaShader.js +50 -0
  755. package/examples/jsm/shaders/SobelOperatorShader.js +90 -0
  756. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +88 -0
  757. package/examples/jsm/shaders/TechnicolorShader.js +43 -0
  758. package/examples/jsm/shaders/ToneMapShader.js +73 -0
  759. package/examples/jsm/shaders/ToonShader.js +318 -0
  760. package/examples/jsm/shaders/TriangleBlurShader.js +72 -0
  761. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +45 -0
  762. package/examples/jsm/shaders/VerticalBlurShader.js +57 -0
  763. package/examples/jsm/shaders/VerticalTiltShiftShader.js +61 -0
  764. package/examples/jsm/shaders/VignetteShader.js +49 -0
  765. package/examples/jsm/shaders/VolumeShader.js +289 -0
  766. package/examples/jsm/shaders/WaterRefractionShader.js +90 -0
  767. package/examples/jsm/textures/FlakesTexture.js +40 -0
  768. package/examples/jsm/utils/BufferGeometryUtils.js +1222 -0
  769. package/examples/jsm/utils/CameraUtils.js +73 -0
  770. package/examples/jsm/utils/GPUStatsPanel.js +128 -0
  771. package/examples/jsm/utils/GeometryCompressionUtils.js +639 -0
  772. package/examples/jsm/utils/GeometryUtils.js +221 -0
  773. package/examples/jsm/utils/LDrawUtils.js +202 -0
  774. package/examples/jsm/utils/PackedPhongMaterial.js +251 -0
  775. package/examples/jsm/utils/SceneUtils.js +125 -0
  776. package/examples/jsm/utils/ShadowMapViewer.js +210 -0
  777. package/examples/jsm/utils/SkeletonUtils.js +596 -0
  778. package/examples/jsm/utils/UVsDebug.js +165 -0
  779. package/examples/jsm/utils/WorkerPool.js +102 -0
  780. package/examples/jsm/webxr/ARButton.js +208 -0
  781. package/examples/jsm/webxr/OculusHandModel.js +108 -0
  782. package/examples/jsm/webxr/OculusHandPointerModel.js +394 -0
  783. package/examples/jsm/webxr/Text2D.js +38 -0
  784. package/examples/jsm/webxr/VRButton.js +201 -0
  785. package/examples/jsm/webxr/XRControllerModelFactory.js +310 -0
  786. package/examples/jsm/webxr/XREstimatedLight.js +223 -0
  787. package/examples/jsm/webxr/XRHandMeshModel.js +108 -0
  788. package/examples/jsm/webxr/XRHandModelFactory.js +105 -0
  789. package/examples/jsm/webxr/XRHandPrimitiveModel.js +103 -0
  790. package/package.json +179 -0
  791. package/src/Three.Legacy.js +320 -0
  792. package/src/Three.js +180 -0
  793. package/src/animation/AnimationAction.js +700 -0
  794. package/src/animation/AnimationClip.js +473 -0
  795. package/src/animation/AnimationMixer.js +770 -0
  796. package/src/animation/AnimationObjectGroup.js +387 -0
  797. package/src/animation/AnimationUtils.js +361 -0
  798. package/src/animation/KeyframeTrack.js +462 -0
  799. package/src/animation/PropertyBinding.js +719 -0
  800. package/src/animation/PropertyMixer.js +318 -0
  801. package/src/animation/tracks/BooleanKeyframeTrack.js +19 -0
  802. package/src/animation/tracks/ColorKeyframeTrack.js +15 -0
  803. package/src/animation/tracks/NumberKeyframeTrack.js +12 -0
  804. package/src/animation/tracks/QuaternionKeyframeTrack.js +23 -0
  805. package/src/animation/tracks/StringKeyframeTrack.js +15 -0
  806. package/src/animation/tracks/VectorKeyframeTrack.js +12 -0
  807. package/src/audio/Audio.js +391 -0
  808. package/src/audio/AudioAnalyser.js +40 -0
  809. package/src/audio/AudioContext.js +25 -0
  810. package/src/audio/AudioListener.js +137 -0
  811. package/src/audio/PositionalAudio.js +138 -0
  812. package/src/cameras/ArrayCamera.js +17 -0
  813. package/src/cameras/Camera.js +68 -0
  814. package/src/cameras/CubeCamera.js +107 -0
  815. package/src/cameras/OrthographicCamera.js +136 -0
  816. package/src/cameras/PerspectiveCamera.js +233 -0
  817. package/src/cameras/StereoCamera.js +100 -0
  818. package/src/constants.js +181 -0
  819. package/src/core/BufferAttribute.js +493 -0
  820. package/src/core/BufferGeometry.js +1092 -0
  821. package/src/core/Clock.js +74 -0
  822. package/src/core/EventDispatcher.js +87 -0
  823. package/src/core/GLBufferAttribute.js +58 -0
  824. package/src/core/InstancedBufferAttribute.js +39 -0
  825. package/src/core/InstancedBufferGeometry.js +46 -0
  826. package/src/core/InstancedInterleavedBuffer.js +48 -0
  827. package/src/core/InterleavedBuffer.js +145 -0
  828. package/src/core/InterleavedBufferAttribute.js +331 -0
  829. package/src/core/Layers.js +60 -0
  830. package/src/core/Object3D.js +944 -0
  831. package/src/core/Raycaster.js +110 -0
  832. package/src/core/Uniform.js +17 -0
  833. package/src/core/UniformsGroup.js +92 -0
  834. package/src/extras/DataUtils.js +170 -0
  835. package/src/extras/Earcut.js +789 -0
  836. package/src/extras/ImageUtils.js +129 -0
  837. package/src/extras/PMREMGenerator.js +900 -0
  838. package/src/extras/ShapeUtils.js +92 -0
  839. package/src/extras/core/Curve.js +416 -0
  840. package/src/extras/core/CurvePath.js +252 -0
  841. package/src/extras/core/Interpolations.js +79 -0
  842. package/src/extras/core/Path.js +196 -0
  843. package/src/extras/core/Shape.js +102 -0
  844. package/src/extras/core/ShapePath.js +291 -0
  845. package/src/extras/curves/ArcCurve.js +17 -0
  846. package/src/extras/curves/CatmullRomCurve3.js +255 -0
  847. package/src/extras/curves/CubicBezierCurve.js +78 -0
  848. package/src/extras/curves/CubicBezierCurve3.js +79 -0
  849. package/src/extras/curves/Curves.js +10 -0
  850. package/src/extras/curves/EllipseCurve.js +156 -0
  851. package/src/extras/curves/LineCurve.js +90 -0
  852. package/src/extras/curves/LineCurve3.js +75 -0
  853. package/src/extras/curves/QuadraticBezierCurve.js +74 -0
  854. package/src/extras/curves/QuadraticBezierCurve3.js +75 -0
  855. package/src/extras/curves/SplineCurve.js +97 -0
  856. package/src/geometries/BoxGeometry.js +170 -0
  857. package/src/geometries/CapsuleGeometry.js +33 -0
  858. package/src/geometries/CircleGeometry.js +91 -0
  859. package/src/geometries/ConeGeometry.js +31 -0
  860. package/src/geometries/CylinderGeometry.js +276 -0
  861. package/src/geometries/DodecahedronGeometry.js +66 -0
  862. package/src/geometries/EdgesGeometry.js +142 -0
  863. package/src/geometries/ExtrudeGeometry.js +804 -0
  864. package/src/geometries/Geometries.js +21 -0
  865. package/src/geometries/IcosahedronGeometry.js +42 -0
  866. package/src/geometries/LatheGeometry.js +179 -0
  867. package/src/geometries/OctahedronGeometry.js +37 -0
  868. package/src/geometries/PlaneGeometry.js +88 -0
  869. package/src/geometries/PolyhedronGeometry.js +309 -0
  870. package/src/geometries/RingGeometry.js +118 -0
  871. package/src/geometries/ShapeGeometry.js +185 -0
  872. package/src/geometries/SphereGeometry.js +127 -0
  873. package/src/geometries/TetrahedronGeometry.js +34 -0
  874. package/src/geometries/TorusGeometry.js +110 -0
  875. package/src/geometries/TorusKnotGeometry.js +157 -0
  876. package/src/geometries/TubeGeometry.js +193 -0
  877. package/src/geometries/WireframeGeometry.js +137 -0
  878. package/src/helpers/ArrowHelper.js +114 -0
  879. package/src/helpers/AxesHelper.js +68 -0
  880. package/src/helpers/Box3Helper.js +56 -0
  881. package/src/helpers/BoxHelper.js +113 -0
  882. package/src/helpers/CameraHelper.js +269 -0
  883. package/src/helpers/DirectionalLightHelper.js +89 -0
  884. package/src/helpers/GridHelper.js +56 -0
  885. package/src/helpers/HemisphereLightHelper.js +85 -0
  886. package/src/helpers/PlaneHelper.js +63 -0
  887. package/src/helpers/PointLightHelper.js +91 -0
  888. package/src/helpers/PolarGridHelper.js +96 -0
  889. package/src/helpers/SkeletonHelper.js +128 -0
  890. package/src/helpers/SpotLightHelper.js +92 -0
  891. package/src/lights/AmbientLight.js +17 -0
  892. package/src/lights/AmbientLightProbe.js +21 -0
  893. package/src/lights/DirectionalLight.js +43 -0
  894. package/src/lights/DirectionalLightShadow.js +16 -0
  895. package/src/lights/HemisphereLight.js +34 -0
  896. package/src/lights/HemisphereLightProbe.js +30 -0
  897. package/src/lights/Light.js +58 -0
  898. package/src/lights/LightProbe.js +47 -0
  899. package/src/lights/LightShadow.js +147 -0
  900. package/src/lights/PointLight.js +57 -0
  901. package/src/lights/PointLightShadow.js +96 -0
  902. package/src/lights/RectAreaLight.js +56 -0
  903. package/src/lights/SpotLight.js +71 -0
  904. package/src/lights/SpotLightShadow.js +50 -0
  905. package/src/loaders/AnimationLoader.js +66 -0
  906. package/src/loaders/AudioLoader.js +60 -0
  907. package/src/loaders/BufferGeometryLoader.js +224 -0
  908. package/src/loaders/Cache.js +42 -0
  909. package/src/loaders/CompressedTextureLoader.js +134 -0
  910. package/src/loaders/CubeTextureLoader.js +56 -0
  911. package/src/loaders/DataTextureLoader.js +114 -0
  912. package/src/loaders/FileLoader.js +281 -0
  913. package/src/loaders/ImageBitmapLoader.js +99 -0
  914. package/src/loaders/ImageLoader.js +91 -0
  915. package/src/loaders/Loader.js +70 -0
  916. package/src/loaders/LoaderUtils.js +75 -0
  917. package/src/loaders/LoadingManager.js +142 -0
  918. package/src/loaders/MaterialLoader.js +355 -0
  919. package/src/loaders/ObjectLoader.js +1081 -0
  920. package/src/loaders/TextureLoader.js +41 -0
  921. package/src/materials/LineBasicMaterial.js +45 -0
  922. package/src/materials/LineDashedMaterial.js +35 -0
  923. package/src/materials/Material.js +493 -0
  924. package/src/materials/Materials.js +39 -0
  925. package/src/materials/MeshBasicMaterial.js +81 -0
  926. package/src/materials/MeshDepthMaterial.js +54 -0
  927. package/src/materials/MeshDistanceMaterial.js +52 -0
  928. package/src/materials/MeshLambertMaterial.js +116 -0
  929. package/src/materials/MeshMatcapMaterial.js +81 -0
  930. package/src/materials/MeshNormalMaterial.js +61 -0
  931. package/src/materials/MeshPhongMaterial.js +120 -0
  932. package/src/materials/MeshPhysicalMaterial.js +198 -0
  933. package/src/materials/MeshStandardMaterial.js +124 -0
  934. package/src/materials/MeshToonMaterial.js +102 -0
  935. package/src/materials/PointsMaterial.js +50 -0
  936. package/src/materials/RawShaderMaterial.js +17 -0
  937. package/src/materials/ShaderMaterial.js +182 -0
  938. package/src/materials/ShadowMaterial.js +37 -0
  939. package/src/materials/SpriteMaterial.js +54 -0
  940. package/src/math/Box2.js +203 -0
  941. package/src/math/Box3.js +532 -0
  942. package/src/math/Color.js +605 -0
  943. package/src/math/ColorManagement.js +74 -0
  944. package/src/math/Cylindrical.js +61 -0
  945. package/src/math/Euler.js +324 -0
  946. package/src/math/Frustum.js +162 -0
  947. package/src/math/Interpolant.js +241 -0
  948. package/src/math/Line3.js +115 -0
  949. package/src/math/MathUtils.js +321 -0
  950. package/src/math/Matrix3.js +333 -0
  951. package/src/math/Matrix4.js +860 -0
  952. package/src/math/Plane.js +205 -0
  953. package/src/math/Quaternion.js +678 -0
  954. package/src/math/Ray.js +496 -0
  955. package/src/math/Sphere.js +250 -0
  956. package/src/math/Spherical.js +86 -0
  957. package/src/math/SphericalHarmonics3.js +243 -0
  958. package/src/math/Triangle.js +299 -0
  959. package/src/math/Vector2.js +464 -0
  960. package/src/math/Vector3.js +715 -0
  961. package/src/math/Vector4.js +644 -0
  962. package/src/math/interpolants/CubicInterpolant.js +151 -0
  963. package/src/math/interpolants/DiscreteInterpolant.js +26 -0
  964. package/src/math/interpolants/LinearInterpolant.js +38 -0
  965. package/src/math/interpolants/QuaternionLinearInterpolant.js +39 -0
  966. package/src/objects/Bone.js +17 -0
  967. package/src/objects/Group.js +17 -0
  968. package/src/objects/InstancedMesh.js +126 -0
  969. package/src/objects/LOD.js +195 -0
  970. package/src/objects/Line.js +222 -0
  971. package/src/objects/LineLoop.js +17 -0
  972. package/src/objects/LineSegments.js +55 -0
  973. package/src/objects/Mesh.js +397 -0
  974. package/src/objects/Points.js +166 -0
  975. package/src/objects/Skeleton.js +281 -0
  976. package/src/objects/SkinnedMesh.js +151 -0
  977. package/src/objects/Sprite.js +181 -0
  978. package/src/renderers/WebGL1Renderer.js +7 -0
  979. package/src/renderers/WebGL3DRenderTarget.js +22 -0
  980. package/src/renderers/WebGLArrayRenderTarget.js +22 -0
  981. package/src/renderers/WebGLCubeRenderTarget.js +146 -0
  982. package/src/renderers/WebGLMultipleRenderTargets.js +82 -0
  983. package/src/renderers/WebGLRenderTarget.js +110 -0
  984. package/src/renderers/WebGLRenderer.js +2280 -0
  985. package/src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js +7 -0
  986. package/src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl.js +7 -0
  987. package/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js +7 -0
  988. package/src/renderers/shaders/ShaderChunk/alphatest_pars_fragment.glsl.js +5 -0
  989. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +18 -0
  990. package/src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl.js +8 -0
  991. package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +3 -0
  992. package/src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl.js +9 -0
  993. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +304 -0
  994. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +42 -0
  995. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +7 -0
  996. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +18 -0
  997. package/src/renderers/shaders/ShaderChunk/clearcoat_pars_fragment.glsl.js +21 -0
  998. package/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js +33 -0
  999. package/src/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl.js +9 -0
  1000. package/src/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl.js +7 -0
  1001. package/src/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl.js +7 -0
  1002. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +11 -0
  1003. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +11 -0
  1004. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +11 -0
  1005. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +23 -0
  1006. package/src/renderers/shaders/ShaderChunk/common.glsl.js +118 -0
  1007. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +191 -0
  1008. package/src/renderers/shaders/ShaderChunk/default_fragment.glsl.js +5 -0
  1009. package/src/renderers/shaders/ShaderChunk/default_vertex.glsl.js +5 -0
  1010. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +36 -0
  1011. package/src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl.js +9 -0
  1012. package/src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl.js +7 -0
  1013. package/src/renderers/shaders/ShaderChunk/dithering_fragment.glsl.js +7 -0
  1014. package/src/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl.js +20 -0
  1015. package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +9 -0
  1016. package/src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl.js +7 -0
  1017. package/src/renderers/shaders/ShaderChunk/encodings_fragment.glsl.js +3 -0
  1018. package/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js +11 -0
  1019. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +14 -0
  1020. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +66 -0
  1021. package/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js +21 -0
  1022. package/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js +22 -0
  1023. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +46 -0
  1024. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +37 -0
  1025. package/src/renderers/shaders/ShaderChunk/fog_fragment.glsl.js +17 -0
  1026. package/src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl.js +19 -0
  1027. package/src/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl.js +7 -0
  1028. package/src/renderers/shaders/ShaderChunk/fog_vertex.glsl.js +7 -0
  1029. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +27 -0
  1030. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +121 -0
  1031. package/src/renderers/shaders/ShaderChunk/iridescence_pars_fragment.glsl.js +14 -0
  1032. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +10 -0
  1033. package/src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl.js +8 -0
  1034. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +199 -0
  1035. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +13 -0
  1036. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +32 -0
  1037. package/src/renderers/shaders/ShaderChunk/lights_lambert_fragment.glsl.js +5 -0
  1038. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +30 -0
  1039. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +223 -0
  1040. package/src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl.js +7 -0
  1041. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +34 -0
  1042. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +120 -0
  1043. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +264 -0
  1044. package/src/renderers/shaders/ShaderChunk/lights_toon_fragment.glsl.js +4 -0
  1045. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +28 -0
  1046. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +9 -0
  1047. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +9 -0
  1048. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +16 -0
  1049. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +22 -0
  1050. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +17 -0
  1051. package/src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl.js +7 -0
  1052. package/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl.js +19 -0
  1053. package/src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl.js +19 -0
  1054. package/src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js +12 -0
  1055. package/src/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl.js +7 -0
  1056. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +24 -0
  1057. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +27 -0
  1058. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +38 -0
  1059. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +36 -0
  1060. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +46 -0
  1061. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +41 -0
  1062. package/src/renderers/shaders/ShaderChunk/normal_pars_fragment.glsl.js +14 -0
  1063. package/src/renderers/shaders/ShaderChunk/normal_pars_vertex.glsl.js +14 -0
  1064. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +14 -0
  1065. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +43 -0
  1066. package/src/renderers/shaders/ShaderChunk/output_fragment.glsl.js +12 -0
  1067. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +54 -0
  1068. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +8 -0
  1069. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +13 -0
  1070. package/src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js +12 -0
  1071. package/src/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl.js +7 -0
  1072. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +321 -0
  1073. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +68 -0
  1074. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +63 -0
  1075. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +66 -0
  1076. package/src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl.js +10 -0
  1077. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +33 -0
  1078. package/src/renderers/shaders/ShaderChunk/skinning_vertex.glsl.js +15 -0
  1079. package/src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl.js +20 -0
  1080. package/src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl.js +14 -0
  1081. package/src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl.js +7 -0
  1082. package/src/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl.js +7 -0
  1083. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +77 -0
  1084. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +36 -0
  1085. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +116 -0
  1086. package/src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl.js +7 -0
  1087. package/src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl.js +10 -0
  1088. package/src/renderers/shaders/ShaderChunk/uv2_vertex.glsl.js +7 -0
  1089. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +7 -0
  1090. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +17 -0
  1091. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +7 -0
  1092. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +15 -0
  1093. package/src/renderers/shaders/ShaderChunk.js +265 -0
  1094. package/src/renderers/shaders/ShaderLib/background.glsl.js +35 -0
  1095. package/src/renderers/shaders/ShaderLib/cube.glsl.js +38 -0
  1096. package/src/renderers/shaders/ShaderLib/depth.glsl.js +92 -0
  1097. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +73 -0
  1098. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +35 -0
  1099. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +70 -0
  1100. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +115 -0
  1101. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +123 -0
  1102. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +107 -0
  1103. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +82 -0
  1104. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +125 -0
  1105. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +216 -0
  1106. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +117 -0
  1107. package/src/renderers/shaders/ShaderLib/points.glsl.js +71 -0
  1108. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +49 -0
  1109. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +79 -0
  1110. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +53 -0
  1111. package/src/renderers/shaders/ShaderLib.js +331 -0
  1112. package/src/renderers/shaders/UniformsLib.js +218 -0
  1113. package/src/renderers/shaders/UniformsUtils.js +80 -0
  1114. package/src/renderers/webgl/WebGLAnimation.js +53 -0
  1115. package/src/renderers/webgl/WebGLAttributes.js +193 -0
  1116. package/src/renderers/webgl/WebGLBackground.js +228 -0
  1117. package/src/renderers/webgl/WebGLBindingStates.js +623 -0
  1118. package/src/renderers/webgl/WebGLBufferRenderer.js +61 -0
  1119. package/src/renderers/webgl/WebGLCapabilities.js +121 -0
  1120. package/src/renderers/webgl/WebGLClipping.js +167 -0
  1121. package/src/renderers/webgl/WebGLCubeMaps.js +99 -0
  1122. package/src/renderers/webgl/WebGLCubeUVMaps.js +130 -0
  1123. package/src/renderers/webgl/WebGLExtensions.js +96 -0
  1124. package/src/renderers/webgl/WebGLGeometries.js +195 -0
  1125. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +71 -0
  1126. package/src/renderers/webgl/WebGLInfo.js +72 -0
  1127. package/src/renderers/webgl/WebGLLights.js +574 -0
  1128. package/src/renderers/webgl/WebGLMaterials.js +677 -0
  1129. package/src/renderers/webgl/WebGLMorphtargets.js +300 -0
  1130. package/src/renderers/webgl/WebGLObjects.js +72 -0
  1131. package/src/renderers/webgl/WebGLProgram.js +901 -0
  1132. package/src/renderers/webgl/WebGLPrograms.js +542 -0
  1133. package/src/renderers/webgl/WebGLProperties.js +48 -0
  1134. package/src/renderers/webgl/WebGLRenderLists.js +238 -0
  1135. package/src/renderers/webgl/WebGLRenderStates.js +107 -0
  1136. package/src/renderers/webgl/WebGLShader.js +12 -0
  1137. package/src/renderers/webgl/WebGLShaderCache.js +124 -0
  1138. package/src/renderers/webgl/WebGLShadowMap.js +374 -0
  1139. package/src/renderers/webgl/WebGLState.js +1263 -0
  1140. package/src/renderers/webgl/WebGLTextures.js +1944 -0
  1141. package/src/renderers/webgl/WebGLUniforms.js +1050 -0
  1142. package/src/renderers/webgl/WebGLUniformsGroups.js +372 -0
  1143. package/src/renderers/webgl/WebGLUtils.js +266 -0
  1144. package/src/renderers/webxr/WebXRController.js +307 -0
  1145. package/src/renderers/webxr/WebXRManager.js +731 -0
  1146. package/src/scenes/Fog.js +37 -0
  1147. package/src/scenes/FogExp2.js +34 -0
  1148. package/src/scenes/Scene.js +71 -0
  1149. package/src/textures/CanvasTexture.js +17 -0
  1150. package/src/textures/CompressedTexture.js +28 -0
  1151. package/src/textures/CubeTexture.js +33 -0
  1152. package/src/textures/Data3DTexture.js +35 -0
  1153. package/src/textures/DataArrayTexture.js +27 -0
  1154. package/src/textures/DataTexture.js +22 -0
  1155. package/src/textures/DepthTexture.js +36 -0
  1156. package/src/textures/FramebufferTexture.js +25 -0
  1157. package/src/textures/Source.js +123 -0
  1158. package/src/textures/Texture.js +308 -0
  1159. package/src/textures/VideoTexture.js +55 -0
  1160. package/src/utils.js +71 -0
@@ -0,0 +1,2543 @@
1
+ ( function () {
2
+
3
+ class GLTFExporter {
4
+
5
+ constructor() {
6
+
7
+ this.pluginCallbacks = [];
8
+ this.register( function ( writer ) {
9
+
10
+ return new GLTFLightExtension( writer );
11
+
12
+ } );
13
+ this.register( function ( writer ) {
14
+
15
+ return new GLTFMaterialsUnlitExtension( writer );
16
+
17
+ } );
18
+ this.register( function ( writer ) {
19
+
20
+ return new GLTFMaterialsPBRSpecularGlossiness( writer );
21
+
22
+ } );
23
+ this.register( function ( writer ) {
24
+
25
+ return new GLTFMaterialsTransmissionExtension( writer );
26
+
27
+ } );
28
+ this.register( function ( writer ) {
29
+
30
+ return new GLTFMaterialsVolumeExtension( writer );
31
+
32
+ } );
33
+ this.register( function ( writer ) {
34
+
35
+ return new GLTFMaterialsClearcoatExtension( writer );
36
+
37
+ } );
38
+ this.register( function ( writer ) {
39
+
40
+ return new GLTFMaterialsIridescenceExtension( writer );
41
+
42
+ } );
43
+
44
+ }
45
+
46
+ register( callback ) {
47
+
48
+ if ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {
49
+
50
+ this.pluginCallbacks.push( callback );
51
+
52
+ }
53
+
54
+ return this;
55
+
56
+ }
57
+
58
+ unregister( callback ) {
59
+
60
+ if ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {
61
+
62
+ this.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );
63
+
64
+ }
65
+
66
+ return this;
67
+
68
+ }
69
+ /**
70
+ * Parse scenes and generate GLTF output
71
+ * @param {Scene or [THREE.Scenes]} input THREE.Scene or Array of THREE.Scenes
72
+ * @param {Function} onDone Callback on completed
73
+ * @param {Function} onError Callback on errors
74
+ * @param {Object} options options
75
+ */
76
+
77
+
78
+ parse( input, onDone, onError, options ) {
79
+
80
+ const writer = new GLTFWriter();
81
+ const plugins = [];
82
+
83
+ for ( let i = 0, il = this.pluginCallbacks.length; i < il; i ++ ) {
84
+
85
+ plugins.push( this.pluginCallbacks[ i ]( writer ) );
86
+
87
+ }
88
+
89
+ writer.setPlugins( plugins );
90
+ writer.write( input, onDone, options ).catch( onError );
91
+
92
+ }
93
+
94
+ parseAsync( input, options ) {
95
+
96
+ const scope = this;
97
+ return new Promise( function ( resolve, reject ) {
98
+
99
+ scope.parse( input, resolve, reject, options );
100
+
101
+ } );
102
+
103
+ }
104
+
105
+ } //------------------------------------------------------------------------------
106
+ // Constants
107
+ //------------------------------------------------------------------------------
108
+
109
+
110
+ const WEBGL_CONSTANTS = {
111
+ POINTS: 0x0000,
112
+ LINES: 0x0001,
113
+ LINE_LOOP: 0x0002,
114
+ LINE_STRIP: 0x0003,
115
+ TRIANGLES: 0x0004,
116
+ TRIANGLE_STRIP: 0x0005,
117
+ TRIANGLE_FAN: 0x0006,
118
+ UNSIGNED_BYTE: 0x1401,
119
+ UNSIGNED_SHORT: 0x1403,
120
+ FLOAT: 0x1406,
121
+ UNSIGNED_INT: 0x1405,
122
+ ARRAY_BUFFER: 0x8892,
123
+ ELEMENT_ARRAY_BUFFER: 0x8893,
124
+ NEAREST: 0x2600,
125
+ LINEAR: 0x2601,
126
+ NEAREST_MIPMAP_NEAREST: 0x2700,
127
+ LINEAR_MIPMAP_NEAREST: 0x2701,
128
+ NEAREST_MIPMAP_LINEAR: 0x2702,
129
+ LINEAR_MIPMAP_LINEAR: 0x2703,
130
+ CLAMP_TO_EDGE: 33071,
131
+ MIRRORED_REPEAT: 33648,
132
+ REPEAT: 10497
133
+ };
134
+ const THREE_TO_WEBGL = {};
135
+ THREE_TO_WEBGL[ THREE.NearestFilter ] = WEBGL_CONSTANTS.NEAREST;
136
+ THREE_TO_WEBGL[ THREE.NearestMipmapNearestFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST;
137
+ THREE_TO_WEBGL[ THREE.NearestMipmapLinearFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_LINEAR;
138
+ THREE_TO_WEBGL[ THREE.LinearFilter ] = WEBGL_CONSTANTS.LINEAR;
139
+ THREE_TO_WEBGL[ THREE.LinearMipmapNearestFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_NEAREST;
140
+ THREE_TO_WEBGL[ THREE.LinearMipmapLinearFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_LINEAR;
141
+ THREE_TO_WEBGL[ THREE.ClampToEdgeWrapping ] = WEBGL_CONSTANTS.CLAMP_TO_EDGE;
142
+ THREE_TO_WEBGL[ THREE.RepeatWrapping ] = WEBGL_CONSTANTS.REPEAT;
143
+ THREE_TO_WEBGL[ THREE.MirroredRepeatWrapping ] = WEBGL_CONSTANTS.MIRRORED_REPEAT;
144
+ const PATH_PROPERTIES = {
145
+ scale: 'scale',
146
+ position: 'translation',
147
+ quaternion: 'rotation',
148
+ morphTargetInfluences: 'weights'
149
+ }; // GLB constants
150
+ // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification
151
+
152
+ const GLB_HEADER_BYTES = 12;
153
+ const GLB_HEADER_MAGIC = 0x46546C67;
154
+ const GLB_VERSION = 2;
155
+ const GLB_CHUNK_PREFIX_BYTES = 8;
156
+ const GLB_CHUNK_TYPE_JSON = 0x4E4F534A;
157
+ const GLB_CHUNK_TYPE_BIN = 0x004E4942; //------------------------------------------------------------------------------
158
+ // Utility functions
159
+ //------------------------------------------------------------------------------
160
+
161
+ /**
162
+ * Compare two arrays
163
+ * @param {Array} array1 Array 1 to compare
164
+ * @param {Array} array2 Array 2 to compare
165
+ * @return {Boolean} Returns true if both arrays are equal
166
+ */
167
+
168
+ function equalArray( array1, array2 ) {
169
+
170
+ return array1.length === array2.length && array1.every( function ( element, index ) {
171
+
172
+ return element === array2[ index ];
173
+
174
+ } );
175
+
176
+ }
177
+ /**
178
+ * Converts a string to an ArrayBuffer.
179
+ * @param {string} text
180
+ * @return {ArrayBuffer}
181
+ */
182
+
183
+
184
+ function stringToArrayBuffer( text ) {
185
+
186
+ return new TextEncoder().encode( text ).buffer;
187
+
188
+ }
189
+ /**
190
+ * Is identity matrix
191
+ *
192
+ * @param {Matrix4} matrix
193
+ * @returns {Boolean} Returns true, if parameter is identity matrix
194
+ */
195
+
196
+
197
+ function isIdentityMatrix( matrix ) {
198
+
199
+ return equalArray( matrix.elements, [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] );
200
+
201
+ }
202
+ /**
203
+ * Get the min and max vectors from the given attribute
204
+ * @param {BufferAttribute} attribute Attribute to find the min/max in range from start to start + count
205
+ * @param {Integer} start
206
+ * @param {Integer} count
207
+ * @return {Object} Object containing the `min` and `max` values (As an array of attribute.itemSize components)
208
+ */
209
+
210
+
211
+ function getMinMax( attribute, start, count ) {
212
+
213
+ const output = {
214
+ min: new Array( attribute.itemSize ).fill( Number.POSITIVE_INFINITY ),
215
+ max: new Array( attribute.itemSize ).fill( Number.NEGATIVE_INFINITY )
216
+ };
217
+
218
+ for ( let i = start; i < start + count; i ++ ) {
219
+
220
+ for ( let a = 0; a < attribute.itemSize; a ++ ) {
221
+
222
+ let value;
223
+
224
+ if ( attribute.itemSize > 4 ) {
225
+
226
+ // no support for interleaved data for itemSize > 4
227
+ value = attribute.array[ i * attribute.itemSize + a ];
228
+
229
+ } else {
230
+
231
+ if ( a === 0 ) value = attribute.getX( i ); else if ( a === 1 ) value = attribute.getY( i ); else if ( a === 2 ) value = attribute.getZ( i ); else if ( a === 3 ) value = attribute.getW( i );
232
+
233
+ }
234
+
235
+ output.min[ a ] = Math.min( output.min[ a ], value );
236
+ output.max[ a ] = Math.max( output.max[ a ], value );
237
+
238
+ }
239
+
240
+ }
241
+
242
+ return output;
243
+
244
+ }
245
+ /**
246
+ * Get the required size + padding for a buffer, rounded to the next 4-byte boundary.
247
+ * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment
248
+ *
249
+ * @param {Integer} bufferSize The size the original buffer.
250
+ * @returns {Integer} new buffer size with required padding.
251
+ *
252
+ */
253
+
254
+
255
+ function getPaddedBufferSize( bufferSize ) {
256
+
257
+ return Math.ceil( bufferSize / 4 ) * 4;
258
+
259
+ }
260
+ /**
261
+ * Returns a buffer aligned to 4-byte boundary.
262
+ *
263
+ * @param {ArrayBuffer} arrayBuffer Buffer to pad
264
+ * @param {Integer} paddingByte (Optional)
265
+ * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer
266
+ */
267
+
268
+
269
+ function getPaddedArrayBuffer( arrayBuffer, paddingByte = 0 ) {
270
+
271
+ const paddedLength = getPaddedBufferSize( arrayBuffer.byteLength );
272
+
273
+ if ( paddedLength !== arrayBuffer.byteLength ) {
274
+
275
+ const array = new Uint8Array( paddedLength );
276
+ array.set( new Uint8Array( arrayBuffer ) );
277
+
278
+ if ( paddingByte !== 0 ) {
279
+
280
+ for ( let i = arrayBuffer.byteLength; i < paddedLength; i ++ ) {
281
+
282
+ array[ i ] = paddingByte;
283
+
284
+ }
285
+
286
+ }
287
+
288
+ return array.buffer;
289
+
290
+ }
291
+
292
+ return arrayBuffer;
293
+
294
+ }
295
+
296
+ function getCanvas() {
297
+
298
+ if ( typeof document === 'undefined' && typeof OffscreenCanvas !== 'undefined' ) {
299
+
300
+ return new OffscreenCanvas( 1, 1 );
301
+
302
+ }
303
+
304
+ return document.createElement( 'canvas' );
305
+
306
+ }
307
+
308
+ function getToBlobPromise( canvas, mimeType ) {
309
+
310
+ if ( canvas.toBlob !== undefined ) {
311
+
312
+ return new Promise( resolve => canvas.toBlob( resolve, mimeType ) );
313
+
314
+ }
315
+
316
+ let quality; // Blink's implementation of convertToBlob seems to default to a quality level of 100%
317
+ // Use the Blink default quality levels of toBlob instead so that file sizes are comparable.
318
+
319
+ if ( mimeType === 'image/jpeg' ) {
320
+
321
+ quality = 0.92;
322
+
323
+ } else if ( mimeType === 'image/webp' ) {
324
+
325
+ quality = 0.8;
326
+
327
+ }
328
+
329
+ return canvas.convertToBlob( {
330
+ type: mimeType,
331
+ quality: quality
332
+ } );
333
+
334
+ }
335
+ /**
336
+ * Writer
337
+ */
338
+
339
+
340
+ class GLTFWriter {
341
+
342
+ constructor() {
343
+
344
+ this.plugins = [];
345
+ this.options = {};
346
+ this.pending = [];
347
+ this.buffers = [];
348
+ this.byteOffset = 0;
349
+ this.buffers = [];
350
+ this.nodeMap = new Map();
351
+ this.skins = [];
352
+ this.extensionsUsed = {};
353
+ this.uids = new Map();
354
+ this.uid = 0;
355
+ this.json = {
356
+ asset: {
357
+ version: '2.0',
358
+ generator: 'THREE.GLTFExporter'
359
+ }
360
+ };
361
+ this.cache = {
362
+ meshes: new Map(),
363
+ attributes: new Map(),
364
+ attributesNormalized: new Map(),
365
+ materials: new Map(),
366
+ textures: new Map(),
367
+ images: new Map()
368
+ };
369
+
370
+ }
371
+
372
+ setPlugins( plugins ) {
373
+
374
+ this.plugins = plugins;
375
+
376
+ }
377
+ /**
378
+ * Parse scenes and generate GLTF output
379
+ * @param {Scene or [THREE.Scenes]} input THREE.Scene or Array of THREE.Scenes
380
+ * @param {Function} onDone Callback on completed
381
+ * @param {Object} options options
382
+ */
383
+
384
+
385
+ async write( input, onDone, options ) {
386
+
387
+ this.options = Object.assign( {}, {
388
+ // default options
389
+ binary: false,
390
+ trs: false,
391
+ onlyVisible: true,
392
+ truncateDrawRange: true,
393
+ maxTextureSize: Infinity,
394
+ animations: [],
395
+ includeCustomExtensions: false
396
+ }, options );
397
+
398
+ if ( this.options.animations.length > 0 ) {
399
+
400
+ // Only TRS properties, and not matrices, may be targeted by animation.
401
+ this.options.trs = true;
402
+
403
+ }
404
+
405
+ this.processInput( input );
406
+ await Promise.all( this.pending );
407
+ const writer = this;
408
+ const buffers = writer.buffers;
409
+ const json = writer.json;
410
+ options = writer.options;
411
+ const extensionsUsed = writer.extensionsUsed; // Merge buffers.
412
+
413
+ const blob = new Blob( buffers, {
414
+ type: 'application/octet-stream'
415
+ } ); // Declare extensions.
416
+
417
+ const extensionsUsedList = Object.keys( extensionsUsed );
418
+ if ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList; // Update bytelength of the single buffer.
419
+
420
+ if ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;
421
+
422
+ if ( options.binary === true ) {
423
+
424
+ // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification
425
+ const reader = new FileReader();
426
+ reader.readAsArrayBuffer( blob );
427
+
428
+ reader.onloadend = function () {
429
+
430
+ // Binary chunk.
431
+ const binaryChunk = getPaddedArrayBuffer( reader.result );
432
+ const binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );
433
+ binaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );
434
+ binaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true ); // JSON chunk.
435
+
436
+ const jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 );
437
+ const jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );
438
+ jsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );
439
+ jsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true ); // GLB header.
440
+
441
+ const header = new ArrayBuffer( GLB_HEADER_BYTES );
442
+ const headerView = new DataView( header );
443
+ headerView.setUint32( 0, GLB_HEADER_MAGIC, true );
444
+ headerView.setUint32( 4, GLB_VERSION, true );
445
+ const totalByteLength = GLB_HEADER_BYTES + jsonChunkPrefix.byteLength + jsonChunk.byteLength + binaryChunkPrefix.byteLength + binaryChunk.byteLength;
446
+ headerView.setUint32( 8, totalByteLength, true );
447
+ const glbBlob = new Blob( [ header, jsonChunkPrefix, jsonChunk, binaryChunkPrefix, binaryChunk ], {
448
+ type: 'application/octet-stream'
449
+ } );
450
+ const glbReader = new FileReader();
451
+ glbReader.readAsArrayBuffer( glbBlob );
452
+
453
+ glbReader.onloadend = function () {
454
+
455
+ onDone( glbReader.result );
456
+
457
+ };
458
+
459
+ };
460
+
461
+ } else {
462
+
463
+ if ( json.buffers && json.buffers.length > 0 ) {
464
+
465
+ const reader = new FileReader();
466
+ reader.readAsDataURL( blob );
467
+
468
+ reader.onloadend = function () {
469
+
470
+ const base64data = reader.result;
471
+ json.buffers[ 0 ].uri = base64data;
472
+ onDone( json );
473
+
474
+ };
475
+
476
+ } else {
477
+
478
+ onDone( json );
479
+
480
+ }
481
+
482
+ }
483
+
484
+ }
485
+ /**
486
+ * Serializes a userData.
487
+ *
488
+ * @param {THREE.Object3D|THREE.Material} object
489
+ * @param {Object} objectDef
490
+ */
491
+
492
+
493
+ serializeUserData( object, objectDef ) {
494
+
495
+ if ( Object.keys( object.userData ).length === 0 ) return;
496
+ const options = this.options;
497
+ const extensionsUsed = this.extensionsUsed;
498
+
499
+ try {
500
+
501
+ const json = JSON.parse( JSON.stringify( object.userData ) );
502
+
503
+ if ( options.includeCustomExtensions && json.gltfExtensions ) {
504
+
505
+ if ( objectDef.extensions === undefined ) objectDef.extensions = {};
506
+
507
+ for ( const extensionName in json.gltfExtensions ) {
508
+
509
+ objectDef.extensions[ extensionName ] = json.gltfExtensions[ extensionName ];
510
+ extensionsUsed[ extensionName ] = true;
511
+
512
+ }
513
+
514
+ delete json.gltfExtensions;
515
+
516
+ }
517
+
518
+ if ( Object.keys( json ).length > 0 ) objectDef.extras = json;
519
+
520
+ } catch ( error ) {
521
+
522
+ console.warn( 'THREE.GLTFExporter: userData of \'' + object.name + '\' ' + 'won\'t be serialized because of JSON.stringify error - ' + error.message );
523
+
524
+ }
525
+
526
+ }
527
+ /**
528
+ * Returns ids for buffer attributes.
529
+ * @param {Object} object
530
+ * @return {Integer}
531
+ */
532
+
533
+
534
+ getUID( attribute, isRelativeCopy = false ) {
535
+
536
+ if ( this.uids.has( attribute ) === false ) {
537
+
538
+ const uids = new Map();
539
+ uids.set( true, this.uid ++ );
540
+ uids.set( false, this.uid ++ );
541
+ this.uids.set( attribute, uids );
542
+
543
+ }
544
+
545
+ const uids = this.uids.get( attribute );
546
+ return uids.get( isRelativeCopy );
547
+
548
+ }
549
+ /**
550
+ * Checks if normal attribute values are normalized.
551
+ *
552
+ * @param {BufferAttribute} normal
553
+ * @returns {Boolean}
554
+ */
555
+
556
+
557
+ isNormalizedNormalAttribute( normal ) {
558
+
559
+ const cache = this.cache;
560
+ if ( cache.attributesNormalized.has( normal ) ) return false;
561
+ const v = new THREE.Vector3();
562
+
563
+ for ( let i = 0, il = normal.count; i < il; i ++ ) {
564
+
565
+ // 0.0005 is from glTF-validator
566
+ if ( Math.abs( v.fromBufferAttribute( normal, i ).length() - 1.0 ) > 0.0005 ) return false;
567
+
568
+ }
569
+
570
+ return true;
571
+
572
+ }
573
+ /**
574
+ * Creates normalized normal buffer attribute.
575
+ *
576
+ * @param {BufferAttribute} normal
577
+ * @returns {BufferAttribute}
578
+ *
579
+ */
580
+
581
+
582
+ createNormalizedNormalAttribute( normal ) {
583
+
584
+ const cache = this.cache;
585
+ if ( cache.attributesNormalized.has( normal ) ) return cache.attributesNormalized.get( normal );
586
+ const attribute = normal.clone();
587
+ const v = new THREE.Vector3();
588
+
589
+ for ( let i = 0, il = attribute.count; i < il; i ++ ) {
590
+
591
+ v.fromBufferAttribute( attribute, i );
592
+
593
+ if ( v.x === 0 && v.y === 0 && v.z === 0 ) {
594
+
595
+ // if values can't be normalized set (1, 0, 0)
596
+ v.setX( 1.0 );
597
+
598
+ } else {
599
+
600
+ v.normalize();
601
+
602
+ }
603
+
604
+ attribute.setXYZ( i, v.x, v.y, v.z );
605
+
606
+ }
607
+
608
+ cache.attributesNormalized.set( normal, attribute );
609
+ return attribute;
610
+
611
+ }
612
+ /**
613
+ * Applies a texture transform, if present, to the map definition. Requires
614
+ * the KHR_texture_transform extension.
615
+ *
616
+ * @param {Object} mapDef
617
+ * @param {THREE.Texture} texture
618
+ */
619
+
620
+
621
+ applyTextureTransform( mapDef, texture ) {
622
+
623
+ let didTransform = false;
624
+ const transformDef = {};
625
+
626
+ if ( texture.offset.x !== 0 || texture.offset.y !== 0 ) {
627
+
628
+ transformDef.offset = texture.offset.toArray();
629
+ didTransform = true;
630
+
631
+ }
632
+
633
+ if ( texture.rotation !== 0 ) {
634
+
635
+ transformDef.rotation = texture.rotation;
636
+ didTransform = true;
637
+
638
+ }
639
+
640
+ if ( texture.repeat.x !== 1 || texture.repeat.y !== 1 ) {
641
+
642
+ transformDef.scale = texture.repeat.toArray();
643
+ didTransform = true;
644
+
645
+ }
646
+
647
+ if ( didTransform ) {
648
+
649
+ mapDef.extensions = mapDef.extensions || {};
650
+ mapDef.extensions[ 'KHR_texture_transform' ] = transformDef;
651
+ this.extensionsUsed[ 'KHR_texture_transform' ] = true;
652
+
653
+ }
654
+
655
+ }
656
+
657
+ buildMetalRoughTexture( metalnessMap, roughnessMap ) {
658
+
659
+ if ( metalnessMap === roughnessMap ) return metalnessMap;
660
+
661
+ function getEncodingConversion( map ) {
662
+
663
+ if ( map.encoding === THREE.sRGBEncoding ) {
664
+
665
+ return function SRGBToLinear( c ) {
666
+
667
+ return c < 0.04045 ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );
668
+
669
+ };
670
+
671
+ }
672
+
673
+ return function LinearToLinear( c ) {
674
+
675
+ return c;
676
+
677
+ };
678
+
679
+ }
680
+
681
+ console.warn( 'THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.' );
682
+ const metalness = metalnessMap?.image;
683
+ const roughness = roughnessMap?.image;
684
+ const width = Math.max( metalness?.width || 0, roughness?.width || 0 );
685
+ const height = Math.max( metalness?.height || 0, roughness?.height || 0 );
686
+ const canvas = getCanvas();
687
+ canvas.width = width;
688
+ canvas.height = height;
689
+ const context = canvas.getContext( '2d' );
690
+ context.fillStyle = '#00ffff';
691
+ context.fillRect( 0, 0, width, height );
692
+ const composite = context.getImageData( 0, 0, width, height );
693
+
694
+ if ( metalness ) {
695
+
696
+ context.drawImage( metalness, 0, 0, width, height );
697
+ const convert = getEncodingConversion( metalnessMap );
698
+ const data = context.getImageData( 0, 0, width, height ).data;
699
+
700
+ for ( let i = 2; i < data.length; i += 4 ) {
701
+
702
+ composite.data[ i ] = convert( data[ i ] / 256 ) * 256;
703
+
704
+ }
705
+
706
+ }
707
+
708
+ if ( roughness ) {
709
+
710
+ context.drawImage( roughness, 0, 0, width, height );
711
+ const convert = getEncodingConversion( roughnessMap );
712
+ const data = context.getImageData( 0, 0, width, height ).data;
713
+
714
+ for ( let i = 1; i < data.length; i += 4 ) {
715
+
716
+ composite.data[ i ] = convert( data[ i ] / 256 ) * 256;
717
+
718
+ }
719
+
720
+ }
721
+
722
+ context.putImageData( composite, 0, 0 ); //
723
+
724
+ const reference = metalnessMap || roughnessMap;
725
+ const texture = reference.clone();
726
+ texture.source = new THREE.Source( canvas );
727
+ texture.encoding = THREE.LinearEncoding;
728
+ return texture;
729
+
730
+ }
731
+ /**
732
+ * Process a buffer to append to the default one.
733
+ * @param {ArrayBuffer} buffer
734
+ * @return {Integer}
735
+ */
736
+
737
+
738
+ processBuffer( buffer ) {
739
+
740
+ const json = this.json;
741
+ const buffers = this.buffers;
742
+ if ( ! json.buffers ) json.buffers = [ {
743
+ byteLength: 0
744
+ } ]; // All buffers are merged before export.
745
+
746
+ buffers.push( buffer );
747
+ return 0;
748
+
749
+ }
750
+ /**
751
+ * Process and generate a BufferView
752
+ * @param {BufferAttribute} attribute
753
+ * @param {number} componentType
754
+ * @param {number} start
755
+ * @param {number} count
756
+ * @param {number} target (Optional) Target usage of the BufferView
757
+ * @return {Object}
758
+ */
759
+
760
+
761
+ processBufferView( attribute, componentType, start, count, target ) {
762
+
763
+ const json = this.json;
764
+ if ( ! json.bufferViews ) json.bufferViews = []; // Create a new dataview and dump the attribute's array into it
765
+
766
+ let componentSize;
767
+
768
+ if ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) {
769
+
770
+ componentSize = 1;
771
+
772
+ } else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) {
773
+
774
+ componentSize = 2;
775
+
776
+ } else {
777
+
778
+ componentSize = 4;
779
+
780
+ }
781
+
782
+ const byteLength = getPaddedBufferSize( count * attribute.itemSize * componentSize );
783
+ const dataView = new DataView( new ArrayBuffer( byteLength ) );
784
+ let offset = 0;
785
+
786
+ for ( let i = start; i < start + count; i ++ ) {
787
+
788
+ for ( let a = 0; a < attribute.itemSize; a ++ ) {
789
+
790
+ let value;
791
+
792
+ if ( attribute.itemSize > 4 ) {
793
+
794
+ // no support for interleaved data for itemSize > 4
795
+ value = attribute.array[ i * attribute.itemSize + a ];
796
+
797
+ } else {
798
+
799
+ if ( a === 0 ) value = attribute.getX( i ); else if ( a === 1 ) value = attribute.getY( i ); else if ( a === 2 ) value = attribute.getZ( i ); else if ( a === 3 ) value = attribute.getW( i );
800
+
801
+ }
802
+
803
+ if ( componentType === WEBGL_CONSTANTS.FLOAT ) {
804
+
805
+ dataView.setFloat32( offset, value, true );
806
+
807
+ } else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_INT ) {
808
+
809
+ dataView.setUint32( offset, value, true );
810
+
811
+ } else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) {
812
+
813
+ dataView.setUint16( offset, value, true );
814
+
815
+ } else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) {
816
+
817
+ dataView.setUint8( offset, value );
818
+
819
+ }
820
+
821
+ offset += componentSize;
822
+
823
+ }
824
+
825
+ }
826
+
827
+ const bufferViewDef = {
828
+ buffer: this.processBuffer( dataView.buffer ),
829
+ byteOffset: this.byteOffset,
830
+ byteLength: byteLength
831
+ };
832
+ if ( target !== undefined ) bufferViewDef.target = target;
833
+
834
+ if ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {
835
+
836
+ // Only define byteStride for vertex attributes.
837
+ bufferViewDef.byteStride = attribute.itemSize * componentSize;
838
+
839
+ }
840
+
841
+ this.byteOffset += byteLength;
842
+ json.bufferViews.push( bufferViewDef ); // @TODO Merge bufferViews where possible.
843
+
844
+ const output = {
845
+ id: json.bufferViews.length - 1,
846
+ byteLength: 0
847
+ };
848
+ return output;
849
+
850
+ }
851
+ /**
852
+ * Process and generate a BufferView from an image Blob.
853
+ * @param {Blob} blob
854
+ * @return {Promise<Integer>}
855
+ */
856
+
857
+
858
+ processBufferViewImage( blob ) {
859
+
860
+ const writer = this;
861
+ const json = writer.json;
862
+ if ( ! json.bufferViews ) json.bufferViews = [];
863
+ return new Promise( function ( resolve ) {
864
+
865
+ const reader = new FileReader();
866
+ reader.readAsArrayBuffer( blob );
867
+
868
+ reader.onloadend = function () {
869
+
870
+ const buffer = getPaddedArrayBuffer( reader.result );
871
+ const bufferViewDef = {
872
+ buffer: writer.processBuffer( buffer ),
873
+ byteOffset: writer.byteOffset,
874
+ byteLength: buffer.byteLength
875
+ };
876
+ writer.byteOffset += buffer.byteLength;
877
+ resolve( json.bufferViews.push( bufferViewDef ) - 1 );
878
+
879
+ };
880
+
881
+ } );
882
+
883
+ }
884
+ /**
885
+ * Process attribute to generate an accessor
886
+ * @param {BufferAttribute} attribute Attribute to process
887
+ * @param {THREE.BufferGeometry} geometry (Optional) Geometry used for truncated draw range
888
+ * @param {Integer} start (Optional)
889
+ * @param {Integer} count (Optional)
890
+ * @return {Integer|null} Index of the processed accessor on the "accessors" array
891
+ */
892
+
893
+
894
+ processAccessor( attribute, geometry, start, count ) {
895
+
896
+ const options = this.options;
897
+ const json = this.json;
898
+ const types = {
899
+ 1: 'SCALAR',
900
+ 2: 'VEC2',
901
+ 3: 'VEC3',
902
+ 4: 'VEC4',
903
+ 16: 'MAT4'
904
+ };
905
+ let componentType; // Detect the component type of the attribute array (float, uint or ushort)
906
+
907
+ if ( attribute.array.constructor === Float32Array ) {
908
+
909
+ componentType = WEBGL_CONSTANTS.FLOAT;
910
+
911
+ } else if ( attribute.array.constructor === Uint32Array ) {
912
+
913
+ componentType = WEBGL_CONSTANTS.UNSIGNED_INT;
914
+
915
+ } else if ( attribute.array.constructor === Uint16Array ) {
916
+
917
+ componentType = WEBGL_CONSTANTS.UNSIGNED_SHORT;
918
+
919
+ } else if ( attribute.array.constructor === Uint8Array ) {
920
+
921
+ componentType = WEBGL_CONSTANTS.UNSIGNED_BYTE;
922
+
923
+ } else {
924
+
925
+ throw new Error( 'THREE.GLTFExporter: Unsupported bufferAttribute component type.' );
926
+
927
+ }
928
+
929
+ if ( start === undefined ) start = 0;
930
+ if ( count === undefined ) count = attribute.count; // @TODO Indexed buffer geometry with drawRange not supported yet
931
+
932
+ if ( options.truncateDrawRange && geometry !== undefined && geometry.index === null ) {
933
+
934
+ const end = start + count;
935
+ const end2 = geometry.drawRange.count === Infinity ? attribute.count : geometry.drawRange.start + geometry.drawRange.count;
936
+ start = Math.max( start, geometry.drawRange.start );
937
+ count = Math.min( end, end2 ) - start;
938
+ if ( count < 0 ) count = 0;
939
+
940
+ } // Skip creating an accessor if the attribute doesn't have data to export
941
+
942
+
943
+ if ( count === 0 ) return null;
944
+ const minMax = getMinMax( attribute, start, count );
945
+ let bufferViewTarget; // If geometry isn't provided, don't infer the target usage of the bufferView. For
946
+ // animation samplers, target must not be set.
947
+
948
+ if ( geometry !== undefined ) {
949
+
950
+ bufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER;
951
+
952
+ }
953
+
954
+ const bufferView = this.processBufferView( attribute, componentType, start, count, bufferViewTarget );
955
+ const accessorDef = {
956
+ bufferView: bufferView.id,
957
+ byteOffset: bufferView.byteOffset,
958
+ componentType: componentType,
959
+ count: count,
960
+ max: minMax.max,
961
+ min: minMax.min,
962
+ type: types[ attribute.itemSize ]
963
+ };
964
+ if ( attribute.normalized === true ) accessorDef.normalized = true;
965
+ if ( ! json.accessors ) json.accessors = [];
966
+ return json.accessors.push( accessorDef ) - 1;
967
+
968
+ }
969
+ /**
970
+ * Process image
971
+ * @param {Image} image to process
972
+ * @param {Integer} format of the image (THREE.RGBAFormat)
973
+ * @param {Boolean} flipY before writing out the image
974
+ * @param {String} mimeType export format
975
+ * @return {Integer} Index of the processed texture in the "images" array
976
+ */
977
+
978
+
979
+ processImage( image, format, flipY, mimeType = 'image/png' ) {
980
+
981
+ const writer = this;
982
+ const cache = writer.cache;
983
+ const json = writer.json;
984
+ const options = writer.options;
985
+ const pending = writer.pending;
986
+ if ( ! cache.images.has( image ) ) cache.images.set( image, {} );
987
+ const cachedImages = cache.images.get( image );
988
+ const key = mimeType + ':flipY/' + flipY.toString();
989
+ if ( cachedImages[ key ] !== undefined ) return cachedImages[ key ];
990
+ if ( ! json.images ) json.images = [];
991
+ const imageDef = {
992
+ mimeType: mimeType
993
+ };
994
+ const canvas = getCanvas();
995
+ canvas.width = Math.min( image.width, options.maxTextureSize );
996
+ canvas.height = Math.min( image.height, options.maxTextureSize );
997
+ const ctx = canvas.getContext( '2d' );
998
+
999
+ if ( flipY === true ) {
1000
+
1001
+ ctx.translate( 0, canvas.height );
1002
+ ctx.scale( 1, - 1 );
1003
+
1004
+ }
1005
+
1006
+ if ( image.data !== undefined ) {
1007
+
1008
+ // THREE.DataTexture
1009
+ if ( format !== THREE.RGBAFormat ) {
1010
+
1011
+ console.error( 'GLTFExporter: Only THREE.RGBAFormat is supported.' );
1012
+
1013
+ }
1014
+
1015
+ if ( image.width > options.maxTextureSize || image.height > options.maxTextureSize ) {
1016
+
1017
+ console.warn( 'GLTFExporter: Image size is bigger than maxTextureSize', image );
1018
+
1019
+ }
1020
+
1021
+ const data = new Uint8ClampedArray( image.height * image.width * 4 );
1022
+
1023
+ for ( let i = 0; i < data.length; i += 4 ) {
1024
+
1025
+ data[ i + 0 ] = image.data[ i + 0 ];
1026
+ data[ i + 1 ] = image.data[ i + 1 ];
1027
+ data[ i + 2 ] = image.data[ i + 2 ];
1028
+ data[ i + 3 ] = image.data[ i + 3 ];
1029
+
1030
+ }
1031
+
1032
+ ctx.putImageData( new ImageData( data, image.width, image.height ), 0, 0 );
1033
+
1034
+ } else {
1035
+
1036
+ ctx.drawImage( image, 0, 0, canvas.width, canvas.height );
1037
+
1038
+ }
1039
+
1040
+ if ( options.binary === true ) {
1041
+
1042
+ pending.push( getToBlobPromise( canvas, mimeType ).then( blob => writer.processBufferViewImage( blob ) ).then( bufferViewIndex => {
1043
+
1044
+ imageDef.bufferView = bufferViewIndex;
1045
+
1046
+ } ) );
1047
+
1048
+ } else {
1049
+
1050
+ if ( canvas.toDataURL !== undefined ) {
1051
+
1052
+ imageDef.uri = canvas.toDataURL( mimeType );
1053
+
1054
+ } else {
1055
+
1056
+ pending.push( getToBlobPromise( canvas, mimeType ).then( blob => new FileReader().readAsDataURL( blob ) ).then( dataURL => {
1057
+
1058
+ imageDef.uri = dataURL;
1059
+
1060
+ } ) );
1061
+
1062
+ }
1063
+
1064
+ }
1065
+
1066
+ const index = json.images.push( imageDef ) - 1;
1067
+ cachedImages[ key ] = index;
1068
+ return index;
1069
+
1070
+ }
1071
+ /**
1072
+ * Process sampler
1073
+ * @param {Texture} map Texture to process
1074
+ * @return {Integer} Index of the processed texture in the "samplers" array
1075
+ */
1076
+
1077
+
1078
+ processSampler( map ) {
1079
+
1080
+ const json = this.json;
1081
+ if ( ! json.samplers ) json.samplers = [];
1082
+ const samplerDef = {
1083
+ magFilter: THREE_TO_WEBGL[ map.magFilter ],
1084
+ minFilter: THREE_TO_WEBGL[ map.minFilter ],
1085
+ wrapS: THREE_TO_WEBGL[ map.wrapS ],
1086
+ wrapT: THREE_TO_WEBGL[ map.wrapT ]
1087
+ };
1088
+ return json.samplers.push( samplerDef ) - 1;
1089
+
1090
+ }
1091
+ /**
1092
+ * Process texture
1093
+ * @param {Texture} map Map to process
1094
+ * @return {Integer} Index of the processed texture in the "textures" array
1095
+ */
1096
+
1097
+
1098
+ processTexture( map ) {
1099
+
1100
+ const cache = this.cache;
1101
+ const json = this.json;
1102
+ if ( cache.textures.has( map ) ) return cache.textures.get( map );
1103
+ if ( ! json.textures ) json.textures = [];
1104
+ let mimeType = map.userData.mimeType;
1105
+ if ( mimeType === 'image/webp' ) mimeType = 'image/png';
1106
+ const textureDef = {
1107
+ sampler: this.processSampler( map ),
1108
+ source: this.processImage( map.image, map.format, map.flipY, mimeType )
1109
+ };
1110
+ if ( map.name ) textureDef.name = map.name;
1111
+
1112
+ this._invokeAll( function ( ext ) {
1113
+
1114
+ ext.writeTexture && ext.writeTexture( map, textureDef );
1115
+
1116
+ } );
1117
+
1118
+ const index = json.textures.push( textureDef ) - 1;
1119
+ cache.textures.set( map, index );
1120
+ return index;
1121
+
1122
+ }
1123
+ /**
1124
+ * Process material
1125
+ * @param {THREE.Material} material Material to process
1126
+ * @return {Integer|null} Index of the processed material in the "materials" array
1127
+ */
1128
+
1129
+
1130
+ processMaterial( material ) {
1131
+
1132
+ const cache = this.cache;
1133
+ const json = this.json;
1134
+ if ( cache.materials.has( material ) ) return cache.materials.get( material );
1135
+
1136
+ if ( material.isShaderMaterial ) {
1137
+
1138
+ console.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );
1139
+ return null;
1140
+
1141
+ }
1142
+
1143
+ if ( ! json.materials ) json.materials = []; // @QUESTION Should we avoid including any attribute that has the default value?
1144
+
1145
+ const materialDef = {
1146
+ pbrMetallicRoughness: {}
1147
+ };
1148
+
1149
+ if ( material.isMeshStandardMaterial !== true && material.isMeshBasicMaterial !== true ) {
1150
+
1151
+ console.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' );
1152
+
1153
+ } // pbrMetallicRoughness.baseColorFactor
1154
+
1155
+
1156
+ const color = material.color.toArray().concat( [ material.opacity ] );
1157
+
1158
+ if ( ! equalArray( color, [ 1, 1, 1, 1 ] ) ) {
1159
+
1160
+ materialDef.pbrMetallicRoughness.baseColorFactor = color;
1161
+
1162
+ }
1163
+
1164
+ if ( material.isMeshStandardMaterial ) {
1165
+
1166
+ materialDef.pbrMetallicRoughness.metallicFactor = material.metalness;
1167
+ materialDef.pbrMetallicRoughness.roughnessFactor = material.roughness;
1168
+
1169
+ } else {
1170
+
1171
+ materialDef.pbrMetallicRoughness.metallicFactor = 0.5;
1172
+ materialDef.pbrMetallicRoughness.roughnessFactor = 0.5;
1173
+
1174
+ } // pbrMetallicRoughness.metallicRoughnessTexture
1175
+
1176
+
1177
+ if ( material.metalnessMap || material.roughnessMap ) {
1178
+
1179
+ const metalRoughTexture = this.buildMetalRoughTexture( material.metalnessMap, material.roughnessMap );
1180
+ const metalRoughMapDef = {
1181
+ index: this.processTexture( metalRoughTexture )
1182
+ };
1183
+ this.applyTextureTransform( metalRoughMapDef, metalRoughTexture );
1184
+ materialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;
1185
+
1186
+ } // pbrMetallicRoughness.baseColorTexture or pbrSpecularGlossiness diffuseTexture
1187
+
1188
+
1189
+ if ( material.map ) {
1190
+
1191
+ const baseColorMapDef = {
1192
+ index: this.processTexture( material.map )
1193
+ };
1194
+ this.applyTextureTransform( baseColorMapDef, material.map );
1195
+ materialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;
1196
+
1197
+ }
1198
+
1199
+ if ( material.emissive ) {
1200
+
1201
+ // note: emissive components are limited to stay within the 0 - 1 range to accommodate glTF spec. see #21849 and #22000.
1202
+ const emissive = material.emissive.clone().multiplyScalar( material.emissiveIntensity );
1203
+ const maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );
1204
+
1205
+ if ( maxEmissiveComponent > 1 ) {
1206
+
1207
+ emissive.multiplyScalar( 1 / maxEmissiveComponent );
1208
+ console.warn( 'THREE.GLTFExporter: Some emissive components exceed 1; emissive has been limited' );
1209
+
1210
+ }
1211
+
1212
+ if ( maxEmissiveComponent > 0 ) {
1213
+
1214
+ materialDef.emissiveFactor = emissive.toArray();
1215
+
1216
+ } // emissiveTexture
1217
+
1218
+
1219
+ if ( material.emissiveMap ) {
1220
+
1221
+ const emissiveMapDef = {
1222
+ index: this.processTexture( material.emissiveMap )
1223
+ };
1224
+ this.applyTextureTransform( emissiveMapDef, material.emissiveMap );
1225
+ materialDef.emissiveTexture = emissiveMapDef;
1226
+
1227
+ }
1228
+
1229
+ } // normalTexture
1230
+
1231
+
1232
+ if ( material.normalMap ) {
1233
+
1234
+ const normalMapDef = {
1235
+ index: this.processTexture( material.normalMap )
1236
+ };
1237
+
1238
+ if ( material.normalScale && material.normalScale.x !== 1 ) {
1239
+
1240
+ // glTF normal scale is univariate. Ignore `y`, which may be flipped.
1241
+ // Context: https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995
1242
+ normalMapDef.scale = material.normalScale.x;
1243
+
1244
+ }
1245
+
1246
+ this.applyTextureTransform( normalMapDef, material.normalMap );
1247
+ materialDef.normalTexture = normalMapDef;
1248
+
1249
+ } // occlusionTexture
1250
+
1251
+
1252
+ if ( material.aoMap ) {
1253
+
1254
+ const occlusionMapDef = {
1255
+ index: this.processTexture( material.aoMap ),
1256
+ texCoord: 1
1257
+ };
1258
+
1259
+ if ( material.aoMapIntensity !== 1.0 ) {
1260
+
1261
+ occlusionMapDef.strength = material.aoMapIntensity;
1262
+
1263
+ }
1264
+
1265
+ this.applyTextureTransform( occlusionMapDef, material.aoMap );
1266
+ materialDef.occlusionTexture = occlusionMapDef;
1267
+
1268
+ } // alphaMode
1269
+
1270
+
1271
+ if ( material.transparent ) {
1272
+
1273
+ materialDef.alphaMode = 'BLEND';
1274
+
1275
+ } else {
1276
+
1277
+ if ( material.alphaTest > 0.0 ) {
1278
+
1279
+ materialDef.alphaMode = 'MASK';
1280
+ materialDef.alphaCutoff = material.alphaTest;
1281
+
1282
+ }
1283
+
1284
+ } // doubleSided
1285
+
1286
+
1287
+ if ( material.side === THREE.DoubleSide ) materialDef.doubleSided = true;
1288
+ if ( material.name !== '' ) materialDef.name = material.name;
1289
+ this.serializeUserData( material, materialDef );
1290
+
1291
+ this._invokeAll( function ( ext ) {
1292
+
1293
+ ext.writeMaterial && ext.writeMaterial( material, materialDef );
1294
+
1295
+ } );
1296
+
1297
+ const index = json.materials.push( materialDef ) - 1;
1298
+ cache.materials.set( material, index );
1299
+ return index;
1300
+
1301
+ }
1302
+ /**
1303
+ * Process mesh
1304
+ * @param {THREE.Mesh} mesh Mesh to process
1305
+ * @return {Integer|null} Index of the processed mesh in the "meshes" array
1306
+ */
1307
+
1308
+
1309
+ processMesh( mesh ) {
1310
+
1311
+ const cache = this.cache;
1312
+ const json = this.json;
1313
+ const meshCacheKeyParts = [ mesh.geometry.uuid ];
1314
+
1315
+ if ( Array.isArray( mesh.material ) ) {
1316
+
1317
+ for ( let i = 0, l = mesh.material.length; i < l; i ++ ) {
1318
+
1319
+ meshCacheKeyParts.push( mesh.material[ i ].uuid );
1320
+
1321
+ }
1322
+
1323
+ } else {
1324
+
1325
+ meshCacheKeyParts.push( mesh.material.uuid );
1326
+
1327
+ }
1328
+
1329
+ const meshCacheKey = meshCacheKeyParts.join( ':' );
1330
+ if ( cache.meshes.has( meshCacheKey ) ) return cache.meshes.get( meshCacheKey );
1331
+ const geometry = mesh.geometry;
1332
+ let mode; // Use the correct mode
1333
+
1334
+ if ( mesh.isLineSegments ) {
1335
+
1336
+ mode = WEBGL_CONSTANTS.LINES;
1337
+
1338
+ } else if ( mesh.isLineLoop ) {
1339
+
1340
+ mode = WEBGL_CONSTANTS.LINE_LOOP;
1341
+
1342
+ } else if ( mesh.isLine ) {
1343
+
1344
+ mode = WEBGL_CONSTANTS.LINE_STRIP;
1345
+
1346
+ } else if ( mesh.isPoints ) {
1347
+
1348
+ mode = WEBGL_CONSTANTS.POINTS;
1349
+
1350
+ } else {
1351
+
1352
+ mode = mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES;
1353
+
1354
+ }
1355
+
1356
+ const meshDef = {};
1357
+ const attributes = {};
1358
+ const primitives = [];
1359
+ const targets = []; // Conversion between attributes names in threejs and gltf spec
1360
+
1361
+ const nameConversion = {
1362
+ uv: 'TEXCOORD_0',
1363
+ uv2: 'TEXCOORD_1',
1364
+ color: 'COLOR_0',
1365
+ skinWeight: 'WEIGHTS_0',
1366
+ skinIndex: 'JOINTS_0'
1367
+ };
1368
+ const originalNormal = geometry.getAttribute( 'normal' );
1369
+
1370
+ if ( originalNormal !== undefined && ! this.isNormalizedNormalAttribute( originalNormal ) ) {
1371
+
1372
+ console.warn( 'THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.' );
1373
+ geometry.setAttribute( 'normal', this.createNormalizedNormalAttribute( originalNormal ) );
1374
+
1375
+ } // @QUESTION Detect if .vertexColors = true?
1376
+ // For every attribute create an accessor
1377
+
1378
+
1379
+ let modifiedAttribute = null;
1380
+
1381
+ for ( let attributeName in geometry.attributes ) {
1382
+
1383
+ // Ignore morph target attributes, which are exported later.
1384
+ if ( attributeName.slice( 0, 5 ) === 'morph' ) continue;
1385
+ const attribute = geometry.attributes[ attributeName ];
1386
+ attributeName = nameConversion[ attributeName ] || attributeName.toUpperCase(); // Prefix all geometry attributes except the ones specifically
1387
+ // listed in the spec; non-spec attributes are considered custom.
1388
+
1389
+ const validVertexAttributes = /^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/;
1390
+ if ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName;
1391
+
1392
+ if ( cache.attributes.has( this.getUID( attribute ) ) ) {
1393
+
1394
+ attributes[ attributeName ] = cache.attributes.get( this.getUID( attribute ) );
1395
+ continue;
1396
+
1397
+ } // JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT.
1398
+
1399
+
1400
+ modifiedAttribute = null;
1401
+ const array = attribute.array;
1402
+
1403
+ if ( attributeName === 'JOINTS_0' && ! ( array instanceof Uint16Array ) && ! ( array instanceof Uint8Array ) ) {
1404
+
1405
+ console.warn( 'GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.' );
1406
+ modifiedAttribute = new THREE.BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized );
1407
+
1408
+ }
1409
+
1410
+ const accessor = this.processAccessor( modifiedAttribute || attribute, geometry );
1411
+
1412
+ if ( accessor !== null ) {
1413
+
1414
+ attributes[ attributeName ] = accessor;
1415
+ cache.attributes.set( this.getUID( attribute ), accessor );
1416
+
1417
+ }
1418
+
1419
+ }
1420
+
1421
+ if ( originalNormal !== undefined ) geometry.setAttribute( 'normal', originalNormal ); // Skip if no exportable attributes found
1422
+
1423
+ if ( Object.keys( attributes ).length === 0 ) return null; // Morph targets
1424
+
1425
+ if ( mesh.morphTargetInfluences !== undefined && mesh.morphTargetInfluences.length > 0 ) {
1426
+
1427
+ const weights = [];
1428
+ const targetNames = [];
1429
+ const reverseDictionary = {};
1430
+
1431
+ if ( mesh.morphTargetDictionary !== undefined ) {
1432
+
1433
+ for ( const key in mesh.morphTargetDictionary ) {
1434
+
1435
+ reverseDictionary[ mesh.morphTargetDictionary[ key ] ] = key;
1436
+
1437
+ }
1438
+
1439
+ }
1440
+
1441
+ for ( let i = 0; i < mesh.morphTargetInfluences.length; ++ i ) {
1442
+
1443
+ const target = {};
1444
+ let warned = false;
1445
+
1446
+ for ( const attributeName in geometry.morphAttributes ) {
1447
+
1448
+ // glTF 2.0 morph supports only POSITION/NORMAL/TANGENT.
1449
+ // Three.js doesn't support TANGENT yet.
1450
+ if ( attributeName !== 'position' && attributeName !== 'normal' ) {
1451
+
1452
+ if ( ! warned ) {
1453
+
1454
+ console.warn( 'GLTFExporter: Only POSITION and NORMAL morph are supported.' );
1455
+ warned = true;
1456
+
1457
+ }
1458
+
1459
+ continue;
1460
+
1461
+ }
1462
+
1463
+ const attribute = geometry.morphAttributes[ attributeName ][ i ];
1464
+ const gltfAttributeName = attributeName.toUpperCase(); // Three.js morph attribute has absolute values while the one of glTF has relative values.
1465
+ //
1466
+ // glTF 2.0 Specification:
1467
+ // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets
1468
+
1469
+ const baseAttribute = geometry.attributes[ attributeName ];
1470
+
1471
+ if ( cache.attributes.has( this.getUID( attribute, true ) ) ) {
1472
+
1473
+ target[ gltfAttributeName ] = cache.attributes.get( this.getUID( attribute, true ) );
1474
+ continue;
1475
+
1476
+ } // Clones attribute not to override
1477
+
1478
+
1479
+ const relativeAttribute = attribute.clone();
1480
+
1481
+ if ( ! geometry.morphTargetsRelative ) {
1482
+
1483
+ for ( let j = 0, jl = attribute.count; j < jl; j ++ ) {
1484
+
1485
+ relativeAttribute.setXYZ( j, attribute.getX( j ) - baseAttribute.getX( j ), attribute.getY( j ) - baseAttribute.getY( j ), attribute.getZ( j ) - baseAttribute.getZ( j ) );
1486
+
1487
+ }
1488
+
1489
+ }
1490
+
1491
+ target[ gltfAttributeName ] = this.processAccessor( relativeAttribute, geometry );
1492
+ cache.attributes.set( this.getUID( baseAttribute, true ), target[ gltfAttributeName ] );
1493
+
1494
+ }
1495
+
1496
+ targets.push( target );
1497
+ weights.push( mesh.morphTargetInfluences[ i ] );
1498
+ if ( mesh.morphTargetDictionary !== undefined ) targetNames.push( reverseDictionary[ i ] );
1499
+
1500
+ }
1501
+
1502
+ meshDef.weights = weights;
1503
+
1504
+ if ( targetNames.length > 0 ) {
1505
+
1506
+ meshDef.extras = {};
1507
+ meshDef.extras.targetNames = targetNames;
1508
+
1509
+ }
1510
+
1511
+ }
1512
+
1513
+ const isMultiMaterial = Array.isArray( mesh.material );
1514
+ if ( isMultiMaterial && geometry.groups.length === 0 ) return null;
1515
+ const materials = isMultiMaterial ? mesh.material : [ mesh.material ];
1516
+ const groups = isMultiMaterial ? geometry.groups : [ {
1517
+ materialIndex: 0,
1518
+ start: undefined,
1519
+ count: undefined
1520
+ } ];
1521
+
1522
+ for ( let i = 0, il = groups.length; i < il; i ++ ) {
1523
+
1524
+ const primitive = {
1525
+ mode: mode,
1526
+ attributes: attributes
1527
+ };
1528
+ this.serializeUserData( geometry, primitive );
1529
+ if ( targets.length > 0 ) primitive.targets = targets;
1530
+
1531
+ if ( geometry.index !== null ) {
1532
+
1533
+ let cacheKey = this.getUID( geometry.index );
1534
+
1535
+ if ( groups[ i ].start !== undefined || groups[ i ].count !== undefined ) {
1536
+
1537
+ cacheKey += ':' + groups[ i ].start + ':' + groups[ i ].count;
1538
+
1539
+ }
1540
+
1541
+ if ( cache.attributes.has( cacheKey ) ) {
1542
+
1543
+ primitive.indices = cache.attributes.get( cacheKey );
1544
+
1545
+ } else {
1546
+
1547
+ primitive.indices = this.processAccessor( geometry.index, geometry, groups[ i ].start, groups[ i ].count );
1548
+ cache.attributes.set( cacheKey, primitive.indices );
1549
+
1550
+ }
1551
+
1552
+ if ( primitive.indices === null ) delete primitive.indices;
1553
+
1554
+ }
1555
+
1556
+ const material = this.processMaterial( materials[ groups[ i ].materialIndex ] );
1557
+ if ( material !== null ) primitive.material = material;
1558
+ primitives.push( primitive );
1559
+
1560
+ }
1561
+
1562
+ meshDef.primitives = primitives;
1563
+ if ( ! json.meshes ) json.meshes = [];
1564
+
1565
+ this._invokeAll( function ( ext ) {
1566
+
1567
+ ext.writeMesh && ext.writeMesh( mesh, meshDef );
1568
+
1569
+ } );
1570
+
1571
+ const index = json.meshes.push( meshDef ) - 1;
1572
+ cache.meshes.set( meshCacheKey, index );
1573
+ return index;
1574
+
1575
+ }
1576
+ /**
1577
+ * Process camera
1578
+ * @param {THREE.Camera} camera Camera to process
1579
+ * @return {Integer} Index of the processed mesh in the "camera" array
1580
+ */
1581
+
1582
+
1583
+ processCamera( camera ) {
1584
+
1585
+ const json = this.json;
1586
+ if ( ! json.cameras ) json.cameras = [];
1587
+ const isOrtho = camera.isOrthographicCamera;
1588
+ const cameraDef = {
1589
+ type: isOrtho ? 'orthographic' : 'perspective'
1590
+ };
1591
+
1592
+ if ( isOrtho ) {
1593
+
1594
+ cameraDef.orthographic = {
1595
+ xmag: camera.right * 2,
1596
+ ymag: camera.top * 2,
1597
+ zfar: camera.far <= 0 ? 0.001 : camera.far,
1598
+ znear: camera.near < 0 ? 0 : camera.near
1599
+ };
1600
+
1601
+ } else {
1602
+
1603
+ cameraDef.perspective = {
1604
+ aspectRatio: camera.aspect,
1605
+ yfov: THREE.MathUtils.degToRad( camera.fov ),
1606
+ zfar: camera.far <= 0 ? 0.001 : camera.far,
1607
+ znear: camera.near < 0 ? 0 : camera.near
1608
+ };
1609
+
1610
+ } // Question: Is saving "type" as name intentional?
1611
+
1612
+
1613
+ if ( camera.name !== '' ) cameraDef.name = camera.type;
1614
+ return json.cameras.push( cameraDef ) - 1;
1615
+
1616
+ }
1617
+ /**
1618
+ * Creates glTF animation entry from AnimationClip object.
1619
+ *
1620
+ * Status:
1621
+ * - Only properties listed in PATH_PROPERTIES may be animated.
1622
+ *
1623
+ * @param {THREE.AnimationClip} clip
1624
+ * @param {THREE.Object3D} root
1625
+ * @return {number|null}
1626
+ */
1627
+
1628
+
1629
+ processAnimation( clip, root ) {
1630
+
1631
+ const json = this.json;
1632
+ const nodeMap = this.nodeMap;
1633
+ if ( ! json.animations ) json.animations = [];
1634
+ clip = GLTFExporter.Utils.mergeMorphTargetTracks( clip.clone(), root );
1635
+ const tracks = clip.tracks;
1636
+ const channels = [];
1637
+ const samplers = [];
1638
+
1639
+ for ( let i = 0; i < tracks.length; ++ i ) {
1640
+
1641
+ const track = tracks[ i ];
1642
+ const trackBinding = THREE.PropertyBinding.parseTrackName( track.name );
1643
+ let trackNode = THREE.PropertyBinding.findNode( root, trackBinding.nodeName );
1644
+ const trackProperty = PATH_PROPERTIES[ trackBinding.propertyName ];
1645
+
1646
+ if ( trackBinding.objectName === 'bones' ) {
1647
+
1648
+ if ( trackNode.isSkinnedMesh === true ) {
1649
+
1650
+ trackNode = trackNode.skeleton.getBoneByName( trackBinding.objectIndex );
1651
+
1652
+ } else {
1653
+
1654
+ trackNode = undefined;
1655
+
1656
+ }
1657
+
1658
+ }
1659
+
1660
+ if ( ! trackNode || ! trackProperty ) {
1661
+
1662
+ console.warn( 'THREE.GLTFExporter: Could not export animation track "%s".', track.name );
1663
+ return null;
1664
+
1665
+ }
1666
+
1667
+ const inputItemSize = 1;
1668
+ let outputItemSize = track.values.length / track.times.length;
1669
+
1670
+ if ( trackProperty === PATH_PROPERTIES.morphTargetInfluences ) {
1671
+
1672
+ outputItemSize /= trackNode.morphTargetInfluences.length;
1673
+
1674
+ }
1675
+
1676
+ let interpolation; // @TODO export CubicInterpolant(InterpolateSmooth) as CUBICSPLINE
1677
+ // Detecting glTF cubic spline interpolant by checking factory method's special property
1678
+ // GLTFCubicSplineInterpolant is a custom interpolant and track doesn't return
1679
+ // valid value from .getInterpolation().
1680
+
1681
+ if ( track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true ) {
1682
+
1683
+ interpolation = 'CUBICSPLINE'; // itemSize of CUBICSPLINE keyframe is 9
1684
+ // (VEC3 * 3: inTangent, splineVertex, and outTangent)
1685
+ // but needs to be stored as VEC3 so dividing by 3 here.
1686
+
1687
+ outputItemSize /= 3;
1688
+
1689
+ } else if ( track.getInterpolation() === THREE.InterpolateDiscrete ) {
1690
+
1691
+ interpolation = 'STEP';
1692
+
1693
+ } else {
1694
+
1695
+ interpolation = 'LINEAR';
1696
+
1697
+ }
1698
+
1699
+ samplers.push( {
1700
+ input: this.processAccessor( new THREE.BufferAttribute( track.times, inputItemSize ) ),
1701
+ output: this.processAccessor( new THREE.BufferAttribute( track.values, outputItemSize ) ),
1702
+ interpolation: interpolation
1703
+ } );
1704
+ channels.push( {
1705
+ sampler: samplers.length - 1,
1706
+ target: {
1707
+ node: nodeMap.get( trackNode ),
1708
+ path: trackProperty
1709
+ }
1710
+ } );
1711
+
1712
+ }
1713
+
1714
+ json.animations.push( {
1715
+ name: clip.name || 'clip_' + json.animations.length,
1716
+ samplers: samplers,
1717
+ channels: channels
1718
+ } );
1719
+ return json.animations.length - 1;
1720
+
1721
+ }
1722
+ /**
1723
+ * @param {THREE.Object3D} object
1724
+ * @return {number|null}
1725
+ */
1726
+
1727
+
1728
+ processSkin( object ) {
1729
+
1730
+ const json = this.json;
1731
+ const nodeMap = this.nodeMap;
1732
+ const node = json.nodes[ nodeMap.get( object ) ];
1733
+ const skeleton = object.skeleton;
1734
+ if ( skeleton === undefined ) return null;
1735
+ const rootJoint = object.skeleton.bones[ 0 ];
1736
+ if ( rootJoint === undefined ) return null;
1737
+ const joints = [];
1738
+ const inverseBindMatrices = new Float32Array( skeleton.bones.length * 16 );
1739
+ const temporaryBoneInverse = new THREE.Matrix4();
1740
+
1741
+ for ( let i = 0; i < skeleton.bones.length; ++ i ) {
1742
+
1743
+ joints.push( nodeMap.get( skeleton.bones[ i ] ) );
1744
+ temporaryBoneInverse.copy( skeleton.boneInverses[ i ] );
1745
+ temporaryBoneInverse.multiply( object.bindMatrix ).toArray( inverseBindMatrices, i * 16 );
1746
+
1747
+ }
1748
+
1749
+ if ( json.skins === undefined ) json.skins = [];
1750
+ json.skins.push( {
1751
+ inverseBindMatrices: this.processAccessor( new THREE.BufferAttribute( inverseBindMatrices, 16 ) ),
1752
+ joints: joints,
1753
+ skeleton: nodeMap.get( rootJoint )
1754
+ } );
1755
+ const skinIndex = node.skin = json.skins.length - 1;
1756
+ return skinIndex;
1757
+
1758
+ }
1759
+ /**
1760
+ * Process Object3D node
1761
+ * @param {THREE.Object3D} node Object3D to processNode
1762
+ * @return {Integer} Index of the node in the nodes list
1763
+ */
1764
+
1765
+
1766
+ processNode( object ) {
1767
+
1768
+ const json = this.json;
1769
+ const options = this.options;
1770
+ const nodeMap = this.nodeMap;
1771
+ if ( ! json.nodes ) json.nodes = [];
1772
+ const nodeDef = {};
1773
+
1774
+ if ( options.trs ) {
1775
+
1776
+ const rotation = object.quaternion.toArray();
1777
+ const position = object.position.toArray();
1778
+ const scale = object.scale.toArray();
1779
+
1780
+ if ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {
1781
+
1782
+ nodeDef.rotation = rotation;
1783
+
1784
+ }
1785
+
1786
+ if ( ! equalArray( position, [ 0, 0, 0 ] ) ) {
1787
+
1788
+ nodeDef.translation = position;
1789
+
1790
+ }
1791
+
1792
+ if ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {
1793
+
1794
+ nodeDef.scale = scale;
1795
+
1796
+ }
1797
+
1798
+ } else {
1799
+
1800
+ if ( object.matrixAutoUpdate ) {
1801
+
1802
+ object.updateMatrix();
1803
+
1804
+ }
1805
+
1806
+ if ( isIdentityMatrix( object.matrix ) === false ) {
1807
+
1808
+ nodeDef.matrix = object.matrix.elements;
1809
+
1810
+ }
1811
+
1812
+ } // We don't export empty strings name because it represents no-name in Three.js.
1813
+
1814
+
1815
+ if ( object.name !== '' ) nodeDef.name = String( object.name );
1816
+ this.serializeUserData( object, nodeDef );
1817
+
1818
+ if ( object.isMesh || object.isLine || object.isPoints ) {
1819
+
1820
+ const meshIndex = this.processMesh( object );
1821
+ if ( meshIndex !== null ) nodeDef.mesh = meshIndex;
1822
+
1823
+ } else if ( object.isCamera ) {
1824
+
1825
+ nodeDef.camera = this.processCamera( object );
1826
+
1827
+ }
1828
+
1829
+ if ( object.isSkinnedMesh ) this.skins.push( object );
1830
+
1831
+ if ( object.children.length > 0 ) {
1832
+
1833
+ const children = [];
1834
+
1835
+ for ( let i = 0, l = object.children.length; i < l; i ++ ) {
1836
+
1837
+ const child = object.children[ i ];
1838
+
1839
+ if ( child.visible || options.onlyVisible === false ) {
1840
+
1841
+ const nodeIndex = this.processNode( child );
1842
+ if ( nodeIndex !== null ) children.push( nodeIndex );
1843
+
1844
+ }
1845
+
1846
+ }
1847
+
1848
+ if ( children.length > 0 ) nodeDef.children = children;
1849
+
1850
+ }
1851
+
1852
+ this._invokeAll( function ( ext ) {
1853
+
1854
+ ext.writeNode && ext.writeNode( object, nodeDef );
1855
+
1856
+ } );
1857
+
1858
+ const nodeIndex = json.nodes.push( nodeDef ) - 1;
1859
+ nodeMap.set( object, nodeIndex );
1860
+ return nodeIndex;
1861
+
1862
+ }
1863
+ /**
1864
+ * Process THREE.Scene
1865
+ * @param {Scene} node THREE.Scene to process
1866
+ */
1867
+
1868
+
1869
+ processScene( scene ) {
1870
+
1871
+ const json = this.json;
1872
+ const options = this.options;
1873
+
1874
+ if ( ! json.scenes ) {
1875
+
1876
+ json.scenes = [];
1877
+ json.scene = 0;
1878
+
1879
+ }
1880
+
1881
+ const sceneDef = {};
1882
+ if ( scene.name !== '' ) sceneDef.name = scene.name;
1883
+ json.scenes.push( sceneDef );
1884
+ const nodes = [];
1885
+
1886
+ for ( let i = 0, l = scene.children.length; i < l; i ++ ) {
1887
+
1888
+ const child = scene.children[ i ];
1889
+
1890
+ if ( child.visible || options.onlyVisible === false ) {
1891
+
1892
+ const nodeIndex = this.processNode( child );
1893
+ if ( nodeIndex !== null ) nodes.push( nodeIndex );
1894
+
1895
+ }
1896
+
1897
+ }
1898
+
1899
+ if ( nodes.length > 0 ) sceneDef.nodes = nodes;
1900
+ this.serializeUserData( scene, sceneDef );
1901
+
1902
+ }
1903
+ /**
1904
+ * Creates a THREE.Scene to hold a list of objects and parse it
1905
+ * @param {Array} objects List of objects to process
1906
+ */
1907
+
1908
+
1909
+ processObjects( objects ) {
1910
+
1911
+ const scene = new THREE.Scene();
1912
+ scene.name = 'AuxScene';
1913
+
1914
+ for ( let i = 0; i < objects.length; i ++ ) {
1915
+
1916
+ // We push directly to children instead of calling `add` to prevent
1917
+ // modify the .parent and break its original scene and hierarchy
1918
+ scene.children.push( objects[ i ] );
1919
+
1920
+ }
1921
+
1922
+ this.processScene( scene );
1923
+
1924
+ }
1925
+ /**
1926
+ * @param {THREE.Object3D|Array<THREE.Object3D>} input
1927
+ */
1928
+
1929
+
1930
+ processInput( input ) {
1931
+
1932
+ const options = this.options;
1933
+ input = input instanceof Array ? input : [ input ];
1934
+
1935
+ this._invokeAll( function ( ext ) {
1936
+
1937
+ ext.beforeParse && ext.beforeParse( input );
1938
+
1939
+ } );
1940
+
1941
+ const objectsWithoutScene = [];
1942
+
1943
+ for ( let i = 0; i < input.length; i ++ ) {
1944
+
1945
+ if ( input[ i ] instanceof THREE.Scene ) {
1946
+
1947
+ this.processScene( input[ i ] );
1948
+
1949
+ } else {
1950
+
1951
+ objectsWithoutScene.push( input[ i ] );
1952
+
1953
+ }
1954
+
1955
+ }
1956
+
1957
+ if ( objectsWithoutScene.length > 0 ) this.processObjects( objectsWithoutScene );
1958
+
1959
+ for ( let i = 0; i < this.skins.length; ++ i ) {
1960
+
1961
+ this.processSkin( this.skins[ i ] );
1962
+
1963
+ }
1964
+
1965
+ for ( let i = 0; i < options.animations.length; ++ i ) {
1966
+
1967
+ this.processAnimation( options.animations[ i ], input[ 0 ] );
1968
+
1969
+ }
1970
+
1971
+ this._invokeAll( function ( ext ) {
1972
+
1973
+ ext.afterParse && ext.afterParse( input );
1974
+
1975
+ } );
1976
+
1977
+ }
1978
+
1979
+ _invokeAll( func ) {
1980
+
1981
+ for ( let i = 0, il = this.plugins.length; i < il; i ++ ) {
1982
+
1983
+ func( this.plugins[ i ] );
1984
+
1985
+ }
1986
+
1987
+ }
1988
+
1989
+ }
1990
+ /**
1991
+ * Punctual Lights Extension
1992
+ *
1993
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual
1994
+ */
1995
+
1996
+
1997
+ class GLTFLightExtension {
1998
+
1999
+ constructor( writer ) {
2000
+
2001
+ this.writer = writer;
2002
+ this.name = 'KHR_lights_punctual';
2003
+
2004
+ }
2005
+
2006
+ writeNode( light, nodeDef ) {
2007
+
2008
+ if ( ! light.isLight ) return;
2009
+
2010
+ if ( ! light.isDirectionalLight && ! light.isPointLight && ! light.isSpotLight ) {
2011
+
2012
+ console.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.', light );
2013
+ return;
2014
+
2015
+ }
2016
+
2017
+ const writer = this.writer;
2018
+ const json = writer.json;
2019
+ const extensionsUsed = writer.extensionsUsed;
2020
+ const lightDef = {};
2021
+ if ( light.name ) lightDef.name = light.name;
2022
+ lightDef.color = light.color.toArray();
2023
+ lightDef.intensity = light.intensity;
2024
+
2025
+ if ( light.isDirectionalLight ) {
2026
+
2027
+ lightDef.type = 'directional';
2028
+
2029
+ } else if ( light.isPointLight ) {
2030
+
2031
+ lightDef.type = 'point';
2032
+ if ( light.distance > 0 ) lightDef.range = light.distance;
2033
+
2034
+ } else if ( light.isSpotLight ) {
2035
+
2036
+ lightDef.type = 'spot';
2037
+ if ( light.distance > 0 ) lightDef.range = light.distance;
2038
+ lightDef.spot = {};
2039
+ lightDef.spot.innerConeAngle = ( light.penumbra - 1.0 ) * light.angle * - 1.0;
2040
+ lightDef.spot.outerConeAngle = light.angle;
2041
+
2042
+ }
2043
+
2044
+ if ( light.decay !== undefined && light.decay !== 2 ) {
2045
+
2046
+ console.warn( 'THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, ' + 'and expects light.decay=2.' );
2047
+
2048
+ }
2049
+
2050
+ if ( light.target && ( light.target.parent !== light || light.target.position.x !== 0 || light.target.position.y !== 0 || light.target.position.z !== - 1 ) ) {
2051
+
2052
+ console.warn( 'THREE.GLTFExporter: Light direction may be lost. For best results, ' + 'make light.target a child of the light with position 0,0,-1.' );
2053
+
2054
+ }
2055
+
2056
+ if ( ! extensionsUsed[ this.name ] ) {
2057
+
2058
+ json.extensions = json.extensions || {};
2059
+ json.extensions[ this.name ] = {
2060
+ lights: []
2061
+ };
2062
+ extensionsUsed[ this.name ] = true;
2063
+
2064
+ }
2065
+
2066
+ const lights = json.extensions[ this.name ].lights;
2067
+ lights.push( lightDef );
2068
+ nodeDef.extensions = nodeDef.extensions || {};
2069
+ nodeDef.extensions[ this.name ] = {
2070
+ light: lights.length - 1
2071
+ };
2072
+
2073
+ }
2074
+
2075
+ }
2076
+ /**
2077
+ * Unlit Materials Extension
2078
+ *
2079
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit
2080
+ */
2081
+
2082
+
2083
+ class GLTFMaterialsUnlitExtension {
2084
+
2085
+ constructor( writer ) {
2086
+
2087
+ this.writer = writer;
2088
+ this.name = 'KHR_materials_unlit';
2089
+
2090
+ }
2091
+
2092
+ writeMaterial( material, materialDef ) {
2093
+
2094
+ if ( ! material.isMeshBasicMaterial ) return;
2095
+ const writer = this.writer;
2096
+ const extensionsUsed = writer.extensionsUsed;
2097
+ materialDef.extensions = materialDef.extensions || {};
2098
+ materialDef.extensions[ this.name ] = {};
2099
+ extensionsUsed[ this.name ] = true;
2100
+ materialDef.pbrMetallicRoughness.metallicFactor = 0.0;
2101
+ materialDef.pbrMetallicRoughness.roughnessFactor = 0.9;
2102
+
2103
+ }
2104
+
2105
+ }
2106
+ /**
2107
+ * Specular-Glossiness Extension
2108
+ *
2109
+ * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness
2110
+ */
2111
+
2112
+
2113
+ class GLTFMaterialsPBRSpecularGlossiness {
2114
+
2115
+ constructor( writer ) {
2116
+
2117
+ this.writer = writer;
2118
+ this.name = 'KHR_materials_pbrSpecularGlossiness';
2119
+
2120
+ }
2121
+
2122
+ writeMaterial( material, materialDef ) {
2123
+
2124
+ if ( ! material.isGLTFSpecularGlossinessMaterial ) return;
2125
+ const writer = this.writer;
2126
+ const extensionsUsed = writer.extensionsUsed;
2127
+ const extensionDef = {};
2128
+
2129
+ if ( materialDef.pbrMetallicRoughness.baseColorFactor ) {
2130
+
2131
+ extensionDef.diffuseFactor = materialDef.pbrMetallicRoughness.baseColorFactor;
2132
+
2133
+ }
2134
+
2135
+ const specularFactor = [ 1, 1, 1 ];
2136
+ material.specular.toArray( specularFactor, 0 );
2137
+ extensionDef.specularFactor = specularFactor;
2138
+ extensionDef.glossinessFactor = material.glossiness;
2139
+
2140
+ if ( materialDef.pbrMetallicRoughness.baseColorTexture ) {
2141
+
2142
+ extensionDef.diffuseTexture = materialDef.pbrMetallicRoughness.baseColorTexture;
2143
+
2144
+ }
2145
+
2146
+ if ( material.specularMap ) {
2147
+
2148
+ const specularMapDef = {
2149
+ index: writer.processTexture( material.specularMap )
2150
+ };
2151
+ writer.applyTextureTransform( specularMapDef, material.specularMap );
2152
+ extensionDef.specularGlossinessTexture = specularMapDef;
2153
+
2154
+ }
2155
+
2156
+ materialDef.extensions = materialDef.extensions || {};
2157
+ materialDef.extensions[ this.name ] = extensionDef;
2158
+ extensionsUsed[ this.name ] = true;
2159
+
2160
+ }
2161
+
2162
+ }
2163
+ /**
2164
+ * Clearcoat Materials Extension
2165
+ *
2166
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat
2167
+ */
2168
+
2169
+
2170
+ class GLTFMaterialsClearcoatExtension {
2171
+
2172
+ constructor( writer ) {
2173
+
2174
+ this.writer = writer;
2175
+ this.name = 'KHR_materials_clearcoat';
2176
+
2177
+ }
2178
+
2179
+ writeMaterial( material, materialDef ) {
2180
+
2181
+ if ( ! material.isMeshPhysicalMaterial ) return;
2182
+ const writer = this.writer;
2183
+ const extensionsUsed = writer.extensionsUsed;
2184
+ const extensionDef = {};
2185
+ extensionDef.clearcoatFactor = material.clearcoat;
2186
+
2187
+ if ( material.clearcoatMap ) {
2188
+
2189
+ const clearcoatMapDef = {
2190
+ index: writer.processTexture( material.clearcoatMap )
2191
+ };
2192
+ writer.applyTextureTransform( clearcoatMapDef, material.clearcoatMap );
2193
+ extensionDef.clearcoatTexture = clearcoatMapDef;
2194
+
2195
+ }
2196
+
2197
+ extensionDef.clearcoatRoughnessFactor = material.clearcoatRoughness;
2198
+
2199
+ if ( material.clearcoatRoughnessMap ) {
2200
+
2201
+ const clearcoatRoughnessMapDef = {
2202
+ index: writer.processTexture( material.clearcoatRoughnessMap )
2203
+ };
2204
+ writer.applyTextureTransform( clearcoatRoughnessMapDef, material.clearcoatRoughnessMap );
2205
+ extensionDef.clearcoatRoughnessTexture = clearcoatRoughnessMapDef;
2206
+
2207
+ }
2208
+
2209
+ if ( material.clearcoatNormalMap ) {
2210
+
2211
+ const clearcoatNormalMapDef = {
2212
+ index: writer.processTexture( material.clearcoatNormalMap )
2213
+ };
2214
+ writer.applyTextureTransform( clearcoatNormalMapDef, material.clearcoatNormalMap );
2215
+ extensionDef.clearcoatNormalTexture = clearcoatNormalMapDef;
2216
+
2217
+ }
2218
+
2219
+ materialDef.extensions = materialDef.extensions || {};
2220
+ materialDef.extensions[ this.name ] = extensionDef;
2221
+ extensionsUsed[ this.name ] = true;
2222
+
2223
+ }
2224
+
2225
+ }
2226
+ /**
2227
+ * Iridescence Materials Extension
2228
+ *
2229
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence
2230
+ */
2231
+
2232
+
2233
+ class GLTFMaterialsIridescenceExtension {
2234
+
2235
+ constructor( writer ) {
2236
+
2237
+ this.writer = writer;
2238
+ this.name = 'KHR_materials_iridescence';
2239
+
2240
+ }
2241
+
2242
+ writeMaterial( material, materialDef ) {
2243
+
2244
+ if ( ! material.isMeshPhysicalMaterial ) return;
2245
+ const writer = this.writer;
2246
+ const extensionsUsed = writer.extensionsUsed;
2247
+ const extensionDef = {};
2248
+ extensionDef.iridescenceFactor = material.iridescence;
2249
+
2250
+ if ( material.iridescenceMap ) {
2251
+
2252
+ const iridescenceMapDef = {
2253
+ index: writer.processTexture( material.iridescenceMap )
2254
+ };
2255
+ writer.applyTextureTransform( iridescenceMapDef, material.iridescenceMap );
2256
+ extensionDef.iridescenceTexture = iridescenceMapDef;
2257
+
2258
+ }
2259
+
2260
+ extensionDef.iridescenceIor = material.iridescenceIOR;
2261
+ extensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessRange[ 0 ];
2262
+ extensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessRange[ 1 ];
2263
+
2264
+ if ( material.iridescenceThicknessMap ) {
2265
+
2266
+ const iridescenceThicknessMapDef = {
2267
+ index: writer.processTexture( material.iridescenceThicknessMap )
2268
+ };
2269
+ writer.applyTextureTransform( iridescenceThicknessMapDef, material.iridescenceThicknessMap );
2270
+ extensionDef.iridescenceThicknessTexture = iridescenceThicknessMapDef;
2271
+
2272
+ }
2273
+
2274
+ materialDef.extensions = materialDef.extensions || {};
2275
+ materialDef.extensions[ this.name ] = extensionDef;
2276
+ extensionsUsed[ this.name ] = true;
2277
+
2278
+ }
2279
+
2280
+ }
2281
+ /**
2282
+ * Transmission Materials Extension
2283
+ *
2284
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission
2285
+ */
2286
+
2287
+
2288
+ class GLTFMaterialsTransmissionExtension {
2289
+
2290
+ constructor( writer ) {
2291
+
2292
+ this.writer = writer;
2293
+ this.name = 'KHR_materials_transmission';
2294
+
2295
+ }
2296
+
2297
+ writeMaterial( material, materialDef ) {
2298
+
2299
+ if ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;
2300
+ const writer = this.writer;
2301
+ const extensionsUsed = writer.extensionsUsed;
2302
+ const extensionDef = {};
2303
+ extensionDef.transmissionFactor = material.transmission;
2304
+
2305
+ if ( material.transmissionMap ) {
2306
+
2307
+ const transmissionMapDef = {
2308
+ index: writer.processTexture( material.transmissionMap )
2309
+ };
2310
+ writer.applyTextureTransform( transmissionMapDef, material.transmissionMap );
2311
+ extensionDef.transmissionTexture = transmissionMapDef;
2312
+
2313
+ }
2314
+
2315
+ materialDef.extensions = materialDef.extensions || {};
2316
+ materialDef.extensions[ this.name ] = extensionDef;
2317
+ extensionsUsed[ this.name ] = true;
2318
+
2319
+ }
2320
+
2321
+ }
2322
+ /**
2323
+ * Materials Volume Extension
2324
+ *
2325
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume
2326
+ */
2327
+
2328
+
2329
+ class GLTFMaterialsVolumeExtension {
2330
+
2331
+ constructor( writer ) {
2332
+
2333
+ this.writer = writer;
2334
+ this.name = 'KHR_materials_volume';
2335
+
2336
+ }
2337
+
2338
+ writeMaterial( material, materialDef ) {
2339
+
2340
+ if ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;
2341
+ const writer = this.writer;
2342
+ const extensionsUsed = writer.extensionsUsed;
2343
+ const extensionDef = {};
2344
+ extensionDef.thicknessFactor = material.thickness;
2345
+
2346
+ if ( material.thicknessMap ) {
2347
+
2348
+ const thicknessMapDef = {
2349
+ index: writer.processTexture( material.thicknessMap )
2350
+ };
2351
+ writer.applyTextureTransform( thicknessMapDef, material.thicknessMap );
2352
+ extensionDef.thicknessTexture = thicknessMapDef;
2353
+
2354
+ }
2355
+
2356
+ extensionDef.attenuationDistance = material.attenuationDistance;
2357
+ extensionDef.attenuationColor = material.attenuationColor.toArray();
2358
+ materialDef.extensions = materialDef.extensions || {};
2359
+ materialDef.extensions[ this.name ] = extensionDef;
2360
+ extensionsUsed[ this.name ] = true;
2361
+
2362
+ }
2363
+
2364
+ }
2365
+ /**
2366
+ * Static utility functions
2367
+ */
2368
+
2369
+
2370
+ GLTFExporter.Utils = {
2371
+ insertKeyframe: function ( track, time ) {
2372
+
2373
+ const tolerance = 0.001; // 1ms
2374
+
2375
+ const valueSize = track.getValueSize();
2376
+ const times = new track.TimeBufferType( track.times.length + 1 );
2377
+ const values = new track.ValueBufferType( track.values.length + valueSize );
2378
+ const interpolant = track.createInterpolant( new track.ValueBufferType( valueSize ) );
2379
+ let index;
2380
+
2381
+ if ( track.times.length === 0 ) {
2382
+
2383
+ times[ 0 ] = time;
2384
+
2385
+ for ( let i = 0; i < valueSize; i ++ ) {
2386
+
2387
+ values[ i ] = 0;
2388
+
2389
+ }
2390
+
2391
+ index = 0;
2392
+
2393
+ } else if ( time < track.times[ 0 ] ) {
2394
+
2395
+ if ( Math.abs( track.times[ 0 ] - time ) < tolerance ) return 0;
2396
+ times[ 0 ] = time;
2397
+ times.set( track.times, 1 );
2398
+ values.set( interpolant.evaluate( time ), 0 );
2399
+ values.set( track.values, valueSize );
2400
+ index = 0;
2401
+
2402
+ } else if ( time > track.times[ track.times.length - 1 ] ) {
2403
+
2404
+ if ( Math.abs( track.times[ track.times.length - 1 ] - time ) < tolerance ) {
2405
+
2406
+ return track.times.length - 1;
2407
+
2408
+ }
2409
+
2410
+ times[ times.length - 1 ] = time;
2411
+ times.set( track.times, 0 );
2412
+ values.set( track.values, 0 );
2413
+ values.set( interpolant.evaluate( time ), track.values.length );
2414
+ index = times.length - 1;
2415
+
2416
+ } else {
2417
+
2418
+ for ( let i = 0; i < track.times.length; i ++ ) {
2419
+
2420
+ if ( Math.abs( track.times[ i ] - time ) < tolerance ) return i;
2421
+
2422
+ if ( track.times[ i ] < time && track.times[ i + 1 ] > time ) {
2423
+
2424
+ times.set( track.times.slice( 0, i + 1 ), 0 );
2425
+ times[ i + 1 ] = time;
2426
+ times.set( track.times.slice( i + 1 ), i + 2 );
2427
+ values.set( track.values.slice( 0, ( i + 1 ) * valueSize ), 0 );
2428
+ values.set( interpolant.evaluate( time ), ( i + 1 ) * valueSize );
2429
+ values.set( track.values.slice( ( i + 1 ) * valueSize ), ( i + 2 ) * valueSize );
2430
+ index = i + 1;
2431
+ break;
2432
+
2433
+ }
2434
+
2435
+ }
2436
+
2437
+ }
2438
+
2439
+ track.times = times;
2440
+ track.values = values;
2441
+ return index;
2442
+
2443
+ },
2444
+ mergeMorphTargetTracks: function ( clip, root ) {
2445
+
2446
+ const tracks = [];
2447
+ const mergedTracks = {};
2448
+ const sourceTracks = clip.tracks;
2449
+
2450
+ for ( let i = 0; i < sourceTracks.length; ++ i ) {
2451
+
2452
+ let sourceTrack = sourceTracks[ i ];
2453
+ const sourceTrackBinding = THREE.PropertyBinding.parseTrackName( sourceTrack.name );
2454
+ const sourceTrackNode = THREE.PropertyBinding.findNode( root, sourceTrackBinding.nodeName );
2455
+
2456
+ if ( sourceTrackBinding.propertyName !== 'morphTargetInfluences' || sourceTrackBinding.propertyIndex === undefined ) {
2457
+
2458
+ // Tracks that don't affect morph targets, or that affect all morph targets together, can be left as-is.
2459
+ tracks.push( sourceTrack );
2460
+ continue;
2461
+
2462
+ }
2463
+
2464
+ if ( sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete && sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear ) {
2465
+
2466
+ if ( sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {
2467
+
2468
+ // This should never happen, because glTF morph target animations
2469
+ // affect all targets already.
2470
+ throw new Error( 'THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.' );
2471
+
2472
+ }
2473
+
2474
+ console.warn( 'THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.' );
2475
+ sourceTrack = sourceTrack.clone();
2476
+ sourceTrack.setInterpolation( THREE.InterpolateLinear );
2477
+
2478
+ }
2479
+
2480
+ const targetCount = sourceTrackNode.morphTargetInfluences.length;
2481
+ const targetIndex = sourceTrackNode.morphTargetDictionary[ sourceTrackBinding.propertyIndex ];
2482
+
2483
+ if ( targetIndex === undefined ) {
2484
+
2485
+ throw new Error( 'THREE.GLTFExporter: Morph target name not found: ' + sourceTrackBinding.propertyIndex );
2486
+
2487
+ }
2488
+
2489
+ let mergedTrack; // If this is the first time we've seen this object, create a new
2490
+ // track to store merged keyframe data for each morph target.
2491
+
2492
+ if ( mergedTracks[ sourceTrackNode.uuid ] === undefined ) {
2493
+
2494
+ mergedTrack = sourceTrack.clone();
2495
+ const values = new mergedTrack.ValueBufferType( targetCount * mergedTrack.times.length );
2496
+
2497
+ for ( let j = 0; j < mergedTrack.times.length; j ++ ) {
2498
+
2499
+ values[ j * targetCount + targetIndex ] = mergedTrack.values[ j ];
2500
+
2501
+ } // We need to take into consideration the intended target node
2502
+ // of our original un-merged morphTarget animation.
2503
+
2504
+
2505
+ mergedTrack.name = ( sourceTrackBinding.nodeName || '' ) + '.morphTargetInfluences';
2506
+ mergedTrack.values = values;
2507
+ mergedTracks[ sourceTrackNode.uuid ] = mergedTrack;
2508
+ tracks.push( mergedTrack );
2509
+ continue;
2510
+
2511
+ }
2512
+
2513
+ const sourceInterpolant = sourceTrack.createInterpolant( new sourceTrack.ValueBufferType( 1 ) );
2514
+ mergedTrack = mergedTracks[ sourceTrackNode.uuid ]; // For every existing keyframe of the merged track, write a (possibly
2515
+ // interpolated) value from the source track.
2516
+
2517
+ for ( let j = 0; j < mergedTrack.times.length; j ++ ) {
2518
+
2519
+ mergedTrack.values[ j * targetCount + targetIndex ] = sourceInterpolant.evaluate( mergedTrack.times[ j ] );
2520
+
2521
+ } // For every existing keyframe of the source track, write a (possibly
2522
+ // new) keyframe to the merged track. Values from the previous loop may
2523
+ // be written again, but keyframes are de-duplicated.
2524
+
2525
+
2526
+ for ( let j = 0; j < sourceTrack.times.length; j ++ ) {
2527
+
2528
+ const keyframeIndex = this.insertKeyframe( mergedTrack, sourceTrack.times[ j ] );
2529
+ mergedTrack.values[ keyframeIndex * targetCount + targetIndex ] = sourceTrack.values[ j ];
2530
+
2531
+ }
2532
+
2533
+ }
2534
+
2535
+ clip.tracks = tracks;
2536
+ return clip;
2537
+
2538
+ }
2539
+ };
2540
+
2541
+ THREE.GLTFExporter = GLTFExporter;
2542
+
2543
+ } )();