[Bf-blender-cvs] [e481f801d17] refactor-mesh-uv-map-generic: Cleanup custom data access

Hans Goudey noreply at git.blender.org
Fri Aug 26 20:11:15 CEST 2022


Commit: e481f801d176d332c30a5010c5210c2483657b31
Author: Hans Goudey
Date:   Fri Aug 26 13:11:08 2022 -0500
Branches: refactor-mesh-uv-map-generic
https://developer.blender.org/rBe481f801d176d332c30a5010c5210c2483657b31

Cleanup custom data access

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

M	source/blender/blenkernel/BKE_customdata.h
M	source/blender/blenkernel/intern/attribute.cc
M	source/blender/blenkernel/intern/customdata.cc
M	source/blender/blenkernel/intern/mesh.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_fdots_edituv_data.cc
M	source/blender/editors/mesh/editmesh_utils.c
M	source/blender/editors/mesh/mesh_data.cc
M	source/blender/editors/sculpt_paint/sculpt_uv.c
M	source/blender/editors/transform/transform_convert_mesh_uv.c
M	source/blender/editors/uvedit/uvedit_buttons.c
M	source/blender/editors/uvedit/uvedit_islands.c
M	source/blender/editors/uvedit/uvedit_ops.c
M	source/blender/editors/uvedit/uvedit_path.c
M	source/blender/editors/uvedit/uvedit_rip.c
M	source/blender/editors/uvedit/uvedit_select.c
M	source/blender/editors/uvedit/uvedit_smart_stitch.c
M	source/blender/editors/uvedit/uvedit_unwrap_ops.c
M	source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc
M	source/blender/python/bmesh/bmesh_py_types_meshdata.c
M	source/blender/python/bmesh/bmesh_py_types_meshdata.h

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

diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index b4b485abfce..9dff78b43d0 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -753,11 +753,9 @@ typedef struct UVMap_Offsets {
 
 /**
  * UV related CustomData pointers.
- * The data pointers point directly to the CustomData arrays.
- * The uv_index is also stored for on-demand creation of the bool datalayers.
+ * The data pointers point directly to the attributes arrays.
  */
 typedef struct UVMap_Data {
-  int uv_index;
   float (*uv)[2];
   bool *vertsel;
   bool *edgesel;
@@ -794,8 +792,7 @@ inline std::string uv_sublayer_name_pin(const StringRef uv_map_name)
  * Get a descriptor containing offsets for layers used for user interaction with the UV map.
  * \param name: Optional layer name. When null, the default layer is returned.
  */
-UVMap_Offsets CustomData_get_uvmap_offsets(const struct CustomData *data, char const *name);
-UVMap_Data CustomData_get_uvmap_data(const struct CustomData *data, char const *name);
+UVMap_Offsets CustomData_get_active_uvmap_offsets(struct BMesh *bm);
 UVMap_Data CustomData_get_uvmap_data_n(const struct CustomData *data, int n);
 
 #ifndef NDEBUG
diff --git a/source/blender/blenkernel/intern/attribute.cc b/source/blender/blenkernel/intern/attribute.cc
index 130c50e24ad..c655be18fbd 100644
--- a/source/blender/blenkernel/intern/attribute.cc
+++ b/source/blender/blenkernel/intern/attribute.cc
@@ -668,43 +668,6 @@ int BKE_id_attribute_to_index(const ID *id,
   return -1;
 }
 
-static int attribute_to_layerindex(const struct ID *id,
-                                   const CustomDataLayer *layer,
-                                   const eAttrDomainMask domain_mask,
-                                   const eCustomDataMask layer_mask)
-{
-  if (!layer) {
-    return -1;
-  }
-
-  DomainInfo info[ATTR_DOMAIN_NUM];
-  eAttrDomain domains[ATTR_DOMAIN_NUM];
-  get_domains_types(domains);
-  get_domains(id, info);
-
-  for (int i = 0; i < ATTR_DOMAIN_NUM; i++) {
-    if (!(domain_mask & (1 << domains[i])) || !info[domains[i]].customdata) {
-      continue;
-    }
-
-    const CustomData *cdata = info[domains[i]].customdata;
-    for (int j = 0; j < cdata->totlayer; j++) {
-      const CustomDataLayer *layer_iter = cdata->layers + j;
-
-      if (!(CD_TYPE_AS_MASK(layer_iter->type) & layer_mask) ||
-          (layer_iter->flag & CD_FLAG_TEMPORARY)) {
-        continue;
-      }
-
-      if (layer == layer_iter) {
-        return j;
-      }
-    }
-  }
-
-  return -1;
-}
-
 CustomDataLayer *BKE_id_attribute_subset_active_get(const ID *id,
                                                     int active_flag,
                                                     eAttrDomainMask domain_mask,
@@ -882,42 +845,40 @@ UVMap_Data BKE_id_attributes_ensure_uvmap_layers_index(Mesh *mesh,
   CustomDataLayer *uvlayer = attribute_from_layerindex(
       &mesh->id, index_of_uvmap, ATTR_DOMAIN_CORNER, CD_MASK_PROP_FLOAT2);
 
-  data.uv_index = attribute_to_layerindex(
-      &mesh->id, uvlayer, ATTR_DOMAIN_MASK_CORNER, CD_MASK_PROP_FLOAT2);
-  data.uv = (float(*)[2])uvlayer->data;
+  data.uv = static_cast<float(*)[2]>(uvlayer->data);
 
   std::string vertsel_name = uv_sublayer_name_vert_selection(uvlayer->name);
   std::string edgesel_name = uv_sublayer_name_edge_selection(uvlayer->name);
   std::string pinned_name = uv_sublayer_name_pin(uvlayer->name);
 
-  CustomDataLayer *vslayer = BKE_id_attribute_find(
+  CustomDataLayer *vertsel = BKE_id_attribute_find(
       &mesh->id, vertsel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER);
-  data.vertsel = vslayer ? (bool *)vslayer->data : nullptr;
+  data.vertsel = vertsel ? static_cast<bool *>(vertsel->data) : nullptr;
 
-  CustomDataLayer *eslayer = BKE_id_attribute_find(
+  CustomDataLayer *edgesel = BKE_id_attribute_find(
       &mesh->id, edgesel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER);
-  data.edgesel = eslayer ? (bool *)eslayer->data : nullptr;
+  data.edgesel = edgesel ? static_cast<bool *>(edgesel->data) : nullptr;
 
-  CustomDataLayer *pnlayer = BKE_id_attribute_find(
+  CustomDataLayer *pin = BKE_id_attribute_find(
       &mesh->id, pinned_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER);
-  data.pinned = pnlayer ? (bool *)pnlayer->data : nullptr;
+  data.pinned = pin ? static_cast<bool *>(pin->data) : nullptr;
 
   if (needvertsel && data.vertsel == nullptr) {
     CustomDataLayer *layer = BKE_id_attribute_new(
         &mesh->id, vertsel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER, reports);
-    data.vertsel = (bool *)layer->data;
+    data.vertsel = static_cast<bool *>(layer->data);
   }
 
   if (neededgesel && data.edgesel == nullptr) {
     CustomDataLayer *layer = BKE_id_attribute_new(
         &mesh->id, edgesel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER, reports);
-    data.edgesel = (bool *)layer->data;
+    data.edgesel = static_cast<bool *>(layer->data);
   }
 
   if (needpinned && data.pinned == nullptr) {
     CustomDataLayer *layer = BKE_id_attribute_new(
         &mesh->id, pinned_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER, reports);
-    data.pinned = (bool *)layer->data;
+    data.pinned = static_cast<bool *>(layer->data);
   }
 
   return data;
diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc
index e81ab0e1562..f3a12885d8a 100644
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@ -5316,101 +5316,54 @@ void CustomData_blend_read(BlendDataReader *reader, CustomData *data, const int
 /** \name Custom Data UVmap Handling
  * \{ */
 
-UVMap_Data CustomData_get_uvmap_data(const CustomData *ldata, char const *name)
+static UVMap_Data retrieve_uv_map_data(const CustomData &ldata, const int layer_index)
 {
   using namespace blender::bke;
-  UVMap_Data data;
-  if (name) {
-    data.uv_index = CustomData_get_named_layer_index(ldata, CD_PROP_FLOAT2, name);
-  }
-  else {
-    data.uv_index = CustomData_get_layer_index(ldata, CD_PROP_FLOAT2);
-  }
-
-  data.uv = data.uv_index == -1 ? nullptr : (float(*)[2])ldata->layers[data.uv_index].data;
-
-  if (data.uv == nullptr) {
-    data.vertsel = data.edgesel = data.pinned = nullptr;
-    return data;
-  }
-
-  const std::string vertsel_name = uv_sublayer_name_vert_selection(
-      ldata->layers[data.uv_index].name);
-  const std::string edgesel_name = uv_sublayer_name_edge_selection(
-      ldata->layers[data.uv_index].name);
-  const std::string pinned_name = uv_sublayer_name_pin(ldata->layers[data.uv_index].name);
+  const StringRef name = ldata.layers[layer_index].name;
 
-  const int vertsel_index = CustomData_get_named_layer_index(
-      ldata, CD_PROP_BOOL, vertsel_name.c_str());
-  const int edgesel_index = CustomData_get_named_layer_index(
-      ldata, CD_PROP_BOOL, edgesel_name.c_str());
-  const int pinned_index = CustomData_get_named_layer_index(
-      ldata, CD_PROP_BOOL, pinned_name.c_str());
+  const int vertsel = CustomData_get_named_layer_index(
+      &ldata, CD_PROP_BOOL, uv_sublayer_name_vert_selection(name).c_str());
+  const int edgesel = CustomData_get_named_layer_index(
+      &ldata, CD_PROP_BOOL, uv_sublayer_name_edge_selection(name).c_str());
+  const int pinned = CustomData_get_named_layer_index(
+      &ldata, CD_PROP_BOOL, uv_sublayer_name_pin(name).c_str());
 
-  data.vertsel = vertsel_index == -1 ? nullptr : (bool *)ldata->layers[vertsel_index].data;
-  data.edgesel = edgesel_index == -1 ? nullptr : (bool *)ldata->layers[edgesel_index].data;
-  data.pinned = pinned_index == -1 ? nullptr : (bool *)ldata->layers[pinned_index].data;
+  UVMap_Data data;
+  data.uv = static_cast<float(*)[2]>(ldata.layers[layer_index].data);
+  data.vertsel = vertsel == -1 ? nullptr : static_cast<bool *>(ldata.layers[vertsel].data);
+  data.edgesel = edgesel == -1 ? nullptr : static_cast<bool *>(ldata.layers[edgesel].data);
+  data.pinned = pinned == -1 ? nullptr : static_cast<bool *>(ldata.layers[pinned].data);
 
   return data;
 }
 
 UVMap_Data CustomData_get_uvmap_data_n(const CustomData *ldata, const int n)
 {
-  using namespace blender::bke;
-  UVMap_Data data;
-  data.uv_index = CustomData_get_layer_index_n(ldata, CD_PROP_FLOAT2, n);
-
-  if (data.uv_index < 0) {
-    data.uv = nullptr;
-    data.vertsel = data.edgesel = data.pinned = nullptr;
-    return data;
+  const int layer_index = CustomData_get_layer_index_n(ldata, CD_PROP_FLOAT2, n);
+  if (layer_index == -1) {
+    return {};
   }
-
-  const std::string vertsel_name = uv_sublayer_name_vert_selection(
-      ldata->layers[data.uv_index].name);
-  const std::string edgesel_name = uv_sublayer_name_edge_selection(
-      ldata->layers[data.uv_index].name);
-  const std::string pinned_name = uv_sublayer_name_pin(ldata->layers[data.uv_index].name);
-
-  const int vertsel_index = CustomData_get_named_layer_index(
-      ldata, CD_PROP_BOOL, vertsel_name.c_str());
-  const int edgesel_index = CustomData_get_named_layer_index(
-      ldata, CD_PROP_BOOL, edgesel_name.c_str());
-  const int pinned_index = CustomData_get_named_layer_index(
-      ldata, CD_PROP_BOOL, pinned_name.c_str());
-
-  data.vertsel = vertsel_index == -1 ? nullptr : (bool *)ldata->layers[vertsel_index].data;
-  data.edgesel = edgesel_index == -1 ? nullptr : (bool *)ldata->layers[edgesel_index].data;
-  data.pinned = pinned_index == -1 ? nullptr : (bool *)ldata->layers[pinned_index].data;
-
-  return data;
+  return retrieve_uv_map_data(*ldata, layer_index);
 }
 
-UVMap_Offsets CustomData_get_uvmap_offsets(const CustomData *ldata, char const *name)
+UVMap_Offsets CustomData_get_active_uvmap_offsets(const BMesh *bm)
 {
   using namespace blender::bke;
-  UVMap_Offsets offsets;
-  int index;
-  if (name) {
-    index = CustomData_get_named_layer_index(ldata, CD_PROP_FLOAT2, name);
-  }
-  else {
-    index = CustomData_get_layer_index(ldata, CD_PROP_FLOAT2);
-  }
-
-  if (index < 0) {
-    offsets.uv = offsets.vertsel = offsets.pinned = offsets.edgesel = -1;
-    return offsets;
+  const int layer_index = CustomData_get_layer_index(&bm->ldata, CD_PROP_FLOAT2);
+  if (layer_index == -1) {
+    retur

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list