@plastic-software/three 0.181.3 → 0.183.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 (437) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +11330 -10017
  4. package/build/three.core.js +10011 -9493
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1414 -631
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +21 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +8007 -5427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +8005 -5426
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  16. package/examples/jsm/controls/ArcballControls.js +3 -3
  17. package/examples/jsm/controls/MapControls.js +55 -1
  18. package/examples/jsm/controls/OrbitControls.js +109 -6
  19. package/examples/jsm/controls/TrackballControls.js +6 -6
  20. package/examples/jsm/csm/CSM.js +2 -1
  21. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  22. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  23. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  24. package/examples/jsm/exporters/EXRExporter.js +1 -1
  25. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  26. package/examples/jsm/exporters/USDZExporter.js +22 -3
  27. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  28. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  29. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  30. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  31. package/examples/jsm/helpers/ViewHelper.js +67 -8
  32. package/examples/jsm/inspector/Inspector.js +74 -14
  33. package/examples/jsm/inspector/RendererInspector.js +12 -2
  34. package/examples/jsm/inspector/tabs/Console.js +41 -7
  35. package/examples/jsm/inspector/tabs/Parameters.js +18 -2
  36. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  37. package/examples/jsm/inspector/tabs/Viewer.js +4 -4
  38. package/examples/jsm/inspector/ui/Profiler.js +1836 -31
  39. package/examples/jsm/inspector/ui/Style.js +973 -14
  40. package/examples/jsm/inspector/ui/Tab.js +188 -1
  41. package/examples/jsm/inspector/ui/Values.js +17 -1
  42. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  43. package/examples/jsm/lines/LineMaterial.js +6 -0
  44. package/examples/jsm/loaders/3DMLoader.js +5 -4
  45. package/examples/jsm/loaders/3MFLoader.js +2 -2
  46. package/examples/jsm/loaders/AMFLoader.js +2 -2
  47. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  48. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  49. package/examples/jsm/loaders/EXRLoader.js +5 -5
  50. package/examples/jsm/loaders/FBXLoader.js +2 -4
  51. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  52. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  53. package/examples/jsm/loaders/HDRLoader.js +0 -1
  54. package/examples/jsm/loaders/KMZLoader.js +5 -5
  55. package/examples/jsm/loaders/KTX2Loader.js +19 -3
  56. package/examples/jsm/loaders/LDrawLoader.js +2 -3
  57. package/examples/jsm/loaders/LWOLoader.js +7 -39
  58. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  59. package/examples/jsm/loaders/PCDLoader.js +4 -2
  60. package/examples/jsm/loaders/SVGLoader.js +1 -1
  61. package/examples/jsm/loaders/TDSLoader.js +0 -2
  62. package/examples/jsm/loaders/TGALoader.js +0 -2
  63. package/examples/jsm/loaders/USDLoader.js +100 -40
  64. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  65. package/examples/jsm/loaders/VOXLoader.js +660 -117
  66. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  67. package/examples/jsm/loaders/VTKLoader.js +37 -24
  68. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  69. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  70. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  71. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  72. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  73. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  74. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  75. package/examples/jsm/math/Octree.js +131 -1
  76. package/examples/jsm/misc/Volume.js +0 -1
  77. package/examples/jsm/misc/VolumeSlice.js +0 -1
  78. package/examples/jsm/objects/LensflareMesh.js +1 -1
  79. package/examples/jsm/objects/Sky.js +76 -4
  80. package/examples/jsm/objects/SkyMesh.js +127 -10
  81. package/examples/jsm/objects/Water.js +4 -3
  82. package/examples/jsm/objects/Water2.js +5 -3
  83. package/examples/jsm/objects/WaterMesh.js +5 -7
  84. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  85. package/examples/jsm/physics/JoltPhysics.js +10 -6
  86. package/examples/jsm/physics/RapierPhysics.js +9 -5
  87. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  88. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  89. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  90. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  91. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  92. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  93. package/examples/jsm/renderers/Projector.js +268 -30
  94. package/examples/jsm/renderers/SVGRenderer.js +193 -60
  95. package/examples/jsm/shaders/GTAOShader.js +19 -6
  96. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  97. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  98. package/examples/jsm/shaders/SAOShader.js +17 -4
  99. package/examples/jsm/shaders/SSAOShader.js +11 -1
  100. package/examples/jsm/shaders/SSRShader.js +6 -5
  101. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  102. package/examples/jsm/shaders/VignetteShader.js +1 -1
  103. package/examples/jsm/transpiler/AST.js +44 -0
  104. package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
  105. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  106. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  107. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  108. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  109. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  110. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  111. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  112. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  113. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  114. package/examples/jsm/tsl/display/CRT.js +150 -0
  115. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  116. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  117. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  118. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  119. package/examples/jsm/tsl/display/GTAONode.js +5 -4
  120. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  121. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  122. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  123. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  124. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  125. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  126. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  127. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  128. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  129. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  130. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  131. package/examples/jsm/tsl/display/SSGINode.js +8 -20
  132. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  133. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  134. package/examples/jsm/tsl/display/Shape.js +29 -0
  135. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  136. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  137. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  138. package/examples/jsm/tsl/display/TRAANode.js +273 -125
  139. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  140. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  141. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  142. package/examples/jsm/tsl/math/Bayer.js +40 -1
  143. package/examples/jsm/utils/LDrawUtils.js +1 -1
  144. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  145. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  146. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  147. package/package.json +20 -26
  148. package/src/Three.Core.js +2 -1
  149. package/src/Three.TSL.js +19 -11
  150. package/src/Three.WebGPU.Nodes.js +2 -0
  151. package/src/Three.WebGPU.js +3 -0
  152. package/src/Three.js +1 -0
  153. package/src/animation/AnimationAction.js +1 -1
  154. package/src/animation/AnimationClip.js +1 -1
  155. package/src/animation/AnimationMixer.js +6 -0
  156. package/src/animation/AnimationUtils.js +1 -12
  157. package/src/animation/KeyframeTrack.js +47 -8
  158. package/src/animation/PropertyMixer.js +4 -4
  159. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  160. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  161. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  162. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  163. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  164. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  165. package/src/audio/Audio.js +1 -1
  166. package/src/audio/AudioListener.js +5 -3
  167. package/src/cameras/Camera.js +32 -2
  168. package/src/cameras/CubeCamera.js +20 -0
  169. package/src/constants.js +90 -5
  170. package/src/core/BufferGeometry.js +14 -2
  171. package/src/core/Clock.js +7 -0
  172. package/src/core/Object3D.js +56 -4
  173. package/src/core/Raycaster.js +2 -2
  174. package/src/core/RenderTarget.js +3 -4
  175. package/src/extras/PMREMGenerator.js +7 -18
  176. package/src/extras/TextureUtils.js +5 -1
  177. package/src/geometries/ExtrudeGeometry.js +2 -2
  178. package/src/geometries/PolyhedronGeometry.js +1 -1
  179. package/src/geometries/TorusGeometry.js +8 -3
  180. package/src/helpers/CameraHelper.js +3 -0
  181. package/src/helpers/DirectionalLightHelper.js +4 -1
  182. package/src/helpers/HemisphereLightHelper.js +3 -0
  183. package/src/helpers/PointLightHelper.js +1 -25
  184. package/src/helpers/SpotLightHelper.js +3 -0
  185. package/src/lights/DirectionalLight.js +13 -0
  186. package/src/lights/HemisphereLight.js +10 -0
  187. package/src/lights/Light.js +1 -11
  188. package/src/lights/LightProbe.js +0 -15
  189. package/src/lights/LightShadow.js +15 -6
  190. package/src/lights/PointLight.js +15 -0
  191. package/src/lights/PointLightShadow.js +0 -86
  192. package/src/lights/SpotLight.js +22 -1
  193. package/src/lights/webgpu/IESSpotLight.js +2 -1
  194. package/src/loaders/Cache.js +28 -0
  195. package/src/loaders/FileLoader.js +1 -1
  196. package/src/loaders/ImageBitmapLoader.js +8 -3
  197. package/src/loaders/Loader.js +6 -0
  198. package/src/loaders/MaterialLoader.js +2 -1
  199. package/src/loaders/ObjectLoader.js +21 -2
  200. package/src/loaders/nodes/NodeLoader.js +2 -2
  201. package/src/materials/Material.js +2 -0
  202. package/src/materials/MeshLambertMaterial.js +9 -0
  203. package/src/materials/MeshPhongMaterial.js +9 -0
  204. package/src/materials/ShaderMaterial.js +20 -1
  205. package/src/materials/nodes/Line2NodeMaterial.js +7 -7
  206. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  207. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  208. package/src/materials/nodes/NodeMaterial.js +72 -25
  209. package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
  210. package/src/math/Line3.js +3 -5
  211. package/src/math/MathUtils.js +10 -10
  212. package/src/math/Matrix4.js +74 -65
  213. package/src/math/Quaternion.js +3 -29
  214. package/src/math/Sphere.js +1 -1
  215. package/src/math/Vector3.js +3 -5
  216. package/src/math/interpolants/BezierInterpolant.js +108 -0
  217. package/src/nodes/Nodes.js +87 -68
  218. package/src/nodes/TSL.js +6 -6
  219. package/src/nodes/accessors/Arrays.js +1 -1
  220. package/src/nodes/accessors/BatchNode.js +10 -10
  221. package/src/nodes/accessors/Bitangent.js +5 -5
  222. package/src/nodes/accessors/BufferAttributeNode.js +98 -12
  223. package/src/nodes/accessors/BufferNode.js +29 -2
  224. package/src/nodes/accessors/Camera.js +149 -28
  225. package/src/nodes/accessors/ClippingNode.js +4 -4
  226. package/src/nodes/accessors/CubeTextureNode.js +20 -1
  227. package/src/nodes/accessors/InstanceNode.js +148 -43
  228. package/src/nodes/accessors/MaterialNode.js +9 -1
  229. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  230. package/src/nodes/accessors/ModelNode.js +1 -1
  231. package/src/nodes/accessors/Normal.js +11 -11
  232. package/src/nodes/accessors/Position.js +34 -2
  233. package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
  234. package/src/nodes/accessors/ReferenceNode.js +4 -4
  235. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  236. package/src/nodes/accessors/SceneProperties.js +53 -0
  237. package/src/nodes/accessors/SkinningNode.js +27 -26
  238. package/src/nodes/accessors/StorageBufferNode.js +4 -21
  239. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  240. package/src/nodes/accessors/Tangent.js +4 -14
  241. package/src/nodes/accessors/Texture3DNode.js +32 -35
  242. package/src/nodes/accessors/TextureNode.js +58 -22
  243. package/src/nodes/accessors/UniformArrayNode.js +4 -2
  244. package/src/nodes/accessors/UserDataNode.js +1 -2
  245. package/src/nodes/accessors/VertexColorNode.js +1 -2
  246. package/src/nodes/code/FunctionNode.js +1 -2
  247. package/src/nodes/core/ArrayNode.js +20 -1
  248. package/src/nodes/core/AssignNode.js +2 -2
  249. package/src/nodes/core/AttributeNode.js +2 -2
  250. package/src/nodes/core/ContextNode.js +103 -4
  251. package/src/nodes/core/MRTNode.js +48 -2
  252. package/src/nodes/core/Node.js +29 -3
  253. package/src/nodes/core/NodeBuilder.js +170 -53
  254. package/src/nodes/core/NodeError.js +28 -0
  255. package/src/nodes/core/NodeFrame.js +12 -4
  256. package/src/nodes/core/NodeUtils.js +10 -8
  257. package/src/nodes/core/OutputStructNode.js +12 -10
  258. package/src/nodes/core/ParameterNode.js +3 -3
  259. package/src/nodes/core/PropertyNode.js +19 -3
  260. package/src/nodes/core/StackNode.js +65 -16
  261. package/src/nodes/core/StackTrace.js +139 -0
  262. package/src/nodes/core/StructNode.js +16 -2
  263. package/src/nodes/core/StructTypeNode.js +11 -17
  264. package/src/nodes/core/SubBuildNode.js +1 -1
  265. package/src/nodes/core/UniformNode.js +21 -5
  266. package/src/nodes/core/VarNode.js +47 -22
  267. package/src/nodes/core/VaryingNode.js +1 -18
  268. package/src/nodes/display/BlendModes.js +0 -64
  269. package/src/nodes/display/ColorAdjustment.js +17 -0
  270. package/src/nodes/display/ColorSpaceNode.js +3 -3
  271. package/src/nodes/display/NormalMapNode.js +39 -4
  272. package/src/nodes/display/PassNode.js +98 -9
  273. package/src/nodes/display/RenderOutputNode.js +3 -3
  274. package/src/nodes/display/ScreenNode.js +3 -1
  275. package/src/nodes/display/ToneMappingNode.js +1 -1
  276. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  277. package/src/nodes/display/ViewportDepthNode.js +52 -4
  278. package/src/nodes/display/ViewportTextureNode.js +21 -4
  279. package/src/nodes/fog/Fog.js +18 -35
  280. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  281. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  282. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  283. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
  284. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  285. package/src/nodes/geometry/RangeNode.js +4 -2
  286. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
  287. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  288. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  289. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  290. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  291. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  292. package/src/nodes/lighting/LightsNode.js +2 -2
  293. package/src/nodes/lighting/PointShadowNode.js +162 -149
  294. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  295. package/src/nodes/lighting/ShadowNode.js +97 -41
  296. package/src/nodes/math/BitcountNode.js +433 -0
  297. package/src/nodes/math/ConditionalNode.js +2 -2
  298. package/src/nodes/math/MathNode.js +3 -40
  299. package/src/nodes/math/OperatorNode.js +2 -1
  300. package/src/nodes/math/PackFloatNode.js +98 -0
  301. package/src/nodes/math/UnpackFloatNode.js +96 -0
  302. package/src/nodes/pmrem/PMREMNode.js +1 -1
  303. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  304. package/src/nodes/tsl/TSLCore.js +17 -14
  305. package/src/nodes/utils/ArrayElementNode.js +13 -0
  306. package/src/nodes/utils/DebugNode.js +11 -11
  307. package/src/nodes/utils/EventNode.js +1 -2
  308. package/src/nodes/utils/JoinNode.js +2 -2
  309. package/src/nodes/utils/LoopNode.js +1 -1
  310. package/src/nodes/utils/MemberNode.js +1 -1
  311. package/src/nodes/utils/Packing.js +13 -1
  312. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  313. package/src/nodes/utils/RTTNode.js +1 -1
  314. package/src/nodes/utils/ReflectorNode.js +3 -4
  315. package/src/nodes/utils/SampleNode.js +1 -1
  316. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  317. package/src/nodes/utils/UVUtils.js +28 -0
  318. package/src/objects/BatchedMesh.js +27 -14
  319. package/src/objects/InstancedMesh.js +11 -0
  320. package/src/objects/Line.js +1 -1
  321. package/src/objects/Mesh.js +1 -1
  322. package/src/objects/Points.js +1 -1
  323. package/src/objects/Skeleton.js +9 -0
  324. package/src/renderers/WebGLRenderer.js +178 -92
  325. package/src/renderers/common/Backend.js +29 -0
  326. package/src/renderers/common/Background.js +24 -11
  327. package/src/renderers/common/BindGroup.js +1 -9
  328. package/src/renderers/common/Binding.js +11 -0
  329. package/src/renderers/common/Bindings.js +27 -12
  330. package/src/renderers/common/BlendMode.js +143 -0
  331. package/src/renderers/common/Buffer.js +40 -0
  332. package/src/renderers/common/BundleGroup.js +1 -1
  333. package/src/renderers/common/ChainMap.js +30 -6
  334. package/src/renderers/common/CubeRenderTarget.js +50 -6
  335. package/src/renderers/common/Geometries.js +29 -3
  336. package/src/renderers/common/Lighting.js +5 -21
  337. package/src/renderers/common/Pipelines.js +4 -4
  338. package/src/renderers/common/PostProcessing.js +8 -206
  339. package/src/renderers/common/RenderBundles.js +2 -1
  340. package/src/renderers/common/RenderContext.js +16 -0
  341. package/src/renderers/common/RenderContexts.js +33 -49
  342. package/src/renderers/common/RenderLists.js +2 -1
  343. package/src/renderers/common/RenderObject.js +15 -3
  344. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  345. package/src/renderers/common/RenderObjects.js +18 -2
  346. package/src/renderers/common/RenderPipeline.js +203 -17
  347. package/src/renderers/common/Renderer.js +257 -72
  348. package/src/renderers/common/Sampler.js +4 -4
  349. package/src/renderers/common/StorageBuffer.js +13 -1
  350. package/src/renderers/common/Textures.js +17 -1
  351. package/src/renderers/common/TimestampQueryPool.js +5 -3
  352. package/src/renderers/common/Uniform.js +8 -0
  353. package/src/renderers/common/UniformsGroup.js +61 -0
  354. package/src/renderers/common/XRManager.js +3 -2
  355. package/src/renderers/common/extras/PMREMGenerator.js +2 -8
  356. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  357. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  358. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  359. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  360. package/src/renderers/shaders/DFGLUTData.js +19 -34
  361. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  362. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  363. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  364. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  365. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  366. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  371. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
  372. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  375. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  376. package/src/renderers/shaders/ShaderChunk.js +3 -3
  377. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  378. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  379. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  380. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  381. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  382. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  383. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  384. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  386. package/src/renderers/shaders/ShaderLib.js +7 -5
  387. package/src/renderers/shaders/UniformsLib.js +0 -3
  388. package/src/renderers/webgl/WebGLBackground.js +2 -2
  389. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  390. package/src/renderers/webgl/WebGLCapabilities.js +3 -4
  391. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  392. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  393. package/src/renderers/webgl/WebGLLights.js +18 -1
  394. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  395. package/src/renderers/webgl/WebGLObjects.js +3 -1
  396. package/src/renderers/webgl/WebGLOutput.js +267 -0
  397. package/src/renderers/webgl/WebGLProgram.js +45 -109
  398. package/src/renderers/webgl/WebGLPrograms.js +45 -49
  399. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  400. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  401. package/src/renderers/webgl/WebGLState.js +32 -37
  402. package/src/renderers/webgl/WebGLTextures.js +89 -28
  403. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  404. package/src/renderers/webgl/WebGLUtils.js +6 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
  407. package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
  408. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
  409. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
  410. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  411. package/src/renderers/webgpu/WebGPUBackend.js +119 -13
  412. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  413. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
  414. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
  415. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  416. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
  417. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  418. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  419. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
  420. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  421. package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
  422. package/src/renderers/webxr/WebXRManager.js +2 -2
  423. package/src/textures/CubeDepthTexture.js +76 -0
  424. package/src/textures/Source.js +1 -1
  425. package/src/textures/Texture.js +3 -3
  426. package/src/utils.js +258 -3
  427. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  428. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  429. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  430. package/src/nodes/accessors/SceneNode.js +0 -145
  431. package/src/nodes/code/ScriptableNode.js +0 -726
  432. package/src/nodes/code/ScriptableValueNode.js +0 -253
  433. package/src/nodes/display/PosterizeNode.js +0 -65
  434. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  435. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  436. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  437. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -11,8 +11,8 @@ import WebGLCapabilities from './utils/WebGLCapabilities.js';
11
11
  import { GLFeatureName } from './utils/WebGLConstants.js';
12
12
  import { WebGLBufferRenderer } from './WebGLBufferRenderer.js';
13
13
 
14
- import { warnOnce, warn, error } from '../../utils.js';
15
- import { WebGLCoordinateSystem, TimestampQuery } from '../../constants.js';
14
+ import { isTypedArray, warnOnce, warn, error } from '../../utils.js';
15
+ import { WebGLCoordinateSystem, TimestampQuery, Compatibility } from '../../constants.js';
16
16
  import WebGLTimestampQueryPool from './utils/WebGLTimestampQueryPool.js';
17
17
 
18
18
  /**
@@ -28,6 +28,7 @@ class WebGLBackend extends Backend {
28
28
  *
29
29
  * @typedef {Object} WebGLBackend~Options
30
30
  * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
31
+ * @property {boolean} [reversedDepthBuffer=false] - Whether reversed depth buffer is enabled or not.
31
32
  * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
32
33
  * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
33
34
  * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
@@ -184,7 +185,6 @@ class WebGLBackend extends Backend {
184
185
  */
185
186
  this._knownBindings = new WeakSet();
186
187
 
187
-
188
188
  /**
189
189
  * Whether the device supports framebuffers invalidation or not.
190
190
  *
@@ -265,9 +265,17 @@ class WebGLBackend extends Backend {
265
265
  this.extensions.get( 'WEBGL_render_shared_exponent' );
266
266
  this.extensions.get( 'WEBGL_multi_draw' );
267
267
  this.extensions.get( 'OVR_multiview2' );
268
+ this.extensions.get( 'EXT_clip_control' );
268
269
 
269
270
  this.disjoint = this.extensions.get( 'EXT_disjoint_timer_query_webgl2' );
270
271
  this.parallel = this.extensions.get( 'KHR_parallel_shader_compile' );
272
+ this.drawBuffersIndexedExt = this.extensions.get( 'OES_draw_buffers_indexed' );
273
+
274
+ if ( parameters.reversedDepthBuffer === true && this.extensions.has( 'EXT_clip_control' ) ) {
275
+
276
+ this.state.setReversedDepth( true );
277
+
278
+ }
271
279
 
272
280
  }
273
281
 
@@ -445,9 +453,12 @@ class WebGLBackend extends Backend {
445
453
 
446
454
  if ( renderContext.scissor ) {
447
455
 
448
- const { x, y, width, height } = renderContext.scissorValue;
456
+ this.updateScissor( renderContext );
457
+
458
+ } else {
449
459
 
450
- state.scissor( x, renderContext.height - height - y, width, height );
460
+ const { width, height } = this.getDrawingBufferSize();
461
+ state.scissor( 0, 0, width, height );
451
462
 
452
463
  }
453
464
 
@@ -544,6 +555,17 @@ class WebGLBackend extends Backend {
544
555
 
545
556
  }
546
557
 
558
+ if ( previousContext.scissor ) {
559
+
560
+ this.updateScissor( previousContext );
561
+
562
+ } else {
563
+
564
+ const { width, height } = this.getDrawingBufferSize();
565
+ state.scissor( 0, 0, width, height );
566
+
567
+ }
568
+
547
569
  }
548
570
 
549
571
  this.prepareTimestampBuffer( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
@@ -645,6 +667,20 @@ class WebGLBackend extends Backend {
645
667
 
646
668
  }
647
669
 
670
+ /**
671
+ * Updates the scissor with the values from the given render context.
672
+ *
673
+ * @param {RenderContext} renderContext - The render context.
674
+ */
675
+ updateScissor( renderContext ) {
676
+
677
+ const { state } = this;
678
+ const { x, y, width, height } = renderContext.scissorValue;
679
+
680
+ state.scissor( x, renderContext.height - height - y, width, height );
681
+
682
+ }
683
+
648
684
  /**
649
685
  * Defines the scissor test.
650
686
  *
@@ -814,7 +850,7 @@ class WebGLBackend extends Backend {
814
850
  if ( this.discard === false ) {
815
851
 
816
852
  // required here to handle async behaviour of render.compute()
817
- gl.enable( gl.RASTERIZER_DISCARD );
853
+ state.enable( gl.RASTERIZER_DISCARD );
818
854
  this.discard = true;
819
855
 
820
856
  }
@@ -900,11 +936,11 @@ class WebGLBackend extends Backend {
900
936
  */
901
937
  finishCompute( computeGroup ) {
902
938
 
903
- const gl = this.gl;
939
+ const { state, gl } = this;
904
940
 
905
941
  this.discard = false;
906
942
 
907
- gl.disable( gl.RASTERIZER_DISCARD );
943
+ state.disable( gl.RASTERIZER_DISCARD );
908
944
 
909
945
  this.prepareTimestampBuffer( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
910
946
 
@@ -957,6 +993,12 @@ class WebGLBackend extends Backend {
957
993
 
958
994
  state.setMaterial( material, frontFaceCW, hardwareClippingPlanes );
959
995
 
996
+ if ( context.mrt !== null && context.textures !== null ) {
997
+
998
+ state.setMRTBlending( context.textures, context.mrt, material );
999
+
1000
+ }
1001
+
960
1002
  state.useProgram( programGPU );
961
1003
 
962
1004
  // vertex state
@@ -1743,25 +1785,53 @@ class WebGLBackend extends Backend {
1743
1785
 
1744
1786
  if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1745
1787
 
1746
- const data = binding.buffer;
1747
- let { bufferGPU } = this.get( data );
1788
+ const array = binding.buffer;
1789
+ let { bufferGPU } = this.get( array );
1748
1790
 
1749
1791
  if ( bufferGPU === undefined ) {
1750
1792
 
1751
1793
  // create
1752
1794
 
1753
1795
  bufferGPU = gl.createBuffer();
1796
+
1754
1797
  gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1755
- gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1798
+ gl.bufferData( gl.UNIFORM_BUFFER, array.byteLength, gl.DYNAMIC_DRAW );
1756
1799
 
1757
- this.set( data, { bufferGPU } );
1800
+ this.set( array, { bufferGPU } );
1758
1801
 
1759
1802
  } else {
1760
1803
 
1761
- // update
1762
-
1763
1804
  gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1764
- gl.bufferSubData( gl.UNIFORM_BUFFER, 0, data );
1805
+
1806
+ }
1807
+
1808
+ // update
1809
+
1810
+ const updateRanges = binding.updateRanges;
1811
+
1812
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1813
+
1814
+ if ( updateRanges.length === 0 ) {
1815
+
1816
+ gl.bufferData( gl.UNIFORM_BUFFER, array, gl.DYNAMIC_DRAW );
1817
+
1818
+ } else {
1819
+
1820
+ const isTyped = isTypedArray( array );
1821
+ const byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;
1822
+
1823
+ for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
1824
+
1825
+ const range = updateRanges[ i ];
1826
+
1827
+ const dataOffset = range.start * byteOffsetFactor;
1828
+ const size = range.count * byteOffsetFactor;
1829
+
1830
+ const bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes
1831
+
1832
+ gl.bufferSubData( gl.UNIFORM_BUFFER, bufferOffset, array, dataOffset, size );
1833
+
1834
+ }
1765
1835
 
1766
1836
  }
1767
1837
 
@@ -1799,10 +1869,35 @@ class WebGLBackend extends Backend {
1799
1869
 
1800
1870
  const bindingData = this.get( binding );
1801
1871
  const bufferGPU = bindingData.bufferGPU;
1802
- const data = binding.buffer;
1872
+ const array = binding.buffer;
1873
+
1874
+ const updateRanges = binding.updateRanges;
1803
1875
 
1804
1876
  gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1805
- gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1877
+
1878
+ if ( updateRanges.length === 0 ) {
1879
+
1880
+ gl.bufferData( gl.UNIFORM_BUFFER, array, gl.DYNAMIC_DRAW );
1881
+
1882
+ } else {
1883
+
1884
+ const isTyped = isTypedArray( array );
1885
+ const byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;
1886
+
1887
+ for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
1888
+
1889
+ const range = updateRanges[ i ];
1890
+
1891
+ const dataOffset = range.start * byteOffsetFactor;
1892
+ const size = range.count * byteOffsetFactor;
1893
+
1894
+ const bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes
1895
+
1896
+ gl.bufferSubData( gl.UNIFORM_BUFFER, bufferOffset, array, dataOffset, size );
1897
+
1898
+ }
1899
+
1900
+ }
1806
1901
 
1807
1902
  }
1808
1903
 
@@ -1937,6 +2032,35 @@ class WebGLBackend extends Backend {
1937
2032
 
1938
2033
  }
1939
2034
 
2035
+ /**
2036
+ * Checks if the given compatibility is supported by the backend.
2037
+ *
2038
+ * @param {string} name - The compatibility name.
2039
+ * @return {boolean} Whether the compatibility is supported or not.
2040
+ */
2041
+ hasCompatibility( name ) {
2042
+
2043
+ if ( name === Compatibility.TEXTURE_COMPARE ) return true;
2044
+
2045
+ return super.hasCompatibility( name );
2046
+
2047
+ }
2048
+
2049
+ /**
2050
+ * Initializes the render target defined in the given render context.
2051
+ *
2052
+ * @param {RenderContext} renderContext - The render context.
2053
+ */
2054
+ initRenderTarget( renderContext ) {
2055
+
2056
+ const { gl, state } = this;
2057
+
2058
+ this._setFramebuffer( renderContext );
2059
+
2060
+ state.bindFramebuffer( gl.FRAMEBUFFER, null );
2061
+
2062
+ }
2063
+
1940
2064
  /**
1941
2065
  * Configures the active framebuffer from the given render context.
1942
2066
  *
@@ -1955,7 +2079,7 @@ class WebGLBackend extends Backend {
1955
2079
  const renderTargetContextData = this.get( renderTarget );
1956
2080
  const { samples, depthBuffer, stencilBuffer } = renderTarget;
1957
2081
 
1958
- const isCube = renderTarget.isWebGLCubeRenderTarget === true;
2082
+ const isCube = renderTarget.isCubeRenderTarget === true;
1959
2083
  const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
1960
2084
  const isRenderTargetArray = renderTarget.depth > 1;
1961
2085
  const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
@@ -2091,6 +2215,12 @@ class WebGLBackend extends Backend {
2091
2215
 
2092
2216
  gl.framebufferTextureLayer( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, layer );
2093
2217
 
2218
+ } else if ( descriptor.depthTexture.isCubeTexture ) {
2219
+
2220
+ const cubeFace = this.renderer._activeCubeFace;
2221
+
2222
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureData.textureGPU, 0 );
2223
+
2094
2224
  } else {
2095
2225
 
2096
2226
  gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
@@ -10,8 +10,8 @@ import { DataTexture } from '../../../textures/DataTexture.js';
10
10
  import { error } from '../../../utils.js';
11
11
 
12
12
  const glslPolyfills = {
13
- bitcast_int_uint: new CodeNode( /* glsl */'uint tsl_bitcast_uint_to_int ( int x ) { return floatBitsToInt( uintBitsToFloat( x ) ); }' ),
14
- bitcast_uint_int: new CodeNode( /* glsl */'uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }' )
13
+ bitcast_int_uint: new CodeNode( /* glsl */'uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }' ),
14
+ bitcast_uint_int: new CodeNode( /* glsl */'uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }' )
15
15
  };
16
16
 
17
17
  const glslMethods = {
@@ -22,7 +22,13 @@ const glslMethods = {
22
22
  bitcast_uint_float: 'uintBitsToFloat',
23
23
  bitcast_float_uint: 'floatBitsToUint',
24
24
  bitcast_uint_int: 'tsl_bitcast_uint_to_int',
25
- bitcast_int_uint: 'tsl_bitcast_int_to_uint'
25
+ bitcast_int_uint: 'tsl_bitcast_int_to_uint',
26
+ floatpack_snorm_2x16: 'packSnorm2x16',
27
+ floatpack_unorm_2x16: 'packUnorm2x16',
28
+ floatpack_float16_2x16: 'packHalf2x16',
29
+ floatunpack_snorm_2x16: 'unpackSnorm2x16',
30
+ floatunpack_unorm_2x16: 'unpackUnorm2x16',
31
+ floatunpack_float16_2x16: 'unpackHalf2x16'
26
32
  };
27
33
 
28
34
  const precisionLib = {
@@ -63,9 +69,9 @@ precision highp isampler3D;
63
69
  precision highp isamplerCube;
64
70
  precision highp isampler2DArray;
65
71
 
66
- precision lowp sampler2DShadow;
67
- precision lowp sampler2DArrayShadow;
68
- precision lowp samplerCubeShadow;
72
+ precision highp sampler2DShadow;
73
+ precision highp sampler2DArrayShadow;
74
+ precision highp samplerCubeShadow;
69
75
  `;
70
76
 
71
77
  /**
@@ -184,6 +190,30 @@ class GLSLNodeBuilder extends NodeBuilder {
184
190
 
185
191
  }
186
192
 
193
+ /**
194
+ * Returns the float packing method name for a given numeric encoding.
195
+ *
196
+ * @param {string} encoding - The numeric encoding that describes how the float values are mapped to the integer range.
197
+ * @returns {string} The resolved GLSL float packing method name.
198
+ */
199
+ getFloatPackingMethod( encoding ) {
200
+
201
+ return this.getMethod( `floatpack_${ encoding }_2x16` );
202
+
203
+ }
204
+
205
+ /**
206
+ * Returns the float unpacking method name for a given numeric encoding.
207
+ *
208
+ * @param {string} encoding - The numeric encoding that describes how the integer values are mapped to the float range.
209
+ * @returns {string} The resolved GLSL float unpacking method name.
210
+ */
211
+ getFloatUnpackingMethod( encoding ) {
212
+
213
+ return this.getMethod( `floatunpack_${ encoding }_2x16` );
214
+
215
+ }
216
+
187
217
  /**
188
218
  * Returns the native snippet for a ternary operation.
189
219
  *
@@ -330,7 +360,7 @@ ${ flowData.code }
330
360
 
331
361
  if ( node.isNodeUniform && node.node.isTextureNode !== true && node.node.isBufferNode !== true ) {
332
362
 
333
- return shaderStage.charAt( 0 ) + '_' + node.name;
363
+ return node.name;
334
364
 
335
365
  }
336
366
 
@@ -515,10 +545,13 @@ ${ flowData.code }
515
545
  * @param {string} textureProperty - The name of the texture uniform in the shader.
516
546
  * @param {string} uvSnippet - A GLSL snippet that represents texture coordinates used for sampling.
517
547
  * @param {string} levelSnippet - A GLSL snippet that represents the mip level, with level 0 containing a full size version of the texture.
548
+ * @param {?string} depthSnippet - A GLSL snippet that represents 0-based texture array index to sample.
518
549
  * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
519
550
  * @return {string} The GLSL snippet.
520
551
  */
521
- generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, offsetSnippet ) {
552
+ generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {
553
+
554
+ if ( depthSnippet ) uvSnippet = `vec3( ${ uvSnippet }, ${ depthSnippet } )`;
522
555
 
523
556
  if ( offsetSnippet ) {
524
557
 
@@ -537,10 +570,13 @@ ${ flowData.code }
537
570
  * @param {string} textureProperty - The name of the texture uniform in the shader.
538
571
  * @param {string} uvSnippet - A GLSL snippet that represents texture coordinates used for sampling.
539
572
  * @param {string} biasSnippet - A GLSL snippet that represents the bias to apply to the mip level before sampling.
573
+ * @param {?string} depthSnippet - A GLSL snippet that represents 0-based texture array index to sample.
540
574
  * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
541
575
  * @return {string} The GLSL snippet.
542
576
  */
543
- generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, offsetSnippet ) {
577
+ generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, offsetSnippet ) {
578
+
579
+ if ( depthSnippet ) uvSnippet = `vec3( ${ uvSnippet }, ${ depthSnippet } )`;
544
580
 
545
581
  if ( offsetSnippet ) {
546
582
 
@@ -559,10 +595,13 @@ ${ flowData.code }
559
595
  * @param {string} textureProperty - The name of the texture uniform in the shader.
560
596
  * @param {string} uvSnippet - A GLSL snippet that represents texture coordinates used for sampling.
561
597
  * @param {Array<string>} gradSnippet - An array holding both gradient GLSL snippets.
598
+ * @param {?string} depthSnippet - A GLSL snippet that represents 0-based texture array index to sample.
562
599
  * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.
563
600
  * @return {string} The GLSL snippet.
564
601
  */
565
- generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, offsetSnippet ) {
602
+ generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, offsetSnippet ) {
603
+
604
+ if ( depthSnippet ) uvSnippet = `vec3( ${ uvSnippet }, ${ depthSnippet } )`;
566
605
 
567
606
  if ( offsetSnippet ) {
568
607
 
@@ -591,6 +630,13 @@ ${ flowData.code }
591
630
 
592
631
  if ( shaderStage === 'fragment' ) {
593
632
 
633
+ // Cube shadow maps use vec4(direction, compareValue)
634
+ if ( texture.isCubeTexture ) {
635
+
636
+ return `texture( ${ textureProperty }, vec4( ${ uvSnippet }, ${ compareSnippet } ) )`;
637
+
638
+ }
639
+
594
640
  if ( depthSnippet ) {
595
641
 
596
642
  if ( offsetSnippet ) {
@@ -713,6 +759,20 @@ ${ flowData.code }
713
759
 
714
760
  snippet = `samplerCube ${ uniform.name };`;
715
761
 
762
+ } else if ( uniform.type === 'cubeDepthTexture' ) {
763
+
764
+ const texture = uniform.node.value;
765
+
766
+ if ( texture.compareFunction ) {
767
+
768
+ snippet = `samplerCubeShadow ${ uniform.name };`;
769
+
770
+ } else {
771
+
772
+ snippet = `samplerCube ${ uniform.name };`;
773
+
774
+ }
775
+
716
776
  } else if ( uniform.type === 'buffer' ) {
717
777
 
718
778
  const bufferNode = uniform.node;
@@ -724,32 +784,56 @@ ${ flowData.code }
724
784
 
725
785
  } else {
726
786
 
727
- const vectorType = this.getVectorType( uniform.type );
787
+ const groupName = uniform.groupNode.name;
728
788
 
729
- snippet = `${ vectorType } ${ this.getPropertyName( uniform, shaderStage ) };`;
789
+ // Check if this group has already been processed
790
+ if ( uniformGroups[ groupName ] === undefined ) {
730
791
 
731
- group = true;
792
+ // Get the shared uniform group that contains uniforms from all stages
793
+ const sharedUniformGroup = this.uniformGroups[ groupName ];
732
794
 
733
- }
795
+ if ( sharedUniformGroup !== undefined ) {
796
+
797
+ // Generate snippets for ALL uniforms in this shared group
798
+ const snippets = [];
734
799
 
735
- const precision = uniform.node.precision;
800
+ for ( const sharedUniform of sharedUniformGroup.uniforms ) {
736
801
 
737
- if ( precision !== null ) {
802
+ const type = sharedUniform.getType();
803
+ const vectorType = this.getVectorType( type );
804
+ const precision = sharedUniform.nodeUniform.node.precision;
738
805
 
739
- snippet = precisionLib[ precision ] + ' ' + snippet;
806
+ let uniformSnippet = `${ vectorType } ${ sharedUniform.name };`;
807
+
808
+ if ( precision !== null ) {
809
+
810
+ uniformSnippet = precisionLib[ precision ] + ' ' + uniformSnippet;
811
+
812
+ }
813
+
814
+ snippets.push( '\t' + uniformSnippet );
815
+
816
+ }
817
+
818
+ uniformGroups[ groupName ] = snippets;
819
+
820
+ }
821
+
822
+ }
823
+
824
+ group = true;
740
825
 
741
826
  }
742
827
 
743
- if ( group ) {
828
+ if ( ! group ) {
744
829
 
745
- snippet = '\t' + snippet;
830
+ const precision = uniform.node.precision;
746
831
 
747
- const groupName = uniform.groupNode.name;
748
- const groupSnippets = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = [] );
832
+ if ( precision !== null ) {
749
833
 
750
- groupSnippets.push( snippet );
834
+ snippet = precisionLib[ precision ] + ' ' + snippet;
751
835
 
752
- } else {
836
+ }
753
837
 
754
838
  snippet = 'uniform ' + snippet;
755
839
 
@@ -765,7 +849,7 @@ ${ flowData.code }
765
849
 
766
850
  const groupSnippets = uniformGroups[ name ];
767
851
 
768
- output += this._getGLSLUniformStruct( shaderStage + '_' + name, groupSnippets.join( '\n' ) ) + '\n';
852
+ output += this._getGLSLUniformStruct( name, groupSnippets.join( '\n' ) ) + '\n';
769
853
 
770
854
  }
771
855
 
@@ -1232,6 +1316,18 @@ ${ flowData.code }
1232
1316
 
1233
1317
  }
1234
1318
 
1319
+ /**
1320
+ * Returns the maximum number of bytes available for uniform buffers.
1321
+ *
1322
+ * @return {number} The maximum number of bytes available for uniform buffers.
1323
+ */
1324
+ getUniformBufferLimit() {
1325
+
1326
+ const gl = this.renderer.backend.gl;
1327
+ return gl.getParameter( gl.MAX_UNIFORM_BLOCK_SIZE );
1328
+
1329
+ }
1330
+
1235
1331
  /**
1236
1332
  * Enables hardware clipping.
1237
1333
  *
@@ -1519,7 +1615,7 @@ void main() {
1519
1615
  uniformGPU = new NodeSampledTexture( uniformNode.name, uniformNode.node, group );
1520
1616
  bindings.push( uniformGPU );
1521
1617
 
1522
- } else if ( type === 'cubeTexture' ) {
1618
+ } else if ( type === 'cubeTexture' || type === 'cubeDepthTexture' ) {
1523
1619
 
1524
1620
  uniformGPU = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, group );
1525
1621
  bindings.push( uniformGPU );
@@ -1531,11 +1627,22 @@ void main() {
1531
1627
 
1532
1628
  } else if ( type === 'buffer' ) {
1533
1629
 
1534
- node.name = `NodeBuffer_${ node.id }`;
1535
1630
  uniformNode.name = `buffer${ node.id }`;
1536
1631
 
1537
- const buffer = new NodeUniformBuffer( node, group );
1538
- buffer.name = node.name;
1632
+ const sharedData = this.getSharedDataFromNode( node );
1633
+
1634
+ let buffer = sharedData.buffer;
1635
+
1636
+ if ( buffer === undefined ) {
1637
+
1638
+ node.name = `NodeBuffer_${ node.id }`;
1639
+
1640
+ buffer = new NodeUniformBuffer( node, group );
1641
+ buffer.name = node.name;
1642
+
1643
+ sharedData.buffer = buffer;
1644
+
1645
+ }
1539
1646
 
1540
1647
  bindings.push( buffer );
1541
1648
 
@@ -1543,24 +1650,38 @@ void main() {
1543
1650
 
1544
1651
  } else {
1545
1652
 
1546
- const uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );
1547
-
1548
- let uniformsGroup = uniformsStage[ groupName ];
1653
+ let uniformsGroup = this.uniformGroups[ groupName ];
1549
1654
 
1550
1655
  if ( uniformsGroup === undefined ) {
1551
1656
 
1552
- uniformsGroup = new NodeUniformsGroup( shaderStage + '_' + groupName, group );
1553
- //uniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );
1657
+ uniformsGroup = new NodeUniformsGroup( groupName, group );
1554
1658
 
1555
- uniformsStage[ groupName ] = uniformsGroup;
1659
+ this.uniformGroups[ groupName ] = uniformsGroup;
1556
1660
 
1557
1661
  bindings.push( uniformsGroup );
1558
1662
 
1663
+ } else {
1664
+
1665
+ // Add to bindings for this stage if not already present
1666
+ if ( bindings.indexOf( uniformsGroup ) === - 1 ) {
1667
+
1668
+ bindings.push( uniformsGroup );
1669
+
1670
+ }
1671
+
1559
1672
  }
1560
1673
 
1561
1674
  uniformGPU = this.getNodeUniform( uniformNode, type );
1562
1675
 
1563
- uniformsGroup.addUniform( uniformGPU );
1676
+ // Only add uniform if not already present in the group (check by name to avoid duplicates across stages)
1677
+ const uniformName = uniformGPU.name;
1678
+ const alreadyExists = uniformsGroup.uniforms.some( u => u.name === uniformName );
1679
+
1680
+ if ( ! alreadyExists ) {
1681
+
1682
+ uniformsGroup.addUniform( uniformGPU );
1683
+
1684
+ }
1564
1685
 
1565
1686
  }
1566
1687