[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