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
path: root/source
diff options
context:
space:
mode:
authorAntony Riakiotakis <kalast@gmail.com>2012-03-12 00:45:58 +0400
committerAntony Riakiotakis <kalast@gmail.com>2012-03-12 00:45:58 +0400
commit33d81047163cf13c45e6f9914a10d16a768d954b (patch)
tree41d23e84426e3e1474ca881186aa7f2d8c529124 /source
parentd6b8b0330534e26c5cf2872121889932b5b14d87 (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')
-rw-r--r--source/blender/bmesh/intern/bmesh_queries.c17
-rw-r--r--source/blender/bmesh/intern/bmesh_queries.h2
-rw-r--r--source/blender/bmesh/intern/bmesh_walkers_impl.c9
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;
}