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>2013-01-29 09:18:30 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-01-29 09:18:30 +0400
commite9a4dd202e9032435b102b800c5d12f4f689f4d0 (patch)
tree19a5deccf751b7d7e57da60152fbfc469ec78224 /source/blender/editors/transform
parent69585591d6a1d1fdac1e6b6ce508ccd3d936e2ac (diff)
fix for fix, ugh!, vertex slide with concave/convex ngons & normal flipping should now work properly in all cases.
... somehow I managed to make test-cases that worked in previous commits but failed in other cases.
Diffstat (limited to 'source/blender/editors/transform')
-rw-r--r--source/blender/editors/transform/transform.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index fb2d9af7c35..6d11eebe7dc 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -4917,23 +4917,20 @@ static BMLoop *get_next_loop(BMVert *v, BMLoop *l,
len_v3_ensure(vec_accum, vec_accum_len / (float)i);
}
else {
- /* When there is no edge to slide along,
- * we must slide along the vector defined by the face we're attach to */
- float e_dir_prev[3], e_dir_next[3], tvec[3];
+ BMLoop *l_tmp = BM_face_vert_share_loop(l_first->f, v);
- sub_v3_v3v3(e_dir_prev, BM_edge_other_vert(e_prev, v)->co, v->co);
- sub_v3_v3v3(e_dir_next, BM_edge_other_vert(e_next, v)->co, v->co);
-
- cross_v3_v3v3(tvec, l->f->no, e_dir_prev);
- cross_v3_v3v3(vec_accum, e_dir_next, l->f->no);
-
- mid_v3_v3v3(vec_accum, vec_accum, tvec);
-
- /* check if we need to flip
- * (compare the normal defines by the edges with the face normal) */
- cross_v3_v3v3(tvec, e_dir_prev, e_dir_next);
- if ((dot_v3v3(tvec, l->f->no) < 0.0f) == BM_loop_is_convex(l)) {
- negate_v3(vec_accum);
+ if (ELEM(l_tmp->e, e_prev, e_next) && ELEM(l_tmp->prev->e, e_prev, e_next)) {
+ float tvec[3];
+ BM_loop_calc_face_tangent(l_tmp, vec_accum);
+ if (!BM_loop_is_convex(l_tmp)) {
+ negate_v3(vec_accum);
+ }
+ cross_v3_v3v3(tvec, vec_accum, l_tmp->f->no);
+ cross_v3_v3v3(vec_accum, l_tmp->f->no, tvec);
+ len_v3_ensure(vec_accum, (BM_edge_calc_length(e_prev) + BM_edge_calc_length(e_next)) / 2.0f);
+ }
+ else {
+ BLI_assert(0);
}
}