From 9dbe9a753a54cad83f94ef295b7a8b4350ab9783 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 10 Jul 2020 16:50:26 +0200 Subject: Fix T78766: Blender crashes after deleting vertices with Custom Normals. Some core BMesh topology changing functions were not properly tagging custom normal runtime caches as dirty... --- source/blender/bmesh/intern/bmesh_core.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'source/blender') diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c index 35fb698eac1..4e9775bcfa7 100644 --- a/source/blender/bmesh/intern/bmesh_core.c +++ b/source/blender/bmesh/intern/bmesh_core.c @@ -101,6 +101,7 @@ BMVert *BM_vert_create(BMesh *bm, /* may add to middle of the pool */ bm->elem_index_dirty |= BM_VERT; bm->elem_table_dirty |= BM_VERT; + bm->spacearr_dirty |= BM_SPACEARR_DIRTY_ALL; bm->totvert++; @@ -190,6 +191,7 @@ BMEdge *BM_edge_create( /* may add to middle of the pool */ bm->elem_index_dirty |= BM_EDGE; bm->elem_table_dirty |= BM_EDGE; + bm->spacearr_dirty |= BM_SPACEARR_DIRTY_ALL; bm->totedge++; @@ -259,6 +261,7 @@ static BMLoop *bm_loop_create(BMesh *bm, /* may add to middle of the pool */ bm->elem_index_dirty |= BM_LOOP; + bm->spacearr_dirty |= BM_SPACEARR_DIRTY_ALL; bm->totloop++; @@ -402,6 +405,7 @@ BLI_INLINE BMFace *bm_face_create__internal(BMesh *bm) /* may add to middle of the pool */ bm->elem_index_dirty |= BM_FACE; bm->elem_table_dirty |= BM_FACE; + bm->spacearr_dirty |= BM_SPACEARR_DIRTY_ALL; bm->totface++; @@ -748,6 +752,7 @@ static void bm_kill_only_vert(BMesh *bm, BMVert *v) bm->totvert--; bm->elem_index_dirty |= BM_VERT; bm->elem_table_dirty |= BM_VERT; + bm->spacearr_dirty |= BM_SPACEARR_DIRTY_ALL; BM_select_history_remove(bm, v); @@ -770,6 +775,7 @@ static void bm_kill_only_edge(BMesh *bm, BMEdge *e) bm->totedge--; bm->elem_index_dirty |= BM_EDGE; bm->elem_table_dirty |= BM_EDGE; + bm->spacearr_dirty |= BM_SPACEARR_DIRTY_ALL; BM_select_history_remove(bm, (BMElem *)e); @@ -796,6 +802,7 @@ static void bm_kill_only_face(BMesh *bm, BMFace *f) bm->totface--; bm->elem_index_dirty |= BM_FACE; bm->elem_table_dirty |= BM_FACE; + bm->spacearr_dirty |= BM_SPACEARR_DIRTY_ALL; BM_select_history_remove(bm, (BMElem *)f); @@ -817,6 +824,8 @@ static void bm_kill_only_loop(BMesh *bm, BMLoop *l) { bm->totloop--; bm->elem_index_dirty |= BM_LOOP; + bm->spacearr_dirty |= BM_SPACEARR_DIRTY_ALL; + if (l->head.data) { CustomData_bmesh_free_block(&bm->ldata, &l->head.data); } -- cgit v1.2.3