[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57532] trunk/blender/source/blender/ editors/transform/transform_conversions.c: fix [#35590] Connected proportional editing gives unexpected results

Campbell Barton ideasman42 at gmail.com
Mon Jun 17 20:57:18 CEST 2013


Revision: 57532
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57532
Author:   campbellbarton
Date:     2013-06-17 18:57:18 +0000 (Mon, 17 Jun 2013)
Log Message:
-----------
fix [#35590] Connected proportional editing gives unexpected results

Modified Paths:
--------------
    trunk/blender/source/blender/editors/transform/transform_conversions.c

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-06-17 18:15:56 UTC (rev 57531)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2013-06-17 18:57:18 UTC (rev 57532)
@@ -1785,13 +1785,13 @@
 		const int i = BM_elem_index_get(v);
 		const int i_other = BM_elem_index_get(v_other);
 		float vec[3];
+		float dist_other;
 		sub_v3_v3v3(vec, v->co, v_other->co);
 		mul_m3_v3(mtx, vec);
 
-		dists[i_other] = min_ff(dists_prev[i] + len_v3(vec), dists[i_other]);
-
-		if (!BM_elem_flag_test(v_other, BM_ELEM_TAG)) {
-			BM_elem_flag_enable(v_other, BM_ELEM_TAG);
+		dist_other = dists_prev[i] + len_v3(vec);
+		if (dist_other < dists[i_other]) {
+			dists[i_other] = dist_other;
 			return true;
 		}
 	}
@@ -1807,6 +1807,7 @@
 	BMVert **queue = MEM_mallocN(bm->totvert * sizeof(BMVert *), __func__);
 	STACK_DECLARE(queue);
 
+	/* any BM_ELEM_TAG'd vertex is in 'queue_next', so we don't add in twice */
 	BMVert **queue_next = MEM_mallocN(bm->totvert * sizeof(BMVert *), __func__);
 	STACK_DECLARE(queue_next);
 
@@ -1820,14 +1821,12 @@
 
 		BM_ITER_MESH_INDEX (v, &viter, bm, BM_VERTS_OF_MESH, i) {
 			BM_elem_index_set(v, i); /* set_inline */
+			BM_elem_flag_disable(v, BM_ELEM_TAG);
 
 			if (BM_elem_flag_test(v, BM_ELEM_SELECT) == 0 || BM_elem_flag_test(v, BM_ELEM_HIDDEN)) {
-				BM_elem_flag_disable(v, BM_ELEM_TAG);
-
 				dists[i] = FLT_MAX;
 			}
 			else {
-				BM_elem_flag_enable(v, BM_ELEM_TAG);
 				STACK_PUSH(queue, v);
 
 				dists[i] = 0.0f;
@@ -1837,6 +1836,8 @@
 
 	do {
 		BMVert *v;
+		unsigned int i;
+
 		memcpy(dists_prev, dists, sizeof(float) * bm->totvert);
 
 		while ((v = STACK_POP(queue))) {
@@ -1844,15 +1845,20 @@
 			BMEdge *e;
 			BMLoop *l;
 
+			/* connected edge-verts */
 			BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
 				if (BM_elem_flag_test(e, BM_ELEM_HIDDEN) == 0) {
 					BMVert *v_other = BM_edge_other_vert(e, v);
 					if (bmesh_test_dist_add(v, v_other, dists, dists_prev, mtx)) {
-						STACK_PUSH(queue_next, v_other);
+						if (BM_elem_flag_test(v_other, BM_ELEM_TAG) == 0) {
+							BM_elem_flag_enable(v_other, BM_ELEM_TAG);
+							STACK_PUSH(queue_next, v_other);
+						}
 					}
 				}
 			}
 			
+			/* connected face-verts (excluding adjacent verts) */
 			BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
 				if ((BM_elem_flag_test(l->f, BM_ELEM_HIDDEN) == 0) && (l->f->len > 3)) {
 					BMLoop *l_end = l->prev;
@@ -1860,15 +1866,26 @@
 					do {
 						BMVert *v_other = l->v;
 						if (bmesh_test_dist_add(v, v_other, dists, dists_prev, mtx)) {
-							STACK_PUSH(queue_next, v_other);
+							if (BM_elem_flag_test(v_other, BM_ELEM_TAG) == 0) {
+								BM_elem_flag_enable(v_other, BM_ELEM_TAG);
+								STACK_PUSH(queue_next, v_other);
+							}
 						}
 					} while ((l = l->next) != l_end);
 				}
 			}
 		}
 
+		/* clear for the next loop */
+		for (i = 0; i < STACK_SIZE(queue_next); i++) {
+			BM_elem_flag_disable(queue_next[i], BM_ELEM_TAG);
+		}
+
 		STACK_SWAP(queue, queue_next);
 
+		/* none should be tagged now since 'queue_next' is empty */
+		BLI_assert(BM_iter_mesh_count_flag(BM_VERTS_OF_MESH, bm, BM_ELEM_TAG, true) == 0);
+
 	} while (STACK_SIZE(queue));
 
 	STACK_FREE(queue);




More information about the Bf-blender-cvs mailing list