fix [#34073] Combined EdgeLoop slides weirdly on even try

concave check on co-linear edges could fail, avoid by using the loop-direction + face normal.
This commit is contained in:
Campbell Barton 2013-02-03 06:09:29 +00:00
parent f0d4b85fef
commit 1f21efdeac
3 changed files with 27 additions and 7 deletions

@ -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
*

@ -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);

@ -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);
}
}