0.2.5 • Published 8 years ago
glutess v0.2.5
GluTess
gluTessXXX bindings for node.js
Tessellation is subdividing concave polygons or polygons with intersecting edges into convex polygons. Since OpenGL accepts only convex polygons for rendering, these non-convex polygons must be tessellated before rendering.
Requirements
- node >= 0.8.0
- npm >= 1.4.1
Install
npm install glutess
or
git clone git@github.com:timknip/glutess.git
cd glutess
npm install
Usage
var glutess = require('glutess');
// Create a tesselator with vertexSize = 3
var gluTess = new glutess.GluTess(3);
// Push a value from 'n' back in array
var pushPrev = function (v,n) {
v.push(v[v.length - n]);
}
var vertexType = 0;
var vertexNumber = 0;
var vertices = [];
// setup callbacks
gluTess.callback(glutess.BEGIN, function(t) {
vertexType=t;
vertexNumber = 0;
});
gluTess.callback(glutess.VERTEX, function(a) {
if(vertexNumber > 2) {
if(vertexType === glutess.TRIANGLE_STRIP) {
if((vertexNumber-3) % 2) {
pushPrev(vertices, 3);
pushPrev(vertices, 2);
} else {
pushPrev(vertices, 1);
pushPrev(vertices, 3);
}
} else if (vertexType === glutess.TRIANGLE_FAN) {
pushPrev(verts, 3);
pushPrev(verts, 2);
}
}
vertices.push(a);
vertexNumber += 1;
});
gluTess.callback(glutess.END, function(c) {console.log('end')});
gluTess.callback(glutess.ERROR, function() {console.log('error');});
gluTess.callback(glutess.EDGE_FLAG, function() {console.log('edge_flag');});
gluTess.callback(glutess.COMBINE, function(c,v,w,n) {
var r = new Array(n);
for(var i=0; i < n; ++i)
r[i] = v[0][i]*w[0] + v[1][i]*w[1] + v[2][i]*w[2] + v[3][i]*w[3];
return r;
});
gluTess.property(glutess.WINDING_RULE, glutess.WINDING_NEGATIVE);
// a clockwise polygon
var polyA = [
[0,0,0],
[0,10,0],
[10,10,0],
[10,0,0]
];
// a counter clockwise polygon
var polyB = [
[5,5,0],
[15,5,0],
[15,15,0],
[5,15,0]
];
var i;
gluTess.beginPolygon();
gluTess.beginContour();
for (i = 0; i < polyA.length; ++i) {
gluTess.vertex(polyA[i]);
}
gluTess.endContour();
gluTess.beginContour();
for (i = 0; i < polyB.length; ++i) {
gluTess.vertex(polyB[i]);
}
gluTess.endContour();
gluTess.endPolygon();
// print triangles
for (i = 0; i < vertices.length; i += 3) {
console.log(vertices[i]);
console.log(vertices[i+1]);
console.log(vertices[i+2]);
console.log('--------');
}