[Bf-blender-cvs] [54ddb01299c] temp_bmesh_multires: Fixed a variety of memory corruption bugs

Joseph Eagar noreply at git.blender.org
Thu Oct 29 12:28:22 CET 2020


Commit: 54ddb01299ccc7b6d3a843301ef0c4160ad447f0
Author: Joseph Eagar
Date:   Thu Oct 29 04:28:03 2020 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB54ddb01299ccc7b6d3a843301ef0c4160ad447f0

Fixed a variety of memory corruption bugs

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

M	source/blender/blenlib/intern/BLI_ghash_utils.c
M	source/blender/bmesh/intern/bmesh_log.c
M	source/blender/bmesh/intern/bmesh_log.h
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_dyntopo.c
M	source/blender/editors/sculpt_paint/sculpt_undo.c

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

diff --git a/source/blender/blenlib/intern/BLI_ghash_utils.c b/source/blender/blenlib/intern/BLI_ghash_utils.c
index 96bc1024e54..d6545702b2c 100644
--- a/source/blender/blenlib/intern/BLI_ghash_utils.c
+++ b/source/blender/blenlib/intern/BLI_ghash_utils.c
@@ -387,14 +387,16 @@ void BLI_table_gset_remove(TableGSet *ts, void *elem, GHashKeyFreeFP freefp)
     return;
   }
 
+  int idx2 = *idx;
+
   BLI_ghash_remove(ts->ptr_to_idx, elem, freefp, NULL);
 
-  if (!ts->elems || ts->elems[*idx] != elem) {
+  if (!ts->elems || ts->elems[idx2] != elem) {
     return;
   }
 
   ts->length--;
-  ts->elems[*idx] = NULL;
+  ts->elems[idx2] = NULL;
 }
 
 bool BLI_table_gset_haskey(TableGSet *ts, void *elem)
diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c
index 1c543c24379..2935a5786e1 100644
--- a/source/blender/bmesh/intern/bmesh_log.c
+++ b/source/blender/bmesh/intern/bmesh_log.c
@@ -113,6 +113,10 @@ struct BMLog {
    * entries have been applied (i.e. there is nothing left to redo.)
    */
   BMLogEntry *current_entry;
+
+  int cd_origco_offset;
+  int cd_origno_offset;
+  int cd_origvcol_offset;
 };
 
 typedef struct {
@@ -252,7 +256,10 @@ static void vert_mask_set(BMVert *v, const float new_mask, const int cd_vert_mas
 }
 
 /* Update a BMLogVert with data from a BMVert */
-static void bm_log_vert_bmvert_copy(BMLog *log, BMLogVert *lv, BMVert *v, const int cd_vert_mask_offset)
+static void bm_log_vert_bmvert_copy(BMLog *log,
+                                    BMLogVert *lv,
+                                    BMVert *v,
+                                    const int cd_vert_mask_offset)
 {
   copy_v3_v3(lv->co, v->co);
   normal_float_to_short_v3(lv->no, v->no);
@@ -345,6 +352,7 @@ static void bm_log_faces_unmake(BMesh *bm, BMLog *log, GHash *faces)
 static void bm_log_verts_restore(BMesh *bm, BMLog *log, GHash *verts, BMLogEntry *entry)
 {
   const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK);
+  int cd_vcol_offset = CustomData_get_offset(&bm->vdata, CD_PROP_COLOR);
 
   GHashIterator gh_iter;
   GHASH_ITER (gh_iter, verts) {
@@ -358,9 +366,25 @@ static void bm_log_verts_restore(BMesh *bm, BMLog *log, GHash *verts, BMLogEntry
 
 #ifdef CUSTOMDATA
     if (lv->customdata) {
-      CustomData_bmesh_copy_data(&bm->vdata, &entry->vdata, lv->customdata, &v->head.data);
+      CustomData_bmesh_copy_data(&entry->vdata, &bm->vdata, lv->customdata, &v->head.data);
     }
 #endif
+
+    if (log->cd_origco_offset >= 0) {
+      float *oco = BM_ELEM_CD_GET_VOID_P(v, log->cd_origco_offset);
+      copy_v3_v3(oco, v->co);
+    }
+
+    if (log->cd_origno_offset >= 0) {
+      float *ono = BM_ELEM_CD_GET_VOID_P(v, log->cd_origno_offset);
+      copy_v3_v3(ono, v->no);
+    }
+
+    if (log->cd_origvcol_offset >= 0) {
+      float *ocolor = BM_ELEM_CD_GET_VOID_P(v, log->cd_origvcol_offset);
+      float *color = BM_ELEM_CD_GET_VOID_P(v, cd_vcol_offset);
+      copy_v3_v3(ocolor, color);
+    }
   }
 }
 
@@ -387,6 +411,8 @@ static void bm_log_vert_values_swap(BMesh *bm, BMLog *log, GHash *verts, BMLogEn
 {
   const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK);
 
+  int cd_vcol_offset = CustomData_get_offset(&bm->vdata, CD_PROP_COLOR);
+
   GHashIterator gh_iter;
   GHASH_ITER (gh_iter, verts) {
     void *key = BLI_ghashIterator_getKey(&gh_iter);
@@ -407,9 +433,26 @@ static void bm_log_vert_values_swap(BMesh *bm, BMLog *log, GHash *verts, BMLogEn
 
 #ifdef CUSTOMDATA
     if (lv->customdata) {
-      CustomData_bmesh_copy_data(&bm->vdata, &entry->vdata, lv->customdata, &v->head.data);
+      CustomData_bmesh_copy_data(&entry->vdata, &bm->vdata, lv->customdata, &v->head.data);
     }
 #endif
+
+    if (log->cd_origco_offset >= 0) {
+      float *oco = BM_ELEM_CD_GET_VOID_P(v, log->cd_origco_offset);
+      copy_v3_v3(oco, v->co);
+    }
+
+    if (log->cd_origno_offset >= 0) {
+      float *ono = BM_ELEM_CD_GET_VOID_P(v, log->cd_origno_offset);
+      copy_v3_v3(ono, v->no);
+    }
+
+    if (log->cd_origvcol_offset >= 0) {
+      float *ocolor = BM_ELEM_CD_GET_VOID_P(v, log->cd_origvcol_offset);
+      float *color = BM_ELEM_CD_GET_VOID_P(v, cd_vcol_offset);
+      copy_v3_v3(ocolor, color);
+    }
+
   }
 }
 
@@ -539,8 +582,18 @@ static void bm_log_id_ghash_release(BMLog *log, GHash *id_ghash)
 
 /***************************** Public API *****************************/
 
+void BM_log_set_cd_offsets(BMLog *log,
+                           int cd_origco_offset,
+                           int cd_origno_offset,
+                           int cd_origvol_offset)
+{
+  log->cd_origco_offset = cd_origco_offset;
+  log->cd_origno_offset = cd_origno_offset;
+  log->cd_origvcol_offset = cd_origvol_offset;
+}
+
 /* Allocate, initialize, and assign a new BMLog */
-BMLog *BM_log_create(BMesh *bm)
+BMLog *BM_log_create(BMesh *bm, int cd_origco_offset, int cd_origno_offset, int cd_origvcol_offset)
 {
   BMLog *log = MEM_callocN(sizeof(*log), __func__);
   const uint reserve_num = (uint)(bm->totvert + bm->totface);
@@ -549,6 +602,8 @@ BMLog *BM_log_create(BMesh *bm)
   log->id_to_elem = BLI_ghash_new_ex(logkey_hash, logkey_cmp, __func__, reserve_num);
   log->elem_to_id = BLI_ghash_ptr_new_ex(__func__, reserve_num);
 
+  BM_log_set_cd_offsets(log, cd_origco_offset, cd_origno_offset, cd_origvcol_offset);
+
   /* Assign IDs to all existing vertices and faces */
   bm_log_assign_ids(bm, log);
 
@@ -587,7 +642,7 @@ void BM_log_cleanup_entry(BMLogEntry *entry)
  */
 BMLog *BM_log_from_existing_entries_create(BMesh *bm, BMLogEntry *entry)
 {
-  BMLog *log = BM_log_create(bm);
+  BMLog *log = BM_log_create(bm, -1, -1, -1);
 
   if (entry->prev) {
     log->current_entry = entry;
@@ -884,6 +939,9 @@ void BM_log_undo(BMesh *bm, BMLog *log)
 {
   BMLogEntry *entry = log->current_entry;
 
+  bm->elem_index_dirty |= BM_VERT|BM_EDGE|BM_FACE;
+  bm->elem_table_dirty |= BM_VERT|BM_EDGE|BM_FACE;
+
   if (entry) {
     log->current_entry = entry->prev;
 
@@ -908,6 +966,9 @@ void BM_log_redo(BMesh *bm, BMLog *log)
 {
   BMLogEntry *entry = log->current_entry;
 
+  bm->elem_index_dirty |= BM_VERT | BM_EDGE | BM_FACE;
+  bm->elem_table_dirty |= BM_VERT | BM_EDGE | BM_FACE;
+
   if (!entry) {
     /* Currently at the beginning of the undo stack, move to first entry */
     entry = log->entries.first;
@@ -961,7 +1022,10 @@ void BM_log_redo(BMesh *bm, BMLog *log)
  * state so that a subsequent redo operation will restore the newer
  * vertex state.
  */
-void BM_log_vert_before_modified(BMLog *log, BMVert *v, const int cd_vert_mask_offset, bool log_customdata)
+void BM_log_vert_before_modified(BMLog *log,
+                                 BMVert *v,
+                                 const int cd_vert_mask_offset,
+                                 bool log_customdata)
 {
   BMLogEntry *entry = log->current_entry;
   BMLogVert *lv;
@@ -999,7 +1063,7 @@ void BM_log_vert_added(BMLog *log, BMVert *v, const int cd_vert_mask_offset)
   lv = bm_log_vert_alloc(log, v, cd_vert_mask_offset);
   BLI_ghash_insert(log->current_entry->added_verts, key, lv);
 
-  //bm_log_vert_customdata(log->bm, log, v, lv);
+  // bm_log_vert_customdata(log->bm, log, v, lv);
 }
 
 /* Log a face before it is modified
diff --git a/source/blender/bmesh/intern/bmesh_log.h b/source/blender/bmesh/intern/bmesh_log.h
index d560eec4f0b..470515db157 100644
--- a/source/blender/bmesh/intern/bmesh_log.h
+++ b/source/blender/bmesh/intern/bmesh_log.h
@@ -29,7 +29,11 @@ typedef struct BMLog BMLog;
 typedef struct BMLogEntry BMLogEntry;
 
 /* Allocate and initialize a new BMLog */
-BMLog *BM_log_create(BMesh *bm);
+BMLog *BM_log_create(BMesh *bm, int cd_origco_offset, int cd_origno_offset, int cd_origvol_offset);
+void BM_log_set_cd_offsets(BMLog *log,
+                           int cd_origco_offset,
+                           int cd_origno_offset,
+                           int cd_origvcol_offset);
 
 /* Allocate and initialize a new BMLog using existing BMLogEntries */
 BMLog *BM_log_from_existing_entries_create(BMesh *bm, BMLogEntry *entry);
@@ -49,7 +53,7 @@ BMLogEntry *BM_log_entry_add_ex(BMesh *bm, BMLog *log, bool combine_with_last);
 
 BMLogEntry *BM_log_entry_check_customdata(BMesh *bm, BMLog *log);
 
-    /* Mark all used ids as unused for this node */
+/* Mark all used ids as unused for this node */
 void BM_log_cleanup_entry(BMLogEntry *entry);
 
 /* Remove an entry from the log */
@@ -62,7 +66,10 @@ void BM_log_undo(BMesh *bm, BMLog *log);
 void BM_log_redo(BMesh *bm, BMLog *log);
 
 /* Log a vertex before it is modified */
-void BM_log_vert_before_modified(BMLog *log, struct BMVert *v, const int cd_vert_mask_offset, bool log_customdata);
+void BM_log_vert_before_modified(BMLog *log,
+                                 struct BMVert *v,
+                                 const int cd_vert_mask_offset,
+                                 bool log_customdata);
 
 /* Log a new vertex as added to the BMesh */
 void BM_log_vert_added(BMLog *log, struct BMVert *v, const int cd_vert_mask_offset);
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 46c23795585..736a21ec702 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -111,7 +111,7 @@
 
 void SCULPT_vertex_random_access_ensure(SculptSession *ss)
 {
-  if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) {
+  if (ss->bm) {
     BM_mesh_elem_index_ensure(ss->bm, BM_VERT);
     BM_mesh_elem_table_ensure(ss->bm, BM_VERT);
   }
diff --git a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
index ca5125399e5..0867c9b8b43 100644
--- a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
@@ -121,7 +121,7 @@ void SCULPT_dyntopo_save_origverts(SculptSession *ss)
     float *no = BM_ELEM_CD_GET_VOID_P(v, ss->cd_origno_offset);
 
     copy_v3_v3(co, v->co);
-    copy_v3_v3(co, v->no);
+    copy_v3_v3(no, v->no);
   }
 }
 
@@ -189,6 +189,9 @@ void SCULPT_dyntopo_node_layers_add(SculptSession *ss)
         cd_origvcol_index - CustomData_get_layer_index(&ss->bm->vdata, CD_PROP_CO

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list