Commit: 53424ec0ff664829ff4973a013f605d342838d21
Author: Campbell Barton
Date:   Fri May 30 01:49:36 2014 +1000
https://developer.blender.org/rB53424ec0ff664829ff4973a013f605d342838d21

Fix T40422: EdgeSlide works incorrectly with boundry edges

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

M       source/blender/editors/transform/transform.c

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

diff --git a/source/blender/editors/transform/transform.c 
b/source/blender/editors/transform/transform.c
index cf9f89e..eae02c9 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -5426,6 +5426,16 @@ static bool createEdgeSlideVerts(TransInfo *t)
                BMLoop *l_a, *l_b;
                BMVert *v_first;
 
+               /* If this succeeds call get_next_loop()
+                * which calculates the direction to slide based on clever 
checks.
+                *
+                * otherwise we simply use 'e_dir' as an edge-rail.
+                * (which is better when the attached edge is a boundary, see: 
T40422)
+                */
+#define EDGESLIDE_VERT_IS_INNER(v, e_dir) \
+               ((BM_edge_is_boundary(e_dir) == false) && \
+                (BM_vert_edge_count_nonwire(v) == 2))
+
                v = NULL;
                BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
                        if (BM_elem_flag_test(v, BM_ELEM_TAG))
@@ -5474,10 +5484,12 @@ static bool createEdgeSlideVerts(TransInfo *t)
                        }
                        else {
                                BMLoop *l_tmp = BM_loop_other_edge_loop(l_a, v);
-                               if (BM_vert_edge_count_nonwire(v) == 2)
+                               if (EDGESLIDE_VERT_IS_INNER(v, l_tmp->e)) {
                                        get_next_loop(v, l_a, e, l_tmp->e, 
vec_a);
-                               else
+                               }
+                               else {
                                        sub_v3_v3v3(vec_a, 
BM_edge_other_vert(l_tmp->e, v)->co, v->co);
+                               }
                        }
                }
 
@@ -5489,11 +5501,12 @@ static bool createEdgeSlideVerts(TransInfo *t)
                        }
                        else {
                                BMLoop *l_tmp = BM_loop_other_edge_loop(l_b, v);
-                               if (BM_vert_edge_count_nonwire(v) == 2)
+                               if (EDGESLIDE_VERT_IS_INNER(v, l_tmp->e)) {
                                        get_next_loop(v, l_b, e, l_tmp->e, 
vec_b);
-                               else
+                               }
+                               else {
                                        sub_v3_v3v3(vec_b, 
BM_edge_other_vert(l_tmp->e, v)->co, v->co);
-
+                               }
                        }
                }
                else {
@@ -5546,7 +5559,7 @@ static bool createEdgeSlideVerts(TransInfo *t)
                                if (l_a) {
                                        BMLoop *l_tmp = 
BM_loop_other_edge_loop(l_a, v);
                                        sv->v_a = BM_edge_other_vert(l_tmp->e, 
v);
-                                       if (BM_vert_edge_count_nonwire(v) == 2) 
{
+                                       if (EDGESLIDE_VERT_IS_INNER(v, 
l_tmp->e)) {
                                                get_next_loop(v, l_a, e_prev, 
l_tmp->e, sv->dir_a);
                                        }
                                        else {
@@ -5557,7 +5570,7 @@ static bool createEdgeSlideVerts(TransInfo *t)
                                if (l_b) {
                                        BMLoop *l_tmp = 
BM_loop_other_edge_loop(l_b, v);
                                        sv->v_b = BM_edge_other_vert(l_tmp->e, 
v);
-                                       if (BM_vert_edge_count_nonwire(v) == 2) 
{
+                                       if (EDGESLIDE_VERT_IS_INNER(v, 
l_tmp->e)) {
                                                get_next_loop(v, l_b, e_prev, 
l_tmp->e, sv->dir_b);
                                        }
                                        else {
@@ -5603,6 +5616,8 @@ static bool createEdgeSlideVerts(TransInfo *t)
                } while ((e != v_first->e) && (l_a || l_b));
 
                loop_nr++;
+
+#undef EDGESLIDE_VERT_IS_INNER
        }
 
        /* use for visibility checks */

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

Reply via email to