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
@@ -4,6 +4,9 @@ import { ShaderChunk } from '../shaders/ShaderChunk.js';
4
4
  import { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, CubeRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, VSMShadowMap, ACESFilmicToneMapping, CineonToneMapping, CustomToneMapping, ReinhardToneMapping, LinearToneMapping, GLSL3, LinearSRGBColorSpace, SRGBColorSpace, LinearDisplayP3ColorSpace, DisplayP3ColorSpace, P3Primaries, Rec709Primaries } from '../../constants.js';
5
5
  import { ColorManagement } from '../../math/ColorManagement.js';
6
6
 
7
+ // From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/
8
+ const COMPLETION_STATUS_KHR = 0x91B1;
9
+
7
10
  let programIdCount = 0;
8
11
 
9
12
  function handleSource( string, errorLine ) {
@@ -455,6 +458,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
455
458
  let prefixVertex, prefixFragment;
456
459
  let versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\n' : '';
457
460
 
461
+ const numMultiviewViews = parameters.numMultiviewViews;
462
+
458
463
  if ( parameters.isRawShaderMaterial ) {
459
464
 
460
465
  prefixVertex = [
@@ -846,6 +851,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
846
851
  ].join( '\n' ) + '\n' + prefixVertex;
847
852
 
848
853
  prefixFragment = [
854
+ 'precision mediump sampler2DArray;',
849
855
  '#define varying in',
850
856
  ( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',
851
857
  ( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',
@@ -861,6 +867,53 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
861
867
  '#define textureCubeGradEXT textureGrad'
862
868
  ].join( '\n' ) + '\n' + prefixFragment;
863
869
 
870
+ // Multiview
871
+
872
+ if ( numMultiviewViews > 0 ) {
873
+
874
+ // TODO: fix light transforms here?
875
+
876
+ prefixVertex = [
877
+ '#extension GL_OVR_multiview : require',
878
+ 'layout(num_views = ' + numMultiviewViews + ') in;',
879
+ '#define VIEW_ID gl_ViewID_OVR'
880
+ ].join( '\n' ) + '\n' + prefixVertex;
881
+
882
+ prefixVertex = prefixVertex.replace(
883
+ [
884
+ 'uniform mat4 modelViewMatrix;',
885
+ 'uniform mat4 projectionMatrix;',
886
+ 'uniform mat4 viewMatrix;',
887
+ 'uniform mat3 normalMatrix;'
888
+ ].join( '\n' ),
889
+ [
890
+ 'uniform mat4 modelViewMatrices[' + numMultiviewViews + '];',
891
+ 'uniform mat4 projectionMatrices[' + numMultiviewViews + '];',
892
+ 'uniform mat4 viewMatrices[' + numMultiviewViews + '];',
893
+ 'uniform mat3 normalMatrices[' + numMultiviewViews + '];',
894
+
895
+ '#define modelViewMatrix modelViewMatrices[VIEW_ID]',
896
+ '#define projectionMatrix projectionMatrices[VIEW_ID]',
897
+ '#define viewMatrix viewMatrices[VIEW_ID]',
898
+ '#define normalMatrix normalMatrices[VIEW_ID]'
899
+ ].join( '\n' )
900
+ );
901
+
902
+ prefixFragment = [
903
+ '#extension GL_OVR_multiview : require',
904
+ '#define VIEW_ID gl_ViewID_OVR'
905
+ ].join( '\n' ) + '\n' + prefixFragment;
906
+
907
+ prefixFragment = prefixFragment.replace(
908
+ 'uniform mat4 viewMatrix;',
909
+ [
910
+ 'uniform mat4 viewMatrices[' + numMultiviewViews + '];',
911
+ '#define viewMatrix viewMatrices[VIEW_ID]'
912
+ ].join( '\n' )
913
+ );
914
+
915
+ }
916
+
864
917
  }
865
918
 
866
919
  const vertexGlsl = versionString + prefixVertex + vertexShader;
@@ -890,87 +943,94 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
890
943
 
891
944
  gl.linkProgram( program );
892
945
 
893
- // check for link errors
894
- if ( renderer.debug.checkShaderErrors ) {
946
+ function onFirstUse( self ) {
895
947
 
896
- const programLog = gl.getProgramInfoLog( program ).trim();
897
- const vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();
898
- const fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();
948
+ // check for link errors
949
+ if ( renderer.debug.checkShaderErrors ) {
899
950
 
900
- let runnable = true;
901
- let haveDiagnostics = true;
951
+ const programLog = gl.getProgramInfoLog( program ).trim();
952
+ const vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();
953
+ const fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();
902
954
 
903
- if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
955
+ let runnable = true;
956
+ let haveDiagnostics = true;
904
957
 
905
- runnable = false;
958
+ if ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {
906
959
 
907
- if ( typeof renderer.debug.onShaderError === 'function' ) {
960
+ runnable = false;
908
961
 
909
- renderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );
962
+ if ( typeof renderer.debug.onShaderError === 'function' ) {
910
963
 
911
- } else {
964
+ renderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );
912
965
 
913
- // default error reporting
966
+ } else {
914
967
 
915
- const vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );
916
- const fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );
968
+ // default error reporting
917
969
 
918
- console.error(
919
- 'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +
920
- 'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\n\n' +
921
- 'Program Info Log: ' + programLog + '\n' +
922
- vertexErrors + '\n' +
923
- fragmentErrors
924
- );
970
+ const vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );
971
+ const fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );
925
972
 
926
- }
973
+ console.error(
974
+ 'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +
975
+ 'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\n\n' +
976
+ 'Program Info Log: ' + programLog + '\n' +
977
+ vertexErrors + '\n' +
978
+ fragmentErrors
979
+ );
927
980
 
928
- } else if ( programLog !== '' ) {
981
+ }
929
982
 
930
- console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );
983
+ } else if ( programLog !== '' ) {
931
984
 
932
- } else if ( vertexLog === '' || fragmentLog === '' ) {
985
+ console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );
933
986
 
934
- haveDiagnostics = false;
987
+ } else if ( vertexLog === '' || fragmentLog === '' ) {
935
988
 
936
- }
989
+ haveDiagnostics = false;
937
990
 
938
- if ( haveDiagnostics ) {
991
+ }
939
992
 
940
- this.diagnostics = {
993
+ if ( haveDiagnostics ) {
941
994
 
942
- runnable: runnable,
995
+ self.diagnostics = {
943
996
 
944
- programLog: programLog,
997
+ runnable: runnable,
945
998
 
946
- vertexShader: {
999
+ programLog: programLog,
947
1000
 
948
- log: vertexLog,
949
- prefix: prefixVertex
1001
+ vertexShader: {
950
1002
 
951
- },
1003
+ log: vertexLog,
1004
+ prefix: prefixVertex
952
1005
 
953
- fragmentShader: {
1006
+ },
954
1007
 
955
- log: fragmentLog,
956
- prefix: prefixFragment
1008
+ fragmentShader: {
957
1009
 
958
- }
1010
+ log: fragmentLog,
1011
+ prefix: prefixFragment
959
1012
 
960
- };
1013
+ }
1014
+
1015
+ };
1016
+
1017
+ }
961
1018
 
962
1019
  }
963
1020
 
964
- }
1021
+ // Clean up
1022
+
1023
+ // Crashes in iOS9 and iOS10. #18402
1024
+ // gl.detachShader( program, glVertexShader );
1025
+ // gl.detachShader( program, glFragmentShader );
965
1026
 
966
- // Clean up
1027
+ gl.deleteShader( glVertexShader );
1028
+ gl.deleteShader( glFragmentShader );
967
1029
 
968
- // Crashes in iOS9 and iOS10. #18402
969
- // gl.detachShader( program, glVertexShader );
970
- // gl.detachShader( program, glFragmentShader );
1030
+ cachedUniforms = new WebGLUniforms( gl, program );
1031
+ cachedAttributes = fetchAttributeLocations( gl, program );
971
1032
 
972
- gl.deleteShader( glVertexShader );
973
- gl.deleteShader( glFragmentShader );
1033
+ }
974
1034
 
975
1035
  // set up caching for uniform locations
976
1036
 
@@ -980,7 +1040,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
980
1040
 
981
1041
  if ( cachedUniforms === undefined ) {
982
1042
 
983
- cachedUniforms = new WebGLUniforms( gl, program );
1043
+ // Populates cachedUniforms and cachedAttributes
1044
+ onFirstUse( this );
984
1045
 
985
1046
  }
986
1047
 
@@ -996,7 +1057,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
996
1057
 
997
1058
  if ( cachedAttributes === undefined ) {
998
1059
 
999
- cachedAttributes = fetchAttributeLocations( gl, program );
1060
+ // Populates cachedAttributes and cachedUniforms
1061
+ onFirstUse( this );
1000
1062
 
1001
1063
  }
1002
1064
 
@@ -1004,6 +1066,23 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
1004
1066
 
1005
1067
  };
1006
1068
 
1069
+ // indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,
1070
+ // flag the program as ready immediately. It may cause a stall when it's first used.
1071
+
1072
+ let programReady = ( parameters.rendererExtensionParallelShaderCompile === false );
1073
+
1074
+ this.isReady = function () {
1075
+
1076
+ if ( programReady === false ) {
1077
+
1078
+ programReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );
1079
+
1080
+ }
1081
+
1082
+ return programReady;
1083
+
1084
+ };
1085
+
1007
1086
  // free resource
1008
1087
 
1009
1088
  this.destroy = function () {
@@ -1025,6 +1104,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
1025
1104
  this.program = program;
1026
1105
  this.vertexShader = glVertexShader;
1027
1106
  this.fragmentShader = glFragmentShader;
1107
+ this.numMultiviewViews = numMultiviewViews;
1028
1108
 
1029
1109
  return this;
1030
1110
 
@@ -107,6 +107,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
107
107
 
108
108
  const currentRenderTarget = renderer.getRenderTarget();
109
109
 
110
+ const numMultiviewViews = currentRenderTarget && currentRenderTarget.isWebGLMultiviewRenderTarget ? currentRenderTarget.numViews : 0;
111
+
110
112
  const IS_INSTANCEDMESH = object.isInstancedMesh === true;
111
113
 
112
114
  const HAS_MAP = !! material.map;
@@ -197,6 +199,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
197
199
  instancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,
198
200
 
199
201
  supportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,
202
+ numMultiviewViews: numMultiviewViews,
200
203
  outputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),
201
204
 
202
205
  map: HAS_MAP,
@@ -358,6 +361,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
358
361
  rendererExtensionFragDepth: IS_WEBGL2 || extensions.has( 'EXT_frag_depth' ),
359
362
  rendererExtensionDrawBuffers: IS_WEBGL2 || extensions.has( 'WEBGL_draw_buffers' ),
360
363
  rendererExtensionShaderTextureLod: IS_WEBGL2 || extensions.has( 'EXT_shader_texture_lod' ),
364
+ rendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),
361
365
 
362
366
  customProgramCacheKey: material.customProgramCacheKey()
363
367
 
@@ -500,6 +504,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
500
504
  _programLayers.enable( 16 );
501
505
  if ( parameters.anisotropy )
502
506
  _programLayers.enable( 17 );
507
+ if ( parameters.alphaHash )
508
+ _programLayers.enable( 18 );
503
509
 
504
510
  array.push( _programLayers.mask );
505
511
  _programLayers.disableAll();
@@ -544,6 +550,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
544
550
  _programLayers.enable( 18 );
545
551
  if ( parameters.decodeVideoTexture )
546
552
  _programLayers.enable( 19 );
553
+ if ( parameters.numMultiviewViews )
554
+ _programLayers.enable( 20 );
547
555
 
548
556
  array.push( _programLayers.mask );
549
557
 
@@ -1,4 +1,5 @@
1
- import { NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessEqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceFront, CullFaceBack, CullFaceNone, DoubleSide, BackSide, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, NoBlending, NormalBlending, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, ZeroFactor, OneFactor, SrcColorFactor, SrcAlphaFactor, SrcAlphaSaturateFactor, DstColorFactor, DstAlphaFactor, OneMinusSrcColorFactor, OneMinusSrcAlphaFactor, OneMinusDstColorFactor, OneMinusDstAlphaFactor } from '../../constants.js';
1
+ import { NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessEqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceFront, CullFaceBack, CullFaceNone, DoubleSide, BackSide, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, NoBlending, NormalBlending, AddEquation, SubtractEquation, ReverseSubtractEquation, MinEquation, MaxEquation, ZeroFactor, OneFactor, SrcColorFactor, SrcAlphaFactor, SrcAlphaSaturateFactor, DstColorFactor, DstAlphaFactor, OneMinusSrcColorFactor, OneMinusSrcAlphaFactor, OneMinusDstColorFactor, OneMinusDstAlphaFactor, ConstantColorFactor, OneMinusConstantColorFactor, ConstantAlphaFactor, OneMinusConstantAlphaFactor } from '../../constants.js';
2
+ import { Color } from '../../math/Color.js';
2
3
  import { Vector4 } from '../../math/Vector4.js';
3
4
 
4
5
  function WebGLState( gl, extensions, capabilities ) {
@@ -325,6 +326,8 @@ function WebGLState( gl, extensions, capabilities ) {
325
326
  let currentBlendEquationAlpha = null;
326
327
  let currentBlendSrcAlpha = null;
327
328
  let currentBlendDstAlpha = null;
329
+ let currentBlendColor = new Color( 0, 0, 0 );
330
+ let currentBlendAlpha = 0;
328
331
  let currentPremultipledAlpha = false;
329
332
 
330
333
  let currentFlipSided = null;
@@ -600,10 +603,14 @@ function WebGLState( gl, extensions, capabilities ) {
600
603
  [ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,
601
604
  [ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,
602
605
  [ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,
603
- [ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA
606
+ [ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,
607
+ [ ConstantColorFactor ]: gl.CONSTANT_COLOR,
608
+ [ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,
609
+ [ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,
610
+ [ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA
604
611
  };
605
612
 
606
- function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {
613
+ function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {
607
614
 
608
615
  if ( blending === NoBlending ) {
609
616
 
@@ -696,6 +703,8 @@ function WebGLState( gl, extensions, capabilities ) {
696
703
  currentBlendDst = null;
697
704
  currentBlendSrcAlpha = null;
698
705
  currentBlendDstAlpha = null;
706
+ currentBlendColor.set( 0, 0, 0 );
707
+ currentBlendAlpha = 0;
699
708
 
700
709
  currentBlending = blending;
701
710
  currentPremultipledAlpha = premultipliedAlpha;
@@ -732,6 +741,15 @@ function WebGLState( gl, extensions, capabilities ) {
732
741
 
733
742
  }
734
743
 
744
+ if ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {
745
+
746
+ gl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );
747
+
748
+ currentBlendColor.copy( blendColor );
749
+ currentBlendAlpha = blendAlpha;
750
+
751
+ }
752
+
735
753
  currentBlending = blending;
736
754
  currentPremultipledAlpha = false;
737
755
 
@@ -750,7 +768,7 @@ function WebGLState( gl, extensions, capabilities ) {
750
768
 
751
769
  ( material.blending === NormalBlending && material.transparent === false )
752
770
  ? setBlending( NoBlending )
753
- : setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );
771
+ : setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );
754
772
 
755
773
  depthBuffer.setFunc( material.depthFunc );
756
774
  depthBuffer.setTest( material.depthTest );
@@ -1174,6 +1192,7 @@ function WebGLState( gl, extensions, capabilities ) {
1174
1192
  gl.blendEquation( gl.FUNC_ADD );
1175
1193
  gl.blendFunc( gl.ONE, gl.ZERO );
1176
1194
  gl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );
1195
+ gl.blendColor( 0, 0, 0, 0 );
1177
1196
 
1178
1197
  gl.colorMask( true, true, true, true );
1179
1198
  gl.clearColor( 0, 0, 0, 0 );
@@ -1231,6 +1250,8 @@ function WebGLState( gl, extensions, capabilities ) {
1231
1250
  currentBlendEquationAlpha = null;
1232
1251
  currentBlendSrcAlpha = null;
1233
1252
  currentBlendDstAlpha = null;
1253
+ currentBlendColor = new Color( 0, 0, 0 );
1254
+ currentBlendAlpha = 0;
1234
1255
  currentPremultipledAlpha = false;
1235
1256
 
1236
1257
  currentFlipSided = null;