super-three 0.157.0 → 0.158.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 (183) hide show
  1. package/README.md +6 -4
  2. package/build/three.cjs +1486 -842
  3. package/build/three.js +1486 -842
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +1481 -843
  6. package/build/three.module.min.js +1 -1
  7. package/examples/jsm/Addons.js +290 -0
  8. package/examples/jsm/controls/FlyControls.js +26 -0
  9. package/examples/jsm/controls/OrbitControls.js +12 -1
  10. package/examples/jsm/controls/TransformControls.js +27 -11
  11. package/examples/jsm/csm/CSMShader.js +1 -1
  12. package/examples/jsm/exporters/GLTFExporter.js +72 -2
  13. package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
  14. package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
  15. package/examples/jsm/libs/lottie_canvas.module.js +6 -1
  16. package/examples/jsm/libs/opentype.module.js +13 -75
  17. package/examples/jsm/libs/surfaceNet.js +201 -0
  18. package/examples/jsm/loaders/GLTFLoader.js +12 -3
  19. package/examples/jsm/loaders/LUTImageLoader.js +162 -0
  20. package/examples/jsm/loaders/lwo/IFFParser.js +89 -93
  21. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  22. package/examples/jsm/math/Capsule.js +0 -55
  23. package/examples/jsm/math/Octree.js +70 -3
  24. package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
  25. package/examples/jsm/modifiers/TessellateModifier.js +3 -3
  26. package/examples/jsm/nodes/Nodes.js +6 -6
  27. package/examples/jsm/nodes/accessors/CubeTextureNode.js +3 -3
  28. package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
  29. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
  30. package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
  31. package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
  32. package/examples/jsm/nodes/accessors/MorphNode.js +5 -5
  33. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  35. package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
  36. package/examples/jsm/nodes/accessors/TextureNode.js +3 -3
  37. package/examples/jsm/nodes/code/FunctionNode.js +1 -1
  38. package/examples/jsm/nodes/core/AssignNode.js +72 -0
  39. package/examples/jsm/nodes/core/LightingModel.js +3 -1
  40. package/examples/jsm/nodes/core/Node.js +7 -12
  41. package/examples/jsm/nodes/core/NodeBuilder.js +126 -16
  42. package/examples/jsm/nodes/core/NodeUtils.js +4 -2
  43. package/examples/jsm/nodes/core/OutputStructNode.js +1 -1
  44. package/examples/jsm/nodes/core/ParameterNode.js +33 -0
  45. package/examples/jsm/nodes/core/PropertyNode.js +4 -10
  46. package/examples/jsm/nodes/core/StackNode.js +7 -17
  47. package/examples/jsm/nodes/core/TempNode.js +1 -1
  48. package/examples/jsm/nodes/core/VarNode.js +6 -35
  49. package/examples/jsm/nodes/core/VaryingNode.js +2 -0
  50. package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
  51. package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
  52. package/examples/jsm/nodes/display/ViewportNode.js +14 -4
  53. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
  54. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
  55. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
  56. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
  57. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
  58. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
  59. package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
  60. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  61. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
  62. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
  63. package/examples/jsm/nodes/lighting/EnvironmentNode.js +0 -6
  64. package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
  65. package/examples/jsm/nodes/lighting/LightsNode.js +62 -4
  66. package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
  67. package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
  68. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
  69. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +70 -71
  70. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
  71. package/examples/jsm/nodes/materials/Materials.js +1 -0
  72. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  73. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  74. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
  75. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
  76. package/examples/jsm/nodes/materials/NodeMaterial.js +17 -20
  77. package/examples/jsm/nodes/materialx/lib/mx_noise.js +5 -5
  78. package/examples/jsm/nodes/math/OperatorNode.js +5 -21
  79. package/examples/jsm/nodes/shadernode/ShaderNode.js +128 -9
  80. package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
  81. package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
  82. package/examples/jsm/nodes/utils/JoinNode.js +11 -1
  83. package/examples/jsm/nodes/utils/LoopNode.js +36 -24
  84. package/examples/jsm/nodes/utils/SplitNode.js +2 -0
  85. package/examples/jsm/objects/BatchedMesh.js +586 -0
  86. package/examples/jsm/objects/InstancedPoints.js +21 -0
  87. package/examples/jsm/objects/Lensflare.js +20 -0
  88. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
  89. package/examples/jsm/objects/Refractor.js +3 -0
  90. package/examples/jsm/objects/Sky.js +5 -3
  91. package/examples/jsm/objects/Water.js +5 -2
  92. package/examples/jsm/objects/Water2.js +3 -0
  93. package/examples/jsm/physics/AmmoPhysics.js +21 -0
  94. package/examples/jsm/physics/RapierPhysics.js +21 -0
  95. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  96. package/examples/jsm/postprocessing/LUTPass.js +2 -1
  97. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  98. package/examples/jsm/postprocessing/Pass.js +14 -3
  99. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  100. package/examples/jsm/postprocessing/SMAAPass.js +0 -2
  101. package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
  102. package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
  103. package/examples/jsm/renderers/SVGRenderer.js +9 -6
  104. package/examples/jsm/renderers/common/Bindings.js +1 -1
  105. package/examples/jsm/renderers/common/RenderObject.js +8 -1
  106. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  107. package/examples/jsm/renderers/common/Textures.js +4 -36
  108. package/examples/jsm/renderers/common/nodes/Nodes.js +53 -18
  109. package/examples/jsm/renderers/webgl/WebGLBackend.js +291 -50
  110. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +88 -12
  111. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +40 -5
  112. package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
  113. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +2 -0
  114. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +36 -4
  115. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +2 -0
  116. package/examples/jsm/shaders/AfterimageShader.js +2 -0
  117. package/examples/jsm/shaders/BasicShader.js +2 -0
  118. package/examples/jsm/shaders/BlendShader.js +2 -0
  119. package/examples/jsm/shaders/BokehShader.js +2 -0
  120. package/examples/jsm/shaders/BokehShader2.js +4 -0
  121. package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
  122. package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
  123. package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
  124. package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
  125. package/examples/jsm/shaders/FXAAShader.js +2 -0
  126. package/examples/jsm/shaders/FilmShader.js +1 -1
  127. package/examples/jsm/shaders/FocusShader.js +2 -0
  128. package/examples/jsm/shaders/FreiChenShader.js +2 -0
  129. package/examples/jsm/shaders/GodRaysShader.js +8 -0
  130. package/examples/jsm/shaders/HalftoneShader.js +2 -0
  131. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
  132. package/examples/jsm/shaders/HueSaturationShader.js +2 -0
  133. package/examples/jsm/shaders/KaleidoShader.js +2 -0
  134. package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
  135. package/examples/jsm/shaders/LuminosityShader.js +2 -0
  136. package/examples/jsm/shaders/MMDToonShader.js +2 -0
  137. package/examples/jsm/shaders/MirrorShader.js +2 -0
  138. package/examples/jsm/shaders/NormalMapShader.js +2 -0
  139. package/examples/jsm/shaders/OutputShader.js +4 -5
  140. package/examples/jsm/shaders/SAOShader.js +5 -0
  141. package/examples/jsm/shaders/SMAAShader.js +6 -0
  142. package/examples/jsm/shaders/SSAOShader.js +6 -0
  143. package/examples/jsm/shaders/SSRShader.js +6 -0
  144. package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
  145. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
  146. package/examples/jsm/shaders/TechnicolorShader.js +2 -0
  147. package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
  148. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
  149. package/examples/jsm/shaders/VelocityShader.js +2 -0
  150. package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
  151. package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
  152. package/examples/jsm/transpiler/AST.js +231 -0
  153. package/examples/jsm/transpiler/GLSLDecoder.js +899 -0
  154. package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
  155. package/examples/jsm/transpiler/TSLEncoder.js +611 -0
  156. package/examples/jsm/transpiler/Transpiler.js +18 -0
  157. package/examples/jsm/webxr/VRButton.js +1 -1
  158. package/examples/jsm/webxr/XRButton.js +7 -5
  159. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  160. package/package.json +4 -1
  161. package/src/constants.js +7 -1
  162. package/src/extras/PMREMGenerator.js +7 -1
  163. package/src/loaders/MaterialLoader.js +10 -2
  164. package/src/materials/Material.js +27 -13
  165. package/src/math/Box3.js +35 -18
  166. package/src/math/Vector3.js +11 -12
  167. package/src/objects/SkinnedMesh.js +6 -7
  168. package/src/renderers/WebGLMultiviewRenderTarget.js +35 -0
  169. package/src/renderers/WebGLRenderer.js +199 -45
  170. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
  171. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
  172. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
  173. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
  174. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -2
  175. package/src/renderers/webgl/WebGLBackground.js +1 -1
  176. package/src/renderers/webgl/WebGLMultiview.js +100 -0
  177. package/src/renderers/webgl/WebGLProgram.js +130 -50
  178. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  179. package/src/renderers/webgl/WebGLState.js +25 -4
  180. package/src/renderers/webgl/WebGLTextures.js +197 -20
  181. package/src/renderers/webxr/WebXRManager.js +36 -12
  182. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
  183. package/examples/jsm/nodes/accessors/LineMaterialNode.js +0 -29
@@ -46,6 +46,7 @@ import { WebGLGeometries } from './webgl/WebGLGeometries.js';
46
46
  import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.js';
47
47
  import { WebGLInfo } from './webgl/WebGLInfo.js';
48
48
  import { WebGLMorphtargets } from './webgl/WebGLMorphtargets.js';
49
+ import { WebGLMultiview } from './webgl/WebGLMultiview.js';
49
50
  import { WebGLObjects } from './webgl/WebGLObjects.js';
50
51
  import { WebGLPrograms } from './webgl/WebGLPrograms.js';
51
52
  import { WebGLProperties } from './webgl/WebGLProperties.js';
@@ -79,6 +80,7 @@ class WebGLRenderer {
79
80
  preserveDrawingBuffer = false,
80
81
  powerPreference = 'default',
81
82
  failIfMajorPerformanceCaveat = false,
83
+ multiviewStereo = false,
82
84
  } = parameters;
83
85
 
84
86
  this.isWebGLRenderer = true;
@@ -313,6 +315,7 @@ class WebGLRenderer {
313
315
  let extensions, capabilities, state, info;
314
316
  let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;
315
317
  let programCache, materials, renderLists, renderStates, clipping, shadowMap;
318
+ let multiview;
316
319
 
317
320
  let background, morphtargets, bufferRenderer, indexedBufferRenderer;
318
321
 
@@ -346,6 +349,7 @@ class WebGLRenderer {
346
349
  renderLists = new WebGLRenderLists();
347
350
  renderStates = new WebGLRenderStates( extensions, capabilities );
348
351
  background = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );
352
+ multiview = new WebGLMultiview( _this, extensions, _gl );
349
353
  shadowMap = new WebGLShadowMap( _this, objects, capabilities );
350
354
  uniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );
351
355
 
@@ -368,7 +372,7 @@ class WebGLRenderer {
368
372
 
369
373
  // xr
370
374
 
371
- const xr = ( typeof navigator !== 'undefined' && 'xr' in navigator ) ? new WebXRManager( _this, _gl ) : new WebVRManager( _this );
375
+ const xr = ( typeof navigator !== 'undefined' && 'xr' in navigator ) ? new WebXRManager( _this, _gl, extensions, multiviewStereo ) : new WebVRManager( _this );
372
376
 
373
377
  this.xr = xr;
374
378
 
@@ -630,7 +634,12 @@ class WebGLRenderer {
630
634
  }
631
635
 
632
636
  if ( depth ) bits |= _gl.DEPTH_BUFFER_BIT;
633
- if ( stencil ) bits |= _gl.STENCIL_BUFFER_BIT;
637
+ if ( stencil ) {
638
+
639
+ bits |= _gl.STENCIL_BUFFER_BIT;
640
+ this.state.buffers.stencil.setMask( 0xffffffff );
641
+
642
+ }
634
643
 
635
644
  _gl.clear( bits );
636
645
 
@@ -913,36 +922,40 @@ class WebGLRenderer {
913
922
 
914
923
  // Compile
915
924
 
916
- this.compile = function ( scene, camera ) {
925
+ function prepareMaterial( material, scene, object ) {
917
926
 
918
- function prepare( material, scene, object ) {
927
+ if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
919
928
 
920
- if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
929
+ material.side = BackSide;
930
+ material.needsUpdate = true;
931
+ getProgram( material, scene, object );
921
932
 
922
- material.side = BackSide;
923
- material.needsUpdate = true;
924
- getProgram( material, scene, object );
933
+ material.side = FrontSide;
934
+ material.needsUpdate = true;
935
+ getProgram( material, scene, object );
925
936
 
926
- material.side = FrontSide;
927
- material.needsUpdate = true;
928
- getProgram( material, scene, object );
937
+ material.side = DoubleSide;
929
938
 
930
- material.side = DoubleSide;
939
+ } else {
931
940
 
932
- } else {
941
+ getProgram( material, scene, object );
942
+
943
+ }
933
944
 
934
- getProgram( material, scene, object );
945
+ }
935
946
 
936
- }
947
+ this.compile = function ( scene, camera, targetScene = null ) {
937
948
 
938
- }
949
+ if ( targetScene === null ) targetScene = scene;
939
950
 
940
- currentRenderState = renderStates.get( scene );
951
+ currentRenderState = renderStates.get( targetScene );
941
952
  currentRenderState.init();
942
953
 
943
954
  renderStateStack.push( currentRenderState );
944
955
 
945
- scene.traverseVisible( function ( object ) {
956
+ // gather lights from both the target scene and the new object that will be added to the scene.
957
+
958
+ targetScene.traverseVisible( function ( object ) {
946
959
 
947
960
  if ( object.isLight && object.layers.test( camera.layers ) ) {
948
961
 
@@ -958,8 +971,32 @@ class WebGLRenderer {
958
971
 
959
972
  } );
960
973
 
974
+ if ( scene !== targetScene ) {
975
+
976
+ scene.traverseVisible( function ( object ) {
977
+
978
+ if ( object.isLight && object.layers.test( camera.layers ) ) {
979
+
980
+ currentRenderState.pushLight( object );
981
+
982
+ if ( object.castShadow ) {
983
+
984
+ currentRenderState.pushShadow( object );
985
+
986
+ }
987
+
988
+ }
989
+
990
+ } );
991
+
992
+ }
993
+
961
994
  currentRenderState.setupLights( _this._useLegacyLights );
962
995
 
996
+ // Only initialize materials in the new scene, not the targetScene.
997
+
998
+ const materials = new Set();
999
+
963
1000
  scene.traverse( function ( object ) {
964
1001
 
965
1002
  const material = object.material;
@@ -972,13 +1009,15 @@ class WebGLRenderer {
972
1009
 
973
1010
  const material2 = material[ i ];
974
1011
 
975
- prepare( material2, scene, object );
1012
+ prepareMaterial( material2, targetScene, object );
1013
+ materials.add( material2 );
976
1014
 
977
1015
  }
978
1016
 
979
1017
  } else {
980
1018
 
981
- prepare( material, scene, object );
1019
+ prepareMaterial( material, targetScene, object );
1020
+ materials.add( material );
982
1021
 
983
1022
  }
984
1023
 
@@ -989,6 +1028,70 @@ class WebGLRenderer {
989
1028
  renderStateStack.pop();
990
1029
  currentRenderState = null;
991
1030
 
1031
+ return materials;
1032
+
1033
+ };
1034
+
1035
+ // compileAsync
1036
+
1037
+ this.compileAsync = function ( scene, camera, targetScene = null ) {
1038
+
1039
+ const materials = this.compile( scene, camera, targetScene );
1040
+
1041
+ // Wait for all the materials in the new object to indicate that they're
1042
+ // ready to be used before resolving the promise.
1043
+
1044
+ return new Promise( ( resolve ) => {
1045
+
1046
+ function checkMaterialsReady() {
1047
+
1048
+ materials.forEach( function ( material ) {
1049
+
1050
+ const materialProperties = properties.get( material );
1051
+ const program = materialProperties.currentProgram;
1052
+
1053
+ if ( program.isReady() ) {
1054
+
1055
+ // remove any programs that report they're ready to use from the list
1056
+ materials.delete( material );
1057
+
1058
+ }
1059
+
1060
+ } );
1061
+
1062
+ // once the list of compiling materials is empty, call the callback
1063
+
1064
+ if ( materials.size === 0 ) {
1065
+
1066
+ resolve( scene );
1067
+ return;
1068
+
1069
+ }
1070
+
1071
+ // if some materials are still not ready, wait a bit and check again
1072
+
1073
+ setTimeout( checkMaterialsReady, 10 );
1074
+
1075
+ }
1076
+
1077
+ if ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {
1078
+
1079
+ // If we can check the compilation status of the materials without
1080
+ // blocking then do so right away.
1081
+
1082
+ checkMaterialsReady();
1083
+
1084
+ } else {
1085
+
1086
+ // Otherwise start by waiting a bit to give the materials we just
1087
+ // initialized a chance to finish.
1088
+
1089
+ setTimeout( checkMaterialsReady, 10 );
1090
+
1091
+ }
1092
+
1093
+ } );
1094
+
992
1095
  };
993
1096
 
994
1097
  // Animation Loop
@@ -1115,13 +1218,23 @@ class WebGLRenderer {
1115
1218
 
1116
1219
  if ( camera.isArrayCamera ) {
1117
1220
 
1118
- const cameras = camera.cameras;
1221
+ if ( xr.enabled && xr.isMultiview ) {
1119
1222
 
1120
- for ( let i = 0, l = cameras.length; i < l; i ++ ) {
1223
+ textures.setDeferTextureUploads( true );
1121
1224
 
1122
- const camera2 = cameras[ i ];
1225
+ renderScene( currentRenderList, scene, camera, camera.cameras[ 0 ].viewport );
1123
1226
 
1124
- renderScene( currentRenderList, scene, camera2, camera2.viewport );
1227
+ } else {
1228
+
1229
+ const cameras = camera.cameras;
1230
+
1231
+ for ( let i = 0, l = cameras.length; i < l; i ++ ) {
1232
+
1233
+ const camera2 = cameras[ i ];
1234
+
1235
+ renderScene( currentRenderList, scene, camera2, camera2.viewport );
1236
+
1237
+ }
1125
1238
 
1126
1239
  }
1127
1240
 
@@ -1149,6 +1262,8 @@ class WebGLRenderer {
1149
1262
 
1150
1263
  if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );
1151
1264
 
1265
+ textures.runDeferredUploads();
1266
+
1152
1267
  if ( xr.enabled && xr.submitFrame ) {
1153
1268
 
1154
1269
  xr.submitFrame();
@@ -1330,6 +1445,14 @@ class WebGLRenderer {
1330
1445
 
1331
1446
  function renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {
1332
1447
 
1448
+ const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;
1449
+
1450
+ if ( overrideMaterial !== null ) {
1451
+
1452
+ return;
1453
+
1454
+ }
1455
+
1333
1456
  const isWebGL2 = capabilities.isWebGL2;
1334
1457
 
1335
1458
  if ( _transmissionRenderTarget === null ) {
@@ -1589,16 +1712,26 @@ class WebGLRenderer {
1589
1712
 
1590
1713
  }
1591
1714
 
1592
- const progUniforms = program.getUniforms();
1593
- const uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );
1594
-
1595
1715
  materialProperties.currentProgram = program;
1596
- materialProperties.uniformsList = uniformsList;
1716
+ materialProperties.uniformsList = null;
1597
1717
 
1598
1718
  return program;
1599
1719
 
1600
1720
  }
1601
1721
 
1722
+ function getUniformList( materialProperties ) {
1723
+
1724
+ if ( materialProperties.uniformsList === null ) {
1725
+
1726
+ const progUniforms = materialProperties.currentProgram.getUniforms();
1727
+ materialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );
1728
+
1729
+ }
1730
+
1731
+ return materialProperties.uniformsList;
1732
+
1733
+ }
1734
+
1602
1735
  function updateCommonMaterialProperties( material, parameters ) {
1603
1736
 
1604
1737
  const materialProperties = properties.get( material );
@@ -1616,6 +1749,7 @@ class WebGLRenderer {
1616
1749
  materialProperties.vertexAlphas = parameters.vertexAlphas;
1617
1750
  materialProperties.vertexTangents = parameters.vertexTangents;
1618
1751
  materialProperties.toneMapping = parameters.toneMapping;
1752
+ materialProperties.numMultiviewViews = parameters.numMultiviewViews;
1619
1753
 
1620
1754
  }
1621
1755
 
@@ -1647,6 +1781,8 @@ class WebGLRenderer {
1647
1781
 
1648
1782
  }
1649
1783
 
1784
+ const numMultiviewViews = _currentRenderTarget && _currentRenderTarget.isWebGLMultiviewRenderTarget ? _currentRenderTarget.numViews : 0;
1785
+
1650
1786
  const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
1651
1787
  const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
1652
1788
 
@@ -1750,6 +1886,10 @@ class WebGLRenderer {
1750
1886
 
1751
1887
  needsProgramChange = true;
1752
1888
 
1889
+ } else if ( materialProperties.numMultiviewViews !== numMultiviewViews ) {
1890
+
1891
+ needsProgramChange = true;
1892
+
1753
1893
  }
1754
1894
 
1755
1895
  } else {
@@ -1796,8 +1936,17 @@ class WebGLRenderer {
1796
1936
 
1797
1937
  // common camera uniforms
1798
1938
 
1799
- p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
1800
- p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
1939
+ if ( program.numMultiviewViews > 0 ) {
1940
+
1941
+ multiview.updateCameraProjectionMatricesUniform( camera, p_uniforms );
1942
+ multiview.updateCameraViewMatricesUniform( camera, p_uniforms );
1943
+
1944
+ } else {
1945
+
1946
+ p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
1947
+ p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
1948
+
1949
+ }
1801
1950
 
1802
1951
  const uCamPos = p_uniforms.map.cameraPosition;
1803
1952
 
@@ -1926,13 +2075,13 @@ class WebGLRenderer {
1926
2075
 
1927
2076
  materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );
1928
2077
 
1929
- WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );
2078
+ WebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );
1930
2079
 
1931
2080
  }
1932
2081
 
1933
2082
  if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {
1934
2083
 
1935
- WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );
2084
+ WebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );
1936
2085
  material.uniformsNeedUpdate = false;
1937
2086
 
1938
2087
  }
@@ -1945,8 +2094,17 @@ class WebGLRenderer {
1945
2094
 
1946
2095
  // common matrices
1947
2096
 
1948
- p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );
1949
- p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );
2097
+ if ( program.numMultiviewViews > 0 ) {
2098
+
2099
+ multiview.updateObjectMatricesUniforms( object, camera, p_uniforms );
2100
+
2101
+ } else {
2102
+
2103
+ p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );
2104
+ p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );
2105
+
2106
+ }
2107
+
1950
2108
  p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );
1951
2109
 
1952
2110
  // UBOs
@@ -2056,20 +2214,16 @@ class WebGLRenderer {
2056
2214
  const renderTargetProperties = properties.get( renderTarget );
2057
2215
  renderTargetProperties.__hasExternalTextures = true;
2058
2216
 
2059
- if ( renderTargetProperties.__hasExternalTextures ) {
2217
+ renderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;
2060
2218
 
2061
- renderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;
2219
+ if ( ! renderTargetProperties.__autoAllocateDepthBuffer && ! _currentRenderTarget.isWebGLMultiviewRenderTarget ) {
2062
2220
 
2063
- if ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {
2221
+ // The multisample_render_to_texture extension doesn't work properly if there
2222
+ // are midframe flushes and an external depth buffer. Disable use of the extension.
2223
+ if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {
2064
2224
 
2065
- // The multisample_render_to_texture extension doesn't work properly if there
2066
- // are midframe flushes and an external depth buffer. Disable use of the extension.
2067
- if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {
2068
-
2069
- console.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );
2070
- renderTargetProperties.__useRenderToTexture = false;
2071
-
2072
- }
2225
+ console.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );
2226
+ renderTargetProperties.__useRenderToTexture = false;
2073
2227
 
2074
2228
  }
2075
2229
 
@@ -6,6 +6,14 @@ export default /* glsl */`
6
6
 
7
7
  reflectedLight.indirectDiffuse *= ambientOcclusion;
8
8
 
9
+ #if defined( USE_CLEARCOAT )
10
+ clearcoatSpecularIndirect *= ambientOcclusion;
11
+ #endif
12
+
13
+ #if defined( USE_SHEEN )
14
+ sheenSpecularIndirect *= ambientOcclusion;
15
+ #endif
16
+
9
17
  #if defined( USE_ENVMAP ) && defined( STANDARD )
10
18
 
11
19
  float dotNV = saturate( dot( geometryNormal, geometryViewDir ) );
@@ -24,8 +24,9 @@ export default /* glsl */`
24
24
 
25
25
  vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {
26
26
 
27
- vec3 vSigmaX = dFdx( surf_pos.xyz );
28
- vec3 vSigmaY = dFdy( surf_pos.xyz );
27
+ // normalize is done to ensure that the bump map looks the same regardless of the texture's scale
28
+ vec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );
29
+ vec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );
29
30
  vec3 vN = surf_norm; // normalized
30
31
 
31
32
  vec3 R1 = cross( vSigmaY, vN );
@@ -17,7 +17,7 @@ vec3 geometryPosition = - vViewPosition;
17
17
  vec3 geometryNormal = normal;
18
18
  vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );
19
19
 
20
- vec3 geometryClearcoatNormal;
20
+ vec3 geometryClearcoatNormal = vec3( 0.0 );
21
21
 
22
22
  #ifdef USE_CLEARCOAT
23
23
 
@@ -49,8 +49,10 @@ struct PhysicalMaterial {
49
49
  };
50
50
 
51
51
  // temporary
52
- vec3 clearcoatSpecular = vec3( 0.0 );
53
- vec3 sheenSpecular = vec3( 0.0 );
52
+ vec3 clearcoatSpecularDirect = vec3( 0.0 );
53
+ vec3 clearcoatSpecularIndirect = vec3( 0.0 );
54
+ vec3 sheenSpecularDirect = vec3( 0.0 );
55
+ vec3 sheenSpecularIndirect = vec3(0.0 );
54
56
 
55
57
  vec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {
56
58
  float x = clamp( 1.0 - dotVH, 0.0, 1.0 );
@@ -485,13 +487,13 @@ void RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geome
485
487
 
486
488
  vec3 ccIrradiance = dotNLcc * directLight.color;
487
489
 
488
- clearcoatSpecular += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );
490
+ clearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );
489
491
 
490
492
  #endif
491
493
 
492
494
  #ifdef USE_SHEEN
493
495
 
494
- sheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );
496
+ sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );
495
497
 
496
498
  #endif
497
499
 
@@ -510,13 +512,13 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia
510
512
 
511
513
  #ifdef USE_CLEARCOAT
512
514
 
513
- clearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );
515
+ clearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );
514
516
 
515
517
  #endif
516
518
 
517
519
  #ifdef USE_SHEEN
518
520
 
519
- sheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );
521
+ sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );
520
522
 
521
523
  #endif
522
524
 
@@ -197,7 +197,7 @@ void main() {
197
197
  // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing
198
198
  float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );
199
199
 
200
- outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;
200
+ outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;
201
201
 
202
202
  #endif
203
203
 
@@ -207,7 +207,7 @@ void main() {
207
207
 
208
208
  vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );
209
209
 
210
- outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;
210
+ outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;
211
211
 
212
212
  #endif
213
213
 
@@ -68,7 +68,7 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
68
68
  if ( boxMesh === undefined ) {
69
69
 
70
70
  boxMesh = new Mesh(
71
- new BoxGeometry( 1, 1, 1 ),
71
+ new BoxGeometry( 10000, 10000, 10000 ),
72
72
  new ShaderMaterial( {
73
73
  name: 'BackgroundCubeMaterial',
74
74
  uniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @author fernandojsg / http://fernandojsg.com
3
+ * @author Takahiro https://github.com/takahirox
4
+ */
5
+ import { Matrix3 } from '../../math/Matrix3.js';
6
+ import { Matrix4 } from '../../math/Matrix4.js';
7
+
8
+ class WebGLMultiview {
9
+
10
+ constructor( renderer, extensions, gl ) {
11
+
12
+ this.renderer = renderer;
13
+
14
+ this.DEFAULT_NUMVIEWS = 2;
15
+ this.maxNumViews = 0;
16
+ this.gl = gl;
17
+
18
+ this.extensions = extensions;
19
+
20
+ this.available = this.extensions.has( 'OCULUS_multiview' );
21
+
22
+ if ( this.available ) {
23
+
24
+ const extension = this.extensions.get( 'OCULUS_multiview' );
25
+
26
+ this.maxNumViews = this.gl.getParameter( extension.MAX_VIEWS_OVR );
27
+
28
+ this.mat4 = [];
29
+ this.mat3 = [];
30
+ this.cameraArray = [];
31
+
32
+ for ( var i = 0; i < this.maxNumViews; i ++ ) {
33
+
34
+ this.mat4[ i ] = new Matrix4();
35
+ this.mat3[ i ] = new Matrix3();
36
+
37
+ }
38
+
39
+ }
40
+
41
+ }
42
+
43
+ //
44
+ getCameraArray( camera ) {
45
+
46
+ if ( camera.isArrayCamera ) return camera.cameras;
47
+
48
+ this.cameraArray[ 0 ] = camera;
49
+
50
+ return this.cameraArray;
51
+
52
+ }
53
+
54
+ updateCameraProjectionMatricesUniform( camera, uniforms ) {
55
+
56
+ var cameras = this.getCameraArray( camera );
57
+
58
+ for ( var i = 0; i < cameras.length; i ++ ) {
59
+
60
+ this.mat4[ i ].copy( cameras[ i ].projectionMatrix );
61
+
62
+ }
63
+
64
+ uniforms.setValue( this.gl, 'projectionMatrices', this.mat4 );
65
+
66
+ }
67
+
68
+ updateCameraViewMatricesUniform( camera, uniforms ) {
69
+
70
+ var cameras = this.getCameraArray( camera );
71
+
72
+ for ( var i = 0; i < cameras.length; i ++ ) {
73
+
74
+ this.mat4[ i ].copy( cameras[ i ].matrixWorldInverse );
75
+
76
+ }
77
+
78
+ uniforms.setValue( this.gl, 'viewMatrices', this.mat4 );
79
+
80
+ }
81
+
82
+ updateObjectMatricesUniforms( object, camera, uniforms ) {
83
+
84
+ var cameras = this.getCameraArray( camera );
85
+
86
+ for ( var i = 0; i < cameras.length; i ++ ) {
87
+
88
+ this.mat4[ i ].multiplyMatrices( cameras[ i ].matrixWorldInverse, object.matrixWorld );
89
+ this.mat3[ i ].getNormalMatrix( this.mat4[ i ] );
90
+
91
+ }
92
+
93
+ uniforms.setValue( this.gl, 'modelViewMatrices', this.mat4 );
94
+ uniforms.setValue( this.gl, 'normalMatrices', this.mat3 );
95
+
96
+ }
97
+
98
+ }
99
+
100
+ export { WebGLMultiview };