[Bf-blender-cvs] [155fa374eb3] sculpt-dev: sculpt-dev: Add face corner color attribute support to dyntopo undo
Joseph Eagar
noreply at git.blender.org
Mon Feb 6 11:40:37 CET 2023
Commit: 155fa374eb3bac338835c7e23e89a2fe8b2c2589
Author: Joseph Eagar
Date: Mon Feb 6 02:40:12 2023 -0800
Branches: sculpt-dev
https://developer.blender.org/rB155fa374eb3bac338835c7e23e89a2fe8b2c2589
sculpt-dev: Add face corner color attribute support to dyntopo undo
===================================================================
M source/blender/bmesh/intern/bmesh_log.cc
M source/blender/editors/sculpt_paint/sculpt_undo.c
===================================================================
diff --git a/source/blender/bmesh/intern/bmesh_log.cc b/source/blender/bmesh/intern/bmesh_log.cc
index 51ac12ec526..adc22c599a4 100644
--- a/source/blender/bmesh/intern/bmesh_log.cc
+++ b/source/blender/bmesh/intern/bmesh_log.cc
@@ -221,7 +221,7 @@ struct BMLogSetDiff : public BMLogSetBase {
void remove_edge(BMesh *bm, BMEdge *e);
void modify_edge(BMesh *bm, BMEdge *e);
void add_face(BMesh *bm, BMFace *f);
- void remove_face(BMesh *bm, BMFace *f);
+ void remove_face(BMesh *bm, BMFace *f, bool no_check = false);
void modify_face(BMesh *bm, BMFace *f);
void undo(BMesh *bm, BMLogCallbacks *callbacks) override;
@@ -529,6 +529,23 @@ struct BMLogEntry {
CustomData_bmesh_swap_data(&pdata, &bm->pdata, lf->customdata, &f->head.data);
}
+ if (f->len != lf->verts.size()) {
+ printf("%s: error: wrong length for face, was %d, should be %d\n",
+ __func__,
+ f->len,
+ lf->verts.size());
+ return;
+ }
+
+ if (lf->loop_customdata[0]) {
+ BMLoop *l = f->l_first;
+
+ int i = 0;
+ do {
+ CustomData_bmesh_swap_data(&ldata, &bm->ldata, lf->loop_customdata[i], &l->head.data);
+ i++;
+ } while ((l = l->next) != f->l_first);
+ }
std::swap(f->head.hflag, lf->flag);
}
@@ -682,9 +699,9 @@ struct BMLogEntry {
{
current_diff_set(bm)->add_face(bm, f);
}
- void remove_face(BMesh *bm, BMFace *f)
+ void remove_face(BMesh *bm, BMFace *f, bool no_check = false)
{
- current_diff_set(bm)->remove_face(bm, f);
+ current_diff_set(bm)->remove_face(bm, f, no_check);
}
void modify_face(BMesh *bm, BMFace *f)
{
@@ -856,10 +873,10 @@ struct BMLog {
current_entry->add_face(bm, f);
}
- void remove_face(BMesh *bm, BMFace *f)
+ void remove_face(BMesh *bm, BMFace *f, bool no_check = false)
{
ensure_entry(bm);
- current_entry->remove_face(bm, f);
+ current_entry->remove_face(bm, f, no_check);
}
void modify_face(BMesh *bm, BMFace *f)
@@ -1020,11 +1037,11 @@ void BMLogSetDiff::add_face(BMesh *bm, BMFace *f)
added_faces.add(id, lf);
}
-ATTR_NO_OPT void BMLogSetDiff::remove_face(BMesh *bm, BMFace *f)
+ATTR_NO_OPT void BMLogSetDiff::remove_face(BMesh *bm, BMFace *f, bool no_check)
{
BMID<BMFace> id = entry->get_elem_id<BMFace>(bm, f);
- if (added_faces.remove(id) || removed_faces.contains(id)) {
+ if (!no_check && (added_faces.remove(id) || removed_faces.contains(id))) {
return;
}
@@ -1508,7 +1525,7 @@ ATTR_NO_OPT void BM_log_face_added(BMesh *bm, BMLog *log, BMFace *f)
{
log->add_face(bm, f);
}
-void BM_log_face_modified(BMesh *bm, BMLog *log, BMFace *f)
+ATTR_NO_OPT void BM_log_face_modified(BMesh *bm, BMLog *log, BMFace *f)
{
log->modify_face(bm, f);
}
@@ -1518,7 +1535,7 @@ void BM_log_face_removed(BMesh *bm, BMLog *log, BMFace *f)
}
void BM_log_face_removed_no_check(BMesh *bm, BMLog *log, BMFace *f)
{
- // XXX
+ log->remove_face(bm, f, true);
}
void BM_log_full_mesh(BMesh *bm, BMLog *log)
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index 10f85104d82..4cf4cfb9eb1 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -2028,7 +2028,9 @@ void SCULPT_undo_ensure_bmlog(Object *ob)
}
}
-static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, SculptUndoType type)
+ATTR_NO_OPT static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob,
+ PBVHNode *node,
+ SculptUndoType type)
{
UndoSculpt *usculpt = sculpt_undo_get_nodes();
SculptSession *ss = ob->sculpt;
@@ -2116,12 +2118,35 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Sculpt
}
case SCULPT_UNDO_COLOR: {
- BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
- bm_logstack_push();
- BM_log_vert_before_modified(ss->bm, ss->bm_log, vd.bm_vert);
- bm_logstack_pop();
+ Mesh *mesh = BKE_object_get_original_mesh(ob);
+ CustomDataLayer *color_layer = BKE_id_attributes_active_color_get(&mesh->id);
+ if (!color_layer) {
+ break;
+ }
+ eAttrDomain domain = BKE_id_attribute_domain(&mesh->id, color_layer);
+
+ switch (domain) {
+ case ATTR_DOMAIN_POINT: {
+ BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
+ bm_logstack_push();
+ BM_log_vert_before_modified(ss->bm, ss->bm_log, vd.bm_vert);
+ bm_logstack_pop();
+ }
+ BKE_pbvh_vertex_iter_end;
+ break;
+ }
+ case ATTR_DOMAIN_CORNER: {
+ TableGSet *faces = BKE_pbvh_bmesh_node_faces(node);
+ BMFace *f;
+
+ TGSET_ITER (f, faces) {
+ BM_log_face_modified(ss->bm, ss->bm_log, f);
+ }
+ TGSET_ITER_END
+
+ break;
+ }
}
- BKE_pbvh_vertex_iter_end;
break;
}
case SCULPT_UNDO_FACE_SETS: {
More information about the Bf-blender-cvs
mailing list