forked from bartvdbraak/blender
BMesh: utility to split isolated loop regions
This commit is contained in:
parent
33cc5ed495
commit
dd48ddd605
@ -2604,6 +2604,46 @@ BMVert *bmesh_urmv_loop_multi(
|
||||
return v_new;
|
||||
}
|
||||
|
||||
static void bmesh_edge_vert_swap__recursive(BMEdge *e, BMVert *v_dst, BMVert *v_src)
|
||||
{
|
||||
BMLoop *l_iter, *l_first;
|
||||
|
||||
BLI_assert(ELEM(v_src, e->v1, e->v2));
|
||||
bmesh_disk_vert_replace(e, v_dst, v_src);
|
||||
|
||||
l_iter = l_first = e->l;
|
||||
do {
|
||||
if (l_iter->v == v_src) {
|
||||
l_iter->v = v_dst;
|
||||
if (BM_vert_in_edge(l_iter->prev->e, v_src)) {
|
||||
bmesh_edge_vert_swap__recursive(l_iter->prev->e, v_dst, v_src);
|
||||
}
|
||||
}
|
||||
else if (l_iter->next->v == v_src) {
|
||||
l_iter->next->v = v_dst;
|
||||
if (BM_vert_in_edge(l_iter->next->e, v_src)) {
|
||||
bmesh_edge_vert_swap__recursive(l_iter->next->e, v_dst, v_src);
|
||||
}
|
||||
}
|
||||
else {
|
||||
BLI_assert(l_iter->prev->v != v_src);
|
||||
}
|
||||
} while ((l_iter = l_iter->radial_next) != l_first);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function assumes l_sep is apart of a larger fan which has already been
|
||||
* isolated by calling bmesh_edge_separate to segragate it radially.
|
||||
*/
|
||||
BMVert *bmesh_urmv_loop_region(BMesh *bm, BMLoop *l_sep)
|
||||
{
|
||||
BMVert *v_new = BM_vert_create(bm, l_sep->v->co, l_sep->v, BM_CREATE_NOP);
|
||||
/* passing either 'l_sep->e', 'l_sep->prev->e' will work */
|
||||
bmesh_edge_vert_swap__recursive(l_sep->e, v_new, l_sep->v);
|
||||
BLI_assert(l_sep->v == v_new);
|
||||
return v_new;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief Unglue Region Make Vert (URMV)
|
||||
|
@ -104,6 +104,7 @@ BMVert *bmesh_urmv(BMesh *bm, BMFace *f_sep, BMVert *v_sep);
|
||||
BMVert *bmesh_urmv_loop(BMesh *bm, BMLoop *l_sep);
|
||||
BMVert *bmesh_urmv_loop_multi(
|
||||
BMesh *bm, BMLoop **larr, int larr_len);
|
||||
BMVert *bmesh_urmv_loop_region(BMesh *bm, BMLoop *l_sep);
|
||||
|
||||
void bmesh_face_swap_data(BMFace *f_a, BMFace *f_b);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user