Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

glutess

timknip11MIT0.2.5

gluTessXXX bindings for node.js

glu, glutess, opengl

readme

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.

alt tag

Requirements

  1. node >= 0.8.0
  2. 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('--------');
}