[Bf-blender-cvs] [a0dbcd890da] sculpt-dev: Sculpt: more nasty customdata bugs

Joseph Eagar noreply at git.blender.org
Wed Oct 6 05:09:02 CEST 2021


Commit: a0dbcd890dac6c9002eba2d9c92f4d897db9a43b
Author: Joseph Eagar
Date:   Tue Oct 5 20:07:25 2021 -0700
Branches: sculpt-dev
https://developer.blender.org/rBa0dbcd890dac6c9002eba2d9c92f4d897db9a43b

Sculpt: more nasty customdata bugs

* Fixed mesh_sculpt_vertex_color_add_exec,
  it's post-exec undo push was overwriting
  the mesh cd layout.

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

M	source/blender/blenkernel/BKE_customdata.h
M	source/blender/blenkernel/intern/customdata.c
M	source/blender/blenkernel/intern/paint.c
M	source/blender/bmesh/intern/bmesh_log.c
M	source/blender/editors/mesh/mesh_data.c
M	source/blender/editors/sculpt_paint/sculpt_dyntopo.c

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

diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 8757e8f3017..c330c2de8be 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -631,6 +631,7 @@ void CustomData_unmark_temporary_nocopy(struct CustomData *data);
 void CustomData_mark_temporary_nocopy(struct CustomData *data);
 
 int CustomData_get_elem_size(CustomDataLayer *layer);
+void CustomData_regen_active_refs(CustomData *data);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 2eed24b7139..b2d1b0c544f 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -2240,10 +2240,21 @@ void CustomData_update_typemap(CustomData *data)
   }
 }
 
-void customdata_regen_active_refs(CustomData *data)
+ATTR_NO_OPT void CustomData_regen_active_refs(CustomData *data)
 {
   int i, j;
-  bool changed = false;
+
+  for (int i = 0; i < CD_NUMTYPES; i++) {
+    data->typemap[i] = -1;
+  }
+
+  for (i = 0, j = 0; i < data->totlayer; i++) {
+    CustomDataLayer *layer = &data->layers[i];
+
+    if (data->typemap[layer->type] == -1) {
+      data->typemap[layer->type] = i;
+    }
+  }
 
   /* explicitly flag active layers */
   for (i = 0, j = 0; i < data->totlayer; i++) {
@@ -2283,6 +2294,15 @@ void customdata_regen_active_refs(CustomData *data)
 
     int n = layer - base;
 
+    if (n < 0) {
+      printf("error!\n");
+      for (int j = 0; j < data->totlayer; j++) {
+        printf("%s", i == j ? "->" : "  ");
+        printf("%d : \"%s\"\n",
+               data->layers[i].type,
+               data->layers[i].name ? data->layers[i].name : "");
+      }
+    }
     if (layer->active) {
       base->active = n;
     }
@@ -2338,7 +2358,7 @@ void CustomData_copy_all_layout(const struct CustomData *source, struct CustomDa
     }
   }
 
-  customdata_regen_active_refs(dest);
+  CustomData_regen_active_refs(dest);
 }
 
 bool CustomData_merge(const struct CustomData *source,
@@ -2430,7 +2450,7 @@ bool CustomData_merge(const struct CustomData *source,
   }
 
   CustomData_update_typemap(dest);
-  customdata_regen_active_refs(dest);
+  CustomData_regen_active_refs(dest);
 
   return changed;
 }
@@ -3191,18 +3211,6 @@ void CustomData_free_temporary(CustomData *data, int totelem)
   int i, j;
   bool changed = false;
 
-  /* explicitly flag active layers */
-  for (i = 0, j = 0; i < data->totlayer; i++) {
-    CustomDataLayer *layer = &data->layers[i];
-    CustomDataLayer *base = data->layers + data->typemap[layer->type];
-    int n = layer - base;
-
-    layer->active = n == base->active;
-    layer->active_clone = n == base->active_clone;
-    layer->active_mask = n == base->active_mask;
-    layer->active_rnd = n == base->active_rnd;
-  }
-
   /* free temp layers */
   for (i = 0, j = 0; i < data->totlayer; i++) {
     CustomDataLayer *layer = &data->layers[i];
@@ -3222,48 +3230,6 @@ void CustomData_free_temporary(CustomData *data, int totelem)
     }
   }
 
-  CustomData_update_typemap(data);
-
-  /* regenerate active refs */
-  for (int i = 0; i < CD_NUMTYPES; i++) {
-    if (data->typemap[i] != -1) {
-      CustomDataLayer *base = data->layers + data->typemap[i];
-      base->active = base->active_clone = base->active_mask = base->active_rnd = 0;
-    }
-  }
-
-  /* set active n in base layer for all types */
-  for (i = 0; i < data->totlayer; i++) {
-    CustomDataLayer *layer = &data->layers[i];
-    CustomDataLayer *base = data->layers + data->typemap[layer->type];
-
-    int n = layer - base;
-
-    if (layer->active) {
-      base->active = n;
-    }
-    if (layer->active_mask) {
-      base->active_mask = n;
-    }
-    if (layer->active_clone) {
-      base->active_clone = n;
-    }
-    if (layer->active_rnd) {
-      base->active_rnd = n;
-    }
-  }
-
-  /* set active n in all layers */
-  for (i = 0; i < data->totlayer; i++) {
-    CustomDataLayer *layer = &data->layers[i];
-    CustomDataLayer *base = data->layers + data->typemap[layer->type];
-
-    layer->active = base->active;
-    layer->active_mask = base->active_mask;
-    layer->active_clone = base->active_clone;
-    layer->active_rnd = base->active_rnd;
-  }
-
   data->totlayer = j;
 
   if (data->totlayer <= data->maxlayer - CUSTOMDATA_GROW) {
@@ -3271,6 +3237,9 @@ void CustomData_free_temporary(CustomData *data, int totelem)
     changed = true;
   }
 
+  CustomData_update_typemap(data);
+  CustomData_regen_active_refs(data);
+
   if (changed) {
     customData_update_offsets(data);
   }
@@ -4734,6 +4703,9 @@ void CustomData_from_bmesh_block(const CustomData *source,
   /* copies a layer at a time */
   int dest_i = 0;
   for (int src_i = 0; src_i < source->totlayer; src_i++) {
+    if (source->layers[src_i].flag & CD_FLAG_NOCOPY) {
+      continue;
+    }
 
     /* find the first dest layer with type >= the source type
      * (this should work because layers are ordered by type)
@@ -5788,5 +5760,5 @@ void CustomData_blend_read(BlendDataReader *reader, CustomData *data, int count)
   }
 
   CustomData_update_typemap(data);
-  customdata_regen_active_refs(data);  // check for corrupted active layer refs
+  CustomData_regen_active_refs(data);  // check for corrupted active layer refs
 }
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 5f9a88ccc19..7b2f41f82b1 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -1876,10 +1876,11 @@ void BKE_sculpt_update_object_after_eval(Depsgraph *depsgraph, Object *ob_eval)
    * other data when modifiers change the mesh. */
   Object *ob_orig = DEG_get_original_object(ob_eval);
   Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval);
+  Mesh *me_orig = BKE_object_get_original_mesh(ob_orig);
 
   BLI_assert(me_eval != NULL);
   sculpt_update_object(depsgraph, ob_orig, me_eval, false, false, false);
-  SCULPT_dynamic_topology_sync_layers(ob_orig, me_eval);
+  SCULPT_dynamic_topology_sync_layers(ob_orig, me_orig);
 }
 
 void BKE_sculpt_color_layer_create_if_needed(struct Object *object)
diff --git a/source/blender/bmesh/intern/bmesh_log.c b/source/blender/bmesh/intern/bmesh_log.c
index d1f6352177e..7d8611ef722 100644
--- a/source/blender/bmesh/intern/bmesh_log.c
+++ b/source/blender/bmesh/intern/bmesh_log.c
@@ -1677,8 +1677,6 @@ BMLogEntry *BM_log_entry_check_customdata(BMesh *bm, BMLog *log)
   CustomData *cd1[4] = {&bm->vdata, &bm->edata, &bm->ldata, &bm->pdata};
   CustomData *cd2[4] = {&entry->vdata, &entry->edata, &entry->ldata, &entry->pdata};
 
-  void customdata_regen_active_refs(CustomData * data);
-
   for (int i = 0; i < 4; i++) {
     if (!CustomData_layout_is_same(cd1[i], cd2[i])) {
       printf("Customdata changed for undo\n");
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c
index c075d2550cb..b26a5b07201 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -37,6 +37,7 @@
 #include "BKE_customdata.h"
 #include "BKE_editmesh.h"
 #include "BKE_mesh.h"
+#include "BKE_object.h"
 #include "BKE_report.h"
 
 #include "DEG_depsgraph.h"
@@ -511,7 +512,10 @@ static bool sculpt_vertex_color_remove_poll(bContext *C)
 }
 
 /* NOTE: keep in sync with #ED_mesh_uv_texture_add. */
-int ED_mesh_sculpt_color_add(Mesh *me, const char *name, const bool active_set, const bool do_init)
+ATTR_NO_OPT int ED_mesh_sculpt_color_add(Mesh *me,
+                                         const char *name,
+                                         const bool active_set,
+                                         const bool do_init)
 {
   BMEditMesh *em;
   int layernum;
@@ -775,15 +779,21 @@ void MESH_OT_vertex_color_remove(wmOperatorType *ot)
 
 /*********************** Sculpt Vertex Color Operators ************************/
 
+void SCULPT_dynamic_topology_sync_layers(Object *ob, Mesh *me);
+
 static int mesh_sculpt_vertex_color_add_exec(bContext *C, wmOperator *UNUSED(op))
 {
   Object *ob = ED_object_context(C);
-  Mesh *me = ob->data;
+  Mesh *me = BKE_object_get_original_mesh(ob);
 
   if (ED_mesh_sculpt_color_add(me, NULL, true, true) == -1) {
     return OPERATOR_CANCELLED;
   }
 
+  /* have to call this to prevent the undo system from
+    overwriting the CD layout with ss->bm's layout*/
+  SCULPT_dynamic_topology_sync_layers(ob, me);
+
   return OPERATOR_FINISHED;
 }
 
diff --git a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
index 67007281137..9d44e4ec472 100644
--- a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
@@ -641,7 +641,7 @@ void SCULPT_dyntopo_node_layers_add(SculptSession *ss)
 /**
   Syncs customdata layers with internal bmesh, but ignores deleted layers.
 */
-void SCULPT_dynamic_topology_sync_layers(Object *ob, Mesh *me)
+ATTR_NO_OPT void SCULPT_dynamic_topology_sync_layers(Object *ob, Mesh *me)
 {
   SculptSession *ss = ob->sculpt;
 
@@ -736,26 +736,18 @@ void SCULPT_dynamic_topology_sync_layers(Object *ob, Mesh *me)
         modified |= idx - baseidx != cl2->active_clone;
         cl2->active_clone = idx - baseidx;
       }
-
-      for (int k = baseidx; k < data2->totlayer; k++) {
-        CustomDataLayer *cl3 = data2->layers + k;
-
-        if (cl3->type != cl2->type) {
-          break;
-        }
-
-        // based off of how CustomData_set_layer_XXXX_index works
-
-        cl3->active = (cl2->active + baseidx) - k;
-        cl3->active_rnd = (cl2->active_rnd + baseidx) - k;
-        cl3->active_mask = (cl2->active_mask + baseidx) - k;
-        cl3->active_clone = (cl2->active_clone + baseidx) - k;
-      }
     }
 
     BLI_array_free(newlayers);
   }
 
+  if (modified && ss->bm) {
+    CustomData_regen_active_refs(&ss->bm->vdata);
+    CustomData_regen_active_refs(&ss->bm->edata);
+    CustomData_regen_active_refs(&ss->bm->ldata);
+    CustomData_regen_active_refs(&ss->bm->pdata);
+  }
+
   if (modified) {
     SCULPT_dyntopo_node_layers_update_offsets(ss);
   }



More information about the Bf-blender-cvs mailing list