From dac2cf411a8115c35741e4c48cccefd12cbd5145 Mon Sep 17 00:00:00 2001 From: Kyle Phillips Date: Tue, 5 Jul 2016 21:27:00 -0700 Subject: [PATCH] fixes long-standing issue with WETriangleMesh resulting in duplicate edges implements edge-check on LinkedMap in both directions (a,b) and (b,a) --- lib/toxi/geom/mesh/meshCommon.js | 70 ++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/lib/toxi/geom/mesh/meshCommon.js b/lib/toxi/geom/mesh/meshCommon.js index 77841bb..4c3c6db 100644 --- a/lib/toxi/geom/mesh/meshCommon.js +++ b/lib/toxi/geom/mesh/meshCommon.js @@ -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'), @@ -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 ); } @@ -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 -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; ia or a->b + this.__edgeCheck.set(vb, va); + e = this.edgeMap.get(this.__edgeCheck); + } if( e !== undefined ){ e.addFace( face ); } else {