[Bf-blender-cvs] [19695109741] sculpt-dev: Sculpt: Minor bmesh refactor, made tool flags a CD layer

Joseph Eagar noreply at git.blender.org
Mon Oct 4 09:10:43 CEST 2021


Commit: 196951097413d0de96e50e7616a62bec31171213
Author: Joseph Eagar
Date:   Sun Oct 3 20:46:44 2021 -0700
Branches: sculpt-dev
https://developer.blender.org/rB196951097413d0de96e50e7616a62bec31171213

Sculpt: Minor bmesh refactor, made tool flags a CD layer

The way toolflags reallocated the entire mesh
just to add or remove one pointer from BMEdge/Vert/Face
was highly broken.  Now a CD layer is used instead.

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

M	source/blender/blenkernel/intern/customdata.c
M	source/blender/blenkernel/intern/pbvh_bmesh.c
M	source/blender/bmesh/bmesh_class.h
M	source/blender/bmesh/intern/bmesh_construct.c
M	source/blender/bmesh/intern/bmesh_core.c
M	source/blender/bmesh/intern/bmesh_core.h
M	source/blender/bmesh/intern/bmesh_interp.c
M	source/blender/bmesh/intern/bmesh_mesh.c
M	source/blender/bmesh/intern/bmesh_mesh_convert.c
M	source/blender/bmesh/intern/bmesh_mesh_duplicate.c
M	source/blender/bmesh/intern/bmesh_mods.c
M	source/blender/bmesh/intern/bmesh_operator_api.h
M	source/blender/bmesh/intern/bmesh_operator_api_inline.h
M	source/blender/bmesh/intern/bmesh_operators.c
M	source/blender/bmesh/intern/bmesh_private.h
M	source/blender/bmesh/operators/bmo_dupe.c
M	source/blender/bmesh/operators/bmo_removedoubles.c
M	source/blender/editors/sculpt_paint/sculpt_face_set.c
M	source/blender/makesdna/DNA_customdata_types.h
M	source/blender/makesdna/DNA_meshdata_types.h

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

diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index dd66a4ccaf3..47735542f5f 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -1563,11 +1563,6 @@ static void layerDynTopoVert_interp(
   mv->origmask = origmask;
 }
 
-static void layerCopy_noop(const void *UNUSED(source), void *UNUSED(dest), int UNUSED(count))
-{
-  // do nothing
-}
-
 static void layerInterp_noop(const void **UNUSED(sources),
                              const float *UNUSED(weights),
                              const float *UNUSED(sub_weights),
@@ -1987,7 +1982,16 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
      NULL,  // flag singleton layer
      layerDynTopoVert_copy,
      NULL,
-     layerDynTopoVert_interp}};
+     layerDynTopoVert_interp},
+    /*54 CD_BMESH_TOOLFLAGS */
+    {sizeof(MToolFlags),
+     "MToolFlags",
+     1,
+     NULL,  // flag singleton layer
+     NULL,
+     NULL,
+     layerInterp_noop},
+};
 
 static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
     /*   0-4 */
@@ -3752,7 +3756,7 @@ void CustomData_bmesh_do_versions_update_active_layers(CustomData *fdata, Custom
 
 void CustomData_bmesh_init_pool(CustomData *data, int totelem, const char htype)
 {
-  return CustomData_bmesh_init_pool_ex(data, totelem, htype, __func__);
+  CustomData_bmesh_init_pool_ex(data, totelem, htype, __func__);
 }
 
 void CustomData_bmesh_init_pool_ex(CustomData *data,
@@ -3928,7 +3932,7 @@ void CustomData_bmesh_free_block_data(CustomData *data, void *block)
   }
 }
 
-static void CustomData_bmesh_alloc_block(CustomData *data, void **block)
+ATTR_NO_OPT static void CustomData_bmesh_alloc_block(CustomData *data, void **block)
 {
   if (*block) {
     CustomData_bmesh_free_block(data, block);
@@ -3936,6 +3940,18 @@ static void CustomData_bmesh_alloc_block(CustomData *data, void **block)
 
   if (data->totsize > 0) {
     *block = BLI_mempool_alloc(data->pool);
+
+    /*clear toolflags pointer when created for the first time*/
+    int cd_tflags = data->typemap[CD_TOOLFLAGS];
+    if (cd_tflags != -1) {
+      cd_tflags = data->layers[cd_tflags].offset;
+
+      char *ptr = (char *)*block;
+      ptr += cd_tflags;
+
+      MToolFlags *flags = (MToolFlags *)ptr;
+      flags->flag = NULL;
+    }
   }
   else {
     *block = NULL;
@@ -3968,15 +3984,14 @@ void CustomData_bmesh_free_block_data_exclude_by_type(CustomData *data,
 
 static void CustomData_bmesh_set_default_n(CustomData *data, void **block, int n)
 {
-  int offset = data->layers[n].offset;
-  const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[n].type);
-
-  /* can't allow this to be called on CD_MESH_ID */
-
-  if (data->layers[n].type == CD_MESH_ID) {
+  if (ELEM(data->layers[n].type, CD_TOOLFLAGS, CD_MESH_ID)) {
+    /* do not do toolflags or mesh ids */
     return;
   }
 
+  int offset = data->layers[n].offset;
+  const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[n].type);
+
   if (typeInfo->set_default) {
     typeInfo->set_default(POINTER_OFFSET(*block, offset), 1);
   }
@@ -3985,9 +4000,9 @@ static void CustomData_bmesh_set_default_n(CustomData *data, void **block, int n
   }
 }
 
-void CustomData_bmesh_set_default(CustomData *data, void **block)
+ATTR_NO_OPT void CustomData_bmesh_set_default(CustomData *data, void **block)
 {
-  if (*block == NULL) {
+  if (!*block) {
     CustomData_bmesh_alloc_block(data, block);
   }
 
@@ -4005,15 +4020,30 @@ void CustomData_bmesh_swap_data_simple(CustomData *data, void **block1, void **b
   *block1 = *block2;
   *block2 = tmp;
 
+  int cd_tflags = data->typemap[CD_TOOLFLAGS];
+  cd_tflags = cd_tflags != -1 ? data->layers[cd_tflags].offset : -1;
+
   // unswap ids if they exist
-  if (cd_id != -1 && *block1 && *block2) {
-    int itmp;
-    int *id1 = (int *)(((char *)*block1) + cd_id);
-    int *id2 = (int *)(((char *)*block2) + cd_id);
+  if (*block1 && *block2) {
+    if (cd_id != -1) {
+      int itmp;
+      int *id1 = (int *)(((char *)*block1) + cd_id);
+      int *id2 = (int *)(((char *)*block2) + cd_id);
+
+      itmp = *id1;
+      *id1 = *id2;
+      *id2 = itmp;
+    }
+
+    if (cd_tflags != -1) {
+      MToolFlags tmp;
+      MToolFlags *flags1 = (MToolFlags *)(((char *)*block1) + cd_tflags);
+      MToolFlags *flags2 = (MToolFlags *)(((char *)*block2) + cd_tflags);
 
-    itmp = *id1;
-    *id1 = *id2;
-    *id2 = itmp;
+      tmp = *flags1;
+      *flags1 = *flags2;
+      *flags2 = tmp;
+    }
   }
 }
 
@@ -4044,8 +4074,8 @@ void CustomData_bmesh_swap_data(CustomData *source,
       dest_i_start++;
     }
 
-    if (source->layers[src_i].type == CD_MESH_ID) {
-      // do not swap ids
+    if (ELEM(source->layers[src_i].type, CD_MESH_ID, CD_TOOLFLAGS)) {
+      // do not swap ids or toolflags
       continue;
     }
 
@@ -4096,6 +4126,14 @@ void CustomData_bmesh_copy_data_exclude_by_type(const CustomData *source,
    * would cause too much duplicate code, so add a check instead. */
   const bool no_mask = (mask_exclude == 0);
 
+  /*
+  Note that we don't handle id/toolflag layers specially here,
+  instead relying on CD_ELEM_NO_COPY semantics.
+
+  This is so BM_data_layer_add can reallocate customdata blocks without
+  zeroing those two layers.
+  */
+
   if (*dest_block == NULL) {
     CustomData_bmesh_alloc_block(dest, dest_block);
     if (*dest_block) {
@@ -4135,6 +4173,9 @@ void CustomData_bmesh_copy_data_exclude_by_type(const CustomData *source,
       /* if we found a matching layer, copy the data */
       if (STREQ(dest->layers[dest_i].name, source->layers[src_i].name)) {
         if (no_mask || ((CD_TYPE_AS_MASK(dest->layers[dest_i].type) & mask_exclude) == 0)) {
+          /* CD_FLAG_ELEM_NOCOPY is used to forcibly exclude copying CD_MESH_ID and CD_TOOLFLAGS
+             layers */
+
           if (dest->layers[dest_i].flag & CD_FLAG_ELEM_NOCOPY) {
             break;
           }
@@ -4463,6 +4504,12 @@ void CustomData_bmesh_interp(CustomData *data,
   for (int i = 0; i < data->totlayer; i++) {
     CustomDataLayer *layer = &data->layers[i];
     const LayerTypeInfo *typeInfo = layerType_getInfo(layer->type);
+
+    // ignore id and toolflag layers
+    if (ELEM(layer->type, CD_MESH_ID, CD_TOOLFLAGS)) {
+      continue;
+    }
+
     if (typeInfo->interp) {
       for (int j = 0; j < count; j++) {
         sources[j] = POINTER_OFFSET(src_blocks[j], layer->offset);
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index 58b3a3ffde0..ce25fb8780c 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -5348,13 +5348,40 @@ ATTR_NO_OPT void BKE_pbvh_bmesh_from_saved_indices(PBVH *pbvh)
   BLI_array_free(ltable);
 }
 
+extern char dyntopop_node_idx_layer_id[];
+extern char dyntopop_faces_areas_layer_id[];
+
+static void pbvh_bmesh_fetch_cdrefs(PBVH *pbvh)
+{
+  BMesh *bm = pbvh->bm;
+
+  int idx = CustomData_get_named_layer_index(
+      &bm->vdata, CD_PROP_INT32, dyntopop_node_idx_layer_id);
+  pbvh->cd_vert_node_offset = bm->vdata.layers[idx].offset;
+
+  idx = CustomData_get_named_layer_index(&bm->pdata, CD_PROP_INT32, dyntopop_node_idx_layer_id);
+  pbvh->cd_face_node_offset = bm->pdata.layers[idx].offset;
+
+  idx = CustomData_get_named_layer_index(&bm->pdata, CD_PROP_FLOAT, dyntopop_faces_areas_layer_id);
+  pbvh->cd_face_area = bm->pdata.layers[idx].offset;
+
+  pbvh->cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK);
+  pbvh->cd_vcol_offset = CustomData_get_offset(&bm->vdata, CD_PROP_COLOR);
+  pbvh->cd_faceset_offset = CustomData_get_offset(&bm->pdata, CD_SCULPT_FACE_SETS);
+  pbvh->cd_dyn_vert = CustomData_get_offset(&bm->vdata, CD_DYNTOPO_VERT);
+}
+
 void BKE_pbvh_bmesh_set_toolflags(PBVH *pbvh, bool use_toolflags)
 {
   if (use_toolflags == pbvh->bm->use_toolflags) {
     return;
   }
 
-  BKE_pbvh_bmesh_save_indices(pbvh);
+  // BKE_pbvh_bmesh_save_indices(pbvh);
   BM_mesh_toolflags_set(pbvh->bm, use_toolflags);
-  BKE_pbvh_bmesh_from_saved_indices(pbvh);
+
+  // customdata layout might've changed
+  pbvh_bmesh_fetch_cdrefs(pbvh);
+
+  // BKE_pbvh_bmesh_from_saved_indices(pbvh);
 }
diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h
index c687896dfd8..94e89ab32e4 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -114,10 +114,9 @@ typedef struct BMVert {
   struct BMEdge *e;
 } BMVert;
 
-typedef struct BMVert_OFlag {
-  BMVert base;
-  struct BMFlagLayer *oflags;
-} BMVert_OFlag;
+#define BMVert_OFlag BMVert
+#define BMEdge_OFlag BMEdge
+#define BMFace_OFlag BMFace
 
 /* disk link structure, only used by edges */
 typedef struct BMDiskLink {
@@ -153,11 +152,6 @@ typedef struct BMEdge {
   BMDiskLink v1_disk_link, v2_disk_link;
 } BMEdge;
 
-typedef struct BMEdge_OFlag {
-  BMEdge base;
-  struct BMFlagLayer *oflags;
-} BMEdge_OFlag;
-
 typedef struct BMLoop {
   BMHeader head;
   /* notice no flags layer */
@@ -287,11 +281,6 @@ typedef struct BMFace {
   //  short _pad[3];
 } BMFace;
 
-typedef struct BMFace_OFlag {
-  BMFace base;
-  struct BMFlagLayer *oflags;
-} BMFace_OFlag;
-
 typedef struct BMFlagLayer {
   short f; /* flags */
 } BMFlagLayer;
diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c
index 80d6331df88..af53abc4ca5 100644
--- a/source/blender/bmesh/intern/bmesh_construct.c
+++ b/source/blender/bmesh/intern/bmesh_construct.c
@@ -795,28 +795,28 @@ void BM_elem_attrs_copy_ex(BMesh *bm_src,
                          bm_dst,
                          (const BMVert *)ele_src,
                          (BMVert *)ele_dst,
-                         cd_mask_exclude | CD_MASK_MESH_ID);
+                         cd_mask_exclude | CD_MASK_MESH_ID | CD_MASK_TOOLFLAGS);
       break;
     case BM_EDGE:
       bm_edge_attrs_copy(bm_src,
                          bm_dst,
                          (const BMEdge *)ele_src,
                          (BMEdge *)ele_dst,
-                         cd_mask_exclude | CD_MASK_MESH_ID);
+                         cd_mask_exclude | CD_MASK_MESH_ID | CD_MASK_TOOLFLAGS);
    

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list