setGeometryAt method

int setGeometryAt(
  1. int geometryId,
  2. BufferGeometry geometry
)

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;
}