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-12 07:36:41 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-05-12 07:36:41 +0400
commit9cd0c5f7fb8b92dda6d5f82c50b839e0dfe7f1e8 (patch)
treed2d7a5d06198a79a56e35bd3114837f73eb77b09 /source/blender/bmesh/intern/bmesh_edgeloop.c
parentdc1a36534d2832e9b30f369acd0dabcad93c632f (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.c56
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);
+}