convertGeometry = function(geom) {
function pointToVector({x,y,z}) { return [x,y,z] }
const pos = geom.vertices.map(pointToVector)
const normal = geom.vertices.map(_ => [0,0,0]);
const edgeLookup = [];
const edgePos = [];
const edgeFaces = [];
const edgeNormals = [];
function normals(v, otherEndpoint, normal) {
const edge = vec3.sub([], otherEndpoint, v);
const n1 = vec3.cross([], normal, edge)
const n2 = vec3.negate([], n1);
return [n1, n2];
}
function addEdge(ia, ib) {
const a = pos[ia];
const b = pos[ib];
const [na1, na2] = normals(a, b, normal[ia]);
const [nb1, nb2] = normals(b, a, normal[ib]);
const a1 = edgePos.length;
const b1 = a1 + 1;
const a2 = a1 + 2;
const b2 = a1 + 3;
edgeLookup.push(ia,ib,ia,ib);
edgePos.push(a,b,a,b);
edgeNormals.push(na1, nb1, na2, nb2);
edgeFaces.push(
[a1, a2, b2],
[b1, b2, a2]
);
}
for (const f of geom.faces) {
normal[f.a] = pointToVector(f.vertexNormals[0]);
normal[f.b] = pointToVector(f.vertexNormals[1]);
normal[f.c] = pointToVector(f.vertexNormals[2]);
addEdge(f.a, f.b);
addEdge(f.b, f.c);
addEdge(f.c, f.a);
}
return {
pos,
normal,
faces: geom.faces.map(({a,b,c}) => [a,b,c]),
edgePos,
edgeFaces,
edgeNormals,
edgeLookup,
geom
}
}