diff options
author | Antony Riakiotakis <kalast@gmail.com> | 2012-03-12 00:45:58 +0400 |
---|---|---|
committer | Antony Riakiotakis <kalast@gmail.com> | 2012-03-12 00:45:58 +0400 |
commit | 33d81047163cf13c45e6f9914a10d16a768d954b (patch) | |
tree | 41d23e84426e3e1474ca881186aa7f2d8c529124 /source/blender/bmesh | |
parent | d6b8b0330534e26c5cf2872121889932b5b14d87 (diff) |
Fix edge loop selection. Now boundary selection checks only for filled edges to determine when to stop and stops at vertices shared by only 2 edges.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.c | 17 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.h | 2 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_walkers_impl.c | 9 |
3 files changed, 24 insertions, 4 deletions
diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 4d9b21e391c..357afbe391e 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -291,6 +291,23 @@ int BM_vert_edge_count(BMVert *v) return bmesh_disk_count(v); } +int BM_vert_edge_count_nonwire( BMesh *bm, BMVert *v) +{ + int count = 0; + BMIter eiter; + BMEdge *edge; + BM_ITER(edge, &eiter, bm, BM_EDGES_OF_VERT, v){ + if (!edge) return count; + + if (count >= (1 << 20)) { + printf(" bmesh error: infinite loop in disk cycle!\n"); + return 0; + } + + if(edge->l) count++; + } + return count; +} /** * Returns the number of faces around this edge */ diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index 6975c40c10a..0ce5fb3a665 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -49,6 +49,8 @@ int BM_vert_face_count(BMVert *v); int BM_vert_is_wire(BMesh *bm, BMVert *v); int BM_edge_is_wire(BMesh *bm, BMEdge *e); +int BM_vert_edge_count_nonwire( BMesh *bm, BMVert *v); + int BM_vert_is_manifold(BMesh *bm, BMVert *v); int BM_edge_is_manifold(BMesh *bm, BMEdge *e); int BM_edge_is_boundary(BMEdge *e); diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c index 30bbc9e9b2a..20386a78604 100644 --- a/source/blender/bmesh/intern/bmesh_walkers_impl.c +++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c @@ -464,11 +464,12 @@ static void *bmw_LoopWalker_step(BMWalker *walker) v = (e->v1 == lwalk->lastv) ? e->v2 : e->v1; - val = BM_vert_edge_count(v); - rlen = owalk.startrad; - if (val == 4 || val == 2 || rlen == 1) { + val = BM_vert_edge_count_nonwire(walker->bm, v); + + /* however, why use 2 here at all? I guess for internal ngon loops it can be useful. Antony R. */ + if (((val == 4 || val == 2) && rlen > 1) || (rlen == 1 && val > 2)) { i = 0; stopi = val / 2; while (1) { @@ -481,7 +482,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker) l2 = l->radial_next; - if (l2 == l) { + if (l2 == l || !l2) { break; } |