super-three 0.135.0 → 0.136.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 (175) hide show
  1. package/build/three.js +527 -332
  2. package/build/three.min.js +1 -1
  3. package/build/three.module.js +752 -370
  4. package/examples/fonts/tabler-icons/fonts/tabler-icons.svg +3966 -0
  5. package/examples/js/animation/CCDIKSolver.js +0 -1
  6. package/examples/js/animation/MMDPhysics.js +1 -3
  7. package/examples/js/controls/ArcballControls.js +38 -52
  8. package/examples/js/controls/TransformControls.js +24 -1
  9. package/examples/js/curves/CurveExtras.js +0 -2
  10. package/examples/js/effects/AsciiEffect.js +2 -9
  11. package/examples/js/exporters/GLTFExporter.js +1 -1
  12. package/examples/js/geometries/TeapotGeometry.js +0 -1
  13. package/examples/js/interactive/SelectionBox.js +2 -0
  14. package/examples/js/interactive/SelectionHelper.js +22 -7
  15. package/examples/js/lights/RectAreaLightUniformsLib.js +4 -0
  16. package/examples/js/loaders/AMFLoader.js +0 -2
  17. package/examples/js/loaders/ColladaLoader.js +1 -2
  18. package/examples/js/loaders/EXRLoader.js +185 -262
  19. package/examples/js/loaders/FBXLoader.js +3 -4
  20. package/examples/js/loaders/GLTFLoader.js +2 -2
  21. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -8
  22. package/examples/js/loaders/KTX2Loader.js +11 -2
  23. package/examples/js/loaders/KTXLoader.js +1 -1
  24. package/examples/js/loaders/LDrawLoader.js +26 -30
  25. package/examples/js/loaders/LUT3dlLoader.js +2 -0
  26. package/examples/js/loaders/LUTCubeLoader.js +2 -0
  27. package/examples/js/loaders/MMDLoader.js +0 -1
  28. package/examples/js/loaders/NRRDLoader.js +9 -2
  29. package/examples/js/loaders/OBJLoader.js +0 -2
  30. package/examples/js/loaders/PLYLoader.js +1 -1
  31. package/examples/js/loaders/RGBELoader.js +0 -15
  32. package/examples/js/loaders/RGBMLoader.js +55 -5
  33. package/examples/js/loaders/SVGLoader.js +2 -2
  34. package/examples/js/loaders/VOXLoader.js +1 -0
  35. package/examples/js/loaders/VRMLLoader.js +2 -1
  36. package/examples/js/math/ImprovedNoise.js +1 -1
  37. package/examples/js/misc/GPUComputationRenderer.js +3 -1
  38. package/examples/js/objects/Lensflare.js +2 -10
  39. package/examples/js/objects/Reflector.js +7 -0
  40. package/examples/js/objects/Refractor.js +7 -0
  41. package/examples/js/objects/Sky.js +1 -1
  42. package/examples/js/objects/Water.js +2 -2
  43. package/examples/js/objects/Water2.js +4 -7
  44. package/examples/js/postprocessing/GlitchPass.js +3 -1
  45. package/examples/js/postprocessing/SSAOPass.js +1 -0
  46. package/examples/js/shaders/ConvolutionShader.js +0 -1
  47. package/examples/js/shaders/FXAAShader.js +1 -1
  48. package/examples/js/shaders/FilmShader.js +1 -1
  49. package/examples/js/shaders/GammaCorrectionShader.js +1 -1
  50. package/examples/js/shaders/HorizontalBlurShader.js +1 -2
  51. package/examples/js/shaders/SSRShader.js +1 -1
  52. package/examples/js/shaders/SSRrShader.js +1 -1
  53. package/examples/js/shaders/VerticalBlurShader.js +1 -2
  54. package/examples/js/utils/GeometryUtils.js +1 -1
  55. package/examples/js/utils/RoughnessMipmapper.js +18 -29
  56. package/examples/jsm/animation/CCDIKSolver.js +0 -1
  57. package/examples/jsm/animation/MMDPhysics.js +0 -2
  58. package/examples/jsm/controls/ArcballControls.js +27 -56
  59. package/examples/jsm/controls/TransformControls.js +24 -1
  60. package/examples/jsm/curves/CurveExtras.js +0 -2
  61. package/examples/jsm/effects/AsciiEffect.js +2 -9
  62. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  63. package/examples/jsm/geometries/TeapotGeometry.js +0 -1
  64. package/examples/jsm/interactive/SelectionBox.js +1 -0
  65. package/examples/jsm/interactive/SelectionHelper.js +19 -7
  66. package/examples/jsm/libs/flow.module.js +256 -136
  67. package/examples/jsm/lights/RectAreaLightUniformsLib.js +7 -0
  68. package/examples/jsm/loaders/AMFLoader.js +0 -2
  69. package/examples/jsm/loaders/ColladaLoader.js +1 -2
  70. package/examples/jsm/loaders/EXRLoader.js +184 -293
  71. package/examples/jsm/loaders/FBXLoader.js +3 -4
  72. package/examples/jsm/loaders/GLTFLoader.js +2 -2
  73. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -14
  74. package/examples/jsm/loaders/KTX2Loader.js +13 -4
  75. package/examples/jsm/loaders/KTXLoader.js +1 -1
  76. package/examples/jsm/loaders/LDrawLoader.js +23 -24
  77. package/examples/jsm/loaders/LUT3dlLoader.js +2 -0
  78. package/examples/jsm/loaders/LUTCubeLoader.js +2 -0
  79. package/examples/jsm/loaders/MMDLoader.js +0 -1
  80. package/examples/jsm/loaders/NRRDLoader.js +10 -2
  81. package/examples/jsm/loaders/OBJLoader.js +0 -2
  82. package/examples/jsm/loaders/PLYLoader.js +1 -1
  83. package/examples/jsm/loaders/RGBELoader.js +0 -20
  84. package/examples/jsm/loaders/RGBMLoader.js +61 -7
  85. package/examples/jsm/loaders/SVGLoader.js +2 -2
  86. package/examples/jsm/loaders/TDSLoader.js +30 -9
  87. package/examples/jsm/loaders/VOXLoader.js +1 -0
  88. package/examples/jsm/loaders/VRMLLoader.js +2 -1
  89. package/examples/jsm/math/ImprovedNoise.js +1 -1
  90. package/examples/jsm/misc/GPUComputationRenderer.js +3 -1
  91. package/examples/jsm/node-editor/NodeEditor.js +23 -22
  92. package/examples/jsm/node-editor/examples/rim.json +1 -1
  93. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +48 -9
  94. package/examples/jsm/node-editor/utils/OscillatorEditor.js +1 -1
  95. package/examples/jsm/nodes/core/NodeBuilder.js +2 -2
  96. package/examples/jsm/nodes/materials/nodes/StandardNode.js +1 -0
  97. package/examples/jsm/nodes/math/MathNode.js +12 -0
  98. package/examples/jsm/nodes/misc/BumpMapNode.js +1 -1
  99. package/examples/jsm/nodes/misc/TextureCubeUVNode.js +1 -4
  100. package/examples/jsm/nodes/utils/ColorSpaceNode.js +1 -116
  101. package/examples/jsm/objects/Lensflare.js +3 -14
  102. package/examples/jsm/objects/Reflector.js +7 -0
  103. package/examples/jsm/objects/Refractor.js +7 -0
  104. package/examples/jsm/objects/Sky.js +1 -1
  105. package/examples/jsm/objects/Water.js +2 -2
  106. package/examples/jsm/objects/Water2.js +4 -8
  107. package/examples/jsm/postprocessing/GlitchPass.js +3 -1
  108. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  109. package/examples/jsm/postprocessing/SSAOPass.js +1 -0
  110. package/examples/jsm/renderers/nodes/Nodes.js +1 -0
  111. package/examples/jsm/renderers/nodes/ShaderNode.js +7 -6
  112. package/examples/jsm/renderers/nodes/core/InputNode.js +1 -1
  113. package/examples/jsm/renderers/nodes/core/NodeBuilder.js +1 -1
  114. package/examples/jsm/renderers/nodes/display/ColorSpaceNode.js +26 -31
  115. package/examples/jsm/renderers/nodes/functions/BSDFs.js +2 -2
  116. package/examples/jsm/renderers/nodes/functions/PhysicalMaterialFunctions.js +27 -0
  117. package/examples/jsm/renderers/nodes/inputs/TextureNode.js +1 -1
  118. package/examples/jsm/renderers/nodes/math/MathNode.js +5 -3
  119. package/examples/jsm/renderers/nodes/math/OperatorNode.js +2 -2
  120. package/examples/jsm/renderers/nodes/utils/TimerNode.js +1 -1
  121. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +14 -14
  122. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +7 -6
  123. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +1 -1
  124. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +42 -61
  125. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +2 -2
  126. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +0 -1
  127. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +30 -4
  128. package/examples/jsm/shaders/ConvolutionShader.js +0 -1
  129. package/examples/jsm/shaders/FXAAShader.js +1 -1
  130. package/examples/jsm/shaders/FilmShader.js +1 -1
  131. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  132. package/examples/jsm/shaders/HorizontalBlurShader.js +1 -2
  133. package/examples/jsm/shaders/SSRShader.js +1 -1
  134. package/examples/jsm/shaders/SSRrShader.js +1 -1
  135. package/examples/jsm/shaders/VerticalBlurShader.js +1 -2
  136. package/examples/jsm/utils/GeometryUtils.js +1 -1
  137. package/examples/jsm/utils/RoughnessMipmapper.js +19 -32
  138. package/examples/jsm/utils/WorkerPool.js +11 -11
  139. package/package.json +15 -9
  140. package/src/Three.Legacy.js +12 -0
  141. package/src/Three.js +1 -2
  142. package/src/constants.js +1 -7
  143. package/src/core/Object3D.js +1 -1
  144. package/src/extras/PMREMGenerator.js +19 -110
  145. package/src/extras/core/Interpolations.js +1 -1
  146. package/src/geometries/LatheGeometry.js +70 -47
  147. package/src/helpers/CameraHelper.js +1 -1
  148. package/src/loaders/FileLoader.js +23 -6
  149. package/src/math/Color.js +0 -38
  150. package/src/math/Ray.js +2 -2
  151. package/src/math/Sphere.js +10 -1
  152. package/src/objects/Skeleton.js +1 -0
  153. package/src/renderers/WebGLRenderer.js +23 -16
  154. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +1 -1
  155. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +2 -24
  156. package/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js +0 -47
  157. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +1 -1
  158. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +27 -1
  159. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
  160. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +10 -0
  161. package/src/renderers/webgl/WebGLCapabilities.js +0 -2
  162. package/src/renderers/webgl/WebGLMorphtargets.js +1 -0
  163. package/src/renderers/webgl/WebGLProgram.js +2 -19
  164. package/src/renderers/webgl/WebGLPrograms.js +191 -35
  165. package/src/renderers/webgl/WebGLRenderLists.js +4 -14
  166. package/src/renderers/webgl/WebGLShaderCache.js +120 -0
  167. package/src/renderers/webgl/WebGLState.js +45 -0
  168. package/src/renderers/webgl/WebGLTextures.js +195 -26
  169. package/src/renderers/webxr/WebXRManager.js +10 -3
  170. package/src/scenes/Scene.js +1 -1
  171. package/src/textures/DataTexture.js +0 -2
  172. package/src/textures/DataTexture2DArray.js +0 -2
  173. package/src/textures/DataTexture3D.js +0 -2
  174. package/src/textures/FramebufferTexture.js +25 -0
  175. package/src/utils.js +1 -37
@@ -1,7 +1,7 @@
1
1
  import { WebGLUniforms } from './WebGLUniforms.js';
2
2
  import { WebGLShader } from './WebGLShader.js';
3
3
  import { ShaderChunk } from '../shaders/ShaderChunk.js';
4
- import { RGBFormat, NoToneMapping, AddOperation, MixOperation, MultiplyOperation, CubeRefractionMapping, CubeUVRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, VSMShadowMap, ACESFilmicToneMapping, CineonToneMapping, CustomToneMapping, ReinhardToneMapping, LinearToneMapping, GammaEncoding, RGBDEncoding, RGBM16Encoding, RGBM7Encoding, RGBEEncoding, sRGBEncoding, LinearEncoding, GLSL3 } from '../../constants.js';
4
+ import { RGBFormat, NoToneMapping, AddOperation, MixOperation, MultiplyOperation, CubeRefractionMapping, CubeUVRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, VSMShadowMap, ACESFilmicToneMapping, CineonToneMapping, CustomToneMapping, ReinhardToneMapping, LinearToneMapping, sRGBEncoding, LinearEncoding, GLSL3 } from '../../constants.js';
5
5
 
6
6
  let programIdCount = 0;
7
7
 
@@ -27,16 +27,6 @@ function getEncodingComponents( encoding ) {
27
27
  return [ 'Linear', '( value )' ];
28
28
  case sRGBEncoding:
29
29
  return [ 'sRGB', '( value )' ];
30
- case RGBEEncoding:
31
- return [ 'RGBE', '( value )' ];
32
- case RGBM7Encoding:
33
- return [ 'RGBM', '( value, 7.0 )' ];
34
- case RGBM16Encoding:
35
- return [ 'RGBM', '( value, 16.0 )' ];
36
- case RGBDEncoding:
37
- return [ 'RGBD', '( value, 256.0 )' ];
38
- case GammaEncoding:
39
- return [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ];
40
30
  default:
41
31
  console.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding );
42
32
  return [ 'Linear', '( value )' ];
@@ -397,9 +387,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
397
387
  const envMapModeDefine = generateEnvMapModeDefine( parameters );
398
388
  const envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );
399
389
 
400
-
401
- const gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;
402
-
403
390
  const customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );
404
391
 
405
392
  const customDefines = generateDefines( defines );
@@ -451,8 +438,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
451
438
 
452
439
  parameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',
453
440
 
454
- '#define GAMMA_FACTOR ' + gammaFactorDefine,
455
-
456
441
  '#define MAX_BONES ' + parameters.maxBones,
457
442
  ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
458
443
  ( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',
@@ -601,8 +586,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
601
586
 
602
587
  customDefines,
603
588
 
604
- '#define GAMMA_FACTOR ' + gammaFactorDefine,
605
-
606
589
  ( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',
607
590
  ( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',
608
591
 
@@ -722,7 +705,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
722
705
 
723
706
  prefixFragment = [
724
707
  '#define varying in',
725
- ( parameters.glslVersion === GLSL3 ) ? '' : 'out highp vec4 pc_fragColor;',
708
+ ( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',
726
709
  ( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',
727
710
  '#define gl_FragDepthEXT gl_FragDepth',
728
711
  '#define texture2D texture',
@@ -1,11 +1,14 @@
1
- import { BackSide, DoubleSide, CubeUVRefractionMapping, CubeUVReflectionMapping, LinearEncoding, ObjectSpaceNormalMap, TangentSpaceNormalMap, NoToneMapping } from '../../constants.js';
1
+ import { BackSide, DoubleSide, CubeUVRefractionMapping, CubeUVReflectionMapping, LinearEncoding, sRGBEncoding, ObjectSpaceNormalMap, TangentSpaceNormalMap, NoToneMapping, RGBAFormat, UnsignedByteType } from '../../constants.js';
2
+ import { Layers } from '../../core/Layers.js';
2
3
  import { WebGLProgram } from './WebGLProgram.js';
4
+ import { WebGLShaderCache } from './WebGLShaderCache.js';
3
5
  import { ShaderLib } from '../shaders/ShaderLib.js';
4
6
  import { UniformsUtils } from '../shaders/UniformsUtils.js';
5
- import { hashString } from '../../utils.js';
6
7
 
7
8
  function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {
8
9
 
10
+ const _programLayers = new Layers();
11
+ const _customShaders = new WebGLShaderCache();
9
12
  const programs = [];
10
13
 
11
14
  const isWebGL2 = capabilities.isWebGL2;
@@ -13,7 +16,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
13
16
  const floatVertexTextures = capabilities.floatVertexTextures;
14
17
  const maxVertexUniforms = capabilities.maxVertexUniforms;
15
18
  const vertexTextures = capabilities.vertexTextures;
16
-
17
19
  let precision = capabilities.precision;
18
20
 
19
21
  const shaderIDs = {
@@ -34,25 +36,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
34
36
  SpriteMaterial: 'sprite'
35
37
  };
36
38
 
37
- const parameterNames = [
38
- 'precision', 'isWebGL2', 'supportsVertexTextures', 'outputEncoding', 'instancing', 'instancingColor',
39
- 'map', 'mapEncoding', 'matcap', 'matcapEncoding', 'envMap', 'envMapMode', 'envMapEncoding', 'envMapCubeUV',
40
- 'lightMap', 'lightMapEncoding', 'aoMap', 'emissiveMap', 'emissiveMapEncoding', 'bumpMap', 'normalMap',
41
- 'objectSpaceNormalMap', 'tangentSpaceNormalMap',
42
- 'clearcoat', 'clearcoatMap', 'clearcoatRoughnessMap', 'clearcoatNormalMap',
43
- 'displacementMap', 'specularMap', , 'roughnessMap', 'metalnessMap', 'gradientMap',
44
- 'alphaMap', 'alphaTest', 'combine', 'vertexColors', 'vertexAlphas', 'vertexTangents', 'vertexUvs', 'uvsVertexOnly', 'fog', 'useFog', 'fogExp2',
45
- 'flatShading', 'sizeAttenuation', 'logarithmicDepthBuffer', 'skinning',
46
- 'maxBones', 'useVertexTexture', 'morphTargets', 'morphNormals', 'morphTargetsCount', 'premultipliedAlpha',
47
- 'numDirLights', 'numPointLights', 'numSpotLights', 'numHemiLights', 'numRectAreaLights',
48
- 'numDirLightShadows', 'numPointLightShadows', 'numSpotLightShadows',
49
- 'shadowMapEnabled', 'shadowMapType', 'toneMapping', 'physicallyCorrectLights',
50
- 'doubleSided', 'flipSided', 'numClippingPlanes', 'numClipIntersection', 'depthPacking', 'dithering', 'format',
51
- 'specularIntensityMap', 'specularColorMap', 'specularColorMapEncoding',
52
- 'transmission', 'transmissionMap', 'thicknessMap',
53
- 'sheen', 'sheenColorMap', 'sheenColorMapEncoding', 'sheenRoughnessMap'
54
- ];
55
-
56
39
  function getMaxBones( object ) {
57
40
 
58
41
  const skeleton = object.skeleton;
@@ -108,11 +91,11 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
108
91
 
109
92
  }
110
93
 
111
- /* if ( isWebGL2 && map && map.isTexture && map.format === RGBAFormat && map.type === UnsignedByteType && map.encoding === sRGBEncoding ) {
94
+ if ( isWebGL2 && map && map.isTexture && map.format === RGBAFormat && map.type === UnsignedByteType && map.encoding === sRGBEncoding ) {
112
95
 
113
96
  encoding = LinearEncoding; // disable inline decode for sRGB textures in WebGL 2
114
97
 
115
- } */
98
+ }
116
99
 
117
100
  return encoding;
118
101
 
@@ -145,6 +128,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
145
128
  }
146
129
 
147
130
  let vertexShader, fragmentShader;
131
+ let customVertexShaderID, customFragmentShaderID;
148
132
 
149
133
  if ( shaderID ) {
150
134
 
@@ -158,6 +142,11 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
158
142
  vertexShader = material.vertexShader;
159
143
  fragmentShader = material.fragmentShader;
160
144
 
145
+ _customShaders.update( material );
146
+
147
+ customVertexShaderID = _customShaders.getVertexShaderID( material );
148
+ customFragmentShaderID = _customShaders.getFragmentShaderID( material );
149
+
161
150
  }
162
151
 
163
152
  const currentRenderTarget = renderer.getRenderTarget();
@@ -176,6 +165,9 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
176
165
  fragmentShader: fragmentShader,
177
166
  defines: material.defines,
178
167
 
168
+ customVertexShaderID: customVertexShaderID,
169
+ customFragmentShaderID: customFragmentShaderID,
170
+
179
171
  isRawShaderMaterial: material.isRawShaderMaterial === true,
180
172
  glslVersion: material.glslVersion,
181
173
 
@@ -236,7 +228,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
236
228
  vertexTangents: ( !! material.normalMap && !! object.geometry && !! object.geometry.attributes.tangent ),
237
229
  vertexColors: material.vertexColors,
238
230
  vertexAlphas: material.vertexColors === true && !! object.geometry && !! object.geometry.attributes.color && object.geometry.attributes.color.itemSize === 4,
239
- vertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || material.sheenRoughnessMap,
231
+ vertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || !! material.sheenRoughnessMap,
240
232
  uvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || material.transmission > 0 || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || material.sheen > 0 || !! material.sheenColorMap || !! material.sheenRoughnessMap ) && !! material.displacementMap,
241
233
 
242
234
  fog: !! fog,
@@ -314,8 +306,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
314
306
 
315
307
  } else {
316
308
 
317
- array.push( hashString( parameters.fragmentShader ) );
318
- array.push( hashString( parameters.vertexShader ) );
309
+ array.push( parameters.customVertexShaderID );
310
+ array.push( parameters.customFragmentShaderID );
319
311
 
320
312
  }
321
313
 
@@ -332,14 +324,9 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
332
324
 
333
325
  if ( parameters.isRawShaderMaterial === false ) {
334
326
 
335
- for ( let i = 0; i < parameterNames.length; i ++ ) {
336
-
337
- array.push( parameters[ parameterNames[ i ] ] );
338
-
339
- }
340
-
327
+ getProgramCacheKeyParameters( array, parameters );
328
+ getProgramCacheKeyBooleans( array, parameters );
341
329
  array.push( renderer.outputEncoding );
342
- array.push( renderer.gammaFactor );
343
330
 
344
331
  }
345
332
 
@@ -349,6 +336,161 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
349
336
 
350
337
  }
351
338
 
339
+ function getProgramCacheKeyParameters( array, parameters ) {
340
+
341
+ array.push( parameters.precision );
342
+ array.push( parameters.outputEncoding );
343
+ array.push( parameters.mapEncoding );
344
+ array.push( parameters.matcapEncoding );
345
+ array.push( parameters.envMapMode );
346
+ array.push( parameters.envMapEncoding );
347
+ array.push( parameters.lightMapEncoding );
348
+ array.push( parameters.emissiveMapEncoding );
349
+ array.push( parameters.combine );
350
+ array.push( parameters.vertexUvs );
351
+ array.push( parameters.fogExp2 );
352
+ array.push( parameters.sizeAttenuation );
353
+ array.push( parameters.maxBones );
354
+ array.push( parameters.morphTargetsCount );
355
+ array.push( parameters.numDirLights );
356
+ array.push( parameters.numPointLights );
357
+ array.push( parameters.numSpotLights );
358
+ array.push( parameters.numHemiLights );
359
+ array.push( parameters.numRectAreaLights );
360
+ array.push( parameters.numDirLightShadows );
361
+ array.push( parameters.numPointLightShadows );
362
+ array.push( parameters.numSpotLightShadows );
363
+ array.push( parameters.shadowMapType );
364
+ array.push( parameters.toneMapping );
365
+ array.push( parameters.numClippingPlanes );
366
+ array.push( parameters.numClipIntersection );
367
+ array.push( parameters.format );
368
+ array.push( parameters.specularColorMapEncoding );
369
+ array.push( parameters.sheenColorMapEncoding );
370
+
371
+ }
372
+
373
+ function getProgramCacheKeyBooleans( array, parameters ) {
374
+
375
+ _programLayers.disableAll();
376
+
377
+ if ( parameters.isWebGL2 )
378
+ _programLayers.enable( 0 );
379
+ if ( parameters.supportsVertexTextures )
380
+ _programLayers.enable( 1 );
381
+ if ( parameters.instancing )
382
+ _programLayers.enable( 2 );
383
+ if ( parameters.instancingColor )
384
+ _programLayers.enable( 3 );
385
+ if ( parameters.map )
386
+ _programLayers.enable( 4 );
387
+ if ( parameters.matcap )
388
+ _programLayers.enable( 5 );
389
+ if ( parameters.envMap )
390
+ _programLayers.enable( 6 );
391
+ if ( parameters.envMapCubeUV )
392
+ _programLayers.enable( 7 );
393
+ if ( parameters.lightMap )
394
+ _programLayers.enable( 8 );
395
+ if ( parameters.aoMap )
396
+ _programLayers.enable( 9 );
397
+ if ( parameters.emissiveMap )
398
+ _programLayers.enable( 10 );
399
+ if ( parameters.bumpMap )
400
+ _programLayers.enable( 11 );
401
+ if ( parameters.normalMap )
402
+ _programLayers.enable( 12 );
403
+ if ( parameters.objectSpaceNormalMap )
404
+ _programLayers.enable( 13 );
405
+ if ( parameters.tangentSpaceNormalMap )
406
+ _programLayers.enable( 14 );
407
+ if ( parameters.clearcoat )
408
+ _programLayers.enable( 15 );
409
+ if ( parameters.clearcoatMap )
410
+ _programLayers.enable( 16 );
411
+ if ( parameters.clearcoatRoughnessMap )
412
+ _programLayers.enable( 17 );
413
+ if ( parameters.clearcoatNormalMap )
414
+ _programLayers.enable( 18 );
415
+ if ( parameters.displacementMap )
416
+ _programLayers.enable( 19 );
417
+ if ( parameters.specularMap )
418
+ _programLayers.enable( 20 );
419
+ if ( parameters.roughnessMap )
420
+ _programLayers.enable( 21 );
421
+ if ( parameters.metalnessMap )
422
+ _programLayers.enable( 22 );
423
+ if ( parameters.gradientMap )
424
+ _programLayers.enable( 23 );
425
+ if ( parameters.alphaMap )
426
+ _programLayers.enable( 24 );
427
+ if ( parameters.alphaTest )
428
+ _programLayers.enable( 25 );
429
+ if ( parameters.vertexColors )
430
+ _programLayers.enable( 26 );
431
+ if ( parameters.vertexAlphas )
432
+ _programLayers.enable( 27 );
433
+ if ( parameters.vertexUvs )
434
+ _programLayers.enable( 28 );
435
+ if ( parameters.vertexTangents )
436
+ _programLayers.enable( 29 );
437
+ if ( parameters.uvsVertexOnly )
438
+ _programLayers.enable( 30 );
439
+ if ( parameters.fog )
440
+ _programLayers.enable( 31 );
441
+
442
+ array.push( _programLayers.mask );
443
+ _programLayers.disableAll();
444
+
445
+ if ( parameters.useFog )
446
+ _programLayers.enable( 0 );
447
+ if ( parameters.flatShading )
448
+ _programLayers.enable( 1 );
449
+ if ( parameters.logarithmicDepthBuffer )
450
+ _programLayers.enable( 2 );
451
+ if ( parameters.skinning )
452
+ _programLayers.enable( 3 );
453
+ if ( parameters.useVertexTexture )
454
+ _programLayers.enable( 4 );
455
+ if ( parameters.morphTargets )
456
+ _programLayers.enable( 5 );
457
+ if ( parameters.morphNormals )
458
+ _programLayers.enable( 6 );
459
+ if ( parameters.premultipliedAlpha )
460
+ _programLayers.enable( 7 );
461
+ if ( parameters.shadowMapEnabled )
462
+ _programLayers.enable( 8 );
463
+ if ( parameters.physicallyCorrectLights )
464
+ _programLayers.enable( 9 );
465
+ if ( parameters.doubleSided )
466
+ _programLayers.enable( 10 );
467
+ if ( parameters.flipSided )
468
+ _programLayers.enable( 11 );
469
+ if ( parameters.depthPacking )
470
+ _programLayers.enable( 12 );
471
+ if ( parameters.dithering )
472
+ _programLayers.enable( 13 );
473
+ if ( parameters.specularIntensityMap )
474
+ _programLayers.enable( 14 );
475
+ if ( parameters.specularColorMap )
476
+ _programLayers.enable( 15 );
477
+ if ( parameters.transmission )
478
+ _programLayers.enable( 16 );
479
+ if ( parameters.transmissionMap )
480
+ _programLayers.enable( 17 );
481
+ if ( parameters.thicknessMap )
482
+ _programLayers.enable( 18 );
483
+ if ( parameters.sheen )
484
+ _programLayers.enable( 19 );
485
+ if ( parameters.sheenColorMap )
486
+ _programLayers.enable( 20 );
487
+ if ( parameters.sheenRoughnessMap )
488
+ _programLayers.enable( 21 );
489
+
490
+ array.push( _programLayers.mask );
491
+
492
+ }
493
+
352
494
  function getUniforms( material ) {
353
495
 
354
496
  const shaderID = shaderIDs[ material.type ];
@@ -416,14 +558,28 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
416
558
 
417
559
  }
418
560
 
561
+ function releaseShaderCache( material ) {
562
+
563
+ _customShaders.remove( material );
564
+
565
+ }
566
+
567
+ function dispose() {
568
+
569
+ _customShaders.dispose();
570
+
571
+ }
572
+
419
573
  return {
420
574
  getParameters: getParameters,
421
575
  getProgramCacheKey: getProgramCacheKey,
422
576
  getUniforms: getUniforms,
423
577
  acquireProgram: acquireProgram,
424
578
  releaseProgram: releaseProgram,
579
+ releaseShaderCache: releaseShaderCache,
425
580
  // Exposed for resource monitoring & error feedback via renderer.info:
426
- programs: programs
581
+ programs: programs,
582
+ dispose: dispose
427
583
  };
428
584
 
429
585
  }
@@ -8,10 +8,6 @@ function painterSortStable( a, b ) {
8
8
 
9
9
  return a.renderOrder - b.renderOrder;
10
10
 
11
- } else if ( a.program !== b.program ) {
12
-
13
- return a.program.id - b.program.id;
14
-
15
11
  } else if ( a.material.id !== b.material.id ) {
16
12
 
17
13
  return a.material.id - b.material.id;
@@ -51,7 +47,7 @@ function reversePainterSortStable( a, b ) {
51
47
  }
52
48
 
53
49
 
54
- function WebGLRenderList( properties ) {
50
+ function WebGLRenderList() {
55
51
 
56
52
  const renderItems = [];
57
53
  let renderItemsIndex = 0;
@@ -60,8 +56,6 @@ function WebGLRenderList( properties ) {
60
56
  const transmissive = [];
61
57
  const transparent = [];
62
58
 
63
- const defaultProgram = { id: - 1 };
64
-
65
59
  function init() {
66
60
 
67
61
  renderItemsIndex = 0;
@@ -75,7 +69,6 @@ function WebGLRenderList( properties ) {
75
69
  function getNextRenderItem( object, geometry, material, groupOrder, z, group ) {
76
70
 
77
71
  let renderItem = renderItems[ renderItemsIndex ];
78
- const materialProperties = properties.get( material );
79
72
 
80
73
  if ( renderItem === undefined ) {
81
74
 
@@ -84,7 +77,6 @@ function WebGLRenderList( properties ) {
84
77
  object: object,
85
78
  geometry: geometry,
86
79
  material: material,
87
- program: materialProperties.program || defaultProgram,
88
80
  groupOrder: groupOrder,
89
81
  renderOrder: object.renderOrder,
90
82
  z: z,
@@ -99,7 +91,6 @@ function WebGLRenderList( properties ) {
99
91
  renderItem.object = object;
100
92
  renderItem.geometry = geometry;
101
93
  renderItem.material = material;
102
- renderItem.program = materialProperties.program || defaultProgram;
103
94
  renderItem.groupOrder = groupOrder;
104
95
  renderItem.renderOrder = object.renderOrder;
105
96
  renderItem.z = z;
@@ -175,7 +166,6 @@ function WebGLRenderList( properties ) {
175
166
  renderItem.object = null;
176
167
  renderItem.geometry = null;
177
168
  renderItem.material = null;
178
- renderItem.program = null;
179
169
  renderItem.group = null;
180
170
 
181
171
  }
@@ -198,7 +188,7 @@ function WebGLRenderList( properties ) {
198
188
 
199
189
  }
200
190
 
201
- function WebGLRenderLists( properties ) {
191
+ function WebGLRenderLists() {
202
192
 
203
193
  let lists = new WeakMap();
204
194
 
@@ -208,14 +198,14 @@ function WebGLRenderLists( properties ) {
208
198
 
209
199
  if ( lists.has( scene ) === false ) {
210
200
 
211
- list = new WebGLRenderList( properties );
201
+ list = new WebGLRenderList();
212
202
  lists.set( scene, [ list ] );
213
203
 
214
204
  } else {
215
205
 
216
206
  if ( renderCallDepth >= lists.get( scene ).length ) {
217
207
 
218
- list = new WebGLRenderList( properties );
208
+ list = new WebGLRenderList();
219
209
  lists.get( scene ).push( list );
220
210
 
221
211
  } else {
@@ -0,0 +1,120 @@
1
+ let _id = 0;
2
+
3
+ class WebGLShaderCache {
4
+
5
+ constructor() {
6
+
7
+ this.shaderCache = new Map();
8
+ this.materialCache = new Map();
9
+
10
+ }
11
+
12
+ update( material ) {
13
+
14
+ const vertexShader = material.vertexShader;
15
+ const fragmentShader = material.fragmentShader;
16
+
17
+ const vertexShaderStage = this._getShaderStage( vertexShader );
18
+ const fragmentShaderStage = this._getShaderStage( fragmentShader );
19
+
20
+ const materialShaders = this._getShaderCacheForMaterial( material );
21
+
22
+ if ( materialShaders.has( vertexShaderStage ) === false ) {
23
+
24
+ materialShaders.add( vertexShaderStage );
25
+ vertexShaderStage.usedTimes ++;
26
+
27
+ }
28
+
29
+ if ( materialShaders.has( fragmentShaderStage ) === false ) {
30
+
31
+ materialShaders.add( fragmentShaderStage );
32
+ fragmentShaderStage.usedTimes ++;
33
+
34
+ }
35
+
36
+ return this;
37
+
38
+ }
39
+
40
+ remove( material ) {
41
+
42
+ const materialShaders = this.materialCache.get( material );
43
+
44
+ for ( const shaderStage of materialShaders ) {
45
+
46
+ shaderStage.usedTimes --;
47
+
48
+ if ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage );
49
+
50
+ }
51
+
52
+ this.materialCache.delete( material );
53
+
54
+ return this;
55
+
56
+ }
57
+
58
+ getVertexShaderID( material ) {
59
+
60
+ return this._getShaderStage( material.vertexShader ).id;
61
+
62
+ }
63
+
64
+ getFragmentShaderID( material ) {
65
+
66
+ return this._getShaderStage( material.fragmentShader ).id;
67
+
68
+ }
69
+
70
+ dispose() {
71
+
72
+ this.shaderCache.clear();
73
+ this.materialCache.clear();
74
+
75
+ }
76
+
77
+ _getShaderCacheForMaterial( material ) {
78
+
79
+ const cache = this.materialCache;
80
+
81
+ if ( cache.has( material ) === false ) {
82
+
83
+ cache.set( material, new Set() );
84
+
85
+ }
86
+
87
+ return cache.get( material );
88
+
89
+ }
90
+
91
+ _getShaderStage( code ) {
92
+
93
+ const cache = this.shaderCache;
94
+
95
+ if ( cache.has( code ) === false ) {
96
+
97
+ const stage = new WebGLShaderStage();
98
+ cache.set( code, stage );
99
+
100
+ }
101
+
102
+ return cache.get( code );
103
+
104
+ }
105
+
106
+ }
107
+
108
+ class WebGLShaderStage {
109
+
110
+ constructor() {
111
+
112
+ this.id = _id ++;
113
+
114
+ this.usedTimes = 0;
115
+
116
+ }
117
+
118
+ }
119
+
120
+ export { WebGLShaderCache };
@@ -878,6 +878,34 @@ function WebGLState( gl, extensions, capabilities ) {
878
878
 
879
879
  }
880
880
 
881
+ function texSubImage3D() {
882
+
883
+ try {
884
+
885
+ gl.texSubImage3D.apply( gl, arguments );
886
+
887
+ } catch ( error ) {
888
+
889
+ console.error( 'THREE.WebGLState:', error );
890
+
891
+ }
892
+
893
+ }
894
+
895
+ function compressedTexSubImage2D() {
896
+
897
+ try {
898
+
899
+ gl.compressedTexSubImage2D.apply( gl, arguments );
900
+
901
+ } catch ( error ) {
902
+
903
+ console.error( 'THREE.WebGLState:', error );
904
+
905
+ }
906
+
907
+ }
908
+
881
909
  function texStorage2D() {
882
910
 
883
911
  try {
@@ -892,6 +920,20 @@ function WebGLState( gl, extensions, capabilities ) {
892
920
 
893
921
  }
894
922
 
923
+ function texStorage3D() {
924
+
925
+ try {
926
+
927
+ gl.texStorage3D.apply( gl, arguments );
928
+
929
+ } catch ( error ) {
930
+
931
+ console.error( 'THREE.WebGLState:', error );
932
+
933
+ }
934
+
935
+ }
936
+
895
937
  function texImage2D() {
896
938
 
897
939
  try {
@@ -1069,7 +1111,10 @@ function WebGLState( gl, extensions, capabilities ) {
1069
1111
  texImage3D: texImage3D,
1070
1112
 
1071
1113
  texStorage2D: texStorage2D,
1114
+ texStorage3D: texStorage3D,
1072
1115
  texSubImage2D: texSubImage2D,
1116
+ texSubImage3D: texSubImage3D,
1117
+ compressedTexSubImage2D: compressedTexSubImage2D,
1073
1118
 
1074
1119
  scissor: scissor,
1075
1120
  viewport: viewport,