@plastic-software/three 0.183.3 → 0.184.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/build/three.cjs +783 -290
  2. package/build/three.core.js +372 -110
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +436 -184
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +7 -1
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +2979 -1281
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +2942 -1281
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/jsm/Addons.js +11 -0
  13. package/examples/jsm/animation/CCDIKSolver.js +5 -1
  14. package/examples/jsm/controls/ArcballControls.js +4 -1
  15. package/examples/jsm/controls/DragControls.js +2 -2
  16. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  17. package/examples/jsm/controls/FlyControls.js +4 -0
  18. package/examples/jsm/controls/OrbitControls.js +2 -2
  19. package/examples/jsm/controls/TrackballControls.js +2 -2
  20. package/examples/jsm/controls/TransformControls.js +34 -2
  21. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  22. package/examples/jsm/exporters/GLTFExporter.js +21 -5
  23. package/examples/jsm/geometries/TextGeometry.js +18 -0
  24. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  25. package/examples/jsm/inspector/Extension.js +13 -0
  26. package/examples/jsm/inspector/Inspector.js +169 -114
  27. package/examples/jsm/inspector/RendererInspector.js +2 -2
  28. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  29. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  30. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  31. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  32. package/examples/jsm/inspector/tabs/Parameters.js +34 -2
  33. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  34. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  35. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  36. package/examples/jsm/inspector/tabs/Viewer.js +105 -3
  37. package/examples/jsm/inspector/ui/Graph.js +2 -2
  38. package/examples/jsm/inspector/ui/List.js +1 -1
  39. package/examples/jsm/inspector/ui/Profiler.js +273 -176
  40. package/examples/jsm/inspector/ui/Style.js +64 -10
  41. package/examples/jsm/inspector/ui/Tab.js +39 -7
  42. package/examples/jsm/inspector/ui/Values.js +39 -2
  43. package/examples/jsm/inspector/ui/utils.js +13 -0
  44. package/examples/jsm/interaction/InteractionManager.js +226 -0
  45. package/examples/jsm/libs/meshopt_decoder.module.js +8 -8
  46. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  47. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  48. package/examples/jsm/lines/LineMaterial.js +1 -1
  49. package/examples/jsm/loaders/EXRLoader.js +682 -43
  50. package/examples/jsm/loaders/FBXLoader.js +233 -33
  51. package/examples/jsm/loaders/GLTFLoader.js +24 -7
  52. package/examples/jsm/loaders/HDRLoader.js +1 -1
  53. package/examples/jsm/loaders/KTX2Loader.js +8 -2
  54. package/examples/jsm/loaders/LDrawLoader.js +39 -47
  55. package/examples/jsm/loaders/SVGLoader.js +1 -1
  56. package/examples/jsm/loaders/VTKLoader.js +5 -1
  57. package/examples/jsm/loaders/collada/ColladaComposer.js +101 -7
  58. package/examples/jsm/loaders/collada/ColladaParser.js +19 -4
  59. package/examples/jsm/loaders/usd/USDAParser.js +6 -0
  60. package/examples/jsm/loaders/usd/USDCParser.js +26 -0
  61. package/examples/jsm/loaders/usd/USDComposer.js +656 -103
  62. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  63. package/examples/jsm/misc/RollerCoaster.js +42 -4
  64. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  65. package/examples/jsm/objects/Reflector.js +73 -25
  66. package/examples/jsm/objects/Sky.js +14 -2
  67. package/examples/jsm/objects/SkyMesh.js +23 -6
  68. package/examples/jsm/renderers/Projector.js +18 -38
  69. package/examples/jsm/renderers/SVGRenderer.js +6 -25
  70. package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
  71. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  72. package/examples/jsm/tsl/display/AfterImageNode.js +10 -0
  73. package/examples/jsm/tsl/display/AnamorphicNode.js +11 -0
  74. package/examples/jsm/tsl/display/BilateralBlurNode.js +10 -0
  75. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  76. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  77. package/examples/jsm/tsl/display/GTAONode.js +2 -1
  78. package/examples/jsm/tsl/display/GaussianBlurNode.js +10 -0
  79. package/examples/jsm/tsl/display/GodraysNode.js +2 -11
  80. package/examples/jsm/tsl/display/OutlineNode.js +66 -16
  81. package/examples/jsm/tsl/display/SSGINode.js +0 -4
  82. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  83. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  84. package/examples/jsm/tsl/display/TRAANode.js +48 -7
  85. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  86. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  87. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  88. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  89. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  90. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  91. package/examples/jsm/tsl/math/Bayer.js +13 -2
  92. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  93. package/examples/jsm/utils/ColorUtils.js +76 -0
  94. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  95. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  96. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  97. package/package.json +4 -4
  98. package/src/Three.Core.js +1 -0
  99. package/src/Three.TSL.js +6 -0
  100. package/src/Three.WebGPU.Nodes.js +3 -0
  101. package/src/Three.WebGPU.js +6 -0
  102. package/src/animation/AnimationAction.js +11 -1
  103. package/src/audio/AudioContext.js +2 -2
  104. package/src/constants.js +1 -1
  105. package/src/core/BufferAttribute.js +13 -1
  106. package/src/core/Clock.js +1 -1
  107. package/src/core/Object3D.js +1 -5
  108. package/src/core/RenderTarget.js +1 -0
  109. package/src/extras/PMREMGenerator.js +1 -1
  110. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  111. package/src/loaders/AudioLoader.js +11 -1
  112. package/src/loaders/DataTextureLoader.js +6 -4
  113. package/src/loaders/FileLoader.js +1 -2
  114. package/src/loaders/ImageBitmapLoader.js +4 -6
  115. package/src/loaders/MaterialLoader.js +1 -1
  116. package/src/loaders/ObjectLoader.js +25 -4
  117. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  118. package/src/materials/MeshToonMaterial.js +1 -1
  119. package/src/materials/nodes/Line2NodeMaterial.js +27 -0
  120. package/src/materials/nodes/NodeMaterial.js +0 -27
  121. package/src/materials/nodes/manager/NodeMaterialObserver.js +188 -89
  122. package/src/math/Line3.js +3 -0
  123. package/src/math/Matrix2.js +13 -9
  124. package/src/math/Matrix3.js +13 -9
  125. package/src/math/Matrix4.js +13 -9
  126. package/src/math/Plane.js +4 -3
  127. package/src/math/Triangle.js +1 -1
  128. package/src/math/Vector2.js +11 -7
  129. package/src/math/Vector3.js +12 -8
  130. package/src/math/Vector4.js +13 -9
  131. package/src/nodes/Nodes.js +0 -1
  132. package/src/nodes/TSL.js +1 -1
  133. package/src/nodes/accessors/BufferAttributeNode.js +9 -3
  134. package/src/nodes/accessors/CubeTextureNode.js +7 -1
  135. package/src/nodes/accessors/MaterialProperties.js +2 -5
  136. package/src/nodes/accessors/Object3DNode.js +1 -1
  137. package/src/nodes/accessors/ReferenceBaseNode.js +2 -2
  138. package/src/nodes/accessors/ReferenceNode.js +4 -4
  139. package/src/nodes/accessors/SceneProperties.js +2 -8
  140. package/src/nodes/accessors/StorageBufferNode.js +10 -4
  141. package/src/nodes/accessors/StorageTextureNode.js +4 -9
  142. package/src/nodes/accessors/TextureNode.js +10 -2
  143. package/src/nodes/accessors/UniformArrayNode.js +2 -2
  144. package/src/nodes/code/FunctionCallNode.js +1 -1
  145. package/src/nodes/code/FunctionNode.js +1 -1
  146. package/src/nodes/core/ArrayNode.js +1 -1
  147. package/src/nodes/core/AssignNode.js +1 -1
  148. package/src/nodes/core/AttributeNode.js +1 -1
  149. package/src/nodes/core/BypassNode.js +1 -1
  150. package/src/nodes/core/ContextNode.js +1 -1
  151. package/src/nodes/core/IndexNode.js +2 -1
  152. package/src/nodes/core/InputNode.js +1 -1
  153. package/src/nodes/core/InspectorNode.js +1 -1
  154. package/src/nodes/core/IsolateNode.js +1 -1
  155. package/src/nodes/core/Node.js +83 -12
  156. package/src/nodes/core/NodeBuilder.js +117 -16
  157. package/src/nodes/core/NodeUtils.js +1 -1
  158. package/src/nodes/core/OutputStructNode.js +1 -1
  159. package/src/nodes/core/ParameterNode.js +1 -1
  160. package/src/nodes/core/StackNode.js +1 -1
  161. package/src/nodes/core/StructNode.js +1 -1
  162. package/src/nodes/core/StructTypeNode.js +1 -1
  163. package/src/nodes/core/SubBuildNode.js +1 -1
  164. package/src/nodes/core/UniformGroupNode.js +36 -6
  165. package/src/nodes/core/VarNode.js +1 -1
  166. package/src/nodes/core/VaryingNode.js +1 -1
  167. package/src/nodes/display/NormalMapNode.js +2 -2
  168. package/src/nodes/display/PassNode.js +27 -7
  169. package/src/nodes/display/RenderOutputNode.js +4 -4
  170. package/src/nodes/display/ScreenNode.js +1 -1
  171. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  172. package/src/nodes/display/ViewportTextureNode.js +18 -7
  173. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  174. package/src/nodes/geometry/RangeNode.js +1 -1
  175. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  176. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  177. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  178. package/src/nodes/gpgpu/ComputeNode.js +69 -44
  179. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  180. package/src/nodes/lighting/LightsNode.js +6 -27
  181. package/src/nodes/lighting/ShadowNode.js +24 -2
  182. package/src/nodes/math/BitcastNode.js +1 -1
  183. package/src/nodes/math/ConditionalNode.js +1 -1
  184. package/src/nodes/math/MathNode.js +73 -1
  185. package/src/nodes/math/OperatorNode.js +1 -1
  186. package/src/nodes/math/PackFloatNode.js +1 -1
  187. package/src/nodes/math/UnpackFloatNode.js +1 -1
  188. package/src/nodes/tsl/TSLBase.js +1 -1
  189. package/src/nodes/tsl/TSLCore.js +21 -3
  190. package/src/nodes/utils/ArrayElementNode.js +1 -1
  191. package/src/nodes/utils/ConvertNode.js +1 -1
  192. package/src/nodes/utils/DebugNode.js +1 -1
  193. package/src/nodes/utils/EventNode.js +30 -0
  194. package/src/nodes/utils/FlipNode.js +1 -1
  195. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  196. package/src/nodes/utils/JoinNode.js +1 -1
  197. package/src/nodes/utils/MemberNode.js +1 -1
  198. package/src/nodes/utils/Remap.js +48 -0
  199. package/src/nodes/utils/RotateNode.js +1 -1
  200. package/src/nodes/utils/SetNode.js +1 -1
  201. package/src/nodes/utils/SplitNode.js +1 -1
  202. package/src/objects/BatchedMesh.js +17 -2
  203. package/src/objects/InstancedMesh.js +19 -3
  204. package/src/objects/SkinnedMesh.js +26 -9
  205. package/src/renderers/WebGLRenderer.js +148 -49
  206. package/src/renderers/common/Animation.js +3 -3
  207. package/src/renderers/common/Attributes.js +15 -1
  208. package/src/renderers/common/Backend.js +0 -8
  209. package/src/renderers/common/Background.js +2 -2
  210. package/src/renderers/common/BindGroup.js +1 -8
  211. package/src/renderers/common/Bindings.js +2 -2
  212. package/src/renderers/common/ComputePipeline.js +1 -1
  213. package/src/renderers/common/CubeRenderTarget.js +1 -1
  214. package/src/renderers/common/Info.js +333 -4
  215. package/src/renderers/common/InspectorBase.js +6 -1
  216. package/src/renderers/common/Pipelines.js +36 -3
  217. package/src/renderers/common/ReadbackBuffer.js +78 -0
  218. package/src/renderers/common/RenderBundle.js +3 -1
  219. package/src/renderers/common/RenderBundles.js +5 -2
  220. package/src/renderers/common/RenderObject.js +2 -2
  221. package/src/renderers/common/RenderObjects.js +3 -3
  222. package/src/renderers/common/RenderPipeline.js +35 -6
  223. package/src/renderers/common/Renderer.js +232 -53
  224. package/src/renderers/common/Textures.js +72 -3
  225. package/src/renderers/common/UniformsGroup.js +1 -1
  226. package/src/renderers/common/XRManager.js +34 -27
  227. package/src/renderers/common/extras/PMREMGenerator.js +23 -15
  228. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  229. package/src/renderers/common/nodes/NodeManager.js +230 -99
  230. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +20 -0
  231. package/src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl.js +9 -1
  232. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  233. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  234. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  235. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +8 -0
  236. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  237. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -3
  238. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  239. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  240. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  241. package/src/renderers/shaders/ShaderChunk.js +2 -0
  242. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  243. package/src/renderers/shaders/ShaderLib.js +0 -1
  244. package/src/renderers/shaders/UniformsLib.js +7 -2
  245. package/src/renderers/shaders/UniformsUtils.js +27 -5
  246. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  247. package/src/renderers/webgl/WebGLBackground.js +13 -13
  248. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  249. package/src/renderers/webgl/WebGLCapabilities.js +6 -0
  250. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  251. package/src/renderers/webgl/WebGLMaterials.js +12 -13
  252. package/src/renderers/webgl/WebGLOutput.js +4 -1
  253. package/src/renderers/webgl/WebGLProgram.js +5 -0
  254. package/src/renderers/webgl/WebGLPrograms.js +24 -3
  255. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  256. package/src/renderers/webgl/WebGLState.js +43 -0
  257. package/src/renderers/webgl/WebGLTextures.js +129 -26
  258. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  259. package/src/renderers/webgl-fallback/WebGLBackend.js +106 -65
  260. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  261. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +29 -51
  262. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  263. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  264. package/src/renderers/webgl-fallback/utils/WebGLState.js +42 -1
  265. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +63 -50
  266. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +1 -1
  267. package/src/renderers/webgpu/WebGPUBackend.js +160 -146
  268. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +55 -33
  269. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +103 -17
  270. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  271. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  272. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -0
  273. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +91 -17
  274. package/src/renderers/webgpu/utils/WebGPUUtils.js +18 -2
  275. package/src/renderers/webxr/WebXRController.js +12 -0
  276. package/src/textures/HTMLTexture.js +74 -0
  277. package/src/textures/Source.js +1 -1
  278. package/src/textures/Texture.js +13 -2
  279. package/src/utils.js +23 -1
  280. package/src/nodes/utils/RemapNode.js +0 -125
@@ -0,0 +1,605 @@
1
+ import {
2
+ GLSL3,
3
+ UniformsGroup,
4
+ Compatibility,
5
+ Color,
6
+ UniformsLib,
7
+ UniformsUtils,
8
+ } from 'three';
9
+ import {
10
+ context,
11
+ cubeTexture,
12
+ reference,
13
+ texture,
14
+ fog,
15
+ rangeFogFactor,
16
+ densityFogFactor,
17
+ workingToColorSpace,
18
+ } from 'three/tsl';
19
+ import {
20
+ NodeUtils,
21
+ NodeFrame,
22
+ Lighting,
23
+ InspectorBase,
24
+ GLSLNodeBuilder,
25
+ BasicNodeLibrary,
26
+ WebGLCapabilities,
27
+ } from 'three/webgpu';
28
+
29
+ // Limitations
30
+ // - VSM shadows not supported
31
+ // - MRT not supported
32
+ // - Transmission not supported
33
+ // - WebGPU postprocessing stack not supported
34
+ // - Storage textures not supported
35
+ // - Fog / environment do not automatically update - must call "dispose"
36
+ // - instanced mesh geometry cannot be shared
37
+ // - Node materials cannot be used with "compile" function
38
+
39
+ // hash any object parameters that will impact the resulting shader so we can force
40
+ // a program update
41
+ function getObjectHash( object ) {
42
+
43
+ return '' + object.receiveShadow;
44
+
45
+ }
46
+
47
+ // Mirrors WebGLUniforms.seqWithValue from WebGLRenderer
48
+ function generateUniformsList( program, uniforms ) {
49
+
50
+ const progUniforms = program.getUniforms();
51
+ const uniformsList = [];
52
+
53
+ for ( let i = 0; i < progUniforms.seq.length; i ++ ) {
54
+
55
+ const u = progUniforms.seq[ i ];
56
+ if ( u.id in uniforms ) uniformsList.push( u );
57
+
58
+ }
59
+
60
+ return uniformsList;
61
+
62
+ }
63
+
64
+ // overrides shadow nodes to use the built in shadow textures
65
+ class WebGLNodeBuilder extends GLSLNodeBuilder {
66
+
67
+ addNode( node ) {
68
+
69
+ if ( node.isShadowNode ) {
70
+
71
+ node.setupRenderTarget = shadow => {
72
+
73
+ return { shadowMap: shadow.map, depthTexture: shadow.map.depthTexture };
74
+
75
+ };
76
+
77
+ node.updateBefore = () => {
78
+
79
+ // no need to rerender shadows since WebGLRenderer is handling it
80
+
81
+ };
82
+
83
+ }
84
+
85
+ super.addNode( node );
86
+
87
+ }
88
+
89
+ }
90
+
91
+ // produce and update reusable nodes for a scene
92
+ class SceneContext {
93
+
94
+ constructor( renderer, scene ) {
95
+
96
+ // TODO: can / should we update the fog and environment node every frame for recompile?
97
+ this.renderer = renderer;
98
+ this.scene = scene;
99
+ this.lightsNode = renderer.lighting.getNode( scene );
100
+ this.fogNode = null;
101
+ this.environmentNode = null;
102
+ this.prevFog = null;
103
+ this.prevEnvironment = null;
104
+
105
+ }
106
+
107
+ getCacheKey() {
108
+
109
+ const { lightsNode, environmentNode, fogNode } = this;
110
+ const lightsHash = lightsNode.getCacheKey();
111
+ const envHash = environmentNode ? environmentNode.getCacheKey : 0;
112
+ const fogHash = fogNode ? fogNode.getCacheKey() : 0;
113
+ return NodeUtils.hashArray( [ lightsHash, envHash, fogHash ] );
114
+
115
+ }
116
+
117
+ update() {
118
+
119
+ const { scene, lightsNode } = this;
120
+
121
+ // update lighting
122
+ const sceneLights = [];
123
+ scene.traverse( object => {
124
+
125
+ if ( object.isLight ) {
126
+
127
+ sceneLights.push( object );
128
+
129
+ }
130
+
131
+ } );
132
+
133
+ lightsNode.setLights( sceneLights );
134
+
135
+ // update fog
136
+ if ( this.prevFog !== scene.fog ) {
137
+
138
+ this.fogNode = this.getFogNode();
139
+ this.prevFog = scene.fog;
140
+
141
+ }
142
+
143
+ // update environment
144
+ if ( this.prevEnvironment !== scene.environment ) {
145
+
146
+ this.environmentNode = this.getEnvironmentNode();
147
+ this.prevEnvironment = scene.environment;
148
+
149
+ }
150
+
151
+ }
152
+
153
+ getFogNode() {
154
+
155
+ const { scene } = this;
156
+ if ( scene.fog && scene.fog.isFogExp2 ) {
157
+
158
+ const color = reference( 'color', 'color', scene.fog );
159
+ const density = reference( 'density', 'float', scene.fog );
160
+ return fog( color, densityFogFactor( density ) );
161
+
162
+ } else if ( scene.fog && scene.fog.isFog ) {
163
+
164
+ const color = reference( 'color', 'color', scene.fog );
165
+ const near = reference( 'near', 'float', scene.fog );
166
+ const far = reference( 'far', 'float', scene.fog );
167
+ return fog( color, rangeFogFactor( near, far ) );
168
+
169
+ } else {
170
+
171
+ return null;
172
+
173
+ }
174
+
175
+ }
176
+
177
+ getEnvironmentNode() {
178
+
179
+ const { scene } = this;
180
+ if ( scene.environment && scene.environment.isCubeTexture ) {
181
+
182
+ return cubeTexture( scene.environment );
183
+
184
+ } else if ( scene.environment && scene.environment.isTexture ) {
185
+
186
+ return texture( scene.environment );
187
+
188
+ } else {
189
+
190
+ return null;
191
+
192
+ }
193
+
194
+ }
195
+
196
+ }
197
+
198
+ class RendererProxy {
199
+
200
+ constructor( renderer ) {
201
+
202
+ const backend = {
203
+ isWebGPUBackend: false,
204
+ extensions: renderer.extensions,
205
+ gl: renderer.getContext(),
206
+ capabilities: null,
207
+ };
208
+
209
+ backend.capabilities = new WebGLCapabilities( backend );
210
+
211
+ this.contextNode = context();
212
+ this.inspector = new InspectorBase();
213
+ this.library = new BasicNodeLibrary();
214
+ this.lighting = new Lighting();
215
+ this.backend = backend;
216
+
217
+ const self = this;
218
+ return new Proxy( renderer, {
219
+
220
+ get( target, property ) {
221
+
222
+ return Reflect.get( property in self ? self : target, property );
223
+
224
+ },
225
+
226
+ set( target, property, value ) {
227
+
228
+ return Reflect.set( property in self ? self : target, property, value );
229
+
230
+ }
231
+
232
+ } );
233
+
234
+ }
235
+
236
+ hasInitialized() {
237
+
238
+ return true;
239
+
240
+ }
241
+
242
+ getMRT() {
243
+
244
+ return null;
245
+
246
+ }
247
+
248
+ hasCompatibility( name ) {
249
+
250
+ if ( name === Compatibility.TEXTURE_COMPARE ) {
251
+
252
+ return true;
253
+
254
+ }
255
+
256
+ return false;
257
+
258
+ }
259
+
260
+ getCacheKey() {
261
+
262
+ return this.toneMapping + this.outputColorSpace;
263
+
264
+ }
265
+
266
+ }
267
+
268
+ /**
269
+ * Compatibility loader and builder for TSL Node materials in WebGLRenderer.
270
+ */
271
+ export class WebGLNodesHandler {
272
+
273
+ /**
274
+ * Constructs a new WebGL node adapter.
275
+ */
276
+ constructor() {
277
+
278
+ this.renderer = null;
279
+ this.nodeFrame = new NodeFrame();
280
+ this.sceneContexts = new WeakMap();
281
+ this.programCache = new Map();
282
+ this.renderStack = [];
283
+
284
+ const self = this;
285
+ this.onDisposeMaterialCallback = function () {
286
+
287
+ // dispose of all the uniform groups
288
+ const { programCache } = self;
289
+ if ( programCache.has( this ) ) {
290
+
291
+ self.programCache.get( this ).forEach( ( { uniformsGroups } ) => {
292
+
293
+ uniformsGroups.forEach( u => u.dispose() );
294
+
295
+ } );
296
+
297
+ self.programCache.delete( this );
298
+
299
+ }
300
+
301
+ this.removeEventListener( 'dispose', self.onDisposeMaterialCallback );
302
+
303
+ };
304
+
305
+ this.getOutputCallback = function ( outputNode ) {
306
+
307
+ // apply tone mapping and color spaces to the output
308
+ const { outputColorSpace, toneMapping } = self.renderer;
309
+ outputNode = outputNode.toneMapping( toneMapping );
310
+ outputNode = workingToColorSpace( outputNode, outputColorSpace );
311
+
312
+ return outputNode;
313
+
314
+ };
315
+
316
+ this.onBeforeRenderCallback = function ( renderer, scene, camera, geometry, object ) {
317
+
318
+ // update node frame references for update nodes
319
+ const { nodeFrame } = self;
320
+ nodeFrame.material = this;
321
+ nodeFrame.object = object;
322
+
323
+ // increment "frame" here to force uniform buffers to update for the material, which otherwise only get
324
+ // updated once per frame.
325
+ renderer.info.render.frame ++;
326
+
327
+ // update the uniform groups and nodes for the program if they're available before rendering
328
+ if ( renderer.properties.has( this ) ) {
329
+
330
+ const currentProgram = renderer.properties.get( this ).currentProgram;
331
+ const programs = self.programCache.get( this );
332
+ if ( programs && programs.has( currentProgram ) ) {
333
+
334
+ // update the nodes for the current object
335
+ const { updateNodes } = programs.get( currentProgram );
336
+ self.updateNodes( updateNodes );
337
+
338
+ }
339
+
340
+ }
341
+
342
+ const objectHash = getObjectHash( object );
343
+ if ( this.prevObjectHash !== objectHash ) {
344
+
345
+ this.prevObjectHash = objectHash;
346
+ this.needsUpdate = true;
347
+
348
+ }
349
+
350
+ };
351
+
352
+ this.customProgramCacheKeyCallback = function () {
353
+
354
+ const { renderStack, renderer, nodeFrame } = self;
355
+ const sceneHash = renderStack[ renderStack.length - 1 ].sceneContext.getCacheKey();
356
+ const materialHash = this.constructor.prototype.customProgramCacheKey.call( this );
357
+ const rendererHash = renderer.getCacheKey();
358
+
359
+ return materialHash + sceneHash + rendererHash + getObjectHash( nodeFrame.object );
360
+
361
+ };
362
+
363
+ }
364
+
365
+ setRenderer( renderer ) {
366
+
367
+ const rendererProxy = new RendererProxy( renderer );
368
+ this.nodeFrame.renderer = rendererProxy;
369
+ this.renderer = rendererProxy;
370
+
371
+ }
372
+
373
+ onUpdateProgram( material, program, materialProperties ) {
374
+
375
+ const { programCache } = this;
376
+ if ( ! programCache.has( material ) ) {
377
+
378
+ programCache.set( material, new Map() );
379
+
380
+ }
381
+
382
+ const programs = programCache.get( material );
383
+ if ( ! programs.has( program ) ) {
384
+
385
+ const builder = material._latestBuilder;
386
+ const uniforms = materialProperties.uniforms;
387
+ programs.set( program, {
388
+ uniformsGroups: this.collectUniformsGroups( builder ),
389
+ uniforms: uniforms,
390
+ uniformsList: generateUniformsList( program, uniforms ),
391
+ updateNodes: builder.updateNodes,
392
+ } );
393
+
394
+ }
395
+
396
+ const { uniformsGroups, uniforms, uniformsList, updateNodes } = programs.get( program );
397
+ material.uniformsGroups = uniformsGroups;
398
+ materialProperties.uniforms = uniforms;
399
+ materialProperties.uniformsList = uniformsList;
400
+ this.updateNodes( updateNodes );
401
+
402
+ }
403
+
404
+
405
+ renderStart( scene, camera ) {
406
+
407
+ const { nodeFrame, renderStack, renderer, sceneContexts } = this;
408
+ nodeFrame.update();
409
+ nodeFrame.camera = camera;
410
+ nodeFrame.scene = scene;
411
+ nodeFrame.frameId ++;
412
+
413
+ let sceneContext = sceneContexts.get( scene );
414
+ if ( ! sceneContext ) {
415
+
416
+ sceneContext = new SceneContext( renderer, scene );
417
+ sceneContexts.set( scene, sceneContext );
418
+
419
+ }
420
+
421
+ sceneContext.update();
422
+ renderStack.push( { sceneContext, camera } );
423
+
424
+ // ensure all node material callbacks are initialized before
425
+ // traversal and build
426
+ const {
427
+ customProgramCacheKeyCallback,
428
+ onBeforeRenderCallback,
429
+ } = this;
430
+
431
+ scene.traverse( object => {
432
+
433
+ if ( object.material && object.material.isNodeMaterial ) {
434
+
435
+ object.material.customProgramCacheKey = customProgramCacheKeyCallback;
436
+ object.material.onBeforeRender = onBeforeRenderCallback;
437
+
438
+ }
439
+
440
+ } );
441
+
442
+ }
443
+
444
+ renderEnd() {
445
+
446
+ const { nodeFrame, renderStack } = this;
447
+
448
+ renderStack.pop();
449
+
450
+ const frame = renderStack[ renderStack.length - 1 ];
451
+ if ( frame ) {
452
+
453
+ const { camera, sceneContext } = frame;
454
+ nodeFrame.camera = camera;
455
+ nodeFrame.scene = sceneContext.scene;
456
+
457
+ }
458
+
459
+ }
460
+
461
+ build( material, object, parameters ) {
462
+
463
+ const {
464
+ nodeFrame,
465
+ renderer,
466
+ getOutputCallback,
467
+ onDisposeMaterialCallback,
468
+ renderStack,
469
+ } = this;
470
+
471
+ const {
472
+ camera,
473
+ sceneContext,
474
+ } = renderStack[ renderStack.length - 1 ];
475
+
476
+ const {
477
+ fogNode,
478
+ environmentNode,
479
+ lightsNode,
480
+ scene,
481
+ } = sceneContext;
482
+
483
+ // prepare the frame
484
+ nodeFrame.material = material;
485
+ nodeFrame.object = object;
486
+
487
+ // create & run the builder
488
+ const builder = new WebGLNodeBuilder( object, renderer );
489
+ builder.scene = scene;
490
+ builder.camera = camera;
491
+ builder.material = material;
492
+ builder.fogNode = fogNode;
493
+ builder.environmentNode = environmentNode;
494
+ builder.lightsNode = lightsNode;
495
+ builder.context.getOutput = getOutputCallback;
496
+ builder.build();
497
+
498
+ // update the shader parameters and geometry for program creation and rendering
499
+ this.updateShaderParameters( builder, parameters );
500
+ this.updateGeometryAttributes( builder, object.geometry );
501
+
502
+ // reset node frame settings to account for any intermediate renders
503
+ nodeFrame.material = material;
504
+ nodeFrame.object = object;
505
+
506
+ // set up callbacks for uniforms and node updates
507
+ material._latestBuilder = builder;
508
+ material.addEventListener( 'dispose', onDisposeMaterialCallback );
509
+ this.updateNodes( builder.updateNodes );
510
+
511
+ }
512
+
513
+ updateGeometryAttributes( builder, geometry ) {
514
+
515
+ // TODO: this may cause issues if the material / geometry is used in multiple places
516
+
517
+ // add instancing attributes
518
+ builder.bufferAttributes.forEach( v => {
519
+
520
+ geometry.setAttribute( v.name, v.node.attribute );
521
+
522
+ } );
523
+
524
+ // force WebGLAttributes & WebGLBindingStates to refresh
525
+ // could be fixed by running "build" sooner? Or calling "WebGLAttributes" separately for those
526
+ // associated with a material?
527
+ queueMicrotask( () => geometry.dispose() );
528
+
529
+ }
530
+
531
+ updateShaderParameters( builder, parameters ) {
532
+
533
+ // set up shaders
534
+ parameters.isRawShaderMaterial = true;
535
+ parameters.glslVersion = GLSL3;
536
+ parameters.vertexShader = builder.vertexShader.replace( /#version 300 es/, '' );
537
+ parameters.fragmentShader = builder.fragmentShader.replace( /#version 300 es/, '' );
538
+
539
+ // add uniforms accessed by WebGLRenderer
540
+ parameters.uniforms = {
541
+ fogColor: { value: new Color() },
542
+ fogNear: { value: 0 },
543
+ fogFar: { value: 0 },
544
+ envMapIntensity: { value: 0 },
545
+ ...UniformsUtils.clone( UniformsLib.lights )
546
+ };
547
+
548
+ // init uniforms
549
+ const builderUniforms = [ ...builder.uniforms.vertex, ...builder.uniforms.fragment ];
550
+ for ( const uniform of builderUniforms ) {
551
+
552
+ parameters.uniforms[ uniform.name ] = uniform.node;
553
+
554
+ }
555
+
556
+ }
557
+
558
+ collectUniformsGroups( builder ) {
559
+
560
+ // create UniformsGroups for regular grouped uniforms
561
+ const uniformsGroups = [];
562
+ for ( const key in builder.uniformGroups ) {
563
+
564
+ const { uniforms } = builder.uniformGroups[ key ];
565
+ const group = new UniformsGroup();
566
+ group.name = key;
567
+ group.uniforms = uniforms.map( node => node.nodeUniform );
568
+ uniformsGroups.push( group );
569
+
570
+ }
571
+
572
+ // init uniforms
573
+ const builderUniforms = [ ...builder.uniforms.vertex, ...builder.uniforms.fragment ];
574
+ for ( const uniform of builderUniforms ) {
575
+
576
+ if ( uniform.type === 'buffer' ) {
577
+
578
+ // buffer uniforms are all nested in groups
579
+ const group = new UniformsGroup();
580
+ group.name = uniform.node.name;
581
+ group.uniforms = [ uniform ];
582
+ uniformsGroups.push( group );
583
+
584
+ }
585
+
586
+ }
587
+
588
+ return uniformsGroups;
589
+
590
+ }
591
+
592
+ updateNodes( updateNodes ) {
593
+
594
+ // update nodes for render
595
+ const { nodeFrame } = this;
596
+ nodeFrame.renderId ++;
597
+ for ( const node of updateNodes ) {
598
+
599
+ nodeFrame.updateNode( node );
600
+
601
+ }
602
+
603
+ }
604
+
605
+ }
@@ -80,6 +80,14 @@ class AfterImageNode extends TempNode {
80
80
  */
81
81
  this._textureNodeOld = texture( this._oldRT.texture );
82
82
 
83
+ /**
84
+ * The material for the composite pass.
85
+ *
86
+ * @private
87
+ * @type {?NodeMaterial}
88
+ */
89
+ this._materialComposed = null;
90
+
83
91
  /**
84
92
  * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
85
93
  * its effect once per frame in `updateBefore()`.
@@ -226,6 +234,8 @@ class AfterImageNode extends TempNode {
226
234
  this._compRT.dispose();
227
235
  this._oldRT.dispose();
228
236
 
237
+ if ( this._materialComposed !== null ) this._materialComposed.dispose();
238
+
229
239
  }
230
240
 
231
241
  }
@@ -98,6 +98,15 @@ class AnamorphicNode extends TempNode {
98
98
  */
99
99
  this._textureNode = passTexture( this, this._renderTarget.texture );
100
100
 
101
+ /**
102
+ * The material for the anamorphic pass.
103
+ *
104
+ * @private
105
+ * @type {?NodeMaterial}
106
+ */
107
+ this._material = null;
108
+
109
+
101
110
  /**
102
111
  * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
103
112
  * its effect once per frame in `updateBefore()`.
@@ -239,6 +248,8 @@ class AnamorphicNode extends TempNode {
239
248
 
240
249
  this._renderTarget.dispose();
241
250
 
251
+ if ( this._material !== null ) this._material.dispose();
252
+
242
253
  }
243
254
 
244
255
  /**
@@ -112,6 +112,14 @@ class BilateralBlurNode extends TempNode {
112
112
  this._textureNode = passTexture( this, this._verticalRT.texture );
113
113
  this._textureNode.uvNode = textureNode.uvNode;
114
114
 
115
+ /**
116
+ * The material for the blur pass.
117
+ *
118
+ * @private
119
+ * @type {?NodeMaterial}
120
+ */
121
+ this._material = null;
122
+
115
123
  /**
116
124
  * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
117
125
  * its effect once per frame in `updateBefore()`.
@@ -318,6 +326,8 @@ class BilateralBlurNode extends TempNode {
318
326
  this._horizontalRT.dispose();
319
327
  this._verticalRT.dispose();
320
328
 
329
+ if ( this._material !== null ) this._material.dispose();
330
+
321
331
  }
322
332
 
323
333
  /**