[Bf-blender-cvs] [7c4803367f5] master: BMesh: prevent weld-verts bmop creating selected+hidden verts/edges

Campbell Barton noreply at git.blender.org
Wed Jan 16 05:32:05 CET 2019


Commit: 7c4803367f5992f6f52e6960b3de3818b3bbd607
Author: Campbell Barton
Date:   Wed Jan 16 15:26:16 2019 +1100
Branches: master
https://developer.blender.org/rB7c4803367f5992f6f52e6960b3de3818b3bbd607

BMesh: prevent weld-verts bmop creating selected+hidden verts/edges

Related to error exposed by T59640
Would have fixed crash too, but we want to ignore hidden verts.

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

M	source/blender/bmesh/intern/bmesh_inline.h
M	source/blender/bmesh/operators/bmo_removedoubles.c

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

diff --git a/source/blender/bmesh/intern/bmesh_inline.h b/source/blender/bmesh/intern/bmesh_inline.h
index 4b55060875b..db53667e6f1 100644
--- a/source/blender/bmesh/intern/bmesh_inline.h
+++ b/source/blender/bmesh/intern/bmesh_inline.h
@@ -37,6 +37,7 @@
 #define BM_elem_flag_set(      ele, hflag, val) _bm_elem_flag_set      (&(ele)->head, hflag, val)
 #define BM_elem_flag_toggle(   ele, hflag)      _bm_elem_flag_toggle   (&(ele)->head, hflag)
 #define BM_elem_flag_merge(    ele_a, ele_b)    _bm_elem_flag_merge    (&(ele_a)->head, &(ele_b)->head)
+#define BM_elem_flag_merge_ex( ele_a, ele_b, hflag_and)_bm_elem_flag_merge_ex (&(ele_a)->head, &(ele_b)->head, hflag_and)
 #define BM_elem_flag_merge_into(ele, ele_a, ele_b)_bm_elem_flag_merge_into (&(ele)->head, &(ele_a)->head, &(ele_b)->head)
 
 ATTR_WARN_UNUSED_RESULT
@@ -77,6 +78,15 @@ BLI_INLINE void _bm_elem_flag_merge(BMHeader *head_a, BMHeader *head_b)
 	head_a->hflag = head_b->hflag = head_a->hflag | head_b->hflag;
 }
 
+BLI_INLINE void _bm_elem_flag_merge_ex(BMHeader *head_a, BMHeader *head_b, const char hflag_and)
+{
+	if (((head_a->hflag & head_b->hflag) & hflag_and) == 0) {
+		head_a->hflag &= ~hflag_and;
+		head_b->hflag &= ~hflag_and;
+	}
+	_bm_elem_flag_merge(head_a, head_b);
+}
+
 BLI_INLINE void _bm_elem_flag_merge_into(BMHeader *head, const BMHeader *head_a, const BMHeader *head_b)
 {
 	head->hflag = head_a->hflag | head_b->hflag;
diff --git a/source/blender/bmesh/operators/bmo_removedoubles.c b/source/blender/bmesh/operators/bmo_removedoubles.c
index 8468227d17e..a4d67d10806 100644
--- a/source/blender/bmesh/operators/bmo_removedoubles.c
+++ b/source/blender/bmesh/operators/bmo_removedoubles.c
@@ -202,7 +202,7 @@ void bmo_weld_verts_exec(BMesh *bm, BMOperator *op)
 			BMO_vert_flag_enable(bm, v1, ELE_DEL);
 
 			/* merge the vertex flags, else we get randomly selected/unselected verts */
-			BM_elem_flag_merge(v1, v2);
+			BM_elem_flag_merge_ex(v1, v2, BM_ELEM_HIDDEN);
 		}
 	}
 
@@ -231,7 +231,7 @@ void bmo_weld_verts_exec(BMesh *bm, BMOperator *op)
 				if (e_new == NULL) {
 					e_new = BM_edge_create(bm, v1, v2, e, BM_CREATE_NOP);
 				}
-				BM_elem_flag_merge(e_new, e);
+				BM_elem_flag_merge_ex(e_new, e, BM_ELEM_HIDDEN);
 			}
 
 			BMO_edge_flag_enable(bm, e, ELE_DEL);



More information about the Bf-blender-cvs mailing list