super-three 0.163.0 → 0.164.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 (114) hide show
  1. package/build/three.cjs +473 -245
  2. package/build/three.module.js +473 -245
  3. package/build/three.module.min.js +2 -2
  4. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  5. package/examples/jsm/exporters/GLTFExporter.js +45 -1
  6. package/examples/jsm/exporters/USDZExporter.js +7 -1
  7. package/examples/jsm/libs/draco/README.md +2 -2
  8. package/examples/jsm/loaders/EXRLoader.js +283 -99
  9. package/examples/jsm/loaders/GLTFLoader.js +53 -0
  10. package/examples/jsm/loaders/KTX2Loader.js +3 -6
  11. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  12. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  13. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  14. package/examples/jsm/math/Octree.js +26 -20
  15. package/examples/jsm/nodes/Nodes.js +4 -3
  16. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  17. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  18. package/examples/jsm/nodes/accessors/MaterialNode.js +107 -3
  19. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  20. package/examples/jsm/nodes/accessors/TextureNode.js +21 -3
  21. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  22. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  23. package/examples/jsm/nodes/core/Node.js +8 -0
  24. package/examples/jsm/nodes/core/NodeBuilder.js +5 -9
  25. package/examples/jsm/nodes/core/OutputStructNode.js +2 -1
  26. package/examples/jsm/nodes/core/PropertyNode.js +10 -0
  27. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  28. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  29. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  30. package/examples/jsm/nodes/display/ViewportNode.js +4 -2
  31. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  32. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  33. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  34. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  35. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  36. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  37. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +164 -10
  38. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  39. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +18 -4
  40. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  41. package/examples/jsm/nodes/lighting/EnvironmentNode.js +11 -2
  42. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  43. package/examples/jsm/nodes/lighting/LightsNode.js +11 -1
  44. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  45. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  46. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +10 -6
  47. package/examples/jsm/nodes/materials/Materials.js +1 -0
  48. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  49. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  50. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +76 -5
  51. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  52. package/examples/jsm/nodes/materials/NodeMaterial.js +31 -41
  53. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  54. package/examples/jsm/nodes/pmrem/PMREMUtils.js +1 -1
  55. package/examples/jsm/nodes/shadernode/ShaderNode.js +2 -8
  56. package/examples/jsm/physics/JoltPhysics.js +281 -0
  57. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  58. package/examples/jsm/renderers/common/Background.js +3 -3
  59. package/examples/jsm/renderers/common/ClippingContext.js +1 -1
  60. package/examples/jsm/renderers/common/RenderList.js +1 -1
  61. package/examples/jsm/renderers/common/RenderObject.js +43 -1
  62. package/examples/jsm/renderers/common/Renderer.js +129 -14
  63. package/examples/jsm/renderers/common/Textures.js +1 -1
  64. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +13 -17
  65. package/examples/jsm/renderers/common/nodes/Nodes.js +31 -47
  66. package/examples/jsm/renderers/webgl/WebGLBackend.js +7 -21
  67. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +5 -1
  68. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +6 -0
  69. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +21 -7
  70. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -21
  71. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +33 -45
  72. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +16 -1
  73. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -1
  74. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  75. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  76. package/examples/jsm/utils/SceneUtils.js +60 -1
  77. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  78. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  79. package/package.json +1 -1
  80. package/src/constants.js +1 -1
  81. package/src/core/RenderTarget.js +8 -0
  82. package/src/extras/PMREMGenerator.js +12 -11
  83. package/src/loaders/FileLoader.js +1 -1
  84. package/src/loaders/MaterialLoader.js +1 -0
  85. package/src/materials/Material.js +2 -0
  86. package/src/materials/MeshPhysicalMaterial.js +20 -0
  87. package/src/objects/BatchedMesh.js +23 -0
  88. package/src/objects/Line.js +66 -43
  89. package/src/renderers/WebGLRenderer.js +92 -61
  90. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  91. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  92. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  93. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  94. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  95. package/src/renderers/shaders/ShaderChunk.js +0 -2
  96. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  97. package/src/renderers/shaders/ShaderLib.js +1 -0
  98. package/src/renderers/webgl/WebGLBackground.js +18 -3
  99. package/src/renderers/webgl/WebGLBufferRenderer.js +36 -0
  100. package/src/renderers/webgl/WebGLCapabilities.js +33 -1
  101. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +36 -0
  102. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  103. package/src/renderers/webgl/WebGLProgram.js +3 -5
  104. package/src/renderers/webgl/WebGLPrograms.js +5 -0
  105. package/src/renderers/webgl/WebGLRenderStates.js +6 -2
  106. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  107. package/src/renderers/webgl/WebGLTextures.js +68 -60
  108. package/src/renderers/webgl/WebGLUtils.js +3 -21
  109. package/src/renderers/webxr/WebXRManager.js +2 -4
  110. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -318
  111. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  112. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -792
  113. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  114. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -12,7 +12,9 @@ import Background from './Background.js';
12
12
  import Nodes from './nodes/Nodes.js';
13
13
  import Color4 from './Color4.js';
14
14
  import ClippingContext from './ClippingContext.js';
15
- import { Scene, Frustum, Matrix4, Vector2, Vector3, Vector4, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping } from 'three';
15
+ import { Scene, Frustum, Matrix4, Vector2, Vector3, Vector4, DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoColorSpace, NoToneMapping, LinearFilter, LinearSRGBColorSpace, RenderTarget, HalfFloatType, RGBAFormat } from 'three';
16
+ import { NodeMaterial } from '../../nodes/Nodes.js';
17
+ import QuadMesh from '../../objects/QuadMesh.js';
16
18
 
17
19
  const _scene = new Scene();
18
20
  const _drawingBufferSize = new Vector2();
@@ -20,6 +22,7 @@ const _screen = new Vector4();
20
22
  const _frustum = new Frustum();
21
23
  const _projScreenMatrix = new Matrix4();
22
24
  const _vector3 = new Vector3();
25
+ const _quad = new QuadMesh( new NodeMaterial() );
23
26
 
24
27
  class Renderer {
25
28
 
@@ -63,6 +66,10 @@ class Renderer {
63
66
 
64
67
  this.info = new Info();
65
68
 
69
+ // nodes
70
+
71
+ this.toneMappingNode = null;
72
+
66
73
  // internals
67
74
 
68
75
  this._pixelRatio = 1;
@@ -90,6 +97,7 @@ class Renderer {
90
97
  this._opaqueSort = null;
91
98
  this._transparentSort = null;
92
99
 
100
+ this._frameBufferTarget = null;
93
101
 
94
102
  const alphaClear = this.alpha === true ? 0 : 1;
95
103
 
@@ -332,7 +340,56 @@ class Renderer {
332
340
 
333
341
  }
334
342
 
335
- _renderScene( scene, camera ) {
343
+ _getFrameBufferTarget() {
344
+
345
+ const { currentColorSpace } = this;
346
+
347
+ const useToneMapping = this._renderTarget === null && ( this.toneMapping !== NoToneMapping || this.toneMappingNode !== null );
348
+ const useColorSpace = currentColorSpace !== LinearSRGBColorSpace && currentColorSpace !== NoColorSpace;
349
+
350
+ if ( useToneMapping === false && useColorSpace === false ) return null;
351
+
352
+ const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
353
+ const { depth, stencil } = this;
354
+
355
+ let frameBufferTarget = this._frameBufferTarget;
356
+
357
+ if ( frameBufferTarget === null ) {
358
+
359
+ frameBufferTarget = new RenderTarget( width, height, {
360
+ depthBuffer: depth,
361
+ stencilBuffer: stencil,
362
+ type: HalfFloatType, // FloatType
363
+ format: RGBAFormat,
364
+ colorSpace: LinearSRGBColorSpace,
365
+ generateMipmaps: false,
366
+ minFilter: LinearFilter,
367
+ magFilter: LinearFilter,
368
+ samples: this.backend.parameters.antialias ? 4 : 0
369
+ } );
370
+
371
+ frameBufferTarget.isPostProcessingRenderTarget = true;
372
+
373
+ this._frameBufferTarget = frameBufferTarget;
374
+
375
+ }
376
+
377
+ frameBufferTarget.depthBuffer = depth;
378
+ frameBufferTarget.stencilBuffer = stencil;
379
+ frameBufferTarget.setSize( width, height );
380
+ frameBufferTarget.viewport.copy( this._viewport );
381
+ frameBufferTarget.scissor.copy( this._scissor );
382
+ frameBufferTarget.viewport.multiplyScalar( this._pixelRatio );
383
+ frameBufferTarget.scissor.multiplyScalar( this._pixelRatio );
384
+ frameBufferTarget.scissorTest = this._scissorTest;
385
+
386
+ return frameBufferTarget;
387
+
388
+ }
389
+
390
+ _renderScene( scene, camera, useFrameBufferTarget = true ) {
391
+
392
+ const frameBufferTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : null;
336
393
 
337
394
  // preserve render tree
338
395
 
@@ -346,11 +403,31 @@ class Renderer {
346
403
 
347
404
  const sceneRef = ( scene.isScene === true ) ? scene : _scene;
348
405
 
349
- const renderTarget = this._renderTarget;
350
- const renderContext = this._renderContexts.get( scene, camera, renderTarget );
406
+ const outputRenderTarget = this._renderTarget;
407
+
351
408
  const activeCubeFace = this._activeCubeFace;
352
409
  const activeMipmapLevel = this._activeMipmapLevel;
353
410
 
411
+ //
412
+
413
+ let renderTarget;
414
+
415
+ if ( frameBufferTarget !== null ) {
416
+
417
+ renderTarget = frameBufferTarget;
418
+
419
+ this.setRenderTarget( renderTarget );
420
+
421
+ } else {
422
+
423
+ renderTarget = outputRenderTarget;
424
+
425
+ }
426
+
427
+ //
428
+
429
+ const renderContext = this._renderContexts.get( scene, camera, renderTarget );
430
+
354
431
  this._currentRenderContext = renderContext;
355
432
  this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject;
356
433
 
@@ -505,6 +582,18 @@ class Renderer {
505
582
 
506
583
  //
507
584
 
585
+ if ( frameBufferTarget !== null ) {
586
+
587
+ this.setRenderTarget( outputRenderTarget, activeCubeFace, activeMipmapLevel );
588
+
589
+ _quad.material.fragmentNode = this._nodes.getOutputNode( renderTarget.texture );
590
+
591
+ this._renderScene( _quad, _quad.camera, false );
592
+
593
+ }
594
+
595
+ //
596
+
508
597
  sceneRef.onAfterRender( this, scene, camera, renderTarget );
509
598
 
510
599
  //
@@ -769,8 +858,9 @@ class Renderer {
769
858
 
770
859
  }
771
860
 
861
+ const renderTarget = this._renderTarget || this._getFrameBufferTarget();
862
+
772
863
  let renderTargetData = null;
773
- const renderTarget = this._renderTarget;
774
864
 
775
865
  if ( renderTarget !== null ) {
776
866
 
@@ -964,14 +1054,24 @@ class Renderer {
964
1054
 
965
1055
  }
966
1056
 
967
- hasFeatureAsync( name ) {
1057
+ async hasFeatureAsync( name ) {
1058
+
1059
+ if ( this._initialized === false ) await this.init();
968
1060
 
969
- return this.backend.hasFeatureAsync( name );
1061
+ return this.backend.hasFeature( name );
970
1062
 
971
1063
  }
972
1064
 
973
1065
  hasFeature( name ) {
974
1066
 
1067
+ if ( this._initialized === false ) {
1068
+
1069
+ console.warn( 'THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead.' );
1070
+
1071
+ return false;
1072
+
1073
+ }
1074
+
975
1075
  return this.backend.hasFeature( name );
976
1076
 
977
1077
  }
@@ -996,9 +1096,9 @@ class Renderer {
996
1096
  }
997
1097
 
998
1098
 
999
- readRenderTargetPixelsAsync( renderTarget, x, y, width, height ) {
1099
+ readRenderTargetPixelsAsync( renderTarget, x, y, width, height, index = 0 ) {
1000
1100
 
1001
- return this.backend.copyTextureToBuffer( renderTarget.texture, x, y, width, height );
1101
+ return this.backend.copyTextureToBuffer( renderTarget.textures[ index ], x, y, width, height );
1002
1102
 
1003
1103
  }
1004
1104
 
@@ -1158,6 +1258,7 @@ class Renderer {
1158
1258
 
1159
1259
  let overridePositionNode;
1160
1260
  let overrideFragmentNode;
1261
+ let overrideDepthNode;
1161
1262
 
1162
1263
  //
1163
1264
 
@@ -1174,7 +1275,6 @@ class Renderer {
1174
1275
  if ( material.positionNode && material.positionNode.isNode ) {
1175
1276
 
1176
1277
  overridePositionNode = overrideMaterial.positionNode;
1177
-
1178
1278
  overrideMaterial.positionNode = material.positionNode;
1179
1279
 
1180
1280
  }
@@ -1183,6 +1283,14 @@ class Renderer {
1183
1283
 
1184
1284
  overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide;
1185
1285
 
1286
+ if ( material.depthNode && material.depthNode.isNode ) {
1287
+
1288
+ overrideDepthNode = overrideMaterial.depthNode;
1289
+ overrideMaterial.depthNode = material.depthNode;
1290
+
1291
+ }
1292
+
1293
+
1186
1294
  if ( material.shadowNode && material.shadowNode.isNode ) {
1187
1295
 
1188
1296
  overrideFragmentNode = overrideMaterial.fragmentNode;
@@ -1227,16 +1335,16 @@ class Renderer {
1227
1335
  if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
1228
1336
 
1229
1337
  material.side = BackSide;
1230
- this._handleObjectFunction( object, material, scene, camera, lightsNode, 'backSide' ); // create backSide pass id
1338
+ this._handleObjectFunction( object, material, scene, camera, lightsNode, group, 'backSide' ); // create backSide pass id
1231
1339
 
1232
1340
  material.side = FrontSide;
1233
- this._handleObjectFunction( object, material, scene, camera, lightsNode ); // use default pass id
1341
+ this._handleObjectFunction( object, material, scene, camera, lightsNode, group ); // use default pass id
1234
1342
 
1235
1343
  material.side = DoubleSide;
1236
1344
 
1237
1345
  } else {
1238
1346
 
1239
- this._handleObjectFunction( object, material, scene, camera, lightsNode );
1347
+ this._handleObjectFunction( object, material, scene, camera, lightsNode, group );
1240
1348
 
1241
1349
  }
1242
1350
 
@@ -1248,6 +1356,12 @@ class Renderer {
1248
1356
 
1249
1357
  }
1250
1358
 
1359
+ if ( overrideDepthNode !== undefined ) {
1360
+
1361
+ scene.overrideMaterial.depthNode = overrideDepthNode;
1362
+
1363
+ }
1364
+
1251
1365
  if ( overrideFragmentNode !== undefined ) {
1252
1366
 
1253
1367
  scene.overrideMaterial.fragmentNode = overrideFragmentNode;
@@ -1260,9 +1374,10 @@ class Renderer {
1260
1374
 
1261
1375
  }
1262
1376
 
1263
- _renderObjectDirect( object, material, scene, camera, lightsNode, passId ) {
1377
+ _renderObjectDirect( object, material, scene, camera, lightsNode, group, passId ) {
1264
1378
 
1265
1379
  const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, passId );
1380
+ renderObject.drawRange = group || object.geometry.drawRange;
1266
1381
 
1267
1382
  //
1268
1383
 
@@ -38,7 +38,7 @@ class Textures extends DataMap {
38
38
 
39
39
  depthTexture = new DepthTexture();
40
40
  depthTexture.format = renderTarget.stencilBuffer ? DepthStencilFormat : DepthFormat;
41
- depthTexture.type = renderTarget.stencilBuffer ? UnsignedInt248Type : UnsignedIntType;
41
+ depthTexture.type = renderTarget.stencilBuffer ? UnsignedInt248Type : UnsignedIntType; // FloatType
42
42
  depthTexture.image.width = mipWidth;
43
43
  depthTexture.image.height = mipHeight;
44
44
 
@@ -20,7 +20,6 @@ import {
20
20
  CubeRefractionMapping,
21
21
  CubeUVReflectionMapping,
22
22
  LinearFilter,
23
- NoToneMapping,
24
23
  NoBlending,
25
24
  RGBAFormat,
26
25
  HalfFloatType,
@@ -57,16 +56,16 @@ const INV_PHI = 1 / PHI;
57
56
  // Vertices of a dodecahedron (except the opposites, which represent the
58
57
  // same axis), used as axis directions evenly spread on a sphere.
59
58
  const _axisDirections = [
60
- /*@__PURE__*/ new Vector3( 1, 1, 1 ),
61
- /*@__PURE__*/ new Vector3( - 1, 1, 1 ),
62
- /*@__PURE__*/ new Vector3( 1, 1, - 1 ),
63
- /*@__PURE__*/ new Vector3( - 1, 1, - 1 ),
64
- /*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),
65
- /*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),
66
- /*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),
67
- /*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),
59
+ /*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ),
68
60
  /*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),
69
- /*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 )
61
+ /*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),
62
+ /*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),
63
+ /*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),
64
+ /*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),
65
+ /*@__PURE__*/ new Vector3( - 1, 1, - 1 ),
66
+ /*@__PURE__*/ new Vector3( 1, 1, - 1 ),
67
+ /*@__PURE__*/ new Vector3( - 1, 1, 1 ),
68
+ /*@__PURE__*/ new Vector3( 1, 1, 1 )
70
69
  ];
71
70
 
72
71
  //
@@ -338,10 +337,9 @@ class PMREMGenerator {
338
337
  const renderer = this._renderer;
339
338
 
340
339
  const originalAutoClear = renderer.autoClear;
341
- const toneMapping = renderer.toneMapping;
340
+
342
341
  renderer.getClearColor( _clearColor );
343
342
 
344
- renderer.toneMapping = NoToneMapping;
345
343
  renderer.autoClear = false;
346
344
 
347
345
  let backgroundBox = this._backgroundBox;
@@ -418,7 +416,6 @@ class PMREMGenerator {
418
416
 
419
417
  }
420
418
 
421
- renderer.toneMapping = toneMapping;
422
419
  renderer.autoClear = originalAutoClear;
423
420
  scene.background = background;
424
421
 
@@ -468,12 +465,13 @@ class PMREMGenerator {
468
465
  const renderer = this._renderer;
469
466
  const autoClear = renderer.autoClear;
470
467
  renderer.autoClear = false;
468
+ const n = this._lodPlanes.length;
471
469
 
472
- for ( let i = 1; i < this._lodPlanes.length; i ++ ) {
470
+ for ( let i = 1; i < n; i ++ ) {
473
471
 
474
472
  const sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );
475
473
 
476
- const poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];
474
+ const poleAxis = _axisDirections[ ( n - i - 1 ) % _axisDirections.length ];
477
475
 
478
476
  this._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );
479
477
 
@@ -709,8 +707,6 @@ function _setViewport( target, x, y, width, height ) {
709
707
  function _getMaterial() {
710
708
 
711
709
  const material = new NodeMaterial();
712
- material.colorSpaced = false;
713
- material.toneMapped = false;
714
710
  material.depthTest = false;
715
711
  material.depthWrite = false;
716
712
  material.blending = NoBlending;
@@ -1,8 +1,8 @@
1
1
  import DataMap from '../DataMap.js';
2
2
  import ChainMap from '../ChainMap.js';
3
3
  import NodeBuilderState from './NodeBuilderState.js';
4
- import { NoToneMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from 'three';
5
- import { NodeFrame, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping, viewportBottomLeft, normalWorld, pmremTexture } from '../../../nodes/Nodes.js';
4
+ import { EquirectangularReflectionMapping, EquirectangularRefractionMapping, NoToneMapping, SRGBColorSpace } from 'three';
5
+ import { NodeFrame, vec4, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, viewportBottomLeft, normalWorld, pmremTexture, viewportTopLeft } from '../../../nodes/Nodes.js';
6
6
 
7
7
  class Nodes extends DataMap {
8
8
 
@@ -113,7 +113,6 @@ class Nodes extends DataMap {
113
113
  nodeBuilder.lightsNode = renderObject.lightsNode;
114
114
  nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
115
115
  nodeBuilder.fogNode = this.getFogNode( renderObject.scene );
116
- nodeBuilder.toneMappingNode = this.getToneMappingNode();
117
116
  nodeBuilder.clippingContext = renderObject.clippingContext;
118
117
  nodeBuilder.build();
119
118
 
@@ -206,14 +205,6 @@ class Nodes extends DataMap {
206
205
 
207
206
  }
208
207
 
209
- getToneMappingNode() {
210
-
211
- if ( this.isToneMappingState === false ) return null;
212
-
213
- return this.renderer.toneMappingNode || this.get( this.renderer ).toneMappingNode || null;
214
-
215
- }
216
-
217
208
  getCacheKey( scene, lightsNode ) {
218
209
 
219
210
  const chain = [ scene, lightsNode ];
@@ -225,14 +216,12 @@ class Nodes extends DataMap {
225
216
 
226
217
  const environmentNode = this.getEnvironmentNode( scene );
227
218
  const fogNode = this.getFogNode( scene );
228
- const toneMappingNode = this.getToneMappingNode();
229
219
 
230
220
  const cacheKey = [];
231
221
 
232
222
  if ( lightsNode ) cacheKey.push( lightsNode.getCacheKey() );
233
223
  if ( environmentNode ) cacheKey.push( environmentNode.getCacheKey() );
234
224
  if ( fogNode ) cacheKey.push( fogNode.getCacheKey() );
235
- if ( toneMappingNode ) cacheKey.push( toneMappingNode.getCacheKey() );
236
225
 
237
226
  cacheKeyData = {
238
227
  callId,
@@ -252,45 +241,12 @@ class Nodes extends DataMap {
252
241
  this.updateEnvironment( scene );
253
242
  this.updateFog( scene );
254
243
  this.updateBackground( scene );
255
- this.updateToneMapping();
256
244
 
257
245
  }
258
246
 
259
247
  get isToneMappingState() {
260
248
 
261
- const renderer = this.renderer;
262
- const renderTarget = renderer.getRenderTarget();
263
-
264
- return renderTarget && renderTarget.isCubeRenderTarget ? false : true;
265
-
266
- }
267
-
268
- updateToneMapping() {
269
-
270
- const renderer = this.renderer;
271
- const rendererData = this.get( renderer );
272
- const rendererToneMapping = renderer.toneMapping;
273
-
274
- if ( this.isToneMappingState && rendererToneMapping !== NoToneMapping ) {
275
-
276
- if ( rendererData.toneMapping !== rendererToneMapping ) {
277
-
278
- const rendererToneMappingNode = rendererData.rendererToneMappingNode || toneMapping( rendererToneMapping );
279
- rendererToneMappingNode.toneMapping = rendererToneMapping;
280
-
281
- rendererData.rendererToneMappingNode = rendererToneMappingNode;
282
- rendererData.toneMappingNode = rendererToneMappingNode;
283
- rendererData.toneMapping = rendererToneMapping;
284
-
285
- }
286
-
287
- } else {
288
-
289
- // Don't delete rendererData.rendererToneMappingNode
290
- delete rendererData.toneMappingNode;
291
- delete rendererData.toneMapping;
292
-
293
- }
249
+ return this.renderer.getRenderTarget() ? false : true;
294
250
 
295
251
  }
296
252
 
@@ -430,6 +386,34 @@ class Nodes extends DataMap {
430
386
 
431
387
  }
432
388
 
389
+ getOutputNode( outputTexture ) {
390
+
391
+ let output = texture( outputTexture, viewportTopLeft );
392
+
393
+ if ( this.isToneMappingState ) {
394
+
395
+ if ( this.renderer.toneMappingNode ) {
396
+
397
+ output = vec4( this.renderer.toneMappingNode.context( { color: output.rgb } ), output.a );
398
+
399
+ } else if ( this.renderer.toneMapping !== NoToneMapping ) {
400
+
401
+ output = output.toneMapping( this.renderer.toneMapping );
402
+
403
+ }
404
+
405
+ }
406
+
407
+ if ( this.renderer.currentColorSpace === SRGBColorSpace ) {
408
+
409
+ output = output.linearToColorSpace( this.renderer.currentColorSpace );
410
+
411
+ }
412
+
413
+ return output;
414
+
415
+ }
416
+
433
417
  updateBefore( renderObject ) {
434
418
 
435
419
  const nodeFrame = this.getNodeFrameForRender( renderObject );
@@ -173,6 +173,7 @@ class WebGLBackend extends Backend {
173
173
  //
174
174
 
175
175
  //
176
+
176
177
  this.initTimestampQuery( renderContext );
177
178
 
178
179
  renderContextData.previousContext = this._currentContext;
@@ -568,7 +569,7 @@ class WebGLBackend extends Backend {
568
569
 
569
570
  draw( renderObject, info ) {
570
571
 
571
- const { pipeline, material, context } = renderObject;
572
+ const { object, pipeline, material, context } = renderObject;
572
573
  const { programGPU } = this.get( pipeline );
573
574
 
574
575
  const { gl, state } = this;
@@ -579,7 +580,9 @@ class WebGLBackend extends Backend {
579
580
 
580
581
  this._bindUniforms( renderObject.getBindings() );
581
582
 
582
- state.setMaterial( material );
583
+ const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
584
+
585
+ state.setMaterial( material, frontFaceCW );
583
586
 
584
587
  gl.useProgram( programGPU );
585
588
 
@@ -611,9 +614,8 @@ class WebGLBackend extends Backend {
611
614
 
612
615
  const index = renderObject.getIndex();
613
616
 
614
- const object = renderObject.object;
615
617
  const geometry = renderObject.geometry;
616
- const drawRange = geometry.drawRange;
618
+ const drawRange = renderObject.drawRange;
617
619
  const firstVertex = drawRange.start;
618
620
 
619
621
  //
@@ -699,16 +701,7 @@ class WebGLBackend extends Backend {
699
701
 
700
702
  if ( object.isBatchedMesh ) {
701
703
 
702
- if ( instanceCount > 1 ) {
703
-
704
- // TODO: Better support with InstancedBatchedMesh
705
- if ( object._multiDrawInstances === undefined ) {
706
-
707
- object._multiDrawInstances = new Int32Array( object._maxGeometryCount );
708
-
709
- }
710
-
711
- object._multiDrawInstances.fill( instanceCount );
704
+ if ( object._multiDrawInstances !== null ) {
712
705
 
713
706
  renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
714
707
 
@@ -1115,12 +1108,6 @@ class WebGLBackend extends Backend {
1115
1108
 
1116
1109
  }
1117
1110
 
1118
- async hasFeatureAsync( name ) {
1119
-
1120
- return this.hasFeature( name );
1121
-
1122
- }
1123
-
1124
1111
  hasFeature( name ) {
1125
1112
 
1126
1113
  const keysMatching = Object.keys( GLFeatureName ).filter( key => GLFeatureName[ key ] === name );
@@ -1129,7 +1116,6 @@ class WebGLBackend extends Backend {
1129
1116
 
1130
1117
  for ( let i = 0; i < keysMatching.length; i ++ ) {
1131
1118
 
1132
-
1133
1119
  if ( extensions.has( keysMatching[ i ] ) ) return true;
1134
1120
 
1135
1121
  }
@@ -127,7 +127,11 @@ class WebGLBufferRenderer {
127
127
 
128
128
  }
129
129
 
130
- info.update( object, elementCount, mode, primcount );
130
+ for ( let i = 0; i < primcount.length; i ++ ) {
131
+
132
+ info.update( object, elementCount, mode, primcount[ i ] );
133
+
134
+ }
131
135
 
132
136
  }
133
137
 
@@ -246,6 +246,12 @@ ${ flowData.code }
246
246
 
247
247
  }
248
248
 
249
+ generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet ) {
250
+
251
+ return `textureGrad( ${ textureProperty }, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
252
+
253
+ }
254
+
249
255
  generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
250
256
 
251
257
  if ( shaderStage === 'fragment' ) {
@@ -576,20 +576,35 @@ class WebGLTextureUtils {
576
576
  const width = texture.image.width;
577
577
  const height = texture.image.height;
578
578
 
579
- if ( texture.isDepthTexture ) {
579
+ const requireDrawFrameBuffer = texture.isDepthTexture === true || ( renderContext.renderTarget && renderContext.renderTarget.samples > 0 );
580
580
 
581
- let mask = gl.DEPTH_BUFFER_BIT;
581
+ if ( requireDrawFrameBuffer ) {
582
582
 
583
- if ( renderContext.stencil ) {
583
+ let mask;
584
+ let attachment;
584
585
 
585
- mask |= gl.STENCIL_BUFFER_BIT;
586
+ if ( texture.isDepthTexture === true ) {
587
+
588
+ mask = gl.DEPTH_BUFFER_BIT;
589
+ attachment = gl.DEPTH_ATTACHMENT;
590
+
591
+ if ( renderContext.stencil ) {
592
+
593
+ mask |= gl.STENCIL_BUFFER_BIT;
594
+
595
+ }
596
+
597
+ } else {
598
+
599
+ mask = gl.COLOR_BUFFER_BIT;
600
+ attachment = gl.COLOR_ATTACHMENT0;
586
601
 
587
602
  }
588
603
 
589
604
  const fb = gl.createFramebuffer();
590
605
  state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
591
606
 
592
- gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, textureGPU, 0 );
607
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureGPU, 0 );
593
608
 
594
609
  gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, gl.NEAREST );
595
610
 
@@ -626,7 +641,6 @@ class WebGLTextureUtils {
626
641
 
627
642
  if ( samples > 0 ) {
628
643
 
629
-
630
644
  if ( depthTexture && depthTexture.isDepthTexture ) {
631
645
 
632
646
  if ( depthTexture.type === gl.FLOAT ) {
@@ -692,7 +706,7 @@ class WebGLTextureUtils {
692
706
 
693
707
  await backend.utils._clientWaitAsync();
694
708
 
695
- const dstBuffer = new typedArrayType( elementCount );
709
+ const dstBuffer = new typedArrayType( byteLength / typedArrayType.BYTES_PER_ELEMENT );
696
710
 
697
711
  gl.bindBuffer( gl.PIXEL_PACK_BUFFER, buffer );
698
712
  gl.getBufferSubData( gl.PIXEL_PACK_BUFFER, 0, dstBuffer );
@@ -114,33 +114,15 @@ class WebGLUtils {
114
114
 
115
115
  }
116
116
 
117
- // ETC1
117
+ // ETC
118
118
 
119
- if ( p === RGB_ETC1_Format ) {
120
-
121
- extension = extensions.get( 'WEBGL_compressed_texture_etc1' );
122
-
123
- if ( extension !== null ) {
124
-
125
- return extension.COMPRESSED_RGB_ETC1_WEBGL;
126
-
127
- } else {
128
-
129
- return null;
130
-
131
- }
132
-
133
- }
134
-
135
- // ETC2
136
-
137
- if ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {
119
+ if ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {
138
120
 
139
121
  extension = extensions.get( 'WEBGL_compressed_texture_etc' );
140
122
 
141
123
  if ( extension !== null ) {
142
124
 
143
- if ( p === RGB_ETC2_Format ) return ( colorSpace === SRGBColorSpace ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;
125
+ if ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( colorSpace === SRGBColorSpace ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;
144
126
  if ( p === RGBA_ETC2_EAC_Format ) return ( colorSpace === SRGBColorSpace ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;
145
127
 
146
128
  } else {