[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