super-three 0.158.0 → 0.160.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 (191) hide show
  1. package/build/three.cjs +1719 -379
  2. package/build/three.js +1719 -379
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +1718 -380
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/Addons.js +2 -1
  7. package/examples/jsm/controls/OrbitControls.js +50 -40
  8. package/examples/jsm/csm/CSMShader.js +52 -47
  9. package/examples/jsm/exporters/GLTFExporter.js +79 -1
  10. package/examples/jsm/exporters/USDZExporter.js +27 -19
  11. package/examples/jsm/helpers/TextureHelper.js +237 -0
  12. package/examples/jsm/interactive/HTMLMesh.js +9 -2
  13. package/examples/jsm/lines/LineMaterial.js +16 -33
  14. package/examples/jsm/loaders/ColladaLoader.js +0 -6
  15. package/examples/jsm/loaders/DRACOLoader.js +4 -3
  16. package/examples/jsm/loaders/FBXLoader.js +294 -124
  17. package/examples/jsm/loaders/GLTFLoader.js +71 -3
  18. package/examples/jsm/loaders/MaterialXLoader.js +73 -54
  19. package/examples/jsm/loaders/NRRDLoader.js +0 -13
  20. package/examples/jsm/loaders/SVGLoader.js +4 -4
  21. package/examples/jsm/loaders/USDZLoader.js +3 -17
  22. package/examples/jsm/math/Octree.js +15 -4
  23. package/examples/jsm/misc/Timer.js +119 -0
  24. package/examples/jsm/misc/TubePainter.js +3 -6
  25. package/examples/jsm/modifiers/CurveModifier.js +20 -2
  26. package/examples/jsm/nodes/Nodes.js +11 -7
  27. package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
  28. package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
  29. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
  30. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  31. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
  32. package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
  33. package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
  34. package/examples/jsm/nodes/accessors/TextureNode.js +122 -36
  35. package/examples/jsm/nodes/code/CodeNode.js +3 -3
  36. package/examples/jsm/nodes/core/AttributeNode.js +7 -1
  37. package/examples/jsm/nodes/core/CacheNode.js +4 -1
  38. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  39. package/examples/jsm/nodes/core/Node.js +6 -3
  40. package/examples/jsm/nodes/core/NodeBuilder.js +84 -27
  41. package/examples/jsm/nodes/core/NodeFrame.js +10 -8
  42. package/examples/jsm/nodes/core/NodeUniform.js +12 -0
  43. package/examples/jsm/nodes/core/NodeUtils.js +3 -7
  44. package/examples/jsm/nodes/core/OutputStructNode.js +3 -3
  45. package/examples/jsm/nodes/core/PropertyNode.js +17 -2
  46. package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
  47. package/examples/jsm/nodes/core/UniformGroup.js +13 -0
  48. package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
  49. package/examples/jsm/nodes/core/UniformNode.js +17 -0
  50. package/examples/jsm/nodes/core/VarNode.js +2 -0
  51. package/examples/jsm/nodes/core/VaryingNode.js +1 -7
  52. package/examples/jsm/nodes/display/BumpMapNode.js +1 -1
  53. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
  54. package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
  55. package/examples/jsm/nodes/display/PassNode.js +182 -0
  56. package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
  57. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
  58. package/examples/jsm/nodes/display/ViewportNode.js +5 -8
  59. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +1 -1
  60. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +52 -17
  61. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -12
  62. package/examples/jsm/nodes/lighting/LightsNode.js +34 -32
  63. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +1 -1
  64. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +12 -12
  65. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
  66. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +1 -1
  67. package/examples/jsm/nodes/materials/NodeMaterial.js +66 -41
  68. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
  69. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  70. package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
  71. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
  72. package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
  73. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
  74. package/examples/jsm/nodes/math/MathNode.js +2 -0
  75. package/examples/jsm/nodes/math/OperatorNode.js +19 -6
  76. package/examples/jsm/nodes/shadernode/ShaderNode.js +32 -3
  77. package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
  78. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  79. package/examples/jsm/nodes/utils/SplitNode.js +8 -2
  80. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
  81. package/examples/jsm/objects/QuadMesh.js +60 -0
  82. package/examples/jsm/postprocessing/GTAOPass.js +572 -0
  83. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  84. package/examples/jsm/renderers/common/Animation.js +10 -21
  85. package/examples/jsm/renderers/common/Backend.js +19 -3
  86. package/examples/jsm/renderers/common/Background.js +20 -22
  87. package/examples/jsm/renderers/common/Bindings.js +30 -21
  88. package/examples/jsm/renderers/common/ChainMap.js +3 -3
  89. package/examples/jsm/renderers/common/Color4.js +37 -0
  90. package/examples/jsm/renderers/common/Geometries.js +4 -4
  91. package/examples/jsm/renderers/common/Info.js +12 -2
  92. package/examples/jsm/renderers/common/Pipelines.js +3 -51
  93. package/examples/jsm/renderers/common/PostProcessing.js +25 -0
  94. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  95. package/examples/jsm/renderers/common/RenderContexts.js +1 -1
  96. package/examples/jsm/renderers/common/RenderObject.js +13 -1
  97. package/examples/jsm/renderers/common/RenderObjects.js +4 -2
  98. package/examples/jsm/renderers/common/Renderer.js +137 -37
  99. package/examples/jsm/renderers/common/StorageTexture.js +1 -0
  100. package/examples/jsm/renderers/common/Textures.js +4 -1
  101. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
  102. package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
  103. package/examples/jsm/renderers/common/nodes/Nodes.js +74 -7
  104. package/examples/jsm/renderers/webgl/WebGLBackend.js +91 -33
  105. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +100 -31
  106. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +57 -5
  107. package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
  108. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
  109. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
  110. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
  111. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
  112. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
  113. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
  114. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +186 -137
  115. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
  116. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +209 -90
  117. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
  118. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
  119. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
  120. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
  121. package/examples/jsm/shaders/FXAAShader.js +133 -133
  122. package/examples/jsm/shaders/GTAOShader.js +424 -0
  123. package/examples/jsm/shaders/OutputShader.js +4 -0
  124. package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
  125. package/examples/jsm/shaders/SAOShader.js +2 -3
  126. package/examples/jsm/shaders/SSAOShader.js +2 -3
  127. package/examples/jsm/transpiler/AST.js +40 -1
  128. package/examples/jsm/transpiler/GLSLDecoder.js +50 -8
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +4 -4
  130. package/examples/jsm/transpiler/TSLEncoder.js +124 -20
  131. package/examples/jsm/utils/SortUtils.js +158 -0
  132. package/examples/jsm/utils/TextureUtils.js +33 -21
  133. package/examples/jsm/webxr/ARButton.js +14 -0
  134. package/examples/jsm/webxr/VRButton.js +23 -8
  135. package/examples/jsm/webxr/XRButton.js +25 -11
  136. package/package.json +5 -6
  137. package/src/Three.js +1 -0
  138. package/src/constants.js +2 -1
  139. package/src/core/BufferAttribute.js +21 -2
  140. package/src/core/InterleavedBuffer.js +21 -1
  141. package/src/core/Object3D.js +60 -12
  142. package/src/core/UniformsGroup.js +7 -1
  143. package/src/extras/curves/LineCurve3.js +4 -0
  144. package/src/loaders/AudioLoader.js +1 -1
  145. package/src/loaders/BufferGeometryLoader.js +0 -7
  146. package/src/loaders/ImageBitmapLoader.js +25 -1
  147. package/src/loaders/ObjectLoader.js +49 -0
  148. package/src/materials/ShaderMaterial.js +2 -1
  149. package/src/math/ColorManagement.js +0 -16
  150. package/src/math/Quaternion.js +5 -4
  151. package/src/math/Sphere.js +2 -0
  152. package/src/math/Triangle.js +17 -5
  153. package/src/objects/BatchedMesh.js +1020 -0
  154. package/src/objects/Skeleton.js +1 -3
  155. package/src/renderers/WebGL3DRenderTarget.js +2 -2
  156. package/src/renderers/WebGLArrayRenderTarget.js +2 -2
  157. package/src/renderers/WebGLRenderer.js +23 -18
  158. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
  159. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
  160. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
  161. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
  162. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
  163. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
  164. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
  165. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
  166. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
  167. package/src/renderers/shaders/ShaderChunk.js +4 -0
  168. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  169. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  170. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
  171. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
  172. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
  173. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
  174. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
  175. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -0
  176. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
  177. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
  178. package/src/renderers/webgl/WebGLAttributes.js +39 -5
  179. package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
  180. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  181. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  182. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
  183. package/src/renderers/webgl/WebGLLights.js +11 -2
  184. package/src/renderers/webgl/WebGLProgram.js +20 -1
  185. package/src/renderers/webgl/WebGLPrograms.js +5 -0
  186. package/src/renderers/webgl/WebGLShadowMap.js +35 -0
  187. package/src/renderers/webgl/WebGLTextures.js +7 -11
  188. package/src/renderers/webgl/WebGLUniforms.js +11 -1
  189. package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
  190. package/src/renderers/webxr/WebXRManager.js +16 -0
  191. package/examples/jsm/objects/BatchedMesh.js +0 -586
@@ -8,6 +8,7 @@ function WebGLAttributes( gl, capabilities ) {
8
8
 
9
9
  const array = attribute.array;
10
10
  const usage = attribute.usage;
11
+ const size = array.byteLength;
11
12
 
12
13
  const buffer = gl.createBuffer();
13
14
 
@@ -76,7 +77,8 @@ function WebGLAttributes( gl, capabilities ) {
76
77
  buffer: buffer,
77
78
  type: type,
78
79
  bytesPerElement: array.BYTES_PER_ELEMENT,
79
- version: attribute.version
80
+ version: attribute.version,
81
+ size: size
80
82
  };
81
83
 
82
84
  }
@@ -84,17 +86,43 @@ function WebGLAttributes( gl, capabilities ) {
84
86
  function updateBuffer( buffer, attribute, bufferType ) {
85
87
 
86
88
  const array = attribute.array;
87
- const updateRange = attribute.updateRange;
89
+ const updateRange = attribute._updateRange; // deprecated
90
+ const updateRanges = attribute.updateRanges;
88
91
 
89
92
  gl.bindBuffer( bufferType, buffer );
90
93
 
91
- if ( updateRange.count === - 1 ) {
94
+ if ( updateRange.count === - 1 && updateRanges.length === 0 ) {
92
95
 
93
96
  // Not using update ranges
94
-
95
97
  gl.bufferSubData( bufferType, 0, array );
96
98
 
97
- } else {
99
+ }
100
+
101
+ if ( updateRanges.length !== 0 ) {
102
+
103
+ for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
104
+
105
+ const range = updateRanges[ i ];
106
+ if ( isWebGL2 ) {
107
+
108
+ gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,
109
+ array, range.start, range.count );
110
+
111
+ } else {
112
+
113
+ gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,
114
+ array.subarray( range.start, range.start + range.count ) );
115
+
116
+ }
117
+
118
+ }
119
+
120
+ attribute.clearUpdateRanges();
121
+
122
+ }
123
+
124
+ // deprecated
125
+ if ( updateRange.count !== - 1 ) {
98
126
 
99
127
  if ( isWebGL2 ) {
100
128
 
@@ -173,6 +201,12 @@ function WebGLAttributes( gl, capabilities ) {
173
201
 
174
202
  } else if ( data.version < attribute.version ) {
175
203
 
204
+ if ( data.size !== attribute.array.byteLength ) {
205
+
206
+ throw new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );
207
+
208
+ }
209
+
176
210
  updateBuffer( data.buffer, attribute, bufferType );
177
211
 
178
212
  data.version = attribute.version;
@@ -49,11 +49,42 @@ function WebGLBufferRenderer( gl, extensions, info, capabilities ) {
49
49
 
50
50
  }
51
51
 
52
+ function renderMultiDraw( starts, counts, drawCount ) {
53
+
54
+ if ( drawCount === 0 ) return;
55
+
56
+ const extension = extensions.get( 'WEBGL_multi_draw' );
57
+ if ( extension === null ) {
58
+
59
+ for ( let i = 0; i < drawCount; i ++ ) {
60
+
61
+ this.render( starts[ i ], counts[ i ] );
62
+
63
+ }
64
+
65
+ } else {
66
+
67
+ extension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );
68
+
69
+ let elementCount = 0;
70
+ for ( let i = 0; i < drawCount; i ++ ) {
71
+
72
+ elementCount += counts[ i ];
73
+
74
+ }
75
+
76
+ info.update( elementCount, mode, 1 );
77
+
78
+ }
79
+
80
+ }
81
+
52
82
  //
53
83
 
54
84
  this.setMode = setMode;
55
85
  this.render = render;
56
86
  this.renderInstances = renderInstances;
87
+ this.renderMultiDraw = renderMultiDraw;
57
88
 
58
89
  }
59
90
 
@@ -23,7 +23,7 @@ function WebGLCubeMaps( renderer ) {
23
23
 
24
24
  function get( texture ) {
25
25
 
26
- if ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) {
26
+ if ( texture && texture.isTexture ) {
27
27
 
28
28
  const mapping = texture.mapping;
29
29
 
@@ -54,6 +54,7 @@ function WebGLExtensions( gl ) {
54
54
  if ( capabilities.isWebGL2 ) {
55
55
 
56
56
  getExtension( 'EXT_color_buffer_float' );
57
+ getExtension( 'WEBGL_clip_cull_distance' );
57
58
 
58
59
  } else {
59
60
 
@@ -58,12 +58,43 @@ function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {
58
58
 
59
59
  }
60
60
 
61
+ function renderMultiDraw( starts, counts, drawCount ) {
62
+
63
+ if ( drawCount === 0 ) return;
64
+
65
+ const extension = extensions.get( 'WEBGL_multi_draw' );
66
+ if ( extension === null ) {
67
+
68
+ for ( let i = 0; i < drawCount; i ++ ) {
69
+
70
+ this.render( starts[ i ] / bytesPerElement, counts[ i ] );
71
+
72
+ }
73
+
74
+ } else {
75
+
76
+ extension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );
77
+
78
+ let elementCount = 0;
79
+ for ( let i = 0; i < drawCount; i ++ ) {
80
+
81
+ elementCount += counts[ i ];
82
+
83
+ }
84
+
85
+ info.update( elementCount, mode, 1 );
86
+
87
+ }
88
+
89
+ }
90
+
61
91
  //
62
92
 
63
93
  this.setMode = setMode;
64
94
  this.setIndex = setIndex;
65
95
  this.render = render;
66
96
  this.renderInstances = renderInstances;
97
+ this.renderMultiDraw = renderMultiDraw;
67
98
 
68
99
  }
69
100
 
@@ -403,8 +403,17 @@ function WebGLLights( extensions, capabilities ) {
403
403
 
404
404
  // WebGL 2
405
405
 
406
- state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;
407
- state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;
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
+ }
408
417
 
409
418
  } else {
410
419
 
@@ -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 { 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';
4
+ import { NoToneMapping, AddOperation, MixOperation, MultiplyOperation, CubeRefractionMapping, CubeUVReflectionMapping, CubeReflectionMapping, PCFSoftShadowMap, PCFShadowMap, VSMShadowMap, AgXToneMapping, 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
7
  // From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/
@@ -120,6 +120,10 @@ function getToneMappingFunction( functionName, toneMapping ) {
120
120
  toneMappingName = 'ACESFilmic';
121
121
  break;
122
122
 
123
+ case AgXToneMapping:
124
+ toneMappingName = 'AgX';
125
+ break;
126
+
123
127
  case CustomToneMapping:
124
128
  toneMappingName = 'Custom';
125
129
  break;
@@ -147,6 +151,16 @@ function generateExtensions( parameters ) {
147
151
 
148
152
  }
149
153
 
154
+ function generateVertexExtensions( parameters ) {
155
+
156
+ const chunks = [
157
+ parameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : ''
158
+ ];
159
+
160
+ return chunks.filter( filterEmptyLine ).join( '\n' );
161
+
162
+ }
163
+
150
164
  function generateDefines( defines ) {
151
165
 
152
166
  const chunks = [];
@@ -451,6 +465,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
451
465
 
452
466
  const customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );
453
467
 
468
+ const customVertexExtensions = generateVertexExtensions( parameters );
469
+
454
470
  const customDefines = generateDefines( defines );
455
471
 
456
472
  const program = gl.createProgram();
@@ -505,6 +521,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
505
521
 
506
522
  customDefines,
507
523
 
524
+ parameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',
525
+ parameters.batching ? '#define USE_BATCHING' : '',
508
526
  parameters.instancing ? '#define USE_INSTANCING' : '',
509
527
  parameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',
510
528
 
@@ -844,6 +862,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
844
862
  versionString = '#version 300 es\n';
845
863
 
846
864
  prefixVertex = [
865
+ customVertexExtensions,
847
866
  'precision mediump sampler2DArray;',
848
867
  '#define attribute in',
849
868
  '#define varying out',
@@ -110,6 +110,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
110
110
  const numMultiviewViews = currentRenderTarget && currentRenderTarget.isWebGLMultiviewRenderTarget ? currentRenderTarget.numViews : 0;
111
111
 
112
112
  const IS_INSTANCEDMESH = object.isInstancedMesh === true;
113
+ const IS_BATCHEDMESH = object.isBatchedMesh === true;
113
114
 
114
115
  const HAS_MAP = !! material.map;
115
116
  const HAS_MATCAP = !! material.matcap;
@@ -195,6 +196,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
195
196
 
196
197
  precision: precision,
197
198
 
199
+ batching: IS_BATCHEDMESH,
198
200
  instancing: IS_INSTANCEDMESH,
199
201
  instancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,
200
202
 
@@ -357,6 +359,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
357
359
  extensionFragDepth: HAS_EXTENSIONS && material.extensions.fragDepth === true,
358
360
  extensionDrawBuffers: HAS_EXTENSIONS && material.extensions.drawBuffers === true,
359
361
  extensionShaderTextureLOD: HAS_EXTENSIONS && material.extensions.shaderTextureLOD === true,
362
+ extensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance && extensions.has( 'WEBGL_clip_cull_distance' ),
360
363
 
361
364
  rendererExtensionFragDepth: IS_WEBGL2 || extensions.has( 'EXT_frag_depth' ),
362
365
  rendererExtensionDrawBuffers: IS_WEBGL2 || extensions.has( 'WEBGL_draw_buffers' ),
@@ -506,6 +509,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
506
509
  _programLayers.enable( 17 );
507
510
  if ( parameters.alphaHash )
508
511
  _programLayers.enable( 18 );
512
+ if ( parameters.batching )
513
+ _programLayers.enable( 19 );
509
514
 
510
515
  array.push( _programLayers.mask );
511
516
  _programLayers.disableAll();
@@ -279,6 +279,7 @@ function WebGLShadowMap( _renderer, _objects, _capabilities ) {
279
279
 
280
280
  cachedMaterial = result.clone();
281
281
  materialsForVariant[ keyB ] = cachedMaterial;
282
+ material.addEventListener( 'dispose', onMaterialDispose );
282
283
 
283
284
  }
284
285
 
@@ -355,8 +356,12 @@ function WebGLShadowMap( _renderer, _objects, _capabilities ) {
355
356
 
356
357
  const depthMaterial = getDepthMaterial( object, groupMaterial, light, type );
357
358
 
359
+ object.onBeforeShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, group );
360
+
358
361
  _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );
359
362
 
363
+ object.onAfterShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, group );
364
+
360
365
  }
361
366
 
362
367
  }
@@ -365,8 +370,12 @@ function WebGLShadowMap( _renderer, _objects, _capabilities ) {
365
370
 
366
371
  const depthMaterial = getDepthMaterial( object, material, light, type );
367
372
 
373
+ object.onBeforeShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, null );
374
+
368
375
  _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );
369
376
 
377
+ object.onAfterShadow( _renderer, object, camera, shadowCamera, geometry, depthMaterial, null );
378
+
370
379
  }
371
380
 
372
381
  }
@@ -383,6 +392,32 @@ function WebGLShadowMap( _renderer, _objects, _capabilities ) {
383
392
 
384
393
  }
385
394
 
395
+ function onMaterialDispose( event ) {
396
+
397
+ const material = event.target;
398
+
399
+ material.removeEventListener( 'dispose', onMaterialDispose );
400
+
401
+ // make sure to remove the unique distance/depth materials used for shadow map rendering
402
+
403
+ for ( const id in _materialCache ) {
404
+
405
+ const cache = _materialCache[ id ];
406
+
407
+ const uuid = event.target.uuid;
408
+
409
+ if ( uuid in cache ) {
410
+
411
+ const shadowMaterial = cache[ uuid ];
412
+ shadowMaterial.dispose();
413
+ delete cache[ uuid ];
414
+
415
+ }
416
+
417
+ }
418
+
419
+ }
420
+
386
421
  }
387
422
 
388
423
 
@@ -1,4 +1,4 @@
1
- import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, UnsignedByteType, _SRGBAFormat, NoColorSpace, LinearSRGBColorSpace, NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, SRGBTransfer, LinearTransfer } from '../../constants.js';
1
+ import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBAFormat, RGB_ETC1_Format, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, UnsignedByteType, _SRGBAFormat, NoColorSpace, LinearSRGBColorSpace, NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, SRGBTransfer, LinearTransfer } from '../../constants.js';
2
2
  import * as MathUtils from '../../math/MathUtils.js';
3
3
  import { ImageUtils } from '../../extras/ImageUtils.js';
4
4
  import { createElementNS } from '../../utils.js';
@@ -7,10 +7,6 @@ import { ColorManagement } from '../../math/ColorManagement.js';
7
7
  function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {
8
8
 
9
9
  const isWebGL2 = capabilities.isWebGL2;
10
- const maxTextures = capabilities.maxTextures;
11
- const maxCubemapSize = capabilities.maxCubemapSize;
12
- const maxTextureSize = capabilities.maxTextureSize;
13
- const maxSamples = capabilities.maxSamples;
14
10
  const multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;
15
11
  const supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );
16
12
  const multiviewExt = extensions.has( 'OCULUS_multiview' ) ? extensions.get( 'OCULUS_multiview' ) : null;
@@ -433,9 +429,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
433
429
 
434
430
  const textureUnit = textureUnits;
435
431
 
436
- if ( textureUnit >= maxTextures ) {
432
+ if ( textureUnit >= capabilities.maxTextures ) {
437
433
 
438
- console.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );
434
+ console.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );
439
435
 
440
436
  }
441
437
 
@@ -792,7 +788,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
792
788
  _gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );
793
789
 
794
790
  const needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false;
795
- let image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );
791
+ let image = resizeImage( texture.image, needsPowerOfTwo, false, capabilities.maxTextureSize );
796
792
  image = verifyColorSpace( texture, image );
797
793
 
798
794
  const supportsMips = isPowerOfTwo( image ) || isWebGL2,
@@ -806,7 +802,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
806
802
  let mipmap;
807
803
  const mipmaps = texture.mipmaps;
808
804
 
809
- const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
805
+ const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true && glInternalFormat !== RGB_ETC1_Format );
810
806
  const allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );
811
807
  const levels = getMipLevels( texture, image, supportsMips );
812
808
 
@@ -1219,7 +1215,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1219
1215
 
1220
1216
  if ( ! isCompressed && ! isDataTexture ) {
1221
1217
 
1222
- cubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );
1218
+ cubeImage[ i ] = resizeImage( texture.image[ i ], false, true, capabilities.maxCubemapSize );
1223
1219
 
1224
1220
  } else {
1225
1221
 
@@ -2178,7 +2174,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
2178
2174
 
2179
2175
  function getRenderTargetSamples( renderTarget ) {
2180
2176
 
2181
- return Math.min( maxSamples, renderTarget.samples );
2177
+ return Math.min( capabilities.maxSamples, renderTarget.samples );
2182
2178
 
2183
2179
  }
2184
2180
 
@@ -45,8 +45,14 @@ import { CubeTexture } from '../../textures/CubeTexture.js';
45
45
  import { Texture } from '../../textures/Texture.js';
46
46
  import { DataArrayTexture } from '../../textures/DataArrayTexture.js';
47
47
  import { Data3DTexture } from '../../textures/Data3DTexture.js';
48
+ import { DepthTexture } from '../../textures/DepthTexture.js';
49
+ import { LessEqualCompare } from '../../constants.js';
48
50
 
49
51
  const emptyTexture = /*@__PURE__*/ new Texture();
52
+
53
+ const emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );
54
+ emptyShadowTexture.compareFunction = LessEqualCompare;
55
+
50
56
  const emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();
51
57
  const empty3dTexture = /*@__PURE__*/ new Data3DTexture();
52
58
  const emptyCubeTexture = /*@__PURE__*/ new CubeTexture();
@@ -563,7 +569,9 @@ function setValueT1( gl, v, textures ) {
563
569
 
564
570
  }
565
571
 
566
- textures.setTexture2D( v || emptyTexture, unit );
572
+ const emptyTexture2D = ( this.type === gl.SAMPLER_2D_SHADOW ) ? emptyShadowTexture : emptyTexture;
573
+
574
+ textures.setTexture2D( v || emptyTexture2D, unit );
567
575
 
568
576
  }
569
577
 
@@ -947,6 +955,7 @@ class SingleUniform {
947
955
  this.id = id;
948
956
  this.addr = addr;
949
957
  this.cache = [];
958
+ this.type = activeInfo.type;
950
959
  this.setValue = getSingularSetter( activeInfo.type );
951
960
 
952
961
  // this.path = activeInfo.name; // DEBUG
@@ -962,6 +971,7 @@ class PureArrayUniform {
962
971
  this.id = id;
963
972
  this.addr = addr;
964
973
  this.cache = [];
974
+ this.type = activeInfo.type;
965
975
  this.size = activeInfo.size;
966
976
  this.setValue = getPureArraySetter( activeInfo.type );
967
977