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>2015-11-19 14:12:41 +0300
committerCampbell Barton <ideasman42@gmail.com>2015-11-19 14:52:17 +0300
commitb1c4d21e2e5aa7b5df552fa149dd78d29d0fd7d3 (patch)
tree3889d53692a87ca5f5d39427a3a23e45f217a77f /source/blender/bmesh/intern
parent9c044b4773a9e4b610b515cd369197a7c3e38f62 (diff)
BMesh: support splitting edge-loops when expanding
Diffstat (limited to 'source/blender/bmesh/intern')
-rw-r--r--source/blender/bmesh/intern/bmesh_edgeloop.c57
-rw-r--r--source/blender/bmesh/intern/bmesh_edgeloop.h5
2 files changed, 56 insertions, 6 deletions
diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.c b/source/blender/bmesh/intern/bmesh_edgeloop.c
index eaa070151a6..5e1d9c3a98d 100644
--- a/source/blender/bmesh/intern/bmesh_edgeloop.c
+++ b/source/blender/bmesh/intern/bmesh_edgeloop.c
@@ -664,17 +664,47 @@ void BM_edgeloop_flip(BMesh *UNUSED(bm), BMEdgeLoopStore *el_store)
BLI_listbase_reverse(&el_store->verts);
}
-void BM_edgeloop_expand(BMesh *UNUSED(bm), BMEdgeLoopStore *el_store, int el_store_len)
+void BM_edgeloop_expand(
+ BMesh *bm, BMEdgeLoopStore *el_store, int el_store_len,
+ bool split, GSet *split_edges)
{
+ bool split_swap = true;
+
+#define EDGE_SPLIT(node_copy, node_other) { \
+ BMVert *v_split, *v_other = (node_other)->data; \
+ BMEdge *e_split, *e_other = BM_edge_exists((node_copy)->data, v_other); \
+ v_split = BM_edge_split(bm, e_other, split_swap ? (node_copy)->data : v_other, &e_split, 0.0f); \
+ v_split->e = e_split; \
+ BLI_assert(v_split == e_split->v2); \
+ BLI_gset_insert(split_edges, e_split); \
+ (node_copy)->data = v_split; \
+ } ((void)0)
+
/* first double until we are more than 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);
+ if (split == false) {
+ BLI_insertlinkafter(&el_store->verts, node_curr, node_curr_copy);
+ node_curr = node_curr_copy->next;
+ }
+ else {
+ if (node_curr->next || (el_store->flag & BM_EDGELOOP_IS_CLOSED)) {
+ EDGE_SPLIT(node_curr_copy, node_curr->next ? node_curr->next : (LinkData *)el_store->verts.first);
+ BLI_insertlinkafter(&el_store->verts, node_curr, node_curr_copy);
+ node_curr = node_curr_copy->next;
+ }
+ else {
+ EDGE_SPLIT(node_curr_copy, node_curr->prev);
+ BLI_insertlinkbefore(&el_store->verts, node_curr, node_curr_copy);
+ node_curr = node_curr->next;
+ }
+ split_swap = !split_swap;
+ }
el_store->len++;
- node_curr = node_curr_copy->next;
}
+ split_swap = !split_swap;
}
if (el_store->len < el_store_len) {
@@ -694,12 +724,29 @@ void BM_edgeloop_expand(BMesh *UNUSED(bm), BMEdgeLoopStore *el_store, int el_sto
BLI_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);
+ if (split == false) {
+ BLI_insertlinkafter(&el_store->verts, node_curr, node_curr_copy);
+ node_curr = node_curr_copy->next;
+ }
+ else {
+ if (node_curr->next || (el_store->flag & BM_EDGELOOP_IS_CLOSED)) {
+ EDGE_SPLIT(node_curr_copy, node_curr->next ? node_curr->next : (LinkData *)el_store->verts.first);
+ BLI_insertlinkafter(&el_store->verts, node_curr, node_curr_copy);
+ node_curr = node_curr_copy->next;
+ }
+ else {
+ EDGE_SPLIT(node_curr_copy, node_curr->prev);
+ BLI_insertlinkbefore(&el_store->verts, node_curr, node_curr_copy);
+ node_curr = node_curr->next;
+ }
+ split_swap = !split_swap;
+ }
el_store->len++;
- node_curr = node_curr_copy->next;
} while (el_store->len < el_store_len);
}
+#undef EDGE_SPLIT
+
BLI_assert(el_store->len == el_store_len);
}
diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.h b/source/blender/bmesh/intern/bmesh_edgeloop.h
index 5df4ee5848e..68583562888 100644
--- a/source/blender/bmesh/intern/bmesh_edgeloop.h
+++ b/source/blender/bmesh/intern/bmesh_edgeloop.h
@@ -30,6 +30,7 @@
struct ListBase;
struct BMEdgeLoopStore;
+struct GSet;
/* multiple edgeloops (ListBase) */
int BM_mesh_edgeloops_find(
@@ -66,7 +67,9 @@ bool BM_edgeloop_calc_normal_aligned(
BMesh *bm, struct BMEdgeLoopStore *el_store,
const float no_align[3]);
void BM_edgeloop_flip(BMesh *bm, struct BMEdgeLoopStore *el_store);
-void BM_edgeloop_expand(BMesh *bm, struct BMEdgeLoopStore *el_store, int el_store_len);
+void BM_edgeloop_expand(
+ BMesh *bm, struct BMEdgeLoopStore *el_store, int el_store_len,
+ bool split, struct GSet *split_edges);
bool BM_edgeloop_overlap_check(struct BMEdgeLoopStore *el_store_a, struct BMEdgeLoopStore *el_store_b);