[Bf-blender-cvs] [e2c92c13415] temp_bmesh_multires: More fixes for dyntopo undo and vertices (face data still isn't implemented).

Joseph Eagar noreply at git.blender.org
Tue Oct 27 02:46:38 CET 2020


Commit: e2c92c134159dfab917cbf96ab2641a9db6670c2
Author: Joseph Eagar
Date:   Mon Oct 26 18:46:12 2020 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rBe2c92c134159dfab917cbf96ab2641a9db6670c2

More fixes for dyntopo undo and vertices (face data still isn't
implemented).

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

M	source/blender/blenkernel/intern/pbvh_bmesh.c
M	source/blender/bmesh/intern/bmesh_log.c
M	source/blender/bmesh/intern/bmesh_log.h
M	source/blender/editors/sculpt_paint/sculpt_undo.c

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

diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index 611ba8ec2a1..3d2dddf36c4 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -1792,9 +1792,9 @@ void BKE_pbvh_bmesh_update_origvert(
 {
   float *co = NULL, *no = NULL;
 
-  if (r_co || r_no) {
-    BM_log_vert_before_modified(pbvh->bm_log, v, pbvh->cd_vert_mask_offset);
+  BM_log_vert_before_modified(pbvh->bm_log, v, pbvh->cd_vert_mask_offset, r_color != NULL);
 
+  if (r_co || r_no) {
     co = BM_ELEM_CD_GET_VOID_P(v, pbvh->cd_origco_offset);
     no = BM_ELEM_CD_GET_VOID_P(v, pbvh->cd_origno_offset);
 
diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c
index 1273a2e40df..dcad3e78c99 100644
--- a/source/blender/bmesh/intern/bmesh_log.c
+++ b/source/blender/bmesh/intern/bmesh_log.c
@@ -252,12 +252,14 @@ 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(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);
   lv->mask = vert_mask_get(v, cd_vert_mask_offset);
   lv->hflag = v->head.hflag;
+
+  bm_log_vert_customdata(log->bm, log, v, lv);
 }
 
 /* Allocate and initialize a BMLogVert */
@@ -267,7 +269,7 @@ static BMLogVert *bm_log_vert_alloc(BMLog *log, BMVert *v, const int cd_vert_mas
   BMLogVert *lv = BLI_mempool_alloc(entry->pool_verts);
   lv->customdata = NULL;
 
-  bm_log_vert_bmvert_copy(lv, v, cd_vert_mask_offset);
+  bm_log_vert_bmvert_copy(log, lv, v, cd_vert_mask_offset);
 
   return lv;
 }
@@ -308,7 +310,7 @@ static void bm_log_verts_unmake(BMesh *bm, BMLog *log, GHash *verts)
 
     /* Ensure the log has the final values of the vertex before
      * deleting it */
-    bm_log_vert_bmvert_copy(lv, v, cd_vert_mask_offset);
+    bm_log_vert_bmvert_copy(log, lv, v, cd_vert_mask_offset);
 
     BM_vert_kill(bm, v);
   }
@@ -381,7 +383,7 @@ static void bm_log_faces_restore(BMesh *bm, BMLog *log, GHash *faces)
   }
 }
 
-static void bm_log_vert_values_swap(BMesh *bm, BMLog *log, GHash *verts)
+static void bm_log_vert_values_swap(BMesh *bm, BMLog *log, GHash *verts, BMLogEntry *entry)
 {
   const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK);
 
@@ -402,6 +404,12 @@ static void bm_log_vert_values_swap(BMesh *bm, BMLog *log, GHash *verts)
     mask = lv->mask;
     lv->mask = vert_mask_get(v, cd_vert_mask_offset);
     vert_mask_set(v, mask, cd_vert_mask_offset);
+
+#ifdef CUSTOMDATA
+    if (lv->customdata) {
+      CustomData_bmesh_copy_data(&bm->vdata, &entry->vdata, lv->customdata, &v->head.data);
+    }
+#endif
   }
 }
 
@@ -707,6 +715,8 @@ BMLogEntry *BM_log_entry_check_customdata(BMesh *bm, BMLog *log)
   BMLogEntry *entry = log->current_entry;
 
   if (!entry) {
+    printf("no current entry; creating...\n");
+    fflush(stdout);
     return BM_log_entry_add_ex(bm, log, false);
   }
 
@@ -719,6 +729,8 @@ BMLogEntry *BM_log_entry_check_customdata(BMesh *bm, BMLog *log)
 
   for (int i = 0; i < 4; i++) {
     if (!CustomData_layout_is_same(cd1[i], cd2[i])) {
+      printf("Customdata changed for undo\n");
+      fflush(stdout);
       return BM_log_entry_add_ex(bm, log, true);
     }
   }
@@ -884,7 +896,7 @@ void BM_log_undo(BMesh *bm, BMLog *log)
     bm_log_faces_restore(bm, log, entry->deleted_faces);
 
     /* Restore vertex coordinates, mask, and hflag */
-    bm_log_vert_values_swap(bm, log, entry->modified_verts);
+    bm_log_vert_values_swap(bm, log, entry->modified_verts, entry);
     bm_log_face_values_swap(log, entry->modified_faces);
   }
 }
@@ -921,7 +933,7 @@ void BM_log_redo(BMesh *bm, BMLog *log)
     bm_log_faces_restore(bm, log, entry->added_faces);
 
     /* Restore vertex coordinates, mask, and hflag */
-    bm_log_vert_values_swap(bm, log, entry->modified_verts);
+    bm_log_vert_values_swap(bm, log, entry->modified_verts, entry);
     bm_log_face_values_swap(log, entry->modified_faces);
   }
 }
@@ -949,7 +961,7 @@ 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)
+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;
@@ -959,14 +971,14 @@ void BM_log_vert_before_modified(BMLog *log, BMVert *v, const int cd_vert_mask_o
 
   /* Find or create the BMLogVert entry */
   if ((lv = BLI_ghash_lookup(entry->added_verts, key))) {
-    bm_log_vert_bmvert_copy(lv, v, cd_vert_mask_offset);
+    bm_log_vert_bmvert_copy(log, lv, v, cd_vert_mask_offset);
   }
   else if (!BLI_ghash_ensure_p(entry->modified_verts, key, &val_p)) {
     lv = bm_log_vert_alloc(log, v, cd_vert_mask_offset);
     *val_p = lv;
   }
 
-  if (lv) {
+  if (lv && log_customdata) {
     bm_log_vert_customdata(log->bm, log, v, lv);
   }
 }
@@ -986,6 +998,8 @@ void BM_log_vert_added(BMLog *log, BMVert *v, const int cd_vert_mask_offset)
   bm_log_vert_id_set(log, v, v_id);
   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);
 }
 
 /* Log a face before it is modified
@@ -1064,6 +1078,10 @@ void BM_log_vert_removed(BMLog *log, BMVert *v, const int cd_vert_mask_offset)
       (*lv) = (*lv_mod);
       BLI_ghash_remove(entry->modified_verts, key, NULL, NULL);
     }
+
+    if (lv) {
+      bm_log_vert_customdata(log->bm, log, v, lv);
+    }
   }
 }
 
diff --git a/source/blender/bmesh/intern/bmesh_log.h b/source/blender/bmesh/intern/bmesh_log.h
index 274deeb494f..d560eec4f0b 100644
--- a/source/blender/bmesh/intern/bmesh_log.h
+++ b/source/blender/bmesh/intern/bmesh_log.h
@@ -62,7 +62,7 @@ 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);
+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_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index 5ccf3995da7..436c480ae01 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -116,6 +116,7 @@ typedef struct UndoSculpt {
 } UndoSculpt;
 
 static UndoSculpt *sculpt_undo_get_nodes(void);
+static void sculpt_undo_print_nodes(void *active);
 
 static void update_cb(PBVHNode *node, void *rebuild)
 {
@@ -133,6 +134,8 @@ struct PartialUpdateData {
   char *modified_grids;
 };
 
+static UndoSculpt *sculpt_undosys_step_get_nodes(UndoStep *us_p);
+
 /**
  * A version of #update_cb that tests for 'ME_VERT_PBVH_UPDATE'
  */
@@ -421,7 +424,7 @@ static void sculpt_undo_bmesh_restore_generic(SculptUndoNode *unode, Object *ob,
     unode->applied = true;
   }
 
-  if (unode->type == SCULPT_UNDO_MASK) {
+  if (unode->type == SCULPT_UNDO_MASK || unode->type == SCULPT_UNDO_COLOR) {
     int totnode;
     PBVHNode **nodes;
 
@@ -971,6 +974,7 @@ static SculptUndoNode *sculpt_undo_find_or_alloc_node_type(Object *object, Sculp
   return sculpt_undo_alloc_node_type(object, type);
 }
 
+
 static SculptUndoNode *sculpt_undo_alloc_node(Object *ob, PBVHNode *node, SculptUndoType type)
 {
   UndoSculpt *usculpt = sculpt_undo_get_nodes();
@@ -1173,7 +1177,10 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Sculpt
 
   SculptUndoNode *unode = usculpt->nodes.first;
 
+  bool new_node = false;
+
   if (unode == NULL) {
+    new_node = true;
     unode = MEM_callocN(sizeof(*unode), __func__);
 
     BLI_strncpy(unode->idname, ob->id.name, sizeof(unode->idname));
@@ -1216,8 +1223,8 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Sculpt
         BKE_pbvh_vertex_iter_begin(ss->pbvh, node, vd, PBVH_ITER_ALL)
         {
           void *dummy;
-          //BKE_pbvh_bmesh_update_origvert(ss->pbvh, vd.bm_vert, &dummy, &dummy, &dummy);
-          BM_log_vert_before_modified(ss->bm_log, vd.bm_vert, vd.cd_vert_mask_offset);
+          // BKE_pbvh_bmesh_update_origvert(ss->pbvh, vd.bm_vert, &dummy, &dummy, &dummy);
+          BM_log_vert_before_modified(ss->bm_log, vd.bm_vert, vd.cd_vert_mask_offset, false);
         }
         BKE_pbvh_vertex_iter_end;
         break;
@@ -1228,7 +1235,8 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Sculpt
 
         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);
+          BM_log_vert_before_modified(ss->bm_log, vd.bm_vert, vd.cd_vert_mask_offset, true);
+          // BKE_pbvh_bmesh_update_origvert(ss->pbvh, vd.bm_vert, &dummy, &dummy, &dummy);
         }
         BKE_pbvh_vertex_iter_end;
 
@@ -1240,16 +1248,16 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Sculpt
       }
 
       case SCULPT_UNDO_COLOR: {
-#if 0
+#if 1
         BKE_pbvh_vertex_iter_begin(ss->pbvh, node, vd, PBVH_ITER_ALL)
         {
-          BM_log_vert_before_modified(
-              ss->bm, ss->bm_log, vd.bm_vert, vd.cd_vert_mask_offset, true);
+          void *dummy;
+          BKE_pbvh_bmesh_update_origvert(ss->pbvh, vd.bm_vert, NULL, NULL, &dummy);
         }
         BKE_pbvh_vertex_iter_end;
 #endif
         break;
-      } 
+      }
       case SCULPT_UNDO_DYNTOPO_BEGIN:
       case SCULPT_UNDO_DYNTOPO_END:
       case SCULPT_UNDO_DYNTOPO_SYMMETRIZE:
@@ -1259,6 +1267,10 @@ static SculptUndoNode *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Sculpt
     }
   }
 
+  if (new_node) {
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list