UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

64 lines (47 loc) 1.78 kB
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 }; }