fix [#30367] Face Fills Crossed
authorCampbell Barton <ideasman42@gmail.com>
Tue, 28 Feb 2012 22:52:09 +0000 (22:52 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 28 Feb 2012 22:52:09 +0000 (22:52 +0000)
when making a quad from 2 edges - it was comparing the edge lengths to avoid making a bowtie quad. but this doesnt work in all cases, now compare normals instead.

source/blender/bmesh/operators/bmo_create.c

index 1a65db0e80865205b11cb01d2dc90022fe6da8fa..267d3d70a456c3708fd4111a68991b0f1326619b 100644 (file)
@@ -1173,6 +1173,8 @@ void bmo_edgenet_prepare(BMesh *bm, BMOperator *op)
        /* two unconnected loops, connect the */
        if (edges1 && edges2) {
                BMVert *v1, *v2, *v3, *v4;
+               float dvec1[3];
+               float dvec2[3];
 
                if (BLI_array_count(edges1) == 1) {
                        v1 = edges1[0]->v1;
@@ -1204,10 +1206,22 @@ void bmo_edgenet_prepare(BMesh *bm, BMOperator *op)
                        else v4 = edges2[i]->v1;
                }
 
-               /* avoid sqrt for comparison */
-               if (len_squared_v3v3(v1->co, v3->co) + len_squared_v3v3(v2->co, v4->co) >
-                   len_squared_v3v3(v1->co, v4->co) + len_squared_v3v3(v2->co, v3->co))
+               /* if there is ever bowtie quads between two edges the problem is here! [#] */
+#if 0
+               normal_tri_v3(dvec1, v1->co, v2->co, v4->co);
+               normal_tri_v3(dvec2, v1->co, v4->co, v3->co);
+#else
                {
+                       /* save some CPU cycles and skip the sqrt and 1 subtraction */
+                       float a1[3], a2[3], a3[3];
+                       sub_v3_v3v3(a1, v1->co, v2->co);
+                       sub_v3_v3v3(a2, v1->co, v4->co);
+                       sub_v3_v3v3(a3, v1->co, v3->co);
+                       cross_v3_v3v3(dvec1, a1, a2);
+                       cross_v3_v3v3(dvec2, a2, a3);
+               }
+#endif
+               if (dot_v3v3(dvec1, dvec2) < 0.0f) {
                        BMVert *v;
                        v = v3;
                        v3 = v4;