diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-04-20 01:47:32 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-04-20 01:47:32 +0400 |
commit | 741a177a74057b9baaae17640205017ca393ed89 (patch) | |
tree | 33cf96b86350248bcbd54df29d57f64510f12c52 /source/blender/bmesh/intern | |
parent | ebbfcd71e5ea35a64759ecbf9bc0f34d582a6bde (diff) |
bmesh: improve rip tool
- When the rip extends into a fan, pick the opposite edge in the fan (rather then 2 along)
- When stepping over the fan to find the rip edge, walk in the direction closest to the mouse (generally works nicer)
Diffstat (limited to 'source/blender/bmesh/intern')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_core.c | 3 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.c | 53 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.h | 1 |
3 files changed, 55 insertions, 2 deletions
diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c index 76095728d5a..51ca11b0898 100644 --- a/source/blender/bmesh/intern/bmesh_core.c +++ b/source/blender/bmesh/intern/bmesh_core.c @@ -814,8 +814,7 @@ static int UNUSED_FUNCTION(count_flagged_disk)(BMVert *v, int flag) do { i += BM_ELEM_API_FLAG_TEST(e, flag) ? 1 : 0; - e = bmesh_disk_edge_next(e, v); - } while (e != v->e); + } while ((e = bmesh_disk_edge_next(e, v)) != v->e); return i; } diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 09cd6a2f96b..3561092b1cf 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -309,6 +309,59 @@ BMVert *BM_edge_other_vert(BMEdge *e, BMVert *v) } /** + * The function takes a vertex at the center of a fan and returns the opposite edge in the fan. + * All edges in the fan must be manifold, otherwise return NULL. + * + * \note This could (probably) be done more effieiently. + */ +BMEdge *BM_vert_other_disk_edge(BMVert *v, BMEdge *e_first) +{ + BMLoop *l_a; + int tot = 0; + int i; + + BLI_assert(BM_vert_in_edge(e_first, v)); + + l_a = e_first->l; + do { + l_a = BM_loop_other_vert_loop(l_a, v); + l_a = BM_vert_in_edge(l_a->e, v) ? l_a : l_a->prev; + if (BM_edge_is_manifold(l_a->e)) { + l_a = l_a->radial_next; + } + else { + return NULL; + } + + tot++; + } while (l_a != e_first->l); + + /* we know the total, now loop half way */ + tot /= 2; + i = 0; + + l_a = e_first->l; + do { + if (i == tot) { + l_a = BM_vert_in_edge(l_a->e, v) ? l_a : l_a->prev; + return l_a->e; + } + + l_a = BM_loop_other_vert_loop(l_a, v); + l_a = BM_vert_in_edge(l_a->e, v) ? l_a : l_a->prev; + if (BM_edge_is_manifold(l_a->e)) { + l_a = l_a->radial_next; + } + /* this wont have changed from the previous loop */ + + + i++; + } while (l_a != e_first->l); + + return NULL; +} + +/** * Returms edge length */ float BM_edge_length_calc(BMEdge *e) diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index d69a57bdb40..5178311eea4 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -49,6 +49,7 @@ int BM_vert_edge_count_nonwire(BMVert *v); int BM_vert_edge_count(BMVert *v); int BM_edge_face_count(BMEdge *e); int BM_vert_face_count(BMVert *v); +BMEdge *BM_vert_other_disk_edge(BMVert *v, BMEdge *e); int BM_vert_is_wire(BMVert *v); int BM_edge_is_wire(BMEdge *e); |