super-three 0.162.0 → 0.164.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/build/three.cjs +847 -1226
  2. package/build/three.module.js +846 -1225
  3. package/build/three.module.min.js +2 -2
  4. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  5. package/examples/jsm/controls/TransformControls.js +3 -3
  6. package/examples/jsm/exporters/GLTFExporter.js +66 -5
  7. package/examples/jsm/exporters/USDZExporter.js +22 -1
  8. package/examples/jsm/geometries/TextGeometry.js +10 -2
  9. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  10. package/examples/jsm/libs/draco/README.md +2 -2
  11. package/examples/jsm/libs/fflate.module.js +694 -496
  12. package/examples/jsm/lines/LineMaterial.js +0 -2
  13. package/examples/jsm/loaders/3MFLoader.js +2 -0
  14. package/examples/jsm/loaders/EXRLoader.js +351 -97
  15. package/examples/jsm/loaders/FBXLoader.js +1 -1
  16. package/examples/jsm/loaders/GLTFLoader.js +59 -0
  17. package/examples/jsm/loaders/KTX2Loader.js +3 -10
  18. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  19. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  20. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  21. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  22. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  23. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  24. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  25. package/examples/jsm/math/Octree.js +26 -20
  26. package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
  27. package/examples/jsm/nodes/Nodes.js +10 -4
  28. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  29. package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
  30. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  31. package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
  32. package/examples/jsm/nodes/accessors/MaterialNode.js +107 -3
  33. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
  35. package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
  36. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
  38. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +51 -10
  40. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  41. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  42. package/examples/jsm/nodes/core/Node.js +63 -4
  43. package/examples/jsm/nodes/core/NodeBuilder.js +26 -25
  44. package/examples/jsm/nodes/core/NodeFrame.js +10 -10
  45. package/examples/jsm/nodes/core/NodeUtils.js +2 -2
  46. package/examples/jsm/nodes/core/OutputStructNode.js +2 -1
  47. package/examples/jsm/nodes/core/PropertyNode.js +10 -0
  48. package/examples/jsm/nodes/core/UniformNode.js +20 -0
  49. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  50. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  51. package/examples/jsm/nodes/display/PassNode.js +17 -1
  52. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
  53. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  54. package/examples/jsm/nodes/display/ViewportNode.js +4 -2
  55. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
  56. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  57. package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
  58. package/examples/jsm/nodes/fog/FogNode.js +13 -3
  59. package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
  60. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  61. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  62. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  63. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  64. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  65. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +164 -10
  66. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  67. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
  68. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  69. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -70
  70. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  71. package/examples/jsm/nodes/lighting/LightsNode.js +11 -1
  72. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  73. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  74. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +10 -6
  75. package/examples/jsm/nodes/materials/Materials.js +1 -0
  76. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  77. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  78. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +76 -5
  79. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  80. package/examples/jsm/nodes/materials/NodeMaterial.js +55 -43
  81. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  82. package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
  83. package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
  84. package/examples/jsm/nodes/shadernode/ShaderNode.js +3 -9
  85. package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
  86. package/examples/jsm/objects/QuadMesh.js +7 -23
  87. package/examples/jsm/physics/JoltPhysics.js +281 -0
  88. package/examples/jsm/physics/RapierPhysics.js +4 -4
  89. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  90. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  91. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  92. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  93. package/examples/jsm/postprocessing/SSAOPass.js +0 -3
  94. package/examples/jsm/renderers/common/Animation.js +3 -0
  95. package/examples/jsm/renderers/common/Background.js +8 -8
  96. package/examples/jsm/renderers/common/ClippingContext.js +1 -1
  97. package/examples/jsm/renderers/common/Info.js +11 -19
  98. package/examples/jsm/renderers/common/PostProcessing.js +12 -4
  99. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  100. package/examples/jsm/renderers/common/RenderList.js +1 -1
  101. package/examples/jsm/renderers/common/RenderObject.js +47 -5
  102. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  103. package/examples/jsm/renderers/common/Renderer.js +153 -21
  104. package/examples/jsm/renderers/common/Textures.js +1 -1
  105. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +773 -0
  106. package/examples/jsm/renderers/common/nodes/Nodes.js +34 -63
  107. package/examples/jsm/renderers/webgl/WebGLBackend.js +146 -36
  108. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +145 -0
  109. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +9 -3
  110. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
  111. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
  112. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +64 -7
  113. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +6 -23
  114. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +77 -60
  115. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +21 -4
  116. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +29 -1
  117. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
  118. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
  119. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  120. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  121. package/examples/jsm/utils/GPUStatsPanel.js +10 -45
  122. package/examples/jsm/utils/SceneUtils.js +60 -1
  123. package/examples/jsm/utils/TextureUtils.js +1 -1
  124. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  125. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  126. package/package.json +1 -1
  127. package/src/Three.js +0 -1
  128. package/src/animation/AnimationClip.js +1 -1
  129. package/src/constants.js +3 -3
  130. package/src/core/Object3D.js +10 -7
  131. package/src/core/RenderTarget.js +8 -0
  132. package/src/extras/PMREMGenerator.js +21 -11
  133. package/src/loaders/FileLoader.js +1 -1
  134. package/src/loaders/MaterialLoader.js +1 -0
  135. package/src/loaders/ObjectLoader.js +2 -0
  136. package/src/materials/Material.js +2 -0
  137. package/src/materials/MeshPhysicalMaterial.js +20 -0
  138. package/src/materials/ShaderMaterial.js +0 -4
  139. package/src/math/Spherical.js +4 -5
  140. package/src/objects/BatchedMesh.js +27 -3
  141. package/src/objects/InstancedMesh.js +10 -0
  142. package/src/objects/Line.js +66 -43
  143. package/src/renderers/WebGLRenderer.js +130 -158
  144. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  145. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  146. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  147. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  148. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  149. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  150. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
  151. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  152. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  153. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  154. package/src/renderers/shaders/ShaderChunk.js +0 -2
  155. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  156. package/src/renderers/shaders/ShaderLib.js +2 -1
  157. package/src/renderers/shaders/UniformsUtils.js +10 -1
  158. package/src/renderers/webgl/WebGLAttributes.js +6 -33
  159. package/src/renderers/webgl/WebGLBackground.js +18 -3
  160. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  161. package/src/renderers/webgl/WebGLBufferRenderer.js +35 -21
  162. package/src/renderers/webgl/WebGLCapabilities.js +35 -13
  163. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  164. package/src/renderers/webgl/WebGLExtensions.js +4 -19
  165. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +35 -21
  166. package/src/renderers/webgl/WebGLLights.js +6 -32
  167. package/src/renderers/webgl/WebGLMaterials.js +8 -3
  168. package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
  169. package/src/renderers/webgl/WebGLProgram.js +21 -52
  170. package/src/renderers/webgl/WebGLPrograms.js +24 -31
  171. package/src/renderers/webgl/WebGLRenderStates.js +13 -7
  172. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  173. package/src/renderers/webgl/WebGLState.js +15 -59
  174. package/src/renderers/webgl/WebGLTextures.js +138 -292
  175. package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
  176. package/src/renderers/webgl/WebGLUtils.js +9 -78
  177. package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
  178. package/src/renderers/webxr/WebXRManager.js +4 -6
  179. package/src/scenes/Scene.js +7 -1
  180. package/src/textures/Texture.js +11 -1
  181. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  182. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -320
  183. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  184. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -794
  185. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  186. package/src/renderers/WebGL1Renderer.js +0 -7
  187. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -1,4 +1,6 @@
1
- function WebGLCapabilities( gl, extensions, parameters ) {
1
+ import { FloatType, HalfFloatType, RGBAFormat, UnsignedByteType } from '../../constants.js';
2
+
3
+ function WebGLCapabilities( gl, extensions, parameters, utils ) {
2
4
 
3
5
  let maxAnisotropy;
4
6
 
@@ -22,6 +24,33 @@ function WebGLCapabilities( gl, extensions, parameters ) {
22
24
 
23
25
  }
24
26
 
27
+ function textureFormatReadable( textureFormat ) {
28
+
29
+ if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
30
+
31
+ return false;
32
+
33
+ }
34
+
35
+ return true;
36
+
37
+ }
38
+
39
+ function textureTypeReadable( textureType ) {
40
+
41
+ const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );
42
+
43
+ if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)
44
+ textureType !== FloatType && ! halfFloatSupportedByExt ) {
45
+
46
+ return false;
47
+
48
+ }
49
+
50
+ return true;
51
+
52
+ }
53
+
25
54
  function getMaxPrecision( precision ) {
26
55
 
27
56
  if ( precision === 'highp' ) {
@@ -52,8 +81,6 @@ function WebGLCapabilities( gl, extensions, parameters ) {
52
81
 
53
82
  }
54
83
 
55
- const isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl.constructor.name === 'WebGL2RenderingContext';
56
-
57
84
  let precision = parameters.precision !== undefined ? parameters.precision : 'highp';
58
85
  const maxPrecision = getMaxPrecision( precision );
59
86
 
@@ -64,8 +91,6 @@ function WebGLCapabilities( gl, extensions, parameters ) {
64
91
 
65
92
  }
66
93
 
67
- const drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' );
68
-
69
94
  const logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;
70
95
 
71
96
  const maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );
@@ -79,20 +104,19 @@ function WebGLCapabilities( gl, extensions, parameters ) {
79
104
  const maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );
80
105
 
81
106
  const vertexTextures = maxVertexTextures > 0;
82
- const floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' );
83
- const floatVertexTextures = vertexTextures && floatFragmentTextures;
84
107
 
85
- const maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0;
108
+ const maxSamples = gl.getParameter( gl.MAX_SAMPLES );
86
109
 
87
110
  return {
88
111
 
89
- isWebGL2: isWebGL2,
90
-
91
- drawBuffers: drawBuffers,
112
+ isWebGL2: true, // keeping this for backwards compatibility
92
113
 
93
114
  getMaxAnisotropy: getMaxAnisotropy,
94
115
  getMaxPrecision: getMaxPrecision,
95
116
 
117
+ textureFormatReadable: textureFormatReadable,
118
+ textureTypeReadable: textureTypeReadable,
119
+
96
120
  precision: precision,
97
121
  logarithmicDepthBuffer: logarithmicDepthBuffer,
98
122
 
@@ -107,8 +131,6 @@ function WebGLCapabilities( gl, extensions, parameters ) {
107
131
  maxFragmentUniforms: maxFragmentUniforms,
108
132
 
109
133
  vertexTextures: vertexTextures,
110
- floatFragmentTextures: floatFragmentTextures,
111
- floatVertexTextures: floatVertexTextures,
112
134
 
113
135
  maxSamples: maxSamples
114
136
 
@@ -20,24 +20,26 @@ function WebGLCubeUVMaps( renderer ) {
20
20
 
21
21
  if ( isEquirectMap || isCubeMap ) {
22
22
 
23
- if ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) {
23
+ let renderTarget = cubeUVmaps.get( texture );
24
24
 
25
- texture.needsPMREMUpdate = false;
25
+ const currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;
26
26
 
27
- let renderTarget = cubeUVmaps.get( texture );
27
+ if ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {
28
28
 
29
29
  if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );
30
30
 
31
31
  renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );
32
+ renderTarget.texture.pmremVersion = texture.pmremVersion;
33
+
32
34
  cubeUVmaps.set( texture, renderTarget );
33
35
 
34
36
  return renderTarget.texture;
35
37
 
36
38
  } else {
37
39
 
38
- if ( cubeUVmaps.has( texture ) ) {
40
+ if ( renderTarget !== undefined ) {
39
41
 
40
- return cubeUVmaps.get( texture ).texture;
42
+ return renderTarget.texture;
41
43
 
42
44
  } else {
43
45
 
@@ -47,7 +49,9 @@ function WebGLCubeUVMaps( renderer ) {
47
49
 
48
50
  if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );
49
51
 
50
- const renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );
52
+ renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );
53
+ renderTarget.texture.pmremVersion = texture.pmremVersion;
54
+
51
55
  cubeUVmaps.set( texture, renderTarget );
52
56
 
53
57
  texture.addEventListener( 'dispose', onTextureDispose );
@@ -49,29 +49,14 @@ function WebGLExtensions( gl ) {
49
49
 
50
50
  },
51
51
 
52
- init: function ( capabilities ) {
53
-
54
- if ( capabilities.isWebGL2 ) {
55
-
56
- getExtension( 'EXT_color_buffer_float' );
57
- getExtension( 'WEBGL_clip_cull_distance' );
58
-
59
- } else {
60
-
61
- getExtension( 'WEBGL_depth_texture' );
62
- getExtension( 'OES_texture_float' );
63
- getExtension( 'OES_texture_half_float' );
64
- getExtension( 'OES_texture_half_float_linear' );
65
- getExtension( 'OES_standard_derivatives' );
66
- getExtension( 'OES_element_index_uint' );
67
- getExtension( 'OES_vertex_array_object' );
68
- getExtension( 'ANGLE_instanced_arrays' );
69
-
70
- }
52
+ init: function () {
71
53
 
54
+ getExtension( 'EXT_color_buffer_float' );
55
+ getExtension( 'WEBGL_clip_cull_distance' );
72
56
  getExtension( 'OES_texture_float_linear' );
73
57
  getExtension( 'EXT_color_buffer_half_float' );
74
58
  getExtension( 'WEBGL_multisampled_render_to_texture' );
59
+ getExtension( 'WEBGL_render_shared_exponent' );
75
60
 
76
61
  },
77
62
 
@@ -1,6 +1,4 @@
1
- function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {
2
-
3
- const isWebGL2 = capabilities.isWebGL2;
1
+ function WebGLIndexedBufferRenderer( gl, extensions, info ) {
4
2
 
5
3
  let mode;
6
4
 
@@ -31,49 +29,60 @@ function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {
31
29
 
32
30
  if ( primcount === 0 ) return;
33
31
 
34
- let extension, methodName;
32
+ gl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );
35
33
 
36
- if ( isWebGL2 ) {
34
+ info.update( count, mode, primcount );
37
35
 
38
- extension = gl;
39
- methodName = 'drawElementsInstanced';
36
+ }
40
37
 
41
- } else {
38
+ function renderMultiDraw( starts, counts, drawCount ) {
39
+
40
+ if ( drawCount === 0 ) return;
41
+
42
+ const extension = extensions.get( 'WEBGL_multi_draw' );
42
43
 
43
- extension = extensions.get( 'ANGLE_instanced_arrays' );
44
- methodName = 'drawElementsInstancedANGLE';
44
+ if ( extension === null ) {
45
45
 
46
- if ( extension === null ) {
46
+ for ( let i = 0; i < drawCount; i ++ ) {
47
47
 
48
- console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
49
- return;
48
+ this.render( starts[ i ] / bytesPerElement, counts[ i ] );
50
49
 
51
50
  }
52
51
 
53
- }
52
+ } else {
54
53
 
55
- extension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );
54
+ extension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );
56
55
 
57
- info.update( count, mode, primcount );
56
+ let elementCount = 0;
57
+ for ( let i = 0; i < drawCount; i ++ ) {
58
+
59
+ elementCount += counts[ i ];
60
+
61
+ }
62
+
63
+ info.update( elementCount, mode, 1 );
64
+
65
+ }
58
66
 
59
67
  }
60
68
 
61
- function renderMultiDraw( starts, counts, drawCount ) {
69
+ function renderMultiDrawInstances( starts, counts, drawCount, primcount ) {
62
70
 
63
71
  if ( drawCount === 0 ) return;
64
72
 
65
73
  const extension = extensions.get( 'WEBGL_multi_draw' );
74
+
66
75
  if ( extension === null ) {
67
76
 
68
- for ( let i = 0; i < drawCount; i ++ ) {
77
+ for ( let i = 0; i < starts.length; i ++ ) {
69
78
 
70
- this.render( starts[ i ] / bytesPerElement, counts[ i ] );
79
+ renderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );
71
80
 
72
81
  }
73
82
 
74
83
  } else {
75
84
 
76
- extension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );
85
+ extension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );
77
86
 
78
87
  let elementCount = 0;
79
88
  for ( let i = 0; i < drawCount; i ++ ) {
@@ -82,7 +91,11 @@ function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {
82
91
 
83
92
  }
84
93
 
85
- info.update( elementCount, mode, 1 );
94
+ for ( let i = 0; i < primcount.length; i ++ ) {
95
+
96
+ info.update( elementCount, mode, primcount[ i ] );
97
+
98
+ }
86
99
 
87
100
  }
88
101
 
@@ -95,6 +108,7 @@ function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {
95
108
  this.render = render;
96
109
  this.renderInstances = renderInstances;
97
110
  this.renderMultiDraw = renderMultiDraw;
111
+ this.renderMultiDrawInstances = renderMultiDrawInstances;
98
112
 
99
113
  }
100
114
 
@@ -150,7 +150,7 @@ function shadowCastingAndTexturingLightsFirst( lightA, lightB ) {
150
150
 
151
151
  }
152
152
 
153
- function WebGLLights( extensions, capabilities ) {
153
+ function WebGLLights( extensions ) {
154
154
 
155
155
  const cache = new UniformsCache();
156
156
 
@@ -399,41 +399,15 @@ function WebGLLights( extensions, capabilities ) {
399
399
 
400
400
  if ( rectAreaLength > 0 ) {
401
401
 
402
- if ( capabilities.isWebGL2 ) {
402
+ if ( extensions.has( 'OES_texture_float_linear' ) === true ) {
403
403
 
404
- // WebGL 2
405
-
406
- if ( extensions.has( 'OES_texture_float_linear' ) === true ) {
407
-
408
- state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;
409
- state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;
410
-
411
- } else {
412
-
413
- state.rectAreaLTC1 = UniformsLib.LTC_HALF_1;
414
- state.rectAreaLTC2 = UniformsLib.LTC_HALF_2;
415
-
416
- }
404
+ state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;
405
+ state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;
417
406
 
418
407
  } else {
419
408
 
420
- // WebGL 1
421
-
422
- if ( extensions.has( 'OES_texture_float_linear' ) === true ) {
423
-
424
- state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;
425
- state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;
426
-
427
- } else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {
428
-
429
- state.rectAreaLTC1 = UniformsLib.LTC_HALF_1;
430
- state.rectAreaLTC2 = UniformsLib.LTC_HALF_2;
431
-
432
- } else {
433
-
434
- console.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );
435
-
436
- }
409
+ state.rectAreaLTC1 = UniformsLib.LTC_HALF_1;
410
+ state.rectAreaLTC2 = UniformsLib.LTC_HALF_2;
437
411
 
438
412
  }
439
413
 
@@ -393,11 +393,10 @@ function WebGLMaterials( renderer, properties ) {
393
393
 
394
394
  }
395
395
 
396
- const envMap = properties.get( material ).envMap;
397
-
398
- if ( envMap ) {
396
+ if ( material.envMap ) {
399
397
 
400
398
  //uniforms.envMap.value = material.envMap; // part of uniforms common
399
+
401
400
  uniforms.envMapIntensity.value = material.envMapIntensity;
402
401
 
403
402
  }
@@ -471,6 +470,12 @@ function WebGLMaterials( renderer, properties ) {
471
470
 
472
471
  }
473
472
 
473
+ if ( material.dispersion > 0 ) {
474
+
475
+ uniforms.dispersion.value = material.dispersion;
476
+
477
+ }
478
+
474
479
  if ( material.iridescence > 0 ) {
475
480
 
476
481
  uniforms.iridescence.value = material.iridescence;