[Bf-blender-cvs] [eb57f65] master: Fix EdgeSlide behavior with boundry edges

Campbell Barton noreply at git.blender.org
Sat May 31 07:43:24 CEST 2014


Commit: eb57f65a32dc768c1532b28227b0c4788592682f
Author: Campbell Barton
Date:   Sat May 31 13:56:54 2014 +1000
https://developer.blender.org/rBeb57f65a32dc768c1532b28227b0c4788592682f

Fix EdgeSlide behavior with boundry edges

- would flip in opposite directions sometimes on the same loop
- some vertices would get directions from adjacent vertices

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

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

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

diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index eae02c9..34e76ce 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -5424,8 +5424,8 @@ static bool createEdgeSlideVerts(TransInfo *t)
 	while (1) {
 		float vec_a[3], vec_b[3];
 		BMLoop *l_a, *l_b;
+		BMLoop *l_a_prev, *l_b_prev;
 		BMVert *v_first;
-
 		/* If this succeeds call get_next_loop()
 		 * which calculates the direction to slide based on clever checks.
 		 *
@@ -5455,7 +5455,6 @@ static bool createEdgeSlideVerts(TransInfo *t)
 		e = v->e;
 
 		/*first, rewind*/
-		numsel = 0;
 		do {
 			e = get_other_edge(v, e);
 			if (!e) {
@@ -5463,8 +5462,6 @@ static bool createEdgeSlideVerts(TransInfo *t)
 				break;
 			}
 
-			numsel += 1;
-
 			if (!BM_elem_flag_test(BM_edge_other_vert(e, v), BM_ELEM_TAG))
 				break;
 
@@ -5513,6 +5510,9 @@ static bool createEdgeSlideVerts(TransInfo *t)
 			l_b = NULL;
 		}
 
+		l_a_prev = NULL;
+		l_b_prev = NULL;
+
 		/*iterate over the loop*/
 		v_first = v;
 		do {
@@ -5530,14 +5530,14 @@ static bool createEdgeSlideVerts(TransInfo *t)
 			copy_v3_v3(sv->v_co_orig, v->co);
 			sv->loop_nr = loop_nr;
 
-			if (l_a) {
-				BMLoop *l_tmp = BM_loop_other_edge_loop(l_a, v);
+			if (l_a || l_a_prev) {
+				BMLoop *l_tmp = BM_loop_other_edge_loop(l_a ? l_a : l_a_prev, v);
 				sv->v_a = BM_edge_other_vert(l_tmp->e, v);
 				copy_v3_v3(sv->dir_a, vec_a);
 			}
 
-			if (l_b) {
-				BMLoop *l_tmp = BM_loop_other_edge_loop(l_b, v);
+			if (l_b || l_b_prev) {
+				BMLoop *l_tmp = BM_loop_other_edge_loop(l_b ? l_b : l_b_prev, v);
 				sv->v_b = BM_edge_other_vert(l_tmp->e, v);
 				copy_v3_v3(sv->dir_b, vec_b);
 			}
@@ -5586,29 +5586,54 @@ static bool createEdgeSlideVerts(TransInfo *t)
 			l_a_ok_prev = (l_a != NULL);
 			l_b_ok_prev = (l_b != NULL);
 
-			l_a = l_a ? get_next_loop(v, l_a, e_prev, e, vec_a) : NULL;
-			l_b = l_b ? get_next_loop(v, l_b, e_prev, e, vec_b) : NULL;
-
-			/* find the opposite loop if it was missing previously */
-			if      (l_a == NULL && l_b && (l_b->radial_next != l_b)) l_a = l_b->radial_next;
-			else if (l_b == NULL && l_a && (l_a->radial_next != l_a)) l_b = l_a->radial_next;
-
-			/* if there are non-contiguous faces, we can still recover the loops of the new edges faces */
-			/* note!, the behavior in this case means edges may move in opposite directions,
-			 * this could be made to work more usefully. */
-			if (!(l_a && l_b) && (e->l != NULL)) {
-				if (l_a_ok_prev) {
-					l_a = e->l;
-					if (l_a->radial_next != l_a) {
-						l_b = l_a->radial_next;
-					}
+			l_a_prev = l_a;
+			l_b_prev = l_b;
+
+			if (l_a) {
+				l_a = get_next_loop(v, l_a, e_prev, e, vec_a);
+			}
+			else {
+				zero_v3(vec_a);
+			}
+
+			if (l_b) {
+				l_b = get_next_loop(v, l_b, e_prev, e, vec_b);
+			}
+			else {
+				zero_v3(vec_b);
+			}
+
+
+			if (l_a && l_b) {
+				/* pass */
+			}
+			else {
+				if (l_a || l_b) {
+					/* find the opposite loop if it was missing previously */
+					if      (l_a == NULL && l_b && (l_b->radial_next != l_b)) l_a = l_b->radial_next;
+					else if (l_b == NULL && l_a && (l_a->radial_next != l_a)) l_b = l_a->radial_next;
 				}
-				else if (l_b_ok_prev) {
-					l_b = e->l;
-					if (l_b->radial_next != l_b) {
-						l_a = l_b->radial_next;
+				else if (e->l != NULL) {
+					/* if there are non-contiguous faces, we can still recover the loops of the new edges faces */
+					/* note!, the behavior in this case means edges may move in opposite directions,
+					 * this could be made to work more usefully. */
+
+					if (l_a_ok_prev) {
+						l_a = e->l;
+						l_b = (l_a->radial_next != l_a) ? l_a->radial_next : NULL;
+					}
+					else if (l_b_ok_prev) {
+						l_b = e->l;
+						l_a = (l_b->radial_next != l_b) ? l_b->radial_next : NULL;
 					}
 				}
+
+				if (!l_a_ok_prev && l_a) {
+					get_next_loop(v, l_a, e, e_prev, vec_a);
+				}
+				if (!l_b_ok_prev && l_b) {
+					get_next_loop(v, l_b, e, e_prev, vec_b);
+				}
 			}
 
 			BM_elem_flag_disable(v, BM_ELEM_TAG);




More information about the Bf-blender-cvs mailing list