super-three 0.179.0 → 0.184.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (696) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +14522 -12207
  4. package/build/three.core.js +12005 -10954
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +2270 -1005
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +63 -18
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +16573 -7890
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +16533 -7888
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  15. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  16. package/examples/jsm/Addons.js +12 -4
  17. package/examples/jsm/animation/CCDIKSolver.js +8 -4
  18. package/examples/jsm/controls/ArcballControls.js +15 -12
  19. package/examples/jsm/controls/DragControls.js +9 -59
  20. package/examples/jsm/controls/FirstPersonControls.js +61 -57
  21. package/examples/jsm/controls/FlyControls.js +5 -1
  22. package/examples/jsm/controls/MapControls.js +55 -1
  23. package/examples/jsm/controls/OrbitControls.js +113 -10
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +9 -9
  26. package/examples/jsm/controls/TransformControls.js +35 -3
  27. package/examples/jsm/csm/CSM.js +2 -1
  28. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  29. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  30. package/examples/jsm/effects/AsciiEffect.js +8 -8
  31. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  32. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  33. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  34. package/examples/jsm/exporters/EXRExporter.js +2 -2
  35. package/examples/jsm/exporters/GLTFExporter.js +185 -34
  36. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  37. package/examples/jsm/exporters/PLYExporter.js +1 -1
  38. package/examples/jsm/exporters/USDZExporter.js +31 -5
  39. package/examples/jsm/geometries/DecalGeometry.js +3 -3
  40. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  41. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  42. package/examples/jsm/geometries/TextGeometry.js +21 -2
  43. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  44. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  45. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  46. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  47. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  48. package/examples/jsm/helpers/ViewHelper.js +110 -13
  49. package/examples/jsm/inspector/Extension.js +13 -0
  50. package/examples/jsm/inspector/Inspector.js +542 -0
  51. package/examples/jsm/inspector/RendererInspector.js +425 -0
  52. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  53. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  55. package/examples/jsm/inspector/tabs/Console.js +238 -0
  56. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  57. package/examples/jsm/inspector/tabs/Parameters.js +380 -0
  58. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  59. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  60. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  61. package/examples/jsm/inspector/tabs/Viewer.js +268 -0
  62. package/examples/jsm/inspector/ui/Graph.js +95 -0
  63. package/examples/jsm/inspector/ui/Item.js +170 -0
  64. package/examples/jsm/inspector/ui/List.js +75 -0
  65. package/examples/jsm/inspector/ui/Profiler.js +2072 -0
  66. package/examples/jsm/inspector/ui/Style.js +1667 -0
  67. package/examples/jsm/inspector/ui/Tab.js +265 -0
  68. package/examples/jsm/inspector/ui/Values.js +476 -0
  69. package/examples/jsm/inspector/ui/utils.js +69 -0
  70. package/examples/jsm/interaction/InteractionManager.js +226 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  73. package/examples/jsm/interactive/SelectionBox.js +30 -0
  74. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  75. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  76. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  77. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  79. package/examples/jsm/lines/Line2.js +3 -3
  80. package/examples/jsm/lines/LineGeometry.js +1 -1
  81. package/examples/jsm/lines/LineMaterial.js +7 -1
  82. package/examples/jsm/lines/LineSegments2.js +2 -2
  83. package/examples/jsm/lines/Wireframe.js +2 -2
  84. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  85. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  86. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  87. package/examples/jsm/loaders/3DMLoader.js +5 -4
  88. package/examples/jsm/loaders/3MFLoader.js +3 -3
  89. package/examples/jsm/loaders/AMFLoader.js +2 -2
  90. package/examples/jsm/loaders/ColladaLoader.js +27 -4029
  91. package/examples/jsm/loaders/DDSLoader.js +1 -1
  92. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  93. package/examples/jsm/loaders/EXRLoader.js +692 -53
  94. package/examples/jsm/loaders/FBXLoader.js +237 -39
  95. package/examples/jsm/loaders/FontLoader.js +23 -5
  96. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  97. package/examples/jsm/loaders/GLTFLoader.js +159 -185
  98. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  99. package/examples/jsm/loaders/HDRLoader.js +485 -0
  100. package/examples/jsm/loaders/KMZLoader.js +5 -5
  101. package/examples/jsm/loaders/KTX2Loader.js +162 -53
  102. package/examples/jsm/loaders/KTXLoader.js +2 -2
  103. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  104. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  105. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  106. package/examples/jsm/loaders/LWOLoader.js +9 -41
  107. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  108. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  109. package/examples/jsm/loaders/OBJLoader.js +1 -1
  110. package/examples/jsm/loaders/PCDLoader.js +4 -2
  111. package/examples/jsm/loaders/PDBLoader.js +1 -1
  112. package/examples/jsm/loaders/RGBELoader.js +7 -473
  113. package/examples/jsm/loaders/SVGLoader.js +4 -4
  114. package/examples/jsm/loaders/TDSLoader.js +0 -2
  115. package/examples/jsm/loaders/TGALoader.js +0 -2
  116. package/examples/jsm/loaders/TTFLoader.js +4 -4
  117. package/examples/jsm/loaders/USDLoader.js +100 -40
  118. package/examples/jsm/loaders/UltraHDRLoader.js +287 -162
  119. package/examples/jsm/loaders/VOXLoader.js +660 -117
  120. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  121. package/examples/jsm/loaders/VTKLoader.js +42 -25
  122. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  123. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  124. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  125. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  126. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  127. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  128. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  129. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  130. package/examples/jsm/math/ColorSpaces.js +19 -1
  131. package/examples/jsm/math/ConvexHull.js +3 -3
  132. package/examples/jsm/math/ImprovedNoise.js +1 -1
  133. package/examples/jsm/math/Lut.js +2 -2
  134. package/examples/jsm/math/Octree.js +131 -1
  135. package/examples/jsm/math/SimplexNoise.js +1 -1
  136. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  137. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  138. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  139. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  140. package/examples/jsm/misc/RollerCoaster.js +42 -4
  141. package/examples/jsm/misc/TubePainter.js +383 -40
  142. package/examples/jsm/misc/Volume.js +1 -2
  143. package/examples/jsm/misc/VolumeSlice.js +0 -1
  144. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  145. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  146. package/examples/jsm/objects/LensflareMesh.js +1 -1
  147. package/examples/jsm/objects/Reflector.js +73 -25
  148. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  149. package/examples/jsm/objects/Sky.js +91 -7
  150. package/examples/jsm/objects/SkyMesh.js +151 -17
  151. package/examples/jsm/objects/Water.js +7 -6
  152. package/examples/jsm/objects/Water2.js +5 -3
  153. package/examples/jsm/objects/WaterMesh.js +11 -13
  154. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  155. package/examples/jsm/physics/JoltPhysics.js +10 -6
  156. package/examples/jsm/physics/RapierPhysics.js +9 -5
  157. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  158. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  159. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  160. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  161. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  162. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  163. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  164. package/examples/jsm/postprocessing/UnrealBloomPass.js +56 -24
  165. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  166. package/examples/jsm/renderers/CSS3DRenderer.js +8 -7
  167. package/examples/jsm/renderers/Projector.js +246 -28
  168. package/examples/jsm/renderers/SVGRenderer.js +175 -61
  169. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  170. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  171. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  172. package/examples/jsm/shaders/BokehShader.js +1 -1
  173. package/examples/jsm/shaders/BokehShader2.js +1 -1
  174. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  175. package/examples/jsm/shaders/FocusShader.js +1 -1
  176. package/examples/jsm/shaders/GTAOShader.js +21 -8
  177. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  178. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  179. package/examples/jsm/shaders/PoissonDenoiseShader.js +8 -4
  180. package/examples/jsm/shaders/SAOShader.js +17 -4
  181. package/examples/jsm/shaders/SSAOShader.js +11 -1
  182. package/examples/jsm/shaders/SSRShader.js +7 -6
  183. package/examples/jsm/shaders/SepiaShader.js +1 -1
  184. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  185. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  186. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +3 -5
  187. package/examples/jsm/shaders/VignetteShader.js +1 -1
  188. package/examples/jsm/transpiler/AST.js +44 -0
  189. package/examples/jsm/transpiler/GLSLDecoder.js +85 -25
  190. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  191. package/examples/jsm/transpiler/TSLEncoder.js +52 -10
  192. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  193. package/examples/jsm/transpiler/WGSLEncoder.js +51 -0
  194. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  195. package/examples/jsm/tsl/display/AfterImageNode.js +36 -24
  196. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  197. package/examples/jsm/tsl/display/AnamorphicNode.js +40 -5
  198. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  199. package/examples/jsm/tsl/display/BloomNode.js +23 -9
  200. package/examples/jsm/tsl/display/CRT.js +150 -0
  201. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +5 -37
  202. package/examples/jsm/tsl/display/DenoiseNode.js +3 -1
  203. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  204. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  205. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  206. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  207. package/examples/jsm/tsl/display/GTAONode.js +59 -9
  208. package/examples/jsm/tsl/display/GaussianBlurNode.js +68 -35
  209. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  210. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  211. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  212. package/examples/jsm/tsl/display/OutlineNode.js +81 -20
  213. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  214. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  215. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  216. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  217. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  218. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  219. package/examples/jsm/tsl/display/SSGINode.js +638 -0
  220. package/examples/jsm/tsl/display/SSRNode.js +186 -69
  221. package/examples/jsm/tsl/display/SSSNode.js +490 -0
  222. package/examples/jsm/tsl/display/Shape.js +29 -0
  223. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  224. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  225. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  226. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  227. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  228. package/examples/jsm/tsl/display/TRAANode.js +381 -75
  229. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  230. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  231. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  232. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  233. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  234. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  235. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  236. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  237. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  238. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  239. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  240. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  241. package/examples/jsm/tsl/math/Bayer.js +53 -3
  242. package/examples/jsm/utils/BufferGeometryUtils.js +3 -4
  243. package/examples/jsm/utils/ColorUtils.js +76 -0
  244. package/examples/jsm/utils/LDrawUtils.js +1 -1
  245. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  246. package/examples/jsm/utils/ShadowMapViewerGPU.js +13 -6
  247. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  248. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  249. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  250. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  251. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  252. package/examples/jsm/webxr/XRHandModelFactory.js +4 -7
  253. package/package.json +27 -38
  254. package/src/Three.Core.js +7 -3
  255. package/src/Three.TSL.js +61 -16
  256. package/src/Three.WebGPU.Nodes.js +7 -0
  257. package/src/Three.WebGPU.js +11 -0
  258. package/src/Three.js +1 -0
  259. package/src/animation/AnimationAction.js +12 -2
  260. package/src/animation/AnimationClip.js +21 -5
  261. package/src/animation/AnimationMixer.js +9 -3
  262. package/src/animation/AnimationObjectGroup.js +2 -1
  263. package/src/animation/AnimationUtils.js +1 -12
  264. package/src/animation/KeyframeTrack.js +54 -14
  265. package/src/animation/PropertyBinding.js +12 -11
  266. package/src/animation/PropertyMixer.js +4 -4
  267. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  268. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  269. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  270. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  271. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  272. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  273. package/src/audio/Audio.js +11 -10
  274. package/src/audio/AudioContext.js +2 -2
  275. package/src/audio/AudioListener.js +5 -3
  276. package/src/audio/PositionalAudio.js +1 -1
  277. package/src/cameras/Camera.js +32 -2
  278. package/src/cameras/CubeCamera.js +20 -0
  279. package/src/cameras/OrthographicCamera.js +1 -1
  280. package/src/cameras/PerspectiveCamera.js +1 -1
  281. package/src/cameras/StereoCamera.js +2 -2
  282. package/src/constants.js +100 -7
  283. package/src/core/BufferAttribute.js +13 -1
  284. package/src/core/BufferGeometry.js +24 -12
  285. package/src/core/Clock.js +7 -0
  286. package/src/core/EventDispatcher.js +1 -1
  287. package/src/core/InterleavedBuffer.js +1 -1
  288. package/src/core/InterleavedBufferAttribute.js +3 -2
  289. package/src/core/Object3D.js +55 -6
  290. package/src/core/Raycaster.js +4 -3
  291. package/src/core/RenderTarget.js +14 -5
  292. package/src/extras/Controls.js +5 -4
  293. package/src/extras/DataUtils.js +2 -1
  294. package/src/extras/Earcut.js +6 -0
  295. package/src/extras/ImageUtils.js +2 -2
  296. package/src/extras/PMREMGenerator.js +259 -57
  297. package/src/extras/TextureUtils.js +6 -1
  298. package/src/extras/core/Curve.js +2 -1
  299. package/src/extras/core/Interpolations.js +7 -1
  300. package/src/extras/core/ShapePath.js +4 -4
  301. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  302. package/src/extras/lib/earcut.js +8 -8
  303. package/src/geometries/BoxGeometry.js +1 -0
  304. package/src/geometries/CapsuleGeometry.js +1 -0
  305. package/src/geometries/CircleGeometry.js +1 -0
  306. package/src/geometries/ConeGeometry.js +1 -0
  307. package/src/geometries/CylinderGeometry.js +1 -0
  308. package/src/geometries/DodecahedronGeometry.js +1 -0
  309. package/src/geometries/ExtrudeGeometry.js +10 -8
  310. package/src/geometries/IcosahedronGeometry.js +1 -0
  311. package/src/geometries/LatheGeometry.js +1 -0
  312. package/src/geometries/OctahedronGeometry.js +1 -0
  313. package/src/geometries/PlaneGeometry.js +1 -0
  314. package/src/geometries/PolyhedronGeometry.js +1 -1
  315. package/src/geometries/RingGeometry.js +1 -0
  316. package/src/geometries/ShapeGeometry.js +1 -0
  317. package/src/geometries/SphereGeometry.js +1 -0
  318. package/src/geometries/TetrahedronGeometry.js +1 -0
  319. package/src/geometries/TorusGeometry.js +9 -3
  320. package/src/geometries/TorusKnotGeometry.js +1 -0
  321. package/src/geometries/TubeGeometry.js +1 -0
  322. package/src/helpers/CameraHelper.js +4 -1
  323. package/src/helpers/DirectionalLightHelper.js +4 -1
  324. package/src/helpers/HemisphereLightHelper.js +3 -0
  325. package/src/helpers/PointLightHelper.js +1 -25
  326. package/src/helpers/SpotLightHelper.js +3 -0
  327. package/src/lights/DirectionalLight.js +13 -0
  328. package/src/lights/HemisphereLight.js +10 -0
  329. package/src/lights/Light.js +1 -11
  330. package/src/lights/LightProbe.js +0 -15
  331. package/src/lights/LightShadow.js +15 -6
  332. package/src/lights/PointLight.js +15 -0
  333. package/src/lights/PointLightShadow.js +0 -86
  334. package/src/lights/SpotLight.js +22 -1
  335. package/src/lights/webgpu/IESSpotLight.js +2 -1
  336. package/src/lights/webgpu/ProjectorLight.js +1 -1
  337. package/src/loaders/AnimationLoader.js +2 -1
  338. package/src/loaders/AudioLoader.js +13 -2
  339. package/src/loaders/BufferGeometryLoader.js +2 -2
  340. package/src/loaders/Cache.js +30 -2
  341. package/src/loaders/DataTextureLoader.js +6 -4
  342. package/src/loaders/FileLoader.js +4 -4
  343. package/src/loaders/ImageBitmapLoader.js +17 -13
  344. package/src/loaders/ImageLoader.js +1 -1
  345. package/src/loaders/Loader.js +9 -3
  346. package/src/loaders/LoadingManager.js +25 -3
  347. package/src/loaders/MaterialLoader.js +6 -4
  348. package/src/loaders/ObjectLoader.js +57 -17
  349. package/src/loaders/TextureLoader.js +1 -1
  350. package/src/loaders/nodes/NodeLoader.js +5 -4
  351. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  352. package/src/materials/Material.js +18 -3
  353. package/src/materials/MeshBasicMaterial.js +1 -0
  354. package/src/materials/MeshDepthMaterial.js +1 -0
  355. package/src/materials/MeshDistanceMaterial.js +1 -1
  356. package/src/materials/MeshLambertMaterial.js +11 -1
  357. package/src/materials/MeshMatcapMaterial.js +22 -0
  358. package/src/materials/MeshNormalMaterial.js +1 -0
  359. package/src/materials/MeshPhongMaterial.js +11 -1
  360. package/src/materials/MeshPhysicalMaterial.js +2 -1
  361. package/src/materials/MeshStandardMaterial.js +8 -7
  362. package/src/materials/MeshToonMaterial.js +2 -1
  363. package/src/materials/PointsMaterial.js +1 -1
  364. package/src/materials/ShaderMaterial.js +22 -3
  365. package/src/materials/nodes/Line2NodeMaterial.js +36 -9
  366. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  367. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  368. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  369. package/src/materials/nodes/NodeMaterial.js +95 -35
  370. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  371. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  372. package/src/materials/nodes/manager/NodeMaterialObserver.js +194 -88
  373. package/src/math/Color.js +6 -5
  374. package/src/math/ColorManagement.js +9 -3
  375. package/src/math/Cylindrical.js +1 -1
  376. package/src/math/Euler.js +2 -1
  377. package/src/math/Line3.js +6 -5
  378. package/src/math/MathUtils.js +23 -21
  379. package/src/math/Matrix2.js +14 -10
  380. package/src/math/Matrix3.js +15 -11
  381. package/src/math/Matrix4.js +94 -81
  382. package/src/math/Plane.js +5 -4
  383. package/src/math/Quaternion.js +60 -84
  384. package/src/math/Sphere.js +1 -1
  385. package/src/math/Spherical.js +1 -1
  386. package/src/math/Triangle.js +1 -1
  387. package/src/math/Vector2.js +11 -7
  388. package/src/math/Vector3.js +15 -13
  389. package/src/math/Vector4.js +13 -9
  390. package/src/math/interpolants/BezierInterpolant.js +108 -0
  391. package/src/nodes/Nodes.js +86 -65
  392. package/src/nodes/TSL.js +11 -8
  393. package/src/nodes/accessors/Arrays.js +1 -1
  394. package/src/nodes/accessors/BatchNode.js +10 -10
  395. package/src/nodes/accessors/Bitangent.js +5 -5
  396. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  397. package/src/nodes/accessors/BufferNode.js +30 -3
  398. package/src/nodes/accessors/Camera.js +260 -13
  399. package/src/nodes/accessors/ClippingNode.js +10 -9
  400. package/src/nodes/accessors/CubeTextureNode.js +32 -6
  401. package/src/nodes/accessors/InstanceNode.js +164 -39
  402. package/src/nodes/accessors/Lights.js +10 -0
  403. package/src/nodes/accessors/MaterialNode.js +9 -1
  404. package/src/nodes/accessors/MaterialProperties.js +2 -5
  405. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  406. package/src/nodes/accessors/ModelNode.js +1 -1
  407. package/src/nodes/accessors/Normal.js +16 -15
  408. package/src/nodes/accessors/Object3DNode.js +2 -2
  409. package/src/nodes/accessors/Position.js +51 -3
  410. package/src/nodes/accessors/ReferenceBaseNode.js +7 -7
  411. package/src/nodes/accessors/ReferenceNode.js +11 -10
  412. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  413. package/src/nodes/accessors/SceneProperties.js +47 -0
  414. package/src/nodes/accessors/SkinningNode.js +27 -26
  415. package/src/nodes/accessors/StorageBufferNode.js +14 -24
  416. package/src/nodes/accessors/StorageTextureNode.js +62 -9
  417. package/src/nodes/accessors/Tangent.js +4 -14
  418. package/src/nodes/accessors/Texture3DNode.js +41 -31
  419. package/src/nodes/accessors/TextureNode.js +193 -63
  420. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  421. package/src/nodes/accessors/UserDataNode.js +1 -2
  422. package/src/nodes/accessors/VertexColorNode.js +1 -2
  423. package/src/nodes/code/FunctionCallNode.js +25 -5
  424. package/src/nodes/code/FunctionNode.js +25 -3
  425. package/src/nodes/core/ArrayNode.js +22 -2
  426. package/src/nodes/core/AssignNode.js +6 -5
  427. package/src/nodes/core/AttributeNode.js +5 -4
  428. package/src/nodes/core/BypassNode.js +1 -1
  429. package/src/nodes/core/ContextNode.js +133 -15
  430. package/src/nodes/core/IndexNode.js +4 -3
  431. package/src/nodes/core/InputNode.js +3 -2
  432. package/src/nodes/core/InspectorNode.js +128 -0
  433. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +41 -8
  434. package/src/nodes/core/MRTNode.js +48 -2
  435. package/src/nodes/core/Node.js +264 -46
  436. package/src/nodes/core/NodeBuilder.js +453 -87
  437. package/src/nodes/core/NodeError.js +28 -0
  438. package/src/nodes/core/NodeFrame.js +31 -23
  439. package/src/nodes/core/NodeFunction.js +2 -1
  440. package/src/nodes/core/NodeParser.js +2 -1
  441. package/src/nodes/core/NodeUniform.js +1 -1
  442. package/src/nodes/core/NodeUtils.js +25 -97
  443. package/src/nodes/core/OutputStructNode.js +12 -10
  444. package/src/nodes/core/ParameterNode.js +34 -3
  445. package/src/nodes/core/PropertyNode.js +26 -3
  446. package/src/nodes/core/StackNode.js +99 -23
  447. package/src/nodes/core/StackTrace.js +139 -0
  448. package/src/nodes/core/StructNode.js +22 -8
  449. package/src/nodes/core/StructTypeNode.js +13 -18
  450. package/src/nodes/core/SubBuildNode.js +4 -4
  451. package/src/nodes/core/UniformGroupNode.js +36 -6
  452. package/src/nodes/core/UniformNode.js +37 -13
  453. package/src/nodes/core/VarNode.js +96 -34
  454. package/src/nodes/core/VaryingNode.js +2 -18
  455. package/src/nodes/display/BlendModes.js +0 -63
  456. package/src/nodes/display/BumpMapNode.js +1 -1
  457. package/src/nodes/display/ColorAdjustment.js +18 -1
  458. package/src/nodes/display/ColorSpaceNode.js +3 -3
  459. package/src/nodes/display/FrontFacingNode.js +4 -8
  460. package/src/nodes/display/NormalMapNode.js +41 -5
  461. package/src/nodes/display/PassNode.js +175 -25
  462. package/src/nodes/display/RenderOutputNode.js +35 -9
  463. package/src/nodes/display/ScreenNode.js +47 -15
  464. package/src/nodes/display/ToneMappingNode.js +32 -5
  465. package/src/nodes/display/ToonOutlinePassNode.js +10 -2
  466. package/src/nodes/display/ViewportDepthNode.js +52 -4
  467. package/src/nodes/display/ViewportDepthTextureNode.js +14 -6
  468. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  469. package/src/nodes/display/ViewportTextureNode.js +72 -14
  470. package/src/nodes/fog/Fog.js +18 -34
  471. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  472. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  473. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  474. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  475. package/src/nodes/functions/BasicLightingModel.js +2 -1
  476. package/src/nodes/functions/PhysicalLightingModel.js +128 -46
  477. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  478. package/src/nodes/geometry/RangeNode.js +44 -6
  479. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  480. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  481. package/src/nodes/gpgpu/ComputeBuiltinNode.js +4 -4
  482. package/src/nodes/gpgpu/ComputeNode.js +76 -38
  483. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  484. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -4
  485. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  486. package/src/nodes/lighting/EnvironmentNode.js +34 -9
  487. package/src/nodes/lighting/LightsNode.js +10 -32
  488. package/src/nodes/lighting/PointShadowNode.js +167 -148
  489. package/src/nodes/lighting/ShadowFilterNode.js +55 -65
  490. package/src/nodes/lighting/ShadowNode.js +189 -44
  491. package/src/nodes/math/BitcastNode.js +156 -0
  492. package/src/nodes/math/BitcountNode.js +433 -0
  493. package/src/nodes/math/ConditionalNode.js +25 -8
  494. package/src/nodes/math/MathNode.js +98 -57
  495. package/src/nodes/math/OperatorNode.js +8 -5
  496. package/src/nodes/math/PackFloatNode.js +98 -0
  497. package/src/nodes/math/UnpackFloatNode.js +96 -0
  498. package/src/nodes/pmrem/PMREMNode.js +1 -1
  499. package/src/nodes/pmrem/PMREMUtils.js +111 -2
  500. package/src/nodes/shapes/Shapes.js +1 -1
  501. package/src/nodes/tsl/TSLBase.js +6 -3
  502. package/src/nodes/tsl/TSLCore.js +488 -166
  503. package/src/nodes/utils/ArrayElementNode.js +14 -1
  504. package/src/nodes/utils/ConvertNode.js +1 -1
  505. package/src/nodes/utils/DebugNode.js +14 -13
  506. package/src/nodes/utils/EventNode.js +67 -2
  507. package/src/nodes/utils/FlipNode.js +1 -1
  508. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  509. package/src/nodes/utils/JoinNode.js +7 -4
  510. package/src/nodes/utils/LoopNode.js +20 -24
  511. package/src/nodes/utils/MemberNode.js +60 -8
  512. package/src/nodes/utils/Packing.js +13 -1
  513. package/src/nodes/utils/PostProcessingUtils.js +60 -1
  514. package/src/nodes/utils/RTTNode.js +14 -4
  515. package/src/nodes/utils/ReflectorNode.js +61 -11
  516. package/src/nodes/utils/Remap.js +48 -0
  517. package/src/nodes/utils/RotateNode.js +1 -1
  518. package/src/nodes/utils/SampleNode.js +12 -2
  519. package/src/nodes/utils/SetNode.js +1 -1
  520. package/src/nodes/utils/SplitNode.js +12 -1
  521. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  522. package/src/nodes/utils/Timer.js +0 -47
  523. package/src/nodes/utils/UVUtils.js +28 -0
  524. package/src/objects/BatchedMesh.js +46 -18
  525. package/src/objects/InstancedMesh.js +30 -3
  526. package/src/objects/LOD.js +1 -1
  527. package/src/objects/Line.js +3 -2
  528. package/src/objects/LineSegments.js +2 -1
  529. package/src/objects/Mesh.js +1 -1
  530. package/src/objects/Points.js +1 -1
  531. package/src/objects/Skeleton.js +12 -2
  532. package/src/objects/SkinnedMesh.js +29 -10
  533. package/src/objects/Sprite.js +4 -3
  534. package/src/renderers/WebGLRenderer.js +372 -179
  535. package/src/renderers/common/Animation.js +16 -4
  536. package/src/renderers/common/Attributes.js +16 -2
  537. package/src/renderers/common/Backend.js +137 -35
  538. package/src/renderers/common/Background.js +28 -14
  539. package/src/renderers/common/BindGroup.js +1 -16
  540. package/src/renderers/common/Binding.js +11 -0
  541. package/src/renderers/common/Bindings.js +83 -12
  542. package/src/renderers/common/BlendMode.js +143 -0
  543. package/src/renderers/common/Buffer.js +40 -0
  544. package/src/renderers/common/BundleGroup.js +1 -1
  545. package/src/renderers/common/CanvasTarget.js +341 -0
  546. package/src/renderers/common/ChainMap.js +30 -6
  547. package/src/renderers/common/ComputePipeline.js +1 -1
  548. package/src/renderers/common/CubeRenderTarget.js +51 -7
  549. package/src/renderers/common/DataMap.js +1 -1
  550. package/src/renderers/common/Geometries.js +55 -3
  551. package/src/renderers/common/Info.js +337 -6
  552. package/src/renderers/common/InspectorBase.js +151 -0
  553. package/src/renderers/common/Lighting.js +5 -21
  554. package/src/renderers/common/Pipelines.js +41 -8
  555. package/src/renderers/common/PostProcessing.js +9 -226
  556. package/src/renderers/common/QuadMesh.js +7 -1
  557. package/src/renderers/common/ReadbackBuffer.js +78 -0
  558. package/src/renderers/common/RenderBundle.js +3 -1
  559. package/src/renderers/common/RenderBundles.js +7 -3
  560. package/src/renderers/common/RenderContext.js +18 -2
  561. package/src/renderers/common/RenderContexts.js +33 -49
  562. package/src/renderers/common/RenderList.js +7 -3
  563. package/src/renderers/common/RenderLists.js +2 -1
  564. package/src/renderers/common/RenderObject.js +32 -6
  565. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  566. package/src/renderers/common/RenderObjects.js +22 -6
  567. package/src/renderers/common/RenderPipeline.js +232 -17
  568. package/src/renderers/common/Renderer.js +927 -335
  569. package/src/renderers/common/RendererUtils.js +9 -0
  570. package/src/renderers/common/SampledTexture.js +9 -1
  571. package/src/renderers/common/Sampler.js +52 -14
  572. package/src/renderers/common/StorageBuffer.js +13 -1
  573. package/src/renderers/common/StorageTexture.js +9 -1
  574. package/src/renderers/common/Textures.js +208 -47
  575. package/src/renderers/common/TimestampQueryPool.js +70 -6
  576. package/src/renderers/common/Uniform.js +8 -0
  577. package/src/renderers/common/UniformsGroup.js +64 -2
  578. package/src/renderers/common/XRManager.js +79 -51
  579. package/src/renderers/common/extras/PMREMGenerator.js +176 -79
  580. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  581. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  582. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +260 -95
  583. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  584. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  585. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  586. package/src/renderers/shaders/DFGLUTData.js +49 -0
  587. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  588. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  589. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  590. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  591. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  592. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  593. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -2
  594. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  595. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  596. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  597. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  598. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  599. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  600. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  601. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  602. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +152 -59
  603. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  604. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  605. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  606. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  607. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  608. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  609. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  610. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +221 -190
  611. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  612. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  613. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  614. package/src/renderers/shaders/ShaderChunk.js +5 -3
  615. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  616. package/src/renderers/shaders/ShaderLib/depth.glsl.js +4 -1
  617. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  618. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  619. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  620. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  621. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  622. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  623. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  624. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  625. package/src/renderers/shaders/ShaderLib.js +7 -6
  626. package/src/renderers/shaders/UniformsLib.js +8 -5
  627. package/src/renderers/shaders/UniformsUtils.js +52 -9
  628. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  629. package/src/renderers/webgl/WebGLBackground.js +15 -15
  630. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  631. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  632. package/src/renderers/webgl/WebGLCapabilities.js +11 -5
  633. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  634. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  635. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  636. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  637. package/src/renderers/webgl/WebGLInfo.js +3 -1
  638. package/src/renderers/webgl/WebGLLights.js +18 -1
  639. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  640. package/src/renderers/webgl/WebGLObjects.js +3 -1
  641. package/src/renderers/webgl/WebGLOutput.js +270 -0
  642. package/src/renderers/webgl/WebGLProgram.js +63 -122
  643. package/src/renderers/webgl/WebGLPrograms.js +65 -52
  644. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  645. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  646. package/src/renderers/webgl/WebGLShadowMap.js +191 -26
  647. package/src/renderers/webgl/WebGLState.js +79 -40
  648. package/src/renderers/webgl/WebGLTextures.js +234 -68
  649. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  650. package/src/renderers/webgl/WebGLUniformsGroups.js +24 -3
  651. package/src/renderers/webgl/WebGLUtils.js +8 -3
  652. package/src/renderers/webgl-fallback/WebGLBackend.js +438 -235
  653. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  654. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +339 -84
  655. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  656. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  657. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  658. package/src/renderers/webgl-fallback/utils/WebGLState.js +229 -11
  659. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +237 -72
  660. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +56 -27
  661. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +8 -3
  662. package/src/renderers/webgpu/WebGPUBackend.js +403 -253
  663. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  664. package/src/renderers/webgpu/WebGPURenderer.js +5 -3
  665. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +491 -123
  666. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +108 -34
  667. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +360 -201
  668. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  669. package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -2
  670. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +111 -54
  671. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +155 -205
  672. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +407 -149
  673. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +36 -13
  674. package/src/renderers/webgpu/utils/WebGPUUtils.js +55 -13
  675. package/src/renderers/webxr/WebXRController.js +12 -0
  676. package/src/renderers/webxr/WebXRManager.js +45 -29
  677. package/src/textures/CubeDepthTexture.js +76 -0
  678. package/src/textures/ExternalTexture.js +15 -4
  679. package/src/textures/HTMLTexture.js +74 -0
  680. package/src/textures/Source.js +5 -4
  681. package/src/textures/Texture.js +19 -7
  682. package/src/textures/VideoTexture.js +2 -3
  683. package/src/utils.js +344 -3
  684. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  685. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  686. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  687. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  688. package/src/nodes/accessors/SceneNode.js +0 -144
  689. package/src/nodes/code/ScriptableNode.js +0 -726
  690. package/src/nodes/code/ScriptableValueNode.js +0 -253
  691. package/src/nodes/display/PosterizeNode.js +0 -65
  692. package/src/nodes/functions/BSDF/DFGApprox.js +0 -30
  693. package/src/nodes/utils/RemapNode.js +0 -125
  694. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  695. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  696. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -16,10 +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
+ import { warn, error } from '../../../utils.js';
20
21
 
21
- // GPUShaderStage is not defined in browsers not supporting WebGPU
22
- const GPUShaderStage = ( typeof self !== 'undefined' ) ? self.GPUShaderStage : { VERTEX: 1, FRAGMENT: 2, COMPUTE: 4 };
22
+ import { GPUShaderStage } from '../utils/WebGPUConstants.js';
23
23
 
24
24
  const accessNames = {
25
25
  [ NodeAccess.READ_ONLY ]: 'read',
@@ -34,9 +34,9 @@ const wrapNames = {
34
34
  };
35
35
 
36
36
  const gpuShaderStageLib = {
37
- 'vertex': GPUShaderStage ? GPUShaderStage.VERTEX : 1,
38
- 'fragment': GPUShaderStage ? GPUShaderStage.FRAGMENT : 2,
39
- 'compute': GPUShaderStage ? GPUShaderStage.COMPUTE : 4
37
+ 'vertex': GPUShaderStage.VERTEX,
38
+ 'fragment': GPUShaderStage.FRAGMENT,
39
+ 'compute': GPUShaderStage.COMPUTE
40
40
  };
41
41
 
42
42
  const supports = {
@@ -112,6 +112,29 @@ fn tsl_biquadraticTexture( map : texture_2d<f32>, coord : vec2f, iRes : vec2u, l
112
112
 
113
113
  return mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );
114
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
+
115
138
  }
116
139
  ` )
117
140
  };
@@ -128,25 +151,15 @@ const wgslMethods = {
128
151
  equals_bvec3: 'tsl_equals_bvec3',
129
152
  equals_bvec4: 'tsl_equals_bvec4',
130
153
  inversesqrt: 'inverseSqrt',
131
- 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'
132
161
  };
133
162
 
134
- // WebGPU issue: does not support pow() with negative base on Windows
135
-
136
- if ( typeof navigator !== 'undefined' && /Windows/g.test( navigator.userAgent ) ) {
137
-
138
- wgslPolyfill.pow_float = new CodeNode( 'fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }' );
139
- wgslPolyfill.pow_vec2 = new CodeNode( 'fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }', [ wgslPolyfill.pow_float ] );
140
- wgslPolyfill.pow_vec3 = new CodeNode( 'fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }', [ wgslPolyfill.pow_float ] );
141
- wgslPolyfill.pow_vec4 = new CodeNode( 'fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }', [ wgslPolyfill.pow_float ] );
142
-
143
- wgslMethods.pow_float = 'tsl_pow_float';
144
- wgslMethods.pow_vec2 = 'tsl_pow_vec2';
145
- wgslMethods.pow_vec3 = 'tsl_pow_vec3';
146
- wgslMethods.pow_vec4 = 'tsl_pow_vec4';
147
-
148
- }
149
-
150
163
  //
151
164
 
152
165
  let diagnostics = '';
@@ -187,6 +200,14 @@ class WGSLNodeBuilder extends NodeBuilder {
187
200
  */
188
201
  this.uniformGroups = {};
189
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
+
190
211
  /**
191
212
  * A dictionary that holds for each shader stage a Map of builtins.
192
213
  *
@@ -209,6 +230,22 @@ class WGSLNodeBuilder extends NodeBuilder {
209
230
  */
210
231
  this.scopedArrays = new Map();
211
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
+
212
249
  }
213
250
 
214
251
  /**
@@ -219,19 +256,32 @@ class WGSLNodeBuilder extends NodeBuilder {
219
256
  * @param {string} textureProperty - The name of the texture uniform in the shader.
220
257
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
221
258
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
259
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
222
260
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
223
261
  * @return {string} The WGSL snippet.
224
262
  */
225
- _generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, shaderStage = this.shaderStage ) {
263
+ _generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
226
264
 
227
265
  if ( shaderStage === 'fragment' ) {
228
266
 
229
267
  if ( depthSnippet ) {
230
268
 
269
+ if ( offsetSnippet ) {
270
+
271
+ return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ offsetSnippet } )`;
272
+
273
+ }
274
+
231
275
  return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet } )`;
232
276
 
233
277
  } else {
234
278
 
279
+ if ( offsetSnippet ) {
280
+
281
+ return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ offsetSnippet } )`;
282
+
283
+ }
284
+
235
285
  return `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet } )`;
236
286
 
237
287
  }
@@ -253,21 +303,42 @@ class WGSLNodeBuilder extends NodeBuilder {
253
303
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
254
304
  * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
255
305
  * @param {string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
306
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
256
307
  * @return {string} The WGSL snippet.
257
308
  */
258
- generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet ) {
309
+ generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
259
310
 
260
311
  if ( this.isUnfilterable( texture ) === false ) {
261
312
 
262
- return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
313
+ if ( depthSnippet ) {
314
+
315
+ if ( offsetSnippet ) {
316
+
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 } )`;
328
+
329
+ }
330
+
331
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
332
+
333
+ }
263
334
 
264
335
  } else if ( this.isFilteredTexture( texture ) ) {
265
336
 
266
- return this.generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet );
337
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet, depthSnippet );
267
338
 
268
339
  } else {
269
340
 
270
- return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, levelSnippet );
341
+ return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet );
271
342
 
272
343
  }
273
344
 
@@ -281,7 +352,7 @@ class WGSLNodeBuilder extends NodeBuilder {
281
352
  */
282
353
  generateWrapFunction( texture ) {
283
354
 
284
- 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`;
285
356
 
286
357
  let nodeCode = wgslCodeCache[ functionName ];
287
358
 
@@ -290,7 +361,7 @@ class WGSLNodeBuilder extends NodeBuilder {
290
361
  const includes = [];
291
362
 
292
363
  // For 3D textures, use vec3f; for texture arrays, keep vec2f since array index is separate
293
- const coordType = texture.isData3DTexture ? 'vec3f' : 'vec2f';
364
+ const coordType = texture.is3DTexture || texture.isData3DTexture ? 'vec3f' : 'vec2f';
294
365
  let code = `fn ${ functionName }( coord : ${ coordType } ) -> ${ coordType } {\n\n\treturn ${ coordType }(\n`;
295
366
 
296
367
  const addWrapSnippet = ( wrap, axis ) => {
@@ -317,7 +388,7 @@ class WGSLNodeBuilder extends NodeBuilder {
317
388
 
318
389
  code += `\t\tcoord.${ axis }`;
319
390
 
320
- console.warn( `WebGPURenderer: Unsupported texture wrap type "${ wrap }" for vertex shader.` );
391
+ warn( `WebGPURenderer: Unsupported texture wrap type "${ wrap }" for vertex shader.` );
321
392
 
322
393
  }
323
394
 
@@ -329,7 +400,7 @@ class WGSLNodeBuilder extends NodeBuilder {
329
400
 
330
401
  addWrapSnippet( texture.wrapT, 'y' );
331
402
 
332
- if ( texture.isData3DTexture ) {
403
+ if ( texture.is3DTexture || texture.isData3DTexture ) {
333
404
 
334
405
  code += ',\n';
335
406
  addWrapSnippet( texture.wrapR, 'z' );
@@ -373,7 +444,7 @@ class WGSLNodeBuilder extends NodeBuilder {
373
444
  */
374
445
  generateTextureDimension( texture, textureProperty, levelSnippet ) {
375
446
 
376
- const textureData = this.getDataFromNode( texture, this.shaderStage, this.globalCache );
447
+ const textureData = this.getDataFromNode( texture, this.shaderStage, this.cache );
377
448
 
378
449
  if ( textureData.dimensionsSnippet === undefined ) textureData.dimensionsSnippet = {};
379
450
 
@@ -387,7 +458,7 @@ class WGSLNodeBuilder extends NodeBuilder {
387
458
  const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
388
459
  const isMultisampled = primarySamples > 1;
389
460
 
390
- if ( texture.isData3DTexture ) {
461
+ if ( texture.is3DTexture || texture.isData3DTexture ) {
391
462
 
392
463
  dimensionType = 'vec3<u32>';
393
464
 
@@ -413,7 +484,7 @@ class WGSLNodeBuilder extends NodeBuilder {
413
484
 
414
485
  textureData.dimensionsSnippet[ levelSnippet ] = textureDimensionNode;
415
486
 
416
- if ( texture.isArrayTexture || texture.isDataArrayTexture || texture.isData3DTexture ) {
487
+ if ( texture.isArrayTexture || texture.isDataArrayTexture || texture.is3DTexture || texture.isData3DTexture ) {
417
488
 
418
489
  textureData.arrayLayerCount = new VarNode(
419
490
  new ExpressionNode(
@@ -445,16 +516,32 @@ class WGSLNodeBuilder extends NodeBuilder {
445
516
  * @param {Texture} texture - The texture.
446
517
  * @param {string} textureProperty - The name of the texture uniform in the shader.
447
518
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
448
- * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
519
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
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.
449
522
  * @return {string} The WGSL snippet.
450
523
  */
451
- generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet = '0u' ) {
452
-
453
- this._include( 'biquadraticTexture' );
524
+ generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet = '0u', depthSnippet ) {
454
525
 
455
526
  const wrapFunction = this.generateWrapFunction( texture );
456
527
  const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
457
528
 
529
+ if ( offsetSnippet ) {
530
+
531
+ uvSnippet = `${ uvSnippet } + vec2<f32>(${ offsetSnippet }) / ${ textureDimension }`;
532
+
533
+ }
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
+
458
545
  return `tsl_biquadraticTexture( ${ textureProperty }, ${ wrapFunction }( ${ uvSnippet } ), ${ textureDimension }, u32( ${ levelSnippet } ) )`;
459
546
 
460
547
  }
@@ -467,18 +554,81 @@ class WGSLNodeBuilder extends NodeBuilder {
467
554
  * @param {string} textureProperty - The name of the texture uniform in the shader.
468
555
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
469
556
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
557
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
470
558
  * @param {string} [levelSnippet='0u'] - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
471
559
  * @return {string} The WGSL snippet.
472
560
  */
473
- generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, levelSnippet = '0u' ) {
561
+ generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet = '0u' ) {
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
+ }
474
578
 
475
579
  const wrapFunction = this.generateWrapFunction( texture );
476
580
  const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
477
581
 
478
- const vecType = texture.isData3DTexture ? 'vec3' : 'vec2';
479
- const coordSnippet = `${ vecType }<u32>( ${ wrapFunction }( ${ uvSnippet } ) * ${ vecType }<f32>( ${ textureDimension } ) )`;
582
+ const vecType = texture.is3DTexture || texture.isData3DTexture ? 'vec3' : 'vec2';
583
+ const textureDimensionMargin = ( vecType === 'vec3' ) ? 'vec3<u32>( 1, 1, 1 )' : 'vec2<u32>( 1, 1 )';
584
+
585
+ if ( offsetSnippet ) {
586
+
587
+ uvSnippet = `${ uvSnippet } + ${ vecType }<f32>(${ offsetSnippet }) / ${ vecType }<f32>( ${ textureDimension } )`;
588
+
589
+ }
590
+
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 } )`;
480
628
 
481
- return this.generateTextureLoad( texture, textureProperty, coordSnippet, depthSnippet, levelSnippet );
629
+ }
630
+
631
+ return snippet;
482
632
 
483
633
  }
484
634
 
@@ -488,11 +638,20 @@ class WGSLNodeBuilder extends NodeBuilder {
488
638
  * @param {Texture} texture - The texture.
489
639
  * @param {string} textureProperty - The name of the texture uniform in the shader.
490
640
  * @param {string} uvIndexSnippet - A WGSL snippet that represents texture coordinates used for sampling.
641
+ * @param {?string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
491
642
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
492
- * @param {string} [levelSnippet='0u'] - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
643
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
493
644
  * @return {string} The WGSL snippet.
494
645
  */
495
- generateTextureLoad( texture, textureProperty, uvIndexSnippet, depthSnippet, levelSnippet = '0u' ) {
646
+ generateTextureLoad( texture, textureProperty, uvIndexSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
647
+
648
+ if ( levelSnippet === null ) levelSnippet = '0u';
649
+
650
+ if ( offsetSnippet ) {
651
+
652
+ uvIndexSnippet = `${ uvIndexSnippet } + ${ offsetSnippet }`;
653
+
654
+ }
496
655
 
497
656
  let snippet;
498
657
 
@@ -552,7 +711,7 @@ class WGSLNodeBuilder extends NodeBuilder {
552
711
  */
553
712
  isSampleCompare( texture ) {
554
713
 
555
- return texture.isDepthTexture === true && texture.compareFunction !== null;
714
+ return texture.isDepthTexture === true && texture.compareFunction !== null && this.renderer.hasCompatibility( Compatibility.TEXTURE_COMPARE );
556
715
 
557
716
  }
558
717
 
@@ -565,7 +724,7 @@ class WGSLNodeBuilder extends NodeBuilder {
565
724
  isUnfilterable( texture ) {
566
725
 
567
726
  return this.getComponentTypeFromTexture( texture ) !== 'float' ||
568
- ( ! this.isAvailable( 'float32Filterable' ) && texture.isDataTexture === true && texture.type === FloatType ) ||
727
+ ( ! this.isAvailable( 'float32Filterable' ) && texture.type === FloatType ) ||
569
728
  ( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) ||
570
729
  this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1;
571
730
 
@@ -578,20 +737,21 @@ class WGSLNodeBuilder extends NodeBuilder {
578
737
  * @param {string} textureProperty - The name of the texture uniform in the shader.
579
738
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
580
739
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
740
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
581
741
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
582
742
  * @return {string} The WGSL snippet.
583
743
  */
584
- generateTexture( texture, textureProperty, uvSnippet, depthSnippet, shaderStage = this.shaderStage ) {
744
+ generateTexture( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
585
745
 
586
746
  let snippet = null;
587
747
 
588
748
  if ( this.isUnfilterable( texture ) ) {
589
749
 
590
- snippet = this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, '0', shaderStage );
750
+ snippet = this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, '0', shaderStage );
591
751
 
592
752
  } else {
593
753
 
594
- snippet = this._generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, shaderStage );
754
+ snippet = this._generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage );
595
755
 
596
756
  }
597
757
 
@@ -607,19 +767,39 @@ class WGSLNodeBuilder extends NodeBuilder {
607
767
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
608
768
  * @param {Array<string>} gradSnippet - An array holding both gradient WGSL snippets.
609
769
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
770
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
610
771
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
611
772
  * @return {string} The WGSL snippet.
612
773
  */
613
- generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, shaderStage = this.shaderStage ) {
774
+ generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
614
775
 
615
776
  if ( shaderStage === 'fragment' ) {
616
777
 
617
- // TODO handle i32 or u32 --> uvSnippet, array_index: A, ddx, ddy
618
- return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
778
+ if ( depthSnippet ) {
779
+
780
+ if ( offsetSnippet ) {
781
+
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 ] } )`;
797
+
798
+ }
619
799
 
620
800
  } else {
621
801
 
622
- console.error( `WebGPURenderer: THREE.TextureNode.gradient() does not support ${ shaderStage } shader.` );
802
+ error( `WebGPURenderer: THREE.TextureNode.gradient() does not support ${ shaderStage } shader.` );
623
803
 
624
804
  }
625
805
 
@@ -634,24 +814,37 @@ class WGSLNodeBuilder extends NodeBuilder {
634
814
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
635
815
  * @param {string} compareSnippet - A WGSL snippet that represents the reference value.
636
816
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
817
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
637
818
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
638
819
  * @return {string} The WGSL snippet.
639
820
  */
640
- generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
821
+ generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
641
822
 
642
823
  if ( shaderStage === 'fragment' ) {
643
824
 
644
825
  if ( texture.isDepthTexture === true && texture.isArrayTexture === true ) {
645
826
 
827
+ if ( offsetSnippet ) {
828
+
829
+ return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet }, ${ offsetSnippet } )`;
830
+
831
+ }
832
+
646
833
  return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet } )`;
647
834
 
648
835
  }
649
836
 
837
+ if ( offsetSnippet ) {
838
+
839
+ return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet }, ${ offsetSnippet } )`;
840
+
841
+ }
842
+
650
843
  return `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet } )`;
651
844
 
652
845
  } else {
653
846
 
654
- console.error( `WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${ shaderStage } shader.` );
847
+ error( `WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${ shaderStage } shader.` );
655
848
 
656
849
  }
657
850
 
@@ -665,22 +858,43 @@ class WGSLNodeBuilder extends NodeBuilder {
665
858
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
666
859
  * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
667
860
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
861
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
668
862
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
669
863
  * @return {string} The WGSL snippet.
670
864
  */
671
- generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet ) {
865
+ generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
672
866
 
673
867
  if ( this.isUnfilterable( texture ) === false ) {
674
868
 
675
- return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
869
+ if ( depthSnippet ) {
870
+
871
+ if ( offsetSnippet ) {
872
+
873
+ return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
874
+
875
+ }
876
+
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
+ }
676
890
 
677
891
  } else if ( this.isFilteredTexture( texture ) ) {
678
892
 
679
- return this.generateFilteredTexture( texture, textureProperty, uvSnippet, levelSnippet );
893
+ return this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet, depthSnippet );
680
894
 
681
895
  } else {
682
896
 
683
- return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, levelSnippet );
897
+ return this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet );
684
898
 
685
899
  }
686
900
 
@@ -694,18 +908,39 @@ class WGSLNodeBuilder extends NodeBuilder {
694
908
  * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.
695
909
  * @param {string} biasSnippet - A WGSL snippet that represents the bias to apply to the mip level before sampling.
696
910
  * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.
911
+ * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
697
912
  * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.
698
913
  * @return {string} The WGSL snippet.
699
914
  */
700
- generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, shaderStage = this.shaderStage ) {
915
+ generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {
701
916
 
702
917
  if ( shaderStage === 'fragment' ) {
703
918
 
704
- return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet } )`;
919
+ if ( depthSnippet ) {
920
+
921
+ if ( offsetSnippet ) {
922
+
923
+ return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ biasSnippet }, ${ offsetSnippet } )`;
924
+
925
+ }
926
+
927
+ return `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ biasSnippet } )`;
928
+
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
+ }
705
940
 
706
941
  } else {
707
942
 
708
- console.error( `WebGPURenderer: THREE.TextureNode.biasNode does not support ${ shaderStage } shader.` );
943
+ error( `WebGPURenderer: THREE.TextureNode.biasNode does not support ${ shaderStage } shader.` );
709
944
 
710
945
  }
711
946
 
@@ -733,7 +968,7 @@ class WGSLNodeBuilder extends NodeBuilder {
733
968
  const name = node.name;
734
969
  const type = node.type;
735
970
 
736
- if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) {
971
+ if ( type === 'texture' || type === 'cubeTexture' || type === 'cubeDepthTexture' || type === 'storageTexture' || type === 'texture3D' ) {
737
972
 
738
973
  return name;
739
974
 
@@ -805,7 +1040,7 @@ class WGSLNodeBuilder extends NodeBuilder {
805
1040
 
806
1041
  if ( node.isAtomic === true ) {
807
1042
 
808
- console.warn( 'WebGPURenderer: Atomic operations are only supported in compute shaders.' );
1043
+ warn( 'WebGPURenderer: Atomic operations are only supported in compute shaders.' );
809
1044
 
810
1045
  return NodeAccess.READ_WRITE;
811
1046
 
@@ -859,7 +1094,7 @@ class WGSLNodeBuilder extends NodeBuilder {
859
1094
 
860
1095
  const bindings = this.getBindGroupArray( groupName, shaderStage );
861
1096
 
862
- if ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) {
1097
+ if ( type === 'texture' || type === 'cubeTexture' || type === 'cubeDepthTexture' || type === 'storageTexture' || type === 'texture3D' ) {
863
1098
 
864
1099
  let texture = null;
865
1100
 
@@ -877,7 +1112,7 @@ class WGSLNodeBuilder extends NodeBuilder {
877
1112
 
878
1113
  }
879
1114
 
880
- } else if ( type === 'cubeTexture' ) {
1115
+ } else if ( type === 'cubeTexture' || type === 'cubeDepthTexture' ) {
881
1116
 
882
1117
  texture = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, group, access );
883
1118
 
@@ -888,9 +1123,13 @@ class WGSLNodeBuilder extends NodeBuilder {
888
1123
  }
889
1124
 
890
1125
  texture.store = node.isStorageTextureNode === true;
1126
+ texture.mipLevel = texture.store ? node.mipLevel : 0;
891
1127
  texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
892
1128
 
893
- 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 ) {
894
1133
 
895
1134
  const sampler = new NodeSampler( `${ uniformNode.name }_sampler`, uniformNode.node, group );
896
1135
  sampler.setVisibility( gpuShaderStageLib[ shaderStage ] );
@@ -909,10 +1148,21 @@ class WGSLNodeBuilder extends NodeBuilder {
909
1148
 
910
1149
  } else if ( type === 'buffer' || type === 'storageBuffer' || type === 'indirectStorageBuffer' ) {
911
1150
 
912
- const bufferClass = type === 'buffer' ? NodeUniformBuffer : NodeStorageBuffer;
1151
+ const sharedData = this.getSharedDataFromNode( node );
1152
+
1153
+ let buffer = sharedData.buffer;
1154
+
1155
+ if ( buffer === undefined ) {
913
1156
 
914
- const buffer = new bufferClass( node, group );
915
- buffer.setVisibility( gpuShaderStageLib[ shaderStage ] );
1157
+ const bufferClass = type === 'buffer' ? NodeUniformBuffer : NodeStorageBuffer;
1158
+
1159
+ buffer = new bufferClass( node, group );
1160
+
1161
+ sharedData.buffer = buffer;
1162
+
1163
+ }
1164
+
1165
+ buffer.setVisibility( buffer.getVisibility() | gpuShaderStageLib[ shaderStage ] );
916
1166
 
917
1167
  bindings.push( buffer );
918
1168
 
@@ -922,16 +1172,19 @@ class WGSLNodeBuilder extends NodeBuilder {
922
1172
 
923
1173
  } else {
924
1174
 
925
- const uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );
926
-
927
- let uniformsGroup = uniformsStage[ groupName ];
1175
+ let uniformsGroup = this.uniformGroups[ groupName ];
928
1176
 
929
1177
  if ( uniformsGroup === undefined ) {
930
1178
 
931
1179
  uniformsGroup = new NodeUniformsGroup( groupName, group );
932
- uniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );
1180
+ uniformsGroup.setVisibility( GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT | GPUShaderStage.COMPUTE );
1181
+
1182
+ this.uniformGroups[ groupName ] = uniformsGroup;
1183
+
1184
+ }
933
1185
 
934
- uniformsStage[ groupName ] = uniformsGroup;
1186
+ // Add to bindings for this stage if not already present
1187
+ if ( bindings.indexOf( uniformsGroup ) === - 1 ) {
935
1188
 
936
1189
  bindings.push( uniformsGroup );
937
1190
 
@@ -939,7 +1192,15 @@ class WGSLNodeBuilder extends NodeBuilder {
939
1192
 
940
1193
  uniformGPU = this.getNodeUniform( uniformNode, type );
941
1194
 
942
- 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
+ }
943
1204
 
944
1205
  }
945
1206
 
@@ -1051,7 +1312,8 @@ ${ flowData.code }
1051
1312
  }
1052
1313
 
1053
1314
  /**
1054
- * Returns the instance index builtin.
1315
+ * Contextually returns either the vertex stage instance index builtin
1316
+ * or the linearized index of an compute invocation within a grid of workgroups.
1055
1317
  *
1056
1318
  * @return {string} The instance index.
1057
1319
  */
@@ -1067,8 +1329,9 @@ ${ flowData.code }
1067
1329
 
1068
1330
  }
1069
1331
 
1332
+
1070
1333
  /**
1071
- * Returns the invocation local index builtin.
1334
+ * Returns a builtin representing the index of a compute invocation within the scope of a workgroup load.
1072
1335
  *
1073
1336
  * @return {string} The invocation local index.
1074
1337
  */
@@ -1079,7 +1342,7 @@ ${ flowData.code }
1079
1342
  }
1080
1343
 
1081
1344
  /**
1082
- * Returns the subgroup size builtin.
1345
+ * Returns a builtin representing the size of a subgroup within the current shader.
1083
1346
  *
1084
1347
  * @return {string} The subgroup size.
1085
1348
  */
@@ -1092,7 +1355,7 @@ ${ flowData.code }
1092
1355
  }
1093
1356
 
1094
1357
  /**
1095
- * Returns the invocation subgroup index builtin.
1358
+ * Returns a builtin representing the index of a compute invocation within the scope of a subgroup.
1096
1359
  *
1097
1360
  * @return {string} The invocation subgroup index.
1098
1361
  */
@@ -1105,7 +1368,7 @@ ${ flowData.code }
1105
1368
  }
1106
1369
 
1107
1370
  /**
1108
- * Returns the subgroup index builtin.
1371
+ * Returns a builtin representing the index of a compute invocation's subgroup within its workgroup.
1109
1372
  *
1110
1373
  * @return {string} The subgroup index.
1111
1374
  */
@@ -1486,11 +1749,12 @@ ${ flowData.code }
1486
1749
  * @param {string} type - The variable's type.
1487
1750
  * @param {string} name - The variable's name.
1488
1751
  * @param {?number} [count=null] - The array length.
1752
+ * @param {string} [qualifier=''] - The variable's qualifier.
1489
1753
  * @return {string} The WGSL snippet that defines a variable.
1490
1754
  */
1491
- getVar( type, name, count = null ) {
1755
+ getVar( type, name, count = null, qualifier = '' ) {
1492
1756
 
1493
- let snippet = `var ${ name } : `;
1757
+ let snippet = `var${ qualifier } ${ name } : `;
1494
1758
 
1495
1759
  if ( count !== null ) {
1496
1760
 
@@ -1512,7 +1776,15 @@ ${ flowData.code }
1512
1776
  * @param {string} shaderStage - The shader stage.
1513
1777
  * @return {string} The WGSL snippet that defines the variables.
1514
1778
  */
1515
- getVars( shaderStage ) {
1779
+ getVars( shaderStage, global = false ) {
1780
+
1781
+ let qualifier = '';
1782
+
1783
+ if ( global ) {
1784
+
1785
+ qualifier = '<private>';
1786
+
1787
+ }
1516
1788
 
1517
1789
  const snippets = [];
1518
1790
  const vars = this.vars[ shaderStage ];
@@ -1521,13 +1793,13 @@ ${ flowData.code }
1521
1793
 
1522
1794
  for ( const variable of vars ) {
1523
1795
 
1524
- snippets.push( `\t${ this.getVar( variable.type, variable.name, variable.count ) };` );
1796
+ snippets.push( `${ this.getVar( variable.type, variable.name, variable.count, qualifier ) };` );
1525
1797
 
1526
1798
  }
1527
1799
 
1528
1800
  }
1529
1801
 
1530
- return `\n${ snippets.join( '\n' ) }\n`;
1802
+ return global ? snippets.join( '\n' ) : `\n\t${ snippets.join( '\n\t' ) }\n`;
1531
1803
 
1532
1804
  }
1533
1805
 
@@ -1543,7 +1815,7 @@ ${ flowData.code }
1543
1815
 
1544
1816
  if ( shaderStage === 'vertex' ) {
1545
1817
 
1546
- this.getBuiltin( 'position', 'Vertex', 'vec4<f32>', 'vertex' );
1818
+ this.getBuiltin( 'position', 'builtinClipSpace', 'vec4<f32>', 'vertex' );
1547
1819
 
1548
1820
  }
1549
1821
 
@@ -1552,13 +1824,15 @@ ${ flowData.code }
1552
1824
  const varyings = this.varyings;
1553
1825
  const vars = this.vars[ shaderStage ];
1554
1826
 
1827
+ let varyingIndex = 0;
1828
+
1555
1829
  for ( let index = 0; index < varyings.length; index ++ ) {
1556
1830
 
1557
1831
  const varying = varyings[ index ];
1558
1832
 
1559
1833
  if ( varying.needsInterpolation ) {
1560
1834
 
1561
- let attributesSnippet = `@location( ${index} )`;
1835
+ let attributesSnippet = `@location( ${ varyingIndex ++ } )`;
1562
1836
 
1563
1837
  if ( varying.interpolationType ) {
1564
1838
 
@@ -1570,7 +1844,7 @@ ${ flowData.code }
1570
1844
 
1571
1845
  } else if ( /^(int|uint|ivec|uvec)/.test( varying.type ) ) {
1572
1846
 
1573
- attributesSnippet += ` @interpolate( ${ this.renderer.backend.compatibilityMode ? 'flat, either' : 'flat' } )`;
1847
+ attributesSnippet += ' @interpolate(flat, either)';
1574
1848
 
1575
1849
  }
1576
1850
 
@@ -1619,6 +1893,7 @@ ${ flowData.code }
1619
1893
  */
1620
1894
  getUniforms( shaderStage ) {
1621
1895
 
1896
+ const backend = this.renderer.backend;
1622
1897
  const uniforms = this.uniforms[ shaderStage ];
1623
1898
 
1624
1899
  const bindingSnippets = [];
@@ -1631,11 +1906,14 @@ ${ flowData.code }
1631
1906
  const groupName = uniform.groupNode.name;
1632
1907
  const uniformIndexes = this.bindingsIndexes[ groupName ];
1633
1908
 
1634
- 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' ) {
1635
1910
 
1636
1911
  const texture = uniform.node.value;
1637
1912
 
1638
- 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 ) {
1639
1917
 
1640
1918
  if ( this.isSampleCompare( texture ) ) {
1641
1919
 
@@ -1653,7 +1931,7 @@ ${ flowData.code }
1653
1931
 
1654
1932
  let multisampled = '';
1655
1933
 
1656
- const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
1934
+ const { primarySamples } = backend.utils.getTextureSampleData( texture );
1657
1935
 
1658
1936
  if ( primarySamples > 1 ) {
1659
1937
 
@@ -1661,13 +1939,17 @@ ${ flowData.code }
1661
1939
 
1662
1940
  }
1663
1941
 
1664
- 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 ) {
1665
1947
 
1666
1948
  textureType = 'texture_cube<f32>';
1667
1949
 
1668
1950
  } else if ( texture.isDepthTexture === true ) {
1669
1951
 
1670
- if ( this.renderer.backend.compatibilityMode && texture.compareFunction === null ) {
1952
+ if ( backend.compatibilityMode && texture.compareFunction === null ) {
1671
1953
 
1672
1954
  textureType = `texture${ multisampled }_2d<f32>`;
1673
1955
 
@@ -1679,7 +1961,7 @@ ${ flowData.code }
1679
1961
 
1680
1962
  } else if ( uniform.node.isStorageTextureNode === true ) {
1681
1963
 
1682
- const format = getFormat( texture );
1964
+ const format = getFormat( texture, backend.device );
1683
1965
  const access = this.getStorageAccess( uniform.node, shaderStage );
1684
1966
 
1685
1967
  const is3D = uniform.node.value.is3DTexture;
@@ -1730,16 +2012,51 @@ ${ flowData.code }
1730
2012
 
1731
2013
  } else {
1732
2014
 
1733
- const vectorType = this.getType( this.getVectorType( uniform.type ) );
1734
2015
  const groupName = uniform.groupNode.name;
1735
2016
 
1736
- const group = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = {
1737
- index: uniformIndexes.binding ++,
1738
- id: uniformIndexes.group,
1739
- snippets: []
1740
- } );
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 ) {
1741
2040
 
1742
- group.snippets.push( `\t${ uniform.name } : ${ vectorType }` );
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
+ };
2056
+
2057
+ }
2058
+
2059
+ }
1743
2060
 
1744
2061
  }
1745
2062
 
@@ -1753,9 +2070,7 @@ ${ flowData.code }
1753
2070
 
1754
2071
  }
1755
2072
 
1756
- let code = bindingSnippets.join( '\n' );
1757
- code += bufferSnippets.join( '\n' );
1758
- code += structSnippets.join( '\n' );
2073
+ const code = [ ...bindingSnippets, ...bufferSnippets, ...structSnippets ].join( '\n' );
1759
2074
 
1760
2075
  return code;
1761
2076
 
@@ -1774,12 +2089,14 @@ ${ flowData.code }
1774
2089
 
1775
2090
  this.shaderStage = shaderStage;
1776
2091
 
2092
+ const allowGlobal = this.allowGlobalVariables;
2093
+
1777
2094
  const stageData = shadersData[ shaderStage ];
1778
2095
  stageData.uniforms = this.getUniforms( shaderStage );
1779
2096
  stageData.attributes = this.getAttributes( shaderStage );
1780
2097
  stageData.varyings = this.getVaryings( shaderStage );
1781
2098
  stageData.structs = this.getStructs( shaderStage );
1782
- stageData.vars = this.getVars( shaderStage );
2099
+ stageData.vars = this.getVars( shaderStage, allowGlobal );
1783
2100
  stageData.codes = this.getCodes( shaderStage );
1784
2101
  stageData.directives = this.getDirectives( shaderStage );
1785
2102
  stageData.scopedArrays = this.getScopedArrays( shaderStage );
@@ -1816,7 +2133,7 @@ ${ flowData.code }
1816
2133
 
1817
2134
  if ( shaderStage === 'vertex' ) {
1818
2135
 
1819
- flow += `varyings.Vertex = ${ flowSlotData.result };`;
2136
+ flow += `varyings.builtinClipSpace = ${ flowSlotData.result };`;
1820
2137
 
1821
2138
  } else if ( shaderStage === 'fragment' ) {
1822
2139
 
@@ -1829,7 +2146,7 @@ ${ flowData.code }
1829
2146
 
1830
2147
  } else {
1831
2148
 
1832
- let structSnippet = '\t@location(0) color: vec4<f32>';
2149
+ let structSnippet = '\t@location( 0 ) color: vec4<f32>';
1833
2150
 
1834
2151
  const builtins = this.getBuiltins( 'output' );
1835
2152
 
@@ -1899,6 +2216,58 @@ ${ flowData.code }
1899
2216
 
1900
2217
  }
1901
2218
 
2219
+ /**
2220
+ * Returns the bitcast method name for a given input and outputType.
2221
+ *
2222
+ * @param {string} type - The output type to bitcast to.
2223
+ * @return {string} The resolved WGSL bitcast invocation.
2224
+ */
2225
+ getBitcastMethod( type ) {
2226
+
2227
+ const dataType = this.getType( type );
2228
+
2229
+ return `bitcast<${ dataType }>`;
2230
+
2231
+ }
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
+
2257
+ /**
2258
+ * Returns the native snippet for a ternary operation.
2259
+ *
2260
+ * @param {string} condSnippet - The condition determining which expression gets resolved.
2261
+ * @param {string} ifSnippet - The expression to resolve to if the condition is true.
2262
+ * @param {string} elseSnippet - The expression to resolve to if the condition is false.
2263
+ * @return {string} The resolved method name.
2264
+ */
2265
+ getTernary( condSnippet, ifSnippet, elseSnippet ) {
2266
+
2267
+ return `select( ${elseSnippet}, ${ifSnippet}, ${condSnippet} )`;
2268
+
2269
+ }
2270
+
1902
2271
  /**
1903
2272
  * Returns the WGSL type of the given node data type.
1904
2273
  *
@@ -1973,11 +2342,7 @@ ${ flowData.code }
1973
2342
  const codeNode = wgslPolyfill[ name ];
1974
2343
  codeNode.build( this );
1975
2344
 
1976
- if ( this.currentFunctionNode !== null ) {
1977
-
1978
- this.currentFunctionNode.includes.push( codeNode );
1979
-
1980
- }
2345
+ this.addInclude( codeNode );
1981
2346
 
1982
2347
  return codeNode;
1983
2348
 
@@ -2006,15 +2371,15 @@ ${shaderData.uniforms}
2006
2371
  ${shaderData.varyings}
2007
2372
  var<private> varyings : VaryingsStruct;
2008
2373
 
2374
+ // vars
2375
+ ${shaderData.vars}
2376
+
2009
2377
  // codes
2010
2378
  ${shaderData.codes}
2011
2379
 
2012
2380
  @vertex
2013
2381
  fn main( ${shaderData.attributes} ) -> VaryingsStruct {
2014
2382
 
2015
- // vars
2016
- ${shaderData.vars}
2017
-
2018
2383
  // flow
2019
2384
  ${shaderData.flow}
2020
2385
 
@@ -2044,15 +2409,15 @@ ${shaderData.structs}
2044
2409
  // uniforms
2045
2410
  ${shaderData.uniforms}
2046
2411
 
2412
+ // vars
2413
+ ${shaderData.vars}
2414
+
2047
2415
  // codes
2048
2416
  ${shaderData.codes}
2049
2417
 
2050
2418
  @fragment
2051
2419
  fn main( ${shaderData.varyings} ) -> ${shaderData.returnType} {
2052
2420
 
2053
- // vars
2054
- ${shaderData.vars}
2055
-
2056
2421
  // flow
2057
2422
  ${shaderData.flow}
2058
2423
 
@@ -2089,20 +2454,23 @@ ${ shaderData.structs }
2089
2454
  // uniforms
2090
2455
  ${ shaderData.uniforms }
2091
2456
 
2457
+ // vars
2458
+ ${ this.allowGlobalVariables ? shaderData.vars : '' }
2459
+
2092
2460
  // codes
2093
2461
  ${ shaderData.codes }
2094
2462
 
2095
2463
  @compute @workgroup_size( ${ workgroupSizeX }, ${ workgroupSizeY }, ${ workgroupSizeZ } )
2096
2464
  fn main( ${ shaderData.attributes } ) {
2097
2465
 
2466
+ // local vars
2467
+ ${ this.allowGlobalVariables ? '' : shaderData.vars }
2468
+
2098
2469
  // system
2099
2470
  instanceIndex = globalId.x
2100
2471
  + globalId.y * ( ${ workgroupSizeX } * numWorkgroups.x )
2101
2472
  + globalId.z * ( ${ workgroupSizeX } * numWorkgroups.x ) * ( ${ workgroupSizeY } * numWorkgroups.y );
2102
2473
 
2103
- // vars
2104
- ${ shaderData.vars }
2105
-
2106
2474
  // flow
2107
2475
  ${ shaderData.flow }
2108
2476