UNPKG

three-mesh-bvh

Version:

A BVH implementation to speed up raycasting against three.js meshes.

79 lines (48 loc) 1.68 kB
/** * This function performs intersection tests similar to Ray.intersectBox in three.js, * with the difference that the box values are read from an array to improve performance. */ export function intersectRay( nodeIndex32, array, ray, near, far ) { let tmin, tmax, tymin, tymax, tzmin, tzmax; const invdirx = 1 / ray.direction.x, invdiry = 1 / ray.direction.y, invdirz = 1 / ray.direction.z; const ox = ray.origin.x; const oy = ray.origin.y; const oz = ray.origin.z; let minx = array[ nodeIndex32 ]; let maxx = array[ nodeIndex32 + 3 ]; let miny = array[ nodeIndex32 + 1 ]; let maxy = array[ nodeIndex32 + 3 + 1 ]; let minz = array[ nodeIndex32 + 2 ]; let maxz = array[ nodeIndex32 + 3 + 2 ]; if ( invdirx >= 0 ) { tmin = ( minx - ox ) * invdirx; tmax = ( maxx - ox ) * invdirx; } else { tmin = ( maxx - ox ) * invdirx; tmax = ( minx - ox ) * invdirx; } if ( invdiry >= 0 ) { tymin = ( miny - oy ) * invdiry; tymax = ( maxy - oy ) * invdiry; } else { tymin = ( maxy - oy ) * invdiry; tymax = ( miny - oy ) * invdiry; } if ( ( tmin > tymax ) || ( tymin > tmax ) ) return false; if ( tymin > tmin || isNaN( tmin ) ) tmin = tymin; if ( tymax < tmax || isNaN( tmax ) ) tmax = tymax; if ( invdirz >= 0 ) { tzmin = ( minz - oz ) * invdirz; tzmax = ( maxz - oz ) * invdirz; } else { tzmin = ( maxz - oz ) * invdirz; tzmax = ( minz - oz ) * invdirz; } if ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return false; if ( tzmin > tmin || tmin !== tmin ) tmin = tzmin; if ( tzmax < tmax || tmax !== tmax ) tmax = tzmax; //return point closest to the ray (positive side) return tmin <= far && tmax >= near; }