{"version":3,"file":"index.umd.cjs","sources":["../src/Constants.js","../src/MeshBVHNode.js","../src/Utils/ArrayBoxUtilities.js","../src/buildFunctions.js","../src/Utils/SeparatingAxisBounds.js","../src/Utils/MathUtilities.js","../src/Utils/SeparatingAxisTriangle.js","../src/Utils/OrientedBox.js","../src/Utils/TriangleUtils.js","../src/Utils/ThreeIntersectionUtilities.js","../src/Utils/RayIntersectTriUtlities.js","../src/Utils/BufferNodeUtils.js","../src/castFunctions.js","../src/MeshBVH.js","../src/MeshBVHVisualizer.js","../src/Utils/Debug.js","../src/MeshBVHDebug.js","../src/index.js"],"sourcesContent":["// Split strategy constants\r\nexport const CENTER = 0;\r\nexport const AVERAGE = 1;\r\nexport const SAH = 2;\r\n\r\nexport const NOT_INTERSECTED = 0;\r\nexport const INTERSECTED = 1;\r\nexport const CONTAINED = 2;\r\n","\r\nexport default\r\nclass MeshBVHNode {\r\n\r\n\tconstructor() {\r\n\r\n\t\t// internal nodes have boundingData, left, right, and splitAxis\r\n\t\t// leaf nodes have offset and count (referring to primitives in the mesh geometry)\r\n\r\n\t}\r\n\r\n}\r\n","// Returns a Float32Array representing the bounds data for box.\r\nexport function boxToArray( bx ) {\r\n\r\n\tconst arr = new Float32Array( 6 );\r\n\r\n\tarr[ 0 ] = bx.min.x;\r\n\tarr[ 1 ] = bx.min.y;\r\n\tarr[ 2 ] = bx.min.z;\r\n\r\n\tarr[ 3 ] = bx.max.x;\r\n\tarr[ 4 ] = bx.max.y;\r\n\tarr[ 5 ] = bx.max.z;\r\n\r\n\treturn arr;\r\n\r\n}\r\n\r\nexport function arrayToBox( arr, target ) {\r\n\r\n\ttarget.min.x = arr[ 0 ];\r\n\ttarget.min.y = arr[ 1 ];\r\n\ttarget.min.z = arr[ 2 ];\r\n\r\n\ttarget.max.x = arr[ 3 ];\r\n\ttarget.max.y = arr[ 4 ];\r\n\ttarget.max.z = arr[ 5 ];\r\n\r\n\treturn target;\r\n\r\n}\r\n\r\nexport function getLongestEdgeIndex( bounds ) {\r\n\r\n\tlet splitDimIdx = - 1;\r\n\tlet splitDist = - Infinity;\r\n\r\n\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\tconst dist = bounds[ i + 3 ] - bounds[ i ];\r\n\t\tif ( dist > splitDist ) {\r\n\r\n\t\t\tsplitDist = dist;\r\n\t\t\tsplitDimIdx = i;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn splitDimIdx;\r\n\r\n}\r\n","import { Box3, BufferAttribute } from 'three';\r\nimport MeshBVHNode from './MeshBVHNode.js';\r\nimport { arrayToBox, boxToArray, getLongestEdgeIndex } from './Utils/ArrayBoxUtilities.js';\r\nimport { CENTER, AVERAGE, SAH } from './Constants.js';\r\n\r\n// https://en.wikipedia.org/wiki/Machine_epsilon#Values_for_standard_hardware_floating_point_arithmetics\r\nconst FLOAT32_EPSILON = Math.pow( 2, - 24 );\r\nconst xyzFields = [ 'x', 'y', 'z' ];\r\nconst boxTemp = new Box3();\r\n\r\nfunction ensureIndex( geo ) {\r\n\r\n\tif ( ! geo.index ) {\r\n\r\n\t\tconst vertexCount = geo.attributes.position.count;\r\n\t\tconst index = new ( vertexCount > 65535 ? Uint32Array : Uint16Array )( vertexCount );\r\n\t\tgeo.setIndex( new BufferAttribute( index, 1 ) );\r\n\r\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\r\n\r\n\t\t\tindex[ i ] = i;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\n// Computes the set of { offset, count } ranges which need independent BVH roots. Each\r\n// region in the geometry index that belongs to a different set of material groups requires\r\n// a separate BVH root, so that triangles indices belonging to one group never get swapped\r\n// with triangle indices belongs to another group. For example, if the groups were like this:\r\n//\r\n// [-------------------------------------------------------------]\r\n// |__________________|\r\n//   g0 = [0, 20]  |______________________||_____________________|\r\n//                      g1 = [16, 40]           g2 = [41, 60]\r\n//\r\n// we would need four BVH roots: [0, 15], [16, 20], [21, 40], [41, 60].\r\nfunction getRootIndexRanges( geo ) {\r\n\r\n\tif ( ! geo.groups || ! geo.groups.length ) {\r\n\r\n\t\treturn [ { offset: 0, count: geo.index.count / 3 } ];\r\n\r\n\t}\r\n\r\n\tconst ranges = [];\r\n\tconst rangeBoundaries = new Set();\r\n\tfor ( const group of geo.groups ) {\r\n\r\n\t\trangeBoundaries.add( group.start );\r\n\t\trangeBoundaries.add( group.start + group.count );\r\n\r\n\t}\r\n\r\n\t// note that if you don't pass in a comparator, it sorts them lexicographically as strings :-(\r\n\tconst sortedBoundaries = Array.from( rangeBoundaries.values() ).sort( ( a, b ) => a - b );\r\n\tfor ( let i = 0; i < sortedBoundaries.length - 1; i ++ ) {\r\n\r\n\t\tconst start = sortedBoundaries[ i ], end = sortedBoundaries[ i + 1 ];\r\n\t\tranges.push( { offset: ( start / 3 ), count: ( end - start ) / 3 } );\r\n\r\n\t}\r\n\r\n\treturn ranges;\r\n\r\n}\r\n\r\n// computes the union of the bounds of all of the given triangles and puts the resulting box in target. If\r\n// centroidTarget is provided then a bounding box is computed for the centroids of the triangles, as well.\r\n// These are computed together to avoid redundant accesses to bounds array.\r\nfunction getBounds( triangleBounds, offset, count, target, centroidTarget = null ) {\r\n\r\n\tlet minx = Infinity;\r\n\tlet miny = Infinity;\r\n\tlet minz = Infinity;\r\n\tlet maxx = - Infinity;\r\n\tlet maxy = - Infinity;\r\n\tlet maxz = - Infinity;\r\n\r\n\tlet cminx = Infinity;\r\n\tlet cminy = Infinity;\r\n\tlet cminz = Infinity;\r\n\tlet cmaxx = - Infinity;\r\n\tlet cmaxy = - Infinity;\r\n\tlet cmaxz = - Infinity;\r\n\r\n\tconst includeCentroid = centroidTarget !== null;\r\n\tfor ( let i = offset * 6, end = ( offset + count ) * 6; i < end; i += 6 ) {\r\n\r\n\t\tconst cx = triangleBounds[ i + 0 ];\r\n\t\tconst hx = triangleBounds[ i + 1 ];\r\n\t\tconst lx = cx - hx;\r\n\t\tconst rx = cx + hx;\r\n\t\tif ( lx < minx ) minx = lx;\r\n\t\tif ( rx > maxx ) maxx = rx;\r\n\t\tif ( includeCentroid && cx < cminx ) cminx = cx;\r\n\t\tif ( includeCentroid && cx > cmaxx ) cmaxx = cx;\r\n\r\n\t\tconst cy = triangleBounds[ i + 2 ];\r\n\t\tconst hy = triangleBounds[ i + 3 ];\r\n\t\tconst ly = cy - hy;\r\n\t\tconst ry = cy + hy;\r\n\t\tif ( ly < miny ) miny = ly;\r\n\t\tif ( ry > maxy ) maxy = ry;\r\n\t\tif ( includeCentroid && cy < cminy ) cminy = cy;\r\n\t\tif ( includeCentroid && cy > cmaxy ) cmaxy = cy;\r\n\r\n\t\tconst cz = triangleBounds[ i + 4 ];\r\n\t\tconst hz = triangleBounds[ i + 5 ];\r\n\t\tconst lz = cz - hz;\r\n\t\tconst rz = cz + hz;\r\n\t\tif ( lz < minz ) minz = lz;\r\n\t\tif ( rz > maxz ) maxz = rz;\r\n\t\tif ( includeCentroid && cz < cminz ) cminz = cz;\r\n\t\tif ( includeCentroid && cz > cmaxz ) cmaxz = cz;\r\n\r\n\t}\r\n\r\n\ttarget[ 0 ] = minx;\r\n\ttarget[ 1 ] = miny;\r\n\ttarget[ 2 ] = minz;\r\n\r\n\ttarget[ 3 ] = maxx;\r\n\ttarget[ 4 ] = maxy;\r\n\ttarget[ 5 ] = maxz;\r\n\r\n\tif ( includeCentroid ) {\r\n\r\n\t\tcentroidTarget[ 0 ] = cminx;\r\n\t\tcentroidTarget[ 1 ] = cminy;\r\n\t\tcentroidTarget[ 2 ] = cminz;\r\n\r\n\t\tcentroidTarget[ 3 ] = cmaxx;\r\n\t\tcentroidTarget[ 4 ] = cmaxy;\r\n\t\tcentroidTarget[ 5 ] = cmaxz;\r\n\r\n\t}\r\n\r\n}\r\n\r\n// A stand alone function for retrieving the centroid bounds.\r\nfunction getCentroidBounds( triangleBounds, offset, count, centroidTarget ) {\r\n\r\n\tlet cminx = Infinity;\r\n\tlet cminy = Infinity;\r\n\tlet cminz = Infinity;\r\n\tlet cmaxx = - Infinity;\r\n\tlet cmaxy = - Infinity;\r\n\tlet cmaxz = - Infinity;\r\n\r\n\tfor ( let i = offset * 6, end = ( offset + count ) * 6; i < end; i += 6 ) {\r\n\r\n\t\tconst cx = triangleBounds[ i + 0 ];\r\n\t\tif ( cx < cminx ) cminx = cx;\r\n\t\tif ( cx > cmaxx ) cmaxx = cx;\r\n\r\n\t\tconst cy = triangleBounds[ i + 2 ];\r\n\t\tif ( cy < cminy ) cminy = cy;\r\n\t\tif ( cy > cmaxy ) cmaxy = cy;\r\n\r\n\t\tconst cz = triangleBounds[ i + 4 ];\r\n\t\tif ( cz < cminz ) cminz = cz;\r\n\t\tif ( cz > cmaxz ) cmaxz = cz;\r\n\r\n\t}\r\n\r\n\tcentroidTarget[ 0 ] = cminx;\r\n\tcentroidTarget[ 1 ] = cminy;\r\n\tcentroidTarget[ 2 ] = cminz;\r\n\r\n\tcentroidTarget[ 3 ] = cmaxx;\r\n\tcentroidTarget[ 4 ] = cmaxy;\r\n\tcentroidTarget[ 5 ] = cmaxz;\r\n\r\n}\r\n\r\n\r\n// reorders `tris` such that for `count` elements after `offset`, elements on the left side of the split\r\n// will be on the left and elements on the right side of the split will be on the right. returns the index\r\n// of the first element on the right side, or offset + count if there are no elements on the right side.\r\nfunction partition( index, triangleBounds, sahPlanes, offset, count, split ) {\r\n\r\n\tlet left = offset;\r\n\tlet right = offset + count - 1;\r\n\tconst pos = split.pos;\r\n\tconst axisOffset = split.axis * 2;\r\n\r\n\t// hoare partitioning, see e.g. https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme\r\n\twhile ( true ) {\r\n\r\n\t\twhile ( left <= right && triangleBounds[ left * 6 + axisOffset ] < pos ) {\r\n\r\n\t\t\tleft ++;\r\n\r\n\t\t}\r\n\r\n\t\twhile ( left <= right && triangleBounds[ right * 6 + axisOffset ] >= pos ) {\r\n\r\n\t\t\tright --;\r\n\r\n\t\t}\r\n\r\n\t\tif ( left < right ) {\r\n\r\n\t\t\t// we need to swap all of the information associated with the triangles at index\r\n\t\t\t// left and right; that's the verts in the geometry index, the bounds,\r\n\t\t\t// and perhaps the SAH planes\r\n\r\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\tlet t0 = index[ left * 3 + i ];\r\n\t\t\t\tindex[ left * 3 + i ] = index[ right * 3 + i ];\r\n\t\t\t\tindex[ right * 3 + i ] = t0;\r\n\r\n\t\t\t\tlet t1 = triangleBounds[ left * 6 + i * 2 + 0 ];\r\n\t\t\t\ttriangleBounds[ left * 6 + i * 2 + 0 ] = triangleBounds[ right * 6 + i * 2 + 0 ];\r\n\t\t\t\ttriangleBounds[ right * 6 + i * 2 + 0 ] = t1;\r\n\r\n\t\t\t\tlet t2 = triangleBounds[ left * 6 + i * 2 + 1 ];\r\n\t\t\t\ttriangleBounds[ left * 6 + i * 2 + 1 ] = triangleBounds[ right * 6 + i * 2 + 1 ];\r\n\t\t\t\ttriangleBounds[ right * 6 + i * 2 + 1 ] = t2;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( sahPlanes ) {\r\n\r\n\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\t\tlet t = sahPlanes[ i ][ left ];\r\n\t\t\t\t\tsahPlanes[ i ][ left ] = sahPlanes[ i ][ right ];\r\n\t\t\t\t\tsahPlanes[ i ][ right ] = t;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tleft ++;\r\n\t\t\tright --;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn left;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nfunction getOptimalSplit( nodeBoundingData, centroidBoundingData, triangleBounds, sahPlanes, offset, count, strategy ) {\r\n\r\n\tlet axis = - 1;\r\n\tlet pos = 0;\r\n\r\n\t// Center\r\n\tif ( strategy === CENTER ) {\r\n\r\n\t\taxis = getLongestEdgeIndex( centroidBoundingData );\r\n\t\tif ( axis !== - 1 ) {\r\n\r\n\t\t\tpos = ( centroidBoundingData[ axis ] + centroidBoundingData[ axis + 3 ] ) / 2;\r\n\r\n\t\t}\r\n\r\n\t} else if ( strategy === AVERAGE ) {\r\n\r\n\t\taxis = getLongestEdgeIndex( nodeBoundingData );\r\n\t\tif ( axis !== - 1 ) {\r\n\r\n\t\t\tpos = getAverage( triangleBounds, offset, count, axis );\r\n\r\n\t\t}\r\n\r\n\t} else if ( strategy === SAH ) {\r\n\r\n\t\t// Surface Area Heuristic\r\n\t\t// In order to make this code more terse, the x, y, and z\r\n\t\t// variables of various structures have been stuffed into\r\n\t\t// 0, 1, and 2 array indices so they can be easily computed\r\n\t\t// and accessed within array iteration\r\n\r\n\t\t// Cost values defineed for operations. We're using bounds for traversal, so\r\n\t\t// the cost of traversing one more layer is more than intersecting a triangle.\r\n\t\tconst TRAVERSAL_COST = 3;\r\n\t\tconst INTERSECTION_COST = 1;\r\n\t\tconst bb = arrayToBox( nodeBoundingData, boxTemp );\r\n\r\n\t\t// Define the width, height, and depth of the bounds as a box\r\n\t\tconst dim = [\r\n\t\t\tbb.max.x - bb.min.x,\r\n\t\t\tbb.max.y - bb.min.y,\r\n\t\t\tbb.max.z - bb.min.z\r\n\t\t];\r\n\t\tconst sa = 2 * ( dim[ 0 ] * dim[ 1 ] + dim[ 0 ] * dim[ 2 ] + dim[ 1 ] * dim[ 2 ] );\r\n\r\n\t\t// Get the precalculated planes based for the triangles we're\r\n\t\t// testing here\r\n\t\tconst filteredLists = [[], [], []];\r\n\t\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\r\n\r\n\t\t\tfor ( let v = 0; v < 3; v ++ ) {\r\n\r\n\t\t\t\tfilteredLists[ v ].push( sahPlanes[ v ][ i ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfilteredLists.forEach( planes => planes.sort( ( a, b ) => a.p - b.p ) );\r\n\r\n\t\t// this bounds surface area, left bound SA, left triangles, right bound SA, right triangles\r\n\t\tconst getCost = ( sa, sal, nl, sar, nr ) =>\r\n\t\t\t  TRAVERSAL_COST + INTERSECTION_COST * ( ( sal / sa ) * nl + ( sar / sa ) * nr );\r\n\r\n\t\t// the cost of _not_ splitting into smaller bounds\r\n\t\tconst noSplitCost = INTERSECTION_COST * count;\r\n\r\n\t\taxis = - 1;\r\n\t\tlet bestCost = noSplitCost;\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t// o1 and o2 represent the _other_ two axes in the\r\n\t\t\t// the space. So if we're checking the x (0) dimension,\r\n\t\t\t// then o1 and o2 would be y and z (1 and 2)\r\n\t\t\tconst o1 = ( i + 1 ) % 3;\r\n\t\t\tconst o2 = ( i + 2 ) % 3;\r\n\r\n\t\t\tconst bmin = bb.min[ xyzFields[ i ] ];\r\n\t\t\tconst bmax = bb.max[ xyzFields[ i ] ];\r\n\t\t\tconst planes = filteredLists[ i ];\r\n\r\n\t\t\t// The number of left and right triangles on either side\r\n\t\t\t// given the current split\r\n\t\t\tlet nl = 0;\r\n\t\t\tlet nr = count;\r\n\t\t\tfor ( let p = 0; p < planes.length; p ++ ) {\r\n\r\n\t\t\t\tconst pinfo = planes[ p ];\r\n\r\n\t\t\t\t// As the plane moves, we have to increment or decrement the\r\n\t\t\t\t// number of triangles on either side of the plane\r\n\t\t\t\tnl ++;\r\n\t\t\t\tnr --;\r\n\r\n\t\t\t\t// the distance from the plane to the edge of the broader bounds\r\n\t\t\t\tconst ldim = pinfo.p - bmin;\r\n\t\t\t\tconst rdim = bmax - pinfo.p;\r\n\r\n\t\t\t\t// same for the other two dimensions\r\n\t\t\t\tlet ldimo1 = dim[ o1 ], rdimo1 = dim[ o1 ];\r\n\t\t\t\tlet ldimo2 = dim[ o2 ], rdimo2 = dim[ o2 ];\r\n\r\n\t\t\t\t/*\r\n\t\t\t\t// compute the other bounding planes for the box\r\n\t\t\t\t// if only the current triangles are considered to\r\n\t\t\t\t// be in the box\r\n\t\t\t\t// This is really slow and probably not really worth it\r\n\t\t\t\tconst o1planes = sahPlanes[o1];\r\n\t\t\t\tconst o2planes = sahPlanes[o2];\r\n\t\t\t\tlet lmin = Infinity, lmax = -Infinity;\r\n\t\t\t\tlet rmin = Infinity, rmax = -Infinity;\r\n\t\t\t\tplanes.forEach((p, i) => {\r\n\t\t\t\tconst tri2 = p.tri * 2;\r\n\t\t\t\tconst inf1 = o1planes[tri2 + 0];\r\n\t\t\t\tconst inf2 = o1planes[tri2 + 1];\r\n\t\t\t\tif (i <= nl) {\r\n\t\t\t\tlmin = Math.min(inf1.p, inf2.p, lmin);\r\n\t\t\t\tlmax = Math.max(inf1.p, inf2.p, lmax);\r\n\t\t\t\t}\r\n\t\t\t\tif (i >= nr) {\r\n\t\t\t\trmin = Math.min(inf1.p, inf2.p, rmin);\r\n\t\t\t\trmax = Math.max(inf1.p, inf2.p, rmax);\r\n\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\tldimo1 = Math.min(lmax - lmin, ldimo1);\r\n\t\t\t\trdimo1 = Math.min(rmax - rmin, rdimo1);\r\n\r\n\t\t\t\tplanes.forEach((p, i) => {\r\n\t\t\t\tconst tri2 = p.tri * 2;\r\n\t\t\t\tconst inf1 = o2planes[tri2 + 0];\r\n\t\t\t\tconst inf2 = o2planes[tri2 + 1];\r\n\t\t\t\tif (i <= nl) {\r\n\t\t\t\tlmin = Math.min(inf1.p, inf2.p, lmin);\r\n\t\t\t\tlmax = Math.max(inf1.p, inf2.p, lmax);\r\n\t\t\t\t}\r\n\t\t\t\tif (i >= nr) {\r\n\t\t\t\trmin = Math.min(inf1.p, inf2.p, rmin);\r\n\t\t\t\trmax = Math.max(inf1.p, inf2.p, rmax);\r\n\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\tldimo2 = Math.min(lmax - lmin, ldimo2);\r\n\t\t\t\trdimo2 = Math.min(rmax - rmin, rdimo2);\r\n\t\t\t\t*/\r\n\r\n\t\t\t\t// surface areas and cost\r\n\t\t\t\tconst sal = 2 * ( ldimo1 * ldimo2 + ldimo1 * ldim + ldimo2 * ldim );\r\n\t\t\t\tconst sar = 2 * ( rdimo1 * rdimo2 + rdimo1 * rdim + rdimo2 * rdim );\r\n\t\t\t\tconst cost = getCost( sa, sal, nl, sar, nr );\r\n\r\n\t\t\t\tif ( cost < bestCost ) {\r\n\r\n\t\t\t\t\taxis = i;\r\n\t\t\t\t\tpos = pinfo.p;\r\n\t\t\t\t\tbestCost = cost;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn { axis, pos };\r\n\r\n}\r\n\r\n// returns the average coordinate on the specified axis of the all the provided triangles\r\nfunction getAverage( triangleBounds, offset, count, axis ) {\r\n\r\n\tlet avg = 0;\r\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\r\n\r\n\t\tavg += triangleBounds[ i * 6 + axis * 2 ];\r\n\r\n\t}\r\n\r\n\treturn avg / count;\r\n\r\n}\r\n\r\nfunction computeSAHPlanes( triangleBounds ) {\r\n\r\n\tconst triCount = triangleBounds.length / 6;\r\n\tconst sahPlanes = [ new Array( triCount ), new Array( triCount ), new Array( triCount ) ];\r\n\tfor ( let tri = 0; tri < triCount; tri ++ ) {\r\n\r\n\t\tfor ( let el = 0; el < 3; el ++ ) {\r\n\r\n\t\t\tsahPlanes[ el ][ tri ] = { p: triangleBounds[ tri * 6 + el * 2 ], tri };\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn sahPlanes;\r\n\r\n}\r\n\r\n// precomputes the bounding box for each triangle; required for quickly calculating tree splits.\r\n// result is an array of size tris.length * 6 where triangle i maps to a\r\n// [x_center, x_delta, y_center, y_delta, z_center, z_delta] tuple starting at index i * 6,\r\n// representing the center and half-extent in each dimension of triangle i\r\nfunction computeTriangleBounds( geo ) {\r\n\r\n\tconst posAttr = geo.attributes.position;\r\n\tconst posArr = posAttr.array;\r\n\tconst index = geo.index.array;\r\n\tconst triCount = index.length / 3;\r\n\tconst triangleBounds = new Float32Array( triCount * 6 );\r\n\r\n\t// support for an interleaved position buffer\r\n\tconst bufferOffset = posAttr.offset || 0;\r\n\tlet stride = 3;\r\n\tif ( posAttr.isInterleavedBufferAttribute ) {\r\n\r\n\t\tstride = posAttr.data.stride;\r\n\r\n\t}\r\n\r\n\tfor ( let tri = 0; tri < triCount; tri ++ ) {\r\n\r\n\t\tconst tri3 = tri * 3;\r\n\t\tconst tri6 = tri * 6;\r\n\t\tconst ai = index[ tri3 + 0 ] * stride + bufferOffset;\r\n\t\tconst bi = index[ tri3 + 1 ] * stride + bufferOffset;\r\n\t\tconst ci = index[ tri3 + 2 ] * stride + bufferOffset;\r\n\r\n\t\tfor ( let el = 0; el < 3; el ++ ) {\r\n\r\n\t\t\tconst a = posArr[ ai + el ];\r\n\t\t\tconst b = posArr[ bi + el ];\r\n\t\t\tconst c = posArr[ ci + el ];\r\n\r\n\t\t\tlet min = a;\r\n\t\t\tif ( b < min ) min = b;\r\n\t\t\tif ( c < min ) min = c;\r\n\r\n\t\t\tlet max = a;\r\n\t\t\tif ( b > max ) max = b;\r\n\t\t\tif ( c > max ) max = c;\r\n\r\n\t\t\t// Increase the bounds size by float32 epsilon to avoid precision errors when\r\n\t\t\t// converting to 32 bit float. Scale the epsilon by the size of the numbers being\r\n\t\t\t// worked with.\r\n\t\t\tconst halfExtents = ( max - min ) / 2;\r\n\t\t\tconst el2 = el * 2;\r\n\t\t\ttriangleBounds[ tri6 + el2 + 0 ] = min + halfExtents;\r\n\t\t\ttriangleBounds[ tri6 + el2 + 1 ] = halfExtents + ( Math.abs( min ) + halfExtents ) * FLOAT32_EPSILON;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn triangleBounds;\r\n\r\n}\r\n\r\nexport function buildTree( geo, options ) {\r\n\r\n\t// either recursively splits the given node, creating left and right subtrees for it, or makes it a leaf node,\r\n\t// recording the offset and count of its triangles and writing them into the reordered geometry index.\r\n\tfunction splitNode( node, offset, count, centroidBoundingData = null, depth = 0 ) {\r\n\r\n\t\tif ( ! reachedMaxDepth && depth >= maxDepth ) {\r\n\r\n\t\t\treachedMaxDepth = true;\r\n\t\t\tif ( verbose ) {\r\n\r\n\t\t\t\tconsole.warn( `MeshBVH: Max depth of ${ maxDepth } reached when generating BVH. Consider increasing maxDepth.` );\r\n\t\t\t\tconsole.warn( this, geo );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// early out if we've met our capacity\r\n\t\tif ( count <= maxLeafTris || depth >= maxDepth ) {\r\n\r\n\t\t\tnode.offset = offset;\r\n\t\t\tnode.count = count;\r\n\t\t\treturn node;\r\n\r\n\t\t}\r\n\r\n\t\t// Find where to split the volume\r\n\t\tconst split = getOptimalSplit( node.boundingData, centroidBoundingData, triangleBounds, sahPlanes, offset, count, strategy );\r\n\t\tif ( split.axis === - 1 ) {\r\n\r\n\t\t\tnode.offset = offset;\r\n\t\t\tnode.count = count;\r\n\t\t\treturn node;\r\n\r\n\t\t}\r\n\r\n\t\tconst splitOffset = partition( indexArray, triangleBounds, sahPlanes, offset, count, split );\r\n\r\n\t\t// create the two new child nodes\r\n\t\tif ( splitOffset === offset || splitOffset === offset + count ) {\r\n\r\n\t\t\tnode.offset = offset;\r\n\t\t\tnode.count = count;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tnode.splitAxis = split.axis;\r\n\r\n\t\t\t// create the left child and compute its bounding box\r\n\t\t\tconst left = new MeshBVHNode();\r\n\t\t\tconst lstart = offset;\r\n\t\t\tconst lcount = splitOffset - offset;\r\n\t\t\tnode.left = left;\r\n\t\t\tleft.boundingData = new Float32Array( 6 );\r\n\r\n\t\t\tgetBounds( triangleBounds, lstart, lcount, left.boundingData, cacheCentroidBoundingData );\r\n\t\t\tsplitNode( left, lstart, lcount, cacheCentroidBoundingData, depth + 1 );\r\n\r\n\t\t\t// repeat for right\r\n\t\t\tconst right = new MeshBVHNode();\r\n\t\t\tconst rstart = splitOffset;\r\n\t\t\tconst rcount = count - lcount;\r\n\t\t\tnode.right = right;\r\n\t\t\tright.boundingData = new Float32Array( 6 );\r\n\r\n\t\t\tgetBounds( triangleBounds, rstart, rcount, right.boundingData, cacheCentroidBoundingData );\r\n\t\t\tsplitNode( right, rstart, rcount, cacheCentroidBoundingData, depth + 1 );\r\n\r\n\t\t}\r\n\r\n\t\treturn node;\r\n\r\n\t}\r\n\r\n\tensureIndex( geo );\r\n\r\n\tconst cacheCentroidBoundingData = new Float32Array( 6 );\r\n\tconst triangleBounds = computeTriangleBounds( geo );\r\n\tconst sahPlanes = options.strategy === SAH ? computeSAHPlanes( triangleBounds ) : null;\r\n\tconst indexArray = geo.index.array;\r\n\tconst maxDepth = options.maxDepth;\r\n\tconst verbose = options.verbose;\r\n\tconst maxLeafTris = options.maxLeafTris;\r\n\tconst strategy = options.strategy;\r\n\tlet reachedMaxDepth = false;\r\n\r\n\tconst roots = [];\r\n\tconst ranges = getRootIndexRanges( geo );\r\n\r\n\tif ( ranges.length === 1 ) {\r\n\r\n\t\tconst root = new MeshBVHNode();\r\n\t\tconst range = ranges[ 0 ];\r\n\r\n\t\tif ( geo.boundingBox != null ) {\r\n\r\n\t\t\troot.boundingData = boxToArray( geo.boundingBox );\r\n\t\t\tgetCentroidBounds( triangleBounds, range.offset, range.count, cacheCentroidBoundingData );\r\n\r\n\t\t} else {\r\n\r\n\t\t\troot.boundingData = new Float32Array( 6 );\r\n\t\t\tgetBounds( triangleBounds, range.offset, range.count, root.boundingData, cacheCentroidBoundingData );\r\n\r\n\t\t}\r\n\r\n\t\tsplitNode( root, range.offset, range.count, cacheCentroidBoundingData );\r\n\t\troots.push( root );\r\n\r\n\t} else {\r\n\r\n\t\tfor ( let range of ranges ) {\r\n\r\n\t\t\tconst root = new MeshBVHNode();\r\n\t\t\troot.boundingData = new Float32Array( 6 );\r\n\t\t\tgetBounds( triangleBounds, range.offset, range.count, root.boundingData, cacheCentroidBoundingData );\r\n\r\n\t\t\tsplitNode( root, range.offset, range.count, cacheCentroidBoundingData );\r\n\t\t\troots.push( root );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn roots;\r\n\r\n}\r\n\r\nexport const BYTES_PER_NODE = 6 * 4 + 4 + 4;\r\n\r\nexport const IS_LEAFNODE_FLAG = 0xFFFF;\r\n\r\nexport function buildPackedTree( geo, options ) {\r\n\r\n\t// boundingData  \t\t\t\t: 6 float32\r\n\t// right / offset \t\t\t\t: 1 uint32\r\n\t// splitAxis / isLeaf + count \t: 1 uint32 / 2 uint16\r\n\tconst roots = buildTree( geo, options );\r\n\r\n\tlet float32Array;\r\n\tlet uint32Array;\r\n\tlet uint16Array;\r\n\tconst packedRoots = [];\r\n\tfor ( let i = 0; i < roots.length; i ++ ) {\r\n\r\n\t\tconst root = roots[ i ];\r\n\t\tlet nodeCount = countNodes( root );\r\n\r\n\t\tconst buffer = new ArrayBuffer( BYTES_PER_NODE * nodeCount );\r\n\t\tfloat32Array = new Float32Array( buffer );\r\n\t\tuint32Array = new Uint32Array( buffer );\r\n\t\tuint16Array = new Uint16Array( buffer );\r\n\t\tpopulateBuffer( 0, root );\r\n\t\tpackedRoots.push( buffer );\r\n\r\n\t}\r\n\r\n\treturn packedRoots;\r\n\r\n\tfunction countNodes( node ) {\r\n\r\n\t\tif ( node.count ) {\r\n\r\n\t\t\treturn 1;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn 1 + countNodes( node.left ) + countNodes( node.right );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction populateBuffer( byteOffset, node ) {\r\n\r\n\t\tconst stride4Offset = byteOffset / 4;\r\n\t\tconst stride2Offset = byteOffset / 2;\r\n\t\tconst isLeaf = ! ! node.count;\r\n\t\tconst boundingData = node.boundingData;\r\n\t\tfor ( let i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\tfloat32Array[ stride4Offset + i ] = boundingData[ i ];\r\n\r\n\t\t}\r\n\r\n\t\tif ( isLeaf ) {\r\n\r\n\t\t\tconst offset = node.offset;\r\n\t\t\tconst count = node.count;\r\n\t\t\tuint32Array[ stride4Offset + 6 ] = offset;\r\n\t\t\tuint16Array[ stride2Offset + 14 ] = count;\r\n\t\t\tuint16Array[ stride2Offset + 15 ] = IS_LEAFNODE_FLAG;\r\n\t\t\treturn byteOffset + BYTES_PER_NODE;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconst left = node.left;\r\n\t\t\tconst right = node.right;\r\n\t\t\tconst splitAxis = node.splitAxis;\r\n\r\n\t\t\tlet nextUnusedPointer;\r\n\t\t\tnextUnusedPointer = populateBuffer( byteOffset + BYTES_PER_NODE, left );\r\n\r\n\t\t\tif ( ( nextUnusedPointer / 4 ) > Math.pow( 2, 32 ) ) {\r\n\r\n\t\t\t\tthrow new Error( 'MeshBVH: Cannot store child pointer greater than 32 bits.' );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tuint32Array[ stride4Offset + 6 ] = nextUnusedPointer / 4;\r\n\t\t\tnextUnusedPointer = populateBuffer( nextUnusedPointer, right );\r\n\r\n\t\t\tuint32Array[ stride4Offset + 7 ] = splitAxis;\r\n\t\t\treturn nextUnusedPointer;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n","import { Vector3 } from 'three';\r\n\r\nexport class SeparatingAxisBounds {\r\n\r\n\tconstructor() {\r\n\r\n\t\tthis.min = Infinity;\r\n\t\tthis.max = - Infinity;\r\n\r\n\t}\r\n\r\n\tsetFromPointsField( points, field ) {\r\n\r\n\t\tlet min = Infinity;\r\n\t\tlet max = - Infinity;\r\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\r\n\r\n\t\t\tconst p = points[ i ];\r\n\t\t\tconst val = p[ field ];\r\n\t\t\tmin = Math.min( val, min );\r\n\t\t\tmax = Math.max( val, max );\r\n\r\n\t\t}\r\n\r\n\t\tthis.min = min;\r\n\t\tthis.max = max;\r\n\r\n\r\n\t}\r\n\r\n\tsetFromPoints( axis, points ) {\r\n\r\n\t\tlet min = Infinity;\r\n\t\tlet max = - Infinity;\r\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\r\n\r\n\t\t\tconst p = points[ i ];\r\n\t\t\tconst val = axis.dot( p );\r\n\t\t\tmin = Math.min( val, min );\r\n\t\t\tmax = Math.max( val, max );\r\n\r\n\t\t}\r\n\r\n\t\tthis.min = min;\r\n\t\tthis.max = max;\r\n\r\n\t}\r\n\r\n\tisSeparated( other ) {\r\n\r\n\t\treturn this.min > other.max || other.min > this.max;\r\n\r\n\t}\r\n\r\n}\r\n\r\nSeparatingAxisBounds.prototype.setFromBox = ( function () {\r\n\r\n\tconst p = new Vector3();\r\n\treturn function setFromBox( axis, box ) {\r\n\r\n\t\tconst boxMin = box.min;\r\n\t\tconst boxMax = box.max;\r\n\t\tlet min = Infinity;\r\n\t\tlet max = - Infinity;\r\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\r\n\r\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\r\n\r\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\r\n\r\n\t\t\t\t\tp.x = boxMin.x * x + boxMax.x * ( 1 - x );\r\n\t\t\t\t\tp.y = boxMin.y * y + boxMax.y * ( 1 - y );\r\n\t\t\t\t\tp.z = boxMin.z * z + boxMax.z * ( 1 - z );\r\n\r\n\t\t\t\t\tconst val = axis.dot( p );\r\n\t\t\t\t\tmin = Math.min( val, min );\r\n\t\t\t\t\tmax = Math.max( val, max );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.min = min;\r\n\t\tthis.max = max;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nexport const areIntersecting = ( function () {\r\n\r\n\tconst cacheSatBounds = new SeparatingAxisBounds();\r\n\treturn function areIntersecting( shape1, shape2 ) {\r\n\r\n\t\tconst points1 = shape1.points;\r\n\t\tconst satAxes1 = shape1.satAxes;\r\n\t\tconst satBounds1 = shape1.satBounds;\r\n\r\n\t\tconst points2 = shape2.points;\r\n\t\tconst satAxes2 = shape2.satAxes;\r\n\t\tconst satBounds2 = shape2.satBounds;\r\n\r\n\t\t// check axes of the first shape\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = satBounds1[ i ];\r\n\t\t\tconst sa = satAxes1[ i ];\r\n\t\t\tcacheSatBounds.setFromPoints( sa, points2 );\r\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\t// check axes of the second shape\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = satBounds2[ i ];\r\n\t\t\tconst sa = satAxes2[ i ];\r\n\t\t\tcacheSatBounds.setFromPoints( sa, points1 );\r\n\t\t\tif ( sb.isSeparated( cacheSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n","import { Vector3, Vector2, Plane, Line3 } from 'three';\nexport const closestPointLineToLine = ( function () {\n\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/Line.cpp#L56\n\tconst dir1 = new Vector3();\n\tconst dir2 = new Vector3();\n\tconst v02 = new Vector3();\n\treturn function closestPointLineToLine( l1, l2, result ) {\n\n\t\tconst v0 = l1.start;\n\t\tconst v10 = dir1;\n\t\tconst v2 = l2.start;\n\t\tconst v32 = dir2;\n\n\t\tv02.subVectors( v0, v2 );\n\t\tdir1.subVectors( l1.end, l2.start );\n\t\tdir2.subVectors( l2.end, l2.start );\n\n\t\t// float d0232 = v02.Dot(v32);\n\t\tconst d0232 = v02.dot( v32 );\n\n\t\t// float d3210 = v32.Dot(v10);\n\t\tconst d3210 = v32.dot( v10 );\n\n\t\t// float d3232 = v32.Dot(v32);\n\t\tconst d3232 = v32.dot( v32 );\n\n\t\t// float d0210 = v02.Dot(v10);\n\t\tconst d0210 = v02.dot( v10 );\n\n\t\t// float d1010 = v10.Dot(v10);\n\t\tconst d1010 = v10.dot( v10 );\n\n\t\t// float denom = d1010*d3232 - d3210*d3210;\n\t\tconst denom = d1010 * d3232 - d3210 * d3210;\n\n\t\tlet d, d2;\n\t\tif ( denom !== 0 ) {\n\n\t\t\td = ( d0232 * d3210 - d0210 * d3232 ) / denom;\n\n\t\t} else {\n\n\t\t\td = 0;\n\n\t\t}\n\n\t\td2 = ( d0232 + d * d3210 ) / d3232;\n\n\t\tresult.x = d;\n\t\tresult.y = d2;\n\n\t};\n\n} )();\n\nexport const closestPointsSegmentToSegment = ( function () {\n\n\t// https://github.com/juj/MathGeoLib/blob/master/src/Geometry/LineSegment.cpp#L187\n\tconst paramResult = new Vector2();\n\tconst temp1 = new Vector3();\n\tconst temp2 = new Vector3();\n\treturn function closestPointsSegmentToSegment( l1, l2, target1, target2 ) {\n\n\t\tclosestPointLineToLine( l1, l2, paramResult );\n\n\t\tlet d = paramResult.x;\n\t\tlet d2 = paramResult.y;\n\t\tif ( d >= 0 && d <= 1 && d2 >= 0 && d2 <= 1 ) {\n\n\t\t\tl1.at( d, target1 );\n\t\t\tl2.at( d2, target2 );\n\n\t\t\treturn;\n\n\t\t} else if ( d >= 0 && d <= 1 ) {\n\n\t\t\t// Only d2 is out of bounds.\n\t\t\tif ( d2 < 0 ) {\n\n\t\t\t\tl2.at( 0, target2 );\n\n\t\t\t} else {\n\n\t\t\t\tl2.at( 1, target2 );\n\n\t\t\t}\n\n\t\t\tl1.closestPointToPoint( target2, true, target1 );\n\t\t\treturn;\n\n\t\t} else if ( d2 >= 0 && d2 <= 1 ) {\n\n\t\t\t// Only d is out of bounds.\n\t\t\tif ( d < 0 ) {\n\n\t\t\t\tl1.at( 0, target1 );\n\n\t\t\t} else {\n\n\t\t\t\tl1.at( 1, target1 );\n\n\t\t\t}\n\n\t\t\tl2.closestPointToPoint( target1, true, target2 );\n\t\t\treturn;\n\n\t\t} else {\n\n\t\t\t// Both u and u2 are out of bounds.\n\t\t\tlet p;\n\t\t\tif ( d < 0 ) {\n\n\t\t\t\tp = l1.start;\n\n\t\t\t} else {\n\n\t\t\t\tp = l1.end;\n\n\t\t\t}\n\n\t\t\tlet p2;\n\t\t\tif ( d2 < 0 ) {\n\n\t\t\t\tp2 = l2.start;\n\n\t\t\t} else {\n\n\t\t\t\tp2 = l2.end;\n\n\t\t\t}\n\n\t\t\tconst closestPoint = temp1;\n\t\t\tconst closestPoint2 = temp2;\n\t\t\tl1.closestPointToPoint( p2, true, temp1 );\n\t\t\tl2.closestPointToPoint( p, true, temp2 );\n\n\t\t\tif ( closestPoint.distanceToSquared( p2 ) <= closestPoint2.distanceToSquared( p ) ) {\n\n\t\t\t\ttarget1.copy( closestPoint );\n\t\t\t\ttarget2.copy( p2 );\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\ttarget1.copy( p );\n\t\t\t\ttarget2.copy( closestPoint2 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n} )();\n\n\nexport const sphereIntersectTriangle = ( function () {\n\n\t// https://stackoverflow.com/questions/34043955/detect-collision-between-sphere-and-triangle-in-three-js\n\tconst closestPointTemp = new Vector3();\n\tconst projectedPointTemp = new Vector3();\n\tconst planeTemp = new Plane();\n\tconst lineTemp = new Line3();\n\treturn function sphereIntersectTriangle( sphere, triangle ) {\n\n\t\tconst { radius, center } = sphere;\n\t\tconst { a, b, c } = triangle;\n\n\t\t// phase 1\n\t\tlineTemp.start = a;\n\t\tlineTemp.end = b;\n\t\tconst closestPoint1 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint1.distanceTo( center ) <= radius ) return true;\n\n\t\tlineTemp.start = a;\n\t\tlineTemp.end = c;\n\t\tconst closestPoint2 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint2.distanceTo( center ) <= radius ) return true;\n\n\t\tlineTemp.start = b;\n\t\tlineTemp.end = c;\n\t\tconst closestPoint3 = lineTemp.closestPointToPoint( center, true, closestPointTemp );\n\t\tif ( closestPoint3.distanceTo( center ) <= radius ) return true;\n\n\t\t// phase 2\n\t\tconst plane = triangle.getPlane( planeTemp );\n\t\tconst dp = Math.abs( plane.distanceToPoint( center ) );\n\t\tif ( dp <= radius ) {\n\n\t\t\tconst pp = plane.projectPoint( center, projectedPointTemp );\n\t\t\tconst cp = triangle.containsPoint( pp );\n\t\t\tif ( cp ) return true;\n\n\t\t}\n\n\t\treturn false;\n\n\t};\n\n} )();\n","import { Triangle, Vector3, Line3, Sphere } from 'three';\r\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\r\nimport { closestPointsSegmentToSegment, sphereIntersectTriangle } from './MathUtilities.js';\r\n\r\nexport class SeparatingAxisTriangle extends Triangle {\r\n\r\n\tconstructor( ...args ) {\r\n\r\n\t\tsuper( ...args );\r\n\r\n\t\tthis.isSeparatingAxisTriangle = true;\r\n\t\tthis.satAxes = new Array( 4 ).fill().map( () => new Vector3() );\r\n\t\tthis.satBounds = new Array( 4 ).fill().map( () => new SeparatingAxisBounds() );\r\n\t\tthis.points = [ this.a, this.b, this.c ];\r\n\t\tthis.sphere = new Sphere();\r\n\t\tthis.needsUpdate = false;\r\n\r\n\t}\r\n\r\n\tintersectsSphere( sphere ) {\r\n\r\n\t\treturn sphereIntersectTriangle( sphere, this );\r\n\r\n\t}\r\n\r\n\tupdate() {\r\n\r\n\t\tconst a = this.a;\r\n\t\tconst b = this.b;\r\n\t\tconst c = this.c;\r\n\t\tconst points = this.points;\r\n\r\n\t\tconst satAxes = this.satAxes;\r\n\t\tconst satBounds = this.satBounds;\r\n\r\n\t\tconst axis0 = satAxes[ 0 ];\r\n\t\tconst sab0 = satBounds[ 0 ];\r\n\t\tthis.getNormal( axis0 );\r\n\t\tsab0.setFromPoints( axis0, points );\r\n\r\n\t\tconst axis1 = satAxes[ 1 ];\r\n\t\tconst sab1 = satBounds[ 1 ];\r\n\t\taxis1.subVectors( a, b );\r\n\t\tsab1.setFromPoints( axis1, points );\r\n\r\n\t\tconst axis2 = satAxes[ 2 ];\r\n\t\tconst sab2 = satBounds[ 2 ];\r\n\t\taxis2.subVectors( b, c );\r\n\t\tsab2.setFromPoints( axis2, points );\r\n\r\n\t\tconst axis3 = satAxes[ 3 ];\r\n\t\tconst sab3 = satBounds[ 3 ];\r\n\t\taxis3.subVectors( c, a );\r\n\t\tsab3.setFromPoints( axis3, points );\r\n\r\n\t\tthis.sphere.setFromPoints( this.points );\r\n\t\tthis.needsUpdate = false;\r\n\r\n\t}\r\n\r\n}\r\n\r\nSeparatingAxisTriangle.prototype.closestPointToSegment = ( function () {\r\n\r\n\tconst point1 = new Vector3();\r\n\tconst point2 = new Vector3();\r\n\tconst edge = new Line3();\r\n\r\n\treturn function distanceToSegment( segment, target1 = null, target2 = null ) {\r\n\r\n\t\tconst { start, end } = segment;\r\n\t\tconst points = this.points;\r\n\t\tlet distSq;\r\n\t\tlet closestDistanceSq = Infinity;\r\n\r\n\t\t// check the triangle edges\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst nexti = ( i + 1 ) % 3;\r\n\t\t\tedge.start.copy( points[ i ] );\r\n\t\t\tedge.end.copy( points[ nexti ] );\r\n\r\n\t\t\tclosestPointsSegmentToSegment( edge, segment, point1, point2 );\r\n\r\n\t\t\tdistSq = point1.distanceToSquared( point2 );\r\n\t\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = distSq;\r\n\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// check end points\r\n\t\tthis.closestPointToPoint( start, point1 );\r\n\t\tdistSq = start.distanceToSquared( point1 );\r\n\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\tclosestDistanceSq = distSq;\r\n\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\tif ( target2 ) target2.copy( start );\r\n\r\n\t\t}\r\n\r\n\t\tthis.closestPointToPoint( end, point1 );\r\n\t\tdistSq = end.distanceToSquared( point1 );\r\n\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\tclosestDistanceSq = distSq;\r\n\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\tif ( target2 ) target2.copy( end );\r\n\r\n\t\t}\r\n\r\n\t\treturn Math.sqrt( closestDistanceSq );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nSeparatingAxisTriangle.prototype.intersectsTriangle = ( function () {\r\n\r\n\tconst saTri2 = new SeparatingAxisTriangle();\r\n\tconst arr1 = new Array( 3 );\r\n\tconst arr2 = new Array( 3 );\r\n\tconst cachedSatBounds = new SeparatingAxisBounds();\r\n\tconst cachedSatBounds2 = new SeparatingAxisBounds();\r\n\tconst cachedAxis = new Vector3();\r\n\treturn function intersectsTriangle( other ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! other.isSeparatingAxisTriangle ) {\r\n\r\n\t\t\tsaTri2.copy( other );\r\n\t\t\tsaTri2.update();\r\n\t\t\tother = saTri2;\r\n\r\n\t\t} else if ( other.needsUpdate ) {\r\n\r\n\t\t\tother.update();\r\n\r\n\t\t}\r\n\r\n\t\tconst satBounds1 = this.satBounds;\r\n\t\tconst satAxes1 = this.satAxes;\r\n\t\tarr2[ 0 ] = other.a;\r\n\t\tarr2[ 1 ] = other.b;\r\n\t\tarr2[ 2 ] = other.c;\r\n\t\tfor ( let i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\tconst sb = satBounds1[ i ];\r\n\t\t\tconst sa = satAxes1[ i ];\r\n\t\t\tcachedSatBounds.setFromPoints( sa, arr2 );\r\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\tconst satBounds2 = other.satBounds;\r\n\t\tconst satAxes2 = other.satAxes;\r\n\t\tarr1[ 0 ] = this.a;\r\n\t\tarr1[ 1 ] = this.b;\r\n\t\tarr1[ 2 ] = this.c;\r\n\t\tfor ( let i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\tconst sb = satBounds2[ i ];\r\n\t\t\tconst sa = satAxes2[ i ];\r\n\t\t\tcachedSatBounds.setFromPoints( sa, arr1 );\r\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\t// check crossed axes\r\n\t\tfor ( let i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\tconst sa1 = satAxes1[ i ];\r\n\t\t\tfor ( let i2 = 0; i2 < 4; i2 ++ ) {\r\n\r\n\t\t\t\tconst sa2 = satAxes2[ i2 ];\r\n\t\t\t\tcachedAxis.crossVectors( sa1, sa2 );\r\n\t\t\t\tcachedSatBounds.setFromPoints( cachedAxis, arr1 );\r\n\t\t\t\tcachedSatBounds2.setFromPoints( cachedAxis, arr2 );\r\n\t\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n\r\nSeparatingAxisTriangle.prototype.distanceToPoint = ( function () {\r\n\r\n\tconst target = new Vector3();\r\n\treturn function distanceToPoint( point ) {\r\n\r\n\t\tthis.closestPointToPoint( point, target );\r\n\t\treturn point.distanceTo( target );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n\r\nSeparatingAxisTriangle.prototype.distanceToTriangle = ( function () {\r\n\r\n\tconst point = new Vector3();\r\n\tconst point2 = new Vector3();\r\n\tconst cornerFields = [ 'a', 'b', 'c' ];\r\n\tconst line1 = new Line3();\r\n\tconst line2 = new Line3();\r\n\r\n\treturn function distanceToTriangle( other, target1 = null, target2 = null ) {\r\n\r\n\t\tif ( this.intersectsTriangle( other ) ) {\r\n\r\n\t\t\t// TODO: This will not result in a point that lies on\r\n\t\t\t// the intersection line of the triangles\r\n\t\t\tif ( target1 || target2 ) {\r\n\r\n\t\t\t\tthis.getMidpoint( point );\r\n\t\t\t\tother.closestPointToPoint( point, point2 );\r\n\t\t\t\tthis.closestPointToPoint( point2, point );\r\n\r\n\t\t\t\tif ( target1 ) target1.copy( point );\r\n\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn 0;\r\n\r\n\t\t}\r\n\r\n\t\tlet closestDistanceSq = Infinity;\r\n\r\n\t\t// check all point distances\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tlet dist;\r\n\t\t\tconst field = cornerFields[ i ];\r\n\t\t\tconst otherVec = other[ field ];\r\n\t\t\tthis.closestPointToPoint( otherVec, point );\r\n\r\n\t\t\tdist = otherVec.distanceToSquared( point );\r\n\r\n\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\tif ( target1 ) target1.copy( point );\r\n\t\t\t\tif ( target2 ) target2.copy( otherVec );\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t\tconst thisVec = this[ field ];\r\n\t\t\tother.closestPointToPoint( thisVec, point );\r\n\r\n\t\t\tdist = thisVec.distanceToSquared( point );\r\n\r\n\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\tif ( target1 ) target1.copy( thisVec );\r\n\t\t\t\tif ( target2 ) target2.copy( point );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst f11 = cornerFields[ i ];\r\n\t\t\tconst f12 = cornerFields[ ( i + 1 ) % 3 ];\r\n\t\t\tline1.set( this[ f11 ], this[ f12 ] );\r\n\t\t\tfor ( let i2 = 0; i2 < 3; i2 ++ ) {\r\n\r\n\t\t\t\tconst f21 = cornerFields[ i2 ];\r\n\t\t\t\tconst f22 = cornerFields[ ( i2 + 1 ) % 3 ];\r\n\t\t\t\tline2.set( other[ f21 ], other[ f22 ] );\r\n\r\n\t\t\t\tclosestPointsSegmentToSegment( line1, line2, point, point2 );\r\n\r\n\t\t\t\tconst dist = point.distanceToSquared( point2 );\r\n\t\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\t\tif ( target1 ) target1.copy( point );\r\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn Math.sqrt( closestDistanceSq );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n","import { Box3, Vector3, Matrix4, Sphere, Line3 } from 'three';\r\nimport { SeparatingAxisBounds } from './SeparatingAxisBounds.js';\r\nimport { SeparatingAxisTriangle } from './SeparatingAxisTriangle.js';\r\nimport { closestPointsSegmentToSegment } from './MathUtilities.js';\r\n\r\nexport class OrientedBox extends Box3 {\r\n\r\n\tconstructor( ...args ) {\r\n\r\n\t\tsuper( ...args );\r\n\r\n\t\tthis.isOrientedBox = true;\r\n\t\tthis.matrix = new Matrix4();\r\n\t\tthis.invMatrix = new Matrix4();\r\n\t\tthis.points = new Array( 8 ).fill().map( () => new Vector3() );\r\n\t\tthis.satAxes = new Array( 3 ).fill().map( () => new Vector3() );\r\n\t\tthis.satBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\r\n\t\tthis.alignedSatBounds = new Array( 3 ).fill().map( () => new SeparatingAxisBounds() );\r\n\t\tthis.sphere = new Sphere();\r\n\t\tthis.needsUpdate = false;\r\n\r\n\t}\r\n\r\n\tset( min, max, matrix ) {\r\n\r\n\t\tsuper.set( min, max );\r\n\t\tthis.matrix = matrix;\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n\tcopy( other ) {\r\n\r\n\t\tsuper.copy( other );\r\n\t\tthis.matrix.copy( other.matrix );\r\n\t\tthis.needsUpdate = true;\r\n\r\n\t}\r\n\r\n}\r\n\r\nOrientedBox.prototype.update = ( function () {\r\n\r\n\treturn function update() {\r\n\r\n\t\tconst matrix = this.matrix;\r\n\t\tconst min = this.min;\r\n\t\tconst max = this.max;\r\n\r\n\t\tconst points = this.points;\r\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\r\n\r\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\r\n\r\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\r\n\r\n\t\t\t\t\tconst i = ( ( 1 << 0 ) * x ) | ( ( 1 << 1 ) * y ) | ( ( 1 << 2 ) * z );\r\n\t\t\t\t\tconst v = points[ i ];\r\n\t\t\t\t\tv.x = x ? max.x : min.x;\r\n\t\t\t\t\tv.y = y ? max.y : min.y;\r\n\t\t\t\t\tv.z = z ? max.z : min.z;\r\n\r\n\t\t\t\t\tv.applyMatrix4( matrix );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.sphere.setFromPoints( this.points );\r\n\r\n\t\tconst satBounds = this.satBounds;\r\n\t\tconst satAxes = this.satAxes;\r\n\t\tconst minVec = points[ 0 ];\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst axis = satAxes[ i ];\r\n\t\t\tconst sb = satBounds[ i ];\r\n\t\t\tconst index = 1 << i;\r\n\t\t\tconst pi = points[ index ];\r\n\r\n\t\t\taxis.subVectors( minVec, pi );\r\n\t\t\tsb.setFromPoints( axis, points );\r\n\r\n\t\t}\r\n\r\n\t\tconst alignedSatBounds = this.alignedSatBounds;\r\n\t\talignedSatBounds[ 0 ].setFromPointsField( points, 'x' );\r\n\t\talignedSatBounds[ 1 ].setFromPointsField( points, 'y' );\r\n\t\talignedSatBounds[ 2 ].setFromPointsField( points, 'z' );\r\n\r\n\t\tthis.invMatrix.copy( this.matrix ).invert();\r\n\t\tthis.needsUpdate = false;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.intersectsBox = ( function () {\r\n\r\n\tconst aabbBounds = new SeparatingAxisBounds();\r\n\treturn function intersectsBox( box ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! box.intersectsSphere( this.sphere ) ) return false;\r\n\r\n\t\tconst min = box.min;\r\n\t\tconst max = box.max;\r\n\t\tconst satBounds = this.satBounds;\r\n\t\tconst satAxes = this.satAxes;\r\n\t\tconst alignedSatBounds = this.alignedSatBounds;\r\n\r\n\t\taabbBounds.min = min.x;\r\n\t\taabbBounds.max = max.x;\r\n\t\tif ( alignedSatBounds[ 0 ].isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\taabbBounds.min = min.y;\r\n\t\taabbBounds.max = max.y;\r\n\t\tif ( alignedSatBounds[ 1 ].isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\taabbBounds.min = min.z;\r\n\t\taabbBounds.max = max.z;\r\n\t\tif ( alignedSatBounds[ 2 ].isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst axis = satAxes[ i ];\r\n\t\t\tconst sb = satBounds[ i ];\r\n\t\t\taabbBounds.setFromBox( axis, box );\r\n\t\t\tif ( sb.isSeparated( aabbBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.intersectsTriangle = ( function () {\r\n\r\n\tconst saTri = new SeparatingAxisTriangle();\r\n\tconst pointsArr = new Array( 3 );\r\n\tconst cachedSatBounds = new SeparatingAxisBounds();\r\n\tconst cachedSatBounds2 = new SeparatingAxisBounds();\r\n\tconst cachedAxis = new Vector3();\r\n\treturn function intersectsTriangle( triangle ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! triangle.isSeparatingAxisTriangle ) {\r\n\r\n\t\t\tsaTri.copy( triangle );\r\n\t\t\tsaTri.update();\r\n\t\t\ttriangle = saTri;\r\n\r\n\t\t} else if ( triangle.needsUpdate ) {\r\n\r\n\t\t\ttriangle.update();\r\n\r\n\t\t}\r\n\r\n\t\tconst satBounds = this.satBounds;\r\n\t\tconst satAxes = this.satAxes;\r\n\r\n\t\tpointsArr[ 0 ] = triangle.a;\r\n\t\tpointsArr[ 1 ] = triangle.b;\r\n\t\tpointsArr[ 2 ] = triangle.c;\r\n\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = satBounds[ i ];\r\n\t\t\tconst sa = satAxes[ i ];\r\n\t\t\tcachedSatBounds.setFromPoints( sa, pointsArr );\r\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\tconst triSatBounds = triangle.satBounds;\r\n\t\tconst triSatAxes = triangle.satAxes;\r\n\t\tconst points = this.points;\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sb = triSatBounds[ i ];\r\n\t\t\tconst sa = triSatAxes[ i ];\r\n\t\t\tcachedSatBounds.setFromPoints( sa, points );\r\n\t\t\tif ( sb.isSeparated( cachedSatBounds ) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\t// check crossed axes\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tconst sa1 = satAxes[ i ];\r\n\t\t\tfor ( let i2 = 0; i2 < 4; i2 ++ ) {\r\n\r\n\t\t\t\tconst sa2 = triSatAxes[ i2 ];\r\n\t\t\t\tcachedAxis.crossVectors( sa1, sa2 );\r\n\t\t\t\tcachedSatBounds.setFromPoints( cachedAxis, pointsArr );\r\n\t\t\t\tcachedSatBounds2.setFromPoints( cachedAxis, points );\r\n\t\t\t\tif ( cachedSatBounds.isSeparated( cachedSatBounds2 ) ) return false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.closestPointToPoint = ( function () {\r\n\r\n\treturn function closestPointToPoint( point, target1 ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\ttarget1\r\n\t\t\t.copy( point )\r\n\t\t\t.applyMatrix4( this.invMatrix )\r\n\t\t\t.clamp( this.min, this.max )\r\n\t\t\t.applyMatrix4( this.matrix );\r\n\r\n\t\treturn target1;\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nOrientedBox.prototype.distanceToPoint = ( function () {\r\n\r\n\tconst target = new Vector3();\r\n\treturn function distanceToPoint( point ) {\r\n\r\n\t\tthis.closestPointToPoint( point, target );\r\n\t\treturn point.distanceTo( target );\r\n\r\n\t};\r\n\r\n} )();\r\n\r\n\r\nOrientedBox.prototype.distanceToBox = ( function () {\r\n\r\n\tconst xyzFields = [ 'x', 'y', 'z' ];\r\n\tconst segments1 = new Array( 12 ).fill().map( () => new Line3() );\r\n\tconst segments2 = new Array( 12 ).fill().map( () => new Line3() );\r\n\r\n\tconst point1 = new Vector3();\r\n\tconst point2 = new Vector3();\r\n\r\n\t// early out if we find a value below threshold\r\n\treturn function distanceToBox( box, threshold = 0, target1 = null, target2 = null ) {\r\n\r\n\t\tif ( this.needsUpdate ) {\r\n\r\n\t\t\tthis.update();\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.intersectsBox( box ) ) {\r\n\r\n\t\t\tif ( target1 || target2 ) {\r\n\r\n\t\t\t\tbox.getCenter( point2 );\r\n\t\t\t\tthis.closestPointToPoint( point2, point1 );\r\n\t\t\t\tbox.closestPointToPoint( point1, point2 );\r\n\r\n\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn 0;\r\n\r\n\t\t}\r\n\r\n\t\tconst threshold2 = threshold * threshold;\r\n\t\tconst min = box.min;\r\n\t\tconst max = box.max;\r\n\t\tconst points = this.points;\r\n\r\n\r\n\t\t// iterate over every edge and compare distances\r\n\t\tlet closestDistanceSq = Infinity;\r\n\r\n\t\t// check over all these points\r\n\t\tfor ( let i = 0; i < 8; i ++ ) {\r\n\r\n\t\t\tconst p = points[ i ];\r\n\t\t\tpoint2.copy( p ).clamp( min, max );\r\n\r\n\t\t\tconst dist = p.distanceToSquared( point2 );\r\n\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\tif ( target1 ) target1.copy( p );\r\n\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// generate and check all line segment distances\r\n\t\tlet count = 0;\r\n\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\tfor ( let i1 = 0; i1 <= 1; i1 ++ ) {\r\n\r\n\t\t\t\tfor ( let i2 = 0; i2 <= 1; i2 ++ ) {\r\n\r\n\t\t\t\t\tconst nextIndex = ( i + 1 ) % 3;\r\n\t\t\t\t\tconst nextIndex2 = ( i + 2 ) % 3;\r\n\r\n\t\t\t\t\t// get obb line segments\r\n\t\t\t\t\tconst index = i1 << nextIndex | i2 << nextIndex2;\r\n\t\t\t\t\tconst index2 = 1 << i | i1 << nextIndex | i2 << nextIndex2;\r\n\t\t\t\t\tconst p1 = points[ index ];\r\n\t\t\t\t\tconst p2 = points[ index2 ];\r\n\t\t\t\t\tconst line1 = segments1[ count ];\r\n\t\t\t\t\tline1.set( p1, p2 );\r\n\r\n\r\n\t\t\t\t\t// get aabb line segments\r\n\t\t\t\t\tconst f1 = xyzFields[ i ];\r\n\t\t\t\t\tconst f2 = xyzFields[ nextIndex ];\r\n\t\t\t\t\tconst f3 = xyzFields[ nextIndex2 ];\r\n\t\t\t\t\tconst line2 = segments2[ count ];\r\n\t\t\t\t\tconst start = line2.start;\r\n\t\t\t\t\tconst end = line2.end;\r\n\r\n\t\t\t\t\tstart[ f1 ] = min[ f1 ];\r\n\t\t\t\t\tstart[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\r\n\t\t\t\t\tstart[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\r\n\r\n\t\t\t\t\tend[ f1 ] = max[ f1 ];\r\n\t\t\t\t\tend[ f2 ] = i1 ? min[ f2 ] : max[ f2 ];\r\n\t\t\t\t\tend[ f3 ] = i2 ? min[ f3 ] : max[ f2 ];\r\n\r\n\t\t\t\t\tcount ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// check all the other boxes point\r\n\t\tfor ( let x = 0; x <= 1; x ++ ) {\r\n\r\n\t\t\tfor ( let y = 0; y <= 1; y ++ ) {\r\n\r\n\t\t\t\tfor ( let z = 0; z <= 1; z ++ ) {\r\n\r\n\t\t\t\t\tpoint2.x = x ? max.x : min.x;\r\n\t\t\t\t\tpoint2.y = y ? max.y : min.y;\r\n\t\t\t\t\tpoint2.z = z ? max.z : min.z;\r\n\r\n\t\t\t\t\tthis.closestPointToPoint( point2, point1 );\r\n\t\t\t\t\tconst dist = point2.distanceToSquared( point1 );\r\n\t\t\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( let i = 0; i < 12; i ++ ) {\r\n\r\n\t\t\tconst l1 = segments1[ i ];\r\n\t\t\tfor ( let i2 = 0; i2 < 12; i2 ++ ) {\r\n\r\n\t\t\t\tconst l2 = segments2[ i2 ];\r\n\t\t\t\tclosestPointsSegmentToSegment( l1, l2, point1, point2 );\r\n\t\t\t\tconst dist = point1.distanceToSquared( point2 );\r\n\t\t\t\tif ( dist < closestDistanceSq ) {\r\n\r\n\t\t\t\t\tclosestDistanceSq = dist;\r\n\t\t\t\t\tif ( target1 ) target1.copy( point1 );\r\n\t\t\t\t\tif ( target2 ) target2.copy( point2 );\r\n\r\n\t\t\t\t\tif ( dist < threshold2 ) return Math.sqrt( dist );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn Math.sqrt( closestDistanceSq );\r\n\r\n\t};\r\n\r\n} )();\r\n","// sets the vertices of triangle `tri` with the 3 vertices after i\r\nexport function setTriangle( tri, i, index, pos ) {\r\n\r\n\tconst ta = tri.a;\r\n\tconst tb = tri.b;\r\n\tconst tc = tri.c;\r\n\r\n\tlet i0 = i;\r\n\tlet i1 = i + 1;\r\n\tlet i2 = i + 2;\r\n\tif ( index ) {\r\n\r\n\t\ti0 = index.getX( i );\r\n\t\ti1 = index.getX( i + 1 );\r\n\t\ti2 = index.getX( i + 2 );\r\n\r\n\t}\r\n\r\n\tta.x = pos.getX( i0 );\r\n\tta.y = pos.getY( i0 );\r\n\tta.z = pos.getZ( i0 );\r\n\r\n\ttb.x = pos.getX( i1 );\r\n\ttb.y = pos.getY( i1 );\r\n\ttb.z = pos.getZ( i1 );\r\n\r\n\ttc.x = pos.getX( i2 );\r\n\ttc.y = pos.getY( i2 );\r\n\ttc.z = pos.getZ( i2 );\r\n\r\n}\r\n","import { Vector3, Vector2, Triangle, DoubleSide, BackSide } from 'three';\r\n\r\n// Ripped and modified From THREE.js Mesh raycast\r\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L115\r\nvar vA = new Vector3();\r\nvar vB = new Vector3();\r\nvar vC = new Vector3();\r\n\r\nvar uvA = new Vector2();\r\nvar uvB = new Vector2();\r\nvar uvC = new Vector2();\r\n\r\nvar intersectionPoint = new Vector3();\r\nvar intersectionPointWorld = new Vector3();\r\n\r\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\r\n\r\n\tvar intersect;\r\n\tif ( material.side === BackSide ) {\r\n\r\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\r\n\r\n\t} else {\r\n\r\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\r\n\r\n\t}\r\n\r\n\tif ( intersect === null ) return null;\r\n\r\n\tintersectionPointWorld.copy( point );\r\n\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\r\n\r\n\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\r\n\r\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\r\n\r\n\treturn {\r\n\r\n\t\t// EDITED\r\n\t\t// Including the local-space point so it can be used to accelerate raycasting\r\n\t\tlocalPoint: point,\r\n\t\tdistance: distance,\r\n\t\tpoint: intersectionPointWorld.clone(),\r\n\t\tobject: object\r\n\t};\r\n\r\n}\r\n\r\nfunction checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {\r\n\r\n\tvA.fromBufferAttribute( position, a );\r\n\tvB.fromBufferAttribute( position, b );\r\n\tvC.fromBufferAttribute( position, c );\r\n\r\n\tvar intersection = checkIntersection( object, object.material, raycaster, ray, vA, vB, vC, intersectionPoint );\r\n\r\n\tif ( intersection ) {\r\n\r\n\t\tif ( uv ) {\r\n\r\n\t\t\tuvA.fromBufferAttribute( uv, a );\r\n\t\t\tuvB.fromBufferAttribute( uv, b );\r\n\t\t\tuvC.fromBufferAttribute( uv, c );\r\n\r\n\t\t\tintersection.uv = Triangle.getUV( intersectionPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2( ) );\r\n\r\n\t\t}\r\n\r\n\t\tconst face = {\r\n\t\t\ta: a,\r\n\t\t\tb: b,\r\n\t\t\tc: c,\r\n\t\t\tnormal: new Vector3( ),\r\n\t\t\tmaterialIndex: 0\r\n\t\t};\r\n\r\n\t\tTriangle.getNormal( vA, vB, vC, face.normal );\r\n\r\n\t\tintersection.face = face;\r\n\t\tintersection.faceIndex = a;\r\n\r\n\t}\r\n\r\n\treturn intersection;\r\n\r\n}\r\n\r\n// https://github.com/mrdoob/three.js/blob/0aa87c999fe61e216c1133fba7a95772b503eddf/src/objects/Mesh.js#L258\r\nfunction intersectTri( mesh, geo, raycaster, ray, tri, intersections ) {\r\n\r\n\tconst triOffset = tri * 3;\r\n\tconst a = geo.index.getX( triOffset );\r\n\tconst b = geo.index.getX( triOffset + 1 );\r\n\tconst c = geo.index.getX( triOffset + 2 );\r\n\r\n\tconst intersection = checkBufferGeometryIntersection( mesh, raycaster, ray, geo.attributes.position, geo.attributes.uv, a, b, c );\r\n\r\n\tif ( intersection ) {\r\n\r\n\t\tintersection.faceIndex = tri;\r\n\t\tif ( intersections ) intersections.push( intersection );\r\n\t\treturn intersection;\r\n\r\n\t}\r\n\r\n\treturn null;\r\n\r\n}\r\n\r\nexport { intersectTri };\r\n","import { intersectTri } from './ThreeIntersectionUtilities.js';\r\n\r\nexport function intersectTris( mesh, geo, raycaster, ray, offset, count, intersections ) {\r\n\r\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\r\n\r\n\t\tintersectTri( mesh, geo, raycaster, ray, i, intersections );\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport function intersectClosestTri( mesh, geo, raycaster, ray, offset, count ) {\r\n\r\n\tlet dist = Infinity;\r\n\tlet res = null;\r\n\tfor ( let i = offset, end = offset + count; i < end; i ++ ) {\r\n\r\n\t\tconst intersection = intersectTri( mesh, geo, raycaster, ray, i );\r\n\t\tif ( intersection && intersection.distance < dist ) {\r\n\r\n\t\t\tres = intersection;\r\n\t\t\tdist = intersection.distance;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn res;\r\n\r\n}\r\n","import { setTriangle } from './TriangleUtils.js';\r\n\r\nexport function arrayToBox( nodeIndex32, array, target ) {\r\n\r\n\ttarget.min.x = array[ nodeIndex32 ];\r\n\ttarget.min.y = array[ nodeIndex32 + 1 ];\r\n\ttarget.min.z = array[ nodeIndex32 + 2 ];\r\n\r\n\ttarget.max.x = array[ nodeIndex32 + 3 ];\r\n\ttarget.max.y = array[ nodeIndex32 + 4 ];\r\n\ttarget.max.z = array[ nodeIndex32 + 5 ];\r\n\r\n}\r\n\r\nexport function iterateOverTriangles(\r\n\toffset,\r\n\tcount,\r\n\tgeometry,\r\n\tintersectsTriangleFunc,\r\n\tcontained,\r\n\tdepth,\r\n\ttriangle\r\n) {\r\n\r\n\tconst index = geometry.index;\r\n\tconst pos = geometry.attributes.position;\r\n\tfor ( let i = offset, l = count + offset; i < l; i ++ ) {\r\n\r\n\t\tsetTriangle( triangle, i * 3, index, pos );\r\n\t\ttriangle.needsUpdate = true;\r\n\r\n\t\tif ( intersectsTriangleFunc( triangle, i, contained, depth ) ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn false;\r\n\r\n}\r\n","// For speed and readability this script is processed to replace the macro-like calls\r\n// with inline buffer reads. See generate-cast-functions.js.\r\nimport { Box3, Vector3, Mesh, Matrix4 } from 'three';\r\nimport { intersectTris, intersectClosestTri } from './Utils/RayIntersectTriUtlities.js';\r\nimport { arrayToBox } from './Utils/BufferNodeUtils.js';\r\n\r\nimport { OrientedBox } from './Utils/OrientedBox.js';\r\nimport { setTriangle } from './Utils/TriangleUtils.js';\r\nimport { SeparatingAxisTriangle } from './Utils/SeparatingAxisTriangle.js';\r\nimport { CONTAINED } from './Constants.js';\r\n\r\nconst boundingBox = new Box3();\r\nconst boxIntersection = new Vector3();\r\nconst xyzFields = [ 'x', 'y', 'z' ];\r\n\r\nfunction IS_LEAF( n16, uint16Array ) {\r\n\r\n\treturn uint16Array[ n16 + 15 ] === 0xFFFF;\r\n\r\n}\r\n\r\nfunction OFFSET( n32, uint32Array ) {\r\n\r\n\treturn uint32Array[ n32 + 6 ];\r\n\r\n}\r\n\r\nfunction COUNT( n32, uint16Array ) {\r\n\r\n\treturn uint16Array[ n32 + 14 ];\r\n\r\n}\r\n\r\nfunction LEFT_NODE( n32 ) {\r\n\r\n\treturn n32 + 8;\r\n\r\n}\r\n\r\nfunction RIGHT_NODE( n32, uint32Array ) {\r\n\r\n\treturn uint32Array[ n32 + 6 ];\r\n\r\n}\r\n\r\nfunction SPLIT_AXIS( n32, uint32Array ) {\r\n\r\n\treturn uint32Array[ n32 + 7 ];\r\n\r\n}\r\n\r\nfunction BOUNDING_DATA_INDEX( n32 ) {\r\n\r\n\treturn n32;\r\n\r\n}\r\n\r\nexport function raycast( nodeIndex32, mesh, geometry, raycaster, ray, intersects ) {\r\n\r\n\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\tif ( isLeaf ) {\r\n\r\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\r\n\t\tintersectTris( mesh, geometry, raycaster, ray, offset, count, intersects );\r\n\r\n\t} else {\r\n\r\n\t\tconst leftIndex = LEFT_NODE( nodeIndex32 );\r\n\t\tif ( intersectRay( leftIndex, float32Array, ray, boxIntersection ) ) {\r\n\r\n\t\t\traycast( leftIndex, mesh, geometry, raycaster, ray, intersects );\r\n\r\n\t\t}\r\n\r\n\t\tconst rightIndex = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\tif ( intersectRay( rightIndex, float32Array, ray, boxIntersection ) ) {\r\n\r\n\t\t\traycast( rightIndex, mesh, geometry, raycaster, ray, intersects );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport function raycastFirst( nodeIndex32, mesh, geometry, raycaster, ray ) {\r\n\r\n\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\tif ( isLeaf ) {\r\n\r\n\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\t\treturn intersectClosestTri( mesh, geometry, raycaster, ray, offset, count );\r\n\r\n\t} else {\r\n\r\n\t\t// consider the position of the split plane with respect to the oncoming ray; whichever direction\r\n\t\t// the ray is coming from, look for an intersection among that side of the tree first\r\n\t\tconst splitAxis = SPLIT_AXIS( nodeIndex32, uint32Array );\r\n\t\tconst xyzAxis = xyzFields[ splitAxis ];\r\n\t\tconst rayDir = ray.direction[ xyzAxis ];\r\n\t\tconst leftToRight = rayDir >= 0;\r\n\r\n\t\t// c1 is the child to check first\r\n\t\tlet c1, c2;\r\n\t\tif ( leftToRight ) {\r\n\r\n\t\t\tc1 = LEFT_NODE( nodeIndex32 );\r\n\t\t\tc2 = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tc1 = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\t\tc2 = LEFT_NODE( nodeIndex32 );\r\n\r\n\t\t}\r\n\r\n\t\tconst c1Intersection = intersectRay( c1, float32Array, ray, boxIntersection );\r\n\t\tconst c1Result = c1Intersection ? raycastFirst( c1, mesh, geometry, raycaster, ray ) : null;\r\n\r\n\t\t// if we got an intersection in the first node and it's closer than the second node's bounding\r\n\t\t// box, we don't need to consider the second node because it couldn't possibly be a better result\r\n\t\tif ( c1Result ) {\r\n\r\n\t\t\t// check if the point is within the second bounds\r\n\t\t\tconst point = c1Result.localPoint[ xyzAxis ];\r\n\t\t\tconst isOutside = leftToRight ?\r\n\t\t\t\tpoint <= float32Array[ c2 + splitAxis ] : // min bounding data\r\n\t\t\t\tpoint >= float32Array[ c2 + splitAxis + 3 ]; // max bounding data\r\n\r\n\t\t\tif ( isOutside ) {\r\n\r\n\t\t\t\treturn c1Result;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// either there was no intersection in the first node, or there could still be a closer\r\n\t\t// intersection in the second, so check the second node and then take the better of the two\r\n\t\tconst c2Intersection = intersectRay( c2, float32Array, ray, boxIntersection );\r\n\t\tconst c2Result = c2Intersection ? raycastFirst( c2, mesh, geometry, raycaster, ray ) : null;\r\n\r\n\t\tif ( c1Result && c2Result ) {\r\n\r\n\t\t\treturn c1Result.distance <= c2Result.distance ? c1Result : c2Result;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn c1Result || c2Result || null;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport const shapecast = ( function () {\r\n\r\n\tconst _box1 = new Box3();\r\n\tconst _box2 = new Box3();\r\n\r\n\treturn function shapecast(\r\n\t\tnodeIndex32,\r\n\t\tgeometry,\r\n\t\tintersectsBoundsFunc,\r\n\t\tintersectsRangeFunc,\r\n\t\tnodeScoreFunc = null,\r\n\t\tnodeIndexByteOffset = 0, // offset for unique node identifier\r\n\t\tdepth = 0\r\n\t) {\r\n\r\n\t\t// Define these inside the function so it has access to the local variables needed\r\n\t\t// when converting to the buffer equivalents\r\n\t\tfunction getLeftOffset( nodeIndex32 ) {\r\n\r\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\t\t// traverse until we find a leaf\r\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\r\n\r\n\t\t\t\tnodeIndex32 = LEFT_NODE( nodeIndex32 );\r\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn OFFSET( nodeIndex32, uint32Array );\r\n\r\n\t\t}\r\n\r\n\t\tfunction getRightEndOffset( nodeIndex32 ) {\r\n\r\n\t\t\tlet nodeIndex16 = nodeIndex32 * 2, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\t\t// traverse until we find a leaf\r\n\t\t\twhile ( ! IS_LEAF( nodeIndex16, uint16Array ) ) {\r\n\r\n\t\t\t\t// adjust offset to point to the right node\r\n\t\t\t\tnodeIndex32 = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\t\t\tnodeIndex16 = nodeIndex32 * 2;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// return the end offset of the triangle range\r\n\t\t\treturn OFFSET( nodeIndex32, uint32Array ) + COUNT( nodeIndex16, uint16Array );\r\n\r\n\t\t}\r\n\r\n\t\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\t\tif ( isLeaf ) {\r\n\r\n\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\t\t\treturn intersectsRangeFunc( offset, count, false, depth, nodeIndexByteOffset + nodeIndex32 );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconst left = LEFT_NODE( nodeIndex32 );\r\n\t\t\tconst right = RIGHT_NODE( nodeIndex32, uint32Array );\r\n\t\t\tlet c1 = left;\r\n\t\t\tlet c2 = right;\r\n\r\n\t\t\tlet score1, score2;\r\n\t\t\tlet box1, box2;\r\n\t\t\tif ( nodeScoreFunc ) {\r\n\r\n\t\t\t\tbox1 = _box1;\r\n\t\t\t\tbox2 = _box2;\r\n\r\n\t\t\t\t// bounding data is not offset\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\r\n\r\n\t\t\t\tscore1 = nodeScoreFunc( box1 );\r\n\t\t\t\tscore2 = nodeScoreFunc( box2 );\r\n\r\n\t\t\t\tif ( score2 < score1 ) {\r\n\r\n\t\t\t\t\tc1 = right;\r\n\t\t\t\t\tc2 = left;\r\n\r\n\t\t\t\t\tconst temp = score1;\r\n\t\t\t\t\tscore1 = score2;\r\n\t\t\t\t\tscore2 = temp;\r\n\r\n\t\t\t\t\tbox1 = box2;\r\n\t\t\t\t\t// box2 is always set before use below\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Check box 1 intersection\r\n\t\t\tif ( ! box1 ) {\r\n\r\n\t\t\t\tbox1 = _box1;\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c1 ), float32Array, box1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tconst isC1Leaf = IS_LEAF( c1 * 2, uint16Array );\r\n\t\t\tconst c1Intersection = intersectsBoundsFunc( box1, isC1Leaf, score1, depth + 1, nodeIndexByteOffset + c1 );\r\n\r\n\t\t\tlet c1StopTraversal;\r\n\t\t\tif ( c1Intersection === CONTAINED ) {\r\n\r\n\t\t\t\tconst offset = getLeftOffset( c1 );\r\n\t\t\t\tconst end = getRightEndOffset( c1 );\r\n\t\t\t\tconst count = end - offset;\r\n\r\n\t\t\t\tc1StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexByteOffset + c1 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tc1StopTraversal =\r\n\t\t\t\t\tc1Intersection &&\r\n\t\t\t\t\tshapecast(\r\n\t\t\t\t\t\tc1,\r\n\t\t\t\t\t\tgeometry,\r\n\t\t\t\t\t\tintersectsBoundsFunc,\r\n\t\t\t\t\t\tintersectsRangeFunc,\r\n\t\t\t\t\t\tnodeScoreFunc,\r\n\t\t\t\t\t\tnodeIndexByteOffset,\r\n\t\t\t\t\t\tdepth + 1\r\n\t\t\t\t\t);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( c1StopTraversal ) return true;\r\n\r\n\t\t\t// Check box 2 intersection\r\n\t\t\t// cached box2 will have been overwritten by previous traversal\r\n\t\t\tbox2 = _box2;\r\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( c2 ), float32Array, box2 );\r\n\r\n\t\t\tconst isC2Leaf = IS_LEAF( c2 * 2, uint16Array );\r\n\t\t\tconst c2Intersection = intersectsBoundsFunc( box2, isC2Leaf, score2, depth + 1, nodeIndexByteOffset + c2 );\r\n\r\n\t\t\tlet c2StopTraversal;\r\n\t\t\tif ( c2Intersection === CONTAINED ) {\r\n\r\n\t\t\t\tconst offset = getLeftOffset( c2 );\r\n\t\t\t\tconst end = getRightEndOffset( c2 );\r\n\t\t\t\tconst count = end - offset;\r\n\r\n\t\t\t\tc2StopTraversal = intersectsRangeFunc( offset, count, true, depth + 1, nodeIndexByteOffset + c2 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tc2StopTraversal =\r\n\t\t\t\t\tc2Intersection &&\r\n\t\t\t\t\tshapecast(\r\n\t\t\t\t\t\tc2,\r\n\t\t\t\t\t\tgeometry,\r\n\t\t\t\t\t\tintersectsBoundsFunc,\r\n\t\t\t\t\t\tintersectsRangeFunc,\r\n\t\t\t\t\t\tnodeScoreFunc,\r\n\t\t\t\t\t\tnodeIndexByteOffset,\r\n\t\t\t\t\t\tdepth + 1\r\n\t\t\t\t\t);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( c2StopTraversal ) return true;\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nexport const intersectsGeometry = ( function () {\r\n\r\n\tconst triangle = new SeparatingAxisTriangle();\r\n\tconst triangle2 = new SeparatingAxisTriangle();\r\n\tconst cachedMesh = new Mesh();\r\n\tconst invertedMat = new Matrix4();\r\n\r\n\tconst obb = new OrientedBox();\r\n\tconst obb2 = new OrientedBox();\r\n\r\n\treturn function intersectsGeometry( nodeIndex32, mesh, geometry, otherGeometry, geometryToBvh, cachedObb = null ) {\r\n\r\n\t\tlet nodeIndex16 = nodeIndex32 * 2, float32Array = _float32Array, uint16Array = _uint16Array, uint32Array = _uint32Array;\r\n\r\n\t\tif ( cachedObb === null ) {\r\n\r\n\t\t\tif ( ! otherGeometry.boundingBox ) {\r\n\r\n\t\t\t\totherGeometry.computeBoundingBox();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\r\n\t\t\tcachedObb = obb;\r\n\r\n\t\t}\r\n\r\n\t\tconst isLeaf = IS_LEAF( nodeIndex16, uint16Array );\r\n\t\tif ( isLeaf ) {\r\n\r\n\t\t\tconst thisGeometry = geometry;\r\n\t\t\tconst thisIndex = thisGeometry.index;\r\n\t\t\tconst thisPos = thisGeometry.attributes.position;\r\n\r\n\t\t\tconst index = otherGeometry.index;\r\n\t\t\tconst pos = otherGeometry.attributes.position;\r\n\r\n\t\t\tconst offset = OFFSET( nodeIndex32, uint32Array );\r\n\t\t\tconst count = COUNT( nodeIndex16, uint16Array );\r\n\r\n\t\t\t// get the inverse of the geometry matrix so we can transform our triangles into the\r\n\t\t\t// geometry space we're trying to test. We assume there are fewer triangles being checked\r\n\t\t\t// here.\r\n\t\t\tinvertedMat.copy( geometryToBvh ).invert();\r\n\r\n\t\t\tif ( otherGeometry.boundsTree ) {\r\n\r\n\t\t\t\tarrayToBox( BOUNDING_DATA_INDEX( nodeIndex32 ), float32Array, obb2 );\r\n\t\t\t\tobb2.matrix.copy( invertedMat );\r\n\t\t\t\tobb2.needsUpdate = true;\r\n\r\n\t\t\t\tcachedMesh.geometry = otherGeometry;\r\n\t\t\t\tconst res = otherGeometry.boundsTree.shapecast( cachedMesh, {\r\n\r\n\t\t\t\t\tintersectsBounds: box => obb2.intersectsBox( box ),\r\n\r\n\t\t\t\t\tintersectsTriangle: tri => {\r\n\r\n\t\t\t\t\t\ttri.a.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\ttri.b.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\ttri.c.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\ttri.needsUpdate = true;\r\n\r\n\t\t\t\t\t\tfor ( let i = offset * 3, l = ( count + offset ) * 3; i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\r\n\t\t\t\t\t\t\tsetTriangle( triangle2, i, thisIndex, thisPos );\r\n\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\t\t\t\t\t\t\tif ( tri.intersectsTriangle( triangle2 ) ) {\r\n\r\n\t\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} );\r\n\t\t\t\tcachedMesh.geometry = null;\r\n\r\n\t\t\t\treturn res;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tfor ( let i = offset * 3, l = ( count + offset * 3 ); i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t// this triangle needs to be transformed into the current BVH coordinate frame\r\n\t\t\t\t\tsetTriangle( triangle, i, thisIndex, thisPos );\r\n\t\t\t\t\ttriangle.a.applyMatrix4( invertedMat );\r\n\t\t\t\t\ttriangle.b.applyMatrix4( invertedMat );\r\n\t\t\t\t\ttriangle.c.applyMatrix4( invertedMat );\r\n\t\t\t\t\ttriangle.needsUpdate = true;\r\n\r\n\t\t\t\t\tfor ( let i2 = 0, l2 = index.count; i2 < l2; i2 += 3 ) {\r\n\r\n\t\t\t\t\t\tsetTriangle( triangle2, i2, index, pos );\r\n\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\tif ( triangle.intersectsTriangle( triangle2 ) ) {\r\n\r\n\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tconst left = nodeIndex32 + 8;\r\n\t\t\tconst right = uint32Array[ nodeIndex32 + 6 ];\r\n\r\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( left ), float32Array, boundingBox );\r\n\t\t\tconst leftIntersection =\r\n\t\t\t\tcachedObb.intersectsBox( boundingBox ) &&\r\n\t\t\t\tintersectsGeometry( left, mesh, geometry, otherGeometry, geometryToBvh, cachedObb );\r\n\r\n\t\t\tif ( leftIntersection ) return true;\r\n\r\n\t\t\tarrayToBox( BOUNDING_DATA_INDEX( right ), float32Array, boundingBox );\r\n\t\t\tconst rightIntersection =\r\n\t\t\t\tcachedObb.intersectsBox( boundingBox ) &&\r\n\t\t\t\tintersectsGeometry( right, mesh, geometry, otherGeometry, geometryToBvh, cachedObb );\r\n\r\n\t\t\tif ( rightIntersection ) return true;\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n} )();\r\n\r\nfunction intersectRay( nodeIndex32, array, ray, target ) {\r\n\r\n\tarrayToBox( nodeIndex32, array, boundingBox );\r\n\treturn ray.intersectBox( boundingBox, target );\r\n\r\n}\r\n\r\nconst bufferStack = [];\r\nlet _prevBuffer;\r\nlet _float32Array;\r\nlet _uint16Array;\r\nlet _uint32Array;\r\nexport function setBuffer( buffer ) {\r\n\r\n\tif ( _prevBuffer ) {\r\n\r\n\t\tbufferStack.push( _prevBuffer );\r\n\r\n\t}\r\n\r\n\t_prevBuffer = buffer;\r\n\t_float32Array = new Float32Array( buffer );\r\n\t_uint16Array = new Uint16Array( buffer );\r\n\t_uint32Array = new Uint32Array( buffer );\r\n\r\n}\r\n\r\nexport function clearBuffer() {\r\n\r\n\t_prevBuffer = null;\r\n\t_float32Array = null;\r\n\t_uint16Array = null;\r\n\t_uint32Array = null;\r\n\r\n\tif ( bufferStack.length ) {\r\n\r\n\t\tsetBuffer( bufferStack.pop() );\r\n\r\n\t}\r\n\r\n}\r\n","import { Vector3, BufferAttribute, Box3 } from 'three';\r\nimport { CENTER } from './Constants.js';\r\nimport { BYTES_PER_NODE, IS_LEAFNODE_FLAG, buildPackedTree } from './buildFunctions.js';\r\nimport { OrientedBox } from './Utils/OrientedBox.js';\r\nimport { SeparatingAxisTriangle } from './Utils/SeparatingAxisTriangle.js';\r\nimport { setTriangle } from './Utils/TriangleUtils.js';\r\nimport {\r\n\traycast,\r\n\traycastFirst,\r\n\tshapecast,\r\n\tintersectsGeometry,\r\n\tsetBuffer,\r\n\tclearBuffer,\r\n} from './castFunctions.js';\r\nimport { arrayToBox, iterateOverTriangles } from './Utils/BufferNodeUtils.js';\r\n\r\nconst SKIP_GENERATION = Symbol( 'skip tree generation' );\r\n\r\nconst obb = new OrientedBox();\r\nconst obb2 = new OrientedBox();\r\nconst temp = new Vector3();\r\nconst temp1 = new Vector3();\r\nconst temp2 = new Vector3();\r\nconst tempBox = new Box3();\r\nconst triangle = new SeparatingAxisTriangle();\r\nconst triangle2 = new SeparatingAxisTriangle();\r\n\r\nexport default class MeshBVH {\r\n\r\n\tstatic serialize( bvh, geometry, copyIndexBuffer = true ) {\r\n\r\n\t\tconst rootData = bvh._roots;\r\n\t\tconst indexAttribute = geometry.getIndex();\r\n\t\tconst result = {\r\n\t\t\troots: rootData,\r\n\t\t\tindex: copyIndexBuffer ? indexAttribute.array.slice() : indexAttribute.array,\r\n\t\t};\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\tstatic deserialize( data, geometry, setIndex = true ) {\r\n\r\n\t\tconst { index, roots } = data;\r\n\t\tconst bvh = new MeshBVH( geometry, { [ SKIP_GENERATION ]: true } );\r\n\t\tbvh._roots = roots;\r\n\r\n\t\tif ( setIndex ) {\r\n\r\n\t\t\tconst indexAttribute = geometry.getIndex();\r\n\t\t\tif ( indexAttribute === null ) {\r\n\r\n\t\t\t\tconst newIndex = new BufferAttribute( data.index, 1, false );\r\n\t\t\t\tgeometry.setIndex( newIndex );\r\n\r\n\t\t\t} else if ( indexAttribute.array !== index ) {\r\n\r\n\t\t\t\tindexAttribute.array.set( index );\r\n\t\t\t\tindexAttribute.needsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn bvh;\r\n\r\n\t}\r\n\r\n\tconstructor( geometry, options = {} ) {\r\n\r\n\t\tif ( ! geometry.isBufferGeometry ) {\r\n\r\n\t\t\tthrow new Error( 'MeshBVH: Only BufferGeometries are supported.' );\r\n\r\n\t\t} else if ( geometry.index && geometry.index.isInterleavedBufferAttribute ) {\r\n\r\n\t\t\tthrow new Error( 'MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.' );\r\n\r\n\t\t}\r\n\r\n\t\t// default options\r\n\t\toptions = Object.assign( {\r\n\r\n\t\t\tstrategy: CENTER,\r\n\t\t\tmaxDepth: 40,\r\n\t\t\tmaxLeafTris: 10,\r\n\t\t\tverbose: true,\r\n\r\n\t\t\tsetBoundingBox: true,\r\n\r\n\t\t\t// undocumented options\r\n\r\n\t\t\t// Whether to skip generating the tree. Used for deserialization.\r\n\t\t\t[ SKIP_GENERATION ]: false\r\n\r\n\t\t}, options );\r\n\t\toptions.strategy = Math.max( 0, Math.min( 2, options.strategy ) );\r\n\r\n\t\tthis._roots = null;\r\n\t\tif ( ! options[ SKIP_GENERATION ] ) {\r\n\r\n\t\t\tthis._roots = buildPackedTree( geometry, options );\r\n\r\n\t\t\tif ( ! geometry.boundingBox && options.setBoundingBox ) {\r\n\r\n\t\t\t\tgeometry.boundingBox = this.getBoundingBox( new Box3() );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// retain references to the geometry so we can use them it without having to\r\n\t\t// take a geometry reference in every function.\r\n\t\tthis.geometry = geometry;\r\n\r\n\t}\r\n\r\n\trefit( nodeIndices = null, terminationIndices = null ) {\r\n\r\n\t\tif ( nodeIndices && Array.isArray( nodeIndices ) ) {\r\n\r\n\t\t\tnodeIndices = new Set( nodeIndices );\r\n\r\n\t\t}\r\n\r\n\t\tif ( terminationIndices && Array.isArray( terminationIndices ) ) {\r\n\r\n\t\t\tterminationIndices = new Set( terminationIndices );\r\n\r\n\t\t}\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst indexArr = geometry.index.array;\r\n\t\tconst posAttr = geometry.attributes.position;\r\n\t\tconst posArr = posAttr.array;\r\n\r\n\t\t// support for an interleaved position buffer\r\n\t\tconst bufferOffset = posAttr.offset || 0;\r\n\t\tlet stride = 3;\r\n\t\tif ( posAttr.isInterleavedBufferAttribute ) {\r\n\r\n\t\t\tstride = posAttr.data.stride;\r\n\r\n\t\t}\r\n\r\n\t\tlet buffer, uint32Array, uint16Array, float32Array;\r\n\t\tlet byteOffset = 0;\r\n\t\tconst roots = this._roots;\r\n\t\tfor ( let i = 0, l = roots.length; i < l; i ++ ) {\r\n\r\n\t\t\tbuffer = roots[ i ];\r\n\t\t\tuint32Array = new Uint32Array( buffer );\r\n\t\t\tuint16Array = new Uint16Array( buffer );\r\n\t\t\tfloat32Array = new Float32Array( buffer );\r\n\r\n\t\t\t_traverse( 0, byteOffset );\r\n\t\t\tbyteOffset += buffer.byteLength;\r\n\r\n\t\t}\r\n\r\n\t\tfunction _traverse( node32Index, byteOffset, force = false ) {\r\n\r\n\t\t\tconst node16Index = node32Index * 2;\r\n\t\t\tconst isLeaf = uint16Array[ node16Index + 15 ] === IS_LEAFNODE_FLAG;\r\n\t\t\tif ( isLeaf ) {\r\n\r\n\t\t\t\tconst offset = uint32Array[ node32Index + 6 ];\r\n\t\t\t\tconst count = uint16Array[ node16Index + 14 ];\r\n\r\n\t\t\t\tlet minx = Infinity;\r\n\t\t\t\tlet miny = Infinity;\r\n\t\t\t\tlet minz = Infinity;\r\n\t\t\t\tlet maxx = - Infinity;\r\n\t\t\t\tlet maxy = - Infinity;\r\n\t\t\t\tlet maxz = - Infinity;\r\n\t\t\t\tfor ( let i = 3 * offset, l = 3 * ( offset + count ); i < l; i ++ ) {\r\n\r\n\t\t\t\t\tconst index = indexArr[ i ] * stride + bufferOffset;\r\n\t\t\t\t\tconst x = posArr[ index + 0 ];\r\n\t\t\t\t\tconst y = posArr[ index + 1 ];\r\n\t\t\t\t\tconst z = posArr[ index + 2 ];\r\n\r\n\t\t\t\t\tif ( x < minx ) minx = x;\r\n\t\t\t\t\tif ( x > maxx ) maxx = x;\r\n\r\n\t\t\t\t\tif ( y < miny ) miny = y;\r\n\t\t\t\t\tif ( y > maxy ) maxy = y;\r\n\r\n\t\t\t\t\tif ( z < minz ) minz = z;\r\n\t\t\t\t\tif ( z > maxz ) maxz = z;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (\r\n\t\t\t\t\tfloat32Array[ node32Index + 0 ] !== minx ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 1 ] !== miny ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 2 ] !== minz ||\r\n\r\n\t\t\t\t\tfloat32Array[ node32Index + 3 ] !== maxx ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 4 ] !== maxy ||\r\n\t\t\t\t\tfloat32Array[ node32Index + 5 ] !== maxz\r\n\t\t\t\t) {\r\n\r\n\t\t\t\t\tfloat32Array[ node32Index + 0 ] = minx;\r\n\t\t\t\t\tfloat32Array[ node32Index + 1 ] = miny;\r\n\t\t\t\t\tfloat32Array[ node32Index + 2 ] = minz;\r\n\r\n\t\t\t\t\tfloat32Array[ node32Index + 3 ] = maxx;\r\n\t\t\t\t\tfloat32Array[ node32Index + 4 ] = maxy;\r\n\t\t\t\t\tfloat32Array[ node32Index + 5 ] = maxz;\r\n\r\n\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconst left = node32Index + 8;\r\n\t\t\t\tconst right = uint32Array[ node32Index + 6 ];\r\n\r\n\t\t\t\t// the indentifying node indices provided by the shapecast function include offsets of all\r\n\t\t\t\t// root buffers to guarantee they're unique between roots so offset left and right indices here.\r\n\t\t\t\tconst offsetLeft = left + byteOffset;\r\n\t\t\t\tconst offsetRight = right + byteOffset;\r\n\r\n\t\t\t\tlet leftChange = false;\r\n\t\t\t\tlet forceLeft = force || terminationIndices && terminationIndices.has( offsetLeft );\r\n\t\t\t\tlet traverseLeft = forceLeft || ( nodeIndices ? nodeIndices.has( offsetLeft ) : true );\r\n\t\t\t\tif ( traverseLeft ) {\r\n\r\n\t\t\t\t\tleftChange = _traverse( left, byteOffset, forceLeft );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet rightChange = false;\r\n\t\t\t\tlet forceRight = force || terminationIndices && terminationIndices.has( offsetRight );\r\n\t\t\t\tlet traverseRight = forceRight || ( nodeIndices ? nodeIndices.has( offsetRight ) : true );\r\n\t\t\t\tif ( traverseRight ) {\r\n\r\n\t\t\t\t\trightChange = _traverse( right, byteOffset, forceRight );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst didChange = leftChange || rightChange;\r\n\r\n\t\t\t\tif ( didChange ) {\r\n\r\n\t\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\t\t\tconst lefti = left + i;\r\n\t\t\t\t\t\tconst righti = right + i;\r\n\t\t\t\t\t\tconst minLeftValue = float32Array[ lefti ];\r\n\t\t\t\t\t\tconst maxLeftValue = float32Array[ lefti + 3 ];\r\n\t\t\t\t\t\tconst minRightValue = float32Array[ righti ];\r\n\t\t\t\t\t\tconst maxRightValue = float32Array[ righti + 3 ];\r\n\r\n\t\t\t\t\t\tfloat32Array[ node32Index + i ] = minLeftValue < minRightValue ? minLeftValue : minRightValue;\r\n\t\t\t\t\t\tfloat32Array[ node32Index + i + 3 ] = maxLeftValue > maxRightValue ? maxLeftValue : maxRightValue;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn didChange;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\ttraverse( callback, rootIndex = 0 ) {\r\n\r\n\t\tconst buffer = this._roots[ rootIndex ];\r\n\t\tconst uint32Array = new Uint32Array( buffer );\r\n\t\tconst uint16Array = new Uint16Array( buffer );\r\n\t\t_traverse( 0 );\r\n\r\n\t\tfunction _traverse( node32Index, depth = 0 ) {\r\n\r\n\t\t\tconst node16Index = node32Index * 2;\r\n\t\t\tconst isLeaf = uint16Array[ node16Index + 15 ] === IS_LEAFNODE_FLAG;\r\n\t\t\tif ( isLeaf ) {\r\n\r\n\t\t\t\tconst offset = uint32Array[ node32Index + 6 ];\r\n\t\t\t\tconst count = uint16Array[ node16Index + 14 ];\r\n\t\t\t\tcallback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), offset, count );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconst left = node32Index + BYTES_PER_NODE / 4;\r\n\t\t\t\tconst right = uint32Array[ node32Index + 6 ];\r\n\t\t\t\tconst splitAxis = uint32Array[ node32Index + 7 ];\r\n\t\t\t\tconst stopTraversal = callback( depth, isLeaf, new Float32Array( buffer, node32Index * 4, 6 ), splitAxis );\r\n\r\n\t\t\t\tif ( ! stopTraversal ) {\r\n\r\n\t\t\t\t\t_traverse( left, depth + 1 );\r\n\t\t\t\t\t_traverse( right, depth + 1 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/* Core Cast Functions */\r\n\traycast( mesh, raycaster, ray, intersects ) {\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst localIntersects = intersects ? [] : null;\r\n\t\tfor ( const root of this._roots ) {\r\n\r\n\t\t\tsetBuffer( root );\r\n\t\t\traycast( 0, mesh, geometry, raycaster, ray, localIntersects );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t}\r\n\r\n\t\tif ( intersects ) {\r\n\r\n\t\t\tfor ( let i = 0, l = localIntersects.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tdelete localIntersects[ i ].localPoint;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tintersects.push( ...localIntersects );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\traycastFirst( mesh, raycaster, ray ) {\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tlet closestResult = null;\r\n\t\tfor ( const root of this._roots ) {\r\n\r\n\t\t\tsetBuffer( root );\r\n\t\t\tconst result = raycastFirst( 0, mesh, geometry, raycaster, ray );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t\tif ( result != null && ( closestResult == null || result.distance < closestResult.distance ) ) {\r\n\r\n\t\t\t\tclosestResult = result;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( closestResult ) {\r\n\r\n\t\t\tdelete closestResult.localPoint;\r\n\r\n\t\t}\r\n\r\n\t\treturn closestResult;\r\n\r\n\t}\r\n\r\n\tintersectsGeometry( mesh, otherGeometry, geomToMesh ) {\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tlet result = false;\r\n\t\tfor ( const root of this._roots ) {\r\n\r\n\t\t\tsetBuffer( root );\r\n\t\t\tresult = intersectsGeometry( 0, mesh, geometry, otherGeometry, geomToMesh );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t\tif ( result ) {\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\tshapecast( mesh, callbacks, _intersectsTriangleFunc, _orderNodesFunc ) {\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tif ( callbacks instanceof Function ) {\r\n\r\n\t\t\tif ( _intersectsTriangleFunc ) {\r\n\r\n\t\t\t\t// Support the previous function signature that provided three sequential index buffer\r\n\t\t\t\t// indices here.\r\n\t\t\t\tconst originalTriangleFunc = _intersectsTriangleFunc;\r\n\t\t\t\t_intersectsTriangleFunc = ( tri, index, contained, depth ) => {\r\n\r\n\t\t\t\t\tconst i3 = index * 3;\r\n\t\t\t\t\treturn originalTriangleFunc( tri, i3, i3 + 1, i3 + 2, contained, depth );\r\n\r\n\t\t\t\t};\r\n\r\n\r\n\t\t\t}\r\n\r\n\t\t\tcallbacks = {\r\n\r\n\t\t\t\tboundsTraverseOrder: _orderNodesFunc,\r\n\t\t\t\tintersectsBounds: callbacks,\r\n\t\t\t\tintersectsTriangle: _intersectsTriangleFunc,\r\n\t\t\t\tintersectsRange: null,\r\n\r\n\t\t\t};\r\n\r\n\t\t\tconsole.warn( 'MeshBVH: Shapecast function signature has changed and now takes an object of callbacks as a second argument. See docs for new signature.' );\r\n\r\n\t\t}\r\n\r\n\t\tlet {\r\n\t\t\tboundsTraverseOrder,\r\n\t\t\tintersectsBounds,\r\n\t\t\tintersectsRange,\r\n\t\t\tintersectsTriangle,\r\n\t\t} = callbacks;\r\n\r\n\t\tif ( intersectsRange && intersectsTriangle ) {\r\n\r\n\t\t\tconst originalIntersectsRange = intersectsRange;\r\n\t\t\tintersectsRange = ( offset, count, contained, depth, nodeIndex ) => {\r\n\r\n\t\t\t\tif ( ! originalIntersectsRange( offset, count, contained, depth, nodeIndex ) ) {\r\n\r\n\t\t\t\t\treturn iterateOverTriangles( offset, count, geometry, intersectsTriangle, contained, depth, triangle );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t};\r\n\r\n\t\t} else if ( ! intersectsRange ) {\r\n\r\n\t\t\tif ( intersectsTriangle ) {\r\n\r\n\t\t\t\tintersectsRange = ( offset, count, contained, depth ) => {\r\n\r\n\t\t\t\t\treturn iterateOverTriangles( offset, count, geometry, intersectsTriangle, contained, depth, triangle );\r\n\r\n\t\t\t\t};\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tintersectsRange = ( offset, count, contained ) => {\r\n\r\n\t\t\t\t\treturn contained;\r\n\r\n\t\t\t\t};\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tlet result = false;\r\n\t\tlet byteOffset = 0;\r\n\t\tfor ( const root of this._roots ) {\r\n\r\n\t\t\tsetBuffer( root );\r\n\t\t\tresult = shapecast( 0, geometry, intersectsBounds, intersectsRange, boundsTraverseOrder, byteOffset );\r\n\t\t\tclearBuffer();\r\n\r\n\t\t\tif ( result ) {\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbyteOffset += root.byteLength;\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\t/* Derived Cast Functions */\r\n\tintersectsBox( mesh, box, boxToMesh ) {\r\n\r\n\t\tobb.set( box.min, box.max, boxToMesh );\r\n\t\tobb.needsUpdate = true;\r\n\r\n\t\treturn this.shapecast(\r\n\t\t\tmesh,\r\n\t\t\t{\r\n\t\t\t\tintersectsBounds: box => obb.intersectsBox( box ),\r\n\t\t\t\tintersectsTriangle: tri => obb.intersectsTriangle( tri )\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t}\r\n\r\n\tintersectsSphere( mesh, sphere ) {\r\n\r\n\t\treturn this.shapecast(\r\n\t\t\tmesh,\r\n\t\t\t{\r\n\t\t\t\tintersectsBounds: box => sphere.intersectsBox( box ),\r\n\t\t\t\tintersectsTriangle: tri => tri.intersectsSphere( sphere )\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t}\r\n\r\n\tclosestPointToGeometry( mesh, otherGeometry, geometryToBvh, target1 = null, target2 = null, minThreshold = 0, maxThreshold = Infinity ) {\r\n\r\n\t\tif ( ! otherGeometry.boundingBox ) {\r\n\r\n\t\t\totherGeometry.computeBoundingBox();\r\n\r\n\t\t}\r\n\r\n\t\tobb.set( otherGeometry.boundingBox.min, otherGeometry.boundingBox.max, geometryToBvh );\r\n\t\tobb.needsUpdate = true;\r\n\r\n\t\tconst geometry = this.geometry;\r\n\t\tconst pos = geometry.attributes.position;\r\n\t\tconst index = geometry.index;\r\n\t\tconst otherPos = otherGeometry.attributes.position;\r\n\t\tconst otherIndex = otherGeometry.index;\r\n\r\n\t\tlet tempTarget1 = null;\r\n\t\tlet tempTarget2 = null;\r\n\t\tif ( target1 ) {\r\n\r\n\t\t\ttempTarget1 = temp1;\r\n\r\n\t\t}\r\n\r\n\t\tif ( target2 ) {\r\n\r\n\t\t\ttempTarget2 = temp2;\r\n\r\n\t\t}\r\n\r\n\t\tlet closestDistance = Infinity;\r\n\t\tobb2.matrix.copy( geometryToBvh ).invert();\r\n\t\tthis.shapecast(\r\n\t\t\tmesh,\r\n\t\t\t{\r\n\r\n\t\t\t\tboundsTraverseOrder: box => {\r\n\r\n\t\t\t\t\treturn obb.distanceToBox( box, Math.min( closestDistance, maxThreshold ) );\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\r\n\r\n\t\t\t\t\tif ( score < closestDistance && score < maxThreshold ) {\r\n\r\n\t\t\t\t\t\t// if we know the triangles of this bounds will be intersected next then\r\n\t\t\t\t\t\t// save the bounds to use during triangle checks.\r\n\t\t\t\t\t\tif ( isLeaf ) {\r\n\r\n\t\t\t\t\t\t\tobb2.min.copy( box.min );\r\n\t\t\t\t\t\t\tobb2.max.copy( box.max );\r\n\t\t\t\t\t\t\tobb2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsRange: ( offset, count ) => {\r\n\r\n\t\t\t\t\tif ( otherGeometry.boundsTree ) {\r\n\r\n\t\t\t\t\t\t// if the other geometry has a bvh then use the accelerated path where we use shapecast to find\r\n\t\t\t\t\t\t// the closest bounds in the other geometry to check.\r\n\t\t\t\t\t\treturn otherGeometry.boundsTree.shapecast(\r\n\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tboundsTraverseOrder: box => {\r\n\r\n\t\t\t\t\t\t\t\t\treturn obb2.distanceToBox( box, Math.min( closestDistance, maxThreshold ) );\r\n\r\n\t\t\t\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\r\n\r\n\t\t\t\t\t\t\t\t\treturn score < closestDistance && score < maxThreshold;\r\n\r\n\t\t\t\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\t\t\tintersectsRange: ( otherOffset, otherCount ) => {\r\n\r\n\t\t\t\t\t\t\t\t\tfor ( let i2 = otherOffset * 3, l2 = ( otherOffset + otherCount ) * 3; i2 < l2; i2 += 3 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\tsetTriangle( triangle2, i2, otherIndex, otherPos );\r\n\t\t\t\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\t\t\t\tfor ( let i = offset * 3, l = ( offset + count ) * 3; i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\tsetTriangle( triangle, i, index, pos );\r\n\t\t\t\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\r\n\t\t\t\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\tif ( target1 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttarget1.copy( tempTarget1 );\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\tif ( target2 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttarget2.copy( tempTarget2 );\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\tclosestDistance = dist;\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\r\n\t\t\t\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t// If no bounds tree then we'll just check every triangle.\r\n\t\t\t\t\t\tconst triCount = otherIndex ? otherIndex.count : otherPos.count;\r\n\t\t\t\t\t\tfor ( let i2 = 0, l2 = triCount; i2 < l2; i2 += 3 ) {\r\n\r\n\t\t\t\t\t\t\tsetTriangle( triangle2, i2, otherIndex, otherPos );\r\n\t\t\t\t\t\t\ttriangle2.a.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\ttriangle2.b.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\ttriangle2.c.applyMatrix4( geometryToBvh );\r\n\t\t\t\t\t\t\ttriangle2.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\tfor ( let i = offset * 3, l = ( offset + count ) * 3; i < l; i += 3 ) {\r\n\r\n\t\t\t\t\t\t\t\tsetTriangle( triangle, i, index, pos );\r\n\t\t\t\t\t\t\t\ttriangle.needsUpdate = true;\r\n\r\n\t\t\t\t\t\t\t\tconst dist = triangle.distanceToTriangle( triangle2, tempTarget1, tempTarget2 );\r\n\t\t\t\t\t\t\t\tif ( dist < closestDistance ) {\r\n\r\n\t\t\t\t\t\t\t\t\tif ( target1 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\ttarget1.copy( tempTarget1 );\r\n\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\tif ( target2 ) {\r\n\r\n\t\t\t\t\t\t\t\t\t\ttarget2.copy( tempTarget2 );\r\n\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\tclosestDistance = dist;\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t// stop traversal if we find a point that's under the given threshold\r\n\t\t\t\t\t\t\t\tif ( dist < minThreshold ) {\r\n\r\n\t\t\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t}\r\n\r\n\t\t);\r\n\r\n\t\treturn closestDistance;\r\n\r\n\t}\r\n\r\n\tdistanceToGeometry( mesh, geom, matrix, minThreshold, maxThreshold ) {\r\n\r\n\t\treturn this.closestPointToGeometry( mesh, geom, matrix, null, null, minThreshold, maxThreshold );\r\n\r\n\t}\r\n\r\n\tclosestPointToPoint( mesh, point, target, minThreshold = 0, maxThreshold = Infinity ) {\r\n\r\n\t\t// early out if under minThreshold\r\n\t\t// skip checking if over maxThreshold\r\n\t\t// set minThreshold = maxThreshold to quickly check if a point is within a threshold\r\n\t\t// returns Infinity if no value found\r\n\t\tconst minThresholdSq = minThreshold * minThreshold;\r\n\t\tconst maxThresholdSq = maxThreshold * maxThreshold;\r\n\t\tlet closestDistanceSq = Infinity;\r\n\t\tthis.shapecast(\r\n\r\n\t\t\tmesh,\r\n\t\t\t{\r\n\r\n\t\t\t\tboundsTraverseOrder: box => {\r\n\r\n\t\t\t\t\ttemp.copy( point ).clamp( box.min, box.max );\r\n\t\t\t\t\treturn temp.distanceToSquared( point );\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsBounds: ( box, isLeaf, score ) => {\r\n\r\n\t\t\t\t\treturn score < closestDistanceSq && score < maxThresholdSq;\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tintersectsTriangle: tri => {\r\n\r\n\t\t\t\t\ttri.closestPointToPoint( point, temp );\r\n\t\t\t\t\tconst distSq = point.distanceToSquared( temp );\r\n\t\t\t\t\tif ( distSq < closestDistanceSq ) {\r\n\r\n\t\t\t\t\t\tif ( target ) {\r\n\r\n\t\t\t\t\t\t\ttarget.copy( temp );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tclosestDistanceSq = distSq;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( distSq < minThresholdSq ) {\r\n\r\n\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t}\r\n\r\n\t\t);\r\n\r\n\t\treturn Math.sqrt( closestDistanceSq );\r\n\r\n\t}\r\n\r\n\tdistanceToPoint( mesh, point, minThreshold, maxThreshold ) {\r\n\r\n\t\treturn this.closestPointToPoint( mesh, point, null, minThreshold, maxThreshold );\r\n\r\n\t}\r\n\r\n\tgetBoundingBox( target ) {\r\n\r\n\t\ttarget.makeEmpty();\r\n\r\n\t\tconst roots = this._roots;\r\n\t\troots.forEach( buffer => {\r\n\r\n\t\t\tarrayToBox( 0, new Float32Array( buffer ), tempBox );\r\n\t\t\ttarget.union( tempBox );\r\n\r\n\t\t} );\r\n\r\n\t\treturn target;\r\n\r\n\t}\r\n\r\n}\r\n","import { LineBasicMaterial, BufferAttribute, Box3, Group, LineSegments } from 'three';\r\nimport { arrayToBox } from './Utils/ArrayBoxUtilities.js';\r\n\r\nconst boundingBox = new Box3();\r\nclass MeshBVHRootVisualizer extends LineSegments {\r\n\r\n\tconstructor( mesh, material, depth = 10, group = 0 ) {\r\n\r\n\t\tsuper( undefined, material );\r\n\r\n\t\tthis.material = material;\r\n\t\tthis.name = 'MeshBVHRootVisualizer';\r\n\t\tthis.depth = depth;\r\n\t\tthis.mesh = mesh;\r\n\t\tthis._group = group;\r\n\r\n\t\tthis.update();\r\n\r\n\t}\r\n\r\n\traycast() {}\r\n\r\n\tupdate() {\r\n\r\n\t\tconst linesGeometry = this.geometry;\r\n\t\tconst boundsTree = this.mesh.geometry.boundsTree;\r\n\t\tconst group = this._group;\r\n\t\tlinesGeometry.dispose();\r\n\t\tthis.visible = false;\r\n\t\tif ( boundsTree ) {\r\n\r\n\t\t\t// count the number of bounds required\r\n\t\t\tconst targetDepth = this.depth - 1;\r\n\t\t\tlet boundsCount = 0;\r\n\t\t\tboundsTree.traverse( ( depth, isLeaf ) => {\r\n\r\n\t\t\t\tif ( depth === targetDepth || isLeaf ) {\r\n\r\n\t\t\t\t\tboundsCount ++;\r\n\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}, group );\r\n\r\n\t\t\t// fill in the position buffer with the bounds corners\r\n\t\t\tlet posIndex = 0;\r\n\t\t\tconst positionArray = new Float32Array( 8 * 3 * boundsCount );\r\n\t\t\tboundsTree.traverse( ( depth, isLeaf, boundingData ) => {\r\n\r\n\t\t\t\tif ( depth === targetDepth || isLeaf ) {\r\n\r\n\t\t\t\t\tarrayToBox( boundingData, boundingBox );\r\n\r\n\t\t\t\t\tconst { min, max } = boundingBox;\r\n\t\t\t\t\tfor ( let x = - 1; x <= 1; x += 2 ) {\r\n\r\n\t\t\t\t\t\tconst xVal = x < 0 ? min.x : max.x;\r\n\t\t\t\t\t\tfor ( let y = - 1; y <= 1; y += 2 ) {\r\n\r\n\t\t\t\t\t\t\tconst yVal = y < 0 ? min.y : max.y;\r\n\t\t\t\t\t\t\tfor ( let z = - 1; z <= 1; z += 2 ) {\r\n\r\n\t\t\t\t\t\t\t\tconst zVal = z < 0 ? min.z : max.z;\r\n\t\t\t\t\t\t\t\tpositionArray[ posIndex + 0 ] = xVal;\r\n\t\t\t\t\t\t\t\tpositionArray[ posIndex + 1 ] = yVal;\r\n\t\t\t\t\t\t\t\tpositionArray[ posIndex + 2 ] = zVal;\r\n\r\n\t\t\t\t\t\t\t\tposIndex += 3;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}, group );\r\n\r\n\t\t\t// fill in the index buffer to point to the corner points\r\n\t\t\tconst edgeIndices = new Uint8Array( [\r\n\t\t\t\t// x axis\r\n\t\t\t\t0, 4,\r\n\t\t\t\t1, 5,\r\n\t\t\t\t2, 6,\r\n\t\t\t\t3, 7,\r\n\r\n\t\t\t\t// y axis\r\n\t\t\t\t0, 2,\r\n\t\t\t\t1, 3,\r\n\t\t\t\t4, 6,\r\n\t\t\t\t5, 7,\r\n\r\n\t\t\t\t// z axis\r\n\t\t\t\t0, 1,\r\n\t\t\t\t2, 3,\r\n\t\t\t\t4, 5,\r\n\t\t\t\t6, 7,\r\n\t\t\t] );\r\n\r\n\t\t\tlet indexArray;\r\n\t\t\tif ( positionArray.length > 65535 ) {\r\n\r\n\t\t\t\tindexArray = new Uint32Array( 12 * 2 * boundsCount );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tindexArray = new Uint16Array( 12 * 2 * boundsCount );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( let i = 0; i < boundsCount; i ++ ) {\r\n\r\n\t\t\t\tconst posOffset = i * 8;\r\n\t\t\t\tconst indexOffset = i * 24;\r\n\t\t\t\tfor ( let j = 0; j < 24; j ++ ) {\r\n\r\n\t\t\t\t\tindexArray[ indexOffset + j ] = posOffset + edgeIndices[ j ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// update the geometry\r\n\t\t\tlinesGeometry.setIndex(\r\n\t\t\t\tnew BufferAttribute( indexArray, 1, false ),\r\n\t\t\t);\r\n\t\t\tlinesGeometry.setAttribute(\r\n\t\t\t\t'position',\r\n\t\t\t\tnew BufferAttribute( positionArray, 3, false ),\r\n\t\t\t);\r\n\t\t\tthis.visible = true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\nclass MeshBVHVisualizer extends Group {\r\n\r\n\tget color() {\r\n\r\n\t\treturn this._material.color;\r\n\r\n\t}\r\n\r\n\tget opacity() {\r\n\r\n\t\treturn this._material.opacity;\r\n\r\n\t}\r\n\r\n\tset opacity( v ) {\r\n\r\n\t\tthis._material.opacity = v;\r\n\r\n\t}\r\n\r\n\tconstructor( mesh, depth = 10 ) {\r\n\r\n\t\tsuper();\r\n\r\n\t\tthis.name = 'MeshBVHVisualizer';\r\n\t\tthis.depth = depth;\r\n\t\tthis.mesh = mesh;\r\n\t\tthis._roots = [];\r\n\t\tthis._material = new LineBasicMaterial( {\r\n\t\t\tcolor: 0x00FF88,\r\n\t\t\ttransparent: true,\r\n\t\t\topacity: 0.3,\r\n\t\t\tdepthWrite: false,\r\n\t\t} );\r\n\r\n\t\tthis.update();\r\n\r\n\t}\r\n\r\n\tupdate() {\r\n\r\n\t\tconst bvh = this.mesh.geometry.boundsTree;\r\n\t\tconst totalRoots = bvh ? bvh._roots.length : 0;\r\n\t\twhile ( this._roots.length > totalRoots ) {\r\n\r\n\t\t\tthis._roots.pop();\r\n\r\n\t\t}\r\n\r\n\t\tfor ( let i = 0; i < totalRoots; i ++ ) {\r\n\r\n\t\t\tif ( i >= this._roots.length ) {\r\n\r\n\t\t\t\tconst root = new MeshBVHRootVisualizer( this.mesh, this._material, this.depth, i );\r\n\t\t\t\tthis.add( root );\r\n\t\t\t\tthis._roots.push( root );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tlet root = this._roots[ i ];\r\n\t\t\t\troot.depth = this.depth;\r\n\t\t\t\troot.mesh = this.mesh;\r\n\t\t\t\troot.update();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tupdateMatrixWorld( ...args ) {\r\n\r\n\t\tthis.position.copy( this.mesh.position );\r\n\t\tthis.rotation.copy( this.mesh.rotation );\r\n\t\tthis.scale.copy( this.mesh.scale );\r\n\r\n\t\tsuper.updateMatrixWorld( ...args );\r\n\r\n\t}\r\n\r\n\tcopy( source ) {\r\n\r\n\t\tthis.depth = source.depth;\r\n\t\tthis.mesh = source.mesh;\r\n\r\n\t}\r\n\r\n\tclone() {\r\n\r\n\t\treturn new MeshBVHVisualizer( this.mesh, this.depth );\r\n\r\n\t}\r\n\r\n\tdispose() {\r\n\r\n\t\tthis._material.dispose();\r\n\r\n\t}\r\n\r\n}\r\n\r\n\r\nexport default MeshBVHVisualizer;\r\n","// https://stackoverflow.com/questions/1248302/how-to-get-the-size-of-a-javascript-object\r\nfunction getPrimitiveSize( el ) {\r\n\r\n\tswitch ( typeof el ) {\r\n\r\n\t\tcase 'number':\r\n\t\t\treturn 8;\r\n\t\tcase 'string':\r\n\t\t\treturn el.length * 2;\r\n\t\tcase 'boolean':\r\n\t\t\treturn 4;\r\n\t\tdefault:\r\n\t\t\treturn 0;\r\n\r\n\t}\r\n\r\n}\r\n\r\nfunction isTypedArray( arr ) {\r\n\r\n\tconst regex = /(Uint|Int|Float)(8|16|32)Array/;\r\n\treturn regex.test( arr.constructor.name );\r\n\r\n}\r\n\r\nfunction getRootExtremes( bvh, group ) {\r\n\r\n\tconst result = {\r\n\t\ttotal: 0,\r\n\t\tdepth: {\r\n\t\t\tmin: Infinity, max: - Infinity\r\n\t\t},\r\n\t\ttris: {\r\n\t\t\tmin: Infinity, max: - Infinity\r\n\t\t},\r\n\t\tsplits: [ 0, 0, 0 ]\r\n\t};\r\n\r\n\tbvh.traverse( ( depth, isLeaf, boundingData, offsetOrSplit, count ) => {\r\n\r\n\t\tresult.total ++;\r\n\t\tif ( isLeaf ) {\r\n\r\n\t\t\tresult.depth.min = Math.min( depth, result.depth.min );\r\n\t\t\tresult.depth.max = Math.max( depth, result.depth.max );\r\n\r\n\t\t\tresult.tris.min = Math.min( count, result.tris.min );\r\n\t\t\tresult.tris.max = Math.max( count, result.tris.max );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tresult.splits[ offsetOrSplit ] ++;\r\n\r\n\t\t}\r\n\r\n\t}, group );\r\n\r\n\t// If there are no leaf nodes because the tree hasn't finished generating yet.\r\n\tif ( result.tris.min === Infinity ) {\r\n\r\n\t\tresult.tris.min = 0;\r\n\t\tresult.tris.max = 0;\r\n\r\n\t}\r\n\r\n\tif ( result.depth.min === Infinity ) {\r\n\r\n\t\tresult.depth.min = 0;\r\n\t\tresult.depth.max = 0;\r\n\r\n\t}\r\n\r\n\treturn result;\r\n\r\n}\r\n\r\nfunction getBVHExtremes( bvh ) {\r\n\r\n\treturn bvh._roots.map( ( root, i ) => getRootExtremes( bvh, i ) );\r\n\r\n}\r\n\r\nfunction estimateMemoryInBytes( obj ) {\r\n\r\n\tconst traversed = new Set();\r\n\tconst stack = [ obj ];\r\n\tlet bytes = 0;\r\n\r\n\twhile ( stack.length ) {\r\n\r\n\t\tconst curr = stack.pop();\r\n\t\tif ( traversed.has( curr ) ) {\r\n\r\n\t\t\tcontinue;\r\n\r\n\t\t}\r\n\r\n\t\ttraversed.add( curr );\r\n\r\n\t\tfor ( let key in curr ) {\r\n\r\n\t\t\tif ( ! curr.hasOwnProperty( key ) ) {\r\n\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbytes += getPrimitiveSize( key );\r\n\r\n\t\t\tconst value = curr[ key ];\r\n\t\t\tif ( value && ( typeof value === 'object' || typeof value === 'function' ) ) {\r\n\r\n\t\t\t\tif ( isTypedArray( value ) ) {\r\n\r\n\t\t\t\t\tbytes += value.byteLength;\r\n\r\n\t\t\t\t} else if ( value instanceof ArrayBuffer ) {\r\n\r\n\t\t\t\t\tbytes += value.byteLength;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tstack.push( value );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tbytes += getPrimitiveSize( value );\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn bytes;\r\n\r\n}\r\n\r\nexport { estimateMemoryInBytes, getBVHExtremes };\r\n","import { Box3, Vector3 } from 'three';\r\nimport { arrayToBox } from './Utils/ArrayBoxUtilities.js';\r\nconst box1 = new Box3();\r\nconst box2 = new Box3();\r\nconst vec = new Vector3();\r\n\r\nexport class MeshBVHDebug {\r\n\r\n\tconstructor( bvh, geometry ) {\r\n\r\n\t\tthis.bvh = bvh;\r\n\t\tthis.geometry = geometry;\r\n\r\n\t}\r\n\r\n\t// Returns a simple, human readable object that represents the BVH.\r\n\tgetJSONStructure() {\r\n\r\n\t\tconst { bvh } = this;\r\n\t\tconst depthStack = [];\r\n\r\n\t\tbvh.traverse( ( depth, isLeaf, boundingData, offset, count ) => {\r\n\r\n\t\t\tconst info = {\r\n\t\t\t\tbounds: arrayToBox( boundingData, new Box3() ),\r\n\t\t\t};\r\n\r\n\t\t\tif ( isLeaf ) {\r\n\r\n\t\t\t\tinfo.count = count;\r\n\t\t\t\tinfo.offset = offset;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tinfo.left = null;\r\n\t\t\t\tinfo.right = null;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tdepthStack[ depth ] = info;\r\n\r\n\t\t\t// traversal hits the left then right node\r\n\t\t\tconst parent = depthStack[ depth - 1 ];\r\n\t\t\tif ( parent ) {\r\n\r\n\t\t\t\tif ( parent.left === null ) {\r\n\r\n\t\t\t\t\tparent.left = info;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tparent.right = info;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} );\r\n\r\n\t\treturn depthStack[ 0 ];\r\n\r\n\t}\r\n\r\n\tvalidateBounds() {\r\n\r\n\t\tconst { bvh, geometry } = this;\r\n\t\tconst depthStack = [];\r\n\t\tconst index = geometry.index;\r\n\t\tconst position = geometry.getAttribute( 'position' );\r\n\t\tlet passes = true;\r\n\r\n\t\tbvh.traverse( ( depth, isLeaf, boundingData, offset, count ) => {\r\n\r\n\t\t\tconst info = {\r\n\t\t\t\tdepth,\r\n\t\t\t\tisLeaf,\r\n\t\t\t\tboundingData,\r\n\t\t\t\toffset,\r\n\t\t\t\tcount,\r\n\t\t\t};\r\n\t\t\tdepthStack[ depth ] = info;\r\n\r\n\t\t\tarrayToBox( boundingData, box1 );\r\n\t\t\tconst parent = depthStack[ depth - 1 ];\r\n\r\n\t\t\tif ( isLeaf ) {\r\n\r\n\t\t\t\t// check triangles\r\n\t\t\t\tfor ( let i = offset * 3, l = ( offset + count ) * 3; i < l; i += 3 ) {\r\n\r\n\t\t\t\t\tconst i0 = index.getX( i );\r\n\t\t\t\t\tconst i1 = index.getX( i + 1 );\r\n\t\t\t\t\tconst i2 = index.getX( i + 2 );\r\n\r\n\t\t\t\t\tlet isContained;\r\n\r\n\t\t\t\t\tvec.fromBufferAttribute( position, i0 );\r\n\t\t\t\t\tisContained = box1.containsPoint( vec );\r\n\r\n\t\t\t\t\tvec.fromBufferAttribute( position, i1 );\r\n\t\t\t\t\tisContained = isContained && box1.containsPoint( vec );\r\n\r\n\t\t\t\t\tvec.fromBufferAttribute( position, i2 );\r\n\t\t\t\t\tisContained = isContained && box1.containsPoint( vec );\r\n\r\n\t\t\t\t\tconsole.assert( isContained, 'Leaf bounds does not fully contain triangle.' );\r\n\t\t\t\t\tpasses = passes && isContained;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( parent ) {\r\n\r\n\t\t\t\t// check if my bounds fit in my parents\r\n\t\t\t\tarrayToBox( boundingData, box2 );\r\n\r\n\t\t\t\tconst isContained = box2.containsBox( box1 );\r\n\t\t\t\tconsole.assert( isContained, 'Parent bounds does not fully contain child.' );\r\n\t\t\t\tpasses = passes && isContained;\r\n\r\n\t\t\t}\r\n\r\n\t\t} );\r\n\r\n\t\treturn passes;\r\n\r\n\t}\r\n\r\n}\r\n","import { Ray, Matrix4, Mesh } from 'three';\r\nimport MeshBVH from './MeshBVH.js';\r\nimport Visualizer from './MeshBVHVisualizer.js';\r\nimport { CENTER, AVERAGE, SAH, NOT_INTERSECTED, INTERSECTED, CONTAINED } from './Constants.js';\r\nimport { getBVHExtremes, estimateMemoryInBytes } from './Utils/Debug.js';\r\nimport { MeshBVHDebug } from './MeshBVHDebug.js';\r\n\r\nconst ray = new Ray();\r\nconst tmpInverseMatrix = new Matrix4();\r\nconst origMeshRaycastFunc = Mesh.prototype.raycast;\r\n\r\nfunction acceleratedRaycast( raycaster, intersects ) {\r\n\r\n\tif ( this.geometry.boundsTree ) {\r\n\r\n\t\tif ( this.material === undefined ) return;\r\n\r\n\t\ttmpInverseMatrix.copy( this.matrixWorld ).invert();\r\n\t\tray.copy( raycaster.ray ).applyMatrix4( tmpInverseMatrix );\r\n\r\n\t\tif ( raycaster.firstHitOnly === true ) {\r\n\r\n\t\t\tconst res = this.geometry.boundsTree.raycastFirst( this, raycaster, ray );\r\n\t\t\tif ( res ) intersects.push( res );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.geometry.boundsTree.raycast( this, raycaster, ray, intersects );\r\n\r\n\t\t}\r\n\r\n\t} else {\r\n\r\n\t\torigMeshRaycastFunc.call( this, raycaster, intersects );\r\n\r\n\t}\r\n\r\n}\r\n\r\nfunction computeBoundsTree( options ) {\r\n\r\n\tthis.boundsTree = new MeshBVH( this, options );\r\n\treturn this.boundsTree;\r\n\r\n}\r\n\r\nfunction disposeBoundsTree() {\r\n\r\n\tthis.boundsTree = null;\r\n\r\n}\r\n\r\nexport {\r\n\tMeshBVH, Visualizer, Visualizer as MeshBVHVisualizer, MeshBVHDebug,\r\n\tacceleratedRaycast, computeBoundsTree, disposeBoundsTree,\r\n\tCENTER, AVERAGE, SAH, NOT_INTERSECTED, INTERSECTED, CONTAINED,\r\n\testimateMemoryInBytes, getBVHExtremes\r\n};\r\n"],"names":["Box3","BufferAttribute","Vector3","Vector2","Plane","Line3","Triangle","Sphere","Matrix4","BackSide","DoubleSide","arrayToBox","xyzFields","Mesh","boundingBox","LineSegments","Group","LineBasicMaterial","Ray"],"mappings":"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"}