Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-05-29 19:49:36 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-05-29 19:53:47 +0400
commit53424ec0ff664829ff4973a013f605d342838d21 (patch)
tree8c6fe0b3eb49f017161af058a50a6ad1ff73da1f /source/blender/editors
parent2057a3a2fcd545ad16fd77f789562727a5fd3f8b (diff)
Fix T40422: EdgeSlide works incorrectly with boundry edges
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/transform/transform.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index cf9f89e333c..eae02c920c9 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 */