forked from bartvdbraak/blender
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:
parent
f0d4b85fef
commit
1f21efdeac
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user