Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-05-22 10:00:26 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-05-22 10:00:26 +0400
commitaa0caa448eb192b61800130b86c86794f43832e7 (patch)
tree0003475b8091b3f9909876ecce2c9e02eeebcfae /source/blender/bmesh
parent2d19e97ee673f54989fe580c567e8cddd54e2468 (diff)
utility bmesh functions, for edge loop creation, optionally pass array BM_edge_split_n() to get verts created.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r--source/blender/bmesh/intern/bmesh_edgeloop.c17
-rw-r--r--source/blender/bmesh/intern/bmesh_edgeloop.h2
-rw-r--r--source/blender/bmesh/intern/bmesh_mods.c8
-rw-r--r--source/blender/bmesh/intern/bmesh_mods.h2
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);