super-three 0.158.0 → 0.160.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 (191) hide show
  1. package/build/three.cjs +1719 -379
  2. package/build/three.js +1719 -379
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +1718 -380
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/Addons.js +2 -1
  7. package/examples/jsm/controls/OrbitControls.js +50 -40
  8. package/examples/jsm/csm/CSMShader.js +52 -47
  9. package/examples/jsm/exporters/GLTFExporter.js +79 -1
  10. package/examples/jsm/exporters/USDZExporter.js +27 -19
  11. package/examples/jsm/helpers/TextureHelper.js +237 -0
  12. package/examples/jsm/interactive/HTMLMesh.js +9 -2
  13. package/examples/jsm/lines/LineMaterial.js +16 -33
  14. package/examples/jsm/loaders/ColladaLoader.js +0 -6
  15. package/examples/jsm/loaders/DRACOLoader.js +4 -3
  16. package/examples/jsm/loaders/FBXLoader.js +294 -124
  17. package/examples/jsm/loaders/GLTFLoader.js +71 -3
  18. package/examples/jsm/loaders/MaterialXLoader.js +73 -54
  19. package/examples/jsm/loaders/NRRDLoader.js +0 -13
  20. package/examples/jsm/loaders/SVGLoader.js +4 -4
  21. package/examples/jsm/loaders/USDZLoader.js +3 -17
  22. package/examples/jsm/math/Octree.js +15 -4
  23. package/examples/jsm/misc/Timer.js +119 -0
  24. package/examples/jsm/misc/TubePainter.js +3 -6
  25. package/examples/jsm/modifiers/CurveModifier.js +20 -2
  26. package/examples/jsm/nodes/Nodes.js +11 -7
  27. package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
  28. package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
  29. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
  30. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  31. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
  32. package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
  33. package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
  34. package/examples/jsm/nodes/accessors/TextureNode.js +122 -36
  35. package/examples/jsm/nodes/code/CodeNode.js +3 -3
  36. package/examples/jsm/nodes/core/AttributeNode.js +7 -1
  37. package/examples/jsm/nodes/core/CacheNode.js +4 -1
  38. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  39. package/examples/jsm/nodes/core/Node.js +6 -3
  40. package/examples/jsm/nodes/core/NodeBuilder.js +84 -27
  41. package/examples/jsm/nodes/core/NodeFrame.js +10 -8
  42. package/examples/jsm/nodes/core/NodeUniform.js +12 -0
  43. package/examples/jsm/nodes/core/NodeUtils.js +3 -7
  44. package/examples/jsm/nodes/core/OutputStructNode.js +3 -3
  45. package/examples/jsm/nodes/core/PropertyNode.js +17 -2
  46. package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
  47. package/examples/jsm/nodes/core/UniformGroup.js +13 -0
  48. package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
  49. package/examples/jsm/nodes/core/UniformNode.js +17 -0
  50. package/examples/jsm/nodes/core/VarNode.js +2 -0
  51. package/examples/jsm/nodes/core/VaryingNode.js +1 -7
  52. package/examples/jsm/nodes/display/BumpMapNode.js +1 -1
  53. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
  54. package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
  55. package/examples/jsm/nodes/display/PassNode.js +182 -0
  56. package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
  57. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
  58. package/examples/jsm/nodes/display/ViewportNode.js +5 -8
  59. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +1 -1
  60. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +52 -17
  61. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -12
  62. package/examples/jsm/nodes/lighting/LightsNode.js +34 -32
  63. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +1 -1
  64. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +12 -12
  65. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
  66. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +1 -1
  67. package/examples/jsm/nodes/materials/NodeMaterial.js +66 -41
  68. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
  69. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  70. package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
  71. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
  72. package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
  73. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
  74. package/examples/jsm/nodes/math/MathNode.js +2 -0
  75. package/examples/jsm/nodes/math/OperatorNode.js +19 -6
  76. package/examples/jsm/nodes/shadernode/ShaderNode.js +32 -3
  77. package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
  78. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  79. package/examples/jsm/nodes/utils/SplitNode.js +8 -2
  80. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
  81. package/examples/jsm/objects/QuadMesh.js +60 -0
  82. package/examples/jsm/postprocessing/GTAOPass.js +572 -0
  83. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  84. package/examples/jsm/renderers/common/Animation.js +10 -21
  85. package/examples/jsm/renderers/common/Backend.js +19 -3
  86. package/examples/jsm/renderers/common/Background.js +20 -22
  87. package/examples/jsm/renderers/common/Bindings.js +30 -21
  88. package/examples/jsm/renderers/common/ChainMap.js +3 -3
  89. package/examples/jsm/renderers/common/Color4.js +37 -0
  90. package/examples/jsm/renderers/common/Geometries.js +4 -4
  91. package/examples/jsm/renderers/common/Info.js +12 -2
  92. package/examples/jsm/renderers/common/Pipelines.js +3 -51
  93. package/examples/jsm/renderers/common/PostProcessing.js +25 -0
  94. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  95. package/examples/jsm/renderers/common/RenderContexts.js +1 -1
  96. package/examples/jsm/renderers/common/RenderObject.js +13 -1
  97. package/examples/jsm/renderers/common/RenderObjects.js +4 -2
  98. package/examples/jsm/renderers/common/Renderer.js +137 -37
  99. package/examples/jsm/renderers/common/StorageTexture.js +1 -0
  100. package/examples/jsm/renderers/common/Textures.js +4 -1
  101. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
  102. package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
  103. package/examples/jsm/renderers/common/nodes/Nodes.js +74 -7
  104. package/examples/jsm/renderers/webgl/WebGLBackend.js +91 -33
  105. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +100 -31
  106. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +57 -5
  107. package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
  108. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
  109. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
  110. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
  111. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
  112. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
  113. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
  114. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +186 -137
  115. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
  116. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +209 -90
  117. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
  118. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
  119. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
  120. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
  121. package/examples/jsm/shaders/FXAAShader.js +133 -133
  122. package/examples/jsm/shaders/GTAOShader.js +424 -0
  123. package/examples/jsm/shaders/OutputShader.js +4 -0
  124. package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
  125. package/examples/jsm/shaders/SAOShader.js +2 -3
  126. package/examples/jsm/shaders/SSAOShader.js +2 -3
  127. package/examples/jsm/transpiler/AST.js +40 -1
  128. package/examples/jsm/transpiler/GLSLDecoder.js +50 -8
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +4 -4
  130. package/examples/jsm/transpiler/TSLEncoder.js +124 -20
  131. package/examples/jsm/utils/SortUtils.js +158 -0
  132. package/examples/jsm/utils/TextureUtils.js +33 -21
  133. package/examples/jsm/webxr/ARButton.js +14 -0
  134. package/examples/jsm/webxr/VRButton.js +23 -8
  135. package/examples/jsm/webxr/XRButton.js +25 -11
  136. package/package.json +5 -6
  137. package/src/Three.js +1 -0
  138. package/src/constants.js +2 -1
  139. package/src/core/BufferAttribute.js +21 -2
  140. package/src/core/InterleavedBuffer.js +21 -1
  141. package/src/core/Object3D.js +60 -12
  142. package/src/core/UniformsGroup.js +7 -1
  143. package/src/extras/curves/LineCurve3.js +4 -0
  144. package/src/loaders/AudioLoader.js +1 -1
  145. package/src/loaders/BufferGeometryLoader.js +0 -7
  146. package/src/loaders/ImageBitmapLoader.js +25 -1
  147. package/src/loaders/ObjectLoader.js +49 -0
  148. package/src/materials/ShaderMaterial.js +2 -1
  149. package/src/math/ColorManagement.js +0 -16
  150. package/src/math/Quaternion.js +5 -4
  151. package/src/math/Sphere.js +2 -0
  152. package/src/math/Triangle.js +17 -5
  153. package/src/objects/BatchedMesh.js +1020 -0
  154. package/src/objects/Skeleton.js +1 -3
  155. package/src/renderers/WebGL3DRenderTarget.js +2 -2
  156. package/src/renderers/WebGLArrayRenderTarget.js +2 -2
  157. package/src/renderers/WebGLRenderer.js +23 -18
  158. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
  159. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
  160. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
  161. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
  162. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
  163. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
  164. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
  165. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
  166. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
  167. package/src/renderers/shaders/ShaderChunk.js +4 -0
  168. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  169. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  170. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
  171. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
  172. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
  173. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
  174. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
  175. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -0
  176. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
  177. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
  178. package/src/renderers/webgl/WebGLAttributes.js +39 -5
  179. package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
  180. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  181. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  182. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
  183. package/src/renderers/webgl/WebGLLights.js +11 -2
  184. package/src/renderers/webgl/WebGLProgram.js +20 -1
  185. package/src/renderers/webgl/WebGLPrograms.js +5 -0
  186. package/src/renderers/webgl/WebGLShadowMap.js +35 -0
  187. package/src/renderers/webgl/WebGLTextures.js +7 -11
  188. package/src/renderers/webgl/WebGLUniforms.js +11 -1
  189. package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
  190. package/src/renderers/webxr/WebXRManager.js +16 -0
  191. package/examples/jsm/objects/BatchedMesh.js +0 -586
@@ -10,7 +10,8 @@ import RenderContexts from './RenderContexts.js';
10
10
  import Textures from './Textures.js';
11
11
  import Background from './Background.js';
12
12
  import Nodes from './nodes/Nodes.js';
13
- import { Scene, Frustum, Matrix4, Vector2, Vector3, Vector4, Color, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
13
+ import Color4 from './Color4.js';
14
+ import { Scene, Frustum, Matrix4, Vector2, Vector3, Vector4, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
14
15
 
15
16
  const _scene = new Scene();
16
17
  const _drawingBufferSize = new Vector2();
@@ -21,10 +22,16 @@ const _vector3 = new Vector3();
21
22
 
22
23
  class Renderer {
23
24
 
24
- constructor( backend ) {
25
+ constructor( backend, parameters = {} ) {
25
26
 
26
27
  this.isRenderer = true;
27
28
 
29
+ //
30
+
31
+ const {
32
+ logarithmicDepthBuffer = false,
33
+ } = parameters;
34
+
28
35
  // public
29
36
 
30
37
  this.domElement = backend.getDomElement();
@@ -36,6 +43,8 @@ class Renderer {
36
43
  this.autoClearDepth = true;
37
44
  this.autoClearStencil = true;
38
45
 
46
+ this.logarithmicDepthBuffer = logarithmicDepthBuffer;
47
+
39
48
  this.outputColorSpace = SRGBColorSpace;
40
49
 
41
50
  this.toneMapping = NoToneMapping;
@@ -62,6 +71,7 @@ class Renderer {
62
71
  this._attributes = null;
63
72
  this._geometries = null;
64
73
  this._nodes = null;
74
+ this._animation = null;
65
75
  this._bindings = null;
66
76
  this._objects = null;
67
77
  this._pipelines = null;
@@ -70,16 +80,12 @@ class Renderer {
70
80
  this._textures = null;
71
81
  this._background = null;
72
82
 
73
- this._animation = new Animation();
74
-
75
83
  this._currentRenderContext = null;
76
- this._lastRenderContext = null;
77
84
 
78
85
  this._opaqueSort = null;
79
86
  this._transparentSort = null;
80
87
 
81
- this._clearAlpha = 1;
82
- this._clearColor = new Color( 0x000000 );
88
+ this._clearColor = new Color4( 0x000000 );
83
89
  this._clearDepth = 1;
84
90
  this._clearStencil = 0;
85
91
 
@@ -87,6 +93,9 @@ class Renderer {
87
93
  this._activeCubeFace = 0;
88
94
  this._activeMipmapLevel = 0;
89
95
 
96
+ this._renderObjectFunction = null;
97
+ this._currentRenderObjectFunction = null;
98
+
90
99
  this._initialized = false;
91
100
  this._initPromise = null;
92
101
 
@@ -133,6 +142,7 @@ class Renderer {
133
142
  }
134
143
 
135
144
  this._nodes = new Nodes( this, backend );
145
+ this._animation = new Animation( this._nodes, this.info );
136
146
  this._attributes = new Attributes( backend );
137
147
  this._background = new Background( this, this._nodes );
138
148
  this._geometries = new Geometries( this._attributes, this.info );
@@ -145,9 +155,6 @@ class Renderer {
145
155
 
146
156
  //
147
157
 
148
- this._animation.setNodes( this._nodes );
149
- this._animation.start();
150
-
151
158
  this._initialized = true;
152
159
 
153
160
  resolve();
@@ -179,7 +186,8 @@ class Renderer {
179
186
  const nodeFrame = this._nodes.nodeFrame;
180
187
 
181
188
  const previousRenderId = nodeFrame.renderId;
182
- const previousRenderState = this._currentRenderContext;
189
+ const previousRenderContext = this._currentRenderContext;
190
+ const previousRenderObjectFunction = this._currentRenderObjectFunction;
183
191
 
184
192
  //
185
193
 
@@ -191,8 +199,14 @@ class Renderer {
191
199
  const activeMipmapLevel = this._activeMipmapLevel;
192
200
 
193
201
  this._currentRenderContext = renderContext;
202
+ this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject;
203
+
204
+ //
194
205
 
195
- nodeFrame.renderId ++;
206
+ this.info.calls ++;
207
+ this.info.render.calls ++;
208
+
209
+ nodeFrame.renderId = this.info.calls;
196
210
 
197
211
  //
198
212
 
@@ -208,16 +222,12 @@ class Renderer {
208
222
 
209
223
  //
210
224
 
211
- if ( this._animation.isAnimating === false ) nodeFrame.update();
212
-
213
225
  if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
214
226
 
215
227
  if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
216
228
 
217
229
  if ( this.info.autoReset === true ) this.info.reset();
218
230
 
219
- this.info.render.frame ++;
220
-
221
231
  //
222
232
 
223
233
  let viewport = this._viewport;
@@ -288,6 +298,7 @@ class Renderer {
288
298
  renderContext.depthTexture = renderTargetData.depthTexture;
289
299
  renderContext.width = renderTargetData.width;
290
300
  renderContext.height = renderTargetData.height;
301
+ renderContext.renderTarget = renderTarget;
291
302
 
292
303
  } else {
293
304
 
@@ -332,9 +343,9 @@ class Renderer {
332
343
  // restore render tree
333
344
 
334
345
  nodeFrame.renderId = previousRenderId;
335
- this._currentRenderContext = previousRenderState;
336
346
 
337
- this._lastRenderContext = renderContext;
347
+ this._currentRenderContext = previousRenderContext;
348
+ this._currentRenderObjectFunction = previousRenderObjectFunction;
338
349
 
339
350
  //
340
351
 
@@ -342,6 +353,12 @@ class Renderer {
342
353
 
343
354
  }
344
355
 
356
+ getMaxAnisotropy() {
357
+
358
+ return this.backend.getMaxAnisotropy();
359
+
360
+ }
361
+
345
362
  getActiveCubeFace() {
346
363
 
347
364
  return this._activeCubeFace;
@@ -354,15 +371,11 @@ class Renderer {
354
371
 
355
372
  }
356
373
 
357
- setAnimationLoop( callback ) {
374
+ async setAnimationLoop( callback ) {
358
375
 
359
- if ( this._initialized === false ) this.init();
360
-
361
- const animation = this._animation;
362
-
363
- animation.setAnimationLoop( callback );
376
+ if ( this._initialized === false ) await this.init();
364
377
 
365
- ( callback === null ) ? animation.stop() : animation.start();
378
+ this._animation.setAnimationLoop( callback );
366
379
 
367
380
  }
368
381
 
@@ -536,19 +549,19 @@ class Renderer {
536
549
  setClearColor( color, alpha = 1 ) {
537
550
 
538
551
  this._clearColor.set( color );
539
- this._clearAlpha = alpha;
552
+ this._clearColor.a = alpha;
540
553
 
541
554
  }
542
555
 
543
556
  getClearAlpha() {
544
557
 
545
- return this._clearAlpha;
558
+ return this._clearColor.a;
546
559
 
547
560
  }
548
561
 
549
562
  setClearAlpha( alpha ) {
550
563
 
551
- this._clearAlpha = alpha;
564
+ this._clearColor.a = alpha;
552
565
 
553
566
  }
554
567
 
@@ -578,7 +591,7 @@ class Renderer {
578
591
 
579
592
  isOccluded( object ) {
580
593
 
581
- const renderContext = this._currentRenderContext || this._lastRenderContext;
594
+ const renderContext = this._currentRenderContext;
582
595
 
583
596
  return renderContext && this.backend.isOccluded( renderContext, object );
584
597
 
@@ -586,9 +599,18 @@ class Renderer {
586
599
 
587
600
  clear( color = true, depth = true, stencil = true ) {
588
601
 
589
- const renderContext = this._currentRenderContext || this._lastRenderContext;
602
+ let renderTargetData = null;
603
+ const renderTarget = this._renderTarget;
590
604
 
591
- if ( renderContext ) this.backend.clear( renderContext, color, depth, stencil );
605
+ if ( renderTarget !== null ) {
606
+
607
+ this._textures.updateRenderTarget( renderTarget );
608
+
609
+ renderTargetData = this._textures.get( renderTarget );
610
+
611
+ }
612
+
613
+ this.backend.clear( color, depth, stencil, renderTargetData );
592
614
 
593
615
  }
594
616
 
@@ -610,10 +632,27 @@ class Renderer {
610
632
 
611
633
  }
612
634
 
635
+ get currentColorSpace() {
636
+
637
+ const renderTarget = this._renderTarget;
638
+
639
+ if ( renderTarget !== null ) {
640
+
641
+ const texture = renderTarget.texture;
642
+
643
+ return ( Array.isArray( texture ) ? texture[ 0 ] : texture ).colorSpace;
644
+
645
+ }
646
+
647
+ return this.outputColorSpace;
648
+
649
+ }
650
+
613
651
  dispose() {
614
652
 
615
653
  this.info.dispose();
616
654
 
655
+ this._animation.dispose();
617
656
  this._objects.dispose();
618
657
  this._properties.dispose();
619
658
  this._pipelines.dispose();
@@ -642,16 +681,47 @@ class Renderer {
642
681
 
643
682
  }
644
683
 
684
+ setRenderObjectFunction( renderObjectFunction ) {
685
+
686
+ this._renderObjectFunction = renderObjectFunction;
687
+
688
+ }
689
+
690
+ getRenderObjectFunction() {
691
+
692
+ return this._renderObjectFunction;
693
+
694
+ }
695
+
645
696
  async compute( computeNodes ) {
646
697
 
647
698
  if ( this._initialized === false ) await this.init();
648
699
 
700
+ const nodeFrame = this._nodes.nodeFrame;
701
+
702
+ const previousRenderId = nodeFrame.renderId;
703
+
704
+ //
705
+
706
+ this.info.calls ++;
707
+ this.info.compute.calls ++;
708
+
709
+ nodeFrame.renderId = this.info.calls;
710
+
711
+ //
712
+
649
713
  const backend = this.backend;
650
714
  const pipelines = this._pipelines;
651
715
  const bindings = this._bindings;
652
716
  const nodes = this._nodes;
653
717
  const computeList = Array.isArray( computeNodes ) ? computeNodes : [ computeNodes ];
654
718
 
719
+ if ( computeList[ 0 ] === undefined || computeList[ 0 ].isComputeNode !== true ) {
720
+
721
+ throw new Error( 'THREE.Renderer: .compute() expects a ComputeNode.' );
722
+
723
+ }
724
+
655
725
  backend.beginCompute( computeNodes );
656
726
 
657
727
  for ( const computeNode of computeList ) {
@@ -690,6 +760,10 @@ class Renderer {
690
760
 
691
761
  backend.finishCompute( computeNodes );
692
762
 
763
+ //
764
+
765
+ nodeFrame.renderId = previousRenderId;
766
+
693
767
  }
694
768
 
695
769
  hasFeature( name ) {
@@ -700,7 +774,7 @@ class Renderer {
700
774
 
701
775
  copyFramebufferToTexture( framebufferTexture ) {
702
776
 
703
- const renderContext = this._currentRenderContext || this._lastRenderContext;
777
+ const renderContext = this._currentRenderContext;
704
778
 
705
779
  this._textures.updateTexture( framebufferTexture );
706
780
 
@@ -825,7 +899,7 @@ class Renderer {
825
899
  const renderItem = renderList[ i ];
826
900
 
827
901
  // @TODO: Add support for multiple materials per object. This will require to extract
828
- // the material from the renderItem object and pass it with its group data to _renderObject().
902
+ // the material from the renderItem object and pass it with its group data to renderObject().
829
903
 
830
904
  const { object, geometry, material, group } = renderItem;
831
905
 
@@ -850,7 +924,7 @@ class Renderer {
850
924
 
851
925
  this.backend.updateViewport( this._currentRenderContext );
852
926
 
853
- this._renderObject( object, scene, camera2, geometry, material, group, lightsNode );
927
+ this._currentRenderObjectFunction( object, scene, camera2, geometry, material, group, lightsNode );
854
928
 
855
929
  }
856
930
 
@@ -858,7 +932,7 @@ class Renderer {
858
932
 
859
933
  } else {
860
934
 
861
- this._renderObject( object, scene, camera, geometry, material, group, lightsNode );
935
+ this._currentRenderObjectFunction( object, scene, camera, geometry, material, group, lightsNode );
862
936
 
863
937
  }
864
938
 
@@ -866,9 +940,9 @@ class Renderer {
866
940
 
867
941
  }
868
942
 
869
- _renderObject( object, scene, camera, geometry, material, group, lightsNode ) {
943
+ renderObject( object, scene, camera, geometry, material, group, lightsNode ) {
870
944
 
871
- material = scene.overrideMaterial !== null ? scene.overrideMaterial : material;
945
+ let overridePositionNode;
872
946
 
873
947
  //
874
948
 
@@ -878,6 +952,24 @@ class Renderer {
878
952
 
879
953
  //
880
954
 
955
+ if ( scene.overrideMaterial !== null ) {
956
+
957
+ const overrideMaterial = scene.overrideMaterial;
958
+
959
+ if ( material.positionNode && material.positionNode.isNode ) {
960
+
961
+ overridePositionNode = overrideMaterial.positionNode;
962
+
963
+ overrideMaterial.positionNode = material.positionNode;
964
+
965
+ }
966
+
967
+ material = overrideMaterial;
968
+
969
+ }
970
+
971
+ //
972
+
881
973
  if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
882
974
 
883
975
  material.side = BackSide;
@@ -896,6 +988,14 @@ class Renderer {
896
988
 
897
989
  //
898
990
 
991
+ if ( overridePositionNode !== undefined ) {
992
+
993
+ scene.overrideMaterial.positionNode = overridePositionNode;
994
+
995
+ }
996
+
997
+ //
998
+
899
999
  object.onAfterRender( this, scene, camera, geometry, material, group );
900
1000
 
901
1001
  }
@@ -14,6 +14,7 @@ class StorageTexture extends Texture {
14
14
  this.isStorageTexture = true;
15
15
 
16
16
  }
17
+
17
18
  }
18
19
 
19
20
  export default StorageTexture;
@@ -70,6 +70,8 @@ class Textures extends DataMap {
70
70
  renderTargetData.height = size.height;
71
71
  renderTargetData.textures = textures;
72
72
  renderTargetData.depthTexture = depthTexture;
73
+ renderTargetData.depth = renderTarget.depthBuffer;
74
+ renderTargetData.stencil = renderTarget.stencilBuffer;
73
75
 
74
76
  if ( renderTargetData.sampleCount !== sampleCount ) {
75
77
 
@@ -80,8 +82,9 @@ class Textures extends DataMap {
80
82
 
81
83
  }
82
84
 
83
- const options = { sampleCount };
85
+ //
84
86
 
87
+ const options = { sampleCount };
85
88
 
86
89
  for ( let i = 0; i < textures.length; i ++ ) {
87
90
 
@@ -20,9 +20,17 @@ class NodeBuilderState {
20
20
 
21
21
  const bindingsArray = [];
22
22
 
23
- for ( const binding of this.bindings ) {
23
+ for ( const instanceBinding of this.bindings ) {
24
24
 
25
- bindingsArray.push( binding.clone() );
25
+ let binding = instanceBinding;
26
+
27
+ if ( instanceBinding.shared !== true ) {
28
+
29
+ binding = instanceBinding.clone();
30
+
31
+ }
32
+
33
+ bindingsArray.push( binding );
26
34
 
27
35
  }
28
36
 
@@ -0,0 +1,44 @@
1
+ import UniformsGroup from '../UniformsGroup.js';
2
+
3
+ let id = 0;
4
+
5
+ class NodeUniformsGroup extends UniformsGroup {
6
+
7
+ constructor( name, groupNode ) {
8
+
9
+ super( name );
10
+
11
+ this.id = id ++;
12
+ this.groupNode = groupNode;
13
+
14
+ this.isNodeUniformsGroup = true;
15
+
16
+ }
17
+
18
+ get shared() {
19
+
20
+ return this.groupNode.shared;
21
+
22
+ }
23
+
24
+ getNodes() {
25
+
26
+ const nodes = [];
27
+
28
+ for ( const uniform of this.uniforms ) {
29
+
30
+ const node = uniform.nodeUniform.node;
31
+
32
+ if ( ! node ) throw new Error( 'NodeUniformsGroup: Uniform has no node.' );
33
+
34
+ nodes.push( node );
35
+
36
+ }
37
+
38
+ return nodes;
39
+
40
+ }
41
+
42
+ }
43
+
44
+ export default NodeUniformsGroup;
@@ -2,7 +2,7 @@ import DataMap from '../DataMap.js';
2
2
  import ChainMap from '../ChainMap.js';
3
3
  import NodeBuilderState from './NodeBuilderState.js';
4
4
  import { NoToneMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from 'three';
5
- import { NodeFrame, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping, equirectUV, viewportBottomLeft, normalWorld } from '../../../nodes/Nodes.js';
5
+ import { NodeFrame, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping, equirectUV, viewportBottomLeft, normalWorld } from '../../../nodes/Nodes.js';
6
6
 
7
7
  class Nodes extends DataMap {
8
8
 
@@ -14,7 +14,74 @@ class Nodes extends DataMap {
14
14
  this.backend = backend;
15
15
  this.nodeFrame = new NodeFrame();
16
16
  this.nodeBuilderCache = new Map();
17
- this.frameHashCache = new ChainMap();
17
+ this.callHashCache = new ChainMap();
18
+ this.groupsData = new ChainMap();
19
+
20
+ }
21
+
22
+ updateGroup( nodeUniformsGroup ) {
23
+
24
+ const groupNode = nodeUniformsGroup.groupNode;
25
+ const name = groupNode.name;
26
+
27
+ // objectGroup is every updated
28
+
29
+ if ( name === objectGroup.name ) return true;
30
+
31
+ // renderGroup is updated once per render/compute call
32
+
33
+ if ( name === renderGroup.name ) {
34
+
35
+ const uniformsGroupData = this.get( nodeUniformsGroup );
36
+ const renderId = this.nodeFrame.renderId;
37
+
38
+ if ( uniformsGroupData.renderId !== renderId ) {
39
+
40
+ uniformsGroupData.renderId = renderId;
41
+
42
+ return true;
43
+
44
+ }
45
+
46
+ return false;
47
+
48
+ }
49
+
50
+ // frameGroup is updated once per frame
51
+
52
+ if ( name === frameGroup.name ) {
53
+
54
+ const uniformsGroupData = this.get( nodeUniformsGroup );
55
+ const frameId = this.nodeFrame.frameId;
56
+
57
+ if ( uniformsGroupData.frameId !== frameId ) {
58
+
59
+ uniformsGroupData.frameId = frameId;
60
+
61
+ return true;
62
+
63
+ }
64
+
65
+ return false;
66
+
67
+ }
68
+
69
+ // other groups are updated just when groupNode.needsUpdate is true
70
+
71
+ const groupChain = [ groupNode, nodeUniformsGroup ];
72
+
73
+ let groupData = this.groupsData.get( groupChain );
74
+ if ( groupData === undefined ) this.groupsData.set( groupChain, groupData = {} );
75
+
76
+ if ( groupData.version !== groupNode.version ) {
77
+
78
+ groupData.version = groupNode.version;
79
+
80
+ return true;
81
+
82
+ }
83
+
84
+ return false;
18
85
 
19
86
  }
20
87
 
@@ -148,11 +215,11 @@ class Nodes extends DataMap {
148
215
  getCacheKey( scene, lightsNode ) {
149
216
 
150
217
  const chain = [ scene, lightsNode ];
151
- const frameId = this.nodeFrame.frameId;
218
+ const callId = this.renderer.info.calls;
152
219
 
153
- let cacheKeyData = this.frameHashCache.get( chain );
220
+ let cacheKeyData = this.callHashCache.get( chain );
154
221
 
155
- if ( cacheKeyData === undefined || cacheKeyData.frameId !== frameId ) {
222
+ if ( cacheKeyData === undefined || cacheKeyData.callId !== callId ) {
156
223
 
157
224
  const environmentNode = this.getEnvironmentNode( scene );
158
225
  const fogNode = this.getFogNode( scene );
@@ -166,11 +233,11 @@ class Nodes extends DataMap {
166
233
  if ( toneMappingNode ) cacheKey.push( toneMappingNode.getCacheKey() );
167
234
 
168
235
  cacheKeyData = {
169
- frameId,
236
+ callId,
170
237
  cacheKey: cacheKey.join( ',' )
171
238
  };
172
239
 
173
- this.frameHashCache.set( chain, cacheKeyData );
240
+ this.callHashCache.set( chain, cacheKeyData );
174
241
 
175
242
  }
176
243