@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
@@ -13,6 +13,8 @@ import { warn, error } from '../../utils.js';
13
13
 
14
14
  let currentStack = null;
15
15
 
16
+ const _secureNodeBuilders = new WeakMap();
17
+
16
18
  const NodeElements = new Map();
17
19
 
18
20
  // Extend Node Class for TSL using prototype
@@ -38,8 +40,6 @@ export function addMethodChaining( name, nodeElement ) {
38
40
 
39
41
  Node.prototype[ name ] = function ( ...params ) {
40
42
 
41
- //if ( name === 'toVarIntent' ) return this;
42
-
43
43
  return this.isStackNode ? this.addToStack( nodeElement( ...params ) ) : nodeElement( this, ...params );
44
44
 
45
45
  };
@@ -85,12 +85,6 @@ Node.prototype.assign = function ( ...params ) {
85
85
 
86
86
  };
87
87
 
88
- Node.prototype.toVarIntent = function () {
89
-
90
- return this;
91
-
92
- };
93
-
94
88
  Node.prototype.get = function ( value ) {
95
89
 
96
90
  return new MemberNode( this, value );
@@ -101,6 +95,26 @@ Node.prototype.get = function ( value ) {
101
95
 
102
96
  const proto = {};
103
97
 
98
+ // Cache of the swizzle and element nodes, a proxy of a node has its own cache
99
+
100
+ const _swizzleCache = new WeakMap();
101
+
102
+ function getSwizzleCache( node ) {
103
+
104
+ let cache = _swizzleCache.get( node );
105
+
106
+ if ( cache === undefined ) {
107
+
108
+ cache = {};
109
+
110
+ _swizzleCache.set( node, cache );
111
+
112
+ }
113
+
114
+ return cache;
115
+
116
+ }
117
+
104
118
  // Set swizzle properties for xyzw, rgba, and stpq.
105
119
 
106
120
  function setProtoSwizzle( property, altA, altB ) {
@@ -111,17 +125,17 @@ function setProtoSwizzle( property, altA, altB ) {
111
125
 
112
126
  get() {
113
127
 
114
- this._cache = this._cache || {};
128
+ const cache = getSwizzleCache( this );
115
129
 
116
130
  //
117
131
 
118
- let split = this._cache[ property ];
132
+ let split = cache[ property ];
119
133
 
120
134
  if ( split === undefined ) {
121
135
 
122
136
  split = new SplitNode( this, property );
123
137
 
124
- this._cache[ property ] = split;
138
+ cache[ property ] = split;
125
139
 
126
140
  }
127
141
 
@@ -217,17 +231,17 @@ for ( let i = 0; i < 32; i ++ ) {
217
231
 
218
232
  get() {
219
233
 
220
- this._cache = this._cache || {};
234
+ const cache = getSwizzleCache( this );
221
235
 
222
236
  //
223
237
 
224
- let element = this._cache[ i ];
238
+ let element = cache[ i ];
225
239
 
226
240
  if ( element === undefined ) {
227
241
 
228
242
  element = new ArrayElementNode( this, new ConstNode( i, 'uint' ) );
229
243
 
230
- this._cache[ i ] = element;
244
+ cache[ i ] = element;
231
245
 
232
246
  }
233
247
 
@@ -254,17 +268,17 @@ function setProtoProperty( property, target ) {
254
268
 
255
269
  get() {
256
270
 
257
- this._cache = this._cache || {};
271
+ const cache = getSwizzleCache( this );
258
272
 
259
273
  //
260
274
 
261
- let split = this._cache[ target ];
275
+ let split = cache[ target ];
262
276
 
263
277
  if ( split === undefined ) {
264
278
 
265
279
  split = new SplitNode( this, target );
266
280
 
267
- this._cache[ target ] = split;
281
+ cache[ target ] = split;
268
282
 
269
283
  }
270
284
 
@@ -301,7 +315,7 @@ const ShaderNodeObject = function ( obj, altType = null ) {
301
315
 
302
316
  } else if ( ( altType === null && ( type === 'float' || type === 'boolean' ) ) || ( type && type !== 'shader' && type !== 'string' ) ) {
303
317
 
304
- return nodeObject( getConstNode( obj, altType ) );
318
+ return getConstNode( obj, altType );
305
319
 
306
320
  } else if ( type === 'shader' ) {
307
321
 
@@ -345,18 +359,14 @@ const ShaderNodeProxy = function ( NodeClass, scope = null, factor = null, setti
345
359
 
346
360
  if ( settings !== null ) {
347
361
 
348
- node = nodeObject( Object.assign( node, settings ) );
362
+ Object.assign( node, settings );
349
363
 
350
- if ( settings.intent === true ) {
364
+ if ( settings.assignable === true ) {
351
365
 
352
- node = node.toVarIntent();
366
+ node = node.toAssignable();
353
367
 
354
368
  }
355
369
 
356
- } else {
357
-
358
- node = nodeObject( node );
359
-
360
370
  }
361
371
 
362
372
  return node;
@@ -459,6 +469,13 @@ class ShaderCallNodeInternal extends Node {
459
469
 
460
470
  }
461
471
 
472
+ isCacheable( builder ) {
473
+
474
+ // A call is an expression unless its body has statements.
475
+ return this.getOutputNode( builder ).nodes.length === 0;
476
+
477
+ }
478
+
462
479
  generateNodeType( builder ) {
463
480
 
464
481
  return this.shaderNode.nodeType || this.getOutputNode( builder ).getNodeType( builder );
@@ -502,45 +519,44 @@ class ShaderCallNodeInternal extends Node {
502
519
 
503
520
  let result = null;
504
521
 
505
- if ( shaderNode.layout ) {
506
-
507
- // build inputs first
522
+ // A layout call needs every input. Missing inputs are completed with the default values
523
+ // of the function parameters; if they can't be resolved, the function is expanded inline.
508
524
 
509
- if ( rawInputs ) {
525
+ const layoutInputs = shaderNode.layout ? builder._getLayoutInputs( shaderNode, rawInputs ) : null;
510
526
 
511
- // use layout inputs to ensure that no extra parameters are built
527
+ if ( layoutInputs !== null ) {
512
528
 
513
- const inputs = shaderNode.layout.inputs;
529
+ // build inputs first, use layout inputs to ensure that no extra parameters are built
514
530
 
515
- if ( isArrayAsParameter( rawInputs ) ) {
531
+ const layoutParameters = shaderNode.layout.inputs;
516
532
 
517
- const rawArrayParameters = rawInputs;
533
+ if ( isArrayAsParameter( layoutInputs ) ) {
518
534
 
519
- for ( let i = 0; i < inputs.length; i ++ ) {
535
+ const rawArrayParameters = layoutInputs;
520
536
 
521
- const rawParameter = rawArrayParameters[ i ];
537
+ for ( let i = 0; i < layoutParameters.length; i ++ ) {
522
538
 
523
- if ( rawParameter && rawParameter.isNode ) {
539
+ const rawParameter = rawArrayParameters[ i ];
524
540
 
525
- rawParameter.build( builder );
541
+ if ( rawParameter && rawParameter.isNode ) {
526
542
 
527
- }
543
+ rawParameter.build( builder );
528
544
 
529
545
  }
530
546
 
531
- } else {
547
+ }
532
548
 
533
- const rawObjectParameters = rawInputs[ 0 ];
549
+ } else {
534
550
 
535
- for ( const param of inputs ) {
551
+ const rawObjectParameters = layoutInputs[ 0 ];
536
552
 
537
- const rawParameter = rawObjectParameters[ param.name ];
553
+ for ( const param of layoutParameters ) {
538
554
 
539
- if ( rawParameter && rawParameter.isNode ) {
555
+ const rawParameter = rawObjectParameters[ param.name ];
540
556
 
541
- rawParameter.build( builder );
557
+ if ( rawParameter && rawParameter.isNode ) {
542
558
 
543
- }
559
+ rawParameter.build( builder );
544
560
 
545
561
  }
546
562
 
@@ -554,37 +570,45 @@ class ShaderCallNodeInternal extends Node {
554
570
 
555
571
  //
556
572
 
557
- const inputs = rawInputs ? getLayoutParameters( rawInputs ) : null;
573
+ const inputs = getLayoutParameters( layoutInputs );
558
574
 
559
575
  result = functionNode.call( inputs );
560
576
 
561
577
  } else {
562
578
 
563
- const secureNodeBuilder = new Proxy( builder, {
579
+ let secureNodeBuilder = _secureNodeBuilders.get( builder );
580
+
581
+ if ( secureNodeBuilder === undefined ) {
582
+
583
+ secureNodeBuilder = new Proxy( builder, {
564
584
 
565
- get: ( target, property, receiver ) => {
585
+ get: ( target, property, receiver ) => {
566
586
 
567
- let value;
587
+ let value;
568
588
 
569
- if ( Symbol.iterator === property ) {
589
+ if ( Symbol.iterator === property ) {
570
590
 
571
- value = function* () {
591
+ value = function* () {
572
592
 
573
- yield undefined;
593
+ yield undefined;
574
594
 
575
- };
595
+ };
576
596
 
577
- } else {
597
+ } else {
598
+
599
+ value = Reflect.get( target, property, receiver );
578
600
 
579
- value = Reflect.get( target, property, receiver );
601
+ }
602
+
603
+ return value;
580
604
 
581
605
  }
582
606
 
583
- return value;
607
+ } );
584
608
 
585
- }
609
+ _secureNodeBuilders.set( builder, secureNodeBuilder );
586
610
 
587
- } );
611
+ }
588
612
 
589
613
  //
590
614
 
@@ -634,13 +658,34 @@ class ShaderCallNodeInternal extends Node {
634
658
 
635
659
  }
636
660
 
661
+ generate( builder, output ) {
662
+
663
+ return this.getOutputNode( builder ).build( builder, output ) || '';
664
+
665
+ }
666
+
637
667
  build( builder, output = null ) {
638
668
 
669
+ // The call does not use Node.build(), so it handles the inspector node, shared and overridden nodes and assignable state here.
670
+ this._setupInspector( builder );
671
+
672
+ const refNode = this.getShared( builder );
673
+
674
+ if ( this !== refNode ) {
675
+
676
+ return refNode.build( builder, output );
677
+
678
+ }
679
+
639
680
  let result = null;
640
681
 
641
682
  const buildStage = builder.getBuildStage();
642
683
  const properties = builder.getNodeProperties( this );
643
684
 
685
+ const nodeData = this.assignable === true ? builder.getDataFromNode( this ) : null;
686
+
687
+ if ( nodeData !== null ) this._updateAssignable( builder, nodeData );
688
+
644
689
  const subBuildOutput = builder.getSubBuildOutput( this );
645
690
  const outputNode = this.getOutputNode( builder );
646
691
 
@@ -687,11 +732,31 @@ class ShaderCallNodeInternal extends Node {
687
732
 
688
733
  } else if ( buildStage === 'analyze' ) {
689
734
 
690
- outputNode.build( builder, output );
735
+ // A variable is evaluated once, so its value is analyzed only once.
736
+ if ( nodeData === null || this._isVariable( builder, nodeData ) === false || builder.increaseUsage( this ) === 1 ) {
737
+
738
+ outputNode.build( builder, output );
739
+
740
+ }
691
741
 
692
742
  } else if ( buildStage === 'generate' ) {
693
743
 
694
- result = outputNode.build( builder, output ) || '';
744
+ if ( nodeData !== null && this._isVariable( builder, nodeData ) ) {
745
+
746
+ this._checkFlowBlock( builder, nodeData );
747
+
748
+ const isCached = nodeData.propertyName !== undefined;
749
+ const flowCodeLength = builder.flow.code.length;
750
+
751
+ result = this._buildVariable( builder, nodeData, output );
752
+
753
+ this._setFlowBlock( builder, nodeData, isCached, flowCodeLength );
754
+
755
+ } else {
756
+
757
+ result = outputNode.build( builder, output ) || '';
758
+
759
+ }
695
760
 
696
761
  }
697
762
 
@@ -749,7 +814,7 @@ function getProxyParameters( params ) {
749
814
 
750
815
  for ( const inputNode of params ) {
751
816
 
752
- yield nodeObject( inputNode );
817
+ yield inputNode;
753
818
 
754
819
  }
755
820
 
@@ -820,6 +885,12 @@ class ShaderNodeInternal extends Node {
820
885
 
821
886
  }
822
887
 
888
+ isCacheable( /*builder*/ ) {
889
+
890
+ return false;
891
+
892
+ }
893
+
823
894
  setLayout( layout ) {
824
895
 
825
896
  this.layout = layout;
@@ -859,16 +930,18 @@ for ( const bool of bools ) boolsCacheMap.set( bool, new ConstNode( bool ) );
859
930
  const uintsCacheMap = new Map();
860
931
  for ( const uint of uints ) uintsCacheMap.set( uint, new ConstNode( uint, 'uint' ) );
861
932
 
862
- const intsCacheMap = new Map( [ ...uintsCacheMap ].map( el => new ConstNode( el.value, 'int' ) ) );
933
+ const intsCacheMap = new Map();
934
+ for ( const value of uintsCacheMap.keys() ) intsCacheMap.set( value, new ConstNode( value, 'int' ) );
863
935
  for ( const int of ints ) intsCacheMap.set( int, new ConstNode( int, 'int' ) );
864
936
 
865
- const floatsCacheMap = new Map( [ ...intsCacheMap ].map( el => new ConstNode( el.value ) ) );
937
+ const floatsCacheMap = new Map();
938
+ for ( const value of intsCacheMap.keys() ) floatsCacheMap.set( value, new ConstNode( value ) );
866
939
  for ( const float of floats ) floatsCacheMap.set( float, new ConstNode( float ) );
867
940
  for ( const float of floats ) floatsCacheMap.set( - float, new ConstNode( - float ) );
868
941
 
869
942
  const cacheMaps = { bool: boolsCacheMap, uint: uintsCacheMap, ints: intsCacheMap, float: floatsCacheMap };
870
943
 
871
- const constNodesCacheMap = new Map( [ ...boolsCacheMap, ...floatsCacheMap ] );
944
+ const constNodesCacheMap = new Map( boolsCacheMap );
872
945
 
873
946
  const getConstNode = ( value, type ) => {
874
947
 
@@ -882,12 +955,19 @@ const getConstNode = ( value, type ) => {
882
955
 
883
956
  } else {
884
957
 
885
- return new ConstNode( value, type );
958
+ const node = new ConstNode( value, type );
959
+
960
+ // Implicit numbers are weak and can adapt to the type of other operands.
961
+ node.isWeak = ! type && typeof value === 'number';
962
+
963
+ return node;
886
964
 
887
965
  }
888
966
 
889
967
  };
890
968
 
969
+ for ( const value of floatsCacheMap.keys() ) constNodesCacheMap.set( value, getConstNode( value ) );
970
+
891
971
  const ConvertType = function ( type, cacheMap = null ) {
892
972
 
893
973
  return ( ...params ) => {
@@ -918,20 +998,33 @@ const ConvertType = function ( type, cacheMap = null ) {
918
998
 
919
999
  if ( params.length === 1 && cacheMap !== null && cacheMap.has( params[ 0 ] ) ) {
920
1000
 
921
- return nodeObjectIntent( cacheMap.get( params[ 0 ] ) );
1001
+ const cached = cacheMap.get( params[ 0 ] );
1002
+
1003
+ return new ConstNode( cached.value, cached.nodeType ).toAssignable();
922
1004
 
923
1005
  }
924
1006
 
925
1007
  if ( params.length === 1 ) {
926
1008
 
927
- const node = getConstNode( params[ 0 ], type );
928
- if ( node.nodeType === type ) return nodeObjectIntent( node );
929
- return nodeObjectIntent( new ConvertNode( node, type ) );
1009
+ const param = params[ 0 ];
1010
+ const node = getConstNode( param, type );
1011
+
1012
+ if ( node.nodeType === type ) {
1013
+
1014
+ // A node given by the user or a shared constant must not become the variable itself.
1015
+ if ( node === param ) return new ConvertNode( node, type ).toAssignable();
1016
+ if ( constNodesCacheMap.get( param ) === node ) return new ConstNode( node.value, node.nodeType ).toAssignable();
1017
+
1018
+ return node.toAssignable();
1019
+
1020
+ }
1021
+
1022
+ return new ConvertNode( node, type ).toAssignable();
930
1023
 
931
1024
  }
932
1025
 
933
1026
  const nodes = params.map( param => getConstNode( param ) );
934
- return nodeObjectIntent( new JoinNode( nodes, type ) );
1027
+ return new JoinNode( nodes, type ).toAssignable();
935
1028
 
936
1029
  };
937
1030
 
@@ -972,12 +1065,28 @@ export function ShaderNode( jsFunc, nodeType ) {
972
1065
  }
973
1066
 
974
1067
  export const nodeObject = ( val, altType = null ) => /* new */ ShaderNodeObject( val, altType );
975
- export const nodeObjectIntent = ( val, altType = null ) => /* new */ nodeObject( val, altType ).toVarIntent();
1068
+ export const nodeObjectAssignable = ( val, altType = null ) => {
1069
+
1070
+ let node = nodeObject( val, altType );
1071
+
1072
+ // Shared constants need their own assignable node.
1073
+ if ( node.isConstNode === true && constNodesCacheMap.get( node.value ) === node ) {
1074
+
1075
+ const copy = new ConstNode( node.value, node.nodeType );
1076
+ copy.isWeak = node.isWeak;
1077
+ node = copy;
1078
+
1079
+ }
1080
+
1081
+ return node.toAssignable();
1082
+
1083
+ };
1084
+
976
1085
  export const nodeObjects = ( val, altType = null ) => new ShaderNodeObjects( val, altType );
977
1086
  export const nodeArray = ( val, altType = null ) => new ShaderNodeArray( val, altType );
978
1087
  export const nodeProxy = ( NodeClass, scope = null, factor = null, settings = null ) => new ShaderNodeProxy( NodeClass, scope, factor, settings );
979
1088
  export const nodeImmutable = ( NodeClass, ...params ) => new ShaderNodeImmutable( NodeClass, ...params );
980
- export const nodeProxyIntent = ( NodeClass, scope = null, factor = null, settings = {} ) => new ShaderNodeProxy( NodeClass, scope, factor, { ...settings, intent: true } );
1089
+ export const nodeProxyAssignable = ( NodeClass, scope = null, factor = null, settings = {} ) => new ShaderNodeProxy( NodeClass, scope, factor, { ...settings, assignable: true } );
981
1090
 
982
1091
  export const nodeProxyConstructor = ( constructorFunction, nodeInstance ) => {
983
1092
 
@@ -1045,6 +1154,12 @@ class FnNode extends Node {
1045
1154
 
1046
1155
  }
1047
1156
 
1157
+ isCacheable( /*builder*/ ) {
1158
+
1159
+ return false;
1160
+
1161
+ }
1162
+
1048
1163
  setLayout( layout ) {
1049
1164
 
1050
1165
  const nodeType = this.shaderNode.nodeType;
@@ -1088,9 +1203,10 @@ class FnNode extends Node {
1088
1203
 
1089
1204
  const fnCall = this.shaderNode.call( params );
1090
1205
 
1091
- if ( this.shaderNode.nodeType === 'void' ) fnCall.toStack();
1206
+ // A call without a return value is a statement.
1207
+ if ( this.shaderNode.nodeType === 'void' ) return fnCall.toStack();
1092
1208
 
1093
- return fnCall.toVarIntent();
1209
+ return fnCall.toAssignable();
1094
1210
 
1095
1211
  }
1096
1212
 
@@ -1117,6 +1233,15 @@ class FnNode extends Node {
1117
1233
 
1118
1234
  export function Fn( jsFunc, layout = null ) {
1119
1235
 
1236
+ // Layout functions are cached across shaders of the same backend. Their bodies
1237
+ // must depend only on explicit inputs and constants, not uniforms or material context.
1238
+ //
1239
+ // Parameters can have default values. A call without some inputs passes the defaults as
1240
+ // arguments, so values like `uv()` are evaluated at the call site. The defaults are resolved
1241
+ // once per function and shared by all calls: a value that must be evaluated per build should
1242
+ // be a node like `Fn( ... ).once()().toVar( name )`. If a default depends on another
1243
+ // parameter, that call is expanded inline.
1244
+
1120
1245
  const instance = new FnNode( jsFunc, layout );
1121
1246
 
1122
1247
  return new Proxy( () => {}, {
@@ -6,7 +6,7 @@ import Node from '../core/Node.js';
6
6
  *
7
7
  * @augments Node
8
8
  */
9
- class ArrayElementNode extends Node { // @TODO: If extending from TempNode it breaks webgpu_compute
9
+ class ArrayElementNode extends Node {
10
10
 
11
11
  static get type() {
12
12
 
@@ -49,6 +49,24 @@ class ArrayElementNode extends Node { // @TODO: If extending from TempNode it br
49
49
 
50
50
  }
51
51
 
52
+ isCacheable( /*builder*/ ) {
53
+
54
+ return false;
55
+
56
+ }
57
+
58
+ /**
59
+ * Returns the scope of the array-like node so assignments to elements
60
+ * mark the underlying value as mutable.
61
+ *
62
+ * @return {Node} The scope of the node.
63
+ */
64
+ getScope() {
65
+
66
+ return this.node.getScope();
67
+
68
+ }
69
+
52
70
  /**
53
71
  * This method is overwritten since the node type is inferred from the array-like node.
54
72
  *
@@ -1,4 +1,4 @@
1
- import TempNode from '../core/TempNode.js';
1
+ import Node from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
3
  import { nodeProxy } from '../tsl/TSLBase.js';
4
4
  import { CubeTexture } from '../../textures/CubeTexture.js';
@@ -12,9 +12,9 @@ const _cache = new WeakMap();
12
12
  * This node can be used to automatically convert environment maps in the
13
13
  * equirectangular format into the cube map format.
14
14
  *
15
- * @augments TempNode
15
+ * @augments Node
16
16
  */
17
- class CubeMapNode extends TempNode {
17
+ class CubeMapNode extends Node {
18
18
 
19
19
  static get type() {
20
20
 
@@ -1,8 +1,8 @@
1
- import TempNode from '../core/TempNode.js';
1
+ import Node from '../core/Node.js';
2
2
  import { addMethodChaining, nodeObject } from '../tsl/TSLCore.js';
3
3
  import { log } from '../../utils.js';
4
4
 
5
- class DebugNode extends TempNode {
5
+ class DebugNode extends Node {
6
6
 
7
7
  static get type() {
8
8
 
@@ -59,6 +59,12 @@ class EventNode extends Node {
59
59
 
60
60
  }
61
61
 
62
+ isCacheable( /*builder*/ ) {
63
+
64
+ return false;
65
+
66
+ }
67
+
62
68
  setup( builder ) {
63
69
 
64
70
  const { eventType, callback } = this;
@@ -1,4 +1,4 @@
1
- import TempNode from '../core/TempNode.js';
1
+ import Node from '../core/Node.js';
2
2
  import { vectorComponents } from '../core/constants.js';
3
3
 
4
4
  /**
@@ -14,9 +14,9 @@ import { vectorComponents } from '../core/constants.js';
14
14
  * uvNode = uvNode.flipY();
15
15
  * ```
16
16
  *
17
- * @augments TempNode
17
+ * @augments Node
18
18
  */
19
- class FlipNode extends TempNode {
19
+ class FlipNode extends Node {
20
20
 
21
21
  static get type() {
22
22
 
@@ -58,6 +58,12 @@ class FunctionOverloadingNode extends Node {
58
58
 
59
59
  }
60
60
 
61
+ isCacheable( /*builder*/ ) {
62
+
63
+ return false;
64
+
65
+ }
66
+
61
67
  /**
62
68
  * This method is overwritten since the node type is inferred from
63
69
  * the function's return type.
@@ -112,7 +118,7 @@ class FunctionOverloadingNode extends Node {
112
118
  const param = params[ i ];
113
119
  const input = inputs[ i ];
114
120
 
115
- if ( param.getNodeType( builder ) === input.type ) {
121
+ if ( builder.getVectorType( param.getNodeType( builder ) ) === input.type ) {
116
122
 
117
123
  currentScore ++;
118
124
 
@@ -1,4 +1,4 @@
1
- import TempNode from '../core/TempNode.js';
1
+ import Node from '../core/Node.js';
2
2
  import { error } from '../../utils.js';
3
3
 
4
4
  /**
@@ -6,9 +6,9 @@ import { error } from '../../utils.js';
6
6
  * It represents a join operation during the shader generation process.
7
7
  * For example in can compose/join two single floats into a `vec2` type.
8
8
  *
9
- * @augments TempNode
9
+ * @augments Node
10
10
  */
11
- class JoinNode extends TempNode {
11
+ class JoinNode extends Node {
12
12
 
13
13
  static get type() {
14
14