svn merge -r39831:39877 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender.git] / source / blender / blenlib / intern / math_geom.c
index 8f025880a86ab8febb308cad48ae124c4e591197..ab12717e891e9e7ef8a56bef47def79fa3d84b7c 100644 (file)
@@ -2953,3 +2953,39 @@ float form_factor_hemi_poly(float p[3], float n[3], float v1[3], float v2[3], fl
 
        return contrib;
 }
+
+/* evaluate if entire quad is a proper convex quad */
+ int is_quad_convex_v3(const float *v1, const float *v2, const float *v3, const float *v4)
+ {
+       float nor[3], nor1[3], nor2[3], vec[4][2];
+       
+       /* define projection, do both trias apart, quad is undefined! */
+       normal_tri_v3( nor1,v1, v2, v3);
+       normal_tri_v3( nor2,v1, v3, v4);
+       nor[0]= ABS(nor1[0]) + ABS(nor2[0]);
+       nor[1]= ABS(nor1[1]) + ABS(nor2[1]);
+       nor[2]= ABS(nor1[2]) + ABS(nor2[2]);
+
+       if(nor[2] >= nor[0] && nor[2] >= nor[1]) {
+               vec[0][0]= v1[0]; vec[0][1]= v1[1];
+               vec[1][0]= v2[0]; vec[1][1]= v2[1];
+               vec[2][0]= v3[0]; vec[2][1]= v3[1];
+               vec[3][0]= v4[0]; vec[3][1]= v4[1];
+       }
+       else if(nor[1] >= nor[0] && nor[1]>= nor[2]) {
+               vec[0][0]= v1[0]; vec[0][1]= v1[2];
+               vec[1][0]= v2[0]; vec[1][1]= v2[2];
+               vec[2][0]= v3[0]; vec[2][1]= v3[2];
+               vec[3][0]= v4[0]; vec[3][1]= v4[2];
+       }
+       else {
+               vec[0][0]= v1[1]; vec[0][1]= v1[2];
+               vec[1][0]= v2[1]; vec[1][1]= v2[2];
+               vec[2][0]= v3[1]; vec[2][1]= v3[2];
+               vec[3][0]= v4[1]; vec[3][1]= v4[2];
+       }
+       
+       /* linetests, the 2 diagonals have to instersect to be convex */
+       if( isect_line_line_v2(vec[0], vec[2], vec[1], vec[3]) > 0 ) return 1;
+       return 0;
+}