UNPKG

three-mesh-bvh

Version:

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

94 lines (58 loc) 1.96 kB
import { intersectTri } from '../../utils/ThreeRayIntersectUtilities.js'; import { setTriangle } from '../../utils/TriangleUtilities.js'; export function intersectTris/* @echo INDIRECT_STRING */( bvh, materialOrSide, ray, offset, count, intersections, near, far ) { const { geometry, _indirectBuffer } = bvh; for ( let i = offset, end = offset + count; i < end; i ++ ) { /* @if INDIRECT */ let vi = _indirectBuffer ? _indirectBuffer[ i ] : i; intersectTri( geometry, materialOrSide, ray, vi, intersections, near, far ); /* @else */ intersectTri( geometry, materialOrSide, ray, i, intersections, near, far ); /* @endif */ } } export function intersectClosestTri/* @echo INDIRECT_STRING */( bvh, materialOrSide, ray, offset, count, near, far ) { const { geometry, _indirectBuffer } = bvh; let dist = Infinity; let res = null; for ( let i = offset, end = offset + count; i < end; i ++ ) { let intersection; /* @if INDIRECT */ intersection = intersectTri( geometry, materialOrSide, ray, _indirectBuffer ? _indirectBuffer[ i ] : i, null, near, far ); /* @else */ intersection = intersectTri( geometry, materialOrSide, ray, i, null, near, far ); /* @endif */ if ( intersection && intersection.distance < dist ) { res = intersection; dist = intersection.distance; } } return res; } export function iterateOverTriangles/* @echo INDIRECT_STRING */( offset, count, bvh, intersectsTriangleFunc, contained, depth, triangle ) { const { geometry } = bvh; const { index } = geometry; const pos = geometry.attributes.position; for ( let i = offset, l = count + offset; i < l; i ++ ) { let tri; /* @if INDIRECT */ tri = bvh.resolveTriangleIndex( i ); /* @else */ tri = i; /* @endif */ setTriangle( triangle, tri * 3, index, pos ); triangle.needsUpdate = true; if ( intersectsTriangleFunc( triangle, tri, contained, depth ) ) { return true; } } return false; }