diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index bf30db78a61..b2b710a0d36 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -1057,6 +1057,29 @@ void BM_loop_calc_face_normal(BMLoop *l, float r_normal[3]) } } +/** + * \brief BM_loop_calc_face_direction + * + * Calculate the direction a loop is pointing. + * + * \param l The loop to calculate the direction at + * \param r_dir Resulting direction + */ +void BM_loop_calc_face_direction(BMLoop *l, float r_dir[3]) +{ + float v_prev[3]; + float v_next[3]; + + sub_v3_v3v3(v_prev, l->v->co, l->prev->v->co); + sub_v3_v3v3(v_next, l->next->v->co, l->v->co); + + normalize_v3(v_prev); + normalize_v3(v_next); + + add_v3_v3v3(r_dir, v_prev, v_next); + normalize_v3(r_dir); +} + /** * \brief BM_loop_calc_face_tangent * diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index 4172b3905cd..b285c531bb5 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -66,6 +66,7 @@ bool BM_loop_is_convex(BMLoop *l); float BM_loop_calc_face_angle(BMLoop *l); void BM_loop_calc_face_normal(BMLoop *l, float r_normal[3]); +void BM_loop_calc_face_direction(BMLoop *l, float r_normal[3]); void BM_loop_calc_face_tangent(BMLoop *l, float r_tangent[3]); float BM_edge_calc_face_angle(BMEdge *e); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index f6c9c27dd76..cfa6a72163e 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -4920,7 +4920,6 @@ static BMLoop *get_next_loop(BMVert *v, BMLoop *l, /* When there is no edge to slide along, * we must slide along the vector defined by the face we're attach to */ BMLoop *l_tmp = BM_face_vert_share_loop(l_first->f, v); - float tvec[3]; BLI_assert(ELEM(l_tmp->e, e_prev, e_next) && ELEM(l_tmp->prev->e, e_prev, e_next)); @@ -4930,12 +4929,9 @@ static BMLoop *get_next_loop(BMVert *v, BMLoop *l, sub_v3_v3v3(vec_accum, l_tmp->next->next->v->co, v->co); } else { - 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); + float tdir[3]; + BM_loop_calc_face_direction(l_tmp, tdir); + cross_v3_v3v3(vec_accum, l_tmp->f->no, tdir); len_v3_ensure(vec_accum, (BM_edge_calc_length(e_prev) + BM_edge_calc_length(e_next)) / 2.0f); } }