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
@@ -16,11 +16,10 @@ import { NodeAccess } from '../../../nodes/core/constants.js';
16
16
  import VarNode from '../../../nodes/core/VarNode.js';
17
17
  import ExpressionNode from '../../../nodes/code/ExpressionNode.js';
18
18
 
19
- import { FloatType, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter } from '../../../constants.js';
19
+ import { FloatType, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping, NearestFilter, Compatibility } from '../../../constants.js';
20
20
  import { warn, error } from '../../../utils.js';
21
21
 
22
- // GPUShaderStage is not defined in browsers not supporting WebGPU
23
- const GPUShaderStage = ( typeof self !== 'undefined' ) ? self.GPUShaderStage : { VERTEX: 1, FRAGMENT: 2, COMPUTE: 4 };
22
+ import { GPUShaderStage } from '../utils/WebGPUConstants.js';
24
23
 
25
24
  const accessNames = {
26
25
  [ NodeAccess.READ_ONLY ]: 'read',
@@ -35,9 +34,9 @@ const wrapNames = {
35
34
  };
36
35
 
37
36
  const gpuShaderStageLib = {
38
- 'vertex': GPUShaderStage ? GPUShaderStage.VERTEX : 1,
39
- 'fragment': GPUShaderStage ? GPUShaderStage.FRAGMENT : 2,
40
- 'compute': GPUShaderStage ? GPUShaderStage.COMPUTE : 4
37
+ 'vertex': GPUShaderStage.VERTEX,
38
+ 'fragment': GPUShaderStage.FRAGMENT,
39
+ 'compute': GPUShaderStage.COMPUTE
41
40
  };
42
41
 
43
42
  const supports = {
@@ -113,6 +112,29 @@ fn tsl_biquadraticTexture( map : texture_2d<f32>, coord : vec2f, iRes : vec2u, l
113
112
 
114
113
  return mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );
115
114
 
115
+ }
116
+ ` ),
117
+ biquadraticTextureArray: new CodeNode( /* wgsl */`
118
+ fn tsl_biquadraticTexture_array( map : texture_2d_array<f32>, coord : vec2f, iRes : vec2u, layer : u32, level : u32 ) -> vec4f {
119
+
120
+ let res = vec2f( iRes );
121
+
122
+ let uvScaled = coord * res;
123
+ let uvWrapping = ( ( uvScaled % res ) + res ) % res;
124
+
125
+ // https://www.shadertoy.com/view/WtyXRy
126
+
127
+ let uv = uvWrapping - 0.5;
128
+ let iuv = floor( uv );
129
+ let f = fract( uv );
130
+
131
+ let rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, layer, level );
132
+ let rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, layer, level );
133
+ let rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, layer, level );
134
+ let rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, layer, level );
135
+
136
+ return mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );
137
+
116
138
  }
117
139
  ` )
118
140
  };
@@ -129,7 +151,13 @@ const wgslMethods = {
129
151
  equals_bvec3: 'tsl_equals_bvec3',
130
152
  equals_bvec4: 'tsl_equals_bvec4',
131
153
  inversesqrt: 'inverseSqrt',
132
- bitcast: 'bitcast<f32>'
154
+ bitcast: 'bitcast<f32>',
155
+ floatpack_snorm_2x16: 'pack2x16snorm',
156
+ floatpack_unorm_2x16: 'pack2x16unorm',
157
+ floatpack_float16_2x16: 'pack2x16float',
158
+ floatunpack_snorm_2x16: 'unpack2x16snorm',
159
+ floatunpack_unorm_2x16: 'unpack2x16unorm',
160
+ floatunpack_float16_2x16: 'unpack2x16float'
133
161
  };
134
162
 
135
163
  //
@@ -172,6 +200,14 @@ class WGSLNodeBuilder extends NodeBuilder {
172
200
  */
173
201
  this.uniformGroups = {};
174
202
 
203
+ /**
204
+ * A dictionary that holds the assigned binding indices for each uniform group.
205
+ * This ensures the same binding index is used across all shader stages.
206
+ *
207
+ * @type {Object<string,{index: number, id: number}>}
208
+ */
209
+ this.uniformGroupsBindings = {};
210
+
175
211
  /**
176
212
  * A dictionary that holds for each shader stage a Map of builtins.
177
213
  *
@@ -194,6 +230,22 @@ class WGSLNodeBuilder extends NodeBuilder {
194
230
  */
195
231
  this.scopedArrays = new Map();
196
232
 
233
+ /**
234
+ * A flag that indicates that early returns are allowed.
235
+ *
236
+ * @type {boolean}
237
+ * @default true
238
+ */
239
+ this.allowEarlyReturns = true;
240
+
241
+ /**
242
+ * A flag that indicates that global variables are allowed.
243
+ *
244
+ * @type {boolean}
245
+ * @default true
246
+ */
247
+ this.allowGlobalVariables = true;
248
+
197
249
  }
198
250
 
199
251
  /**
@@ -258,17 +310,31 @@ class WGSLNodeBuilder extends NodeBuilder {
258
310
 
259
311
  if ( this.isUnfilterable( texture ) === false ) {
260
312
 
261
- if ( offsetSnippet ) {
313
+ if ( depthSnippet ) {
262
314
 
263
- return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
315
+ if ( offsetSnippet ) {
264
316
 
265
- }
317
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
318
+
319
+ }
320
+
321
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ levelSnippet } )`;
322
+
323
+ } else {
324
+
325
+ if ( offsetSnippet ) {
326
+
327
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
266
328
 
267
- return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
329
+ }
330
+
331
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
332
+
333
+ }
268
334
 
269
335
  } else if ( this.isFilteredTexture( texture ) ) {
270
336
 
271
- return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet );
337
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet, depthSnippet );
272
338
 
273
339
  } else {
274
340
 
@@ -286,7 +352,7 @@ class WGSLNodeBuilder extends NodeBuilder {
286
352
  */
287
353
  generateWrapFunction( texture ) {
288
354
 
289
- const functionName = `tsl_coord_${ wrapNames[ texture.wrapS ] }S_${ wrapNames[ texture.wrapT ] }_${ texture.isData3DTexture ? '3d' : '2d' }T`;
355
+ const functionName = `tsl_coord_${ wrapNames[ texture.wrapS ] }S_${ wrapNames[ texture.wrapT ] }_${ texture.is3DTexture || texture.isData3DTexture ? '3d' : '2d' }T`;
290
356
 
291
357
  let nodeCode = wgslCodeCache[ functionName ];
292
358
 
@@ -295,7 +361,7 @@ class WGSLNodeBuilder extends NodeBuilder {
295
361
  const includes = [];
296
362
 
297
363
  // For 3D textures, use vec3f; for texture arrays, keep vec2f since array index is separate
298
- const coordType = texture.isData3DTexture ? 'vec3f' : 'vec2f';
364
+ const coordType = texture.is3DTexture || texture.isData3DTexture ? 'vec3f' : 'vec2f';
299
365
  let code = `fn ${ functionName }( coord : ${ coordType } ) -> ${ coordType } {\n\n\treturn ${ coordType }(\n`;
300
366
 
301
367
  const addWrapSnippet = ( wrap, axis ) => {
@@ -334,7 +400,7 @@ class WGSLNodeBuilder extends NodeBuilder {
334
400
 
335
401
  addWrapSnippet( texture.wrapT, 'y' );
336
402
 
337
- if ( texture.isData3DTexture ) {
403
+ if ( texture.is3DTexture || texture.isData3DTexture ) {
338
404
 
339
405
  code += ',\n';
340
406
  addWrapSnippet( texture.wrapR, 'z' );
@@ -378,7 +444,7 @@ class WGSLNodeBuilder extends NodeBuilder {
378
444
  */
379
445
  generateTextureDimension( texture, textureProperty, levelSnippet ) {
380
446
 
381
- const textureData = this.getDataFromNode( texture, this.shaderStage, this.globalCache );
447
+ const textureData = this.getDataFromNode( texture, this.shaderStage, this.cache );
382
448
 
383
449
  if ( textureData.dimensionsSnippet === undefined ) textureData.dimensionsSnippet = {};
384
450
 
@@ -392,7 +458,7 @@ class WGSLNodeBuilder extends NodeBuilder {
392
458
  const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
393
459
  const isMultisampled = primarySamples > 1;
394
460
 
395
- if ( texture.isData3DTexture ) {
461
+ if ( texture.is3DTexture || texture.isData3DTexture ) {
396
462
 
397
463
  dimensionType = 'vec3<u32>';
398
464
 
@@ -418,7 +484,7 @@ class WGSLNodeBuilder extends NodeBuilder {
418
484
 
419
485
  textureData.dimensionsSnippet[ levelSnippet ] = textureDimensionNode;
420
486
 
421
- if ( texture.isArrayTexture || texture.isDataArrayTexture || texture.isData3DTexture ) {
487
+ if ( texture.isArrayTexture || texture.isDataArrayTexture || texture.is3DTexture || texture.isData3DTexture ) {
422
488
 
423
489
  textureData.arrayLayerCount = new VarNode(
424
490
  new ExpressionNode(
@@ -452,11 +518,10 @@ class WGSLNodeBuilder extends NodeBuilder {
452
518
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
453
519
  * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
454
520
  * @param {string} [levelSnippet='0u'] - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
521
+ * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
455
522
  * @return {string} The WGSL snippet.
456
523
  */
457
- generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet = '0u' ) {
458
-
459
- this._include( 'biquadraticTexture' );
524
+ generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet = '0u', depthSnippet ) {
460
525
 
461
526
  const wrapFunction = this.generateWrapFunction( texture );
462
527
  const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
@@ -467,6 +532,16 @@ class WGSLNodeBuilder extends NodeBuilder {
467
532
 
468
533
  }
469
534
 
535
+ if ( depthSnippet ) {
536
+
537
+ this._include( 'biquadraticTextureArray' );
538
+
539
+ return `tsl_biquadraticTexture_array( ${ textureProperty }, ${ wrapFunction }( ${ uvSnippet } ), ${ textureDimension }, u32( ${ depthSnippet } ), u32( ${ levelSnippet } ) )`;
540
+
541
+ }
542
+
543
+ this._include( 'biquadraticTexture' );
544
+
470
545
  return `tsl_biquadraticTexture( ${ textureProperty }, ${ wrapFunction }( ${ uvSnippet } ), ${ textureDimension }, u32( ${ levelSnippet } ) )`;
471
546
 
472
547
  }
@@ -485,10 +560,27 @@ class WGSLNodeBuilder extends NodeBuilder {
485
560
  */
486
561
  generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet = '0u' ) {
487
562
 
563
+ // Cube textures cannot use textureLoad in WGSL, must use textureSampleLevel
564
+ if ( texture.isCubeTexture === true ) {
565
+
566
+ if ( offsetSnippet ) {
567
+
568
+ uvSnippet = `${ uvSnippet } + vec3<f32>(${ offsetSnippet })`;
569
+
570
+ }
571
+
572
+ // Depth textures require integer level, regular textures use float
573
+ const levelType = texture.isDepthTexture ? 'u32' : 'f32';
574
+
575
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelType }( ${ levelSnippet } ) )`;
576
+
577
+ }
578
+
488
579
  const wrapFunction = this.generateWrapFunction( texture );
489
580
  const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
490
581
 
491
- const vecType = texture.isData3DTexture ? 'vec3' : 'vec2';
582
+ const vecType = texture.is3DTexture || texture.isData3DTexture ? 'vec3' : 'vec2';
583
+ const textureDimensionMargin = ( vecType === 'vec3' ) ? 'vec3<u32>( 1, 1, 1 )' : 'vec2<u32>( 1, 1 )';
492
584
 
493
585
  if ( offsetSnippet ) {
494
586
 
@@ -496,9 +588,47 @@ class WGSLNodeBuilder extends NodeBuilder {
496
588
 
497
589
  }
498
590
 
499
- const coordSnippet = `${ vecType }<u32>( ${ wrapFunction }( ${ uvSnippet } ) * ${ vecType }<f32>( ${ textureDimension } ) )`;
591
+ const clampMin = `${ vecType }<f32>( 0 )`;
592
+ const clampMax = `${ vecType }<f32>( ${ textureDimension } - ${ textureDimensionMargin } )`;
593
+
594
+ uvSnippet = `${ vecType }<u32>( clamp( floor( ${ wrapFunction }( ${ uvSnippet } ) * ${ vecType }<f32>( ${ textureDimension } ) ), ${ clampMin }, ${ clampMax } ) )`;
595
+
596
+ return this.generateTextureLoad( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, null );
597
+
598
+ }
599
+
600
+ /**
601
+ * Generates the WGSL snippet that reads a single texel from a storage texture.
602
+ *
603
+ * @param {Texture} texture - The texture.
604
+ * @param {string} textureProperty - The name of the texture uniform in the shader.
605
+ * @param {string} uvIndexSnippet - A WGSL snippet that represents texture coordinates used for sampling.
606
+ * @param {?string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
607
+ * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
608
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
609
+ * @return {string} The WGSL snippet.
610
+ */
611
+ generateStorageTextureLoad( texture, textureProperty, uvIndexSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
612
+
613
+ if ( offsetSnippet ) {
614
+
615
+ uvIndexSnippet = `${ uvIndexSnippet } + ${ offsetSnippet }`;
616
+
617
+ }
618
+
619
+ let snippet;
620
+
621
+ if ( depthSnippet ) {
622
+
623
+ snippet = `textureLoad( ${ textureProperty }, ${ uvIndexSnippet }, ${ depthSnippet } )`;
624
+
625
+ } else {
626
+
627
+ snippet = `textureLoad( ${ textureProperty }, ${ uvIndexSnippet } )`;
500
628
 
501
- return this.generateTextureLoad( texture, textureProperty, coordSnippet, levelSnippet, depthSnippet, null );
629
+ }
630
+
631
+ return snippet;
502
632
 
503
633
  }
504
634
 
@@ -581,7 +711,7 @@ class WGSLNodeBuilder extends NodeBuilder {
581
711
  */
582
712
  isSampleCompare( texture ) {
583
713
 
584
- return texture.isDepthTexture === true && texture.compareFunction !== null;
714
+ return texture.isDepthTexture === true && texture.compareFunction !== null && this.renderer.hasCompatibility( Compatibility.TEXTURE_COMPARE );
585
715
 
586
716
  }
587
717
 
@@ -594,7 +724,7 @@ class WGSLNodeBuilder extends NodeBuilder {
594
724
  isUnfilterable( texture ) {
595
725
 
596
726
  return this.getComponentTypeFromTexture( texture ) !== 'float' ||
597
- ( ! this.isAvailable( 'float32Filterable' ) && texture.isDataTexture === true && texture.type === FloatType ) ||
727
+ ( ! this.isAvailable( 'float32Filterable' ) && texture.type === FloatType ) ||
598
728
  ( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) ||
599
729
  this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1;
600
730
 
@@ -645,14 +775,27 @@ class WGSLNodeBuilder extends NodeBuilder {
645
775
 
646
776
  if ( shaderStage === 'fragment' ) {
647
777
 
648
- // TODO handle i32 or u32 --> uvSnippet, array_index: A, ddx, ddy
649
- if ( offsetSnippet ) {
778
+ if ( depthSnippet ) {
650
779
 
651
- return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] }, ${ offsetSnippet } )`;
780
+ if ( offsetSnippet ) {
652
781
 
653
- }
782
+ return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] }, ${ offsetSnippet } )`;
783
+
784
+ }
785
+
786
+ return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
787
+
788
+ } else {
789
+
790
+ if ( offsetSnippet ) {
791
+
792
+ return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] }, ${ offsetSnippet } )`;
793
+
794
+ }
795
+
796
+ return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
654
797
 
655
- return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
798
+ }
656
799
 
657
800
  } else {
658
801
 
@@ -723,17 +866,31 @@ class WGSLNodeBuilder extends NodeBuilder {
723
866
 
724
867
  if ( this.isUnfilterable( texture ) === false ) {
725
868
 
726
- if ( offsetSnippet ) {
869
+ if ( depthSnippet ) {
727
870
 
728
- return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
871
+ if ( offsetSnippet ) {
729
872
 
730
- }
873
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
874
+
875
+ }
731
876
 
732
- return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
877
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ levelSnippet } )`;
878
+
879
+ } else {
880
+
881
+ if ( offsetSnippet ) {
882
+
883
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
884
+
885
+ }
886
+
887
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
888
+
889
+ }
733
890
 
734
891
  } else if ( this.isFilteredTexture( texture ) ) {
735
892
 
736
- return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet );
893
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet, depthSnippet );
737
894
 
738
895
  } else {
739
896
 
@@ -759,13 +916,27 @@ class WGSLNodeBuilder extends NodeBuilder {
759
916
 
760
917
  if ( shaderStage === 'fragment' ) {
761
918
 
762
- if ( offsetSnippet ) {
919
+ if ( depthSnippet ) {
763
920
 
764
- return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet }, ${ offsetSnippet } )`;
921
+ if ( offsetSnippet ) {
765
922
 
766
- }
923
+ return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ biasSnippet }, ${ offsetSnippet } )`;
924
+
925
+ }
926
+
927
+ return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ biasSnippet } )`;
767
928
 
768
- return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet } )`;
929
+ } else {
930
+
931
+ if ( offsetSnippet ) {
932
+
933
+ return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet }, ${ offsetSnippet } )`;
934
+
935
+ }
936
+
937
+ return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet } )`;
938
+
939
+ }
769
940
 
770
941
  } else {
771
942
 
@@ -797,7 +968,7 @@ class WGSLNodeBuilder extends NodeBuilder {
797
968
  const name = node.name;
798
969
  const type = node.type;
799
970
 
800
- if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) {
971
+ if ( type === 'texture' || type === 'cubeTexture' || type === 'cubeDepthTexture' || type === 'storageTexture' || type === 'texture3D' ) {
801
972
 
802
973
  return name;
803
974
 
@@ -923,7 +1094,7 @@ class WGSLNodeBuilder extends NodeBuilder {
923
1094
 
924
1095
  const bindings = this.getBindGroupArray( groupName, shaderStage );
925
1096
 
926
- if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) {
1097
+ if ( type === 'texture' || type === 'cubeTexture' || type === 'cubeDepthTexture' || type === 'storageTexture' || type === 'texture3D' ) {
927
1098
 
928
1099
  let texture = null;
929
1100
 
@@ -941,7 +1112,7 @@ class WGSLNodeBuilder extends NodeBuilder {
941
1112
 
942
1113
  }
943
1114
 
944
- } else if ( type === 'cubeTexture' ) {
1115
+ } else if ( type === 'cubeTexture' || type === 'cubeDepthTexture' ) {
945
1116
 
946
1117
  texture = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, group, access );
947
1118
 
@@ -955,7 +1126,10 @@ class WGSLNodeBuilder extends NodeBuilder {
955
1126
  texture.mipLevel = texture.store ? node.mipLevel : 0;
956
1127
  texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
957
1128
 
958
- if ( this.isUnfilterable( node.value ) === false && texture.store === false ) {
1129
+ // Cube textures always need samplers (they use textureSampleLevel, not textureLoad)
1130
+ const needsSampler = node.value.isCubeTexture === true || ( this.isUnfilterable( node.value ) === false && texture.store === false );
1131
+
1132
+ if ( needsSampler ) {
959
1133
 
960
1134
  const sampler = new NodeSampler( `${ uniformNode.name }_sampler`, uniformNode.node, group );
961
1135
  sampler.setVisibility( gpuShaderStageLib[ shaderStage ] );
@@ -974,10 +1148,21 @@ class WGSLNodeBuilder extends NodeBuilder {
974
1148
 
975
1149
  } else if ( type === 'buffer' || type === 'storageBuffer' || type === 'indirectStorageBuffer' ) {
976
1150
 
977
- const bufferClass = type === 'buffer' ? NodeUniformBuffer : NodeStorageBuffer;
1151
+ const sharedData = this.getSharedDataFromNode( node );
1152
+
1153
+ let buffer = sharedData.buffer;
1154
+
1155
+ if ( buffer === undefined ) {
1156
+
1157
+ const bufferClass = type === 'buffer' ? NodeUniformBuffer : NodeStorageBuffer;
978
1158
 
979
- const buffer = new bufferClass( node, group );
980
- buffer.setVisibility( gpuShaderStageLib[ shaderStage ] );
1159
+ buffer = new bufferClass( node, group );
1160
+
1161
+ sharedData.buffer = buffer;
1162
+
1163
+ }
1164
+
1165
+ buffer.setVisibility( buffer.getVisibility() | gpuShaderStageLib[ shaderStage ] );
981
1166
 
982
1167
  bindings.push( buffer );
983
1168
 
@@ -987,16 +1172,19 @@ class WGSLNodeBuilder extends NodeBuilder {
987
1172
 
988
1173
  } else {
989
1174
 
990
- const uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );
991
-
992
- let uniformsGroup = uniformsStage[ groupName ];
1175
+ let uniformsGroup = this.uniformGroups[ groupName ];
993
1176
 
994
1177
  if ( uniformsGroup === undefined ) {
995
1178
 
996
1179
  uniformsGroup = new NodeUniformsGroup( groupName, group );
997
- uniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );
1180
+ uniformsGroup.setVisibility( GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT | GPUShaderStage.COMPUTE );
1181
+
1182
+ this.uniformGroups[ groupName ] = uniformsGroup;
998
1183
 
999
- uniformsStage[ groupName ] = uniformsGroup;
1184
+ }
1185
+
1186
+ // Add to bindings for this stage if not already present
1187
+ if ( bindings.indexOf( uniformsGroup ) === - 1 ) {
1000
1188
 
1001
1189
  bindings.push( uniformsGroup );
1002
1190
 
@@ -1004,7 +1192,15 @@ class WGSLNodeBuilder extends NodeBuilder {
1004
1192
 
1005
1193
  uniformGPU = this.getNodeUniform( uniformNode, type );
1006
1194
 
1007
- uniformsGroup.addUniform( uniformGPU );
1195
+ // Only add uniform if not already present in the group (check by name to avoid duplicates across stages)
1196
+ const uniformName = uniformGPU.name;
1197
+ const alreadyExists = uniformsGroup.uniforms.some( u => u.name === uniformName );
1198
+
1199
+ if ( ! alreadyExists ) {
1200
+
1201
+ uniformsGroup.addUniform( uniformGPU );
1202
+
1203
+ }
1008
1204
 
1009
1205
  }
1010
1206
 
@@ -1553,11 +1749,12 @@ ${ flowData.code }
1553
1749
  * @param {string} type - The variable's type.
1554
1750
  * @param {string} name - The variable's name.
1555
1751
  * @param {?number} [count=null] - The array length.
1752
+ * @param {string} [qualifier=''] - The variable's qualifier.
1556
1753
  * @return {string} The WGSL snippet that defines a variable.
1557
1754
  */
1558
- getVar( type, name, count = null ) {
1755
+ getVar( type, name, count = null, qualifier = '' ) {
1559
1756
 
1560
- let snippet = `var ${ name } : `;
1757
+ let snippet = `var${ qualifier } ${ name } : `;
1561
1758
 
1562
1759
  if ( count !== null ) {
1563
1760
 
@@ -1579,7 +1776,15 @@ ${ flowData.code }
1579
1776
  * @param {string} shaderStage - The shader stage.
1580
1777
  * @return {string} The WGSL snippet that defines the variables.
1581
1778
  */
1582
- getVars( shaderStage ) {
1779
+ getVars( shaderStage, global = false ) {
1780
+
1781
+ let qualifier = '';
1782
+
1783
+ if ( global ) {
1784
+
1785
+ qualifier = '<private>';
1786
+
1787
+ }
1583
1788
 
1584
1789
  const snippets = [];
1585
1790
  const vars = this.vars[ shaderStage ];
@@ -1588,13 +1793,13 @@ ${ flowData.code }
1588
1793
 
1589
1794
  for ( const variable of vars ) {
1590
1795
 
1591
- snippets.push( `\t${ this.getVar( variable.type, variable.name, variable.count ) };` );
1796
+ snippets.push( `${ this.getVar( variable.type, variable.name, variable.count, qualifier ) };` );
1592
1797
 
1593
1798
  }
1594
1799
 
1595
1800
  }
1596
1801
 
1597
- return `\n${ snippets.join( '\n' ) }\n`;
1802
+ return global ? snippets.join( '\n' ) : `\n\t${ snippets.join( '\n\t' ) }\n`;
1598
1803
 
1599
1804
  }
1600
1805
 
@@ -1610,7 +1815,7 @@ ${ flowData.code }
1610
1815
 
1611
1816
  if ( shaderStage === 'vertex' ) {
1612
1817
 
1613
- this.getBuiltin( 'position', 'Vertex', 'vec4<f32>', 'vertex' );
1818
+ this.getBuiltin( 'position', 'builtinClipSpace', 'vec4<f32>', 'vertex' );
1614
1819
 
1615
1820
  }
1616
1821
 
@@ -1619,13 +1824,15 @@ ${ flowData.code }
1619
1824
  const varyings = this.varyings;
1620
1825
  const vars = this.vars[ shaderStage ];
1621
1826
 
1827
+ let varyingIndex = 0;
1828
+
1622
1829
  for ( let index = 0; index < varyings.length; index ++ ) {
1623
1830
 
1624
1831
  const varying = varyings[ index ];
1625
1832
 
1626
1833
  if ( varying.needsInterpolation ) {
1627
1834
 
1628
- let attributesSnippet = `@location( ${index} )`;
1835
+ let attributesSnippet = `@location( ${ varyingIndex ++ } )`;
1629
1836
 
1630
1837
  if ( varying.interpolationType ) {
1631
1838
 
@@ -1637,7 +1844,7 @@ ${ flowData.code }
1637
1844
 
1638
1845
  } else if ( /^(int|uint|ivec|uvec)/.test( varying.type ) ) {
1639
1846
 
1640
- attributesSnippet += ` @interpolate( ${ this.renderer.backend.compatibilityMode ? 'flat, either' : 'flat' } )`;
1847
+ attributesSnippet += ' @interpolate(flat, either)';
1641
1848
 
1642
1849
  }
1643
1850
 
@@ -1686,6 +1893,7 @@ ${ flowData.code }
1686
1893
  */
1687
1894
  getUniforms( shaderStage ) {
1688
1895
 
1896
+ const backend = this.renderer.backend;
1689
1897
  const uniforms = this.uniforms[ shaderStage ];
1690
1898
 
1691
1899
  const bindingSnippets = [];
@@ -1698,11 +1906,14 @@ ${ flowData.code }
1698
1906
  const groupName = uniform.groupNode.name;
1699
1907
  const uniformIndexes = this.bindingsIndexes[ groupName ];
1700
1908
 
1701
- if ( uniform.type === 'texture' || uniform.type === 'cubeTexture' || uniform.type === 'storageTexture' || uniform.type === 'texture3D' ) {
1909
+ if ( uniform.type === 'texture' || uniform.type === 'cubeTexture' || uniform.type === 'cubeDepthTexture' || uniform.type === 'storageTexture' || uniform.type === 'texture3D' ) {
1702
1910
 
1703
1911
  const texture = uniform.node.value;
1704
1912
 
1705
- if ( this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) {
1913
+ // Cube textures always need samplers (they use textureSampleLevel, not textureLoad)
1914
+ const needsSampler = texture.isCubeTexture === true || ( this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true );
1915
+
1916
+ if ( needsSampler ) {
1706
1917
 
1707
1918
  if ( this.isSampleCompare( texture ) ) {
1708
1919
 
@@ -1720,7 +1931,7 @@ ${ flowData.code }
1720
1931
 
1721
1932
  let multisampled = '';
1722
1933
 
1723
- const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
1934
+ const { primarySamples } = backend.utils.getTextureSampleData( texture );
1724
1935
 
1725
1936
  if ( primarySamples > 1 ) {
1726
1937
 
@@ -1728,13 +1939,17 @@ ${ flowData.code }
1728
1939
 
1729
1940
  }
1730
1941
 
1731
- if ( texture.isCubeTexture === true ) {
1942
+ if ( texture.isCubeTexture === true && texture.isDepthTexture === true ) {
1943
+
1944
+ textureType = 'texture_depth_cube';
1945
+
1946
+ } else if ( texture.isCubeTexture === true ) {
1732
1947
 
1733
1948
  textureType = 'texture_cube<f32>';
1734
1949
 
1735
1950
  } else if ( texture.isDepthTexture === true ) {
1736
1951
 
1737
- if ( this.renderer.backend.compatibilityMode && texture.compareFunction === null ) {
1952
+ if ( backend.compatibilityMode && texture.compareFunction === null ) {
1738
1953
 
1739
1954
  textureType = `texture${ multisampled }_2d<f32>`;
1740
1955
 
@@ -1746,7 +1961,7 @@ ${ flowData.code }
1746
1961
 
1747
1962
  } else if ( uniform.node.isStorageTextureNode === true ) {
1748
1963
 
1749
- const format = getFormat( texture );
1964
+ const format = getFormat( texture, backend.device );
1750
1965
  const access = this.getStorageAccess( uniform.node, shaderStage );
1751
1966
 
1752
1967
  const is3D = uniform.node.value.is3DTexture;
@@ -1797,16 +2012,51 @@ ${ flowData.code }
1797
2012
 
1798
2013
  } else {
1799
2014
 
1800
- const vectorType = this.getType( this.getVectorType( uniform.type ) );
1801
2015
  const groupName = uniform.groupNode.name;
1802
2016
 
1803
- const group = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = {
1804
- index: uniformIndexes.binding ++,
1805
- id: uniformIndexes.group,
1806
- snippets: []
1807
- } );
2017
+ // Check if this group has already been processed in this shader stage
2018
+ if ( uniformGroups[ groupName ] === undefined ) {
2019
+
2020
+ // Get the shared uniform group that contains uniforms from all stages
2021
+ const sharedUniformGroup = this.uniformGroups[ groupName ];
2022
+
2023
+ if ( sharedUniformGroup !== undefined ) {
2024
+
2025
+ // Generate snippets for ALL uniforms in this shared group
2026
+ const snippets = [];
2027
+
2028
+ for ( const sharedUniform of sharedUniformGroup.uniforms ) {
2029
+
2030
+ const type = sharedUniform.getType();
2031
+ const vectorType = this.getType( this.getVectorType( type ) );
2032
+ snippets.push( `\t${ sharedUniform.name } : ${ vectorType }` );
2033
+
2034
+ }
2035
+
2036
+ // Check if this group already has an assigned binding index (from another shader stage)
2037
+ let groupBinding = this.uniformGroupsBindings[ groupName ];
2038
+
2039
+ if ( groupBinding === undefined ) {
2040
+
2041
+ // First time processing this group - assign a new binding index
2042
+ groupBinding = {
2043
+ index: uniformIndexes.binding ++,
2044
+ id: uniformIndexes.group
2045
+ };
2046
+
2047
+ this.uniformGroupsBindings[ groupName ] = groupBinding;
2048
+
2049
+ }
2050
+
2051
+ uniformGroups[ groupName ] = {
2052
+ index: groupBinding.index,
2053
+ id: groupBinding.id,
2054
+ snippets: snippets
2055
+ };
1808
2056
 
1809
- group.snippets.push( `\t${ uniform.name } : ${ vectorType }` );
2057
+ }
2058
+
2059
+ }
1810
2060
 
1811
2061
  }
1812
2062
 
@@ -1820,9 +2070,7 @@ ${ flowData.code }
1820
2070
 
1821
2071
  }
1822
2072
 
1823
- let code = bindingSnippets.join( '\n' );
1824
- code += bufferSnippets.join( '\n' );
1825
- code += structSnippets.join( '\n' );
2073
+ const code = [ ...bindingSnippets, ...bufferSnippets, ...structSnippets ].join( '\n' );
1826
2074
 
1827
2075
  return code;
1828
2076
 
@@ -1841,12 +2089,14 @@ ${ flowData.code }
1841
2089
 
1842
2090
  this.shaderStage = shaderStage;
1843
2091
 
2092
+ const allowGlobal = this.allowGlobalVariables;
2093
+
1844
2094
  const stageData = shadersData[ shaderStage ];
1845
2095
  stageData.uniforms = this.getUniforms( shaderStage );
1846
2096
  stageData.attributes = this.getAttributes( shaderStage );
1847
2097
  stageData.varyings = this.getVaryings( shaderStage );
1848
2098
  stageData.structs = this.getStructs( shaderStage );
1849
- stageData.vars = this.getVars( shaderStage );
2099
+ stageData.vars = this.getVars( shaderStage, allowGlobal );
1850
2100
  stageData.codes = this.getCodes( shaderStage );
1851
2101
  stageData.directives = this.getDirectives( shaderStage );
1852
2102
  stageData.scopedArrays = this.getScopedArrays( shaderStage );
@@ -1883,7 +2133,7 @@ ${ flowData.code }
1883
2133
 
1884
2134
  if ( shaderStage === 'vertex' ) {
1885
2135
 
1886
- flow += `varyings.Vertex = ${ flowSlotData.result };`;
2136
+ flow += `varyings.builtinClipSpace = ${ flowSlotData.result };`;
1887
2137
 
1888
2138
  } else if ( shaderStage === 'fragment' ) {
1889
2139
 
@@ -1896,7 +2146,7 @@ ${ flowData.code }
1896
2146
 
1897
2147
  } else {
1898
2148
 
1899
- let structSnippet = '\t@location(0) color: vec4<f32>';
2149
+ let structSnippet = '\t@location( 0 ) color: vec4<f32>';
1900
2150
 
1901
2151
  const builtins = this.getBuiltins( 'output' );
1902
2152
 
@@ -1980,6 +2230,30 @@ ${ flowData.code }
1980
2230
 
1981
2231
  }
1982
2232
 
2233
+ /**
2234
+ * Returns the float packing method name for a given numeric encoding.
2235
+ *
2236
+ * @param {string} encoding - The numeric encoding that describes how the float values are mapped to the integer range.
2237
+ * @returns {string} The resolve WGSL float packing method name.
2238
+ */
2239
+ getFloatPackingMethod( encoding ) {
2240
+
2241
+ return this.getMethod( `floatpack_${ encoding }_2x16` );
2242
+
2243
+ }
2244
+
2245
+ /**
2246
+ * Returns the float unpacking method name for a given numeric encoding.
2247
+ *
2248
+ * @param {string} encoding - The numeric encoding that describes how the integer values are mapped to the float range.
2249
+ * @returns {string} The resolve WGSL float unpacking method name.
2250
+ */
2251
+ getFloatUnpackingMethod( encoding ) {
2252
+
2253
+ return this.getMethod( `floatunpack_${ encoding }_2x16` );
2254
+
2255
+ }
2256
+
1983
2257
  /**
1984
2258
  * Returns the native snippet for a ternary operation.
1985
2259
  *
@@ -1994,7 +2268,6 @@ ${ flowData.code }
1994
2268
 
1995
2269
  }
1996
2270
 
1997
-
1998
2271
  /**
1999
2272
  * Returns the WGSL type of the given node data type.
2000
2273
  *
@@ -2098,15 +2371,15 @@ ${shaderData.uniforms}
2098
2371
  ${shaderData.varyings}
2099
2372
  var<private> varyings : VaryingsStruct;
2100
2373
 
2374
+ // vars
2375
+ ${shaderData.vars}
2376
+
2101
2377
  // codes
2102
2378
  ${shaderData.codes}
2103
2379
 
2104
2380
  @vertex
2105
2381
  fn main( ${shaderData.attributes} ) -> VaryingsStruct {
2106
2382
 
2107
- // vars
2108
- ${shaderData.vars}
2109
-
2110
2383
  // flow
2111
2384
  ${shaderData.flow}
2112
2385
 
@@ -2136,15 +2409,15 @@ ${shaderData.structs}
2136
2409
  // uniforms
2137
2410
  ${shaderData.uniforms}
2138
2411
 
2412
+ // vars
2413
+ ${shaderData.vars}
2414
+
2139
2415
  // codes
2140
2416
  ${shaderData.codes}
2141
2417
 
2142
2418
  @fragment
2143
2419
  fn main( ${shaderData.varyings} ) -> ${shaderData.returnType} {
2144
2420
 
2145
- // vars
2146
- ${shaderData.vars}
2147
-
2148
2421
  // flow
2149
2422
  ${shaderData.flow}
2150
2423
 
@@ -2181,20 +2454,23 @@ ${ shaderData.structs }
2181
2454
  // uniforms
2182
2455
  ${ shaderData.uniforms }
2183
2456
 
2457
+ // vars
2458
+ ${ this.allowGlobalVariables ? shaderData.vars : '' }
2459
+
2184
2460
  // codes
2185
2461
  ${ shaderData.codes }
2186
2462
 
2187
2463
  @compute @workgroup_size( ${ workgroupSizeX }, ${ workgroupSizeY }, ${ workgroupSizeZ } )
2188
2464
  fn main( ${ shaderData.attributes } ) {
2189
2465
 
2466
+ // local vars
2467
+ ${ this.allowGlobalVariables ? '' : shaderData.vars }
2468
+
2190
2469
  // system
2191
2470
  instanceIndex = globalId.x
2192
2471
  + globalId.y * ( ${ workgroupSizeX } * numWorkgroups.x )
2193
2472
  + globalId.z * ( ${ workgroupSizeX } * numWorkgroups.x ) * ( ${ workgroupSizeY } * numWorkgroups.y );
2194
2473
 
2195
- // vars
2196
- ${ shaderData.vars }
2197
-
2198
2474
  // flow
2199
2475
  ${ shaderData.flow }
2200
2476