super-three 0.162.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 (187) hide show
  1. package/build/three.cjs +847 -1226
  2. package/build/three.module.js +846 -1225
  3. package/build/three.module.min.js +2 -2
  4. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  5. package/examples/jsm/controls/TransformControls.js +3 -3
  6. package/examples/jsm/exporters/GLTFExporter.js +66 -5
  7. package/examples/jsm/exporters/USDZExporter.js +22 -1
  8. package/examples/jsm/geometries/TextGeometry.js +10 -2
  9. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  10. package/examples/jsm/libs/draco/README.md +2 -2
  11. package/examples/jsm/libs/fflate.module.js +694 -496
  12. package/examples/jsm/lines/LineMaterial.js +0 -2
  13. package/examples/jsm/loaders/3MFLoader.js +2 -0
  14. package/examples/jsm/loaders/EXRLoader.js +351 -97
  15. package/examples/jsm/loaders/FBXLoader.js +1 -1
  16. package/examples/jsm/loaders/GLTFLoader.js +59 -0
  17. package/examples/jsm/loaders/KTX2Loader.js +3 -10
  18. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  19. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  20. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  21. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  22. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  23. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  24. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  25. package/examples/jsm/math/Octree.js +26 -20
  26. package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
  27. package/examples/jsm/nodes/Nodes.js +10 -4
  28. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  29. package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
  30. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  31. package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
  32. package/examples/jsm/nodes/accessors/MaterialNode.js +107 -3
  33. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
  35. package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
  36. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
  38. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +51 -10
  40. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  41. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  42. package/examples/jsm/nodes/core/Node.js +63 -4
  43. package/examples/jsm/nodes/core/NodeBuilder.js +26 -25
  44. package/examples/jsm/nodes/core/NodeFrame.js +10 -10
  45. package/examples/jsm/nodes/core/NodeUtils.js +2 -2
  46. package/examples/jsm/nodes/core/OutputStructNode.js +2 -1
  47. package/examples/jsm/nodes/core/PropertyNode.js +10 -0
  48. package/examples/jsm/nodes/core/UniformNode.js +20 -0
  49. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  50. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  51. package/examples/jsm/nodes/display/PassNode.js +17 -1
  52. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
  53. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  54. package/examples/jsm/nodes/display/ViewportNode.js +4 -2
  55. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
  56. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  57. package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
  58. package/examples/jsm/nodes/fog/FogNode.js +13 -3
  59. package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
  60. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  61. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  62. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  63. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  64. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  65. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +164 -10
  66. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  67. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
  68. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  69. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -70
  70. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  71. package/examples/jsm/nodes/lighting/LightsNode.js +11 -1
  72. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  73. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  74. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +10 -6
  75. package/examples/jsm/nodes/materials/Materials.js +1 -0
  76. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  77. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  78. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +76 -5
  79. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  80. package/examples/jsm/nodes/materials/NodeMaterial.js +55 -43
  81. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  82. package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
  83. package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
  84. package/examples/jsm/nodes/shadernode/ShaderNode.js +3 -9
  85. package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
  86. package/examples/jsm/objects/QuadMesh.js +7 -23
  87. package/examples/jsm/physics/JoltPhysics.js +281 -0
  88. package/examples/jsm/physics/RapierPhysics.js +4 -4
  89. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  90. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  91. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  92. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  93. package/examples/jsm/postprocessing/SSAOPass.js +0 -3
  94. package/examples/jsm/renderers/common/Animation.js +3 -0
  95. package/examples/jsm/renderers/common/Background.js +8 -8
  96. package/examples/jsm/renderers/common/ClippingContext.js +1 -1
  97. package/examples/jsm/renderers/common/Info.js +11 -19
  98. package/examples/jsm/renderers/common/PostProcessing.js +12 -4
  99. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  100. package/examples/jsm/renderers/common/RenderList.js +1 -1
  101. package/examples/jsm/renderers/common/RenderObject.js +47 -5
  102. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  103. package/examples/jsm/renderers/common/Renderer.js +153 -21
  104. package/examples/jsm/renderers/common/Textures.js +1 -1
  105. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +773 -0
  106. package/examples/jsm/renderers/common/nodes/Nodes.js +34 -63
  107. package/examples/jsm/renderers/webgl/WebGLBackend.js +146 -36
  108. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +145 -0
  109. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +9 -3
  110. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
  111. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
  112. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +64 -7
  113. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +6 -23
  114. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +77 -60
  115. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +21 -4
  116. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +29 -1
  117. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
  118. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
  119. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  120. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  121. package/examples/jsm/utils/GPUStatsPanel.js +10 -45
  122. package/examples/jsm/utils/SceneUtils.js +60 -1
  123. package/examples/jsm/utils/TextureUtils.js +1 -1
  124. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  125. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  126. package/package.json +1 -1
  127. package/src/Three.js +0 -1
  128. package/src/animation/AnimationClip.js +1 -1
  129. package/src/constants.js +3 -3
  130. package/src/core/Object3D.js +10 -7
  131. package/src/core/RenderTarget.js +8 -0
  132. package/src/extras/PMREMGenerator.js +21 -11
  133. package/src/loaders/FileLoader.js +1 -1
  134. package/src/loaders/MaterialLoader.js +1 -0
  135. package/src/loaders/ObjectLoader.js +2 -0
  136. package/src/materials/Material.js +2 -0
  137. package/src/materials/MeshPhysicalMaterial.js +20 -0
  138. package/src/materials/ShaderMaterial.js +0 -4
  139. package/src/math/Spherical.js +4 -5
  140. package/src/objects/BatchedMesh.js +27 -3
  141. package/src/objects/InstancedMesh.js +10 -0
  142. package/src/objects/Line.js +66 -43
  143. package/src/renderers/WebGLRenderer.js +130 -158
  144. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  145. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  146. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  147. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  148. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  149. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  150. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
  151. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  152. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  153. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  154. package/src/renderers/shaders/ShaderChunk.js +0 -2
  155. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  156. package/src/renderers/shaders/ShaderLib.js +2 -1
  157. package/src/renderers/shaders/UniformsUtils.js +10 -1
  158. package/src/renderers/webgl/WebGLAttributes.js +6 -33
  159. package/src/renderers/webgl/WebGLBackground.js +18 -3
  160. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  161. package/src/renderers/webgl/WebGLBufferRenderer.js +35 -21
  162. package/src/renderers/webgl/WebGLCapabilities.js +35 -13
  163. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  164. package/src/renderers/webgl/WebGLExtensions.js +4 -19
  165. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +35 -21
  166. package/src/renderers/webgl/WebGLLights.js +6 -32
  167. package/src/renderers/webgl/WebGLMaterials.js +8 -3
  168. package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
  169. package/src/renderers/webgl/WebGLProgram.js +21 -52
  170. package/src/renderers/webgl/WebGLPrograms.js +24 -31
  171. package/src/renderers/webgl/WebGLRenderStates.js +13 -7
  172. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  173. package/src/renderers/webgl/WebGLState.js +15 -59
  174. package/src/renderers/webgl/WebGLTextures.js +138 -292
  175. package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
  176. package/src/renderers/webgl/WebGLUtils.js +9 -78
  177. package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
  178. package/src/renderers/webxr/WebXRManager.js +4 -6
  179. package/src/scenes/Scene.js +7 -1
  180. package/src/textures/Texture.js +11 -1
  181. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  182. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -320
  183. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  184. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -794
  185. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  186. package/src/renderers/WebGL1Renderer.js +0 -7
  187. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -3,9 +3,7 @@ import {
3
3
  BackSide,
4
4
  FrontSide,
5
5
  DoubleSide,
6
- RGBAFormat,
7
6
  HalfFloatType,
8
- FloatType,
9
7
  UnsignedByteType,
10
8
  NoToneMapping,
11
9
  LinearMipmapLinearFilter,
@@ -26,10 +24,8 @@ import {
26
24
  import { Color } from '../math/Color.js';
27
25
  import { Frustum } from '../math/Frustum.js';
28
26
  import { Matrix4 } from '../math/Matrix4.js';
29
- import { Vector2 } from '../math/Vector2.js';
30
27
  import { Vector3 } from '../math/Vector3.js';
31
28
  import { Vector4 } from '../math/Vector4.js';
32
- import { floorPowerOfTwo } from '../math/MathUtils.js';
33
29
  import { WebGLAnimation } from './webgl/WebGLAnimation.js';
34
30
  import { WebGLAttributes } from './webgl/WebGLAttributes.js';
35
31
  import { WebGLBackground } from './webgl/WebGLBackground.js';
@@ -71,7 +67,7 @@ class WebGLRenderer {
71
67
  canvas = createCanvasElement(),
72
68
  context = null,
73
69
  depth = true,
74
- stencil = true,
70
+ stencil = false,
75
71
  alpha = false,
76
72
  antialias = false,
77
73
  premultipliedAlpha = true,
@@ -87,6 +83,12 @@ class WebGLRenderer {
87
83
 
88
84
  if ( context !== null ) {
89
85
 
86
+ if ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {
87
+
88
+ throw new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );
89
+
90
+ }
91
+
90
92
  _alpha = context.getContextAttributes().alpha;
91
93
 
92
94
  } else {
@@ -199,15 +201,10 @@ class WebGLRenderer {
199
201
  let _clippingEnabled = false;
200
202
  let _localClippingEnabled = false;
201
203
 
202
- // transmission
203
-
204
- let _transmissionRenderTarget = null;
205
-
206
204
  // camera matrices cache
207
205
 
208
206
  const _projScreenMatrix = new Matrix4();
209
207
 
210
- const _vector2 = new Vector2();
211
208
  const _vector3 = new Vector3();
212
209
 
213
210
  const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };
@@ -222,17 +219,9 @@ class WebGLRenderer {
222
219
 
223
220
  let _gl = context;
224
221
 
225
- function getContext( contextNames, contextAttributes ) {
226
-
227
- for ( let i = 0; i < contextNames.length; i ++ ) {
222
+ function getContext( contextName, contextAttributes ) {
228
223
 
229
- const contextName = contextNames[ i ];
230
- const context = canvas.getContext( contextName, contextAttributes );
231
- if ( context !== null ) return context;
232
-
233
- }
234
-
235
- return null;
224
+ return canvas.getContext( contextName, contextAttributes );
236
225
 
237
226
  }
238
227
 
@@ -259,19 +248,13 @@ class WebGLRenderer {
259
248
 
260
249
  if ( _gl === null ) {
261
250
 
262
- const contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];
263
-
264
- if ( _this.isWebGL1Renderer === true ) {
265
-
266
- contextNames.shift();
267
-
268
- }
251
+ const contextName = 'webgl2';
269
252
 
270
- _gl = getContext( contextNames, contextAttributes );
253
+ _gl = getContext( contextName, contextAttributes );
271
254
 
272
255
  if ( _gl === null ) {
273
256
 
274
- if ( getContext( contextNames ) ) {
257
+ if ( getContext( contextName ) ) {
275
258
 
276
259
  throw new Error( 'Error creating WebGL context with your selected attributes.' );
277
260
 
@@ -285,24 +268,6 @@ class WebGLRenderer {
285
268
 
286
269
  }
287
270
 
288
- if ( typeof WebGLRenderingContext !== 'undefined' && _gl instanceof WebGLRenderingContext ) { // @deprecated, r153
289
-
290
- console.warn( 'THREE.WebGLRenderer: WebGL 1 support was deprecated in r153 and will be removed in r163.' );
291
-
292
- }
293
-
294
- // Some experimental-webgl implementations do not have getShaderPrecisionFormat
295
-
296
- if ( _gl.getShaderPrecisionFormat === undefined ) {
297
-
298
- _gl.getShaderPrecisionFormat = function () {
299
-
300
- return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };
301
-
302
- };
303
-
304
- }
305
-
306
271
  } catch ( error ) {
307
272
 
308
273
  console.error( 'THREE.WebGLRenderer: ' + error.message );
@@ -322,22 +287,21 @@ class WebGLRenderer {
322
287
  function initGLContext() {
323
288
 
324
289
  extensions = new WebGLExtensions( _gl );
290
+ extensions.init();
325
291
 
326
- capabilities = new WebGLCapabilities( _gl, extensions, parameters );
327
-
328
- extensions.init( capabilities );
292
+ utils = new WebGLUtils( _gl, extensions );
329
293
 
330
- utils = new WebGLUtils( _gl, extensions, capabilities );
294
+ capabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );
331
295
 
332
- state = new WebGLState( _gl, extensions, capabilities );
296
+ state = new WebGLState( _gl );
333
297
 
334
298
  info = new WebGLInfo( _gl );
335
299
  properties = new WebGLProperties();
336
300
  textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );
337
301
  cubemaps = new WebGLCubeMaps( _this );
338
302
  cubeuvmaps = new WebGLCubeUVMaps( _this );
339
- attributes = new WebGLAttributes( _gl, capabilities );
340
- bindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );
303
+ attributes = new WebGLAttributes( _gl );
304
+ bindingStates = new WebGLBindingStates( _gl, attributes );
341
305
  geometries = new WebGLGeometries( _gl, attributes, info, bindingStates );
342
306
  objects = new WebGLObjects( _gl, geometries, attributes, info );
343
307
  morphtargets = new WebGLMorphtargets( _gl, capabilities, textures );
@@ -345,14 +309,14 @@ class WebGLRenderer {
345
309
  programCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );
346
310
  materials = new WebGLMaterials( _this, properties );
347
311
  renderLists = new WebGLRenderLists();
348
- renderStates = new WebGLRenderStates( extensions, capabilities );
312
+ renderStates = new WebGLRenderStates( extensions );
349
313
  background = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );
350
314
  multiview = new WebGLMultiview( _this, extensions, _gl );
351
315
  shadowMap = new WebGLShadowMap( _this, objects, capabilities );
352
316
  uniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );
353
317
 
354
- bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );
355
- indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );
318
+ bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );
319
+ indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );
356
320
 
357
321
  info.programs = programCache.programs;
358
322
 
@@ -684,13 +648,6 @@ class WebGLRenderer {
684
648
  xr.removeEventListener( 'sessionstart', onXRSessionStart );
685
649
  xr.removeEventListener( 'sessionend', onXRSessionEnd );
686
650
 
687
- if ( _transmissionRenderTarget ) {
688
-
689
- _transmissionRenderTarget.dispose();
690
- _transmissionRenderTarget = null;
691
-
692
- }
693
-
694
651
  animation.stop();
695
652
 
696
653
  };
@@ -901,7 +858,15 @@ class WebGLRenderer {
901
858
 
902
859
  if ( object.isBatchedMesh ) {
903
860
 
904
- renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
861
+ if ( object._multiDrawInstances !== null ) {
862
+
863
+ renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
864
+
865
+ } else {
866
+
867
+ renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
868
+
869
+ }
905
870
 
906
871
  } else if ( object.isInstancedMesh ) {
907
872
 
@@ -951,7 +916,7 @@ class WebGLRenderer {
951
916
  if ( targetScene === null ) targetScene = scene;
952
917
 
953
918
  currentRenderState = renderStates.get( targetScene );
954
- currentRenderState.init();
919
+ currentRenderState.init( camera );
955
920
 
956
921
  renderStateStack.push( currentRenderState );
957
922
 
@@ -1168,7 +1133,7 @@ class WebGLRenderer {
1168
1133
  if ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );
1169
1134
 
1170
1135
  currentRenderState = renderStates.get( scene, renderStateStack.length );
1171
- currentRenderState.init();
1136
+ currentRenderState.init( camera );
1172
1137
 
1173
1138
  renderStateStack.push( currentRenderState );
1174
1139
 
@@ -1193,6 +1158,13 @@ class WebGLRenderer {
1193
1158
 
1194
1159
  }
1195
1160
 
1161
+ const renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;
1162
+ if ( renderBackground ) {
1163
+
1164
+ background.addToRenderList( currentRenderList, scene );
1165
+
1166
+ }
1167
+
1196
1168
  //
1197
1169
 
1198
1170
  this.info.render.frame ++;
@@ -1209,20 +1181,30 @@ class WebGLRenderer {
1209
1181
 
1210
1182
  if ( this.info.autoReset === true ) this.info.reset();
1211
1183
 
1184
+ // render scene
1212
1185
 
1213
- //
1186
+ const opaqueObjects = currentRenderList.opaque;
1187
+ const transmissiveObjects = currentRenderList.transmissive;
1214
1188
 
1215
- if ( xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false ) {
1189
+ currentRenderState.setupLights( _this._useLegacyLights );
1216
1190
 
1217
- background.render( currentRenderList, scene );
1191
+ if ( camera.isArrayCamera ) {
1218
1192
 
1219
- }
1193
+ const cameras = camera.cameras;
1220
1194
 
1221
- // render scene
1195
+ if ( transmissiveObjects.length > 0 ) {
1222
1196
 
1223
- currentRenderState.setupLights( _this._useLegacyLights );
1197
+ for ( let i = 0, l = cameras.length; i < l; i ++ ) {
1224
1198
 
1225
- if ( camera.isArrayCamera ) {
1199
+ const camera2 = cameras[ i ];
1200
+
1201
+ renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );
1202
+
1203
+ }
1204
+
1205
+ }
1206
+
1207
+ if ( renderBackground ) background.render( scene );
1226
1208
 
1227
1209
  if ( xr.enabled && xr.isMultiview ) {
1228
1210
 
@@ -1232,8 +1214,6 @@ class WebGLRenderer {
1232
1214
 
1233
1215
  } else {
1234
1216
 
1235
- const cameras = camera.cameras;
1236
-
1237
1217
  for ( let i = 0, l = cameras.length; i < l; i ++ ) {
1238
1218
 
1239
1219
  const camera2 = cameras[ i ];
@@ -1246,6 +1226,10 @@ class WebGLRenderer {
1246
1226
 
1247
1227
  } else {
1248
1228
 
1229
+ if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );
1230
+
1231
+ if ( renderBackground ) background.render( scene );
1232
+
1249
1233
  renderScene( currentRenderList, scene, camera );
1250
1234
 
1251
1235
  }
@@ -1287,6 +1271,8 @@ class WebGLRenderer {
1287
1271
 
1288
1272
  currentRenderState = renderStateStack[ renderStateStack.length - 1 ];
1289
1273
 
1274
+ if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );
1275
+
1290
1276
  } else {
1291
1277
 
1292
1278
  currentRenderState = null;
@@ -1431,8 +1417,6 @@ class WebGLRenderer {
1431
1417
 
1432
1418
  if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );
1433
1419
 
1434
- if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );
1435
-
1436
1420
  if ( viewport ) state.viewport( _currentViewport.copy( viewport ) );
1437
1421
 
1438
1422
  if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );
@@ -1459,15 +1443,16 @@ class WebGLRenderer {
1459
1443
 
1460
1444
  }
1461
1445
 
1462
- const isWebGL2 = capabilities.isWebGL2;
1446
+ if ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {
1463
1447
 
1464
- if ( _transmissionRenderTarget === null ) {
1465
-
1466
- _transmissionRenderTarget = new WebGLRenderTarget( 1, 1, {
1448
+ currentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {
1467
1449
  generateMipmaps: true,
1468
- type: extensions.has( 'EXT_color_buffer_half_float' ) ? HalfFloatType : UnsignedByteType,
1450
+ type: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,
1469
1451
  minFilter: LinearMipmapLinearFilter,
1470
- samples: ( isWebGL2 ) ? 4 : 0
1452
+ samples: 4,
1453
+ stencilBuffer: stencil,
1454
+ resolveDepthBuffer: false,
1455
+ resolveStencilBuffer: false
1471
1456
  } );
1472
1457
 
1473
1458
  // debug
@@ -1482,22 +1467,15 @@ class WebGLRenderer {
1482
1467
 
1483
1468
  }
1484
1469
 
1485
- _this.getDrawingBufferSize( _vector2 );
1486
-
1487
- if ( isWebGL2 ) {
1488
-
1489
- _transmissionRenderTarget.setSize( _vector2.x, _vector2.y );
1490
-
1491
- } else {
1470
+ const transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];
1492
1471
 
1493
- _transmissionRenderTarget.setSize( floorPowerOfTwo( _vector2.x ), floorPowerOfTwo( _vector2.y ) );
1494
-
1495
- }
1472
+ const activeViewport = camera.viewport || _currentViewport;
1473
+ transmissionRenderTarget.setSize( activeViewport.z, activeViewport.w );
1496
1474
 
1497
1475
  //
1498
1476
 
1499
1477
  const currentRenderTarget = _this.getRenderTarget();
1500
- _this.setRenderTarget( _transmissionRenderTarget );
1478
+ _this.setRenderTarget( transmissionRenderTarget );
1501
1479
 
1502
1480
  _this.getClearColor( _currentClearColor );
1503
1481
  _currentClearAlpha = _this.getClearAlpha();
@@ -1510,44 +1488,57 @@ class WebGLRenderer {
1510
1488
  const currentToneMapping = _this.toneMapping;
1511
1489
  _this.toneMapping = NoToneMapping;
1512
1490
 
1491
+ // Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).
1492
+ // Transmission render pass requires viewport to match the transmissionRenderTarget.
1493
+ const currentCameraViewport = camera.viewport;
1494
+ if ( camera.viewport !== undefined ) camera.viewport = undefined;
1495
+
1496
+ currentRenderState.setupLightsView( camera );
1497
+
1498
+ if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );
1499
+
1513
1500
  renderObjects( opaqueObjects, scene, camera );
1514
1501
 
1515
- textures.updateMultisampleRenderTarget( _transmissionRenderTarget );
1516
- textures.updateRenderTargetMipmap( _transmissionRenderTarget );
1502
+ textures.updateMultisampleRenderTarget( transmissionRenderTarget );
1503
+ textures.updateRenderTargetMipmap( transmissionRenderTarget );
1517
1504
 
1518
- let renderTargetNeedsUpdate = false;
1505
+ if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131
1519
1506
 
1520
- for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {
1507
+ let renderTargetNeedsUpdate = false;
1521
1508
 
1522
- const renderItem = transmissiveObjects[ i ];
1509
+ for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {
1523
1510
 
1524
- const object = renderItem.object;
1525
- const geometry = renderItem.geometry;
1526
- const material = renderItem.material;
1527
- const group = renderItem.group;
1511
+ const renderItem = transmissiveObjects[ i ];
1528
1512
 
1529
- if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {
1513
+ const object = renderItem.object;
1514
+ const geometry = renderItem.geometry;
1515
+ const material = renderItem.material;
1516
+ const group = renderItem.group;
1530
1517
 
1531
- const currentSide = material.side;
1518
+ if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {
1532
1519
 
1533
- material.side = BackSide;
1534
- material.needsUpdate = true;
1520
+ const currentSide = material.side;
1535
1521
 
1536
- renderObject( object, scene, camera, geometry, material, group );
1522
+ material.side = BackSide;
1523
+ material.needsUpdate = true;
1524
+
1525
+ renderObject( object, scene, camera, geometry, material, group );
1537
1526
 
1538
- material.side = currentSide;
1539
- material.needsUpdate = true;
1527
+ material.side = currentSide;
1528
+ material.needsUpdate = true;
1540
1529
 
1541
- renderTargetNeedsUpdate = true;
1530
+ renderTargetNeedsUpdate = true;
1531
+
1532
+ }
1542
1533
 
1543
1534
  }
1544
1535
 
1545
- }
1536
+ if ( renderTargetNeedsUpdate === true ) {
1546
1537
 
1547
- if ( renderTargetNeedsUpdate === true ) {
1538
+ textures.updateMultisampleRenderTarget( transmissionRenderTarget );
1539
+ textures.updateRenderTargetMipmap( transmissionRenderTarget );
1548
1540
 
1549
- textures.updateMultisampleRenderTarget( _transmissionRenderTarget );
1550
- textures.updateRenderTargetMipmap( _transmissionRenderTarget );
1541
+ }
1551
1542
 
1552
1543
  }
1553
1544
 
@@ -1555,6 +1546,8 @@ class WebGLRenderer {
1555
1546
 
1556
1547
  _this.setClearColor( _currentClearColor, _currentClearAlpha );
1557
1548
 
1549
+ if ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;
1550
+
1558
1551
  _this.toneMapping = currentToneMapping;
1559
1552
 
1560
1553
  }
@@ -1907,7 +1900,7 @@ class WebGLRenderer {
1907
1900
 
1908
1901
  needsProgramChange = true;
1909
1902
 
1910
- } else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {
1903
+ } else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {
1911
1904
 
1912
1905
  needsProgramChange = true;
1913
1906
 
@@ -2029,17 +2022,9 @@ class WebGLRenderer {
2029
2022
 
2030
2023
  if ( skeleton ) {
2031
2024
 
2032
- if ( capabilities.floatVertexTextures ) {
2025
+ if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();
2033
2026
 
2034
- if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();
2035
-
2036
- p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );
2037
-
2038
- } else {
2039
-
2040
- console.warn( 'THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.' );
2041
-
2042
- }
2027
+ p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );
2043
2028
 
2044
2029
  }
2045
2030
 
@@ -2054,7 +2039,7 @@ class WebGLRenderer {
2054
2039
 
2055
2040
  const morphAttributes = geometry.morphAttributes;
2056
2041
 
2057
- if ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) {
2042
+ if ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {
2058
2043
 
2059
2044
  morphtargets.update( object, geometry, program );
2060
2045
 
@@ -2077,6 +2062,12 @@ class WebGLRenderer {
2077
2062
 
2078
2063
  }
2079
2064
 
2065
+ if ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {
2066
+
2067
+ m_uniforms.envMapIntensity.value = scene.environmentIntensity;
2068
+
2069
+ }
2070
+
2080
2071
  if ( refreshMaterial ) {
2081
2072
 
2082
2073
  p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );
@@ -2104,7 +2095,7 @@ class WebGLRenderer {
2104
2095
 
2105
2096
  }
2106
2097
 
2107
- materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );
2098
+ materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );
2108
2099
 
2109
2100
  WebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );
2110
2101
 
@@ -2146,18 +2137,10 @@ class WebGLRenderer {
2146
2137
 
2147
2138
  for ( let i = 0, l = groups.length; i < l; i ++ ) {
2148
2139
 
2149
- if ( capabilities.isWebGL2 ) {
2150
-
2151
- const group = groups[ i ];
2140
+ const group = groups[ i ];
2152
2141
 
2153
- uniformsGroups.update( group, program );
2154
- uniformsGroups.bind( group, program );
2155
-
2156
- } else {
2157
-
2158
- console.warn( 'THREE.WebGLRenderer: Uniform Buffer Objects can only be used with WebGL 2.' );
2159
-
2160
- }
2142
+ uniformsGroups.update( group, program );
2143
+ uniformsGroups.bind( group, program );
2161
2144
 
2162
2145
  }
2163
2146
 
@@ -2326,7 +2309,7 @@ class WebGLRenderer {
2326
2309
 
2327
2310
  isCube = true;
2328
2311
 
2329
- } else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {
2312
+ } else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {
2330
2313
 
2331
2314
  framebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;
2332
2315
 
@@ -2358,7 +2341,7 @@ class WebGLRenderer {
2358
2341
 
2359
2342
  const framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2360
2343
 
2361
- if ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {
2344
+ if ( framebufferBound && useDefaultFramebuffer ) {
2362
2345
 
2363
2346
  state.drawBuffers( renderTarget, framebuffer );
2364
2347
 
@@ -2412,18 +2395,14 @@ class WebGLRenderer {
2412
2395
  const textureFormat = texture.format;
2413
2396
  const textureType = texture.type;
2414
2397
 
2415
- if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
2398
+ if ( ! capabilities.textureFormatReadable( textureFormat ) ) {
2416
2399
 
2417
2400
  console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
2418
2401
  return;
2419
2402
 
2420
2403
  }
2421
2404
 
2422
- const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );
2423
-
2424
- if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)
2425
- ! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox
2426
- ! halfFloatSupportedByExt ) {
2405
+ if ( ! capabilities.textureTypeReadable( textureType ) ) {
2427
2406
 
2428
2407
  console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
2429
2408
  return;
@@ -2507,16 +2486,9 @@ class WebGLRenderer {
2507
2486
 
2508
2487
  this.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {
2509
2488
 
2510
- if ( _this.isWebGL1Renderer ) {
2511
-
2512
- console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );
2513
- return;
2514
-
2515
- }
2516
-
2517
- const width = Math.round( sourceBox.max.x - sourceBox.min.x );
2518
- const height = Math.round( sourceBox.max.y - sourceBox.min.y );
2519
- const depth = sourceBox.max.z - sourceBox.min.z + 1;
2489
+ const width = sourceBox.max.x - sourceBox.min.x;
2490
+ const height = sourceBox.max.y - sourceBox.min.y;
2491
+ const depth = sourceBox.max.z - sourceBox.min.z;
2520
2492
  const glFormat = utils.convert( dstTexture.format );
2521
2493
  const glType = utils.convert( dstTexture.type );
2522
2494
  let glTarget;
@@ -75,6 +75,12 @@ material.roughness = min( material.roughness, 1.0 );
75
75
 
76
76
  #endif
77
77
 
78
+ #ifdef USE_DISPERSION
79
+
80
+ material.dispersion = dispersion;
81
+
82
+ #endif
83
+
78
84
  #ifdef USE_IRIDESCENCE
79
85
 
80
86
  material.iridescence = iridescence;
@@ -6,6 +6,7 @@ struct PhysicalMaterial {
6
6
  float roughness;
7
7
  vec3 specularColor;
8
8
  float specularF90;
9
+ float dispersion;
9
10
 
10
11
  #ifdef USE_CLEARCOAT
11
12
  float clearcoat;
@@ -1,9 +1,9 @@
1
1
  export default /* glsl */`
2
- #if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )
2
+ #if defined( USE_LOGDEPTHBUF )
3
3
 
4
4
  // Doing a strict comparison with == 1.0 can cause noise artifacts
5
5
  // on some platforms. See issue #17623.
6
- gl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;
6
+ gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;
7
7
 
8
8
  #endif
9
9
  `;
@@ -1,5 +1,5 @@
1
1
  export default /* glsl */`
2
- #if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )
2
+ #if defined( USE_LOGDEPTHBUF )
3
3
 
4
4
  uniform float logDepthBufFC;
5
5
  varying float vFragDepth;
@@ -1,16 +1,8 @@
1
1
  export default /* glsl */`
2
2
  #ifdef USE_LOGDEPTHBUF
3
3
 
4
- #ifdef USE_LOGDEPTHBUF_EXT
5
-
6
- varying float vFragDepth;
7
- varying float vIsPerspective;
8
-
9
- #else
10
-
11
- uniform float logDepthBufFC;
12
-
13
- #endif
4
+ varying float vFragDepth;
5
+ varying float vIsPerspective;
14
6
 
15
7
  #endif
16
8
  `;
@@ -1,22 +1,8 @@
1
1
  export default /* glsl */`
2
2
  #ifdef USE_LOGDEPTHBUF
3
3
 
4
- #ifdef USE_LOGDEPTHBUF_EXT
5
-
6
- vFragDepth = 1.0 + gl_Position.w;
7
- vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );
8
-
9
- #else
10
-
11
- if ( isPerspectiveMatrix( projectionMatrix ) ) {
12
-
13
- gl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;
14
-
15
- gl_Position.z *= gl_Position.w;
16
-
17
- }
18
-
19
- #endif
4
+ vFragDepth = 1.0 + gl_Position.w;
5
+ vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );
20
6
 
21
7
  #endif
22
8
  `;