[Bf-blender-cvs] [2f862bc7b9e] temp_bmesh_multires: Fix more dyntopo sculpt undo memory corruption

Joseph Eagar noreply at git.blender.org
Mon Jul 12 03:15:08 CEST 2021


Commit: 2f862bc7b9e98727980686207440c5dbcdb32c74
Author: Joseph Eagar
Date:   Sun Jul 11 21:14:49 2021 -0400
Branches: temp_bmesh_multires
https://developer.blender.org/rB2f862bc7b9e98727980686207440c5dbcdb32c74

Fix more dyntopo sculpt undo memory corruption

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

M	source/blender/bmesh/intern/bmesh_log.c
M	source/blender/editors/sculpt_paint/sculpt_undo.c

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

diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c
index 1c7bc3934fe..a3086e00fe3 100644
--- a/source/blender/bmesh/intern/bmesh_log.c
+++ b/source/blender/bmesh/intern/bmesh_log.c
@@ -207,6 +207,22 @@ static bool log_ghash_reinsert(
   return ret;
 }
 
+static void bm_log_copy_id(CustomData *cdata, BMElem *elem, void *data)
+{
+  int cd_id = cdata->typemap[CD_MESH_ID];
+
+  if (cd_id >= 0) {
+    cd_id = cdata->layers[cd_id].offset;
+
+    int id = BM_ELEM_CD_GET_INT(elem, cd_id);
+
+    BMElem elem2;
+    elem2.head.data = data;
+
+    BM_ELEM_CD_SET_INT(&elem2, cd_id, id);
+  }
+}
+
 static bool log_ghash_haskey(BMLog *log, GHash *gh, const void *key)
 {
   BLI_rw_mutex_lock(&log->lock, THREAD_LOCK_READ);
@@ -285,6 +301,10 @@ static void bm_log_vert_customdata(
   }
 
   CustomData_bmesh_copy_data(&bm->vdata, &entry->vdata, v->head.data, &lv->customdata);
+
+  // forcibly copy id
+  bm_log_copy_id(&bm->vdata, (BMElem *)v, lv->customdata);
+
 #endif
 }
 
@@ -305,6 +325,9 @@ static void bm_log_face_customdata(BMesh *bm, BMLog *log, BMFace *f, BMLogFace *
 
   CustomData_bmesh_copy_data(&bm->pdata, &entry->pdata, f->head.data, &lf->customdata_f);
 
+  // forcibly copy id
+  bm_log_copy_id(&bm->pdata, (BMElem *)f, lf->customdata_f);
+
   BMLoop *l1 = f->l_first;
   BMLoop *l2 = f->l_first->next;
   BMLoop *l3 = f->l_first->prev;
@@ -473,6 +496,9 @@ static void bm_log_faces_unmake(
 #ifdef CUSTOMDATA
     if (lf->customdata_f) {
       CustomData_bmesh_copy_data(&bm->pdata, &entry->pdata, f->head.data, &lf->customdata_f);
+
+      // forcibly copy id
+      bm_log_copy_id(&bm->pdata, (BMElem *)f, lf->customdata_f);
     }
 
     BMLoop *ls[3] = {f->l_first, f->l_first->next, f->l_first->prev};
@@ -546,13 +572,13 @@ static void bm_log_faces_restore(
     f->head.hflag = lf->hflag;
 
     copy_v3_v3(f->no, lf->no);
-    bm_assign_id(bm, (BMElem *)f, POINTER_AS_UINT(key));
 
-#ifdef CUSTOMDATA
     if (lf->customdata_f) {
       CustomData_bmesh_copy_data(&entry->pdata, &bm->pdata, lf->customdata_f, &f->head.data);
     }
 
+    bm_assign_id(bm, (BMElem *)f, POINTER_AS_UINT(key));
+
     BMLoop *ls[3] = {f->l_first, f->l_first->next, f->l_first->prev};
 
     for (int i = 0; i < 3; i++) {
@@ -565,7 +591,6 @@ static void bm_log_faces_restore(
             &entry->ldata, &bm->ldata, lf->customdata[i], &ls[i]->head.data);
       }
     }
-#endif
 
     if (callbacks) {
       callbacks->on_face_add(f, callbacks->userdata);
@@ -598,7 +623,6 @@ static void bm_log_vert_values_swap(
     lv->mask = vert_mask_get(v, cd_vert_mask_offset);
     vert_mask_set(v, mask, cd_vert_mask_offset);
 
-#ifdef CUSTOMDATA
     void *old_cdata = NULL;
 
     if (lv->customdata) {
@@ -606,13 +630,13 @@ static void bm_log_vert_values_swap(
         old_cdata = scratch;
         memcpy(old_cdata, v->head.data, (size_t)bm->vdata.totsize);
       }
+
       CustomData_bmesh_swap_data(&entry->vdata, &bm->vdata, lv->customdata, &v->head.data);
     }
 
     if (callbacks) {
       callbacks->on_vert_change(v, callbacks->userdata, old_cdata);
     }
-#endif
   }
 
   if (scratch) {
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index db0e15bb453..831ee3a6163 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -504,15 +504,13 @@ static void bmesh_undo_on_vert_change(BMVert *v, void *userdata, void *old_custo
 {
   BmeshUndoData *data = (BmeshUndoData *)userdata;
 
-  if (!old_customdata) {
-    return;
-  }
-
   if (!old_customdata) {
     BM_ELEM_CD_SET_INT(v, data->cd_vert_node_offset, -1);
     return;
   }
 
+  BM_ELEM_CD_SET_INT(v, data->cd_vert_node_offset, -1);
+  return;
   // preserve pbvh node references
 
   BMVert h;
@@ -532,29 +530,8 @@ static void bmesh_undo_on_face_change(BMFace *f, void *userdata, void *old_custo
 {
   BmeshUndoData *data = (BmeshUndoData *)userdata;
 
-  if (old_customdata) {
-    return;
-  }
-
-  if (!old_customdata) {
-    BM_ELEM_CD_SET_INT(f, data->cd_face_node_offset, -1);
-    return;
-  }
-
-  // preserve pbvh node references
-
-  BMFace h;
-  h.head.data = old_customdata;
-
-  int oldnode_i = BM_ELEM_CD_GET_INT(&h, data->cd_face_node_offset);
-
-  BM_ELEM_CD_SET_INT(f, data->cd_face_node_offset, oldnode_i);
-
-  if (oldnode_i > 0) {
-    PBVHNode *node = BKE_pbvh_node_from_index(data->pbvh, oldnode_i);
-
-    BKE_pbvh_node_mark_update(node);
-  }
+  // vert will be added back to pbvh when its owning faces are
+  BM_ELEM_CD_SET_INT(f, data->cd_face_node_offset, -1);
 }
 
 static void sculpt_undo_bmesh_restore_generic(SculptUndoNode *unode, Object *ob, SculptSession *ss)



More information about the Bf-blender-cvs mailing list