@unikia/upe-renderer 0.186.110 → 0.187.11

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 (506) hide show
  1. package/README.md +5 -7
  2. package/UPSTREAM.md +4 -4
  3. package/build/three.core.js +853 -277
  4. package/build/three.module.js +1098 -1280
  5. package/build/three.tsl.js +41938 -686
  6. package/build/three.webgpu.js +10604 -49055
  7. package/build/three.webgpu.nodes.js +9249 -5788
  8. package/examples/jsm/Addons.js +2 -0
  9. package/examples/jsm/animation/CCDIKSolver.js +17 -5
  10. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +27 -14
  12. package/examples/jsm/csm/CSMShader.js +74 -3
  13. package/examples/jsm/curves/CurveExtras.js +4 -4
  14. package/examples/jsm/curves/NURBSCurve.js +14 -0
  15. package/examples/jsm/exporters/EXRExporter.js +673 -16
  16. package/examples/jsm/exporters/GLTFExporter.js +4 -4
  17. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  18. package/examples/jsm/exporters/OBJExporter.js +48 -5
  19. package/examples/jsm/exporters/PLYExporter.js +22 -11
  20. package/examples/jsm/generators/CityGenerator.js +3 -2
  21. package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
  22. package/examples/jsm/gpgpu/BitonicSort.js +30 -23
  23. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  24. package/examples/jsm/inspector/Extension.js +1 -1
  25. package/examples/jsm/inspector/Inspector.js +6 -46
  26. package/examples/jsm/inspector/RendererInspector.js +43 -8
  27. package/examples/jsm/inspector/Storage.js +49 -0
  28. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
  29. package/examples/jsm/inspector/tabs/Parameters.js +5 -1
  30. package/examples/jsm/inspector/tabs/Performance.js +22 -7
  31. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  32. package/examples/jsm/inspector/tabs/Timeline.js +83 -7
  33. package/examples/jsm/inspector/tabs/Viewer.js +25 -10
  34. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  35. package/examples/jsm/inspector/ui/Style.js +21 -53
  36. package/examples/jsm/inspector/ui/Values.js +28 -3
  37. package/examples/jsm/libs/fflate.module.js +83 -56
  38. package/examples/jsm/libs/mikktspace.README.md +27 -0
  39. package/examples/jsm/libs/mikktspace.module.js +721 -109
  40. package/examples/jsm/lighting/ClusteredLighting.js +100 -2
  41. package/examples/jsm/lighting/LightMapper.js +295 -0
  42. package/examples/jsm/lighting/LightProbeGrid.js +242 -139
  43. package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
  44. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
  45. package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
  46. package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
  47. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
  48. package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
  49. package/examples/jsm/lights/SunLight.js +9 -4
  50. package/examples/jsm/lights/SunLightNode.js +3 -3
  51. package/examples/jsm/lines/LineMaterial.js +26 -10
  52. package/examples/jsm/loaders/3DMLoader.js +10 -1
  53. package/examples/jsm/loaders/3MFLoader.js +5 -1
  54. package/examples/jsm/loaders/AMFLoader.js +2 -0
  55. package/examples/jsm/loaders/BVHLoader.js +2 -0
  56. package/examples/jsm/loaders/ColladaLoader.js +8 -0
  57. package/examples/jsm/loaders/DDSLoader.js +1 -1
  58. package/examples/jsm/loaders/DRACOLoader.js +5 -1
  59. package/examples/jsm/loaders/EXRLoader.js +120 -104
  60. package/examples/jsm/loaders/FBXLoader.js +4 -0
  61. package/examples/jsm/loaders/FontLoader.js +2 -0
  62. package/examples/jsm/loaders/GCodeLoader.js +5 -9
  63. package/examples/jsm/loaders/GLTFLoader.js +112 -31
  64. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
  65. package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
  66. package/examples/jsm/loaders/IESLoader.js +46 -12
  67. package/examples/jsm/loaders/JXLLoader.js +159 -0
  68. package/examples/jsm/loaders/KMZLoader.js +6 -0
  69. package/examples/jsm/loaders/KSPLATLoader.js +2 -0
  70. package/examples/jsm/loaders/KTX2Loader.js +49 -4
  71. package/examples/jsm/loaders/KTXLoader.js +5 -3
  72. package/examples/jsm/loaders/LDrawLoader.js +15 -22
  73. package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
  74. package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
  75. package/examples/jsm/loaders/LUTImageLoader.js +2 -0
  76. package/examples/jsm/loaders/LWOLoader.js +6 -0
  77. package/examples/jsm/loaders/MD2Loader.js +2 -0
  78. package/examples/jsm/loaders/MDDLoader.js +4 -0
  79. package/examples/jsm/loaders/MTLLoader.js +8 -0
  80. package/examples/jsm/loaders/MaterialXLoader.js +57 -5
  81. package/examples/jsm/loaders/NRRDLoader.js +4 -2
  82. package/examples/jsm/loaders/OBJLoader.js +10 -4
  83. package/examples/jsm/loaders/PCDLoader.js +6 -2
  84. package/examples/jsm/loaders/PDBLoader.js +5 -3
  85. package/examples/jsm/loaders/PLYLoader.js +39 -15
  86. package/examples/jsm/loaders/PVRLoader.js +2 -2
  87. package/examples/jsm/loaders/SPLATLoader.js +2 -0
  88. package/examples/jsm/loaders/SPZLoader.js +2 -0
  89. package/examples/jsm/loaders/STLLoader.js +3 -1
  90. package/examples/jsm/loaders/SVGLoader.js +27 -49
  91. package/examples/jsm/loaders/TDSLoader.js +4 -0
  92. package/examples/jsm/loaders/TGALoader.js +6 -5
  93. package/examples/jsm/loaders/TTFLoader.js +2 -0
  94. package/examples/jsm/loaders/USDLoader.js +14 -0
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
  96. package/examples/jsm/loaders/VOXLoader.js +3 -0
  97. package/examples/jsm/loaders/VRMLLoader.js +4 -0
  98. package/examples/jsm/loaders/VTKLoader.js +2 -0
  99. package/examples/jsm/loaders/XYZLoader.js +2 -0
  100. package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
  101. package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
  102. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
  103. package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
  104. package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
  105. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
  106. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
  107. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
  108. package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
  109. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
  110. package/examples/jsm/loaders/usd/USDAParser.js +56 -47
  111. package/examples/jsm/loaders/usd/USDComposer.js +25 -30
  112. package/examples/jsm/math/ColorConverter.js +7 -3
  113. package/examples/jsm/math/Lut.js +2 -2
  114. package/examples/jsm/math/OBB.js +3 -3
  115. package/examples/jsm/math/Octree.js +20 -17
  116. package/examples/jsm/objects/GaussianSplat.js +5 -4
  117. package/examples/jsm/objects/Reflector.js +5 -0
  118. package/examples/jsm/objects/SkyMesh.js +14 -7
  119. package/examples/jsm/objects/Water2Mesh.js +2 -2
  120. package/examples/jsm/physics/RapierPhysics.js +2 -2
  121. package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
  122. package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
  123. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  124. package/examples/jsm/postprocessing/GTAOPass.js +26 -18
  125. package/examples/jsm/renderers/SVGRenderer.js +3 -2
  126. package/examples/jsm/shaders/GTAOShader.js +7 -4
  127. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
  128. package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
  129. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  130. package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
  131. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  132. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
  133. package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
  134. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  135. package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
  136. package/examples/jsm/tsl/display/FSR1Node.js +3 -3
  137. package/examples/jsm/tsl/display/FXAANode.js +3 -10
  138. package/examples/jsm/tsl/display/FilmNode.js +3 -3
  139. package/examples/jsm/tsl/display/GTAONode.js +33 -25
  140. package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
  141. package/examples/jsm/tsl/display/GodraysNode.js +5 -19
  142. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
  143. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  144. package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
  145. package/examples/jsm/tsl/display/OITPassNode.js +0 -11
  146. package/examples/jsm/tsl/display/OutlineNode.js +107 -5
  147. package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
  148. package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
  149. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
  150. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  151. package/examples/jsm/tsl/display/SSAONode.js +6 -20
  152. package/examples/jsm/tsl/display/SSGINode.js +36 -29
  153. package/examples/jsm/tsl/display/SSRNode.js +135 -63
  154. package/examples/jsm/tsl/display/SSSNode.js +6 -20
  155. package/examples/jsm/tsl/display/SharpenNode.js +3 -3
  156. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  157. package/examples/jsm/tsl/display/TAAUNode.js +10 -42
  158. package/examples/jsm/tsl/display/TRAANode.js +11 -43
  159. package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
  160. package/examples/jsm/tsl/display/TransitionNode.js +3 -3
  161. package/examples/jsm/tsl/display/lensDirt.js +30 -0
  162. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
  163. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
  164. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
  165. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
  166. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
  167. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
  168. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
  169. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
  170. package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
  171. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  172. package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
  173. package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
  174. package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
  175. package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
  176. package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
  177. package/examples/jsm/utils/SceneOptimizer.js +2 -1
  178. package/examples/jsm/utils/SceneUtils.js +1 -1
  179. package/examples/jsm/utils/unwrapUVs.js +865 -0
  180. package/examples/jsm/webxr/XREstimatedLight.js +11 -4
  181. package/package.json +3 -3
  182. package/src/Three.TSL.js +2 -683
  183. package/src/Three.WebGPU.Nodes.js +2 -1
  184. package/src/Three.WebGPU.js +2 -1
  185. package/src/animation/AnimationAction.js +1 -1
  186. package/src/animation/AnimationUtils.js +1 -3
  187. package/src/animation/KeyframeTrack.js +19 -0
  188. package/src/cameras/ArrayCamera.js +12 -0
  189. package/src/cameras/CubeCamera.js +3 -3
  190. package/src/constants.js +1 -9
  191. package/src/core/BufferAttribute.js +57 -21
  192. package/src/core/BufferGeometry.js +5 -13
  193. package/src/core/Clock.js +1 -1
  194. package/src/core/InterleavedBuffer.js +28 -18
  195. package/src/core/InterleavedBufferAttribute.js +54 -20
  196. package/src/core/Object3D.js +19 -9
  197. package/src/core/Raycaster.js +2 -0
  198. package/src/core/RenderTarget.js +11 -5
  199. package/src/core/UniformsGroup.js +7 -3
  200. package/src/extras/PMREMGenerator.js +392 -685
  201. package/src/extras/core/Curve.js +4 -0
  202. package/src/extras/core/CurvePath.js +13 -0
  203. package/src/extras/core/ShapePath.js +1 -1
  204. package/src/geometries/EdgesGeometry.js +12 -10
  205. package/src/geometries/LatheGeometry.js +2 -0
  206. package/src/helpers/PolarGridHelper.js +1 -1
  207. package/src/lights/Light.js +11 -0
  208. package/src/lights/LightProbe.js +2 -0
  209. package/src/lights/LightShadow.js +2 -0
  210. package/src/loaders/AnimationLoader.js +2 -0
  211. package/src/loaders/AudioLoader.js +2 -0
  212. package/src/loaders/BufferGeometryLoader.js +2 -0
  213. package/src/loaders/CompressedTextureLoader.js +2 -0
  214. package/src/loaders/CubeTextureLoader.js +2 -0
  215. package/src/loaders/DataTextureLoader.js +2 -0
  216. package/src/loaders/FileLoader.js +2 -0
  217. package/src/loaders/ImageBitmapLoader.js +3 -1
  218. package/src/loaders/ImageLoader.js +1 -0
  219. package/src/loaders/Loader.js +47 -0
  220. package/src/loaders/MaterialLoader.js +2 -0
  221. package/src/loaders/ObjectLoader.js +27 -8
  222. package/src/loaders/TextureLoader.js +5 -3
  223. package/src/loaders/nodes/NodeLoader.js +2 -0
  224. package/src/materials/Material.js +21 -2
  225. package/src/materials/MeshDepthMaterial.js +1 -1
  226. package/src/materials/MeshDistanceMaterial.js +1 -1
  227. package/src/materials/MeshLambertMaterial.js +1 -1
  228. package/src/materials/MeshMatcapMaterial.js +1 -1
  229. package/src/materials/MeshNormalMaterial.js +1 -1
  230. package/src/materials/MeshPhongMaterial.js +1 -1
  231. package/src/materials/MeshPhysicalMaterial.js +90 -11
  232. package/src/materials/MeshStandardMaterial.js +1 -1
  233. package/src/materials/MeshToonMaterial.js +1 -1
  234. package/src/materials/nodes/Line2NodeMaterial.js +32 -10
  235. package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
  236. package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
  237. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
  238. package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
  239. package/src/materials/nodes/NodeMaterial.js +36 -16
  240. package/src/materials/nodes/NodeMaterialInstance.js +193 -0
  241. package/src/materials/nodes/NodeMaterials.js +1 -0
  242. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  243. package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
  244. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
  245. package/src/math/Box3.js +2 -2
  246. package/src/math/Color.js +8 -8
  247. package/src/math/ColorManagement.js +2 -21
  248. package/src/math/FrustumArray.js +12 -0
  249. package/src/math/Interpolant.js +1 -1
  250. package/src/math/Line3.js +2 -4
  251. package/src/math/MathUtils.js +33 -46
  252. package/src/math/Matrix2.js +1 -1
  253. package/src/math/Matrix3.js +1 -1
  254. package/src/math/Matrix4.js +1 -1
  255. package/src/math/Triangle.js +2 -1
  256. package/src/math/Vector2.js +1 -1
  257. package/src/math/Vector3.js +1 -1
  258. package/src/math/Vector4.js +1 -1
  259. package/src/nodes/Nodes.js +1 -0
  260. package/src/nodes/TSL.js +2 -0
  261. package/src/nodes/accessors/Arrays.js +1 -1
  262. package/src/nodes/accessors/Batch.js +29 -23
  263. package/src/nodes/accessors/BufferAttributeNode.js +21 -1
  264. package/src/nodes/accessors/BuiltinNode.js +6 -0
  265. package/src/nodes/accessors/Camera.js +100 -93
  266. package/src/nodes/accessors/ClippingNode.js +17 -6
  267. package/src/nodes/accessors/CubeTextureNode.js +12 -24
  268. package/src/nodes/accessors/Instance.js +198 -160
  269. package/src/nodes/accessors/Lights.js +19 -6
  270. package/src/nodes/accessors/MaterialNode.js +33 -4
  271. package/src/nodes/accessors/Morph.js +81 -22
  272. package/src/nodes/accessors/Normal.js +0 -42
  273. package/src/nodes/accessors/Object3DNode.js +6 -0
  274. package/src/nodes/accessors/PointUVNode.js +6 -0
  275. package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
  276. package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
  277. package/src/nodes/accessors/ReferenceNode.js +6 -0
  278. package/src/nodes/accessors/Skinning.js +57 -52
  279. package/src/nodes/accessors/StorageBufferNode.js +3 -12
  280. package/src/nodes/accessors/TextureBicubic.js +30 -27
  281. package/src/nodes/accessors/TextureNode.js +164 -78
  282. package/src/nodes/accessors/TextureSizeNode.js +6 -0
  283. package/src/nodes/accessors/UniformArrayNode.js +8 -15
  284. package/src/nodes/accessors/VelocityNode.js +13 -8
  285. package/src/nodes/code/CodeNode.js +6 -0
  286. package/src/nodes/code/ExpressionNode.js +6 -0
  287. package/src/nodes/code/FunctionCallNode.js +3 -3
  288. package/src/nodes/code/FunctionNode.js +15 -13
  289. package/src/nodes/core/ArrayNode.js +3 -3
  290. package/src/nodes/core/AssignNode.js +10 -9
  291. package/src/nodes/core/AttributeNode.js +39 -0
  292. package/src/nodes/core/BypassNode.js +6 -0
  293. package/src/nodes/core/ConstNode.js +31 -1
  294. package/src/nodes/core/ContextNode.js +11 -6
  295. package/src/nodes/core/IndexNode.js +6 -0
  296. package/src/nodes/core/InputNode.js +6 -0
  297. package/src/nodes/core/InspectorNode.js +17 -31
  298. package/src/nodes/core/IsolateNode.js +8 -0
  299. package/src/nodes/core/Node.js +367 -67
  300. package/src/nodes/core/NodeBuilder.js +664 -222
  301. package/src/nodes/core/NodeUtils.js +25 -0
  302. package/src/nodes/core/NodeVar.js +10 -1
  303. package/src/nodes/core/OutputStructNode.js +6 -0
  304. package/src/nodes/core/OverrideContextNode.js +38 -37
  305. package/src/nodes/core/PropertyNode.js +14 -0
  306. package/src/nodes/core/StackNode.js +33 -21
  307. package/src/nodes/core/StructNode.js +6 -0
  308. package/src/nodes/core/StructTypeNode.js +6 -0
  309. package/src/nodes/core/SubBuildNode.js +8 -0
  310. package/src/nodes/core/TempNode.js +10 -35
  311. package/src/nodes/core/UniformGroupNode.js +6 -0
  312. package/src/nodes/core/VarNode.js +43 -135
  313. package/src/nodes/core/VaryingNode.js +33 -2
  314. package/src/nodes/display/BlendModes.js +5 -40
  315. package/src/nodes/display/BumpMapNode.js +17 -7
  316. package/src/nodes/display/ColorAdjustment.js +22 -10
  317. package/src/nodes/display/ColorSpaceFunctions.js +2 -14
  318. package/src/nodes/display/ColorSpaceNode.js +3 -3
  319. package/src/nodes/display/FrontFacingNode.js +6 -0
  320. package/src/nodes/display/NormalMapNode.js +3 -3
  321. package/src/nodes/display/PassNode.js +75 -16
  322. package/src/nodes/display/RenderOutputNode.js +22 -5
  323. package/src/nodes/display/ScreenNode.js +6 -0
  324. package/src/nodes/display/ToneMappingFunctions.js +9 -51
  325. package/src/nodes/display/ToneMappingNode.js +3 -3
  326. package/src/nodes/display/ToonOutlinePassNode.js +66 -2
  327. package/src/nodes/display/ViewportDepthNode.js +34 -4
  328. package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
  329. package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
  330. package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
  331. package/src/nodes/functions/BSDF/D_GGX.js +1 -8
  332. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
  333. package/src/nodes/functions/BSDF/LTC.js +20 -47
  334. package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
  335. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
  336. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
  337. package/src/nodes/functions/PhysicalLightingModel.js +84 -51
  338. package/src/nodes/functions/VolumetricLightingModel.js +1 -1
  339. package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
  340. package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
  341. package/src/nodes/functions/material/getRoughness.js +3 -1
  342. package/src/nodes/geometry/RangeNode.js +52 -69
  343. package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
  344. package/src/nodes/gpgpu/BarrierNode.js +6 -0
  345. package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
  346. package/src/nodes/gpgpu/ComputeNode.js +6 -0
  347. package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
  348. package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
  349. package/src/nodes/lighting/AnalyticLightNode.js +7 -14
  350. package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
  351. package/src/nodes/lighting/EnvironmentNode.js +58 -8
  352. package/src/nodes/lighting/IESSpotLightNode.js +19 -4
  353. package/src/nodes/lighting/LightProbeNode.js +2 -1
  354. package/src/nodes/lighting/LightUtils.js +2 -2
  355. package/src/nodes/lighting/LightingNode.js +6 -0
  356. package/src/nodes/lighting/LightsNode.js +26 -32
  357. package/src/nodes/lighting/PointShadowNode.js +92 -48
  358. package/src/nodes/lighting/ProjectorLightNode.js +1 -1
  359. package/src/nodes/lighting/RectAreaLightNode.js +13 -14
  360. package/src/nodes/lighting/ShadowBaseNode.js +9 -17
  361. package/src/nodes/lighting/ShadowFilterNode.js +26 -3
  362. package/src/nodes/lighting/ShadowNode.js +13 -11
  363. package/src/nodes/materialx/MaterialXColor.js +2 -14
  364. package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
  365. package/src/nodes/materialx/MaterialXNodes.js +8 -11
  366. package/src/nodes/materialx/MaterialXNoise.js +195 -454
  367. package/src/nodes/math/BitcastNode.js +5 -5
  368. package/src/nodes/math/BitcountNode.js +18 -46
  369. package/src/nodes/math/ConditionalNode.js +92 -22
  370. package/src/nodes/math/Hash.js +1 -1
  371. package/src/nodes/math/MathNode.js +86 -64
  372. package/src/nodes/math/MathUtils.js +2 -2
  373. package/src/nodes/math/OperatorNode.js +42 -59
  374. package/src/nodes/math/PackFloatNode.js +9 -9
  375. package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
  376. package/src/nodes/math/TriNoise3D.js +3 -23
  377. package/src/nodes/math/UnpackFloatNode.js +9 -9
  378. package/src/nodes/pmrem/PMREMNode.js +38 -75
  379. package/src/nodes/pmrem/PMREMUtils.js +108 -272
  380. package/src/nodes/procedural/Checker.js +1 -1
  381. package/src/nodes/tsl/TSLCore.js +199 -74
  382. package/src/nodes/utils/ArrayElementNode.js +19 -1
  383. package/src/nodes/utils/CubeMapNode.js +3 -3
  384. package/src/nodes/utils/DebugNode.js +2 -2
  385. package/src/nodes/utils/EventNode.js +6 -0
  386. package/src/nodes/utils/FlipNode.js +3 -3
  387. package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
  388. package/src/nodes/utils/JoinNode.js +3 -3
  389. package/src/nodes/utils/LoopNode.js +14 -9
  390. package/src/nodes/utils/MemberNode.js +18 -0
  391. package/src/nodes/utils/PostProcessingUtils.js +20 -25
  392. package/src/nodes/utils/RTTNode.js +2 -0
  393. package/src/nodes/utils/ReflectorNode.js +24 -0
  394. package/src/nodes/utils/RotateNode.js +3 -3
  395. package/src/nodes/utils/SampleNode.js +6 -0
  396. package/src/nodes/utils/SetNode.js +3 -3
  397. package/src/nodes/utils/SplitNode.js +6 -0
  398. package/src/nodes/utils/UVUtils.js +2 -2
  399. package/src/objects/BatchedMesh.js +146 -15
  400. package/src/objects/InstancedMesh.js +12 -4
  401. package/src/objects/Line.js +20 -0
  402. package/src/objects/Mesh.js +8 -0
  403. package/src/objects/Points.js +20 -0
  404. package/src/objects/Skeleton.js +26 -0
  405. package/src/objects/SkinnedMesh.js +3 -3
  406. package/src/objects/Sprite.js +10 -0
  407. package/src/renderers/WebGLRenderer.js +104 -70
  408. package/src/renderers/common/Animation.js +5 -1
  409. package/src/renderers/common/Attributes.js +67 -57
  410. package/src/renderers/common/Backend.js +78 -3
  411. package/src/renderers/common/BindGroup.js +11 -0
  412. package/src/renderers/common/Binding.js +0 -11
  413. package/src/renderers/common/Bindings.js +116 -10
  414. package/src/renderers/common/Buffer.js +1 -1
  415. package/src/renderers/common/ClippingContext.js +12 -1
  416. package/src/renderers/common/ComputePipeline.js +17 -1
  417. package/src/renderers/common/DirectRenderPipeline.js +7 -3
  418. package/src/renderers/common/Geometries.js +170 -132
  419. package/src/renderers/common/Info.js +1 -1
  420. package/src/renderers/common/InspectorBase.js +5 -5
  421. package/src/renderers/common/Lighting.js +59 -0
  422. package/src/renderers/common/Pipelines.js +26 -12
  423. package/src/renderers/common/ProgrammableStage.js +1 -17
  424. package/src/renderers/common/RenderContext.js +21 -0
  425. package/src/renderers/common/RenderContexts.js +13 -4
  426. package/src/renderers/common/RenderObject.js +111 -35
  427. package/src/renderers/common/RenderObjects.js +37 -19
  428. package/src/renderers/common/Renderer.js +537 -295
  429. package/src/renderers/common/RendererUtils.js +15 -0
  430. package/src/renderers/common/StandardDrawingPipeline.js +343 -0
  431. package/src/renderers/common/Storage3DTexture.js +11 -0
  432. package/src/renderers/common/StorageArrayTexture.js +10 -0
  433. package/src/renderers/common/StorageTexture.js +0 -9
  434. package/src/renderers/common/Textures.js +144 -37
  435. package/src/renderers/common/UniformsGroup.js +19 -0
  436. package/src/renderers/common/XRManager.js +10 -91
  437. package/src/renderers/common/extras/PMREMGenerator.js +298 -576
  438. package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
  439. package/src/renderers/common/nodes/NodeLibrary.js +11 -35
  440. package/src/renderers/common/nodes/NodeManager.js +80 -31
  441. package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
  442. package/src/renderers/common/nodes/NodeSampler.js +14 -0
  443. package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
  444. package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
  445. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
  446. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
  447. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
  448. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
  452. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
  453. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
  454. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
  455. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
  456. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
  457. package/src/renderers/shaders/ShaderChunk.js +0 -2
  458. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
  459. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  461. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
  462. package/src/renderers/shaders/ShaderLib.js +3 -0
  463. package/src/renderers/shaders/UniformsLib.js +4 -5
  464. package/src/renderers/webgl/WebGLBackground.js +3 -3
  465. package/src/renderers/webgl/WebGLBindingStates.js +4 -2
  466. package/src/renderers/webgl/WebGLCapabilities.js +7 -1
  467. package/src/renderers/webgl/WebGLEnvironments.js +2 -2
  468. package/src/renderers/webgl/WebGLGeometries.js +42 -14
  469. package/src/renderers/webgl/WebGLMaterials.js +15 -2
  470. package/src/renderers/webgl/WebGLOutput.js +37 -1
  471. package/src/renderers/webgl/WebGLProgram.js +13 -54
  472. package/src/renderers/webgl/WebGLPrograms.js +22 -8
  473. package/src/renderers/webgl/WebGLRenderStates.js +11 -8
  474. package/src/renderers/webgl/WebGLShadowMap.js +6 -4
  475. package/src/renderers/webgl/WebGLState.js +10 -6
  476. package/src/renderers/webgl/WebGLTextures.js +129 -77
  477. package/src/renderers/webgl/WebGLUniforms.js +44 -6
  478. package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
  479. package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
  480. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
  481. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
  482. package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
  483. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
  484. package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
  485. package/src/renderers/webgpu/WebGPUBackend.js +140 -82
  486. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  487. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
  488. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
  489. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
  490. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
  491. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  492. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
  493. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
  494. package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
  495. package/src/renderers/webxr/WebXRController.js +3 -3
  496. package/src/renderers/webxr/WebXRManager.js +5 -90
  497. package/src/scenes/Scene.js +4 -4
  498. package/src/textures/CompressedTexture.js +2 -2
  499. package/src/textures/DepthTexture.js +2 -2
  500. package/src/textures/FramebufferTexture.js +11 -0
  501. package/src/textures/Texture.js +29 -1
  502. package/src/textures/TextureSource.js +1 -1
  503. package/src/upe.js +1 -1
  504. package/src/utils.js +4 -4
  505. package/examples/jsm/libs/surfaceNet.js +0 -201
  506. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
@@ -6,8 +6,7 @@ import { expression } from '../code/ExpressionNode.js';
6
6
  import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
7
7
  import { nodeProxy, vec3, nodeObject, int, Fn } from '../tsl/TSLBase.js';
8
8
  import { step } from '../math/MathNode.js';
9
- import { NodeUpdateType } from '../core/constants.js';
10
- import { getTextureType } from '../core/NodeUtils.js';
9
+ import { getTextureType, hash } from '../core/NodeUtils.js';
11
10
 
12
11
  import { Compatibility, GreaterCompare, GreaterEqualCompare, IntType, LessCompare, LessEqualCompare, NearestFilter, UnsignedIntType } from '../../constants.js';
13
12
 
@@ -136,16 +135,6 @@ class TextureNode extends UniformNode {
136
135
  */
137
136
  this.updateMatrix = false;
138
137
 
139
- /**
140
- * By default the `update()` method is not executed. Depending on
141
- * whether a uv transformation matrix and/or flipY is applied, `update()`
142
- * is executed per object.
143
- *
144
- * @type {string}
145
- * @default 'none'
146
- */
147
- this.updateType = NodeUpdateType.NONE;
148
-
149
138
  /**
150
139
  * The reference node.
151
140
  *
@@ -154,6 +143,15 @@ class TextureNode extends UniformNode {
154
143
  */
155
144
  this.referenceNode = null;
156
145
 
146
+ /**
147
+ * The mergeable value is stored in a private property.
148
+ *
149
+ * @private
150
+ * @type {boolean}
151
+ * @default true
152
+ */
153
+ this._mergeable = true;
154
+
157
155
  /**
158
156
  * The texture value is stored in a private property.
159
157
  *
@@ -193,6 +191,32 @@ class TextureNode extends UniformNode {
193
191
 
194
192
  }
195
193
 
194
+ set mergeable( value ) {
195
+
196
+ if ( this.referenceNode ) {
197
+
198
+ this.referenceNode.mergeable = value;
199
+
200
+ } else {
201
+
202
+ this._mergeable = value;
203
+
204
+ }
205
+
206
+ }
207
+
208
+ /**
209
+ * Whether the uniform may be merged with other uniforms at compile-time.
210
+ *
211
+ * @type {boolean}
212
+ * @default true
213
+ */
214
+ get mergeable() {
215
+
216
+ return this.referenceNode ? this.referenceNode.mergeable : this._mergeable;
217
+
218
+ }
219
+
196
220
  set value( value ) {
197
221
 
198
222
  if ( this.referenceNode ) {
@@ -219,17 +243,42 @@ class TextureNode extends UniformNode {
219
243
  }
220
244
 
221
245
  /**
222
- * Overwritten since the uniform hash is defined by the texture's UUID.
246
+ * Overwritten since the uniform hash is defined by the texture's UUID - if mergeable - and the hash of its reference node otherwise.
223
247
  *
224
248
  * @param {NodeBuilder} builder - The current node builder.
225
249
  * @return {string} The uniform hash.
226
250
  */
227
- getUniformHash( /*builder*/ ) {
251
+ getUniformHash( builder ) {
252
+
253
+ if ( this.referenceNode && ! this.referenceNode.mergeable ) {
254
+
255
+ return this.referenceNode.getHash( builder );
256
+
257
+ }
258
+
259
+ if ( ! this._mergeable ) {
260
+
261
+ return this.getHash( builder );
262
+
263
+ }
228
264
 
229
265
  return this.value.uuid;
230
266
 
231
267
  }
232
268
 
269
+ /**
270
+ * Overwritten since the texture's type and filters influence the generated shader code.
271
+ *
272
+ * @return {number} The custom cache key.
273
+ */
274
+ customCacheKey() {
275
+
276
+ const { type, minFilter, magFilter } = this.value;
277
+
278
+ return hash( this.id, type, minFilter, magFilter );
279
+
280
+ }
281
+
233
282
  /**
234
283
  * Overwritten since the node type is inferred from the texture type.
235
284
  *
@@ -291,9 +340,48 @@ class TextureNode extends UniformNode {
291
340
  */
292
341
  getTransformedUV( uvNode ) {
293
342
 
294
- if ( this._matrixUniform === null ) this._matrixUniform = uniform( this.value.matrix );
343
+ return this._getMatrixUniform().mul( vec3( uvNode, 1 ) ).xy;
344
+
345
+ }
346
+
347
+ /**
348
+ * Transforms the given uv gradient with the linear part of the texture matrix.
349
+ *
350
+ * @private
351
+ * @param {Node<vec2>} gradientNode - The uv gradient.
352
+ * @return {Node<vec2>} The transformed gradient.
353
+ */
354
+ _getTransformedGradient( gradientNode ) {
355
+
356
+ return this._getMatrixUniform().mul( vec3( gradientNode, 0 ) ).xy;
357
+
358
+ }
359
+
360
+ /**
361
+ * Returns the uniform of the texture matrix shared by all nodes of the same base texture node.
362
+ *
363
+ * @private
364
+ * @return {UniformNode<mat3>} The texture matrix uniform.
365
+ */
366
+ _getMatrixUniform() {
367
+
368
+ const baseNode = this.getBase();
295
369
 
296
- return this._matrixUniform.mul( vec3( uvNode, 1 ) ).xy;
370
+ if ( baseNode._matrixUniform === null ) {
371
+
372
+ baseNode._matrixUniform = uniform( baseNode.value.matrix ).onObjectUpdate( () => {
373
+
374
+ const texture = baseNode.value;
375
+
376
+ if ( texture.matrixAutoUpdate === true ) texture.updateMatrix();
377
+
378
+ return texture.matrix;
379
+
380
+ } );
381
+
382
+ }
383
+
384
+ return baseNode._matrixUniform;
297
385
 
298
386
  }
299
387
 
@@ -323,17 +411,29 @@ class TextureNode extends UniformNode {
323
411
 
324
412
  if ( builder.isFlipY() ) {
325
413
 
326
- if ( this._flipYUniform === null ) this._flipYUniform = uniform( false );
414
+ const baseNode = this.getBase();
415
+
416
+ if ( baseNode._flipYUniform === null ) {
417
+
418
+ baseNode._flipYUniform = uniform( false ).onObjectUpdate( () => {
419
+
420
+ const texture = baseNode.value;
421
+
422
+ return ( texture.image instanceof ImageBitmap && texture.flipY === true ) || texture.isRenderTargetTexture === true || texture.isFramebufferTexture === true || texture.isDepthTexture === true;
423
+
424
+ } );
425
+
426
+ }
327
427
 
328
428
  uvNode = uvNode.toVar();
329
429
 
330
430
  if ( this.sampler ) {
331
431
 
332
- uvNode = this._flipYUniform.select( uvNode.flipY(), uvNode );
432
+ uvNode = baseNode._flipYUniform.select( uvNode.flipY(), uvNode );
333
433
 
334
434
  } else {
335
435
 
336
- uvNode = this._flipYUniform.select( uvNode.setY( int( textureSize( this, this.levelNode ).y ).sub( uvNode.y ).sub( 1 ) ), uvNode );
436
+ uvNode = baseNode._flipYUniform.select( uvNode.setY( int( textureSize( this, this.levelNode ).y ).sub( int( uvNode.y ) ).sub( 1 ) ), uvNode );
337
437
 
338
438
  }
339
439
 
@@ -385,12 +485,6 @@ class TextureNode extends UniformNode {
385
485
 
386
486
  uvNode = this.setupUV( builder, uvNode );
387
487
 
388
- //
389
-
390
- this.updateType = ( this._matrixUniform !== null || this._flipYUniform !== null ) ? NodeUpdateType.OBJECT : NodeUpdateType.NONE;
391
-
392
- //
393
-
394
488
  return uvNode;
395
489
 
396
490
  } )();
@@ -436,12 +530,28 @@ class TextureNode extends UniformNode {
436
530
 
437
531
  }
438
532
 
533
+ // the context can provide analytic gradients of the default uv, e.g. if the uv is reconstructed per fragment
534
+
535
+ let gradNode = this.gradNode;
536
+
537
+ if ( gradNode === null && this.uvNode === null && levelNode === null && this.biasNode === null && this.sampler === true && builder.context.getTextureGradient ) {
538
+
539
+ const gradient = builder.context.getTextureGradient( this, builder );
540
+
541
+ if ( gradient ) {
542
+
543
+ gradNode = this.updateMatrix === true ? gradient.map( ( node ) => this._getTransformedGradient( node ) ) : gradient;
544
+
545
+ }
546
+
547
+ }
548
+
439
549
  properties.uvNode = uvNode;
440
550
  properties.levelNode = levelNode;
441
551
  properties.biasNode = this.biasNode;
442
552
  properties.compareNode = compareNode;
443
553
  properties.compareStepNode = compareStepNode;
444
- properties.gradNode = this.gradNode;
554
+ properties.gradNode = gradNode;
445
555
  properties.gatherNode = this.gatherNode;
446
556
  properties.depthNode = this.depthNode;
447
557
  properties.offsetNode = this.offsetNode;
@@ -552,19 +662,15 @@ class TextureNode extends UniformNode {
552
662
  const properties = builder.getNodeProperties( this );
553
663
  const textureProperty = super.generate( builder, 'property' );
554
664
 
555
- if ( /^sampler/.test( output ) ) {
556
-
557
- if ( output === 'samplerComparison' ) {
665
+ if ( output === 'samplerComparison' || properties.compareNode !== null ) {
558
666
 
559
- this._samplerComparison = true;
667
+ // make sure the texture node creates a binding with a comparison sampler if necessary
560
668
 
561
- // texture nodes with the same texture share a single uniform so it's
562
- // important to set the flag on the node the binding refers to as well
669
+ this.getSharedNode( builder )._samplerComparison = true;
563
670
 
564
- const sharedNode = this.getSharedNode( builder );
565
- sharedNode._samplerComparison = true;
671
+ }
566
672
 
567
- }
673
+ if ( /^sampler/.test( output ) ) {
568
674
 
569
675
  return textureProperty + '_sampler';
570
676
 
@@ -593,7 +699,9 @@ class TextureNode extends UniformNode {
593
699
  const gradSnippet = gradNode ? [ gradNode[ 0 ].build( builder, 'vec2' ), gradNode[ 1 ].build( builder, 'vec2' ) ] : null;
594
700
  const gatherSnippet = gatherNode ? gatherNode.build( builder, 'int' ) : null;
595
701
  const offsetSnippet = offsetNode ? this.generateOffset( builder, offsetNode ) : null;
596
- const flipYSnippet = this._flipYUniform ? this._flipYUniform.build( builder, 'bool' ) : null;
702
+
703
+ const flipYUniform = this.getBase()._flipYUniform;
704
+ const flipYSnippet = flipYUniform ? flipYUniform.build( builder, 'bool' ) : null;
597
705
 
598
706
  let finalDepthSnippet = depthSnippet;
599
707
 
@@ -699,7 +807,7 @@ class TextureNode extends UniformNode {
699
807
  textureNode.uvNode = nodeObject( uvNode );
700
808
  textureNode.referenceNode = this.getBase();
701
809
 
702
- return nodeObject( textureNode );
810
+ return textureNode;
703
811
 
704
812
  }
705
813
 
@@ -737,7 +845,7 @@ class TextureNode extends UniformNode {
737
845
 
738
846
  }
739
847
 
740
- return nodeObject( textureNode );
848
+ return textureNode;
741
849
 
742
850
  }
743
851
 
@@ -753,7 +861,7 @@ class TextureNode extends UniformNode {
753
861
  textureNode.levelNode = nodeObject( levelNode );
754
862
  textureNode.referenceNode = this.getBase();
755
863
 
756
- return nodeObject( textureNode );
864
+ return textureNode;
757
865
 
758
866
  }
759
867
 
@@ -781,7 +889,7 @@ class TextureNode extends UniformNode {
781
889
  textureNode.biasNode = nodeObject( biasNode );
782
890
  textureNode.referenceNode = this.getBase();
783
891
 
784
- return nodeObject( textureNode );
892
+ return textureNode;
785
893
 
786
894
  }
787
895
 
@@ -807,7 +915,7 @@ class TextureNode extends UniformNode {
807
915
  textureNode.compareNode = nodeObject( compareNode );
808
916
  textureNode.referenceNode = this.getBase();
809
917
 
810
- return nodeObject( textureNode );
918
+ return textureNode;
811
919
 
812
920
  }
813
921
 
@@ -824,7 +932,7 @@ class TextureNode extends UniformNode {
824
932
  textureNode.gradNode = [ nodeObject( gradNodeX ), nodeObject( gradNodeY ) ];
825
933
  textureNode.referenceNode = this.getBase();
826
934
 
827
- return nodeObject( textureNode );
935
+ return textureNode;
828
936
 
829
937
  }
830
938
 
@@ -840,7 +948,7 @@ class TextureNode extends UniformNode {
840
948
  textureNode.gatherNode = nodeObject( gatherNode );
841
949
  textureNode.referenceNode = this.getBase();
842
950
 
843
- return nodeObject( textureNode );
951
+ return textureNode;
844
952
 
845
953
  }
846
954
 
@@ -868,7 +976,7 @@ class TextureNode extends UniformNode {
868
976
  textureNode.depthNode = nodeObject( depthNode );
869
977
  textureNode.referenceNode = this.getBase();
870
978
 
871
- return nodeObject( textureNode );
979
+ return textureNode;
872
980
 
873
981
  }
874
982
 
@@ -884,7 +992,7 @@ class TextureNode extends UniformNode {
884
992
  textureNode.offsetNode = nodeObject( offsetNode );
885
993
  textureNode.referenceNode = this.getBase();
886
994
 
887
- return nodeObject( textureNode );
995
+ return textureNode;
888
996
 
889
997
  }
890
998
 
@@ -897,7 +1005,6 @@ class TextureNode extends UniformNode {
897
1005
  data.value = this.value.toJSON( data.meta ).uuid;
898
1006
  data.sampler = this.sampler;
899
1007
  data.updateMatrix = this.updateMatrix;
900
- data.updateType = this.updateType;
901
1008
 
902
1009
  }
903
1010
 
@@ -908,35 +1015,6 @@ class TextureNode extends UniformNode {
908
1015
  this.value = data.meta.textures[ data.value ];
909
1016
  this.sampler = data.sampler;
910
1017
  this.updateMatrix = data.updateMatrix;
911
- this.updateType = data.updateType;
912
-
913
- }
914
-
915
- /**
916
- * The update is used to implement the update of the uv transformation matrix.
917
- */
918
- update() {
919
-
920
- const texture = this.value;
921
- const matrixUniform = this._matrixUniform;
922
-
923
- if ( matrixUniform !== null ) matrixUniform.value = texture.matrix;
924
-
925
- if ( texture.matrixAutoUpdate === true ) {
926
-
927
- texture.updateMatrix();
928
-
929
- }
930
-
931
- //
932
-
933
- const flipYUniform = this._flipYUniform;
934
-
935
- if ( flipYUniform !== null ) {
936
-
937
- flipYUniform.value = ( ( texture.image instanceof ImageBitmap && texture.flipY === true ) || texture.isRenderTargetTexture === true || texture.isFramebufferTexture === true || texture.isDepthTexture === true );
938
-
939
- }
940
1018
 
941
1019
  }
942
1020
 
@@ -993,7 +1071,7 @@ export const texture = ( value = EmptyTexture, uvNode = null, levelNode = null,
993
1071
 
994
1072
  if ( value && value.isTextureNode === true ) {
995
1073
 
996
- textureNode = nodeObject( value.clone() );
1074
+ textureNode = value.clone();
997
1075
  textureNode.referenceNode = value.getBase(); // Ensure the reference is set to the original node
998
1076
 
999
1077
  if ( uvNode !== null ) textureNode.uvNode = nodeObject( uvNode );
@@ -1011,14 +1089,22 @@ export const texture = ( value = EmptyTexture, uvNode = null, levelNode = null,
1011
1089
  };
1012
1090
 
1013
1091
  /**
1014
- * TSL function for creating a uniform texture node.
1092
+ * TSL function for creating a non-mergeable uniform texture node.
1015
1093
  *
1016
1094
  * @tsl
1017
1095
  * @function
1018
1096
  * @param {?Texture} value - The texture.
1019
1097
  * @returns {TextureNode}
1020
1098
  */
1021
- export const uniformTexture = ( value = EmptyTexture ) => texture( value );
1099
+ export const uniformTexture = ( value = EmptyTexture ) => {
1100
+
1101
+ const textureNode = texture( value );
1102
+
1103
+ textureNode.mergeable = false;
1104
+
1105
+ return textureNode;
1106
+
1107
+ };
1022
1108
 
1023
1109
  /**
1024
1110
  * TSL function for creating a texture node that fetches/loads texels without interpolation.
@@ -52,6 +52,12 @@ class TextureSizeNode extends Node {
52
52
 
53
53
  }
54
54
 
55
+ isCacheable( /*builder*/ ) {
56
+
57
+ return false;
58
+
59
+ }
60
+
55
61
  generate( builder ) {
56
62
 
57
63
  const textureProperty = this.textureNode.build( builder, 'property' );
@@ -42,7 +42,7 @@ class UniformArrayElementNode extends ArrayElementNode {
42
42
 
43
43
  const snippet = super.generate( builder );
44
44
  const type = this.getNodeType( builder );
45
- const paddedType = this.node.getPaddedType();
45
+ const paddedType = this.node.getPaddedType( builder );
46
46
 
47
47
  return builder.format( snippet, paddedType, type );
48
48
 
@@ -101,14 +101,6 @@ class UniformArrayNode extends BufferNode {
101
101
  */
102
102
  this.elementType = elementType === null ? getValueType( value[ 0 ] ) : elementType;
103
103
 
104
- /**
105
- * The padded type. Uniform buffers must conform to a certain buffer layout
106
- * so a separate type is computed to ensure correct buffer size.
107
- *
108
- * @type {string}
109
- */
110
- this.paddedType = this.getPaddedType();
111
-
112
104
  /**
113
105
  * Overwritten since uniform array nodes are updated per render.
114
106
  *
@@ -130,14 +122,14 @@ class UniformArrayNode extends BufferNode {
130
122
 
131
123
  /**
132
124
  * This method is overwritten since the node type is inferred from the
133
- * {@link UniformArrayNode#paddedType}.
125
+ * padded type.
134
126
  *
135
127
  * @param {NodeBuilder} builder - The current node builder.
136
128
  * @return {string} The node type.
137
129
  */
138
- generateNodeType( /*builder*/ ) {
130
+ generateNodeType( builder ) {
139
131
 
140
- return this.paddedType;
132
+ return this.getPaddedType( builder );
141
133
 
142
134
  }
143
135
 
@@ -156,9 +148,10 @@ class UniformArrayNode extends BufferNode {
156
148
  /**
157
149
  * Returns the padded type based on the element type.
158
150
  *
151
+ * @param {NodeBuilder} builder - The current node builder.
159
152
  * @return {string} The padded type.
160
153
  */
161
- getPaddedType() {
154
+ getPaddedType( builder ) {
162
155
 
163
156
  const elementType = this.elementType;
164
157
 
@@ -166,7 +159,7 @@ class UniformArrayNode extends BufferNode {
166
159
 
167
160
  if ( elementType === 'mat2' ) {
168
161
 
169
- paddedType = 'mat2';
162
+ paddedType = builder.renderer.backend.isWebGLBackend === true ? 'vec4' : 'mat2';
170
163
 
171
164
  } else if ( /mat/.test( elementType ) === true ) {
172
165
 
@@ -330,7 +323,7 @@ class UniformArrayNode extends BufferNode {
330
323
 
331
324
  let arrayType = Float32Array;
332
325
 
333
- const paddedType = this.paddedType;
326
+ const paddedType = this.getPaddedType( builder );
334
327
  const paddedElementLength = builder.getTypeLength( paddedType );
335
328
 
336
329
  if ( elementType.charAt( 0 ) === 'i' ) arrayType = Int32Array;
@@ -1,4 +1,4 @@
1
- import TempNode from '../core/TempNode.js';
1
+ import Node from '../core/Node.js';
2
2
  import { modelViewMatrix } from './ModelNode.js';
3
3
  import { positionLocal, positionPrevious } from './Position.js';
4
4
  import { nodeImmutable } from '../tsl/TSLBase.js';
@@ -6,7 +6,6 @@ import { NodeUpdateType } from '../core/constants.js';
6
6
  import { Matrix4 } from '../../math/Matrix4.js';
7
7
  import { uniform } from '../core/UniformNode.js';
8
8
  import { sub } from '../math/OperatorNode.js';
9
- import { cameraProjectionMatrix } from './Camera.js';
10
9
  import { renderGroup } from '../core/UniformGroupNode.js';
11
10
 
12
11
  const _objectData = new WeakMap();
@@ -19,9 +18,9 @@ const _objectData = new WeakMap();
19
18
  * of the previous frame and uses them to compute offsets in NDC space.
20
19
  * These offsets represent the final velocity.
21
20
  *
22
- * @augments TempNode
21
+ * @augments Node
23
22
  */
24
- class VelocityNode extends TempNode {
23
+ class VelocityNode extends Node {
25
24
 
26
25
  static get type() {
27
26
 
@@ -37,7 +36,7 @@ class VelocityNode extends TempNode {
37
36
  super( 'vec2' );
38
37
 
39
38
  /**
40
- * The current projection matrix.
39
+ * An optional projection matrix that overrides the camera's projection matrix.
41
40
  *
42
41
  * @type {?Matrix4}
43
42
  * @default null
@@ -68,6 +67,13 @@ class VelocityNode extends TempNode {
68
67
  */
69
68
  this.previousModelWorldMatrix = uniform( new Matrix4() );
70
69
 
70
+ /**
71
+ * The projection matrix of the current frame.
72
+ *
73
+ * @type {UniformNode<mat4>}
74
+ */
75
+ this.currentProjectionMatrix = uniform( new Matrix4() ).setGroup( renderGroup );
76
+
71
77
  /**
72
78
  * Uniform node representing the previous projection matrix.
73
79
  *
@@ -139,6 +145,7 @@ class VelocityNode extends TempNode {
139
145
 
140
146
  this.previousProjectionMatrix.value.copy( cameraData.previousProjectionMatrix );
141
147
  this.previousCameraViewMatrix.value.copy( cameraData.previousCameraViewMatrix );
148
+ this.currentProjectionMatrix.value.copy( cameraData.currentProjectionMatrix );
142
149
 
143
150
  }
144
151
 
@@ -163,11 +170,9 @@ class VelocityNode extends TempNode {
163
170
  */
164
171
  setup( /*builder*/ ) {
165
172
 
166
- const projectionMatrix = ( this.projectionMatrix === null ) ? cameraProjectionMatrix : uniform( this.projectionMatrix );
167
-
168
173
  const previousModelViewMatrix = this.previousCameraViewMatrix.mul( this.previousModelWorldMatrix );
169
174
 
170
- const clipPositionCurrent = projectionMatrix.mul( modelViewMatrix ).mul( positionLocal );
175
+ const clipPositionCurrent = this.currentProjectionMatrix.mul( modelViewMatrix ).mul( positionLocal );
171
176
  const clipPositionPrevious = this.previousProjectionMatrix.mul( previousModelViewMatrix ).mul( positionPrevious );
172
177
 
173
178
  const ndcPositionCurrent = clipPositionCurrent.xy.div( clipPositionCurrent.w );
@@ -70,6 +70,12 @@ class CodeNode extends Node {
70
70
 
71
71
  }
72
72
 
73
+ isCacheable( /*builder*/ ) {
74
+
75
+ return false;
76
+
77
+ }
78
+
73
79
  /**
74
80
  * Sets the includes of this code node.
75
81
  *
@@ -35,6 +35,12 @@ class ExpressionNode extends Node {
35
35
 
36
36
  }
37
37
 
38
+ isCacheable( /*builder*/ ) {
39
+
40
+ return false;
41
+
42
+ }
43
+
38
44
  generate( builder, output ) {
39
45
 
40
46
  const type = this.getNodeType( builder );
@@ -1,4 +1,4 @@
1
- import TempNode from '../core/TempNode.js';
1
+ import Node from '../core/Node.js';
2
2
  import { addMethodChaining, nodeArray, nodeObject, nodeObjects, float } from '../tsl/TSLCore.js';
3
3
  import { error } from '../../utils.js';
4
4
 
@@ -7,9 +7,9 @@ import { error } from '../../utils.js';
7
7
  * with this module since they use the predefined TSL syntax `wgslFn` and `glslFn` which encapsulate
8
8
  * this logic.
9
9
  *
10
- * @augments TempNode
10
+ * @augments Node
11
11
  */
12
- class FunctionCallNode extends TempNode {
12
+ class FunctionCallNode extends Node {
13
13
 
14
14
  static get type() {
15
15
 
@@ -115,20 +115,24 @@ class FunctionNode extends CodeNode {
115
115
 
116
116
  generate( builder, output ) {
117
117
 
118
- super.generate( builder );
119
-
120
118
  const nodeFunction = this.getNodeFunction( builder );
119
+ const nodeData = builder.getDataFromNode( this );
121
120
 
122
- const name = nodeFunction.name;
123
121
  const type = nodeFunction.type;
124
122
 
125
- const nodeCode = builder.getCodeFromNode( this, type );
123
+ let propertyName = nodeData.functionPropertyName;
124
+
125
+ if ( propertyName === undefined ) {
126
+
127
+ // The includes and the function code are generated once per builder and shader stage,
128
+ // further calls only need the function name.
126
129
 
127
- if ( name !== '' ) {
130
+ super.generate( builder );
128
131
 
129
- const nodeData = builder.getDataFromNode( this );
132
+ const name = nodeFunction.name;
133
+ const nodeCode = builder.getCodeFromNode( this, type );
130
134
 
131
- if ( nodeData.declarationRegistered !== true ) {
135
+ if ( name !== '' ) {
132
136
 
133
137
  // use a custom property name
134
138
 
@@ -136,17 +140,15 @@ class FunctionNode extends CodeNode {
136
140
 
137
141
  builder.registerDeclaration( nodeCode );
138
142
 
139
- nodeData.declarationRegistered = true;
140
-
141
143
  }
142
144
 
143
- }
145
+ propertyName = builder.getPropertyName( nodeCode );
144
146
 
145
- const propertyName = builder.getPropertyName( nodeCode );
147
+ nodeCode.code = nodeFunction.getCode( propertyName ) + '\n';
146
148
 
147
- const code = this.getNodeFunction( builder ).getCode( propertyName );
149
+ nodeData.functionPropertyName = propertyName;
148
150
 
149
- nodeCode.code = code + '\n';
151
+ }
150
152
 
151
153
  if ( output === 'property' ) {
152
154