From 5df494d75c9a8460951e22b5616859b137684394 Mon Sep 17 00:00:00 2001 From: mano-wii Date: Mon, 27 Jan 2020 18:31:15 -0300 Subject: bmesh_intersect_edges: Don't detect faces if an edge already exists For optimization. --- source/blender/bmesh/tools/bmesh_intersect_edges.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'source/blender/bmesh') diff --git a/source/blender/bmesh/tools/bmesh_intersect_edges.c b/source/blender/bmesh/tools/bmesh_intersect_edges.c index 75cfd99489b..4e3f525f760 100644 --- a/source/blender/bmesh/tools/bmesh_intersect_edges.c +++ b/source/blender/bmesh/tools/bmesh_intersect_edges.c @@ -860,7 +860,6 @@ bool BM_mesh_intersect_edges( if (BM_elem_flag_test(e, BM_ELEM_TAG)) { continue; } - BM_elem_flag_enable(e, BM_ELEM_TAG); BMVert *va, *vb, *va_dest = NULL; va = e->v1; @@ -869,9 +868,16 @@ bool BM_mesh_intersect_edges( int v_cut = BM_elem_index_get(va); int v_cut_other = BM_elem_index_get(vb); if (v_cut == -1 && v_cut_other == -1) { + if (!BM_elem_flag_test(va, BM_ELEM_TAG) && !BM_elem_flag_test(vb, BM_ELEM_TAG)) { + /* Ignore edges out of context. */ + BM_elem_flag_enable(e, BM_ELEM_TAG); + } continue; } + /* Tag to avoid testing again. */ + BM_elem_flag_enable(e, BM_ELEM_TAG); + if (v_cut == -1) { SWAP(BMVert *, va, vb); v_cut = v_cut_other; @@ -900,6 +906,11 @@ bool BM_mesh_intersect_edges( v_other_dest = v_other; } + if (BM_edge_exists(va_dest, v_other_dest)) { + /* No need to detect face. (Optimization). */ + break; + } + best_face = bm_vert_pair_best_face_get( va_dest, v_other_dest, edgenet, edgenet_len, dist); @@ -925,10 +936,11 @@ bool BM_mesh_intersect_edges( BMEdge *e_test = e_net, *e_next = NULL; while ((e_test = BM_DISK_EDGE_NEXT(e_test, v_other)) != (e_net)) { if (!BM_edge_is_wire(e_test)) { - if (BM_elem_flag_test(e, BM_ELEM_TAG)) { + if (BM_elem_flag_test(e_test, BM_ELEM_TAG)) { continue; } - if (BM_elem_index_get(e_test->v1) == -1 && BM_elem_index_get(e_test->v2) == -1) { + if (!BM_elem_flag_test(e_test->v1, BM_ELEM_TAG) && + !BM_elem_flag_test(e_test->v2, BM_ELEM_TAG)) { continue; } } -- cgit v1.2.3