@woosh/meep-engine
Version:
Pure JavaScript game engine. Fully featured and production ready.
64 lines (47 loc) • 1.78 kB
JavaScript
import { assert } from "../../assert.js";
/**
* @param {TopoTriangle[]} face_array
* @returns {{edge_addresses:Uint32Array, adjacency:Uint32Array, edge_weights:Uint32Array}}
*/
export function mesh_to_metis_graph(face_array) {
assert.isArray(face_array, 'face_array');
const input_face_count = face_array.length;
const edge_addresses = new Uint32Array(input_face_count + 1);
const adjacency = [];
const edge_weights = [];
const face_index_map = new Map();
for (let i = 0; i < input_face_count; i++) {
const face = face_array[i];
face_index_map.set(face, i);
}
let offset = 0;
edge_addresses[0] = 0;
for (let i = 0; i < input_face_count; i++) {
const face = face_array[i];
const edges = face.edges;
const edge_count = edges.length;
for (let j = 0; j < edge_count; j++) {
const topoEdge = edges[j];
const edge_faces = topoEdge.faces;
const edge_face_count = edge_faces.length;
for (let k = 0; k < edge_face_count; k++) {
const neighbour = edge_faces[k];
if (neighbour === face) {
//skip self
continue;
}
adjacency[offset] = face_index_map.get(neighbour);
edge_weights[offset] = 1;
offset++;
}
}
edge_addresses[i + 1] = offset;
}
const adjecency_uint32 = new Uint32Array(adjacency);
const edge_weights_uint32 = new Uint32Array(edge_weights);
return {
edge_addresses: edge_addresses,
adjacency: adjecency_uint32,
edge_weights: edge_weights_uint32
};
}