setGeometryAt method
Implementation
int setGeometryAt(int geometryId, BufferGeometry geometry ) {
if ( geometryId >= this._geometryCount ) {
throw( 'THREE.BatchedMesh: Maximum geometry count reached.' );
}
this._validateGeometry( geometry );
final batchGeometry = this.geometry;
final hasIndex = batchGeometry?.getIndex() != null;
final dstIndex = batchGeometry?.getIndex();
final srcIndex = geometry.getIndex();
final geometryInfo = this._geometryInfo[ geometryId ];
if (
hasIndex &&
(srcIndex?.count ?? 0) > geometryInfo.reservedIndexCount ||
geometry.attributes['position'].count > geometryInfo.reservedVertexCount
) {
throw( 'THREE.BatchedMesh: Reserved space not large enough for provided geometry.' );
}
// copy geometry buffer data over
final vertexStart = geometryInfo.vertexStart;
final reservedVertexCount = geometryInfo.reservedVertexCount;
geometryInfo.vertexCount = geometry.getAttributeFromString( 'position' ).count;
for ( final attributeName in batchGeometry!.attributes.keys ) {
// copy attribute data
final srcAttribute = geometry.getAttributeFromString( attributeName );
final dstAttribute = batchGeometry.getAttributeFromString( attributeName );
copyAttributeData( srcAttribute, dstAttribute, vertexStart );
// fill the rest in with zeroes
final itemSize = srcAttribute.itemSize;
for ( int i = srcAttribute.count, l = reservedVertexCount; i < l; i ++ ) {
final index = vertexStart + i;
for ( int c = 0; c < itemSize; c ++ ) {
dstAttribute.setComponent( index, c, 0 );
}
}
dstAttribute.needsUpdate = true;
dstAttribute.addUpdateRange( vertexStart * itemSize, reservedVertexCount * itemSize );
}
// copy index
if ( hasIndex ) {
final indexStart = geometryInfo.indexStart;
final reservedIndexCount = geometryInfo.reservedIndexCount;
geometryInfo.indexCount = geometry.getIndex()?.count;
// copy index data over
for (int i = 0; i < (srcIndex?.count ?? 0); i ++ ) {
dstIndex?.setX( indexStart + i, vertexStart + srcIndex?.getX( i ) );
}
// fill the rest in with zeroes
for (int i = srcIndex?.count ?? 0, l = reservedIndexCount; i < l; i ++ ) {
dstIndex?.setX( indexStart + i, vertexStart );
}
dstIndex?.needsUpdate = true;
dstIndex?.addUpdateRange( indexStart, geometryInfo.reservedIndexCount );
}
// update the draw range
geometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart;
geometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount;
// store the bounding boxes
geometryInfo.boundingBox = null;
if ( geometry.boundingBox != null ) {
geometryInfo.boundingBox = geometry.boundingBox?.clone();
}
geometryInfo.boundingSphere = null;
if ( geometry.boundingSphere != null ) {
geometryInfo.boundingSphere = geometry.boundingSphere?.clone();
}
this._visibilityChanged = true;
return geometryId;
}