super-three 0.154.1 → 0.155.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 (106) hide show
  1. package/build/three.cjs +256 -38
  2. package/build/three.js +256 -38
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +255 -39
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/controls/OrbitControls.js +143 -21
  7. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  8. package/examples/jsm/exporters/USDZExporter.js +1 -0
  9. package/examples/jsm/interactive/SelectionHelper.js +7 -0
  10. package/examples/jsm/loaders/FBXLoader.js +1 -1
  11. package/examples/jsm/loaders/GLTFLoader.js +8 -3
  12. package/examples/jsm/loaders/KTX2Loader.js +4 -4
  13. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  14. package/examples/jsm/loaders/NRRDLoader.js +3 -3
  15. package/examples/jsm/loaders/PLYLoader.js +1 -1
  16. package/examples/jsm/loaders/TGALoader.js +10 -10
  17. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  18. package/examples/jsm/misc/GPUComputationRenderer.js +0 -9
  19. package/examples/jsm/misc/Volume.js +4 -6
  20. package/examples/jsm/nodes/Nodes.js +5 -6
  21. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +1 -1
  22. package/examples/jsm/nodes/accessors/CubeTextureNode.js +2 -0
  23. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +14 -1
  24. package/examples/jsm/nodes/accessors/InstanceNode.js +8 -8
  25. package/examples/jsm/nodes/accessors/MaterialNode.js +34 -44
  26. package/examples/jsm/nodes/accessors/SceneNode.js +6 -0
  27. package/examples/jsm/nodes/accessors/TextureNode.js +48 -7
  28. package/examples/jsm/nodes/core/LightingModel.js +7 -9
  29. package/examples/jsm/nodes/core/Node.js +11 -2
  30. package/examples/jsm/nodes/core/PropertyNode.js +4 -0
  31. package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
  32. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  33. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -2
  34. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
  35. package/examples/jsm/nodes/functions/PhongLightingModel.js +53 -14
  36. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +236 -97
  37. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  38. package/examples/jsm/nodes/gpgpu/ComputeNode.js +13 -0
  39. package/examples/jsm/nodes/lighting/AONode.js +1 -1
  40. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +58 -20
  41. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +7 -10
  42. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -12
  43. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +1 -1
  44. package/examples/jsm/nodes/lighting/LightingContextNode.js +12 -9
  45. package/examples/jsm/nodes/lighting/PointLightNode.js +7 -10
  46. package/examples/jsm/nodes/lighting/SpotLightNode.js +7 -10
  47. package/examples/jsm/nodes/materials/Materials.js +1 -0
  48. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
  49. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -0
  50. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  51. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +19 -2
  52. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +2 -2
  53. package/examples/jsm/nodes/materials/NodeMaterial.js +50 -24
  54. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  55. package/examples/jsm/nodes/shadernode/ShaderNode.js +2 -2
  56. package/examples/jsm/objects/Reflector.js +1 -9
  57. package/examples/jsm/objects/Refractor.js +0 -8
  58. package/examples/jsm/offscreen/scene.js +0 -1
  59. package/examples/jsm/postprocessing/MaskPass.js +4 -1
  60. package/examples/jsm/postprocessing/OutputPass.js +33 -14
  61. package/examples/jsm/postprocessing/UnrealBloomPass.js +21 -17
  62. package/examples/jsm/renderers/common/Background.js +22 -20
  63. package/examples/jsm/renderers/common/Binding.js +8 -0
  64. package/examples/jsm/renderers/common/Bindings.js +2 -6
  65. package/examples/jsm/renderers/common/Geometries.js +1 -1
  66. package/examples/jsm/renderers/common/Pipelines.js +94 -45
  67. package/examples/jsm/renderers/common/RenderContext.js +1 -0
  68. package/examples/jsm/renderers/common/RenderContexts.js +16 -5
  69. package/examples/jsm/renderers/common/RenderObject.js +20 -4
  70. package/examples/jsm/renderers/common/RenderObjects.js +10 -7
  71. package/examples/jsm/renderers/common/Renderer.js +70 -39
  72. package/examples/jsm/renderers/common/Textures.js +20 -8
  73. package/examples/jsm/renderers/common/nodes/Nodes.js +15 -4
  74. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +51 -54
  75. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +33 -9
  76. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +55 -36
  77. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +83 -5
  78. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +24 -22
  79. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +83 -130
  80. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +35 -8
  81. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +1 -1
  82. package/examples/jsm/shaders/OutputShader.js +19 -2
  83. package/examples/jsm/utils/BufferGeometryUtils.js +13 -4
  84. package/examples/jsm/webxr/OculusHandPointerModel.js +2 -2
  85. package/package.json +2 -2
  86. package/src/Three.js +2 -0
  87. package/src/animation/PropertyBinding.js +1 -1
  88. package/src/cameras/CubeCamera.js +1 -4
  89. package/src/constants.js +1 -1
  90. package/src/core/BufferAttribute.js +20 -0
  91. package/src/core/Object3D.js +1 -1
  92. package/src/core/RenderTarget.js +122 -0
  93. package/src/geometries/CapsuleGeometry.js +1 -1
  94. package/src/loaders/DataTextureLoader.js +21 -2
  95. package/src/renderers/WebGLMultipleRenderTargets.js +0 -2
  96. package/src/renderers/WebGLRenderTarget.js +3 -110
  97. package/src/renderers/WebGLRenderer.js +62 -8
  98. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +1 -2
  99. package/src/renderers/webgl/WebGLGeometries.js +5 -1
  100. package/src/renderers/webgl/WebGLMaterials.js +1 -1
  101. package/src/renderers/webgl/WebGLPrograms.js +14 -2
  102. package/src/renderers/webgl/WebGLTextures.js +97 -12
  103. package/src/textures/CompressedCubeTexture.js +19 -0
  104. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +0 -30
  105. package/examples/jsm/renderers/common/RenderTarget.js +0 -15
  106. package/examples/jsm/renderers/common/nodes/NodeRender.js +0 -302
@@ -2,7 +2,7 @@ let id = 0;
2
2
 
3
3
  export default class RenderObject {
4
4
 
5
- constructor( nodes, geometries, renderer, object, material, scene, camera, lightsNode ) {
5
+ constructor( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext ) {
6
6
 
7
7
  this._nodes = nodes;
8
8
  this._geometries = geometries;
@@ -15,12 +15,13 @@ export default class RenderObject {
15
15
  this.scene = scene;
16
16
  this.camera = camera;
17
17
  this.lightsNode = lightsNode;
18
+ this.context = renderContext;
18
19
 
19
20
  this.geometry = object.geometry;
20
21
 
21
22
  this.attributes = null;
22
- this.context = null;
23
23
  this.pipeline = null;
24
+ this.vertexBuffers = null;
24
25
 
25
26
  this._materialVersion = - 1;
26
27
  this._materialCacheKey = '';
@@ -57,7 +58,7 @@ export default class RenderObject {
57
58
 
58
59
  getChainArray() {
59
60
 
60
- return [ this.object, this.material, this.scene, this.camera, this.lightsNode ];
61
+ return [ this.object, this.material, this.context, this.lightsNode ];
61
62
 
62
63
  }
63
64
 
@@ -69,19 +70,34 @@ export default class RenderObject {
69
70
  const geometry = this.geometry;
70
71
 
71
72
  const attributes = [];
73
+ const vertexBuffers = new Set();
72
74
 
73
75
  for ( const nodeAttribute of nodeAttributes ) {
74
76
 
75
- attributes.push( nodeAttribute.node && nodeAttribute.node.attribute ? nodeAttribute.node.attribute : geometry.getAttribute( nodeAttribute.name ) );
77
+ const attribute = nodeAttribute.node && nodeAttribute.node.attribute ? nodeAttribute.node.attribute : geometry.getAttribute( nodeAttribute.name );
78
+
79
+ attributes.push( attribute );
80
+
81
+ const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
82
+ vertexBuffers.add( bufferAttribute );
76
83
 
77
84
  }
78
85
 
79
86
  this.attributes = attributes;
87
+ this.vertexBuffers = Array.from( vertexBuffers.values() );
80
88
 
81
89
  return attributes;
82
90
 
83
91
  }
84
92
 
93
+ getVertexBuffers() {
94
+
95
+ if ( this.vertexBuffers === null ) this.getAttributes();
96
+
97
+ return this.vertexBuffers;
98
+
99
+ }
100
+
85
101
  getCacheKey() {
86
102
 
87
103
  const { material, scene, lightsNode } = this;
@@ -4,12 +4,13 @@ import RenderObject from './RenderObject.js';
4
4
 
5
5
  class RenderObjects {
6
6
 
7
- constructor( renderer, nodes, geometries, pipelines, info ) {
7
+ constructor( renderer, nodes, geometries, pipelines, bindings, info ) {
8
8
 
9
9
  this.renderer = renderer;
10
10
  this.nodes = nodes;
11
11
  this.geometries = geometries;
12
12
  this.pipelines = pipelines;
13
+ this.bindings = bindings;
13
14
  this.info = info;
14
15
 
15
16
  this.chainMaps = {};
@@ -17,16 +18,16 @@ class RenderObjects {
17
18
 
18
19
  }
19
20
 
20
- get( object, material, scene, camera, lightsNode, passId ) {
21
+ get( object, material, scene, camera, lightsNode, renderContext, passId ) {
21
22
 
22
23
  const chainMap = this.getChainMap( passId );
23
- const chainArray = [ object, material, scene, camera, lightsNode ];
24
+ const chainArray = [ object, material, renderContext, lightsNode ];
24
25
 
25
26
  let renderObject = chainMap.get( chainArray );
26
27
 
27
28
  if ( renderObject === undefined ) {
28
29
 
29
- renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, passId );
30
+ renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, renderContext, passId );
30
31
 
31
32
  chainMap.set( chainArray, renderObject );
32
33
 
@@ -39,7 +40,7 @@ class RenderObjects {
39
40
 
40
41
  renderObject.dispose();
41
42
 
42
- renderObject = this.get( object, material, scene, camera, lightsNode );
43
+ renderObject = this.get( object, material, scene, camera, lightsNode, renderContext, passId );
43
44
 
44
45
  }
45
46
 
@@ -62,11 +63,12 @@ class RenderObjects {
62
63
 
63
64
  }
64
65
 
65
- createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, passId ) {
66
+ createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, passId ) {
66
67
 
67
68
  const chainMap = this.getChainMap( passId );
68
69
  const dataMap = this.dataMap;
69
- const renderObject = new RenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode );
70
+
71
+ const renderObject = new RenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext );
70
72
 
71
73
  const data = dataMap.get( renderObject );
72
74
  data.cacheKey = renderObject.getCacheKey();
@@ -76,6 +78,7 @@ class RenderObjects {
76
78
  dataMap.delete( renderObject );
77
79
 
78
80
  this.pipelines.delete( renderObject );
81
+ this.bindings.delete( renderObject );
79
82
  this.nodes.delete( renderObject );
80
83
 
81
84
  chainMap.delete( renderObject.getChainArray() );
@@ -10,8 +10,9 @@ 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 { Frustum, Matrix4, Vector2, Vector3, Vector4, Color, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
13
+ import { Scene, Frustum, Matrix4, Vector2, Vector3, Vector4, Color, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
14
14
 
15
+ const _scene = new Scene();
15
16
  const _drawingBufferSize = new Vector2();
16
17
  const _screen = new Vector4();
17
18
  const _frustum = new Frustum();
@@ -137,7 +138,7 @@ class Renderer {
137
138
  this._textures = new Textures( backend, this._info );
138
139
  this._pipelines = new Pipelines( backend, this._nodes );
139
140
  this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this._info );
140
- this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._info );
141
+ this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this._info );
141
142
  this._renderLists = new RenderLists();
142
143
  this._renderContexts = new RenderContexts();
143
144
 
@@ -181,8 +182,10 @@ class Renderer {
181
182
 
182
183
  //
183
184
 
184
- const renderContext = this._renderContexts.get( scene, camera );
185
+ const sceneRef = ( scene.isScene === true ) ? scene : _scene;
186
+
185
187
  const renderTarget = this._renderTarget;
188
+ const renderContext = this._renderContexts.get( scene, camera, renderTarget );
186
189
  const activeCubeFace = this._activeCubeFace;
187
190
 
188
191
  this._currentRenderContext = renderContext;
@@ -247,6 +250,10 @@ class Renderer {
247
250
 
248
251
  //
249
252
 
253
+ sceneRef.onBeforeRender( this, scene, camera, renderTarget );
254
+
255
+ //
256
+
250
257
  _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
251
258
  _frustum.setFromProjectionMatrix( _projScreenMatrix, coordinateSystem );
252
259
 
@@ -285,11 +292,11 @@ class Renderer {
285
292
 
286
293
  //
287
294
 
288
- this._nodes.updateScene( scene );
295
+ this._nodes.updateScene( sceneRef );
289
296
 
290
297
  //
291
298
 
292
- this._background.update( scene, renderList, renderContext );
299
+ this._background.update( sceneRef, renderList, renderContext );
293
300
 
294
301
  //
295
302
 
@@ -301,8 +308,8 @@ class Renderer {
301
308
  const transparentObjects = renderList.transparent;
302
309
  const lightsNode = renderList.lightsNode;
303
310
 
304
- if ( opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, scene, lightsNode );
305
- if ( transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, scene, lightsNode );
311
+ if ( opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );
312
+ if ( transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, sceneRef, lightsNode );
306
313
 
307
314
  // finish render pass
308
315
 
@@ -315,6 +322,10 @@ class Renderer {
315
322
 
316
323
  this._lastRenderContext = renderContext;
317
324
 
325
+ //
326
+
327
+ sceneRef.onAfterRender( this, scene, camera, renderTarget );
328
+
318
329
  }
319
330
 
320
331
  setAnimationLoop( callback ) {
@@ -329,9 +340,17 @@ class Renderer {
329
340
 
330
341
  }
331
342
 
332
- async getArrayBuffer( attribute ) {
343
+ getArrayBuffer( attribute ) { // @deprecated, r155
344
+
345
+ console.warn( 'THREE.Renderer: getArrayBuffer() is deprecated. Use getArrayBufferAsync() instead.' );
333
346
 
334
- return await this.backend.getArrayBuffer( attribute );
347
+ return this.getArrayBufferAsync( attribute );
348
+
349
+ }
350
+
351
+ async getArrayBufferAsync( attribute ) {
352
+
353
+ return await this.backend.getArrayBufferAsync( attribute );
335
354
 
336
355
  }
337
356
 
@@ -581,43 +600,59 @@ class Renderer {
581
600
 
582
601
  }
583
602
 
603
+ getRenderTarget() {
604
+
605
+ return this._renderTarget;
606
+
607
+ }
608
+
584
609
  async compute( computeNodes ) {
585
610
 
586
611
  if ( this._initialized === false ) await this.init();
587
612
 
588
613
  const backend = this.backend;
589
614
  const pipelines = this._pipelines;
590
- const computeGroup = Array.isArray( computeNodes ) ? computeNodes : [ computeNodes ];
615
+ const bindings = this._bindings;
616
+ const nodes = this._nodes;
617
+ const computeList = Array.isArray( computeNodes ) ? computeNodes : [ computeNodes ];
591
618
 
592
- backend.beginCompute( computeGroup );
619
+ backend.beginCompute( computeNodes );
593
620
 
594
- for ( const computeNode of computeGroup ) {
621
+ for ( const computeNode of computeList ) {
595
622
 
596
623
  // onInit
597
624
 
598
625
  if ( pipelines.has( computeNode ) === false ) {
599
626
 
600
- computeNode.onInit( { renderer: this } );
627
+ const dispose = () => {
601
628
 
602
- }
629
+ computeNode.removeEventListener( 'dispose', dispose );
603
630
 
604
- this._nodes.updateForCompute( computeNode );
605
- this._bindings.updateForCompute( computeNode );
631
+ pipelines.delete( computeNode );
632
+ bindings.delete( computeNode );
633
+ nodes.delete( computeNode );
606
634
 
607
- const computePipeline = pipelines.getForCompute( computeNode );
608
- const computeBindings = this._bindings.getForCompute( computeNode );
635
+ };
609
636
 
610
- backend.compute( computeGroup, computeNode, computeBindings, computePipeline );
637
+ computeNode.addEventListener( 'dispose', dispose );
611
638
 
612
- }
639
+ //
613
640
 
614
- backend.finishCompute( computeGroup );
641
+ computeNode.onInit( { renderer: this } );
615
642
 
616
- }
643
+ }
617
644
 
618
- getRenderTarget() {
645
+ nodes.updateForCompute( computeNode );
646
+ bindings.updateForCompute( computeNode );
619
647
 
620
- return this._renderTarget;
648
+ const computeBindings = bindings.getForCompute( computeNode );
649
+ const computePipeline = pipelines.getForCompute( computeNode, computeBindings );
650
+
651
+ backend.compute( computeNodes, computeNode, computeBindings, computePipeline );
652
+
653
+ }
654
+
655
+ backend.finishCompute( computeNodes );
621
656
 
622
657
  }
623
658
 
@@ -803,13 +838,6 @@ class Renderer {
803
838
 
804
839
  object.onBeforeRender( this, scene, camera, geometry, material, group );
805
840
 
806
- //
807
-
808
- object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
809
- object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
810
-
811
- //
812
-
813
841
  material.onBeforeRender( this, scene, camera, geometry, material, group );
814
842
 
815
843
  //
@@ -817,16 +845,16 @@ class Renderer {
817
845
  if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
818
846
 
819
847
  material.side = BackSide;
820
- this._renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode, 'backSide' ); // create backSide pass id
848
+ this._renderObjectDirect( object, material, scene, camera, lightsNode, 'backSide' ); // create backSide pass id
821
849
 
822
850
  material.side = FrontSide;
823
- this._renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode ); // use default pass id
851
+ this._renderObjectDirect( object, material, scene, camera, lightsNode ); // use default pass id
824
852
 
825
853
  material.side = DoubleSide;
826
854
 
827
855
  } else {
828
856
 
829
- this._renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode );
857
+ this._renderObjectDirect( object, material, scene, camera, lightsNode );
830
858
 
831
859
  }
832
860
 
@@ -836,22 +864,25 @@ class Renderer {
836
864
 
837
865
  }
838
866
 
839
- _renderObjectDirect( object, scene, camera, geometry, material, group, lightsNode, passId ) {
867
+ _renderObjectDirect( object, material, scene, camera, lightsNode, passId ) {
868
+
869
+ const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
840
870
 
841
871
  //
842
872
 
843
- const renderObject = this._objects.get( object, material, scene, camera, lightsNode, passId );
844
- renderObject.context = this._currentRenderContext;
873
+ this._nodes.updateBefore( renderObject );
845
874
 
846
875
  //
847
876
 
848
- this._nodes.updateBefore( renderObject );
877
+ object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
878
+ object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
849
879
 
850
880
  //
851
881
 
852
882
  this._nodes.updateForRender( renderObject );
853
- this._geometries.update( renderObject );
883
+ this._geometries.updateForRender( renderObject );
854
884
  this._bindings.updateForRender( renderObject );
885
+ this._pipelines.updateForRender( renderObject );
855
886
 
856
887
  //
857
888
 
@@ -17,6 +17,7 @@ class Textures extends DataMap {
17
17
  updateRenderTarget( renderTarget ) {
18
18
 
19
19
  const renderTargetData = this.get( renderTarget );
20
+ const sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
20
21
 
21
22
  const texture = renderTarget.texture;
22
23
  const size = this.getSize( texture );
@@ -48,8 +49,19 @@ class Textures extends DataMap {
48
49
  renderTargetData.texture = texture;
49
50
  renderTargetData.depthTexture = depthTexture;
50
51
 
51
- this.updateTexture( texture );
52
- this.updateTexture( depthTexture );
52
+ if ( renderTargetData.sampleCount !== sampleCount ) {
53
+
54
+ texture.needsUpdate = true;
55
+ depthTexture.needsUpdate = true;
56
+
57
+ renderTargetData.sampleCount = sampleCount;
58
+
59
+ }
60
+
61
+ const options = { sampleCount };
62
+
63
+ this.updateTexture( texture, options );
64
+ this.updateTexture( depthTexture, options );
53
65
 
54
66
  // dispose handler
55
67
 
@@ -74,15 +86,15 @@ class Textures extends DataMap {
74
86
 
75
87
  }
76
88
 
77
- updateTexture( texture ) {
89
+ updateTexture( texture, options = {} ) {
78
90
 
79
91
  const textureData = this.get( texture );
80
92
  if ( textureData.initialized === true && textureData.version === texture.version ) return;
81
93
 
82
- const isRenderTexture = texture.isRenderTargetTexture || texture.isDepthTexture || texture.isFramebufferTexture;
94
+ const isRenderTarget = texture.isRenderTargetTexture || texture.isDepthTexture || texture.isFramebufferTexture;
83
95
  const backend = this.backend;
84
96
 
85
- if ( isRenderTexture && textureData.initialized === true ) {
97
+ if ( isRenderTarget && textureData.initialized === true ) {
86
98
 
87
99
  // it's an update
88
100
 
@@ -93,10 +105,10 @@ class Textures extends DataMap {
93
105
 
94
106
  //
95
107
 
96
- if ( isRenderTexture ) {
108
+ if ( isRenderTarget ) {
97
109
 
98
110
  backend.createSampler( texture );
99
- backend.createTexture( texture );
111
+ backend.createTexture( texture, options );
100
112
 
101
113
  } else {
102
114
 
@@ -120,7 +132,7 @@ class Textures extends DataMap {
120
132
 
121
133
  if ( textureData.isDefaultTexture === undefined || textureData.isDefaultTexture === true ) {
122
134
 
123
- backend.createTexture( texture );
135
+ backend.createTexture( texture, options );
124
136
 
125
137
  textureData.isDefaultTexture = false;
126
138
 
@@ -1,6 +1,6 @@
1
1
  import DataMap from '../DataMap.js';
2
2
  import { NoToneMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from 'three';
3
- import { NodeFrame, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping, positionWorld, modelWorldMatrix, transformDirection, equirectUV, viewportBottomLeft } from '../../../nodes/Nodes.js';
3
+ import { NodeFrame, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping, equirectUV, viewportBottomLeft, normalWorld } from '../../../nodes/Nodes.js';
4
4
 
5
5
  class Nodes extends DataMap {
6
6
 
@@ -77,6 +77,8 @@ class Nodes extends DataMap {
77
77
 
78
78
  getToneMappingNode() {
79
79
 
80
+ if ( this.isToneMappingState === false ) return null;
81
+
80
82
  return this.renderer.toneMappingNode || this.get( this.renderer ).toneMappingNode || null;
81
83
 
82
84
  }
@@ -107,13 +109,22 @@ class Nodes extends DataMap {
107
109
 
108
110
  }
109
111
 
112
+ get isToneMappingState() {
113
+
114
+ const renderer = this.renderer;
115
+ const renderTarget = renderer.getRenderTarget();
116
+
117
+ return renderTarget && renderTarget.isCubeRenderTarget ? false : true;
118
+
119
+ }
120
+
110
121
  updateToneMapping() {
111
122
 
112
123
  const renderer = this.renderer;
113
124
  const rendererData = this.get( renderer );
114
125
  const rendererToneMapping = renderer.toneMapping;
115
126
 
116
- if ( rendererToneMapping !== NoToneMapping ) {
127
+ if ( this.isToneMappingState && rendererToneMapping !== NoToneMapping ) {
117
128
 
118
129
  if ( rendererData.toneMapping !== rendererToneMapping ) {
119
130
 
@@ -149,7 +160,7 @@ class Nodes extends DataMap {
149
160
 
150
161
  if ( background.isCubeTexture === true ) {
151
162
 
152
- backgroundNode = cubeTexture( background, transformDirection( positionWorld, modelWorldMatrix ) );
163
+ backgroundNode = cubeTexture( background, normalWorld );
153
164
 
154
165
  } else if ( background.isTexture === true ) {
155
166
 
@@ -165,7 +176,7 @@ class Nodes extends DataMap {
165
176
 
166
177
  }
167
178
 
168
- backgroundNode = texture( background, nodeUV );
179
+ backgroundNode = texture( background, nodeUV ).setUpdateMatrix( true );
169
180
 
170
181
  } else if ( background.isColor !== true ) {
171
182