diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-01-16 07:26:16 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-01-16 07:31:54 +0300 |
commit | 7c4803367f5992f6f52e6960b3de3818b3bbd607 (patch) | |
tree | a7bea9b3501dd8791ad4af1fb33b6169716e700c /source/blender/bmesh | |
parent | beaa66bb13a5d801ec10957922b2d90e04ca5d7c (diff) |
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.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_inline.h | 10 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_removedoubles.c | 4 |
2 files changed, 12 insertions, 2 deletions
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); |