From 676043c31461c5a978de209a23b0f4e37d201403 Mon Sep 17 00:00:00 2001 From: Ken Hughes Date: Sat, 30 Jun 2007 21:32:24 +0000 Subject: Tools: ------ Bugfix #6847: Previous fix for "spikes" when using booleans caused creation of faces with only two unique vertices ("eekadoodles"). This patch cleans up the test for triangles with near-colinear vertices so PHANTOM faces can be used again, and also adds a hack for now which removes any eekadoodle faces. I haven't figured out yet exactly how the faces are being created; if I can do so and fix it the hack will be removed. --- intern/boolop/intern/BOP_Face2Face.cpp | 11 ++++------- intern/boolop/intern/BOP_MathUtils.cpp | 12 ++++++++++-- intern/boolop/intern/BOP_Merge.cpp | 32 +++++++++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 10 deletions(-) (limited to 'intern/boolop') diff --git a/intern/boolop/intern/BOP_Face2Face.cpp b/intern/boolop/intern/BOP_Face2Face.cpp index 745c64eaa97..9c8ee9f7787 100644 --- a/intern/boolop/intern/BOP_Face2Face.cpp +++ b/intern/boolop/intern/BOP_Face2Face.cpp @@ -1,4 +1,7 @@ /** + * + * $Id$ + * * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -23,7 +26,7 @@ * * The Original Code is: all of this file. * - * Contributor(s): none yet. + * Contributor(s): Marc Freixas, Ken Hughes * * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ @@ -427,17 +430,11 @@ void BOP_mergeVertexs(BOP_Mesh *mesh, unsigned int firstFace) // v2 ~= v3 mesh->replaceVertexIndex(v2,v3); } else { -#if 0 - /* - * for now, don't just remove "co-linear" faces; some of these faces - * being removed are real and cause other things to break - */ // all differents if (BOP_collinear(vertex1,vertex2,vertex3)) { // collinear triangle face->setTAG(PHANTOM); } -#endif } } } diff --git a/intern/boolop/intern/BOP_MathUtils.cpp b/intern/boolop/intern/BOP_MathUtils.cpp index 7a0210247eb..251bbb9e138 100644 --- a/intern/boolop/intern/BOP_MathUtils.cpp +++ b/intern/boolop/intern/BOP_MathUtils.cpp @@ -1,4 +1,7 @@ /** + * + * $Id$ + * * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -23,7 +26,7 @@ * * The Original Code is: all of this file. * - * Contributor(s): none yet. + * Contributor(s): Marc Freixas, Ken Hughes * * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ @@ -115,7 +118,12 @@ bool BOP_collinear(const MT_Point3& p1, const MT_Point3& p2, const MT_Point3& p3 { MT_Vector3 v1 = p2 - p1; MT_Vector3 v2 = p3 - p2; - + + /* normalize vectors before taking their cross product, so its length + * has some actual meaning */ + v1.normalize(); + v2.normalize(); + MT_Vector3 w = v1.cross(v2); return (BOP_comp(w.x(),0.0) == 0) && (BOP_comp(w.y(),0.0) == 0) && (BOP_comp(w.z(),0.0) == 0); diff --git a/intern/boolop/intern/BOP_Merge.cpp b/intern/boolop/intern/BOP_Merge.cpp index fb5bfbc0e7b..5839d38181a 100644 --- a/intern/boolop/intern/BOP_Merge.cpp +++ b/intern/boolop/intern/BOP_Merge.cpp @@ -1,4 +1,7 @@ /** + * + * $Id$ + * * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -23,7 +26,7 @@ * * The Original Code is: all of this file. * - * Contributor(s): none yet. + * Contributor(s): Marc Freixas, Ken Hughes * * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ @@ -57,6 +60,32 @@ void BOP_Merge::mergeFaces(BOP_Mesh *m, BOP_Index v) // Merge faces mergeFaces(); + /* + * HACK: somehow triangular faces are being created with two vertices the + * same. If it's happening in BOP_Mesh::replaceVertexIndex() we should + * be catching it, so either it's not happening there or we aren't + * catching it (duh). Until we figure this out, this hack cleans things. + * + * Test for any invalid faces: if any two vertices are the same of a + * triangle, the face is broken. Further, I don't believe it's possible + * to have any quads at this point, so if we find one send a message + * to stdout. + */ + + BOP_Faces faces = m_mesh->getFaces(); + const BOP_IT_Faces ifacesIEnd = (faces.end()); + for(BOP_IT_Faces faceI=faces.begin();faceI!=ifacesIEnd;faceI++) { + if ((*faceI)->getTAG() != BROKEN ) { + BOP_Index i1 = (*faceI)->getVertex(0); + BOP_Index i2 = (*faceI)->getVertex(1); + BOP_Index i3 = (*faceI)->getVertex(2); + if ( (*faceI)->size() == 4) + cout << "BOP_Merge::mergeFaces found a quad: this is an error" << endl; + if (i1 == i2 || i2 == i3 || i3 == i1 ) + (*faceI)->setTAG(BROKEN); + } + } + do { // Add quads ... cont = createQuads(); @@ -592,6 +621,7 @@ bool BOP_Merge::createQuads() // Get mesh faces BOP_Faces faces = m_mesh->getFaces(); + // Merge mesh triangles const BOP_IT_Faces facesIEnd = (faces.end()-1); -- cgit v1.2.3