super-three 0.179.0 → 0.184.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 (696) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +14522 -12207
  4. package/build/three.core.js +12005 -10954
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +2270 -1005
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +63 -18
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +16573 -7890
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +16533 -7888
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  15. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  16. package/examples/jsm/Addons.js +12 -4
  17. package/examples/jsm/animation/CCDIKSolver.js +8 -4
  18. package/examples/jsm/controls/ArcballControls.js +15 -12
  19. package/examples/jsm/controls/DragControls.js +9 -59
  20. package/examples/jsm/controls/FirstPersonControls.js +61 -57
  21. package/examples/jsm/controls/FlyControls.js +5 -1
  22. package/examples/jsm/controls/MapControls.js +55 -1
  23. package/examples/jsm/controls/OrbitControls.js +113 -10
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +9 -9
  26. package/examples/jsm/controls/TransformControls.js +35 -3
  27. package/examples/jsm/csm/CSM.js +2 -1
  28. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  29. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  30. package/examples/jsm/effects/AsciiEffect.js +8 -8
  31. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  32. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  33. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  34. package/examples/jsm/exporters/EXRExporter.js +2 -2
  35. package/examples/jsm/exporters/GLTFExporter.js +185 -34
  36. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  37. package/examples/jsm/exporters/PLYExporter.js +1 -1
  38. package/examples/jsm/exporters/USDZExporter.js +31 -5
  39. package/examples/jsm/geometries/DecalGeometry.js +3 -3
  40. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  41. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  42. package/examples/jsm/geometries/TextGeometry.js +21 -2
  43. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  44. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  45. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  46. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  47. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  48. package/examples/jsm/helpers/ViewHelper.js +110 -13
  49. package/examples/jsm/inspector/Extension.js +13 -0
  50. package/examples/jsm/inspector/Inspector.js +542 -0
  51. package/examples/jsm/inspector/RendererInspector.js +425 -0
  52. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  53. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  55. package/examples/jsm/inspector/tabs/Console.js +238 -0
  56. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  57. package/examples/jsm/inspector/tabs/Parameters.js +380 -0
  58. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  59. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  60. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  61. package/examples/jsm/inspector/tabs/Viewer.js +268 -0
  62. package/examples/jsm/inspector/ui/Graph.js +95 -0
  63. package/examples/jsm/inspector/ui/Item.js +170 -0
  64. package/examples/jsm/inspector/ui/List.js +75 -0
  65. package/examples/jsm/inspector/ui/Profiler.js +2072 -0
  66. package/examples/jsm/inspector/ui/Style.js +1667 -0
  67. package/examples/jsm/inspector/ui/Tab.js +265 -0
  68. package/examples/jsm/inspector/ui/Values.js +476 -0
  69. package/examples/jsm/inspector/ui/utils.js +69 -0
  70. package/examples/jsm/interaction/InteractionManager.js +226 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  73. package/examples/jsm/interactive/SelectionBox.js +30 -0
  74. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  75. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  76. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  77. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  79. package/examples/jsm/lines/Line2.js +3 -3
  80. package/examples/jsm/lines/LineGeometry.js +1 -1
  81. package/examples/jsm/lines/LineMaterial.js +7 -1
  82. package/examples/jsm/lines/LineSegments2.js +2 -2
  83. package/examples/jsm/lines/Wireframe.js +2 -2
  84. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  85. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  86. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  87. package/examples/jsm/loaders/3DMLoader.js +5 -4
  88. package/examples/jsm/loaders/3MFLoader.js +3 -3
  89. package/examples/jsm/loaders/AMFLoader.js +2 -2
  90. package/examples/jsm/loaders/ColladaLoader.js +27 -4029
  91. package/examples/jsm/loaders/DDSLoader.js +1 -1
  92. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  93. package/examples/jsm/loaders/EXRLoader.js +692 -53
  94. package/examples/jsm/loaders/FBXLoader.js +237 -39
  95. package/examples/jsm/loaders/FontLoader.js +23 -5
  96. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  97. package/examples/jsm/loaders/GLTFLoader.js +159 -185
  98. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  99. package/examples/jsm/loaders/HDRLoader.js +485 -0
  100. package/examples/jsm/loaders/KMZLoader.js +5 -5
  101. package/examples/jsm/loaders/KTX2Loader.js +162 -53
  102. package/examples/jsm/loaders/KTXLoader.js +2 -2
  103. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  104. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  105. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  106. package/examples/jsm/loaders/LWOLoader.js +9 -41
  107. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  108. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  109. package/examples/jsm/loaders/OBJLoader.js +1 -1
  110. package/examples/jsm/loaders/PCDLoader.js +4 -2
  111. package/examples/jsm/loaders/PDBLoader.js +1 -1
  112. package/examples/jsm/loaders/RGBELoader.js +7 -473
  113. package/examples/jsm/loaders/SVGLoader.js +4 -4
  114. package/examples/jsm/loaders/TDSLoader.js +0 -2
  115. package/examples/jsm/loaders/TGALoader.js +0 -2
  116. package/examples/jsm/loaders/TTFLoader.js +4 -4
  117. package/examples/jsm/loaders/USDLoader.js +100 -40
  118. package/examples/jsm/loaders/UltraHDRLoader.js +287 -162
  119. package/examples/jsm/loaders/VOXLoader.js +660 -117
  120. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  121. package/examples/jsm/loaders/VTKLoader.js +42 -25
  122. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  123. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  124. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  125. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  126. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  127. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  128. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  129. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  130. package/examples/jsm/math/ColorSpaces.js +19 -1
  131. package/examples/jsm/math/ConvexHull.js +3 -3
  132. package/examples/jsm/math/ImprovedNoise.js +1 -1
  133. package/examples/jsm/math/Lut.js +2 -2
  134. package/examples/jsm/math/Octree.js +131 -1
  135. package/examples/jsm/math/SimplexNoise.js +1 -1
  136. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  137. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  138. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  139. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  140. package/examples/jsm/misc/RollerCoaster.js +42 -4
  141. package/examples/jsm/misc/TubePainter.js +383 -40
  142. package/examples/jsm/misc/Volume.js +1 -2
  143. package/examples/jsm/misc/VolumeSlice.js +0 -1
  144. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  145. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  146. package/examples/jsm/objects/LensflareMesh.js +1 -1
  147. package/examples/jsm/objects/Reflector.js +73 -25
  148. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  149. package/examples/jsm/objects/Sky.js +91 -7
  150. package/examples/jsm/objects/SkyMesh.js +151 -17
  151. package/examples/jsm/objects/Water.js +7 -6
  152. package/examples/jsm/objects/Water2.js +5 -3
  153. package/examples/jsm/objects/WaterMesh.js +11 -13
  154. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  155. package/examples/jsm/physics/JoltPhysics.js +10 -6
  156. package/examples/jsm/physics/RapierPhysics.js +9 -5
  157. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  158. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  159. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  160. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  161. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  162. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  163. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  164. package/examples/jsm/postprocessing/UnrealBloomPass.js +56 -24
  165. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  166. package/examples/jsm/renderers/CSS3DRenderer.js +8 -7
  167. package/examples/jsm/renderers/Projector.js +246 -28
  168. package/examples/jsm/renderers/SVGRenderer.js +175 -61
  169. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  170. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  171. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  172. package/examples/jsm/shaders/BokehShader.js +1 -1
  173. package/examples/jsm/shaders/BokehShader2.js +1 -1
  174. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  175. package/examples/jsm/shaders/FocusShader.js +1 -1
  176. package/examples/jsm/shaders/GTAOShader.js +21 -8
  177. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  178. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  179. package/examples/jsm/shaders/PoissonDenoiseShader.js +8 -4
  180. package/examples/jsm/shaders/SAOShader.js +17 -4
  181. package/examples/jsm/shaders/SSAOShader.js +11 -1
  182. package/examples/jsm/shaders/SSRShader.js +7 -6
  183. package/examples/jsm/shaders/SepiaShader.js +1 -1
  184. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  185. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  186. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +3 -5
  187. package/examples/jsm/shaders/VignetteShader.js +1 -1
  188. package/examples/jsm/transpiler/AST.js +44 -0
  189. package/examples/jsm/transpiler/GLSLDecoder.js +85 -25
  190. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  191. package/examples/jsm/transpiler/TSLEncoder.js +52 -10
  192. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  193. package/examples/jsm/transpiler/WGSLEncoder.js +51 -0
  194. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  195. package/examples/jsm/tsl/display/AfterImageNode.js +36 -24
  196. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  197. package/examples/jsm/tsl/display/AnamorphicNode.js +40 -5
  198. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  199. package/examples/jsm/tsl/display/BloomNode.js +23 -9
  200. package/examples/jsm/tsl/display/CRT.js +150 -0
  201. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +5 -37
  202. package/examples/jsm/tsl/display/DenoiseNode.js +3 -1
  203. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  204. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  205. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  206. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  207. package/examples/jsm/tsl/display/GTAONode.js +59 -9
  208. package/examples/jsm/tsl/display/GaussianBlurNode.js +68 -35
  209. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  210. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  211. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  212. package/examples/jsm/tsl/display/OutlineNode.js +81 -20
  213. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  214. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  215. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  216. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  217. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  218. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  219. package/examples/jsm/tsl/display/SSGINode.js +638 -0
  220. package/examples/jsm/tsl/display/SSRNode.js +186 -69
  221. package/examples/jsm/tsl/display/SSSNode.js +490 -0
  222. package/examples/jsm/tsl/display/Shape.js +29 -0
  223. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  224. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  225. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  226. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  227. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  228. package/examples/jsm/tsl/display/TRAANode.js +381 -75
  229. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  230. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  231. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  232. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  233. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  234. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  235. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  236. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  237. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  238. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  239. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  240. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  241. package/examples/jsm/tsl/math/Bayer.js +53 -3
  242. package/examples/jsm/utils/BufferGeometryUtils.js +3 -4
  243. package/examples/jsm/utils/ColorUtils.js +76 -0
  244. package/examples/jsm/utils/LDrawUtils.js +1 -1
  245. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  246. package/examples/jsm/utils/ShadowMapViewerGPU.js +13 -6
  247. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  248. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  249. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  250. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  251. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  252. package/examples/jsm/webxr/XRHandModelFactory.js +4 -7
  253. package/package.json +27 -38
  254. package/src/Three.Core.js +7 -3
  255. package/src/Three.TSL.js +61 -16
  256. package/src/Three.WebGPU.Nodes.js +7 -0
  257. package/src/Three.WebGPU.js +11 -0
  258. package/src/Three.js +1 -0
  259. package/src/animation/AnimationAction.js +12 -2
  260. package/src/animation/AnimationClip.js +21 -5
  261. package/src/animation/AnimationMixer.js +9 -3
  262. package/src/animation/AnimationObjectGroup.js +2 -1
  263. package/src/animation/AnimationUtils.js +1 -12
  264. package/src/animation/KeyframeTrack.js +54 -14
  265. package/src/animation/PropertyBinding.js +12 -11
  266. package/src/animation/PropertyMixer.js +4 -4
  267. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  268. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  269. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  270. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  271. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  272. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  273. package/src/audio/Audio.js +11 -10
  274. package/src/audio/AudioContext.js +2 -2
  275. package/src/audio/AudioListener.js +5 -3
  276. package/src/audio/PositionalAudio.js +1 -1
  277. package/src/cameras/Camera.js +32 -2
  278. package/src/cameras/CubeCamera.js +20 -0
  279. package/src/cameras/OrthographicCamera.js +1 -1
  280. package/src/cameras/PerspectiveCamera.js +1 -1
  281. package/src/cameras/StereoCamera.js +2 -2
  282. package/src/constants.js +100 -7
  283. package/src/core/BufferAttribute.js +13 -1
  284. package/src/core/BufferGeometry.js +24 -12
  285. package/src/core/Clock.js +7 -0
  286. package/src/core/EventDispatcher.js +1 -1
  287. package/src/core/InterleavedBuffer.js +1 -1
  288. package/src/core/InterleavedBufferAttribute.js +3 -2
  289. package/src/core/Object3D.js +55 -6
  290. package/src/core/Raycaster.js +4 -3
  291. package/src/core/RenderTarget.js +14 -5
  292. package/src/extras/Controls.js +5 -4
  293. package/src/extras/DataUtils.js +2 -1
  294. package/src/extras/Earcut.js +6 -0
  295. package/src/extras/ImageUtils.js +2 -2
  296. package/src/extras/PMREMGenerator.js +259 -57
  297. package/src/extras/TextureUtils.js +6 -1
  298. package/src/extras/core/Curve.js +2 -1
  299. package/src/extras/core/Interpolations.js +7 -1
  300. package/src/extras/core/ShapePath.js +4 -4
  301. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  302. package/src/extras/lib/earcut.js +8 -8
  303. package/src/geometries/BoxGeometry.js +1 -0
  304. package/src/geometries/CapsuleGeometry.js +1 -0
  305. package/src/geometries/CircleGeometry.js +1 -0
  306. package/src/geometries/ConeGeometry.js +1 -0
  307. package/src/geometries/CylinderGeometry.js +1 -0
  308. package/src/geometries/DodecahedronGeometry.js +1 -0
  309. package/src/geometries/ExtrudeGeometry.js +10 -8
  310. package/src/geometries/IcosahedronGeometry.js +1 -0
  311. package/src/geometries/LatheGeometry.js +1 -0
  312. package/src/geometries/OctahedronGeometry.js +1 -0
  313. package/src/geometries/PlaneGeometry.js +1 -0
  314. package/src/geometries/PolyhedronGeometry.js +1 -1
  315. package/src/geometries/RingGeometry.js +1 -0
  316. package/src/geometries/ShapeGeometry.js +1 -0
  317. package/src/geometries/SphereGeometry.js +1 -0
  318. package/src/geometries/TetrahedronGeometry.js +1 -0
  319. package/src/geometries/TorusGeometry.js +9 -3
  320. package/src/geometries/TorusKnotGeometry.js +1 -0
  321. package/src/geometries/TubeGeometry.js +1 -0
  322. package/src/helpers/CameraHelper.js +4 -1
  323. package/src/helpers/DirectionalLightHelper.js +4 -1
  324. package/src/helpers/HemisphereLightHelper.js +3 -0
  325. package/src/helpers/PointLightHelper.js +1 -25
  326. package/src/helpers/SpotLightHelper.js +3 -0
  327. package/src/lights/DirectionalLight.js +13 -0
  328. package/src/lights/HemisphereLight.js +10 -0
  329. package/src/lights/Light.js +1 -11
  330. package/src/lights/LightProbe.js +0 -15
  331. package/src/lights/LightShadow.js +15 -6
  332. package/src/lights/PointLight.js +15 -0
  333. package/src/lights/PointLightShadow.js +0 -86
  334. package/src/lights/SpotLight.js +22 -1
  335. package/src/lights/webgpu/IESSpotLight.js +2 -1
  336. package/src/lights/webgpu/ProjectorLight.js +1 -1
  337. package/src/loaders/AnimationLoader.js +2 -1
  338. package/src/loaders/AudioLoader.js +13 -2
  339. package/src/loaders/BufferGeometryLoader.js +2 -2
  340. package/src/loaders/Cache.js +30 -2
  341. package/src/loaders/DataTextureLoader.js +6 -4
  342. package/src/loaders/FileLoader.js +4 -4
  343. package/src/loaders/ImageBitmapLoader.js +17 -13
  344. package/src/loaders/ImageLoader.js +1 -1
  345. package/src/loaders/Loader.js +9 -3
  346. package/src/loaders/LoadingManager.js +25 -3
  347. package/src/loaders/MaterialLoader.js +6 -4
  348. package/src/loaders/ObjectLoader.js +57 -17
  349. package/src/loaders/TextureLoader.js +1 -1
  350. package/src/loaders/nodes/NodeLoader.js +5 -4
  351. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  352. package/src/materials/Material.js +18 -3
  353. package/src/materials/MeshBasicMaterial.js +1 -0
  354. package/src/materials/MeshDepthMaterial.js +1 -0
  355. package/src/materials/MeshDistanceMaterial.js +1 -1
  356. package/src/materials/MeshLambertMaterial.js +11 -1
  357. package/src/materials/MeshMatcapMaterial.js +22 -0
  358. package/src/materials/MeshNormalMaterial.js +1 -0
  359. package/src/materials/MeshPhongMaterial.js +11 -1
  360. package/src/materials/MeshPhysicalMaterial.js +2 -1
  361. package/src/materials/MeshStandardMaterial.js +8 -7
  362. package/src/materials/MeshToonMaterial.js +2 -1
  363. package/src/materials/PointsMaterial.js +1 -1
  364. package/src/materials/ShaderMaterial.js +22 -3
  365. package/src/materials/nodes/Line2NodeMaterial.js +36 -9
  366. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  367. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  368. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  369. package/src/materials/nodes/NodeMaterial.js +95 -35
  370. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  371. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  372. package/src/materials/nodes/manager/NodeMaterialObserver.js +194 -88
  373. package/src/math/Color.js +6 -5
  374. package/src/math/ColorManagement.js +9 -3
  375. package/src/math/Cylindrical.js +1 -1
  376. package/src/math/Euler.js +2 -1
  377. package/src/math/Line3.js +6 -5
  378. package/src/math/MathUtils.js +23 -21
  379. package/src/math/Matrix2.js +14 -10
  380. package/src/math/Matrix3.js +15 -11
  381. package/src/math/Matrix4.js +94 -81
  382. package/src/math/Plane.js +5 -4
  383. package/src/math/Quaternion.js +60 -84
  384. package/src/math/Sphere.js +1 -1
  385. package/src/math/Spherical.js +1 -1
  386. package/src/math/Triangle.js +1 -1
  387. package/src/math/Vector2.js +11 -7
  388. package/src/math/Vector3.js +15 -13
  389. package/src/math/Vector4.js +13 -9
  390. package/src/math/interpolants/BezierInterpolant.js +108 -0
  391. package/src/nodes/Nodes.js +86 -65
  392. package/src/nodes/TSL.js +11 -8
  393. package/src/nodes/accessors/Arrays.js +1 -1
  394. package/src/nodes/accessors/BatchNode.js +10 -10
  395. package/src/nodes/accessors/Bitangent.js +5 -5
  396. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  397. package/src/nodes/accessors/BufferNode.js +30 -3
  398. package/src/nodes/accessors/Camera.js +260 -13
  399. package/src/nodes/accessors/ClippingNode.js +10 -9
  400. package/src/nodes/accessors/CubeTextureNode.js +32 -6
  401. package/src/nodes/accessors/InstanceNode.js +164 -39
  402. package/src/nodes/accessors/Lights.js +10 -0
  403. package/src/nodes/accessors/MaterialNode.js +9 -1
  404. package/src/nodes/accessors/MaterialProperties.js +2 -5
  405. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  406. package/src/nodes/accessors/ModelNode.js +1 -1
  407. package/src/nodes/accessors/Normal.js +16 -15
  408. package/src/nodes/accessors/Object3DNode.js +2 -2
  409. package/src/nodes/accessors/Position.js +51 -3
  410. package/src/nodes/accessors/ReferenceBaseNode.js +7 -7
  411. package/src/nodes/accessors/ReferenceNode.js +11 -10
  412. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  413. package/src/nodes/accessors/SceneProperties.js +47 -0
  414. package/src/nodes/accessors/SkinningNode.js +27 -26
  415. package/src/nodes/accessors/StorageBufferNode.js +14 -24
  416. package/src/nodes/accessors/StorageTextureNode.js +62 -9
  417. package/src/nodes/accessors/Tangent.js +4 -14
  418. package/src/nodes/accessors/Texture3DNode.js +41 -31
  419. package/src/nodes/accessors/TextureNode.js +193 -63
  420. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  421. package/src/nodes/accessors/UserDataNode.js +1 -2
  422. package/src/nodes/accessors/VertexColorNode.js +1 -2
  423. package/src/nodes/code/FunctionCallNode.js +25 -5
  424. package/src/nodes/code/FunctionNode.js +25 -3
  425. package/src/nodes/core/ArrayNode.js +22 -2
  426. package/src/nodes/core/AssignNode.js +6 -5
  427. package/src/nodes/core/AttributeNode.js +5 -4
  428. package/src/nodes/core/BypassNode.js +1 -1
  429. package/src/nodes/core/ContextNode.js +133 -15
  430. package/src/nodes/core/IndexNode.js +4 -3
  431. package/src/nodes/core/InputNode.js +3 -2
  432. package/src/nodes/core/InspectorNode.js +128 -0
  433. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +41 -8
  434. package/src/nodes/core/MRTNode.js +48 -2
  435. package/src/nodes/core/Node.js +264 -46
  436. package/src/nodes/core/NodeBuilder.js +453 -87
  437. package/src/nodes/core/NodeError.js +28 -0
  438. package/src/nodes/core/NodeFrame.js +31 -23
  439. package/src/nodes/core/NodeFunction.js +2 -1
  440. package/src/nodes/core/NodeParser.js +2 -1
  441. package/src/nodes/core/NodeUniform.js +1 -1
  442. package/src/nodes/core/NodeUtils.js +25 -97
  443. package/src/nodes/core/OutputStructNode.js +12 -10
  444. package/src/nodes/core/ParameterNode.js +34 -3
  445. package/src/nodes/core/PropertyNode.js +26 -3
  446. package/src/nodes/core/StackNode.js +99 -23
  447. package/src/nodes/core/StackTrace.js +139 -0
  448. package/src/nodes/core/StructNode.js +22 -8
  449. package/src/nodes/core/StructTypeNode.js +13 -18
  450. package/src/nodes/core/SubBuildNode.js +4 -4
  451. package/src/nodes/core/UniformGroupNode.js +36 -6
  452. package/src/nodes/core/UniformNode.js +37 -13
  453. package/src/nodes/core/VarNode.js +96 -34
  454. package/src/nodes/core/VaryingNode.js +2 -18
  455. package/src/nodes/display/BlendModes.js +0 -63
  456. package/src/nodes/display/BumpMapNode.js +1 -1
  457. package/src/nodes/display/ColorAdjustment.js +18 -1
  458. package/src/nodes/display/ColorSpaceNode.js +3 -3
  459. package/src/nodes/display/FrontFacingNode.js +4 -8
  460. package/src/nodes/display/NormalMapNode.js +41 -5
  461. package/src/nodes/display/PassNode.js +175 -25
  462. package/src/nodes/display/RenderOutputNode.js +35 -9
  463. package/src/nodes/display/ScreenNode.js +47 -15
  464. package/src/nodes/display/ToneMappingNode.js +32 -5
  465. package/src/nodes/display/ToonOutlinePassNode.js +10 -2
  466. package/src/nodes/display/ViewportDepthNode.js +52 -4
  467. package/src/nodes/display/ViewportDepthTextureNode.js +14 -6
  468. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  469. package/src/nodes/display/ViewportTextureNode.js +72 -14
  470. package/src/nodes/fog/Fog.js +18 -34
  471. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  472. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  473. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  474. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  475. package/src/nodes/functions/BasicLightingModel.js +2 -1
  476. package/src/nodes/functions/PhysicalLightingModel.js +128 -46
  477. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  478. package/src/nodes/geometry/RangeNode.js +44 -6
  479. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  480. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  481. package/src/nodes/gpgpu/ComputeBuiltinNode.js +4 -4
  482. package/src/nodes/gpgpu/ComputeNode.js +76 -38
  483. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  484. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -4
  485. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  486. package/src/nodes/lighting/EnvironmentNode.js +34 -9
  487. package/src/nodes/lighting/LightsNode.js +10 -32
  488. package/src/nodes/lighting/PointShadowNode.js +167 -148
  489. package/src/nodes/lighting/ShadowFilterNode.js +55 -65
  490. package/src/nodes/lighting/ShadowNode.js +189 -44
  491. package/src/nodes/math/BitcastNode.js +156 -0
  492. package/src/nodes/math/BitcountNode.js +433 -0
  493. package/src/nodes/math/ConditionalNode.js +25 -8
  494. package/src/nodes/math/MathNode.js +98 -57
  495. package/src/nodes/math/OperatorNode.js +8 -5
  496. package/src/nodes/math/PackFloatNode.js +98 -0
  497. package/src/nodes/math/UnpackFloatNode.js +96 -0
  498. package/src/nodes/pmrem/PMREMNode.js +1 -1
  499. package/src/nodes/pmrem/PMREMUtils.js +111 -2
  500. package/src/nodes/shapes/Shapes.js +1 -1
  501. package/src/nodes/tsl/TSLBase.js +6 -3
  502. package/src/nodes/tsl/TSLCore.js +488 -166
  503. package/src/nodes/utils/ArrayElementNode.js +14 -1
  504. package/src/nodes/utils/ConvertNode.js +1 -1
  505. package/src/nodes/utils/DebugNode.js +14 -13
  506. package/src/nodes/utils/EventNode.js +67 -2
  507. package/src/nodes/utils/FlipNode.js +1 -1
  508. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  509. package/src/nodes/utils/JoinNode.js +7 -4
  510. package/src/nodes/utils/LoopNode.js +20 -24
  511. package/src/nodes/utils/MemberNode.js +60 -8
  512. package/src/nodes/utils/Packing.js +13 -1
  513. package/src/nodes/utils/PostProcessingUtils.js +60 -1
  514. package/src/nodes/utils/RTTNode.js +14 -4
  515. package/src/nodes/utils/ReflectorNode.js +61 -11
  516. package/src/nodes/utils/Remap.js +48 -0
  517. package/src/nodes/utils/RotateNode.js +1 -1
  518. package/src/nodes/utils/SampleNode.js +12 -2
  519. package/src/nodes/utils/SetNode.js +1 -1
  520. package/src/nodes/utils/SplitNode.js +12 -1
  521. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  522. package/src/nodes/utils/Timer.js +0 -47
  523. package/src/nodes/utils/UVUtils.js +28 -0
  524. package/src/objects/BatchedMesh.js +46 -18
  525. package/src/objects/InstancedMesh.js +30 -3
  526. package/src/objects/LOD.js +1 -1
  527. package/src/objects/Line.js +3 -2
  528. package/src/objects/LineSegments.js +2 -1
  529. package/src/objects/Mesh.js +1 -1
  530. package/src/objects/Points.js +1 -1
  531. package/src/objects/Skeleton.js +12 -2
  532. package/src/objects/SkinnedMesh.js +29 -10
  533. package/src/objects/Sprite.js +4 -3
  534. package/src/renderers/WebGLRenderer.js +372 -179
  535. package/src/renderers/common/Animation.js +16 -4
  536. package/src/renderers/common/Attributes.js +16 -2
  537. package/src/renderers/common/Backend.js +137 -35
  538. package/src/renderers/common/Background.js +28 -14
  539. package/src/renderers/common/BindGroup.js +1 -16
  540. package/src/renderers/common/Binding.js +11 -0
  541. package/src/renderers/common/Bindings.js +83 -12
  542. package/src/renderers/common/BlendMode.js +143 -0
  543. package/src/renderers/common/Buffer.js +40 -0
  544. package/src/renderers/common/BundleGroup.js +1 -1
  545. package/src/renderers/common/CanvasTarget.js +341 -0
  546. package/src/renderers/common/ChainMap.js +30 -6
  547. package/src/renderers/common/ComputePipeline.js +1 -1
  548. package/src/renderers/common/CubeRenderTarget.js +51 -7
  549. package/src/renderers/common/DataMap.js +1 -1
  550. package/src/renderers/common/Geometries.js +55 -3
  551. package/src/renderers/common/Info.js +337 -6
  552. package/src/renderers/common/InspectorBase.js +151 -0
  553. package/src/renderers/common/Lighting.js +5 -21
  554. package/src/renderers/common/Pipelines.js +41 -8
  555. package/src/renderers/common/PostProcessing.js +9 -226
  556. package/src/renderers/common/QuadMesh.js +7 -1
  557. package/src/renderers/common/ReadbackBuffer.js +78 -0
  558. package/src/renderers/common/RenderBundle.js +3 -1
  559. package/src/renderers/common/RenderBundles.js +7 -3
  560. package/src/renderers/common/RenderContext.js +18 -2
  561. package/src/renderers/common/RenderContexts.js +33 -49
  562. package/src/renderers/common/RenderList.js +7 -3
  563. package/src/renderers/common/RenderLists.js +2 -1
  564. package/src/renderers/common/RenderObject.js +32 -6
  565. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  566. package/src/renderers/common/RenderObjects.js +22 -6
  567. package/src/renderers/common/RenderPipeline.js +232 -17
  568. package/src/renderers/common/Renderer.js +927 -335
  569. package/src/renderers/common/RendererUtils.js +9 -0
  570. package/src/renderers/common/SampledTexture.js +9 -1
  571. package/src/renderers/common/Sampler.js +52 -14
  572. package/src/renderers/common/StorageBuffer.js +13 -1
  573. package/src/renderers/common/StorageTexture.js +9 -1
  574. package/src/renderers/common/Textures.js +208 -47
  575. package/src/renderers/common/TimestampQueryPool.js +70 -6
  576. package/src/renderers/common/Uniform.js +8 -0
  577. package/src/renderers/common/UniformsGroup.js +64 -2
  578. package/src/renderers/common/XRManager.js +79 -51
  579. package/src/renderers/common/extras/PMREMGenerator.js +176 -79
  580. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  581. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  582. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +260 -95
  583. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  584. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  585. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  586. package/src/renderers/shaders/DFGLUTData.js +49 -0
  587. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  588. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  589. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  590. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  591. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  592. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  593. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -2
  594. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  595. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  596. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  597. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  598. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  599. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  600. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  601. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  602. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +152 -59
  603. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  604. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  605. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  606. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  607. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  608. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  609. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  610. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +221 -190
  611. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  612. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  613. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  614. package/src/renderers/shaders/ShaderChunk.js +5 -3
  615. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  616. package/src/renderers/shaders/ShaderLib/depth.glsl.js +4 -1
  617. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  618. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  619. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  620. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  621. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  622. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  623. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  624. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  625. package/src/renderers/shaders/ShaderLib.js +7 -6
  626. package/src/renderers/shaders/UniformsLib.js +8 -5
  627. package/src/renderers/shaders/UniformsUtils.js +52 -9
  628. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  629. package/src/renderers/webgl/WebGLBackground.js +15 -15
  630. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  631. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  632. package/src/renderers/webgl/WebGLCapabilities.js +11 -5
  633. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  634. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  635. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  636. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  637. package/src/renderers/webgl/WebGLInfo.js +3 -1
  638. package/src/renderers/webgl/WebGLLights.js +18 -1
  639. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  640. package/src/renderers/webgl/WebGLObjects.js +3 -1
  641. package/src/renderers/webgl/WebGLOutput.js +270 -0
  642. package/src/renderers/webgl/WebGLProgram.js +63 -122
  643. package/src/renderers/webgl/WebGLPrograms.js +65 -52
  644. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  645. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  646. package/src/renderers/webgl/WebGLShadowMap.js +191 -26
  647. package/src/renderers/webgl/WebGLState.js +79 -40
  648. package/src/renderers/webgl/WebGLTextures.js +234 -68
  649. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  650. package/src/renderers/webgl/WebGLUniformsGroups.js +24 -3
  651. package/src/renderers/webgl/WebGLUtils.js +8 -3
  652. package/src/renderers/webgl-fallback/WebGLBackend.js +438 -235
  653. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  654. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +339 -84
  655. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  656. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  657. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  658. package/src/renderers/webgl-fallback/utils/WebGLState.js +229 -11
  659. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +237 -72
  660. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +56 -27
  661. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +8 -3
  662. package/src/renderers/webgpu/WebGPUBackend.js +403 -253
  663. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  664. package/src/renderers/webgpu/WebGPURenderer.js +5 -3
  665. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +491 -123
  666. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +108 -34
  667. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +360 -201
  668. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  669. package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -2
  670. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +111 -54
  671. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +155 -205
  672. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +407 -149
  673. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +36 -13
  674. package/src/renderers/webgpu/utils/WebGPUUtils.js +55 -13
  675. package/src/renderers/webxr/WebXRController.js +12 -0
  676. package/src/renderers/webxr/WebXRManager.js +45 -29
  677. package/src/textures/CubeDepthTexture.js +76 -0
  678. package/src/textures/ExternalTexture.js +15 -4
  679. package/src/textures/HTMLTexture.js +74 -0
  680. package/src/textures/Source.js +5 -4
  681. package/src/textures/Texture.js +19 -7
  682. package/src/textures/VideoTexture.js +2 -3
  683. package/src/utils.js +344 -3
  684. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  685. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  686. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  687. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  688. package/src/nodes/accessors/SceneNode.js +0 -144
  689. package/src/nodes/code/ScriptableNode.js +0 -726
  690. package/src/nodes/code/ScriptableValueNode.js +0 -253
  691. package/src/nodes/display/PosterizeNode.js +0 -65
  692. package/src/nodes/functions/BSDF/DFGApprox.js +0 -30
  693. package/src/nodes/utils/RemapNode.js +0 -125
  694. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  695. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  696. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -574,8 +574,12 @@ class CSMShadowNode extends ShadowBaseNode {
574
574
  const light = this.lights[ i ];
575
575
  const parent = light.parent;
576
576
 
577
- parent.remove( light.target );
578
- parent.remove( light );
577
+ if ( parent !== null ) {
578
+
579
+ parent.remove( light.target );
580
+ parent.remove( light );
581
+
582
+ }
579
583
 
580
584
  }
581
585
 
@@ -1,16 +1,38 @@
1
1
  import {
2
2
  LinearFilter,
3
+ MathUtils,
3
4
  Matrix3,
4
5
  NearestFilter,
6
+ PerspectiveCamera,
5
7
  RGBAFormat,
6
8
  ShaderMaterial,
7
- StereoCamera,
9
+ Vector3,
8
10
  WebGLRenderTarget
9
11
  } from 'three';
10
12
  import { FullScreenQuad } from '../postprocessing/Pass.js';
13
+ import { frameCorners } from '../utils/CameraUtils.js';
14
+
15
+ const _cameraL = /*@__PURE__*/ new PerspectiveCamera();
16
+ const _cameraR = /*@__PURE__*/ new PerspectiveCamera();
17
+
18
+ // Reusable vectors for screen corner calculations
19
+ const _eyeL = /*@__PURE__*/ new Vector3();
20
+ const _eyeR = /*@__PURE__*/ new Vector3();
21
+ const _screenCenter = /*@__PURE__*/ new Vector3();
22
+ const _screenBottomLeft = /*@__PURE__*/ new Vector3();
23
+ const _screenBottomRight = /*@__PURE__*/ new Vector3();
24
+ const _screenTopLeft = /*@__PURE__*/ new Vector3();
25
+ const _right = /*@__PURE__*/ new Vector3();
26
+ const _up = /*@__PURE__*/ new Vector3();
27
+ const _forward = /*@__PURE__*/ new Vector3();
11
28
 
12
29
  /**
13
- * A class that creates an anaglyph effect.
30
+ * A class that creates an anaglyph effect using physically-correct
31
+ * off-axis stereo projection.
32
+ *
33
+ * This implementation uses CameraUtils.frameCorners() to align stereo
34
+ * camera frustums to a virtual screen plane, providing accurate depth
35
+ * perception with zero parallax at the plane distance.
14
36
  *
15
37
  * Note that this class can only be used with {@link WebGLRenderer}.
16
38
  * When using {@link WebGPURenderer}, use {@link AnaglyphPassNode}.
@@ -42,13 +64,38 @@ class AnaglyphEffect {
42
64
  - 0.00155529, - 0.0184503, 1.2264
43
65
  ] );
44
66
 
45
- const _stereo = new StereoCamera();
67
+ /**
68
+ * The interpupillary distance (eye separation) in world units.
69
+ * Typical human IPD is 0.064 meters (64mm).
70
+ *
71
+ * @type {number}
72
+ * @default 0.064
73
+ */
74
+ this.eyeSep = 0.064;
75
+
76
+ /**
77
+ * The distance in world units from the viewer to the virtual
78
+ * screen plane where zero parallax (screen depth) occurs.
79
+ * Objects at this distance appear at the screen surface.
80
+ * Objects closer appear in front of the screen (negative parallax).
81
+ * Objects further appear behind the screen (positive parallax).
82
+ *
83
+ * The screen dimensions are derived from the camera's FOV and aspect ratio
84
+ * at this distance, ensuring the stereo view matches the camera's field of view.
85
+ *
86
+ * @type {number}
87
+ * @default 0.5
88
+ */
89
+ this.planeDistance = 0.5;
46
90
 
47
91
  const _params = { minFilter: LinearFilter, magFilter: NearestFilter, format: RGBAFormat };
48
92
 
49
93
  const _renderTargetL = new WebGLRenderTarget( width, height, _params );
50
94
  const _renderTargetR = new WebGLRenderTarget( width, height, _params );
51
95
 
96
+ _cameraL.layers.enable( 1 );
97
+ _cameraR.layers.enable( 2 );
98
+
52
99
  const _material = new ShaderMaterial( {
53
100
 
54
101
  uniforms: {
@@ -141,16 +188,64 @@ class AnaglyphEffect {
141
188
 
142
189
  if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
143
190
 
144
- _stereo.update( camera );
145
-
191
+ // Get the camera's local coordinate axes from its world matrix
192
+ camera.matrixWorld.extractBasis( _right, _up, _forward );
193
+ _right.normalize();
194
+ _up.normalize();
195
+ _forward.normalize();
196
+
197
+ // Calculate eye positions
198
+ const halfSep = this.eyeSep / 2;
199
+ _eyeL.copy( camera.position ).addScaledVector( _right, - halfSep );
200
+ _eyeR.copy( camera.position ).addScaledVector( _right, halfSep );
201
+
202
+ // Calculate screen center (at planeDistance in front of the camera center)
203
+ _screenCenter.copy( camera.position ).addScaledVector( _forward, - this.planeDistance );
204
+
205
+ // Calculate screen dimensions from camera FOV and aspect ratio
206
+ const halfHeight = this.planeDistance * Math.tan( MathUtils.DEG2RAD * camera.fov / 2 );
207
+ const halfWidth = halfHeight * camera.aspect;
208
+
209
+ // Calculate screen corners
210
+ _screenBottomLeft.copy( _screenCenter )
211
+ .addScaledVector( _right, - halfWidth )
212
+ .addScaledVector( _up, - halfHeight );
213
+
214
+ _screenBottomRight.copy( _screenCenter )
215
+ .addScaledVector( _right, halfWidth )
216
+ .addScaledVector( _up, - halfHeight );
217
+
218
+ _screenTopLeft.copy( _screenCenter )
219
+ .addScaledVector( _right, - halfWidth )
220
+ .addScaledVector( _up, halfHeight );
221
+
222
+ // Set up left eye camera
223
+ _cameraL.position.copy( _eyeL );
224
+ _cameraL.near = camera.near;
225
+ _cameraL.far = camera.far;
226
+ frameCorners( _cameraL, _screenBottomLeft, _screenBottomRight, _screenTopLeft, true );
227
+ _cameraL.matrixWorld.compose( _cameraL.position, _cameraL.quaternion, _cameraL.scale );
228
+ _cameraL.matrixWorldInverse.copy( _cameraL.matrixWorld ).invert();
229
+
230
+ // Set up right eye camera
231
+ _cameraR.position.copy( _eyeR );
232
+ _cameraR.near = camera.near;
233
+ _cameraR.far = camera.far;
234
+ frameCorners( _cameraR, _screenBottomLeft, _screenBottomRight, _screenTopLeft, true );
235
+ _cameraR.matrixWorld.compose( _cameraR.position, _cameraR.quaternion, _cameraR.scale );
236
+ _cameraR.matrixWorldInverse.copy( _cameraR.matrixWorld ).invert();
237
+
238
+ // Render left eye
146
239
  renderer.setRenderTarget( _renderTargetL );
147
240
  renderer.clear();
148
- renderer.render( scene, _stereo.cameraL );
241
+ renderer.render( scene, _cameraL );
149
242
 
243
+ // Render right eye
150
244
  renderer.setRenderTarget( _renderTargetR );
151
245
  renderer.clear();
152
- renderer.render( scene, _stereo.cameraR );
246
+ renderer.render( scene, _cameraR );
153
247
 
248
+ // Composite anaglyph
154
249
  renderer.setRenderTarget( null );
155
250
  _quad.render( renderer );
156
251
 
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * A class that creates an ASCII effect.
3
3
  *
4
- * The ASCII generation is based on [jsascii]{@link https://github.com/hassadee/jsascii/blob/master/jsascii.js}.
4
+ * The ASCII generation is based on [jsascii](https://github.com/hassadee/jsascii/blob/master/jsascii.js).
5
5
  *
6
6
  * @three_import import { AsciiEffect } from 'three/addons/effects/AsciiEffect.js';
7
7
  */
@@ -18,7 +18,7 @@ class AsciiEffect {
18
18
 
19
19
  // ' .,:;=|iI+hHOE#`$';
20
20
  // darker bolder character set from https://github.com/saw/Canvas-ASCII-Art/
21
- // ' .\'`^",:;Il!i~+_-?][}{1)(|/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$'.split('');
21
+ // ' .\'`^",:;Il!i~+_-?][}{1)(|/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$'
22
22
 
23
23
  // Some ASCII settings
24
24
 
@@ -218,6 +218,8 @@ class AsciiEffect {
218
218
  // Coloring loop starts now
219
219
  let strChars = '';
220
220
 
221
+ const maxIdx = aCharList.length - 1;
222
+
221
223
  // console.time('rendering');
222
224
 
223
225
  for ( let y = 0; y < iHeight; y += 2 ) {
@@ -230,13 +232,11 @@ class AsciiEffect {
230
232
  const iGreen = oImgData[ iOffset + 1 ];
231
233
  const iBlue = oImgData[ iOffset + 2 ];
232
234
  const iAlpha = oImgData[ iOffset + 3 ];
233
- let iCharIdx;
234
-
235
- let fBrightness;
236
235
 
237
- fBrightness = ( 0.3 * iRed + 0.59 * iGreen + 0.11 * iBlue ) / 255;
236
+ let fBrightness = ( 0.3 * iRed + 0.59 * iGreen + 0.11 * iBlue ) / 255;
238
237
  // fBrightness = (0.3*iRed + 0.5*iGreen + 0.3*iBlue) / 255;
239
238
 
239
+
240
240
  if ( iAlpha == 0 ) {
241
241
 
242
242
  // should calculate alpha instead, but quick hack :)
@@ -245,11 +245,11 @@ class AsciiEffect {
245
245
 
246
246
  }
247
247
 
248
- iCharIdx = Math.floor( ( 1 - fBrightness ) * ( aCharList.length - 1 ) );
248
+ let iCharIdx = Math.round( ( 1 - fBrightness ) * maxIdx );
249
249
 
250
250
  if ( bInvert ) {
251
251
 
252
- iCharIdx = aCharList.length - iCharIdx - 1;
252
+ iCharIdx = maxIdx - iCharIdx;
253
253
 
254
254
  }
255
255
 
@@ -0,0 +1,59 @@
1
+ import {
2
+ BackSide,
3
+ Mesh,
4
+ MeshBasicMaterial,
5
+ SphereGeometry,
6
+ Scene
7
+ } from 'three';
8
+
9
+ /**
10
+ * This class represents a scene with a uniform color that can be used as
11
+ * input for {@link PMREMGenerator#fromScene}. The resulting PMREM represents
12
+ * uniform ambient lighting and can be used for Image Based Lighting by
13
+ * assigning it to {@link Scene#environment}.
14
+ *
15
+ * ```js
16
+ * const environment = new ColorEnvironment( 0x00ff00 );
17
+ * const pmremGenerator = new THREE.PMREMGenerator( renderer );
18
+ *
19
+ * const envMap = pmremGenerator.fromScene( environment ).texture;
20
+ * scene.environment = envMap;
21
+ * ```
22
+ *
23
+ * @augments Scene
24
+ * @three_import import { ColorEnvironment } from 'three/addons/environments/ColorEnvironment.js';
25
+ */
26
+ class ColorEnvironment extends Scene {
27
+
28
+ /**
29
+ * Constructs a new color environment.
30
+ *
31
+ * @param {number|Color} color - The color of the environment.
32
+ */
33
+ constructor( color = 0xffffff ) {
34
+
35
+ super();
36
+
37
+ this.name = 'ColorEnvironment';
38
+
39
+ const geometry = new SphereGeometry( 1, 16, 16 );
40
+ const material = new MeshBasicMaterial( { color: color, side: BackSide } );
41
+
42
+ this.add( new Mesh( geometry, material ) );
43
+
44
+ }
45
+
46
+ /**
47
+ * Frees internal resources. This method should be called
48
+ * when the environment is no longer required.
49
+ */
50
+ dispose() {
51
+
52
+ this.children[ 0 ].geometry.dispose();
53
+ this.children[ 0 ].material.dispose();
54
+
55
+ }
56
+
57
+ }
58
+
59
+ export { ColorEnvironment };
@@ -36,6 +36,9 @@ class RoomEnvironment extends Scene {
36
36
 
37
37
  super();
38
38
 
39
+ this.name = 'RoomEnvironment';
40
+ this.position.y = - 3.5;
41
+
39
42
  const geometry = new BoxGeometry();
40
43
  geometry.deleteAttribute( 'uv' );
41
44
 
@@ -5,7 +5,7 @@ import { Color, ColorManagement, SRGBColorSpace } from 'three';
5
5
  /**
6
6
  * An exporter to compress geometry with the Draco library.
7
7
  *
8
- * [Draco]{@link https://google.github.io/draco/} is an open source library for compressing and
8
+ * [Draco](https://google.github.io/draco/) is an open source library for compressing and
9
9
  * decompressing 3D meshes and point clouds. Compressed geometry can be significantly smaller,
10
10
  * at the cost of additional decoding time on the client device.
11
11
  *
@@ -13,7 +13,7 @@ import { Color, ColorManagement, SRGBColorSpace } from 'three';
13
13
  * normals, colors, and other attributes. Draco files *do not* contain materials,
14
14
  * textures, animation, or node hierarchies – to use these features, embed Draco geometry
15
15
  * inside of a glTF file. A normal glTF file can be converted to a Draco-compressed glTF file
16
- * using [glTF-Pipeline]{@link https://github.com/AnalyticalGraphicsInc/gltf-pipeline}.
16
+ * using [glTF-Pipeline](https://github.com/AnalyticalGraphicsInc/gltf-pipeline).
17
17
  *
18
18
  * ```js
19
19
  * const exporter = new DRACOExporter();
@@ -15,7 +15,7 @@ const ZIP_COMPRESSION = 3;
15
15
  /**
16
16
  * An exporter for EXR.
17
17
  *
18
- * EXR ( Extended Dynamic Range) is an [open format specification]{@link https://github.com/AcademySoftwareFoundation/openexr}
18
+ * EXR ( Extended Dynamic Range) is an [open format specification](https://github.com/AcademySoftwareFoundation/openexr)
19
19
  * for professional-grade image storage format of the motion picture industry. The purpose of
20
20
  * format is to accurately and efficiently represent high-dynamic-range scene-linear image data
21
21
  * and associated metadata. The library is widely used in host application software where accuracy
@@ -90,7 +90,7 @@ function supportedRTT( renderTarget ) {
90
90
 
91
91
  }
92
92
 
93
- if ( renderTarget.isWebGLCubeRenderTarget || renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {
93
+ if ( renderTarget.isCubeRenderTarget || renderTarget.isWebGLCubeRenderTarget || renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {
94
94
 
95
95
  throw Error( 'EXRExporter.parse: Unsupported render target type, expected instance of WebGLRenderTarget.' );
96
96
 
@@ -65,13 +65,13 @@ const KHR_mesh_quantization_ExtraAttrTypes = {
65
65
  /**
66
66
  * An exporter for `glTF` 2.0.
67
67
  *
68
- * glTF (GL Transmission Format) is an [open format specification]{@link https://github.com/KhronosGroup/glTF/tree/master/specification/2.0}
68
+ * glTF (GL Transmission Format) is an [open format specification](https://github.com/KhronosGroup/glTF/tree/master/specification/2.0)
69
69
  * for efficient delivery and loading of 3D content. Assets may be provided either in JSON (.gltf)
70
70
  * or binary (.glb) format. External files store textures (.jpg, .png) and additional binary
71
71
  * data (.bin). A glTF asset may deliver one or more scenes, including meshes, materials,
72
72
  * textures, skins, skeletons, morph targets, animations, lights, and/or cameras.
73
73
  *
74
- * GLTFExporter supports the [glTF 2.0 extensions]{@link https://github.com/KhronosGroup/glTF/tree/master/extensions/}:
74
+ * GLTFExporter supports the [glTF 2.0 extensions](https://github.com/KhronosGroup/glTF/tree/master/extensions/):
75
75
  *
76
76
  * - KHR_lights_punctual
77
77
  * - KHR_materials_clearcoat
@@ -88,10 +88,11 @@ const KHR_mesh_quantization_ExtraAttrTypes = {
88
88
  * - KHR_texture_transform
89
89
  * - EXT_materials_bump
90
90
  * - EXT_mesh_gpu_instancing
91
+ * - EXT_texture_webp
91
92
  *
92
93
  * The following glTF 2.0 extension is supported by an external user plugin:
93
94
  *
94
- * - [KHR_materials_variants]{@link https://github.com/takahirox/three-gltf-extensions}
95
+ * - [KHR_materials_variants](https://github.com/takahirox/three-gltf-extensions)
95
96
  *
96
97
  * ```js
97
98
  * const exporter = new GLTFExporter();
@@ -543,32 +544,36 @@ function getCanvas() {
543
544
 
544
545
  function getToBlobPromise( canvas, mimeType ) {
545
546
 
546
- if ( canvas.toBlob !== undefined ) {
547
+ if ( typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas ) {
547
548
 
548
- return new Promise( ( resolve ) => canvas.toBlob( resolve, mimeType ) );
549
+ let quality;
549
550
 
550
- }
551
+ // Blink's implementation of convertToBlob seems to default to a quality level of 100%
552
+ // Use the Blink default quality levels of toBlob instead so that file sizes are comparable.
553
+ if ( mimeType === 'image/jpeg' ) {
551
554
 
552
- let quality;
555
+ quality = 0.92;
553
556
 
554
- // Blink's implementation of convertToBlob seems to default to a quality level of 100%
555
- // Use the Blink default quality levels of toBlob instead so that file sizes are comparable.
556
- if ( mimeType === 'image/jpeg' ) {
557
+ } else if ( mimeType === 'image/webp' ) {
557
558
 
558
- quality = 0.92;
559
+ quality = 0.8;
559
560
 
560
- } else if ( mimeType === 'image/webp' ) {
561
+ }
561
562
 
562
- quality = 0.8;
563
+ return canvas.convertToBlob( {
563
564
 
564
- }
565
+ type: mimeType,
566
+ quality: quality
565
567
 
566
- return canvas.convertToBlob( {
568
+ } );
567
569
 
568
- type: mimeType,
569
- quality: quality
570
+ } else {
570
571
 
571
- } );
572
+ // HTMLCanvasElement code path
573
+
574
+ return new Promise( ( resolve ) => canvas.toBlob( resolve, mimeType ) );
575
+
576
+ }
572
577
 
573
578
  }
574
579
 
@@ -757,7 +762,7 @@ class GLTFWriter {
757
762
  /**
758
763
  * Serializes a userData.
759
764
  *
760
- * @param {THREE.Object3D|THREE.Material} object
765
+ * @param {THREE.Object3D|THREE.Material|THREE.BufferGeometry|THREE.AnimationClip} object
761
766
  * @param {Object} objectDef
762
767
  */
763
768
  serializeUserData( object, objectDef ) {
@@ -1529,15 +1534,30 @@ class GLTFWriter {
1529
1534
 
1530
1535
  }
1531
1536
 
1532
- let mimeType = map.userData.mimeType;
1537
+ const mimeType = map.userData.mimeType;
1533
1538
 
1534
- if ( mimeType === 'image/webp' ) mimeType = 'image/png';
1539
+ const imageIndex = this.processImage( map.image, map.format, map.flipY, mimeType );
1535
1540
 
1536
1541
  const textureDef = {
1537
- sampler: this.processSampler( map ),
1538
- source: this.processImage( map.image, map.format, map.flipY, mimeType )
1542
+ sampler: this.processSampler( map )
1539
1543
  };
1540
1544
 
1545
+ if ( mimeType === 'image/webp' ) {
1546
+
1547
+ textureDef.extensions = textureDef.extensions || {};
1548
+ textureDef.extensions[ 'EXT_texture_webp' ] = {
1549
+ source: imageIndex
1550
+ };
1551
+
1552
+ this.extensionsUsed[ 'EXT_texture_webp' ] = true;
1553
+ this.extensionsRequired[ 'EXT_texture_webp' ] = true;
1554
+
1555
+ } else {
1556
+
1557
+ textureDef.source = imageIndex;
1558
+
1559
+ }
1560
+
1541
1561
  if ( map.name ) textureDef.name = map.name;
1542
1562
 
1543
1563
  await this._invokeAllAsync( async function ( ext ) {
@@ -1555,7 +1575,7 @@ class GLTFWriter {
1555
1575
  /**
1556
1576
  * Process material
1557
1577
  * @param {THREE.Material} material Material to process
1558
- * @return {Promise<number|null>} Index of the processed material in the "materials" array
1578
+ * @return {Promise<?number>} Index of the processed material in the "materials" array
1559
1579
  */
1560
1580
  async processMaterialAsync( material ) {
1561
1581
 
@@ -1731,7 +1751,7 @@ class GLTFWriter {
1731
1751
  /**
1732
1752
  * Process mesh
1733
1753
  * @param {THREE.Mesh} mesh Mesh to process
1734
- * @return {Promise<number|null>} Index of the processed mesh in the "meshes" array
1754
+ * @return {Promise<?number>} Index of the processed mesh in the "meshes" array
1735
1755
  */
1736
1756
  async processMeshAsync( mesh ) {
1737
1757
 
@@ -1828,7 +1848,7 @@ class GLTFWriter {
1828
1848
  const validVertexAttributes =
1829
1849
  /^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/;
1830
1850
 
1831
- if ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName;
1851
+ if ( ! validVertexAttributes.test( attributeName ) && ! attributeName.startsWith( '_' ) ) attributeName = '_' + attributeName;
1832
1852
 
1833
1853
  if ( cache.attributes.has( this.getUID( attribute ) ) ) {
1834
1854
 
@@ -1848,12 +1868,12 @@ class GLTFWriter {
1848
1868
  ! ( array instanceof Uint8Array ) ) {
1849
1869
 
1850
1870
  console.warn( 'GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.' );
1851
- modifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized );
1871
+ modifiedAttribute = GLTFExporter.Utils.toTypedBufferAttribute( attribute, Uint16Array );
1852
1872
 
1853
1873
  } else if ( ( array instanceof Uint32Array || array instanceof Int32Array ) && ! attributeName.startsWith( '_' ) ) {
1854
1874
 
1855
1875
  console.warn( `GLTFExporter: Attribute "${ attributeName }" converted to type FLOAT.` );
1856
- modifiedAttribute = GLTFExporter.Utils.toFloat32BufferAttribute( attribute );
1876
+ modifiedAttribute = GLTFExporter.Utils.toTypedBufferAttribute( attribute, Float32Array );
1857
1877
 
1858
1878
  }
1859
1879
 
@@ -2185,7 +2205,7 @@ class GLTFWriter {
2185
2205
  *
2186
2206
  * @param {THREE.AnimationClip} clip
2187
2207
  * @param {THREE.Object3D} root
2188
- * @return {number|null}
2208
+ * @return {?number}
2189
2209
  */
2190
2210
  processAnimation( clip, root ) {
2191
2211
 
@@ -2279,11 +2299,15 @@ class GLTFWriter {
2279
2299
 
2280
2300
  }
2281
2301
 
2282
- json.animations.push( {
2302
+ const animationDef = {
2283
2303
  name: clip.name || 'clip_' + json.animations.length,
2284
2304
  samplers: samplers,
2285
2305
  channels: channels
2286
- } );
2306
+ };
2307
+
2308
+ this.serializeUserData( clip, animationDef );
2309
+
2310
+ json.animations.push( animationDef );
2287
2311
 
2288
2312
  return json.animations.length - 1;
2289
2313
 
@@ -2291,7 +2315,7 @@ class GLTFWriter {
2291
2315
 
2292
2316
  /**
2293
2317
  * @param {THREE.Object3D} object
2294
- * @return {number|null}
2318
+ * @return {?number}
2295
2319
  */
2296
2320
  processSkin( object ) {
2297
2321
 
@@ -2347,6 +2371,13 @@ class GLTFWriter {
2347
2371
 
2348
2372
  if ( ! json.nodes ) json.nodes = [];
2349
2373
 
2374
+ // Handle pivot by creating a container node
2375
+ if ( object.pivot !== null ) {
2376
+
2377
+ return await this._processNodeWithPivotAsync( object );
2378
+
2379
+ }
2380
+
2350
2381
  const nodeDef = {};
2351
2382
 
2352
2383
  if ( options.trs ) {
@@ -2443,6 +2474,126 @@ class GLTFWriter {
2443
2474
 
2444
2475
  }
2445
2476
 
2477
+ /**
2478
+ * Process Object3D node with pivot using container approach
2479
+ * @param {THREE.Object3D} object Object3D with pivot
2480
+ * @return {Promise<number>} Index of the container node
2481
+ */
2482
+ async _processNodeWithPivotAsync( object ) {
2483
+
2484
+ const json = this.json;
2485
+ const options = this.options;
2486
+ const nodeMap = this.nodeMap;
2487
+
2488
+ const pivot = object.pivot;
2489
+
2490
+ // Container node: holds position + pivot offset, rotation, scale
2491
+ // Animations will target this node
2492
+ const containerDef = {};
2493
+
2494
+ const rotation = object.quaternion.toArray();
2495
+ const position = [
2496
+ object.position.x + pivot.x,
2497
+ object.position.y + pivot.y,
2498
+ object.position.z + pivot.z
2499
+ ];
2500
+ const scale = object.scale.toArray();
2501
+
2502
+ if ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {
2503
+
2504
+ containerDef.rotation = rotation;
2505
+
2506
+ }
2507
+
2508
+ if ( ! equalArray( position, [ 0, 0, 0 ] ) ) {
2509
+
2510
+ containerDef.translation = position;
2511
+
2512
+ }
2513
+
2514
+ if ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {
2515
+
2516
+ containerDef.scale = scale;
2517
+
2518
+ }
2519
+
2520
+ // Store pivot in extras for round-trip reconstruction
2521
+ containerDef.extras = { pivot: pivot.toArray() };
2522
+
2523
+ if ( object.name !== '' ) containerDef.name = String( object.name );
2524
+
2525
+ this.serializeUserData( object, containerDef );
2526
+
2527
+ const containerIndex = json.nodes.push( containerDef ) - 1;
2528
+
2529
+ // Map original object to container so animations target it
2530
+ nodeMap.set( object, containerIndex );
2531
+
2532
+ // Child node: holds mesh with -pivot offset
2533
+ const childDef = {};
2534
+
2535
+ const childPosition = [ - pivot.x, - pivot.y, - pivot.z ];
2536
+
2537
+ if ( ! equalArray( childPosition, [ 0, 0, 0 ] ) ) {
2538
+
2539
+ childDef.translation = childPosition;
2540
+
2541
+ }
2542
+
2543
+ if ( object.isMesh || object.isLine || object.isPoints ) {
2544
+
2545
+ const meshIndex = await this.processMeshAsync( object );
2546
+
2547
+ if ( meshIndex !== null ) childDef.mesh = meshIndex;
2548
+
2549
+ } else if ( object.isCamera ) {
2550
+
2551
+ childDef.camera = this.processCamera( object );
2552
+
2553
+ }
2554
+
2555
+ if ( object.isSkinnedMesh ) this.skins.push( object );
2556
+
2557
+ const childIndex = json.nodes.push( childDef ) - 1;
2558
+
2559
+ // Build children array for container
2560
+ const containerChildren = [ childIndex ];
2561
+
2562
+ // Process object's children as children of the child node
2563
+ if ( object.children.length > 0 ) {
2564
+
2565
+ const grandchildren = [];
2566
+
2567
+ for ( let i = 0, l = object.children.length; i < l; i ++ ) {
2568
+
2569
+ const child = object.children[ i ];
2570
+
2571
+ if ( child.visible || options.onlyVisible === false ) {
2572
+
2573
+ const childNodeIndex = await this.processNodeAsync( child );
2574
+
2575
+ if ( childNodeIndex !== null ) grandchildren.push( childNodeIndex );
2576
+
2577
+ }
2578
+
2579
+ }
2580
+
2581
+ if ( grandchildren.length > 0 ) childDef.children = grandchildren;
2582
+
2583
+ }
2584
+
2585
+ containerDef.children = containerChildren;
2586
+
2587
+ await this._invokeAllAsync( function ( ext ) {
2588
+
2589
+ ext.writeNode && ext.writeNode( object, containerDef );
2590
+
2591
+ } );
2592
+
2593
+ return containerIndex;
2594
+
2595
+ }
2596
+
2446
2597
  /**
2447
2598
  * Process Scene
2448
2599
  * @param {Scene} scene Scene to process
@@ -3530,9 +3681,9 @@ GLTFExporter.Utils = {
3530
3681
 
3531
3682
  },
3532
3683
 
3533
- toFloat32BufferAttribute: function ( srcAttribute ) {
3684
+ toTypedBufferAttribute: function ( srcAttribute, TypedArray ) {
3534
3685
 
3535
- const dstAttribute = new BufferAttribute( new Float32Array( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false );
3686
+ const dstAttribute = new BufferAttribute( new TypedArray( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false );
3536
3687
 
3537
3688
  if ( ! srcAttribute.normalized && ! srcAttribute.isInterleavedBufferAttribute ) {
3538
3689