From 6abd1cf9f8e7c98469f644731666371b8c68ed81 Mon Sep 17 00:00:00 2001 From: Michael Herzog Date: Tue, 24 Mar 2026 23:33:28 +0100 Subject: [PATCH] BatchedMesh: Remove deprecated instancing render paths. (#33234) --- src/objects/BatchedMesh.js | 1 - src/renderers/WebGLRenderer.js | 36 ++++++---------- src/renderers/webgl-fallback/WebGLBackend.js | 8 +--- .../webgl-fallback/WebGLBufferRenderer.js | 41 ------------------- src/renderers/webgl/WebGLBufferRenderer.js | 32 --------------- .../webgl/WebGLIndexedBufferRenderer.js | 32 --------------- src/renderers/webgpu/WebGPUBackend.js | 12 +----- 7 files changed, 16 insertions(+), 146 deletions(-) diff --git a/src/objects/BatchedMesh.js b/src/objects/BatchedMesh.js index 5bee14f90deafc..6802706c7307b1 100644 --- a/src/objects/BatchedMesh.js +++ b/src/objects/BatchedMesh.js @@ -272,7 +272,6 @@ class BatchedMesh extends Mesh { this._multiDrawCounts = new Int32Array( maxInstanceCount ); this._multiDrawStarts = new Int32Array( maxInstanceCount ); this._multiDrawCount = 0; - this._multiDrawInstances = null; // Local matrix per geometry by using data texture this._matricesTexture = null; diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index ace8ecfbce2554..48b7765748dd93 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -51,7 +51,7 @@ import { WebGLUtils } from './webgl/WebGLUtils.js'; import { WebXRManager } from './webxr/WebXRManager.js'; import { WebGLMaterials } from './webgl/WebGLMaterials.js'; import { WebGLUniformsGroups } from './webgl/WebGLUniformsGroups.js'; -import { createCanvasElement, probeAsync, warnOnce, error, warn, log } from '../utils.js'; +import { createCanvasElement, probeAsync, error, warn, log } from '../utils.js'; import { ColorManagement } from '../math/ColorManagement.js'; import { getDFGLUT } from './shaders/DFGLUTData.js'; @@ -1292,33 +1292,23 @@ class WebGLRenderer { if ( object.isBatchedMesh ) { - if ( object._multiDrawInstances !== null ) { + if ( ! extensions.get( 'WEBGL_multi_draw' ) ) { - // @deprecated, r174 - warnOnce( 'WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' ); - renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances ); + const starts = object._multiDrawStarts; + const counts = object._multiDrawCounts; + const drawCount = object._multiDrawCount; + const bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1; + const uniforms = properties.get( material ).currentProgram.getUniforms(); + for ( let i = 0; i < drawCount; i ++ ) { - } else { - - if ( ! extensions.get( 'WEBGL_multi_draw' ) ) { - - const starts = object._multiDrawStarts; - const counts = object._multiDrawCounts; - const drawCount = object._multiDrawCount; - const bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1; - const uniforms = properties.get( material ).currentProgram.getUniforms(); - for ( let i = 0; i < drawCount; i ++ ) { - - uniforms.setValue( _gl, '_gl_DrawID', i ); - renderer.render( starts[ i ] / bytesPerElement, counts[ i ] ); - - } + uniforms.setValue( _gl, '_gl_DrawID', i ); + renderer.render( starts[ i ] / bytesPerElement, counts[ i ] ); - } else { + } - renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount ); + } else { - } + renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount ); } diff --git a/src/renderers/webgl-fallback/WebGLBackend.js b/src/renderers/webgl-fallback/WebGLBackend.js index 7271e9fef781b4..55e155ecc09081 100644 --- a/src/renderers/webgl-fallback/WebGLBackend.js +++ b/src/renderers/webgl-fallback/WebGLBackend.js @@ -996,13 +996,7 @@ class WebGLBackend extends Backend { if ( object.isBatchedMesh ) { - if ( object._multiDrawInstances !== null ) { - - // @deprecated, r174 - warnOnce( 'WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' ); - renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances ); - - } else if ( ! this.hasFeature( 'WEBGL_multi_draw' ) ) { + if ( this.hasFeature( 'WEBGL_multi_draw' ) === false ) { warnOnce( 'WebGLBackend: WEBGL_multi_draw not supported.' ); diff --git a/src/renderers/webgl-fallback/WebGLBufferRenderer.js b/src/renderers/webgl-fallback/WebGLBufferRenderer.js index 5c2c71077eebad..2931842a897498 100644 --- a/src/renderers/webgl-fallback/WebGLBufferRenderer.js +++ b/src/renderers/webgl-fallback/WebGLBufferRenderer.js @@ -91,47 +91,6 @@ class WebGLBufferRenderer { } - renderMultiDrawInstances( starts, counts, drawCount, primcount ) { - - const { extensions, mode, object, info } = this; - - if ( drawCount === 0 ) return; - - const extension = extensions.get( 'WEBGL_multi_draw' ); - - if ( extension === null ) { - - for ( let i = 0; i < drawCount; i ++ ) { - - this.renderInstances( starts[ i ], counts[ i ], primcount[ i ] ); - - } - - } else { - - if ( this.index !== 0 ) { - - extension.multiDrawElementsInstancedWEBGL( mode, counts, 0, this.type, starts, 0, primcount, 0, drawCount ); - - } else { - - extension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount ); - - } - - let elementCount = 0; - for ( let i = 0; i < drawCount; i ++ ) { - - elementCount += counts[ i ] * primcount[ i ]; - - } - - info.update( object, elementCount, 1 ); - - } - - } - // } diff --git a/src/renderers/webgl/WebGLBufferRenderer.js b/src/renderers/webgl/WebGLBufferRenderer.js index 174bf29a8f0079..ec2eb2af96b501 100644 --- a/src/renderers/webgl/WebGLBufferRenderer.js +++ b/src/renderers/webgl/WebGLBufferRenderer.js @@ -44,44 +44,12 @@ function WebGLBufferRenderer( gl, extensions, info ) { } - function renderMultiDrawInstances( starts, counts, drawCount, primcount ) { - - if ( drawCount === 0 ) return; - - const extension = extensions.get( 'WEBGL_multi_draw' ); - - if ( extension === null ) { - - for ( let i = 0; i < starts.length; i ++ ) { - - renderInstances( starts[ i ], counts[ i ], primcount[ i ] ); - - } - - } else { - - extension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount ); - - let elementCount = 0; - for ( let i = 0; i < drawCount; i ++ ) { - - elementCount += counts[ i ] * primcount[ i ]; - - } - - info.update( elementCount, mode, 1 ); - - } - - } - // this.setMode = setMode; this.render = render; this.renderInstances = renderInstances; this.renderMultiDraw = renderMultiDraw; - this.renderMultiDrawInstances = renderMultiDrawInstances; } diff --git a/src/renderers/webgl/WebGLIndexedBufferRenderer.js b/src/renderers/webgl/WebGLIndexedBufferRenderer.js index f75a4e8a85945c..7b3ea3894c510c 100644 --- a/src/renderers/webgl/WebGLIndexedBufferRenderer.js +++ b/src/renderers/webgl/WebGLIndexedBufferRenderer.js @@ -54,37 +54,6 @@ function WebGLIndexedBufferRenderer( gl, extensions, info ) { } - function renderMultiDrawInstances( starts, counts, drawCount, primcount ) { - - if ( drawCount === 0 ) return; - - const extension = extensions.get( 'WEBGL_multi_draw' ); - - if ( extension === null ) { - - for ( let i = 0; i < starts.length; i ++ ) { - - renderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] ); - - } - - } else { - - extension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount ); - - let elementCount = 0; - for ( let i = 0; i < drawCount; i ++ ) { - - elementCount += counts[ i ] * primcount[ i ]; - - } - - info.update( elementCount, mode, 1 ); - - } - - } - // this.setMode = setMode; @@ -92,7 +61,6 @@ function WebGLIndexedBufferRenderer( gl, extensions, info ) { this.render = render; this.renderInstances = renderInstances; this.renderMultiDraw = renderMultiDraw; - this.renderMultiDrawInstances = renderMultiDrawInstances; } diff --git a/src/renderers/webgpu/WebGPUBackend.js b/src/renderers/webgpu/WebGPUBackend.js index 7ee695b54b008c..60eec07069f1c1 100644 --- a/src/renderers/webgpu/WebGPUBackend.js +++ b/src/renderers/webgpu/WebGPUBackend.js @@ -16,7 +16,7 @@ import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js'; import { WebGPUCoordinateSystem, TimestampQuery, REVISION, HalfFloatType, Compatibility } from '../../constants.js'; import WebGPUTimestampQueryPool from './utils/WebGPUTimestampQueryPool.js'; -import { warnOnce, error } from '../../utils.js'; +import { error } from '../../utils.js'; const _clearValue = { r: 0, g: 0, b: 0, a: 1 }; @@ -1597,14 +1597,6 @@ class WebGPUBackend extends Backend { const starts = object._multiDrawStarts; const counts = object._multiDrawCounts; const drawCount = object._multiDrawCount; - const drawInstances = object._multiDrawInstances; - - if ( drawInstances !== null ) { - - // @deprecated, r174 - warnOnce( 'WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' ); - - } let bytesPerElement = ( hasIndex === true ) ? index.array.BYTES_PER_ELEMENT : 1; @@ -1616,7 +1608,7 @@ class WebGPUBackend extends Backend { for ( let i = 0; i < drawCount; i ++ ) { - const count = drawInstances ? drawInstances[ i ] : 1; + const count = 1; const firstInstance = count > 1 ? 0 : i; if ( hasIndex === true ) {