super-three 0.181.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 (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -10,8 +10,8 @@ import { DataTexture } from '../../../textures/DataTexture.js';
10
10
  import { error } from '../../../utils.js';
11
11
 
12
12
  const glslPolyfills = {
13
- bitcast_int_uint: new CodeNode( /* glsl */'uint tsl_bitcast_uint_to_int ( int x ) { return floatBitsToInt( uintBitsToFloat( x ) ); }' ),
14
- bitcast_uint_int: new CodeNode( /* glsl */'uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }' )
13
+ bitcast_int_uint: new CodeNode( /* glsl */'uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }' ),
14
+ bitcast_uint_int: new CodeNode( /* glsl */'uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }' )
15
15
  };
16
16
 
17
17
  const glslMethods = {
@@ -22,7 +22,13 @@ const glslMethods = {
22
22
  bitcast_uint_float: 'uintBitsToFloat',
23
23
  bitcast_float_uint: 'floatBitsToUint',
24
24
  bitcast_uint_int: 'tsl_bitcast_uint_to_int',
25
- bitcast_int_uint: 'tsl_bitcast_int_to_uint'
25
+ bitcast_int_uint: 'tsl_bitcast_int_to_uint',
26
+ floatpack_snorm_2x16: 'packSnorm2x16',
27
+ floatpack_unorm_2x16: 'packUnorm2x16',
28
+ floatpack_float16_2x16: 'packHalf2x16',
29
+ floatunpack_snorm_2x16: 'unpackSnorm2x16',
30
+ floatunpack_unorm_2x16: 'unpackUnorm2x16',
31
+ floatunpack_float16_2x16: 'unpackHalf2x16'
26
32
  };
27
33
 
28
34
  const precisionLib = {
@@ -63,9 +69,9 @@ precision highp isampler3D;
63
69
  precision highp isamplerCube;
64
70
  precision highp isampler2DArray;
65
71
 
66
- precision lowp sampler2DShadow;
67
- precision lowp sampler2DArrayShadow;
68
- precision lowp samplerCubeShadow;
72
+ precision highp sampler2DShadow;
73
+ precision highp sampler2DArrayShadow;
74
+ precision highp samplerCubeShadow;
69
75
  `;
70
76
 
71
77
  /**
@@ -184,6 +190,30 @@ class GLSLNodeBuilder extends NodeBuilder {
184
190
 
185
191
  }
186
192
 
193
+ /**
194
+ * Returns the float packing method name for a given numeric encoding.
195
+ *
196
+ * @param {string} encoding - The numeric encoding that describes how the float values are mapped to the integer range.
197
+ * @returns {string} The resolved GLSL float packing method name.
198
+ */
199
+ getFloatPackingMethod( encoding ) {
200
+
201
+ return this.getMethod( `floatpack_${ encoding }_2x16` );
202
+
203
+ }
204
+
205
+ /**
206
+ * Returns the float unpacking method name for a given numeric encoding.
207
+ *
208
+ * @param {string} encoding - The numeric encoding that describes how the integer values are mapped to the float range.
209
+ * @returns {string} The resolved GLSL float unpacking method name.
210
+ */
211
+ getFloatUnpackingMethod( encoding ) {
212
+
213
+ return this.getMethod( `floatunpack_${ encoding }_2x16` );
214
+
215
+ }
216
+
187
217
  /**
188
218
  * Returns the native snippet for a ternary operation.
189
219
  *
@@ -330,7 +360,7 @@ ${ flowData.code }
330
360
 
331
361
  if ( node.isNodeUniform && node.node.isTextureNode !== true && node.node.isBufferNode !== true ) {
332
362
 
333
- return shaderStage.charAt( 0 ) + '_' + node.name;
363
+ return node.name;
334
364
 
335
365
  }
336
366
 
@@ -448,11 +478,11 @@ ${ flowData.code }
448
478
 
449
479
  if ( offsetSnippet ) {
450
480
 
451
- snippet = `texelFetchOffset( ${ textureProperty }, ivec3( ${ uvIndexSnippet }, ${ depthSnippet } ), ${ levelSnippet }, ${ offsetSnippet } )`;
481
+ snippet = `texelFetchOffset( ${ textureProperty }, ivec3( ${ uvIndexSnippet }, ${ depthSnippet } ), int( ${ levelSnippet } ), ${ offsetSnippet } )`;
452
482
 
453
483
  } else {
454
484
 
455
- snippet = `texelFetch( ${ textureProperty }, ivec3( ${ uvIndexSnippet }, ${ depthSnippet } ), ${ levelSnippet } )`;
485
+ snippet = `texelFetch( ${ textureProperty }, ivec3( ${ uvIndexSnippet }, ${ depthSnippet } ), int( ${ levelSnippet } ) )`;
456
486
 
457
487
  }
458
488
 
@@ -460,11 +490,11 @@ ${ flowData.code }
460
490
 
461
491
  if ( offsetSnippet ) {
462
492
 
463
- snippet = `texelFetchOffset( ${ textureProperty }, ${ uvIndexSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
493
+ snippet = `texelFetchOffset( ${ textureProperty }, ${ uvIndexSnippet }, int( ${ levelSnippet } ), ${ offsetSnippet } )`;
464
494
 
465
495
  } else {
466
496
 
467
- snippet = `texelFetch( ${ textureProperty }, ${ uvIndexSnippet }, ${ levelSnippet } )`;
497
+ snippet = `texelFetch( ${ textureProperty }, ${ uvIndexSnippet }, int( ${ levelSnippet } ) )`;
468
498
 
469
499
  }
470
500
 
@@ -515,10 +545,13 @@ ${ flowData.code }
515
545
  * @param {string} textureProperty - The name of the texture uniform in the shader.
516
546
  * @param {string} uvSnippet - A GLSL snippet that represents texture coordinates used for sampling.
517
547
  * @param {string} levelSnippet - A GLSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
548
+ * @param {?string} depthSnippet - A GLSL snippet that represents 0-based texture array index to sample.
518
549
  * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
519
550
  * @return {string} The GLSL snippet.
520
551
  */
521
- generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, offsetSnippet ) {
552
+ generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
553
+
554
+ if ( depthSnippet ) uvSnippet = `vec3( ${ uvSnippet }, ${ depthSnippet } )`;
522
555
 
523
556
  if ( offsetSnippet ) {
524
557
 
@@ -537,10 +570,13 @@ ${ flowData.code }
537
570
  * @param {string} textureProperty - The name of the texture uniform in the shader.
538
571
  * @param {string} uvSnippet - A GLSL snippet that represents texture coordinates used for sampling.
539
572
  * @param {string} biasSnippet - A GLSL snippet that represents the bias to apply to the mip level before sampling.
573
+ * @param {?string} depthSnippet - A GLSL snippet that represents 0-based texture array index to sample.
540
574
  * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
541
575
  * @return {string} The GLSL snippet.
542
576
  */
543
- generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, offsetSnippet ) {
577
+ generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, offsetSnippet ) {
578
+
579
+ if ( depthSnippet ) uvSnippet = `vec3( ${ uvSnippet }, ${ depthSnippet } )`;
544
580
 
545
581
  if ( offsetSnippet ) {
546
582
 
@@ -559,10 +595,13 @@ ${ flowData.code }
559
595
  * @param {string} textureProperty - The name of the texture uniform in the shader.
560
596
  * @param {string} uvSnippet - A GLSL snippet that represents texture coordinates used for sampling.
561
597
  * @param {Array<string>} gradSnippet - An array holding both gradient GLSL snippets.
598
+ * @param {?string} depthSnippet - A GLSL snippet that represents 0-based texture array index to sample.
562
599
  * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
563
600
  * @return {string} The GLSL snippet.
564
601
  */
565
- generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, offsetSnippet ) {
602
+ generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, offsetSnippet ) {
603
+
604
+ if ( depthSnippet ) uvSnippet = `vec3( ${ uvSnippet }, ${ depthSnippet } )`;
566
605
 
567
606
  if ( offsetSnippet ) {
568
607
 
@@ -591,6 +630,13 @@ ${ flowData.code }
591
630
 
592
631
  if ( shaderStage === 'fragment' ) {
593
632
 
633
+ // Cube shadow maps use vec4(direction, compareValue)
634
+ if ( texture.isCubeTexture ) {
635
+
636
+ return `texture( ${ textureProperty }, vec4( ${ uvSnippet }, ${ compareSnippet } ) )`;
637
+
638
+ }
639
+
594
640
  if ( depthSnippet ) {
595
641
 
596
642
  if ( offsetSnippet ) {
@@ -619,32 +665,6 @@ ${ flowData.code }
619
665
 
620
666
  }
621
667
 
622
- /**
623
- * Returns the variables of the given shader stage as a GLSL string.
624
- *
625
- * @param {string} shaderStage - The shader stage.
626
- * @return {string} The GLSL snippet that defines the variables.
627
- */
628
- getVars( shaderStage ) {
629
-
630
- const snippets = [];
631
-
632
- const vars = this.vars[ shaderStage ];
633
-
634
- if ( vars !== undefined ) {
635
-
636
- for ( const variable of vars ) {
637
-
638
- snippets.push( `${ this.getVar( variable.type, variable.name, variable.count ) };` );
639
-
640
- }
641
-
642
- }
643
-
644
- return snippets.join( '\n\t' );
645
-
646
- }
647
-
648
668
  /**
649
669
  * Returns the uniforms of the given shader stage as a GLSL string.
650
670
  *
@@ -713,6 +733,20 @@ ${ flowData.code }
713
733
 
714
734
  snippet = `samplerCube ${ uniform.name };`;
715
735
 
736
+ } else if ( uniform.type === 'cubeDepthTexture' ) {
737
+
738
+ const texture = uniform.node.value;
739
+
740
+ if ( texture.compareFunction ) {
741
+
742
+ snippet = `samplerCubeShadow ${ uniform.name };`;
743
+
744
+ } else {
745
+
746
+ snippet = `samplerCube ${ uniform.name };`;
747
+
748
+ }
749
+
716
750
  } else if ( uniform.type === 'buffer' ) {
717
751
 
718
752
  const bufferNode = uniform.node;
@@ -724,32 +758,56 @@ ${ flowData.code }
724
758
 
725
759
  } else {
726
760
 
727
- const vectorType = this.getVectorType( uniform.type );
761
+ const groupName = uniform.groupNode.name;
728
762
 
729
- snippet = `${ vectorType } ${ this.getPropertyName( uniform, shaderStage ) };`;
763
+ // Check if this group has already been processed
764
+ if ( uniformGroups[ groupName ] === undefined ) {
730
765
 
731
- group = true;
766
+ // Get the shared uniform group that contains uniforms from all stages
767
+ const sharedUniformGroup = this.uniformGroups[ groupName ];
732
768
 
733
- }
769
+ if ( sharedUniformGroup !== undefined ) {
770
+
771
+ // Generate snippets for ALL uniforms in this shared group
772
+ const snippets = [];
773
+
774
+ for ( const sharedUniform of sharedUniformGroup.uniforms ) {
775
+
776
+ const type = sharedUniform.getType();
777
+ const vectorType = this.getVectorType( type );
778
+ const precision = sharedUniform.nodeUniform.node.precision;
779
+
780
+ let uniformSnippet = `${ vectorType } ${ sharedUniform.name };`;
781
+
782
+ if ( precision !== null ) {
783
+
784
+ uniformSnippet = precisionLib[ precision ] + ' ' + uniformSnippet;
785
+
786
+ }
787
+
788
+ snippets.push( '\t' + uniformSnippet );
789
+
790
+ }
791
+
792
+ uniformGroups[ groupName ] = snippets;
734
793
 
735
- const precision = uniform.node.precision;
794
+ }
736
795
 
737
- if ( precision !== null ) {
796
+ }
738
797
 
739
- snippet = precisionLib[ precision ] + ' ' + snippet;
798
+ group = true;
740
799
 
741
800
  }
742
801
 
743
- if ( group ) {
802
+ if ( ! group ) {
744
803
 
745
- snippet = '\t' + snippet;
804
+ const precision = uniform.node.precision;
746
805
 
747
- const groupName = uniform.groupNode.name;
748
- const groupSnippets = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = [] );
806
+ if ( precision !== null ) {
749
807
 
750
- groupSnippets.push( snippet );
808
+ snippet = precisionLib[ precision ] + ' ' + snippet;
751
809
 
752
- } else {
810
+ }
753
811
 
754
812
  snippet = 'uniform ' + snippet;
755
813
 
@@ -765,7 +823,7 @@ ${ flowData.code }
765
823
 
766
824
  const groupSnippets = uniformGroups[ name ];
767
825
 
768
- output += this._getGLSLUniformStruct( shaderStage + '_' + name, groupSnippets.join( '\n' ) ) + '\n';
826
+ output += this._getGLSLUniformStruct( name, groupSnippets.join( '\n' ) ) + '\n';
769
827
 
770
828
  }
771
829
 
@@ -1061,9 +1119,11 @@ ${ flowData.code }
1061
1119
 
1062
1120
  return 'uint( gl_DrawID )';
1063
1121
 
1064
- }
1122
+ } else {
1123
+
1124
+ return 'nodeUniformDrawId'; // fallback to uniform
1065
1125
 
1066
- return null;
1126
+ }
1067
1127
 
1068
1128
  }
1069
1129
 
@@ -1339,14 +1399,14 @@ ${shaderData.varyings}
1339
1399
  // attributes
1340
1400
  ${shaderData.attributes}
1341
1401
 
1402
+ // vars
1403
+ ${shaderData.vars}
1404
+
1342
1405
  // codes
1343
1406
  ${shaderData.codes}
1344
1407
 
1345
1408
  void main() {
1346
1409
 
1347
- // vars
1348
- ${shaderData.vars}
1349
-
1350
1410
  // transforms
1351
1411
  ${shaderData.transforms}
1352
1412
 
@@ -1388,14 +1448,14 @@ ${shaderData.uniforms}
1388
1448
  // varyings
1389
1449
  ${shaderData.varyings}
1390
1450
 
1451
+ // vars
1452
+ ${shaderData.vars}
1453
+
1391
1454
  // codes
1392
1455
  ${shaderData.codes}
1393
1456
 
1394
1457
  void main() {
1395
1458
 
1396
- // vars
1397
- ${shaderData.vars}
1398
-
1399
1459
  // flow
1400
1460
  ${shaderData.flow}
1401
1461
 
@@ -1466,12 +1526,26 @@ void main() {
1466
1526
  stageData.uniforms = this.getUniforms( shaderStage );
1467
1527
  stageData.attributes = this.getAttributes( shaderStage );
1468
1528
  stageData.varyings = this.getVaryings( shaderStage );
1469
- stageData.vars = this.getVars( shaderStage );
1529
+ stageData.vars = this.getVars( shaderStage, true );
1470
1530
  stageData.structs = this.getStructs( shaderStage );
1471
1531
  stageData.codes = this.getCodes( shaderStage );
1472
1532
  stageData.transforms = this.getTransforms( shaderStage );
1473
1533
  stageData.flow = flow;
1474
1534
 
1535
+ // fallbacks
1536
+
1537
+ if ( shaderStage === 'vertex' ) {
1538
+
1539
+ const ext = this.renderer.backend.extensions;
1540
+
1541
+ if ( this.object.isBatchedMesh && ext.has( 'WEBGL_multi_draw' ) === false ) {
1542
+
1543
+ stageData.uniforms += '\nuniform uint nodeUniformDrawId;\n';
1544
+
1545
+ }
1546
+
1547
+ }
1548
+
1475
1549
  }
1476
1550
 
1477
1551
  if ( this.material !== null ) {
@@ -1519,7 +1593,7 @@ void main() {
1519
1593
  uniformGPU = new NodeSampledTexture( uniformNode.name, uniformNode.node, group );
1520
1594
  bindings.push( uniformGPU );
1521
1595
 
1522
- } else if ( type === 'cubeTexture' ) {
1596
+ } else if ( type === 'cubeTexture' || type === 'cubeDepthTexture' ) {
1523
1597
 
1524
1598
  uniformGPU = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, group );
1525
1599
  bindings.push( uniformGPU );
@@ -1531,11 +1605,22 @@ void main() {
1531
1605
 
1532
1606
  } else if ( type === 'buffer' ) {
1533
1607
 
1534
- node.name = `NodeBuffer_${ node.id }`;
1535
1608
  uniformNode.name = `buffer${ node.id }`;
1536
1609
 
1537
- const buffer = new NodeUniformBuffer( node, group );
1538
- buffer.name = node.name;
1610
+ const sharedData = this.getSharedDataFromNode( node );
1611
+
1612
+ let buffer = sharedData.buffer;
1613
+
1614
+ if ( buffer === undefined ) {
1615
+
1616
+ node.name = `NodeBuffer_${ node.id }`;
1617
+
1618
+ buffer = new NodeUniformBuffer( node, group );
1619
+ buffer.name = node.name;
1620
+
1621
+ sharedData.buffer = buffer;
1622
+
1623
+ }
1539
1624
 
1540
1625
  bindings.push( buffer );
1541
1626
 
@@ -1543,24 +1628,38 @@ void main() {
1543
1628
 
1544
1629
  } else {
1545
1630
 
1546
- const uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );
1547
-
1548
- let uniformsGroup = uniformsStage[ groupName ];
1631
+ let uniformsGroup = this.uniformGroups[ groupName ];
1549
1632
 
1550
1633
  if ( uniformsGroup === undefined ) {
1551
1634
 
1552
- uniformsGroup = new NodeUniformsGroup( shaderStage + '_' + groupName, group );
1553
- //uniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );
1635
+ uniformsGroup = new NodeUniformsGroup( groupName, group );
1554
1636
 
1555
- uniformsStage[ groupName ] = uniformsGroup;
1637
+ this.uniformGroups[ groupName ] = uniformsGroup;
1556
1638
 
1557
1639
  bindings.push( uniformsGroup );
1558
1640
 
1641
+ } else {
1642
+
1643
+ // Add to bindings for this stage if not already present
1644
+ if ( bindings.indexOf( uniformsGroup ) === - 1 ) {
1645
+
1646
+ bindings.push( uniformsGroup );
1647
+
1648
+ }
1649
+
1559
1650
  }
1560
1651
 
1561
1652
  uniformGPU = this.getNodeUniform( uniformNode, type );
1562
1653
 
1563
- uniformsGroup.addUniform( uniformGPU );
1654
+ // Only add uniform if not already present in the group (check by name to avoid duplicates across stages)
1655
+ const uniformName = uniformGPU.name;
1656
+ const alreadyExists = uniformsGroup.uniforms.some( u => u.name === uniformName );
1657
+
1658
+ if ( ! alreadyExists ) {
1659
+
1660
+ uniformsGroup.addUniform( uniformGPU );
1661
+
1662
+ }
1564
1663
 
1565
1664
  }
1566
1665
 
@@ -254,47 +254,81 @@ class WebGLAttributeUtils {
254
254
 
255
255
  /**
256
256
  * This method performs a readback operation by moving buffer data from
257
- * a storage buffer attribute from the GPU to the CPU.
257
+ * a storage buffer attribute from the GPU to the CPU. ReadbackBuffer can
258
+ * be used to retain and reuse handles to the intermediate buffers and prevent
259
+ * new allocation.
258
260
  *
259
261
  * @async
260
- * @param {StorageBufferAttribute} attribute - The storage buffer attribute.
261
- * @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.
262
+ * @param {BufferAttribute} attribute - The storage buffer attribute to read frm.
263
+ * @param {ReadbackBuffer|ArrayBuffer} target - The storage buffer attribute.
264
+ * @param {number} offset - The storage buffer attribute.
265
+ * @param {number} count - The offset from which to start reading the
266
+ * @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
262
267
  */
263
- async getArrayBufferAsync( attribute ) {
268
+ async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
264
269
 
265
270
  const backend = this.backend;
266
271
  const { gl } = backend;
267
272
 
268
273
  const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
269
- const { bufferGPU } = backend.get( bufferAttribute );
274
+ const attributeInfo = backend.get( bufferAttribute );
275
+ const { bufferGPU } = attributeInfo;
270
276
 
271
- const array = attribute.array;
272
- const byteLength = array.byteLength;
277
+ const byteLength = count === - 1 ? attributeInfo.byteLength - offset : count;
273
278
 
274
- gl.bindBuffer( gl.COPY_READ_BUFFER, bufferGPU );
279
+ // read the data back
280
+ let dstBuffer;
281
+ if ( target === null ) {
275
282
 
276
- const writeBuffer = gl.createBuffer();
283
+ dstBuffer = new Uint8Array( new ArrayBuffer( byteLength ) );
277
284
 
278
- gl.bindBuffer( gl.COPY_WRITE_BUFFER, writeBuffer );
279
- gl.bufferData( gl.COPY_WRITE_BUFFER, byteLength, gl.STREAM_READ );
285
+ } else if ( target.isReadbackBuffer ) {
280
286
 
281
- gl.copyBufferSubData( gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, byteLength );
287
+ if ( target._mapped === true ) {
282
288
 
283
- await backend.utils._clientWaitAsync();
289
+ throw new Error( 'WebGPURenderer: ReadbackBuffer must be released before being used again.' );
284
290
 
285
- const dstBuffer = new attribute.array.constructor( array.length );
291
+ }
286
292
 
287
- // Ensure the buffer is bound before reading
288
- gl.bindBuffer( gl.COPY_WRITE_BUFFER, writeBuffer );
293
+ const releaseCallback = () => {
294
+
295
+ target.buffer = null;
296
+ target._mapped = false;
297
+ target.removeEventListener( 'release', releaseCallback );
298
+ target.removeEventListener( 'dispose', releaseCallback );
299
+
300
+ };
301
+
302
+ target.addEventListener( 'release', releaseCallback );
303
+ target.addEventListener( 'dispose', releaseCallback );
304
+
305
+ // WebGL has no concept of a "mapped" data buffer so we create a new buffer, instead.
306
+ dstBuffer = new Uint8Array( new ArrayBuffer( byteLength ) );
307
+ target.buffer = dstBuffer.buffer;
308
+
309
+ } else {
289
310
 
290
- gl.getBufferSubData( gl.COPY_WRITE_BUFFER, 0, dstBuffer );
311
+ dstBuffer = new Uint8Array( target );
291
312
 
292
- gl.deleteBuffer( writeBuffer );
313
+ }
314
+
315
+ // Ensure the buffer is bound before reading
316
+ gl.bindBuffer( gl.COPY_READ_BUFFER, bufferGPU );
317
+ gl.getBufferSubData( gl.COPY_READ_BUFFER, offset, dstBuffer );
293
318
 
294
319
  gl.bindBuffer( gl.COPY_READ_BUFFER, null );
295
320
  gl.bindBuffer( gl.COPY_WRITE_BUFFER, null );
296
321
 
297
- return dstBuffer.buffer;
322
+ // return the appropriate type
323
+ if ( target && target.isReadbackBuffer ) {
324
+
325
+ return target;
326
+
327
+ } else {
328
+
329
+ return dstBuffer.buffer;
330
+
331
+ }
298
332
 
299
333
  }
300
334
 
@@ -27,6 +27,14 @@ class WebGLCapabilities {
27
27
  */
28
28
  this.maxAnisotropy = null;
29
29
 
30
+ /**
31
+ * This value holds the cached max uniform block size value.
32
+ *
33
+ * @type {?number}
34
+ * @default null
35
+ */
36
+ this.maxUniformBlockSize = null;
37
+
30
38
  }
31
39
 
32
40
  /**
@@ -59,6 +67,23 @@ class WebGLCapabilities {
59
67
 
60
68
  }
61
69
 
70
+ /**
71
+ * Returns the maximum number of bytes available for uniform buffers.
72
+ *
73
+ * @return {number} The maximum number of bytes available for uniform buffers.
74
+ */
75
+ getUniformBufferLimit() {
76
+
77
+ if ( this.maxUniformBlockSize !== null ) return this.maxUniformBlockSize;
78
+
79
+ const gl = this.backend.gl;
80
+
81
+ this.maxUniformBlockSize = gl.getParameter( gl.MAX_UNIFORM_BLOCK_SIZE );
82
+
83
+ return this.maxUniformBlockSize;
84
+
85
+ }
86
+
62
87
  }
63
88
 
64
89
  export default WebGLCapabilities;