Skip to content
Permalink
Browse files

add triangulation vendor class

  • Loading branch information...
lautr3k committed Mar 18, 2016
1 parent d2437cd commit 336ca53863e832442d36917df0c868fbcf4c7a64
@@ -0,0 +1,5 @@
.idea
coverage
node_modules
dist
*.log
@@ -0,0 +1,49 @@
three.js - triangulation
========

### Triangulation support ###

The aim of the project is to add support for different triangulation/tessellation algorithms/libraries to **three.js**.
Right now the library seamlessly supports the following triangulation libraries:

— [original](https://github.com/mrdoob/three.js/blob/master/src/extras/ShapeUtils.js) - original algorithm from `THREE.ShapeUtils`<br>
— [earcut](https://github.com/mapbox/earcut) - earcut triangulation library<br>
— [poly2tri](https://github.com/r3mi/poly2tri.js) - poly2tri triangulation library<br>
— [libtess](https://github.com/brendankenny/libtess.js/) - libtess tessellation library<br>

To be able to use the **libtess** library you will have to also load the file [tessy.js](tessy.js) into your project.

### Triangulation comparison ###

The second aim of the project is to create compare the results of these different triangulation/tessellation algorithms/libraries in **three.js**.

### Adapter ###

The library comes with an adapter [triangulation.js](triangulation.js) which can make it easy to switch between the different triangulation libraries inside your project. The implementation is simple.
The adapter is available through `THREE.Triangulation` and has two public methods:

1. `setLibrary` - sets the library that you currently want to use.
* The available libraries are in an object called `libraries`. So to set earcut as your library: `THREE.Triangulation.setLibrary( THREE.Triangulation.libraries.earcut );` (or simply use the string `'earcut'`).

2. `setTimer` - sets the timer on/off.
* The timer will output the time that was needed to perform the triangulation operations inside the console giving you valuable feedback on the performance of the chosen library.
To turn the timer on simply call: `THREE.Triangulation.setTimer( true );`


### Viewers ###

For now there are two viewers.

- One [single screen viewer](https://rawgit.com/Wilt/three.js_triangulation/master/viewers/single.html) where the triangulation result of a certain shape with a selected algorithm can be viewed.
- And [multiple screen viewer](https://rawgit.com/Wilt/three.js_triangulation/master/viewers/multiple.html) where the triangulation result of a certain shape can be seen for all algorithms at the same time.


### Benchmarking ###

The next step will be to do some benchmarking of the different algorithms

### Support for another (or your own) triangulation library ###

Do you want support for another (or your own) triangulation library, then please make an issue or a pull-request where you explain what the added value of the
proposed library is compared to the ones that are already implemented. It would also be good to make a live example where you show that your code is working.
This will increase the chances of the library being implemented.
@@ -0,0 +1,36 @@
var tessy = (function initTesselator() {
// function called for each vertex of tesselator output
function vertexCallback(data, polyVertArray) {
// console.log(data[0], data[1]);
polyVertArray[polyVertArray.length] = data[0];
polyVertArray[polyVertArray.length] = data[1];
}
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;
})();

0 comments on commit 336ca53

Please sign in to comment.
You can’t perform that action at this time.