three-mesh-bvh
Version:
A BVH implementation to speed up raycasting against three.js meshes.
101 lines (63 loc) • 1.79 kB
JavaScript
import {
BufferGeometry,
BufferAttribute,
} from 'three';
import { MeshBVH } from '../core/MeshBVH.js';
self.onmessage = ( { data } ) => {
let prevTime = - 1;
function onProgressCallback( progress ) {
// account for error
progress = Math.min( progress, 1 );
const currTime = performance.now();
if ( currTime - prevTime >= 10 && progress !== 1.0 ) {
self.postMessage( {
error: null,
serialized: null,
position: null,
progress,
} );
prevTime = currTime;
}
}
const { index, position, options } = data;
try {
const geometry = new BufferGeometry();
geometry.setAttribute( 'position', new BufferAttribute( position, 3, false ) );
if ( index ) {
geometry.setIndex( new BufferAttribute( index, 1, false ) );
}
if ( options.includedProgressCallback ) {
options.onProgress = onProgressCallback;
}
if ( options.groups ) {
const groups = options.groups;
for ( const i in groups ) {
const group = groups[ i ];
geometry.addGroup( group.start, group.count, group.materialIndex );
}
}
const bvh = new MeshBVH( geometry, options );
const serialized = MeshBVH.serialize( bvh, { copyIndexBuffer: false } );
let toTransfer = [ position.buffer, ...serialized.roots ];
if ( serialized.index ) {
toTransfer.push( serialized.index.buffer );
}
toTransfer = toTransfer.filter( v => ( typeof SharedArrayBuffer === 'undefined' ) || ! ( v instanceof SharedArrayBuffer ) );
if ( bvh._indirectBuffer ) {
toTransfer.push( serialized.indirectBuffer.buffer );
}
self.postMessage( {
error: null,
serialized,
position,
progress: 1,
}, toTransfer );
} catch ( error ) {
self.postMessage( {
error,
serialized: null,
position: null,
progress: 1,
} );
}
};