Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/bmesh/intern/bmesh_log.c37
-rw-r--r--source/blender/bmesh/intern/bmesh_log.h3
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_undo.c19
3 files changed, 57 insertions, 2 deletions
diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c
index f7c2b7d7fe6..d9bbb5c421d 100644
--- a/source/blender/bmesh/intern/bmesh_log.c
+++ b/source/blender/bmesh/intern/bmesh_log.c
@@ -67,6 +67,7 @@ struct BMLogEntry {
/* Vertices whose coordinates, mask value, or hflag have changed */
GHash *modified_verts;
+ GHash *modified_faces;
BLI_mempool *pool_verts;
BLI_mempool *pool_faces;
@@ -120,6 +121,7 @@ typedef struct {
typedef struct {
unsigned int v_ids[3];
+ char hflag;
} BMLogFace;
/************************* Get/set element IDs ************************/
@@ -234,6 +236,7 @@ static BMLogFace *bm_log_face_alloc(BMLog *log, BMFace *f)
lf->v_ids[1] = bm_log_vert_id_get(log, v[1]);
lf->v_ids[2] = bm_log_vert_id_get(log, v[2]);
+ lf->hflag = f->head.hflag;
return lf;
}
@@ -341,6 +344,19 @@ static void bm_log_vert_values_swap(BMesh *bm, BMLog *log, GHash *verts)
}
}
+static void bm_log_face_values_swap(BMLog *log, GHash *faces)
+{
+ GHashIterator gh_iter;
+ GHASH_ITER (gh_iter, faces) {
+ void *key = BLI_ghashIterator_getKey(&gh_iter);
+ BMLogFace *lf = BLI_ghashIterator_getValue(&gh_iter);
+ unsigned int id = GET_UINT_FROM_POINTER(key);
+ BMFace *f = bm_log_face_from_id(log, id);
+
+ SWAP(char, f->head.hflag, lf->hflag);
+ }
+}
+
/**********************************************************************/
@@ -374,6 +390,7 @@ static BMLogEntry *bm_log_entry_create(void)
entry->added_verts = BLI_ghash_ptr_new(__func__);
entry->added_faces = BLI_ghash_ptr_new(__func__);
entry->modified_verts = BLI_ghash_ptr_new(__func__);
+ entry->modified_faces = BLI_ghash_ptr_new(__func__);
entry->pool_verts = BLI_mempool_create(sizeof(BMLogVert), 0, 64, BLI_MEMPOOL_NOP);
entry->pool_faces = BLI_mempool_create(sizeof(BMLogFace), 0, 64, BLI_MEMPOOL_NOP);
@@ -391,6 +408,7 @@ static void bm_log_entry_free(BMLogEntry *entry)
BLI_ghash_free(entry->added_verts, NULL, NULL);
BLI_ghash_free(entry->added_faces, NULL, NULL);
BLI_ghash_free(entry->modified_verts, NULL, NULL);
+ BLI_ghash_free(entry->modified_faces, NULL, NULL);
BLI_mempool_destroy(entry->pool_verts);
BLI_mempool_destroy(entry->pool_faces);
@@ -706,6 +724,7 @@ void BM_log_undo(BMesh *bm, BMLog *log)
/* Restore vertex coordinates, mask, and hflag */
bm_log_vert_values_swap(bm, log, entry->modified_verts);
+ bm_log_face_values_swap(log, entry->modified_faces);
}
}
@@ -742,6 +761,7 @@ void BM_log_redo(BMesh *bm, BMLog *log)
/* Restore vertex coordinates, mask, and hflag */
bm_log_vert_values_swap(bm, log, entry->modified_verts);
+ bm_log_face_values_swap(log, entry->modified_faces);
}
}
@@ -785,6 +805,7 @@ void BM_log_vert_before_modified(BMLog *log, BMVert *v, const int cd_vert_mask_o
}
}
+
/* Log a new vertex as added to the BMesh
*
* The new vertex gets a unique ID assigned. It is then added to a map
@@ -802,6 +823,22 @@ void BM_log_vert_added(BMLog *log, BMVert *v, const int cd_vert_mask_offset)
BLI_ghash_insert(log->current_entry->added_verts, key, lv);
}
+
+/* Log a face before it is modified
+ *
+ * This is intended to handle only header flags and we always
+ * assume face has been added before
+ */
+void BM_log_face_modified(BMLog *log, BMFace *f)
+{
+ BMLogFace *lf;
+ unsigned int f_id = bm_log_face_id_get(log, f);
+ void *key = SET_UINT_IN_POINTER(f_id);
+
+ lf = bm_log_face_alloc(log, f);
+ BLI_ghash_insert(log->current_entry->modified_faces, key, lf);
+}
+
/* Log a new face as added to the BMesh
*
* The new face gets a unique ID assigned. It is then added to a map
diff --git a/source/blender/bmesh/intern/bmesh_log.h b/source/blender/bmesh/intern/bmesh_log.h
index dab17268d96..7a26506439f 100644
--- a/source/blender/bmesh/intern/bmesh_log.h
+++ b/source/blender/bmesh/intern/bmesh_log.h
@@ -66,6 +66,9 @@ void BM_log_vert_before_modified(BMLog *log, struct BMVert *v, const int cd_vert
/* 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);
+/* Log a face before it is modified */
+void BM_log_face_modified(BMLog *log, struct BMFace *f);
+
/* Log a new face as added to the BMesh */
void BM_log_face_added(BMLog *log, struct BMFace *f);
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index 90e26f03b2e..673e4d90d99 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -280,7 +280,7 @@ static void sculpt_undo_bmesh_restore_generic(bContext *C,
unode->applied = true;
}
- if (unode->type == SCULPT_UNDO_MASK) {
+ if (ELEM(unode->type, SCULPT_UNDO_MASK, SCULPT_UNDO_MASK)) {
int i, totnode;
PBVHNode **nodes;
@@ -756,7 +756,6 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob,
if (node) {
switch (type) {
case SCULPT_UNDO_COORDS:
- case SCULPT_UNDO_HIDDEN:
case SCULPT_UNDO_MASK:
/* Before any vertex values get modified, ensure their
* original positions are logged */
@@ -766,6 +765,22 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob,
BKE_pbvh_vertex_iter_end;
break;
+ case SCULPT_UNDO_HIDDEN:
+ {
+ GSetIterator gs_iter;
+ GSet *faces = BKE_pbvh_bmesh_node_faces(node);
+ BKE_pbvh_vertex_iter_begin(ss->pbvh, node, vd, PBVH_ITER_ALL) {
+ BM_log_vert_before_modified(ss->bm_log, vd.bm_vert, vd.cd_vert_mask_offset);
+ }
+ BKE_pbvh_vertex_iter_end;
+
+ GSET_ITER (gs_iter, faces) {
+ BMFace *f = BLI_gsetIterator_getKey(&gs_iter);
+ BM_log_face_modified(ss->bm_log, f);
+ }
+ break;
+ }
+
case SCULPT_UNDO_DYNTOPO_BEGIN:
case SCULPT_UNDO_DYNTOPO_END:
case SCULPT_UNDO_DYNTOPO_SYMMETRIZE: