diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-05-12 07:36:41 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-05-12 07:36:41 +0400 |
commit | 9cd0c5f7fb8b92dda6d5f82c50b839e0dfe7f1e8 (patch) | |
tree | d2d7a5d06198a79a56e35bd3114837f73eb77b09 /source/blender/bmesh/intern/bmesh_edgeloop.c | |
parent | dc1a36534d2832e9b30f369acd0dabcad93c632f (diff) |
bridge tool: support for bridging loops with different numbers of vertices.
Diffstat (limited to 'source/blender/bmesh/intern/bmesh_edgeloop.c')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_edgeloop.c | 56 |
1 files changed, 52 insertions, 4 deletions
diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.c b/source/blender/bmesh/intern/bmesh_edgeloop.c index 1c302668409..2f68effc97a 100644 --- a/source/blender/bmesh/intern/bmesh_edgeloop.c +++ b/source/blender/bmesh/intern/bmesh_edgeloop.c @@ -157,7 +157,8 @@ int BM_mesh_edgeloops_find(BMesh *bm, ListBase *r_eloops, count++; } else { - BM_edgeloop_free(r_eloops, el_store); + BLI_remlink(r_eloops, el_store); + BM_edgeloop_free(el_store); } } } @@ -168,7 +169,8 @@ void BM_mesh_edgeloops_free(ListBase *eloops) { BMEdgeLoopStore *el_store; while ((el_store = eloops->first)) { - BM_edgeloop_free(eloops, el_store); + BLI_remlink(eloops, el_store); + BM_edgeloop_free(el_store); } } @@ -240,10 +242,17 @@ void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops) /* -------------------------------------------------------------------- */ /* BM_edgeloop_*** functions */ -void BM_edgeloop_free(ListBase *eloops, BMEdgeLoopStore *el_store) +BMEdgeLoopStore *BM_edgeloop_copy(BMEdgeLoopStore *el_store) +{ + BMEdgeLoopStore *el_store_copy = MEM_mallocN(sizeof(*el_store), __func__); + *el_store_copy = *el_store; + BLI_duplicatelist(&el_store_copy->verts, &el_store->verts); + return el_store_copy; +} + +void BM_edgeloop_free(BMEdgeLoopStore *el_store) { BLI_freelistN(&el_store->verts); - BLI_remlink(eloops, el_store); MEM_freeN(el_store); } @@ -347,3 +356,42 @@ void BM_edgeloop_flip(BMesh *UNUSED(bm), BMEdgeLoopStore *el_store) negate_v3(el_store->no); BLI_reverselist(&el_store->verts); } + +void BM_edgeloop_expand(BMesh *UNUSED(bm), BMEdgeLoopStore *el_store, int el_store_len) +{ + /* first double until we are more then half as big */ + while ((el_store->len * 2) < el_store_len) { + LinkData *node_curr = el_store->verts.first; + while (node_curr) { + LinkData *node_curr_copy = MEM_dupallocN(node_curr); + BLI_insertlinkafter(&el_store->verts, node_curr, node_curr_copy); + el_store->len++; + node_curr = node_curr_copy->next; + } + } + + if (el_store->len < el_store_len) { + const int step = max_ii(1, el_store->len / (el_store->len % el_store_len)); + LinkData *node_first = el_store->verts.first; + LinkData *node_curr = node_first; + + do { + LinkData *node_curr_init = node_curr; + LinkData *node_curr_copy; + int i = 0; + LISTBASE_CIRCULAR_FORWARD_BEGIN (&el_store->verts, node_curr, node_curr_init) { + if (i++ < step) { + break; + } + } + LISTBASE_CIRCULAR_FORWARD_END (&el_store->verts, node_curr, node_curr_init); + + node_curr_copy = MEM_dupallocN(node_curr); + BLI_insertlinkafter(&el_store->verts, node_curr, node_curr_copy); + el_store->len++; + node_curr = node_curr_copy->next; + } while (el_store->len < el_store_len); + } + + BLI_assert(el_store->len == el_store_len); +} |