mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-10 02:13:58 +01:00
61 lines
No EOL
2.1 KiB
JavaScript
61 lines
No EOL
2.1 KiB
JavaScript
import libtess from 'libtess'
|
|
|
|
function initTesselator() {
|
|
// function called for each vertex of tesselator output
|
|
function vertexCallback(data, polyVertArray) {
|
|
polyVertArray.push(data);
|
|
}
|
|
function begincallback(type) {
|
|
if (type !== libtess.primitiveType.GL_TRIANGLES) {
|
|
console.log('expected TRIANGLES but got type: ' + type);
|
|
}
|
|
}
|
|
function errorcallback(errno) {
|
|
console.log('error callback');
|
|
console.log('error number: ' + errno);
|
|
}
|
|
// callback for when segments intersect and must be split
|
|
function combinecallback(coords, data, weight) {
|
|
// console.log('combine callback');
|
|
return [coords[0], coords[1], coords[2]];
|
|
}
|
|
function edgeCallback(flag) {
|
|
// don't really care about the flag, but need no-strip/no-fan behavior
|
|
// console.log('edge flag: ' + flag);
|
|
}
|
|
|
|
var tessy = new libtess.GluTesselator();
|
|
// tessy.gluTessProperty(libtess.gluEnum.GLU_TESS_WINDING_RULE, libtess.windingRule.GLU_TESS_WINDING_POSITIVE);
|
|
tessy.gluTessCallback(libtess.gluEnum.GLU_TESS_VERTEX_DATA, vertexCallback);
|
|
tessy.gluTessCallback(libtess.gluEnum.GLU_TESS_BEGIN, begincallback);
|
|
tessy.gluTessCallback(libtess.gluEnum.GLU_TESS_ERROR, errorcallback);
|
|
tessy.gluTessCallback(libtess.gluEnum.GLU_TESS_COMBINE, combinecallback);
|
|
tessy.gluTessCallback(libtess.gluEnum.GLU_TESS_EDGE_FLAG, edgeCallback);
|
|
|
|
return tessy;
|
|
}
|
|
|
|
export function Triangulate(contours, normal) {
|
|
const tessy = initTesselator();
|
|
// libtess will take 3d verts and flatten to a plane for tesselation
|
|
// since only doing 2d tesselation here, provide z=1 normal to skip
|
|
// iterating over verts only to get the same answer.
|
|
// comment out to test normal-generation code
|
|
//tessy.gluTessNormal(0, 0, 1);
|
|
tessy.gluTessNormal(normal[0], normal[1], normal[2]);
|
|
|
|
const triangleVerts = [];
|
|
tessy.gluTessBeginPolygon(triangleVerts);
|
|
|
|
for (let contour of contours) {
|
|
tessy.gluTessBeginContour();
|
|
for (let coords of contour) {
|
|
tessy.gluTessVertex(coords, coords);
|
|
}
|
|
tessy.gluTessEndContour();
|
|
}
|
|
|
|
// finish polygon (and time triangulation process)
|
|
tessy.gluTessEndPolygon();
|
|
return triangleVerts;
|
|
} |