diff options
-rw-r--r-- | source/blender/bmesh/intern/bmesh_edgeloop.c | 17 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_edgeloop.h | 2 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mods.c | 8 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_mods.h | 2 |
4 files changed, 27 insertions, 2 deletions
diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.c b/source/blender/bmesh/intern/bmesh_edgeloop.c index e095cfd1534..7ebefbb8d92 100644 --- a/source/blender/bmesh/intern/bmesh_edgeloop.c +++ b/source/blender/bmesh/intern/bmesh_edgeloop.c @@ -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); diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.h b/source/blender/bmesh/intern/bmesh_edgeloop.h index aa57fcfc47d..1a3a75be8ae 100644 --- a/source/blender/bmesh/intern/bmesh_edgeloop.h +++ b/source/blender/bmesh/intern/bmesh_edgeloop.h @@ -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); diff --git a/source/blender/bmesh/intern/bmesh_mods.c b/source/blender/bmesh/intern/bmesh_mods.c index afb3fc8112c..c75843f029a 100644 --- a/source/blender/bmesh/intern/bmesh_mods.c +++ b/source/blender/bmesh/intern/bmesh_mods.c @@ -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; } diff --git a/source/blender/bmesh/intern/bmesh_mods.h b/source/blender/bmesh/intern/bmesh_mods.h index 93d6ca10edb..ca281c13f21 100644 --- a/source/blender/bmesh/intern/bmesh_mods.h +++ b/source/blender/bmesh/intern/bmesh_mods.h @@ -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); |