From b84fad2ba3920f3e337dc9084a30f1ea38f39fc2 Mon Sep 17 00:00:00 2001 From: Howard Trickey Date: Fri, 15 Jun 2018 08:48:45 -0400 Subject: Fix T55490, intersect two triangles fails. Need to use the 'use_partial_connect' option in island connect, so changed signatures of various functions to pass that into and then down from BM_mesh_intersect (making true for intersect, false for boolean). Then fix bm_face_split_edgenet_partial_connect to work when input edges are not necessarily wire, but at least not in the face they are being connected in. That caused generalization of core BM_vert_separate_hflag_wire (which is only used in this one place in all Blender). --- release/scripts/addons | 2 +- release/scripts/addons_contrib | 2 +- source/blender/bmesh/intern/bmesh_core.c | 10 ++++------ source/blender/bmesh/intern/bmesh_core.h | 4 ++-- .../blender/bmesh/intern/bmesh_polygon_edgenet.c | 23 ++++++++++++++++------ source/blender/bmesh/tools/bmesh_intersect.c | 8 ++++---- source/blender/bmesh/tools/bmesh_intersect.h | 2 +- source/blender/editors/mesh/editmesh_intersect.c | 4 ++-- source/blender/modifiers/intern/MOD_boolean.c | 1 + source/tools | 2 +- 10 files changed, 34 insertions(+), 24 deletions(-) diff --git a/release/scripts/addons b/release/scripts/addons index ebd058d7a64..9ae033c49c1 160000 --- a/release/scripts/addons +++ b/release/scripts/addons @@ -1 +1 @@ -Subproject commit ebd058d7a6438d137522063bb3286c8acc325ca6 +Subproject commit 9ae033c49c1b16718eac6306bdc271a5e6e6bf38 diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib index 47470215783..f178e6c933a 160000 --- a/release/scripts/addons_contrib +++ b/release/scripts/addons_contrib @@ -1 +1 @@ -Subproject commit 474702157831f1a58bb50f5240ab8b1b02b6ba37 +Subproject commit f178e6c933a25c621a5cc7d92935b66cd2ec2f5d diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c index c6836187eee..97f1bad08b7 100644 --- a/source/blender/bmesh/intern/bmesh_core.c +++ b/source/blender/bmesh/intern/bmesh_core.c @@ -2508,19 +2508,17 @@ void BM_vert_separate_hflag( } } -void BM_vert_separate_wire_hflag( +void BM_vert_separate_tested_edges( BMesh *UNUSED(bm), BMVert *v_dst, BMVert *v_src, - const char hflag) + bool (*testfn)(BMEdge *, void *arg), void *arg) { LinkNode *edges_hflag = NULL; BMEdge *e_iter, *e_first; e_iter = e_first = v_src->e; do { - if (BM_elem_flag_test(e_iter, hflag)) { - if (BM_edge_is_wire(e_iter)) { - BLI_linklist_prepend_alloca(&edges_hflag, e_iter); - } + if (testfn(e_iter, arg)) { + BLI_linklist_prepend_alloca(&edges_hflag, e_iter); } } while ((e_iter = BM_DISK_EDGE_NEXT(e_iter, v_src)) != e_first); diff --git a/source/blender/bmesh/intern/bmesh_core.h b/source/blender/bmesh/intern/bmesh_core.h index fb6b66809f3..93bb12fe742 100644 --- a/source/blender/bmesh/intern/bmesh_core.h +++ b/source/blender/bmesh/intern/bmesh_core.h @@ -81,9 +81,9 @@ void BM_vert_separate( void BM_vert_separate_hflag( BMesh *bm, BMVert *v, const char hflag, const bool copy_select, BMVert ***r_vout, int *r_vout_len); -void BM_vert_separate_wire_hflag( +void BM_vert_separate_tested_edges( BMesh *bm, BMVert *v_dst, BMVert *v_src, - const char hflag); + bool (*testfn)(BMEdge *, void *arg), void *arg); /** * BMesh Kernel: For modifying structure. diff --git a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c index 85dfd3f58e2..4703dbf3bcd 100644 --- a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c +++ b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c @@ -1050,6 +1050,16 @@ static int bm_face_split_edgenet_find_connection( */ #ifdef USE_PARTIAL_CONNECT +/** + * Used to identify edges that get split off when making island from partial connection. + * fptr should be a BMFace*, but is a void* for general interface to BM_vert_separate_tested_edges + */ +static bool test_tagged_and_notface(BMEdge *e, void *fptr) +{ + BMFace *f = (BMFace *)fptr; + return BM_elem_flag_test(e, BM_ELEM_INTERNAL_TAG) && !BM_edge_in_face(e, f); +} + /** * Split vertices which are part of a partial connection * (only a single vertex connecting an island). @@ -1058,7 +1068,7 @@ static int bm_face_split_edgenet_find_connection( * This function leaves all the flags set as well. * */ -static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimit) +static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimit, BMFace *f) { /* -------------------------------------------------------------------- */ /* Initial check that we may be a delimiting vert (keep this fast) */ @@ -1084,7 +1094,7 @@ static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimi BLI_assert(BM_elem_flag_test(BM_edge_other_vert(e_iter, v_delimit), VERT_NOT_IN_STACK)); BLI_linklist_prepend_alloca(&e_delimit_list, e_iter); e_delimit_list_len++; - if (e_iter->l != NULL) { + if (e_iter->l != NULL && BM_edge_in_face(e_iter, f)) { e_face_init = e_iter; } } @@ -1133,7 +1143,7 @@ static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimi bool is_delimit = false; FOREACH_VERT_EDGE(v_delimit, e_iter, { BMVert *v_step = BM_edge_other_vert(e_iter, v_delimit); - if (BM_elem_flag_test(v_step, VERT_NOT_IN_STACK) && BM_edge_is_wire(e_iter)) { + if (BM_elem_flag_test(v_step, VERT_NOT_IN_STACK) && !BM_edge_in_face(e_iter, f)) { is_delimit = true; /* if one vertex is valid - we have a mix */ } else { @@ -1148,7 +1158,7 @@ static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimi BMVert *v_split = NULL; if (is_delimit) { v_split = BM_vert_create(bm, v_delimit->co, NULL, 0); - BM_vert_separate_wire_hflag(bm, v_split, v_delimit, EDGE_NOT_IN_STACK); + BM_vert_separate_tested_edges(bm, v_split, v_delimit, test_tagged_and_notface, f); BM_elem_flag_enable(v_split, VERT_NOT_IN_STACK); BLI_assert(v_delimit->e != NULL); @@ -1224,6 +1234,7 @@ bool BM_face_split_edgenet_connect_islands( const uint edge_arr_len = (uint)edge_net_init_len + (uint)f->len; BMEdge **edge_arr = BLI_array_alloca(edge_arr, edge_arr_len); bool ok = false; + uint edge_net_new_len = (uint)edge_net_init_len; memcpy(edge_arr, edge_net_init, sizeof(*edge_arr) * (size_t)edge_net_init_len); @@ -1272,7 +1283,7 @@ bool BM_face_split_edgenet_connect_islands( BMVert *v_other; /* note, remapping will _never_ map a vertex to an already mapped vertex */ - while (UNLIKELY((v_other = bm_face_split_edgenet_partial_connect(bm, v_delimit)))) { + while (UNLIKELY((v_other = bm_face_split_edgenet_partial_connect(bm, v_delimit, f)))) { struct TempVertPair *tvp = BLI_memarena_alloc(mem_arena, sizeof(*tvp)); tvp->next = temp_vert_pairs.list; tvp->v_orig = v_delimit; @@ -1509,7 +1520,7 @@ bool BM_face_split_edgenet_connect_islands( /* Create connections between groups */ /* may be an over-alloc, but not by much */ - uint edge_net_new_len = (uint)edge_net_init_len + ((group_arr_len - 1) * 2); + edge_net_new_len = (uint)edge_net_init_len + ((group_arr_len - 1) * 2); BMEdge **edge_net_new = BLI_memarena_alloc(mem_arena, sizeof(*edge_net_new) * edge_net_new_len); memcpy(edge_net_new, edge_net_init, sizeof(*edge_net_new) * (size_t)edge_net_init_len); diff --git a/source/blender/bmesh/tools/bmesh_intersect.c b/source/blender/bmesh/tools/bmesh_intersect.c index acadb663810..88467e60dc0 100644 --- a/source/blender/bmesh/tools/bmesh_intersect.c +++ b/source/blender/bmesh/tools/bmesh_intersect.c @@ -243,7 +243,7 @@ static void face_edges_add( #ifdef USE_NET static void face_edges_split( BMesh *bm, BMFace *f, struct LinkBase *e_ls_base, - bool use_island_connect, + bool use_island_connect, bool use_partial_connect, MemArena *mem_arena_edgenet) { uint i; @@ -268,7 +268,7 @@ static void face_edges_split( if (BM_face_split_edgenet_connect_islands( bm, f, edge_arr, edge_arr_len, - false, + use_partial_connect, mem_arena_edgenet, &edge_arr_holes, &edge_arr_holes_len)) { @@ -986,7 +986,7 @@ bool BM_mesh_intersect( struct BMLoop *(*looptris)[3], const int looptris_tot, int (*test_fn)(BMFace *f, void *user_data), void *user_data, const bool use_self, const bool use_separate, const bool use_dissolve, const bool use_island_connect, - const bool use_edge_tag, const int boolean_mode, + const bool use_partial_connect, const bool use_edge_tag, const int boolean_mode, const float eps) { struct ISectState s; @@ -1501,7 +1501,7 @@ bool BM_mesh_intersect( BLI_assert(BM_elem_index_get(f) == f_index); - face_edges_split(bm, f, e_ls_base, use_island_connect, mem_arena_edgenet); + face_edges_split(bm, f, e_ls_base, use_island_connect, use_partial_connect, mem_arena_edgenet); BLI_memarena_clear(mem_arena_edgenet); } diff --git a/source/blender/bmesh/tools/bmesh_intersect.h b/source/blender/bmesh/tools/bmesh_intersect.h index 51926a01710..82910a5df80 100644 --- a/source/blender/bmesh/tools/bmesh_intersect.h +++ b/source/blender/bmesh/tools/bmesh_intersect.h @@ -30,7 +30,7 @@ bool BM_mesh_intersect( struct BMLoop *(*looptris)[3], const int looptris_tot, int (*test_fn)(BMFace *f, void *user_data), void *user_data, const bool use_self, const bool use_separate, const bool use_dissolve, const bool use_island_connect, - const bool use_edge_tag, const int boolean_mode, + const bool use_partial_connect, const bool use_edge_tag, const int boolean_mode, const float eps); enum { diff --git a/source/blender/editors/mesh/editmesh_intersect.c b/source/blender/editors/mesh/editmesh_intersect.c index d681d904e74..86b1a58dd1e 100644 --- a/source/blender/editors/mesh/editmesh_intersect.c +++ b/source/blender/editors/mesh/editmesh_intersect.c @@ -191,7 +191,7 @@ static int edbm_intersect_exec(bContext *C, wmOperator *op) bm, em->looptris, em->tottri, test_fn, NULL, - use_self, use_separate_all, true, true, true, + use_self, use_separate_all, true, true, true, true, -1, eps); @@ -281,7 +281,7 @@ static int edbm_intersect_boolean_exec(bContext *C, wmOperator *op) bm, em->looptris, em->tottri, test_fn, NULL, - false, false, true, true, true, + false, false, true, true, false, true, boolean_operation, eps); diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c index 1f683f52122..8644d9fd203 100644 --- a/source/blender/modifiers/intern/MOD_boolean.c +++ b/source/blender/modifiers/intern/MOD_boolean.c @@ -310,6 +310,7 @@ static DerivedMesh *applyModifier( use_dissolve, use_island_connect, false, + false, bmd->operation, bmd->double_threshold); diff --git a/source/tools b/source/tools index 48736838d42..ca3e38d8966 160000 --- a/source/tools +++ b/source/tools @@ -1 +1 @@ -Subproject commit 48736838d421447d5e4d67ccd59bf1d22dcc85d9 +Subproject commit ca3e38d89666c422d6681bb06967a59ef1a4a7df -- cgit v1.2.3