utility bmesh functions, for edge loop creation, optionally pass array BM_edge_split_n() to get verts created.
This commit is contained in:
@@ -448,6 +448,7 @@ void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops, const boo
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* BM_edgeloop_*** functions */
|
||||
|
||||
/* return new edgeloops */
|
||||
BMEdgeLoopStore *BM_edgeloop_copy(BMEdgeLoopStore *el_store)
|
||||
{
|
||||
BMEdgeLoopStore *el_store_copy = MEM_mallocN(sizeof(*el_store), __func__);
|
||||
@@ -456,6 +457,22 @@ BMEdgeLoopStore *BM_edgeloop_copy(BMEdgeLoopStore *el_store)
|
||||
return el_store_copy;
|
||||
}
|
||||
|
||||
BMEdgeLoopStore *BM_edgeloop_from_verts(BMVert **v_arr, const int v_arr_tot, bool is_closed)
|
||||
{
|
||||
BMEdgeLoopStore *el_store = MEM_callocN(sizeof(*el_store), __func__);
|
||||
int i;
|
||||
for (i = 0; i < v_arr_tot; i++) {
|
||||
LinkData *node = MEM_callocN(sizeof(*node), __func__);
|
||||
node->data = v_arr[i];
|
||||
BLI_addtail(&el_store->verts, node);
|
||||
}
|
||||
el_store->len = v_arr_tot;
|
||||
if (is_closed) {
|
||||
el_store->flag |= BM_EDGELOOP_IS_CLOSED;
|
||||
}
|
||||
return el_store;
|
||||
}
|
||||
|
||||
void BM_edgeloop_free(BMEdgeLoopStore *el_store)
|
||||
{
|
||||
BLI_freelistN(&el_store->verts);
|
||||
|
||||
@@ -46,6 +46,8 @@ void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *el
|
||||
|
||||
/* single edgeloop */
|
||||
struct BMEdgeLoopStore *BM_edgeloop_copy(struct BMEdgeLoopStore *el_store);
|
||||
struct BMEdgeLoopStore *BM_edgeloop_from_verts(BMVert **v_arr, const int v_arr_tot, bool is_closed);
|
||||
|
||||
void BM_edgeloop_free(struct BMEdgeLoopStore *el_store);
|
||||
bool BM_edgeloop_is_closed(struct BMEdgeLoopStore *el_store);
|
||||
int BM_edgeloop_length_get(struct BMEdgeLoopStore *el_store);
|
||||
|
||||
@@ -747,8 +747,10 @@ BMVert *BM_edge_split(BMesh *bm, BMEdge *e, BMVert *v, BMEdge **r_e, float perce
|
||||
|
||||
/**
|
||||
* \brief Split an edge multiple times evenly
|
||||
*
|
||||
* \param r_varr Optional array, verts in between (v1 -> v2)
|
||||
*/
|
||||
BMVert *BM_edge_split_n(BMesh *bm, BMEdge *e, int numcuts)
|
||||
BMVert *BM_edge_split_n(BMesh *bm, BMEdge *e, int numcuts, BMVert **r_varr)
|
||||
{
|
||||
int i;
|
||||
float percent;
|
||||
@@ -757,6 +759,10 @@ BMVert *BM_edge_split_n(BMesh *bm, BMEdge *e, int numcuts)
|
||||
for (i = 0; i < numcuts; i++) {
|
||||
percent = 1.0f / (float)(numcuts + 1 - i);
|
||||
v_new = BM_edge_split(bm, e, e->v2, NULL, percent);
|
||||
if (r_varr) {
|
||||
/* fill in reverse order (v1 -> v2) */
|
||||
r_varr[numcuts - i - 1] = v_new;
|
||||
}
|
||||
}
|
||||
return v_new;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ BMEdge *BM_vert_collapse_edge(BMesh *bm, BMEdge *e_kill, BMVert *v_kill,
|
||||
|
||||
BMVert *BM_edge_split(BMesh *bm, BMEdge *e, BMVert *v, BMEdge **r_e, float percent);
|
||||
|
||||
BMVert *BM_edge_split_n(BMesh *bm, BMEdge *e, int numcuts);
|
||||
BMVert *BM_edge_split_n(BMesh *bm, BMEdge *e, int numcuts, BMVert **r_varr);
|
||||
|
||||
bool BM_face_validate(BMFace *face, FILE *err);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user