[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