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>2016-06-21 00:50:19 +0300
committerCampbell Barton <ideasman42@gmail.com>2016-06-21 01:10:51 +0300
commited225d4517c151e8ad0aa30a61daf46f9982f298 (patch)
tree2289d4f51d75bd8f02498433328706eca0917a45 /source/blender/bmesh/intern/bmesh_polygon_edgenet.c
parentdfa7ddd4a8d12a2586c23ae3cb986286f32c9503 (diff)
BMesh: avoid verts-of-edge iterator
Since this function is called a lot, loop over data directly.
Diffstat (limited to 'source/blender/bmesh/intern/bmesh_polygon_edgenet.c')
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon_edgenet.c43
1 files changed, 23 insertions, 20 deletions
diff --git a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
index c224a1ad587..009df44b1da 100644
--- a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
+++ b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
@@ -104,8 +104,6 @@ static bool bm_face_split_edgenet_find_loop_pair(
/* Always find one boundary edge (to determine winding)
* and one wire (if available), otherwise another boundary.
*/
- BMIter iter;
- BMEdge *e;
/* detect winding */
BMLoop *l_walk;
@@ -116,18 +114,22 @@ static bool bm_face_split_edgenet_find_loop_pair(
int edges_boundary_len = 0;
int edges_wire_len = 0;
- BM_ITER_ELEM (e, &iter, v_init, BM_EDGES_OF_VERT) {
- if (BM_ELEM_API_FLAG_TEST(e, EDGE_NET)) {
- const unsigned int count = bm_edge_flagged_radial_count(e);
- if (count == 1) {
- BLI_SMALLSTACK_PUSH(edges_boundary, e);
- edges_boundary_len++;
- }
- else if (count == 0) {
- BLI_SMALLSTACK_PUSH(edges_wire, e);
- edges_wire_len++;
+ {
+ BMEdge *e, *e_first;
+ e = e_first = v_init->e;
+ do {
+ if (BM_ELEM_API_FLAG_TEST(e, EDGE_NET)) {
+ const unsigned int count = bm_edge_flagged_radial_count(e);
+ if (count == 1) {
+ BLI_SMALLSTACK_PUSH(edges_boundary, e);
+ edges_boundary_len++;
+ }
+ else if (count == 0) {
+ BLI_SMALLSTACK_PUSH(edges_wire, e);
+ edges_wire_len++;
+ }
}
- }
+ } while ((e = BM_DISK_EDGE_NEXT(e, v_init)) != e_first);
}
/* first edge should always be boundary */
@@ -157,6 +159,7 @@ static bool bm_face_split_edgenet_find_loop_pair(
v_next = BM_edge_other_vert(e_pair[1], v_init);
angle_best = angle_on_axis_v3v3v3_v3(v_prev->co, v_init->co, v_next->co, face_normal);
+ BMEdge *e;
while ((e = BLI_SMALLSTACK_POP(edges_wire))) {
float angle_test;
v_next = BM_edge_other_vert(e, v_init);
@@ -232,9 +235,6 @@ static bool bm_face_split_edgenet_find_loop_walk(
* alternatives are stored in the 'vert_stack'.
*/
while ((v = BLI_SMALLSTACK_POP_EX(vert_stack, vert_stack_next))) {
- BMIter eiter;
- BMEdge *e_next;
-
#ifdef USE_FASTPATH_NOFORK
walk_nofork:
#else
@@ -250,9 +250,12 @@ walk_nofork:
goto finally;
}
- BM_ITER_ELEM (e_next, &eiter, v, BM_EDGES_OF_VERT) {
- if ((v->e != e_next) &&
- (BM_ELEM_API_FLAG_TEST(e_next, EDGE_NET)) &&
+ BMEdge *e_next, *e_first;
+ e_first = v->e;
+ e_next = BM_DISK_EDGE_NEXT(e_first, v); /* always skip this verts edge */
+ do {
+ BLI_assert(v->e != e_next);
+ if ((BM_ELEM_API_FLAG_TEST(e_next, EDGE_NET)) &&
(bm_edge_flagged_radial_count(e_next) < 2))
{
BMVert *v_next;
@@ -279,7 +282,7 @@ walk_nofork:
v_next->e = e_next;
}
}
- }
+ } while ((e_next = BM_DISK_EDGE_NEXT(e_next, v)) != e_first);
#ifdef USE_FASTPATH_NOFORK
if (STACK_SIZE(edge_order) == 1) {