Tools:
[blender-staging.git] / intern / boolop / intern / BOP_MathUtils.cpp
index 0d84bb1778c51a9bb1eda179b55fd61615d8cef8..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);
@@ -226,6 +234,8 @@ bool BOP_getCircleCenter(const MT_Point3& p1, const MT_Point3& p2, const MT_Poin
        
        // Compute first line vector, perpendicular to plane vector and edge (p1,p2)
        MT_Vector3 vL1 = p1p2.cross(plane);
+       if( MT_fuzzyZero(vL1.length() ) )
+                       return false;
        vL1.normalize();
        
        // Compute first line point, middle point of edge (p1,p2)
@@ -233,6 +243,8 @@ bool BOP_getCircleCenter(const MT_Point3& p1, const MT_Point3& p2, const MT_Poin
 
        // Compute second line vector, perpendicular to plane vector and edge (p1,p3)
        MT_Vector3 vL2 = p1p3.cross(plane);
+       if( MT_fuzzyZero(vL2.length() ) )
+                       return false;
        vL2.normalize();
        
        // Compute second line point, middle point of edge (p1,p3)
@@ -334,7 +346,7 @@ MT_Point3 BOP_intersectPlane(const MT_Plane3& plane, const MT_Point3& p1, const
        //
        //       coefA*((p2.x - p1.y)*lambda + p1.x) + ... + coefD = 0
        
-    MT_Point3 intersection;
+    MT_Point3 intersection = MT_Point3(0,0,0); //never ever return anything undefined! 
     MT_Scalar den = plane.x()*(p2.x()-p1.x()) + 
                                        plane.y()*(p2.y()-p1.y()) + 
                                        plane.z()*(p2.z()-p1.z());