Skip to content

Commit

Permalink
fixes long-standing issue with WETriangleMesh resulting in duplicate
Browse files Browse the repository at this point in the history
edges

implements edge-check on LinkedMap in both directions (a,b) and (b,a)
  • Loading branch information
hapticdata committed Jul 6, 2016
1 parent ad7e654 commit dac2cf4
Showing 1 changed file with 45 additions and 25 deletions.
70 changes: 45 additions & 25 deletions lib/toxi/geom/mesh/meshCommon.js
Expand Up @@ -2,21 +2,21 @@ define(function( require, exports ){

var TriangleMesh, WETriangleMesh, Terrain, SurfaceMeshBuilder;

var precision = 1000000;
var format = function( n ){
return Math.floor(n*precision) / precision;
};
//private: way of generating object keys for point map in meshes
function vertexKeyGenerator( v ){
var precision = 1000000;
var format = function( n ){
return Math.floor(n*precision) / precision;
};
//this will hold the ids consistently between vertex and vec3ds
return "[ x: "+format(v.x)+ ", y: "+format(v.y)+ ", z: "+format(v.z)+"]";
}
//private: used for tracking edges in the internals.LinkedMap
function edgeKeyGenerator( edge ){
var Line3D = require('../Line3D');
return Line3D.prototype.toString.call( edge );//"{ a: "+vertexKeyGenerator(edge.a)+", b: "+vertexKeyGenerator(edge.b)+" }";
return edge.a.id + '->'+ edge.b.id;
}


//#TriangleMesh
(function(){
var internals = require('../../internals'),
Expand Down Expand Up @@ -120,7 +120,7 @@ define(function( require, exports ){

__checkVertex: function(v){
var vertex = this.vertexMap.get(v);
if(vertex == null){
if(!vertex){
vertex = this._createVertex(v,this.uniqueVertexID++);
this.vertexMap.put( vertex, vertex );
}
Expand Down Expand Up @@ -918,12 +918,16 @@ define(function( require, exports ){
var newVertexMap = new internals.LinkedMap( vertexKeyGenerator );
var newEdgeMap = new internals.LinkedMap( edgeKeyGenerator );

this.vertexMap.each(function( vertex ){
newVertexMap.put( vertex, vertex );
});
this.edgeMap.each(function( edge ){
newEdgeMap.put( edge, edge );
});
var i = 0,
arr = this.vertexMap.getArray();
for(i=0; i<arr.length; i++){
newVertexMap.put( arr[i], arr[i] );
}

arr = this.edgeMap.getArray();
for(i=0; i<arr.length; i++){
newEdgeMap.put( arr[i], arr[i] );
}

this.vertexMap = newVertexMap;
this.vertices = newVertexMap.getArray();
Expand All @@ -932,7 +936,6 @@ define(function( require, exports ){
};

proto.removeEdge = function( edge ){
var self = this;
edge.remove();
var v = edge.a;
if( v.edges.length === 0 ){
Expand All @@ -942,27 +945,34 @@ define(function( require, exports ){
if( v.edges.length === 0 ){
this.vertexMap.remove( v );
}
internals.each(edge.faces, function( face ){
self.removeFace( face );
});
for(var i=0; i<edge.faces.length; i++){
this.removeFace(edge.faces[i]);
}
var removed = this.edgeMap.remove( this.__edgeCheck.set( edge.a, edge.b ) );
if(!removed){
this.edgeMap.remove( this.__edgeCheck.set(edge.b, edge.a) );
}
if( removed !== edge ){
throw Error("Can't remove edge");
throw new Error("Can't remove edge");
}
};

proto.removeFace = function( face ){
var self = this;
var i = this.faces.indexOf( face );
if( i > -1 ){
this.faces.splice( i, 1 );
}
internals.each( face.edges, function( edge ){
edge.faces.splice( edge.faces.indexOf(face), 1 );
if( edge.faces.length === 0 ){
self.removeEdge( edge );
}
});

i = 0;
var edge;

for(i=0; i<face.edges.length; i++){
edge = face.edges[i];
edge.faces.splice(edge.faces.indexOf(face), 1);
if(edge.faces.length === 0){
this.removeEdge(edge);
}
}
};

//FIXME (FIXME in original java source)
Expand Down Expand Up @@ -1003,6 +1013,11 @@ define(function( require, exports ){
var edge, mid;
if( arguments.length === 3 ){
edge = this.edgeMap.get( this.__edgeCheck.set(a, b) );

if(!edge){
this.edgeMap.get( this.__edgeCheck.set(b,a) );
}

} else if( arguments.length == 2 ){
edge = a;
subDiv = b;
Expand Down Expand Up @@ -1115,6 +1130,11 @@ define(function( require, exports ){
//because Line3D toString would be different than WingedEdge toString()
this.__edgeCheck.set( va, vb );
var e = this.edgeMap.get( this.__edgeCheck );
if(!e){
//edge could be as b->a or a->b
this.__edgeCheck.set(vb, va);
e = this.edgeMap.get(this.__edgeCheck);
}
if( e !== undefined ){
e.addFace( face );
} else {
Expand Down

0 comments on commit dac2cf4

Please sign in to comment.