UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

64 lines (47 loc) 1.97 kB
import { assert } from "../../../core/assert.js"; /** * BVH leaves will contain `face_id` and their bounds will be set from the corresponding face bounds. * @param {BVH} bvh * @param {BinaryTopology} mesh */ export function bvh_build_from_bt_mesh(bvh, mesh) { assert.defined(bvh, 'bvh'); assert.defined(mesh, 'mesh'); assert.equal(mesh.isBinaryTopology, true, 'mesh.isBinaryTopology !== true'); // clear out the BVH bvh.release_all(); // NOTE: we assume there are no holes in the allocation, data must be packed const face_count = mesh.faces.size; const vertex_position = new Float32Array(3); for (let face_id = 0; face_id < face_count; face_id++) { let bounds_x0 = Infinity; let bounds_y0 = Infinity; let bounds_z0 = Infinity; let bounds_x1 = -Infinity; let bounds_y1 = -Infinity; let bounds_z1 = -Infinity; let loop = mesh.face_read_loop(face_id); const loop_start = loop; do { const vertex = mesh.loop_read_vertex(loop); mesh.vertex_read_coordinate(vertex_position, 0, vertex); const px = vertex_position[0]; const py = vertex_position[1]; const pz = vertex_position[2]; bounds_x0 = Math.min(bounds_x0, px); bounds_y0 = Math.min(bounds_y0, py); bounds_z0 = Math.min(bounds_z0, pz); bounds_x1 = Math.max(bounds_x1, px); bounds_y1 = Math.max(bounds_y1, py); bounds_z1 = Math.max(bounds_z1, pz); loop = mesh.loop_read_next(loop); } while (loop !== loop_start) const node = bvh.allocate_node(); bvh.node_set_user_data(node, face_id); bvh.node_set_aabb_primitive(node, bounds_x0, bounds_y0, bounds_z0, bounds_x1, bounds_y1, bounds_z1 ); bvh.insert_leaf(node); } }