super-three 0.154.1 → 0.156.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 (172) hide show
  1. package/build/three.cjs +360 -160
  2. package/build/three.js +360 -160
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +355 -161
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/controls/OrbitControls.js +155 -25
  7. package/examples/jsm/csm/CSMShader.js +35 -1
  8. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  9. package/examples/jsm/exporters/USDZExporter.js +1 -0
  10. package/examples/jsm/interactive/SelectionHelper.js +7 -0
  11. package/examples/jsm/libs/tween.module.js +790 -735
  12. package/examples/jsm/libs/utif.module.js +1644 -1558
  13. package/examples/jsm/loaders/DDSLoader.js +46 -3
  14. package/examples/jsm/loaders/EXRLoader.js +4 -4
  15. package/examples/jsm/loaders/FBXLoader.js +3 -1
  16. package/examples/jsm/loaders/GLTFLoader.js +25 -10
  17. package/examples/jsm/loaders/KTX2Loader.js +128 -79
  18. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  19. package/examples/jsm/loaders/LogLuvLoader.js +2 -2
  20. package/examples/jsm/loaders/MMDLoader.js +10 -7
  21. package/examples/jsm/loaders/NRRDLoader.js +3 -3
  22. package/examples/jsm/loaders/PLYLoader.js +1 -1
  23. package/examples/jsm/loaders/RGBELoader.js +48 -66
  24. package/examples/jsm/loaders/STLLoader.js +7 -0
  25. package/examples/jsm/loaders/TGALoader.js +10 -10
  26. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  27. package/examples/jsm/misc/GPUComputationRenderer.js +0 -9
  28. package/examples/jsm/misc/Volume.js +4 -6
  29. package/examples/jsm/nodes/Nodes.js +8 -6
  30. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +29 -3
  31. package/examples/jsm/nodes/accessors/CubeTextureNode.js +20 -3
  32. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +15 -4
  33. package/examples/jsm/nodes/accessors/InstanceNode.js +8 -8
  34. package/examples/jsm/nodes/accessors/LineMaterialNode.js +31 -0
  35. package/examples/jsm/nodes/accessors/MaterialNode.js +73 -61
  36. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +3 -0
  37. package/examples/jsm/nodes/accessors/Object3DNode.js +2 -2
  38. package/examples/jsm/nodes/accessors/SceneNode.js +6 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +54 -9
  40. package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
  41. package/examples/jsm/nodes/core/AttributeNode.js +2 -2
  42. package/examples/jsm/nodes/core/LightingModel.js +7 -9
  43. package/examples/jsm/nodes/core/Node.js +28 -3
  44. package/examples/jsm/nodes/core/NodeBuilder.js +94 -12
  45. package/examples/jsm/nodes/core/NodeUniform.js +1 -1
  46. package/examples/jsm/nodes/core/OutputStructNode.js +58 -0
  47. package/examples/jsm/nodes/core/PropertyNode.js +6 -0
  48. package/examples/jsm/nodes/core/StackNode.js +4 -4
  49. package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
  50. package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
  51. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  52. package/examples/jsm/nodes/display/ViewportNode.js +19 -5
  53. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -2
  54. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
  55. package/examples/jsm/nodes/functions/PhongLightingModel.js +53 -14
  56. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +236 -97
  57. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  58. package/examples/jsm/nodes/gpgpu/ComputeNode.js +13 -0
  59. package/examples/jsm/nodes/lighting/AONode.js +1 -1
  60. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +58 -20
  61. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +7 -10
  62. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -12
  63. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +1 -1
  64. package/examples/jsm/nodes/lighting/LightingContextNode.js +12 -9
  65. package/examples/jsm/nodes/lighting/PointLightNode.js +7 -10
  66. package/examples/jsm/nodes/lighting/SpotLightNode.js +7 -10
  67. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
  68. package/examples/jsm/nodes/materials/Materials.js +2 -0
  69. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
  70. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -0
  71. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  72. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +19 -2
  73. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +2 -2
  74. package/examples/jsm/nodes/materials/NodeMaterial.js +61 -26
  75. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  76. package/examples/jsm/nodes/math/HashNode.js +35 -0
  77. package/examples/jsm/nodes/shadernode/ShaderNode.js +6 -2
  78. package/examples/jsm/nodes/utils/SplitNode.js +1 -1
  79. package/examples/jsm/objects/Reflector.js +1 -9
  80. package/examples/jsm/objects/Refractor.js +0 -8
  81. package/examples/jsm/offscreen/scene.js +0 -1
  82. package/examples/jsm/postprocessing/FilmPass.js +3 -5
  83. package/examples/jsm/postprocessing/MaskPass.js +4 -1
  84. package/examples/jsm/postprocessing/OutputPass.js +33 -14
  85. package/examples/jsm/postprocessing/RenderPass.js +30 -12
  86. package/examples/jsm/postprocessing/SAOPass.js +23 -98
  87. package/examples/jsm/postprocessing/SSAOPass.js +10 -30
  88. package/examples/jsm/postprocessing/UnrealBloomPass.js +21 -17
  89. package/examples/jsm/renderers/common/Backend.js +11 -8
  90. package/examples/jsm/renderers/common/Background.js +22 -20
  91. package/examples/jsm/renderers/common/Binding.js +14 -0
  92. package/examples/jsm/renderers/common/Bindings.js +7 -10
  93. package/examples/jsm/renderers/common/Geometries.js +1 -1
  94. package/examples/jsm/renderers/common/Pipelines.js +96 -47
  95. package/examples/jsm/renderers/common/RenderContext.js +1 -0
  96. package/examples/jsm/renderers/common/RenderContexts.js +41 -5
  97. package/examples/jsm/renderers/common/RenderList.js +12 -4
  98. package/examples/jsm/renderers/common/RenderObject.js +26 -6
  99. package/examples/jsm/renderers/common/RenderObjects.js +10 -7
  100. package/examples/jsm/renderers/common/Renderer.js +82 -42
  101. package/examples/jsm/renderers/common/SampledTexture.js +2 -1
  102. package/examples/jsm/renderers/common/Sampler.js +1 -1
  103. package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
  104. package/examples/jsm/renderers/common/Textures.js +172 -20
  105. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +2 -2
  106. package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -1
  107. package/examples/jsm/renderers/common/nodes/Nodes.js +58 -13
  108. package/examples/jsm/renderers/webgl/WebGLBackend.js +607 -0
  109. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +118 -17
  110. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
  111. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
  112. package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
  113. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +199 -0
  114. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
  115. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
  116. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +1 -1
  117. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +320 -84
  118. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
  119. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +120 -66
  120. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
  121. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +55 -36
  122. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +96 -5
  123. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +24 -22
  124. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +117 -139
  125. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +60 -142
  126. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +7 -6
  127. package/examples/jsm/shaders/FilmShader.js +11 -54
  128. package/examples/jsm/shaders/OutputShader.js +19 -2
  129. package/examples/jsm/shaders/SAOShader.js +0 -13
  130. package/examples/jsm/shaders/SSAOShader.js +33 -26
  131. package/examples/jsm/utils/BufferGeometryUtils.js +13 -4
  132. package/examples/jsm/webxr/OculusHandPointerModel.js +2 -2
  133. package/package.json +2 -2
  134. package/src/Three.js +3 -0
  135. package/src/animation/PropertyBinding.js +1 -1
  136. package/src/audio/Audio.js +6 -0
  137. package/src/cameras/CubeCamera.js +1 -4
  138. package/src/constants.js +4 -1
  139. package/src/core/BufferAttribute.js +20 -0
  140. package/src/core/Object3D.js +2 -15
  141. package/src/core/RenderTarget.js +122 -0
  142. package/src/core/UniformsGroup.js +2 -2
  143. package/src/geometries/CapsuleGeometry.js +1 -1
  144. package/src/loaders/DataTextureLoader.js +19 -2
  145. package/src/materials/Material.js +2 -2
  146. package/src/math/Vector2.js +2 -2
  147. package/src/math/Vector3.js +3 -3
  148. package/src/math/Vector4.js +4 -4
  149. package/src/objects/Line.js +1 -1
  150. package/src/objects/Mesh.js +1 -1
  151. package/src/objects/Points.js +1 -1
  152. package/src/renderers/WebGLMultipleRenderTargets.js +0 -2
  153. package/src/renderers/WebGLRenderTarget.js +3 -110
  154. package/src/renderers/WebGLRenderer.js +83 -57
  155. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +1 -2
  156. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
  157. package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
  158. package/src/renderers/webgl/WebGLBackground.js +5 -14
  159. package/src/renderers/webgl/WebGLGeometries.js +5 -1
  160. package/src/renderers/webgl/WebGLMaterials.js +1 -1
  161. package/src/renderers/webgl/WebGLProgram.js +2 -0
  162. package/src/renderers/webgl/WebGLPrograms.js +19 -3
  163. package/src/renderers/webgl/WebGLTextures.js +101 -16
  164. package/src/renderers/webgl/WebGLUtils.js +27 -20
  165. package/src/textures/CompressedCubeTexture.js +19 -0
  166. package/src/textures/Texture.js +2 -2
  167. package/src/utils.js +9 -1
  168. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +0 -30
  169. package/examples/jsm/renderers/common/RenderTarget.js +0 -15
  170. package/examples/jsm/renderers/common/nodes/NodeRender.js +0 -302
  171. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
  172. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +0 -0
@@ -59,15 +59,7 @@ import { WebVRManager } from './webvr/WebVRManager.js';
59
59
  import { WebXRManager } from './webxr/WebXRManager.js';
60
60
  import { WebGLMaterials } from './webgl/WebGLMaterials.js';
61
61
  import { WebGLUniformsGroups } from './webgl/WebGLUniformsGroups.js';
62
- import { createElementNS } from '../utils.js';
63
-
64
- function createCanvasElement() {
65
-
66
- const canvas = createElementNS( 'canvas' );
67
- canvas.style.display = 'block';
68
- return canvas;
69
-
70
- }
62
+ import { createCanvasElement } from '../utils.js';
71
63
 
72
64
  class WebGLRenderer {
73
65
 
@@ -153,7 +145,7 @@ class WebGLRenderer {
153
145
 
154
146
  // physical lights
155
147
 
156
- this.useLegacyLights = true;
148
+ this._useLegacyLights = false;
157
149
 
158
150
  // tone mapping
159
151
 
@@ -796,6 +788,9 @@ class WebGLRenderer {
796
788
  if ( material.wireframe === true ) {
797
789
 
798
790
  index = geometries.getWireframeAttribute( geometry );
791
+
792
+ if ( index === undefined ) return;
793
+
799
794
  rangeFactor = 2;
800
795
 
801
796
  }
@@ -960,7 +955,7 @@ class WebGLRenderer {
960
955
 
961
956
  } );
962
957
 
963
- currentRenderState.setupLights( _this.useLegacyLights );
958
+ currentRenderState.setupLights( _this._useLegacyLights );
964
959
 
965
960
  scene.traverse( function ( object ) {
966
961
 
@@ -1113,7 +1108,7 @@ class WebGLRenderer {
1113
1108
 
1114
1109
  // render scene
1115
1110
 
1116
- currentRenderState.setupLights( _this.useLegacyLights );
1111
+ currentRenderState.setupLights( _this._useLegacyLights );
1117
1112
 
1118
1113
  if ( camera.isArrayCamera ) {
1119
1114
 
@@ -1607,6 +1602,7 @@ class WebGLRenderer {
1607
1602
 
1608
1603
  materialProperties.outputColorSpace = parameters.outputColorSpace;
1609
1604
  materialProperties.instancing = parameters.instancing;
1605
+ materialProperties.instancingColor = parameters.instancingColor;
1610
1606
  materialProperties.skinning = parameters.skinning;
1611
1607
  materialProperties.morphTargets = parameters.morphTargets;
1612
1608
  materialProperties.morphNormals = parameters.morphNormals;
@@ -1635,7 +1631,18 @@ class WebGLRenderer {
1635
1631
  const morphTargets = !! geometry.morphAttributes.position;
1636
1632
  const morphNormals = !! geometry.morphAttributes.normal;
1637
1633
  const morphColors = !! geometry.morphAttributes.color;
1638
- const toneMapping = material.toneMapped ? _this.toneMapping : NoToneMapping;
1634
+
1635
+ let toneMapping = NoToneMapping;
1636
+
1637
+ if ( material.toneMapped ) {
1638
+
1639
+ if ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {
1640
+
1641
+ toneMapping = _this.toneMapping;
1642
+
1643
+ }
1644
+
1645
+ }
1639
1646
 
1640
1647
  const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
1641
1648
  const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
@@ -1690,6 +1697,14 @@ class WebGLRenderer {
1690
1697
 
1691
1698
  needsProgramChange = true;
1692
1699
 
1700
+ } else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {
1701
+
1702
+ needsProgramChange = true;
1703
+
1704
+ } else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {
1705
+
1706
+ needsProgramChange = true;
1707
+
1693
1708
  } else if ( materialProperties.envMap !== envMap ) {
1694
1709
 
1695
1710
  needsProgramChange = true;
@@ -1776,48 +1791,28 @@ class WebGLRenderer {
1776
1791
 
1777
1792
  if ( refreshProgram || _currentCamera !== camera ) {
1778
1793
 
1779
- p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
1794
+ // common camera uniforms
1780
1795
 
1781
- if ( capabilities.logarithmicDepthBuffer ) {
1782
-
1783
- p_uniforms.setValue( _gl, 'logDepthBufFC',
1784
- 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
1785
-
1786
- }
1787
-
1788
- if ( _currentCamera !== camera ) {
1796
+ p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
1797
+ p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
1789
1798
 
1790
- _currentCamera = camera;
1799
+ const uCamPos = p_uniforms.map.cameraPosition;
1791
1800
 
1792
- // lighting uniforms depend on the camera so enforce an update
1793
- // now, in case this material supports lights - or later, when
1794
- // the next material that does gets activated:
1801
+ if ( uCamPos !== undefined ) {
1795
1802
 
1796
- refreshMaterial = true; // set to true on material change
1797
- refreshLights = true; // remains set until update done
1803
+ uCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );
1798
1804
 
1799
1805
  }
1800
1806
 
1801
- // load material specific uniforms
1802
- // (shader material also gets them for the sake of genericity)
1803
-
1804
- if ( material.isShaderMaterial ||
1805
- material.isMeshPhongMaterial ||
1806
- material.isMeshToonMaterial ||
1807
- material.isMeshStandardMaterial ||
1808
- material.envMap ) {
1809
-
1810
- const uCamPos = p_uniforms.map.cameraPosition;
1811
-
1812
- if ( uCamPos !== undefined ) {
1813
-
1814
- uCamPos.setValue( _gl,
1815
- _vector3.setFromMatrixPosition( camera.matrixWorld ) );
1807
+ if ( capabilities.logarithmicDepthBuffer ) {
1816
1808
 
1817
- }
1809
+ p_uniforms.setValue( _gl, 'logDepthBufFC',
1810
+ 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
1818
1811
 
1819
1812
  }
1820
1813
 
1814
+ // consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067
1815
+
1821
1816
  if ( material.isMeshPhongMaterial ||
1822
1817
  material.isMeshToonMaterial ||
1823
1818
  material.isMeshLambertMaterial ||
@@ -1829,16 +1824,16 @@ class WebGLRenderer {
1829
1824
 
1830
1825
  }
1831
1826
 
1832
- if ( material.isMeshPhongMaterial ||
1833
- material.isMeshToonMaterial ||
1834
- material.isMeshLambertMaterial ||
1835
- material.isMeshBasicMaterial ||
1836
- material.isMeshStandardMaterial ||
1837
- material.isShaderMaterial ||
1838
- material.isShadowMaterial ||
1839
- object.isSkinnedMesh ) {
1827
+ if ( _currentCamera !== camera ) {
1828
+
1829
+ _currentCamera = camera;
1830
+
1831
+ // lighting uniforms depend on the camera so enforce an update
1832
+ // now, in case this material supports lights - or later, when
1833
+ // the next material that does gets activated:
1840
1834
 
1841
- p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
1835
+ refreshMaterial = true; // set to true on material change
1836
+ refreshLights = true; // remains set until update done
1842
1837
 
1843
1838
  }
1844
1839
 
@@ -2131,7 +2126,16 @@ class WebGLRenderer {
2131
2126
 
2132
2127
  if ( renderTarget.isWebGLCubeRenderTarget ) {
2133
2128
 
2134
- framebuffer = __webglFramebuffer[ activeCubeFace ];
2129
+ if ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {
2130
+
2131
+ framebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];
2132
+
2133
+ } else {
2134
+
2135
+ framebuffer = __webglFramebuffer[ activeCubeFace ];
2136
+
2137
+ }
2138
+
2135
2139
  isCube = true;
2136
2140
 
2137
2141
  } else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {
@@ -2140,7 +2144,15 @@ class WebGLRenderer {
2140
2144
 
2141
2145
  } else {
2142
2146
 
2143
- framebuffer = __webglFramebuffer;
2147
+ if ( Array.isArray( __webglFramebuffer ) ) {
2148
+
2149
+ framebuffer = __webglFramebuffer[ activeMipmapLevel ];
2150
+
2151
+ } else {
2152
+
2153
+ framebuffer = __webglFramebuffer;
2154
+
2155
+ }
2144
2156
 
2145
2157
  }
2146
2158
 
@@ -2439,14 +2451,14 @@ class WebGLRenderer {
2439
2451
 
2440
2452
  get physicallyCorrectLights() { // @deprecated, r150
2441
2453
 
2442
- console.warn( 'THREE.WebGLRenderer: the property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead.' );
2454
+ console.warn( 'THREE.WebGLRenderer: The property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead.' );
2443
2455
  return ! this.useLegacyLights;
2444
2456
 
2445
2457
  }
2446
2458
 
2447
2459
  set physicallyCorrectLights( value ) { // @deprecated, r150
2448
2460
 
2449
- console.warn( 'THREE.WebGLRenderer: the property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead.' );
2461
+ console.warn( 'THREE.WebGLRenderer: The property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead.' );
2450
2462
  this.useLegacyLights = ! value;
2451
2463
 
2452
2464
  }
@@ -2465,6 +2477,20 @@ class WebGLRenderer {
2465
2477
 
2466
2478
  }
2467
2479
 
2480
+ get useLegacyLights() { // @deprecated, r155
2481
+
2482
+ console.warn( 'THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.' );
2483
+ return this._useLegacyLights;
2484
+
2485
+ }
2486
+
2487
+ set useLegacyLights( value ) { // @deprecated, r155
2488
+
2489
+ console.warn( 'THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.' );
2490
+ this._useLegacyLights = value;
2491
+
2492
+ }
2493
+
2468
2494
  }
2469
2495
 
2470
2496
 
@@ -64,7 +64,7 @@ export default /* glsl */`
64
64
  float cosTheta2Sq = 1.0 - sinTheta2Sq;
65
65
  if ( cosTheta2Sq < 0.0 ) {
66
66
 
67
- return vec3( 1.0 );
67
+ return vec3( 1.0 );
68
68
 
69
69
  }
70
70
 
@@ -73,7 +73,6 @@ export default /* glsl */`
73
73
  // First interface
74
74
  float R0 = IorToFresnel0( iridescenceIOR, outsideIOR );
75
75
  float R12 = F_Schlick( R0, 1.0, cosTheta1 );
76
- float R21 = R12;
77
76
  float T121 = 1.0 - R12;
78
77
  float phi12 = 0.0;
79
78
  if ( iridescenceIOR < outsideIOR ) phi12 = PI;
@@ -1,7 +1,17 @@
1
1
  export default /* glsl */`
2
2
  #ifdef USE_MAP
3
3
 
4
- diffuseColor *= texture2D( map, vMapUv );
4
+ vec4 sampledDiffuseColor = texture2D( map, vMapUv );
5
+
6
+ #ifdef DECODE_VIDEO_TEXTURE
7
+
8
+ // use inline sRGB decode until browsers properly support SRGB8_APLHA8 with video textures
9
+
10
+ sampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );
11
+
12
+ #endif
13
+
14
+ diffuseColor *= sampledDiffuseColor;
5
15
 
6
16
  #endif
7
17
  `;
@@ -21,6 +21,14 @@ void main() {
21
21
 
22
22
  vec4 texColor = texture2D( t2D, vUv );
23
23
 
24
+ #ifdef DECODE_VIDEO_TEXTURE
25
+
26
+ // use inline sRGB decode until browsers properly support SRGB8_APLHA8 with video textures
27
+
28
+ texColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );
29
+
30
+ #endif
31
+
24
32
  texColor.rgb *= backgroundIntensity;
25
33
 
26
34
  gl_FragColor = texColor;
@@ -44,24 +44,15 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
44
44
 
45
45
  }
46
46
 
47
- const xr = renderer.xr;
48
- const environmentBlendMode = xr.getEnvironmentBlendMode();
47
+ const environmentBlendMode = renderer.xr.getEnvironmentBlendMode();
49
48
 
50
- switch ( environmentBlendMode ) {
49
+ if ( environmentBlendMode === 'additive' ) {
51
50
 
52
- case 'opaque':
53
- forceClear = true;
54
- break;
51
+ state.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );
55
52
 
56
- case 'additive':
57
- state.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );
58
- forceClear = true;
59
- break;
53
+ } else if ( environmentBlendMode === 'alpha-blend' ) {
60
54
 
61
- case 'alpha-blend':
62
- state.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );
63
- forceClear = true;
64
- break;
55
+ state.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );
65
56
 
66
57
  }
67
58
 
@@ -128,7 +128,7 @@ function WebGLGeometries( gl, attributes, info, bindingStates ) {
128
128
 
129
129
  }
130
130
 
131
- } else {
131
+ } else if ( geometryPosition !== undefined ) {
132
132
 
133
133
  const array = geometryPosition.array;
134
134
  version = geometryPosition.version;
@@ -143,6 +143,10 @@ function WebGLGeometries( gl, attributes, info, bindingStates ) {
143
143
 
144
144
  }
145
145
 
146
+ } else {
147
+
148
+ return;
149
+
146
150
  }
147
151
 
148
152
  const attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
@@ -228,7 +228,7 @@ function WebGLMaterials( renderer, properties ) {
228
228
  uniforms.lightMap.value = material.lightMap;
229
229
 
230
230
  // artist-friendly light intensity scaling factor
231
- const scaleFactor = ( renderer.useLegacyLights === true ) ? Math.PI : 1;
231
+ const scaleFactor = ( renderer._useLegacyLights === true ) ? Math.PI : 1;
232
232
 
233
233
  uniforms.lightMapIntensity.value = material.lightMapIntensity * scaleFactor;
234
234
 
@@ -765,6 +765,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
765
765
 
766
766
  parameters.useLegacyLights ? '#define LEGACY_LIGHTS' : '',
767
767
 
768
+ parameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',
769
+
768
770
  parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
769
771
  ( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
770
772
 
@@ -1,4 +1,4 @@
1
- import { BackSide, DoubleSide, CubeUVReflectionMapping, ObjectSpaceNormalMap, TangentSpaceNormalMap, NoToneMapping, NormalBlending, LinearSRGBColorSpace } from '../../constants.js';
1
+ import { BackSide, DoubleSide, CubeUVReflectionMapping, ObjectSpaceNormalMap, TangentSpaceNormalMap, NoToneMapping, NormalBlending, LinearSRGBColorSpace, SRGBColorSpace } from '../../constants.js';
2
2
  import { Layers } from '../../core/Layers.js';
3
3
  import { WebGLProgram } from './WebGLProgram.js';
4
4
  import { WebGLShaderCache } from './WebGLShaderCache.js';
@@ -160,6 +160,18 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
160
160
  const HAS_ATTRIBUTE_UV2 = !! geometry.attributes.uv2;
161
161
  const HAS_ATTRIBUTE_UV3 = !! geometry.attributes.uv3;
162
162
 
163
+ let toneMapping = NoToneMapping;
164
+
165
+ if ( material.toneMapped ) {
166
+
167
+ if ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {
168
+
169
+ toneMapping = renderer.toneMapping;
170
+
171
+ }
172
+
173
+ }
174
+
163
175
  const parameters = {
164
176
 
165
177
  isWebGL2: IS_WEBGL2,
@@ -320,8 +332,10 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
320
332
  shadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,
321
333
  shadowMapType: renderer.shadowMap.type,
322
334
 
323
- toneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,
324
- useLegacyLights: renderer.useLegacyLights,
335
+ toneMapping: toneMapping,
336
+ useLegacyLights: renderer._useLegacyLights,
337
+
338
+ decodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( material.map.colorSpace === SRGBColorSpace ),
325
339
 
326
340
  premultipliedAlpha: material.premultipliedAlpha,
327
341
 
@@ -524,6 +538,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
524
538
  _programLayers.enable( 17 );
525
539
  if ( parameters.pointsUvs )
526
540
  _programLayers.enable( 18 );
541
+ if ( parameters.decodeVideoTexture )
542
+ _programLayers.enable( 19 );
527
543
 
528
544
  array.push( _programLayers.mask );
529
545
 
@@ -1,4 +1,4 @@
1
- import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, UnsignedByteType, _SRGBAFormat, NoColorSpace, LinearSRGBColorSpace, SRGBColorSpace, NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare } from '../../constants.js';
1
+ import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, UnsignedByteType, _SRGBAFormat, NoColorSpace, LinearSRGBColorSpace, SRGBColorSpace, NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, DisplayP3ColorSpace } from '../../constants.js';
2
2
  import * as MathUtils from '../../math/MathUtils.js';
3
3
  import { ImageUtils } from '../../extras/ImageUtils.js';
4
4
  import { createElementNS } from '../../utils.js';
@@ -157,6 +157,17 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
157
157
 
158
158
  }
159
159
 
160
+ if ( glFormat === _gl.RED_INTEGER ) {
161
+
162
+ if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;
163
+ if ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;
164
+ if ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;
165
+ if ( glType === _gl.BYTE ) internalFormat = _gl.R8I;
166
+ if ( glType === _gl.SHORT ) internalFormat = _gl.R16I;
167
+ if ( glType === _gl.INT ) internalFormat = _gl.R32I;
168
+
169
+ }
170
+
160
171
  if ( glFormat === _gl.RG ) {
161
172
 
162
173
  if ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;
@@ -333,14 +344,32 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
333
344
 
334
345
  for ( let i = 0; i < 6; i ++ ) {
335
346
 
336
- _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
347
+ if ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {
348
+
349
+ for ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );
350
+
351
+ } else {
352
+
353
+ _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
354
+
355
+ }
356
+
337
357
  if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );
338
358
 
339
359
  }
340
360
 
341
361
  } else {
342
362
 
343
- _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
363
+ if ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {
364
+
365
+ for ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );
366
+
367
+ } else {
368
+
369
+ _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
370
+
371
+ }
372
+
344
373
  if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
345
374
  if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );
346
375
 
@@ -719,7 +748,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
719
748
  glFormat = utils.convert( texture.format, texture.colorSpace );
720
749
 
721
750
  let glType = utils.convert( texture.type ),
722
- glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );
751
+ glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );
723
752
 
724
753
  setTextureParameters( textureType, texture, supportsMips );
725
754
 
@@ -1315,7 +1344,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1315
1344
  // Render targets
1316
1345
 
1317
1346
  // Setup storage for target texture and bind it to correct framebuffer
1318
- function setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {
1347
+ function setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {
1319
1348
 
1320
1349
  const glFormat = utils.convert( texture.format, texture.colorSpace );
1321
1350
  const glType = utils.convert( texture.type );
@@ -1324,13 +1353,16 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1324
1353
 
1325
1354
  if ( ! renderTargetProperties.__hasExternalTextures ) {
1326
1355
 
1356
+ const width = Math.max( 1, renderTarget.width >> level );
1357
+ const height = Math.max( 1, renderTarget.height >> level );
1358
+
1327
1359
  if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {
1328
1360
 
1329
- state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );
1361
+ state.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );
1330
1362
 
1331
1363
  } else {
1332
1364
 
1333
- state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
1365
+ state.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );
1334
1366
 
1335
1367
  }
1336
1368
 
@@ -1344,7 +1376,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1344
1376
 
1345
1377
  } else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753
1346
1378
 
1347
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );
1379
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, level );
1348
1380
 
1349
1381
  }
1350
1382
 
@@ -1565,7 +1597,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1565
1597
 
1566
1598
  if ( colorTexture !== undefined ) {
1567
1599
 
1568
- setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
1600
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );
1569
1601
 
1570
1602
  }
1571
1603
 
@@ -1612,13 +1644,41 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1612
1644
 
1613
1645
  for ( let i = 0; i < 6; i ++ ) {
1614
1646
 
1615
- renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
1647
+ if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {
1648
+
1649
+ renderTargetProperties.__webglFramebuffer[ i ] = [];
1650
+
1651
+ for ( let level = 0; level < texture.mipmaps.length; level ++ ) {
1652
+
1653
+ renderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();
1654
+
1655
+ }
1656
+
1657
+ } else {
1658
+
1659
+ renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
1660
+
1661
+ }
1616
1662
 
1617
1663
  }
1618
1664
 
1619
1665
  } else {
1620
1666
 
1621
- renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
1667
+ if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {
1668
+
1669
+ renderTargetProperties.__webglFramebuffer = [];
1670
+
1671
+ for ( let level = 0; level < texture.mipmaps.length; level ++ ) {
1672
+
1673
+ renderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();
1674
+
1675
+ }
1676
+
1677
+ } else {
1678
+
1679
+ renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
1680
+
1681
+ }
1622
1682
 
1623
1683
  if ( isMultipleRenderTargets ) {
1624
1684
 
@@ -1698,7 +1758,19 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1698
1758
 
1699
1759
  for ( let i = 0; i < 6; i ++ ) {
1700
1760
 
1701
- setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
1761
+ if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {
1762
+
1763
+ for ( let level = 0; level < texture.mipmaps.length; level ++ ) {
1764
+
1765
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );
1766
+
1767
+ }
1768
+
1769
+ } else {
1770
+
1771
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );
1772
+
1773
+ }
1702
1774
 
1703
1775
  }
1704
1776
 
@@ -1721,7 +1793,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1721
1793
 
1722
1794
  state.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );
1723
1795
  setTextureParameters( _gl.TEXTURE_2D, attachment, supportsMips );
1724
- setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D );
1796
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, 0 );
1725
1797
 
1726
1798
  if ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {
1727
1799
 
@@ -1753,7 +1825,20 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1753
1825
 
1754
1826
  state.bindTexture( glTextureType, textureProperties.__webglTexture );
1755
1827
  setTextureParameters( glTextureType, texture, supportsMips );
1756
- setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType );
1828
+
1829
+ if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {
1830
+
1831
+ for ( let level = 0; level < texture.mipmaps.length; level ++ ) {
1832
+
1833
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );
1834
+
1835
+ }
1836
+
1837
+ } else {
1838
+
1839
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );
1840
+
1841
+ }
1757
1842
 
1758
1843
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1759
1844
 
@@ -1942,13 +2027,13 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1942
2027
  const format = texture.format;
1943
2028
  const type = texture.type;
1944
2029
 
1945
- if ( texture.isCompressedTexture === true || texture.format === _SRGBAFormat ) return image;
2030
+ if ( texture.isCompressedTexture === true || texture.isVideoTexture === true || texture.format === _SRGBAFormat ) return image;
1946
2031
 
1947
2032
  if ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {
1948
2033
 
1949
2034
  // sRGB
1950
2035
 
1951
- if ( colorSpace === SRGBColorSpace ) {
2036
+ if ( colorSpace === SRGBColorSpace || colorSpace === DisplayP3ColorSpace ) {
1952
2037
 
1953
2038
  if ( isWebGL2 === false ) {
1954
2039