[Bf-blender-cvs] [b84fad2ba39] master: Fix T55490, intersect two triangles fails.

Howard Trickey noreply at git.blender.org
Fri Jun 15 14:59:30 CEST 2018


Commit: b84fad2ba3920f3e337dc9084a30f1ea38f39fc2
Author: Howard Trickey
Date:   Fri Jun 15 08:48:45 2018 -0400
Branches: master
https://developer.blender.org/rBb84fad2ba3920f3e337dc9084a30f1ea38f39fc2

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).

===================================================================

M	release/scripts/addons
M	release/scripts/addons_contrib
M	source/blender/bmesh/intern/bmesh_core.c
M	source/blender/bmesh/intern/bmesh_core.h
M	source/blender/bmesh/intern/bmesh_polygon_edgenet.c
M	source/blender/bmesh/tools/bmesh_intersect.c
M	source/blender/bmesh/tools/bmesh_intersect.h
M	source/blender/editors/mesh/editmesh_intersect.c
M	source/blender/modifiers/intern/MOD_boolean.c
M	source/tools

===================================================================

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



More information about the Bf-blender-cvs mailing list