super-three 0.160.1 → 0.161.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 (145) hide show
  1. package/LICENSE +1 -1
  2. package/build/three.cjs +379 -108
  3. package/build/three.module.js +380 -108
  4. package/build/three.module.min.js +1 -1
  5. package/examples/jsm/Addons.js +5 -1
  6. package/examples/jsm/capabilities/WebGPU.js +13 -9
  7. package/examples/jsm/controls/OrbitControls.js +102 -13
  8. package/examples/jsm/curves/NURBSUtils.js +59 -4
  9. package/examples/jsm/curves/NURBSVolume.js +62 -0
  10. package/examples/jsm/exporters/USDZExporter.js +8 -7
  11. package/examples/jsm/helpers/TextureHelper.js +3 -3
  12. package/examples/jsm/loaders/3DMLoader.js +44 -43
  13. package/examples/jsm/loaders/DDSLoader.js +1 -0
  14. package/examples/jsm/loaders/KTX2Loader.js +20 -5
  15. package/examples/jsm/loaders/LUT3dlLoader.js +78 -46
  16. package/examples/jsm/loaders/LUTCubeLoader.js +81 -67
  17. package/examples/jsm/loaders/LUTImageLoader.js +3 -2
  18. package/examples/jsm/loaders/MaterialXLoader.js +115 -16
  19. package/examples/jsm/loaders/SVGLoader.js +4 -3
  20. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  21. package/examples/jsm/materials/MeshPostProcessingMaterial.js +144 -0
  22. package/examples/jsm/misc/Timer.js +13 -4
  23. package/examples/jsm/nodes/Nodes.js +16 -5
  24. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +5 -3
  25. package/examples/jsm/nodes/accessors/CameraNode.js +9 -4
  26. package/examples/jsm/nodes/accessors/CubeTextureNode.js +12 -1
  27. package/examples/jsm/nodes/accessors/StorageBufferNode.js +27 -0
  28. package/examples/jsm/nodes/accessors/TextureStoreNode.js +56 -3
  29. package/examples/jsm/nodes/accessors/VertexColorNode.js +70 -0
  30. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  31. package/examples/jsm/nodes/core/NodeBuilder.js +23 -18
  32. package/examples/jsm/nodes/core/NodeFrame.js +16 -8
  33. package/examples/jsm/nodes/core/constants.js +1 -0
  34. package/examples/jsm/nodes/display/AfterImageNode.js +148 -0
  35. package/examples/jsm/nodes/display/AnamorphicNode.js +148 -0
  36. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +3 -0
  37. package/examples/jsm/nodes/display/GaussianBlurNode.js +33 -13
  38. package/examples/jsm/nodes/display/PassNode.js +3 -2
  39. package/examples/jsm/nodes/display/ToneMappingNode.js +46 -3
  40. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -4
  41. package/examples/jsm/nodes/display/ViewportNode.js +0 -2
  42. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +4 -4
  43. package/examples/jsm/nodes/fog/FogNode.js +2 -1
  44. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  45. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +13 -5
  46. package/examples/jsm/nodes/lighting/LightingContextNode.js +1 -1
  47. package/examples/jsm/nodes/lighting/LightsNode.js +1 -1
  48. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +18 -30
  49. package/examples/jsm/nodes/materials/Materials.js +1 -0
  50. package/examples/jsm/nodes/materials/MeshSSSNodeMaterial.js +84 -0
  51. package/examples/jsm/nodes/materials/NodeMaterial.js +6 -4
  52. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +1 -7
  53. package/examples/jsm/nodes/math/MathNode.js +12 -2
  54. package/examples/jsm/nodes/math/MathUtils.js +15 -0
  55. package/examples/jsm/nodes/math/OperatorNode.js +13 -5
  56. package/examples/jsm/nodes/math/TriNoise3D.js +71 -0
  57. package/examples/jsm/nodes/shadernode/ShaderNode.js +10 -1
  58. package/examples/jsm/nodes/utils/ArrayElementNode.js +6 -0
  59. package/examples/jsm/nodes/utils/JoinNode.js +2 -2
  60. package/examples/jsm/nodes/utils/LoopNode.js +3 -3
  61. package/examples/jsm/nodes/utils/ReflectorNode.js +227 -0
  62. package/examples/jsm/nodes/utils/RotateNode.js +68 -0
  63. package/examples/jsm/nodes/utils/RotateUVNode.js +1 -9
  64. package/examples/jsm/nodes/utils/SplitNode.js +4 -4
  65. package/examples/jsm/objects/GroundedSkybox.js +50 -0
  66. package/examples/jsm/objects/QuadMesh.js +8 -2
  67. package/examples/jsm/objects/Water2.js +8 -8
  68. package/examples/jsm/postprocessing/GTAOPass.js +11 -1
  69. package/examples/jsm/renderers/common/Backend.js +14 -0
  70. package/examples/jsm/renderers/common/Bindings.js +1 -1
  71. package/examples/jsm/renderers/common/DataMap.js +1 -1
  72. package/examples/jsm/renderers/common/Info.js +25 -1
  73. package/examples/jsm/renderers/common/Pipelines.js +8 -8
  74. package/examples/jsm/renderers/common/PostProcessing.js +2 -2
  75. package/examples/jsm/renderers/common/ProgrammableStage.js +3 -1
  76. package/examples/jsm/renderers/common/RenderObject.js +2 -0
  77. package/examples/jsm/renderers/common/Renderer.js +238 -22
  78. package/examples/jsm/renderers/common/StorageBufferAttribute.js +17 -0
  79. package/examples/jsm/renderers/common/Textures.js +25 -5
  80. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +2 -1
  81. package/examples/jsm/renderers/common/nodes/Nodes.js +4 -2
  82. package/examples/jsm/renderers/webgl/WebGLBackend.js +631 -270
  83. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +37 -30
  84. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +89 -8
  85. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +11 -0
  86. package/examples/jsm/renderers/webgl/utils/WebGLState.js +197 -0
  87. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +377 -11
  88. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +2 -2
  89. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +1 -21
  90. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +2 -2
  91. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +289 -102
  92. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +7 -2
  93. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +56 -39
  94. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  95. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -4
  96. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +85 -12
  97. package/examples/jsm/transpiler/AST.js +1 -1
  98. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  99. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  100. package/examples/jsm/transpiler/TSLEncoder.js +1 -1
  101. package/examples/jsm/utils/BufferGeometryUtils.js +23 -27
  102. package/examples/jsm/utils/SortUtils.js +2 -0
  103. package/examples/jsm/webxr/ARButton.js +12 -2
  104. package/examples/jsm/webxr/VRButton.js +12 -2
  105. package/examples/jsm/webxr/XRButton.js +12 -2
  106. package/examples/jsm/webxr/XRControllerModelFactory.js +6 -1
  107. package/examples/jsm/webxr/XRHandMeshModel.js +3 -1
  108. package/package.json +2 -2
  109. package/src/audio/Audio.js +1 -3
  110. package/src/cameras/PerspectiveCamera.js +35 -0
  111. package/src/constants.js +1 -2
  112. package/src/core/BufferAttribute.js +2 -1
  113. package/src/core/InterleavedBuffer.js +2 -1
  114. package/src/core/InterleavedBufferAttribute.js +20 -0
  115. package/src/materials/ShaderMaterial.js +2 -1
  116. package/src/math/Triangle.js +0 -30
  117. package/src/objects/BatchedMesh.js +6 -7
  118. package/src/objects/SkinnedMesh.js +0 -8
  119. package/src/renderers/WebGLRenderer.js +5 -1
  120. package/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js +9 -0
  121. package/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js +56 -11
  122. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +15 -7
  123. package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -2
  124. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +1 -2
  125. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +1 -1
  126. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +1 -2
  127. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +1 -1
  128. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +1 -2
  129. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +3 -1
  130. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +1 -1
  131. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -1
  132. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +1 -1
  133. package/src/renderers/shaders/ShaderLib/points.glsl.js +1 -1
  134. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +1 -1
  135. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  136. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  137. package/src/renderers/webgl/WebGLProgram.js +30 -3
  138. package/src/renderers/webgl/WebGLPrograms.js +19 -11
  139. package/src/renderers/webgl/WebGLTextures.js +90 -16
  140. package/src/renderers/webxr/WebXRDepthSensing.js +105 -0
  141. package/src/renderers/webxr/WebXRManager.js +46 -0
  142. package/src/textures/Source.js +1 -0
  143. package/build/three.js +0 -54519
  144. package/build/three.min.js +0 -7
  145. package/examples/jsm/objects/GroundProjectedSkybox.js +0 -172
@@ -30,6 +30,7 @@ class Renderer {
30
30
 
31
31
  const {
32
32
  logarithmicDepthBuffer = false,
33
+ alpha = true
33
34
  } = parameters;
34
35
 
35
36
  // public
@@ -43,6 +44,8 @@ class Renderer {
43
44
  this.autoClearDepth = true;
44
45
  this.autoClearStencil = true;
45
46
 
47
+ this.alpha = alpha;
48
+
46
49
  this.logarithmicDepthBuffer = logarithmicDepthBuffer;
47
50
 
48
51
  this.outputColorSpace = SRGBColorSpace;
@@ -67,7 +70,6 @@ class Renderer {
67
70
  this._scissor = new Vector4( 0, 0, this._width, this._height );
68
71
  this._scissorTest = false;
69
72
 
70
- this._properties = null;
71
73
  this._attributes = null;
72
74
  this._geometries = null;
73
75
  this._nodes = null;
@@ -85,7 +87,10 @@ class Renderer {
85
87
  this._opaqueSort = null;
86
88
  this._transparentSort = null;
87
89
 
88
- this._clearColor = new Color4( 0x000000 );
90
+
91
+ const alphaClear = this.alpha === true ? 0 : 1;
92
+
93
+ this._clearColor = new Color4( 0, 0, 0, alphaClear );
89
94
  this._clearDepth = 1;
90
95
  this._clearStencil = 0;
91
96
 
@@ -96,9 +101,13 @@ class Renderer {
96
101
  this._renderObjectFunction = null;
97
102
  this._currentRenderObjectFunction = null;
98
103
 
104
+ this._handleObjectFunction = this._renderObjectDirect;
105
+
99
106
  this._initialized = false;
100
107
  this._initPromise = null;
101
108
 
109
+ this._compilationPromises = null;
110
+
102
111
  // backwards compatibility
103
112
 
104
113
  this.shadowMap = {
@@ -146,7 +155,7 @@ class Renderer {
146
155
  this._attributes = new Attributes( backend );
147
156
  this._background = new Background( this, this._nodes );
148
157
  this._geometries = new Geometries( this._attributes, this.info );
149
- this._textures = new Textures( backend, this.info );
158
+ this._textures = new Textures( this, backend, this.info );
150
159
  this._pipelines = new Pipelines( backend, this._nodes );
151
160
  this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this.info );
152
161
  this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this.info );
@@ -171,13 +180,129 @@ class Renderer {
171
180
 
172
181
  }
173
182
 
174
- async compile( /*scene, camera*/ ) {
183
+ async compileAsync( scene, camera, targetScene = null ) {
184
+
185
+ if ( this._initialized === false ) await this.init();
186
+
187
+ // preserve render tree
188
+
189
+ const nodeFrame = this._nodes.nodeFrame;
190
+
191
+ const previousRenderId = nodeFrame.renderId;
192
+ const previousRenderContext = this._currentRenderContext;
193
+ const previousRenderObjectFunction = this._currentRenderObjectFunction;
194
+ const previousCompilationPromises = this._compilationPromises;
195
+
196
+ //
197
+
198
+ const sceneRef = ( scene.isScene === true ) ? scene : _scene;
199
+
200
+ if ( targetScene === null ) targetScene = scene;
201
+
202
+ const renderTarget = this._renderTarget;
203
+ const renderContext = this._renderContexts.get( targetScene, camera, renderTarget );
204
+ const activeMipmapLevel = this._activeMipmapLevel;
205
+
206
+ const compilationPromises = [];
207
+
208
+ this._currentRenderContext = renderContext;
209
+ this._currentRenderObjectFunction = this.renderObject;
210
+
211
+ this._handleObjectFunction = this._createObjectPipeline;
212
+
213
+ this._compilationPromises = compilationPromises;
214
+
215
+ nodeFrame.renderId ++;
216
+
217
+ //
218
+
219
+ nodeFrame.update();
220
+
221
+ //
222
+
223
+ renderContext.depth = this.depth;
224
+ renderContext.stencil = this.stencil;
225
+
226
+ //
227
+
228
+ sceneRef.onBeforeRender( this, scene, camera, renderTarget );
229
+
230
+ //
231
+
232
+ const renderList = this._renderLists.get( scene, camera );
233
+ renderList.begin();
234
+
235
+ this._projectObject( scene, camera, 0, renderList );
236
+
237
+ // include lights from target scene
238
+ if ( targetScene !== scene ) {
239
+
240
+ targetScene.traverseVisible( function ( object ) {
241
+
242
+ if ( object.isLight && object.layers.test( camera.layers ) ) {
243
+
244
+ renderList.pushLight( object );
245
+
246
+ }
247
+
248
+ } );
249
+
250
+ }
251
+
252
+ renderList.finish();
253
+
254
+ //
255
+
256
+ if ( renderTarget !== null ) {
257
+
258
+ this._textures.updateRenderTarget( renderTarget, activeMipmapLevel );
259
+
260
+ const renderTargetData = this._textures.get( renderTarget );
261
+
262
+ renderContext.textures = renderTargetData.textures;
263
+ renderContext.depthTexture = renderTargetData.depthTexture;
264
+
265
+ } else {
266
+
267
+ renderContext.textures = null;
268
+ renderContext.depthTexture = null;
269
+
270
+ }
271
+
272
+ //
273
+
274
+ this._nodes.updateScene( sceneRef );
275
+
276
+ //
277
+
278
+ this._background.update( sceneRef, renderList, renderContext );
279
+
280
+ // process render lists
175
281
 
176
- console.warn( 'THREE.Renderer: .compile() is not implemented yet.' );
282
+ const opaqueObjects = renderList.opaque;
283
+ const transparentObjects = renderList.transparent;
284
+ const lightsNode = renderList.lightsNode;
285
+
286
+ if ( opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );
287
+ if ( transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, sceneRef, lightsNode );
288
+
289
+ // restore render tree
290
+
291
+ nodeFrame.renderId = previousRenderId;
292
+
293
+ this._currentRenderContext = previousRenderContext;
294
+ this._currentRenderObjectFunction = previousRenderObjectFunction;
295
+ this._compilationPromises = previousCompilationPromises;
296
+
297
+ this._handleObjectFunction = this._renderObjectDirect;
298
+
299
+ // wait for all promises setup by backends awaiting compilation/linking/pipeline creation to complete
300
+
301
+ await Promise.all( compilationPromises );
177
302
 
178
303
  }
179
304
 
180
- async render( scene, camera ) {
305
+ async renderAsync( scene, camera ) {
181
306
 
182
307
  if ( this._initialized === false ) await this.init();
183
308
 
@@ -261,9 +386,6 @@ class Renderer {
261
386
  renderContext.scissorValue.width >>= activeMipmapLevel;
262
387
  renderContext.scissorValue.height >>= activeMipmapLevel;
263
388
 
264
- renderContext.depth = this.depth;
265
- renderContext.stencil = this.stencil;
266
-
267
389
  //
268
390
 
269
391
  sceneRef.onBeforeRender( this, scene, camera, renderTarget );
@@ -299,6 +421,8 @@ class Renderer {
299
421
  renderContext.width = renderTargetData.width;
300
422
  renderContext.height = renderTargetData.height;
301
423
  renderContext.renderTarget = renderTarget;
424
+ renderContext.depth = renderTarget.depthBuffer;
425
+ renderContext.stencil = renderTarget.stencilBuffer;
302
426
 
303
427
  } else {
304
428
 
@@ -306,6 +430,8 @@ class Renderer {
306
430
  renderContext.depthTexture = null;
307
431
  renderContext.width = this.domElement.width;
308
432
  renderContext.height = this.domElement.height;
433
+ renderContext.depth = this.depth;
434
+ renderContext.stencil = this.stencil;
309
435
 
310
436
  }
311
437
 
@@ -351,6 +477,9 @@ class Renderer {
351
477
 
352
478
  sceneRef.onAfterRender( this, scene, camera, renderTarget );
353
479
 
480
+
481
+ await this.backend.resolveTimestampAsync( renderContext, 'render' );
482
+
354
483
  }
355
484
 
356
485
  getMaxAnisotropy() {
@@ -395,7 +524,7 @@ class Renderer {
395
524
 
396
525
  getContext() {
397
526
 
398
- return this._context;
527
+ return this.backend.getContext();
399
528
 
400
529
  }
401
530
 
@@ -513,6 +642,8 @@ class Renderer {
513
642
 
514
643
  this._scissorTest = boolean;
515
644
 
645
+ this.backend.setScissorTest( boolean );
646
+
516
647
  }
517
648
 
518
649
  getViewport( target ) {
@@ -597,7 +728,9 @@ class Renderer {
597
728
 
598
729
  }
599
730
 
600
- clear( color = true, depth = true, stencil = true ) {
731
+ async clearAsync( color = true, depth = true, stencil = true ) {
732
+
733
+ if ( this._initialized === false ) await this.init();
601
734
 
602
735
  let renderTargetData = null;
603
736
  const renderTarget = this._renderTarget;
@@ -614,21 +747,21 @@ class Renderer {
614
747
 
615
748
  }
616
749
 
617
- clearColor() {
750
+ clearColorAsync() {
618
751
 
619
- this.clear( true, false, false );
752
+ return this.clearAsync( true, false, false );
620
753
 
621
754
  }
622
755
 
623
- clearDepth() {
756
+ clearDepthAsync() {
624
757
 
625
- this.clear( false, true, false );
758
+ return this.clearAsync( false, true, false );
626
759
 
627
760
  }
628
761
 
629
- clearStencil() {
762
+ clearStencilAsync() {
630
763
 
631
- this.clear( false, false, true );
764
+ return this.clearAsync( false, false, true );
632
765
 
633
766
  }
634
767
 
@@ -654,7 +787,6 @@ class Renderer {
654
787
 
655
788
  this._animation.dispose();
656
789
  this._objects.dispose();
657
- this._properties.dispose();
658
790
  this._pipelines.dispose();
659
791
  this._nodes.dispose();
660
792
  this._bindings.dispose();
@@ -693,7 +825,7 @@ class Renderer {
693
825
 
694
826
  }
695
827
 
696
- async compute( computeNodes ) {
828
+ async computeAsync( computeNodes ) {
697
829
 
698
830
  if ( this._initialized === false ) await this.init();
699
831
 
@@ -705,10 +837,12 @@ class Renderer {
705
837
 
706
838
  this.info.calls ++;
707
839
  this.info.compute.calls ++;
840
+ this.info.compute.computeCalls ++;
708
841
 
709
842
  nodeFrame.renderId = this.info.calls;
710
843
 
711
844
  //
845
+ if ( this.info.autoReset === true ) this.info.resetCompute();
712
846
 
713
847
  const backend = this.backend;
714
848
  const pipelines = this._pipelines;
@@ -760,12 +894,20 @@ class Renderer {
760
894
 
761
895
  backend.finishCompute( computeNodes );
762
896
 
897
+ await this.backend.resolveTimestampAsync( computeNodes, 'compute' );
898
+
763
899
  //
764
900
 
765
901
  nodeFrame.renderId = previousRenderId;
766
902
 
767
903
  }
768
904
 
905
+ hasFeatureAsync( name ) {
906
+
907
+ return this.backend.hasFeatureAsync( name );
908
+
909
+ }
910
+
769
911
  hasFeature( name ) {
770
912
 
771
913
  return this.backend.hasFeature( name );
@@ -943,6 +1085,7 @@ class Renderer {
943
1085
  renderObject( object, scene, camera, geometry, material, group, lightsNode ) {
944
1086
 
945
1087
  let overridePositionNode;
1088
+ let overrideFragmentNode;
946
1089
 
947
1090
  //
948
1091
 
@@ -964,6 +1107,13 @@ class Renderer {
964
1107
 
965
1108
  }
966
1109
 
1110
+ if ( overrideMaterial.isShadowNodeMaterial && ( material.shadowNode && material.shadowNode.isNode ) ) {
1111
+
1112
+ overrideFragmentNode = overrideMaterial.fragmentNode;
1113
+ overrideMaterial.fragmentNode = material.shadowNode;
1114
+
1115
+ }
1116
+
967
1117
  material = overrideMaterial;
968
1118
 
969
1119
  }
@@ -973,16 +1123,16 @@ class Renderer {
973
1123
  if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
974
1124
 
975
1125
  material.side = BackSide;
976
- this._renderObjectDirect( object, material, scene, camera, lightsNode, 'backSide' ); // create backSide pass id
1126
+ this._handleObjectFunction( object, material, scene, camera, lightsNode, 'backSide' ); // create backSide pass id
977
1127
 
978
1128
  material.side = FrontSide;
979
- this._renderObjectDirect( object, material, scene, camera, lightsNode ); // use default pass id
1129
+ this._handleObjectFunction( object, material, scene, camera, lightsNode ); // use default pass id
980
1130
 
981
1131
  material.side = DoubleSide;
982
1132
 
983
1133
  } else {
984
1134
 
985
- this._renderObjectDirect( object, material, scene, camera, lightsNode );
1135
+ this._handleObjectFunction( object, material, scene, camera, lightsNode );
986
1136
 
987
1137
  }
988
1138
 
@@ -994,6 +1144,12 @@ class Renderer {
994
1144
 
995
1145
  }
996
1146
 
1147
+ if ( overrideFragmentNode !== undefined ) {
1148
+
1149
+ scene.overrideMaterial.fragmentNode = overrideFragmentNode;
1150
+
1151
+ }
1152
+
997
1153
  //
998
1154
 
999
1155
  object.onAfterRender( this, scene, camera, geometry, material, group );
@@ -1026,6 +1182,66 @@ class Renderer {
1026
1182
 
1027
1183
  }
1028
1184
 
1185
+ _createObjectPipeline( object, material, scene, camera, lightsNode, passId ) {
1186
+
1187
+ const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
1188
+
1189
+ //
1190
+
1191
+ this._nodes.updateBefore( renderObject );
1192
+
1193
+ //
1194
+
1195
+ this._nodes.updateForRender( renderObject );
1196
+ this._geometries.updateForRender( renderObject );
1197
+ this._bindings.updateForRender( renderObject );
1198
+
1199
+ this._pipelines.getForRender( renderObject, this._compilationPromises );
1200
+
1201
+ }
1202
+
1203
+ get compute() {
1204
+
1205
+ return this.computeAsync;
1206
+
1207
+ }
1208
+
1209
+ get compile() {
1210
+
1211
+ return this.compileAsync;
1212
+
1213
+ }
1214
+
1215
+ get render() {
1216
+
1217
+ return this.renderAsync;
1218
+
1219
+ }
1220
+
1221
+ get clear() {
1222
+
1223
+ return this.clearAsync;
1224
+
1225
+ }
1226
+
1227
+ get clearColor() {
1228
+
1229
+ return this.clearColorAsync;
1230
+
1231
+ }
1232
+
1233
+ get clearDepth() {
1234
+
1235
+ return this.clearDepthAsync;
1236
+
1237
+ }
1238
+
1239
+ get clearStencil() {
1240
+
1241
+ return this.clearStencilAsync;
1242
+
1243
+ }
1244
+
1029
1245
  }
1030
1246
 
1031
1247
  export default Renderer;
@@ -0,0 +1,17 @@
1
+ import { InstancedBufferAttribute } from 'three';
2
+
3
+ class StorageBufferAttribute extends InstancedBufferAttribute {
4
+
5
+ constructor( array, itemSize, typeClass = Float32Array ) {
6
+
7
+ if ( ArrayBuffer.isView( array ) === false ) array = new typeClass( array * itemSize );
8
+
9
+ super( array, itemSize );
10
+
11
+ this.isStorageBufferAttribute = true;
12
+
13
+ }
14
+
15
+ }
16
+
17
+ export default StorageBufferAttribute;
@@ -1,15 +1,16 @@
1
1
  import DataMap from './DataMap.js';
2
2
 
3
- import { Vector3, DepthTexture, DepthStencilFormat, UnsignedInt248Type, LinearFilter, NearestFilter, EquirectangularReflectionMapping, EquirectangularRefractionMapping, CubeReflectionMapping, CubeRefractionMapping } from 'three';
3
+ import { Vector3, DepthTexture, DepthStencilFormat, DepthFormat, UnsignedIntType, UnsignedInt248Type, LinearFilter, NearestFilter, EquirectangularReflectionMapping, EquirectangularRefractionMapping, CubeReflectionMapping, CubeRefractionMapping, UnsignedByteType } from 'three';
4
4
 
5
5
  const _size = new Vector3();
6
6
 
7
7
  class Textures extends DataMap {
8
8
 
9
- constructor( backend, info ) {
9
+ constructor( renderer, backend, info ) {
10
10
 
11
11
  super();
12
12
 
13
+ this.renderer = renderer;
13
14
  this.backend = backend;
14
15
  this.info = info;
15
16
 
@@ -47,8 +48,8 @@ class Textures extends DataMap {
47
48
  if ( depthTexture === undefined ) {
48
49
 
49
50
  depthTexture = new DepthTexture();
50
- depthTexture.format = DepthStencilFormat;
51
- depthTexture.type = UnsignedInt248Type;
51
+ depthTexture.format = renderTarget.stencilBuffer ? DepthStencilFormat : DepthFormat;
52
+ depthTexture.type = renderTarget.stencilBuffer ? UnsignedInt248Type : UnsignedIntType;
52
53
  depthTexture.image.width = mipWidth;
53
54
  depthTexture.image.height = mipHeight;
54
55
 
@@ -153,6 +154,25 @@ class Textures extends DataMap {
153
154
 
154
155
  //
155
156
 
157
+ if ( texture.isFramebufferTexture ) {
158
+
159
+ const renderer = this.renderer;
160
+ const renderTarget = renderer.getRenderTarget();
161
+
162
+ if ( renderTarget ) {
163
+
164
+ texture.type = renderTarget.texture.type;
165
+
166
+ } else {
167
+
168
+ texture.type = UnsignedByteType;
169
+
170
+ }
171
+
172
+ }
173
+
174
+ //
175
+
156
176
  const { width, height, depth } = this.getSize( texture );
157
177
 
158
178
  options.width = width;
@@ -214,7 +234,7 @@ class Textures extends DataMap {
214
234
 
215
235
  }
216
236
 
217
- backend.updateTexture( texture, options );
237
+ if ( texture.source.dataReady === true ) backend.updateTexture( texture, options );
218
238
 
219
239
  if ( options.needsMipmaps && texture.mipmaps.length === 0 ) backend.generateMipmaps( texture );
220
240
 
@@ -1,10 +1,11 @@
1
1
  class NodeBuilderState {
2
2
 
3
- constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes ) {
3
+ constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, transforms = [] ) {
4
4
 
5
5
  this.vertexShader = vertexShader;
6
6
  this.fragmentShader = fragmentShader;
7
7
  this.computeShader = computeShader;
8
+ this.transforms = transforms;
8
9
 
9
10
  this.nodeAttributes = nodeAttributes;
10
11
  this.bindings = bindings;
@@ -164,7 +164,7 @@ class Nodes extends DataMap {
164
164
 
165
165
  nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
166
166
 
167
- computeData.nodeBuilderState = nodeBuilder;
167
+ computeData.nodeBuilderState = nodeBuilderState;
168
168
 
169
169
  }
170
170
 
@@ -181,7 +181,8 @@ class Nodes extends DataMap {
181
181
  nodeBuilder.getAttributesArray(),
182
182
  nodeBuilder.getBindings(),
183
183
  nodeBuilder.updateNodes,
184
- nodeBuilder.updateBeforeNodes
184
+ nodeBuilder.updateBeforeNodes,
185
+ nodeBuilder.transforms
185
186
  );
186
187
 
187
188
  }
@@ -314,6 +315,7 @@ class Nodes extends DataMap {
314
315
  if ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) {
315
316
 
316
317
  nodeUV = equirectUV();
318
+ background.flipY = false;
317
319
 
318
320
  } else {
319
321