Tools:
authorKen Hughes <khughes@pacific.edu>
Sat, 30 Jun 2007 21:32:24 +0000 (21:32 +0000)
committerKen Hughes <khughes@pacific.edu>
Sat, 30 Jun 2007 21:32:24 +0000 (21:32 +0000)
------
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
intern/boolop/intern/BOP_MathUtils.cpp
intern/boolop/intern/BOP_Merge.cpp

index 745c64eaa97cd5968b9465af172a79fb3eb51170..9c8ee9f77873f785c185649b40d2defc2d77194b 100644 (file)
@@ -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
                                        }
                                }
                        }
index 7a0210247eb114501a6a6c50a0d4afd9d347e1c6..251bbb9e138cbeb8f989b0c45dd3922b06e9c750 100644 (file)
@@ -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);
index fb5bfbc0e7b0c13b9f81734652429ef50047338d..5839d38181a11e039bfb6996187ca0d0865dde87 100644 (file)
@@ -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);