Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BatchedMesh: cleanup, add maxGeometryCount member #27231

Merged
merged 2 commits into from
Nov 23, 2023
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
27 changes: 26 additions & 1 deletion docs/api/en/objects/BatchedMesh.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,29 @@ <h1>[name]</h1>
<br/>
<br/>

Requires platform support for the [link:https://developer.mozilla.org/en-US/docs/Web/API/WEBGL_multi_draw WEBGL_multi_draw extension].
If the [link:https://developer.mozilla.org/en-US/docs/Web/API/WEBGL_multi_draw WEBGL_multi_draw extension] is
not supported then a less performant callback is used.
</p>

<h2>Code Example</h2>

<code>
const box = new THREE.BoxGeometry( 1, 1, 1 );
const sphere = new THREE.BoxGeometry( 1, 1, 1 );
const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );

// initialize and add geometries into the batched mesh
const batchedMesh = new BatchedMesh( 10, 5000, 10000, material );
const boxId = batchedMesh.addGeometry( box );
const sphereId = batchedMesh.addGeometry( sphere );

// position the geometries
batchedMesh.setMatrixAt( boxId, boxMatrix );
batchedMesh.setMatrixAt( sphereId, sphereMatrix );

scene.add( batchedMesh );
</code>

<h2>Examples</h2>
<p>
[example:webgl_mesh_batch WebGL / mesh / batch]<br />
Expand Down Expand Up @@ -71,6 +91,11 @@ <h3>[property:Boolean sortObjects]</h3>
rendered front to back. Default is `true`.
</p>

<h3>[property:Integer maxGeometryCount]</h3>
<p>
The maximum number of individual geometries that can be stored in the [name]. Read only.
</p>

<h3>[property:Boolean isBatchedMesh]</h3>
<p>Read-only flag to check if a given object is of type [name].</p>

Expand Down
6 changes: 3 additions & 3 deletions examples/webgl_mesh_batch.html
Original file line number Diff line number Diff line change
Expand Up @@ -287,17 +287,17 @@
// initialize options
this._options = this._options || {
get: el => el.z,
aux: new Array( this._maxGeometryCount )
aux: new Array( this.maxGeometryCount )
};

const options = this._options;
options.reversed = this.material.transparent;

// convert depth to unsigned 32 bit range
const factor = ( 2**32 - 1 ) / camera.far; // UINT32_MAX / max_depth
const factor = ( 2 ** 32 - 1 ) / camera.far; // UINT32_MAX / max_depth
for ( let i = 0, l = list.length; i < l; i ++ ) {

list[i].z *= factor;
list[ i ].z *= factor;

}

Expand Down
45 changes: 6 additions & 39 deletions src/objects/BatchedMesh.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,12 @@ function copyAttributeData( src, target, targetOffset = 0 ) {

class BatchedMesh extends Mesh {

get maxGeometryCount() {

return this._maxGeometryCount;

}

constructor( maxGeometryCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {

super( new BufferGeometry(), material );
Expand Down Expand Up @@ -262,45 +268,6 @@ class BatchedMesh extends Mesh {

}

getGeometryCount() {

return this._geometryCount;

}

getVertexCount() {

const reservedRanges = this._reservedRanges;
if ( reservedRanges.length === 0 ) {

return 0;

} else {

const finalRange = reservedRanges[ reservedRanges.length - 1 ];
return finalRange.vertexStart + finalRange.vertexCount;

}

}

getIndexCount() {

const reservedRanges = this._reservedRanges;
const geometry = this.geometry;
if ( geometry.getIndex() === null || reservedRanges.length === 0 ) {

return 0;

} else {

const finalRange = reservedRanges[ reservedRanges.length - 1 ];
return finalRange.indexStart + finalRange.indexCount;

}

}

setCustomSort( func ) {

this.customSort = func;
Expand Down