Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 17 additions & 5 deletions src/objects/BatchedMesh.js
Original file line number Diff line number Diff line change
Expand Up @@ -1513,7 +1513,19 @@ class BatchedMesh extends Mesh {
// the indexed version of the multi draw function requires specifying the start
// offset in bytes.
const index = geometry.getIndex();
const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;
let bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;


// the "wireframe" attribute implicitly creates a line attribute in the renderer, which is double
// the vertices to draw (3 lines per triangle) so we multiply the draw counts / starts and make
// assumptions about the index buffer byte size.
let multiDrawMultiplier = 1;
if ( material.wireframe ) {

multiDrawMultiplier = 2;
bytesPerElement = geometry.attributes.position.count > 65535 ? 4 : 2;

}

const instanceInfo = this._instanceInfo;
const multiDrawStarts = this._multiDrawStarts;
Expand Down Expand Up @@ -1594,8 +1606,8 @@ class BatchedMesh extends Mesh {
for ( let i = 0, l = list.length; i < l; i ++ ) {

const item = list[ i ];
multiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement;
multiDrawCounts[ multiDrawCount ] = item.count;
multiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement * multiDrawMultiplier;
multiDrawCounts[ multiDrawCount ] = item.count * multiDrawMultiplier;
indirectArray[ multiDrawCount ] = item.index;
multiDrawCount ++;

Expand Down Expand Up @@ -1625,8 +1637,8 @@ class BatchedMesh extends Mesh {
if ( ! culled ) {

const geometryInfo = geometryInfoList[ geometryId ];
multiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement;
multiDrawCounts[ multiDrawCount ] = geometryInfo.count;
multiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement * multiDrawMultiplier;
multiDrawCounts[ multiDrawCount ] = geometryInfo.count * multiDrawMultiplier;
indirectArray[ multiDrawCount ] = i;
multiDrawCount ++;

Expand Down
3 changes: 1 addition & 2 deletions src/renderers/common/Geometries.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import DataMap from './DataMap.js';
import { AttributeType } from './Constants.js';
import { arrayNeedsUint32 } from '../../utils.js';

import { Uint16BufferAttribute, Uint32BufferAttribute } from '../../core/BufferAttribute.js';

Expand Down Expand Up @@ -77,7 +76,7 @@ function getWireframeIndex( geometry ) {

}

const attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
const attribute = new ( geometryPosition.count >= 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
attribute.version = getWireframeVersion( geometry );
attribute.__id = getWireframeId( geometry );

Expand Down
17 changes: 10 additions & 7 deletions src/renderers/webgl/WebGLGeometries.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { Uint16BufferAttribute, Uint32BufferAttribute } from '../../core/BufferAttribute.js';
import { arrayNeedsUint32 } from '../../utils.js';

function WebGLGeometries( gl, attributes, info, bindingStates ) {

Expand Down Expand Up @@ -85,6 +84,12 @@ function WebGLGeometries( gl, attributes, info, bindingStates ) {
const geometryPosition = geometry.attributes.position;
let version = 0;

if ( geometryPosition === undefined ) {

return;

}

if ( geometryIndex !== null ) {

const array = geometryIndex.array;
Expand All @@ -100,7 +105,7 @@ function WebGLGeometries( gl, attributes, info, bindingStates ) {

}

} else if ( geometryPosition !== undefined ) {
} else {

const array = geometryPosition.array;
version = geometryPosition.version;
Expand All @@ -115,13 +120,11 @@ function WebGLGeometries( gl, attributes, info, bindingStates ) {

}

} else {

return;

}

const attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
// check whether a 32 bit or 16 bit buffer is required to store the indices
// account for PRIMITIVE_RESTART_FIXED_INDEX, #24565
const attribute = new ( geometryPosition.count >= 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
attribute.version = version;

// Updating index buffer in VAO now. See WebGLBindingStates
Expand Down
10 changes: 9 additions & 1 deletion src/renderers/webgpu/WebGPUBackend.js
Original file line number Diff line number Diff line change
Expand Up @@ -1596,14 +1596,22 @@ class WebGPUBackend extends Backend {

}

let bytesPerElement = ( hasIndex === true ) ? index.array.BYTES_PER_ELEMENT : 1;

if ( material.wireframe ) {

bytesPerElement = object.geometry.attributes.position.count > 65535 ? 4 : 2;

}

for ( let i = 0; i < drawCount; i ++ ) {

const count = drawInstances ? drawInstances[ i ] : 1;
const firstInstance = count > 1 ? 0 : i;

if ( hasIndex === true ) {

passEncoderGPU.drawIndexed( counts[ i ], count, starts[ i ] / index.array.BYTES_PER_ELEMENT, 0, firstInstance );
passEncoderGPU.drawIndexed( counts[ i ], count, starts[ i ] / bytesPerElement, 0, firstInstance );

} else {

Expand Down
Loading