Commit: 44db6bd7c6c7affcd8dc9b677359cec5e8a51bd3
Author: Campbell Barton
Date:   Sun Dec 6 00:06:15 2015 +1100
Branches: bmesh-boolean-experiment
https://developer.blender.org/rB44db6bd7c6c7affcd8dc9b677359cec5e8a51bd3

avoid bow-tie when detecting parallel vert-pair

===================================================================

M       source/blender/bmesh/tools/bmesh_intersect.c

===================================================================

diff --git a/source/blender/bmesh/tools/bmesh_intersect.c 
b/source/blender/bmesh/tools/bmesh_intersect.c
index f813b9e..498fcee 100644
--- a/source/blender/bmesh/tools/bmesh_intersect.c
+++ b/source/blender/bmesh/tools/bmesh_intersect.c
@@ -315,6 +315,15 @@ static bool  bm_face_split_edgenet_prepare_holes(
 
                        BMVert *vpair_other[2] = {NULL, NULL};
 
+                       /* define a plane to make sure we don't create bow-tie 
*/
+                       float v_best_plane[4];
+                       {
+                               float dir[3];
+                               sub_v3_v3v3(dir, vpair_best[1]->co, 
vpair_best[0]->co);
+                               cross_v3_v3v3(v_best_plane, f->no, dir);
+                               v_best_plane[3] = -dot_v3v3(vpair_best[0]->co, 
v_best_plane);
+                       }
+
                        /* find closest pair */
                        {
                                BMVert *v_a = vpair_best[0];
@@ -322,21 +331,31 @@ static bool  bm_face_split_edgenet_prepare_holes(
                                float vpair_other_best_length = -1.0f;
                                do {
                                        if (BM_elem_flag_test(e_a, 
EDGE_IS_NET)) {
+                                               BMVert *v_a_other = 
BM_edge_other_vert(e_a, v_a);
+                                               const float 
v_a_other_plane_side =
+                                                       
dist_signed_squared_to_plane_v3(v_a_other->co, v_best_plane);
+
+
                                                BMVert *v_b = vpair_best[1];
                                                BMEdge *e_b = v_b->e;
                                                do {
                                                        if 
(BM_elem_flag_test(e_b, EDGE_IS_NET)) {
-                                                               BMVert 
*v_a_other = BM_edge_other_vert(e_a, v_a);
                                                                BMVert 
*v_b_other = BM_edge_other_vert(e_b, v_b);
-
-                                                               const float 
vpair_other_test_length = len_squared_v3v3(v_a_other->co, v_b_other->co);
-
-                                                               if 
((vpair_other_best_length == -1.0f) ||
-                                                                   
(vpair_other_test_length < vpair_other_best_length))
-                                                               {
-                                                                       
vpair_other[0] = v_a_other;
-                                                                       
vpair_other[1] = v_b_other;
-                                                                       
vpair_other_best_length = vpair_other_test_length;
+                                                               const float 
v_b_other_plane_side =
+                                                                       
dist_signed_squared_to_plane_v3(v_b_other->co, v_best_plane);
+
+                                                               /* avoid 
bow-tie */
+                                                               if 
((v_a_other_plane_side < 0.0f) == (v_b_other_plane_side < 0.0f)) {
+                                                                       const 
float vpair_other_test_length =
+                                                                               
len_squared_v3v3(v_a_other->co, v_b_other->co);
+
+                                                                       if 
((vpair_other_best_length == -1.0f) ||
+                                                                           
(vpair_other_test_length < vpair_other_best_length))
+                                                                       {
+                                                                               
vpair_other[0] = v_a_other;
+                                                                               
vpair_other[1] = v_b_other;
+                                                                               
vpair_other_best_length = vpair_other_test_length;
+                                                                       }
                                                                }
                                                        }
                                                } while ((e_b = 
BM_DISK_EDGE_NEXT(e_b, v_b)) != v_b->e);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to