diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-02-29 21:23:41 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-02-29 21:23:41 +0400 |
commit | af0a469307d5abe30d59c62c61d8bbc361bdf359 (patch) | |
tree | 838b6747f9c66ed52589441b5f4c0c31c75e9d95 /source/blender/bmesh | |
parent | 034b1711ea2b64d0e666346b13cd3ae1a53a5fd0 (diff) |
fix [#29135] NGons dont work with loop cut
patch by Andrew Wiggin
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_walkers_impl.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c index 3ec7cbb60b1..73aa42dbbdc 100644 --- a/source/blender/bmesh/intern/bmesh_walkers_impl.c +++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c @@ -670,7 +670,7 @@ static void edgeringWalker_begin(BMWalker *walker, void *data) lwalk = BMW_state_add(walker); *lwalk = owalk; - if (lwalk->l->f->len != 4) + if (lwalk->l->f->len % 2 != 0) lwalk->l = lwalk->l->radial_next; BLI_ghash_free(walker->visithash, NULL, NULL); @@ -698,6 +698,7 @@ static void *edgeringWalker_step(BMWalker *walker) BMEdge *e; BMLoop *l = lwalk->l /* , *origl = lwalk->l */; BMesh *bm = walker->bm; + int i, len; BMW_state_remove(walker); @@ -714,14 +715,25 @@ static void *edgeringWalker_step(BMWalker *walker) } l = l->radial_next; - l = l->next->next; - - if ((l->f->len != 4) || !BM_edge_is_manifold(bm, l->e)) { - l = lwalk->l->next->next; + + i = len = l->f->len; + while (i > 0) { + l = l->next; + i -= 2; } + if ((len <= 0) || (len % 2 != 0) || !BM_edge_is_manifold(bm, l->e)) { + l = lwalk->l; + i = len; + while (i > 0) { + l = l->next; + i -= 2; + } + } + + /* only walk to manifold edge */ - if ((l->f->len == 4) && BM_edge_is_manifold(bm, l->e) && + if ((l->f->len % 2 == 0) && BM_edge_is_manifold(bm, l->e) && !BLI_ghash_haskey(walker->visithash, l->e)) { lwalk = BMW_state_add(walker); lwalk->l = l; |