[Bf-blender-cvs] [1cbe1a945b8] refactor-mesh-uv-map-generic: Many refactors to UV attribute retrieval

Hans Goudey noreply at git.blender.org
Sat Aug 27 00:22:40 CEST 2022


Commit: 1cbe1a945b87d8d424a978eae66dd30166610500
Author: Hans Goudey
Date:   Fri Aug 26 17:22:31 2022 -0500
Branches: refactor-mesh-uv-map-generic
https://developer.blender.org/rB1cbe1a945b87d8d424a978eae66dd30166610500

Many refactors to UV attribute retrieval

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

M	source/blender/blenkernel/BKE_attribute.h
M	source/blender/blenkernel/BKE_attribute.hh
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/blenkernel/intern/mesh_legacy_convert.cc
M	source/blender/bmesh/bmesh.h
M	source/blender/bmesh/intern/bmesh_interp.c
M	source/blender/bmesh/intern/bmesh_interp.h
M	source/blender/bmesh/intern/bmesh_query_uv.cc
M	source/blender/bmesh/intern/bmesh_query_uv.h
M	source/blender/draw/intern/mesh_extractors/extract_mesh.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh.hh
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/include/ED_mesh.h
M	source/blender/editors/include/ED_uvedit.h
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_intern.h
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/makesrna/intern/rna_mesh.c
M	source/blender/python/bmesh/bmesh_py_types_meshdata.c

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

diff --git a/source/blender/blenkernel/BKE_attribute.h b/source/blender/blenkernel/BKE_attribute.h
index f8ff5f9b96e..6d089bf0215 100644
--- a/source/blender/blenkernel/BKE_attribute.h
+++ b/source/blender/blenkernel/BKE_attribute.h
@@ -139,11 +139,6 @@ struct CustomDataLayer *BKE_id_attributes_color_find(const struct ID *id, const
 
 bool BKE_id_attribute_calc_unique_name(struct ID *id, const char *name, char *outname);
 
-UVMap_Data BKE_id_attributes_ensure_uvmap_layers_index(struct Mesh *mesh,
-                                                       int index_of_uvmap,
-                                                       struct ReportList *reports,
-                                                       uint32_t needed_layer_flags);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/BKE_attribute.hh b/source/blender/blenkernel/BKE_attribute.hh
index d29c60a7373..9b8636d3d08 100644
--- a/source/blender/blenkernel/BKE_attribute.hh
+++ b/source/blender/blenkernel/BKE_attribute.hh
@@ -750,6 +750,21 @@ class CustomDataAttributes {
 AttributeAccessor mesh_attributes(const Mesh &mesh);
 MutableAttributeAccessor mesh_attributes_for_write(Mesh &mesh);
 
+inline std::string get_uv_map_vert_selection_name(const StringRef uv_map_name)
+{
+  return std::string(".") + UV_VERTSEL_NAME + "." + uv_map_name;
+}
+
+inline std::string get_uv_map_edge_selection_name(const StringRef uv_map_name)
+{
+  return std::string(".") + UV_EDGESEL_NAME + "." + uv_map_name;
+}
+
+inline std::string get_uv_map_pin_name(const StringRef uv_map_name)
+{
+  return std::string(".") + UV_PINNED_NAME + "." + uv_map_name;
+}
+
 AttributeAccessor pointcloud_attributes(const PointCloud &pointcloud);
 MutableAttributeAccessor pointcloud_attributes_for_write(PointCloud &pointcloud);
 
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 02fd92f5b2d..9a1df681222 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -32,6 +32,21 @@ struct CustomData_MeshMasks;
 struct ID;
 typedef uint64_t eCustomDataMask;
 
+#define UV_VERTSEL_NAME "vs"
+#define UV_EDGESEL_NAME "es"
+#define UV_PINNED_NAME "pn"
+
+/**
+ * UV map related customdata offsets into BMesh attribute blocks. See #BM_uv_map_get_offsets.
+ * Defined in #BKE_customdata.h to avoid including bmesh.h in many unrelated areas.
+ */
+typedef struct BMUVOffsets {
+  int uv;
+  int select_vert;
+  int select_edge;
+  int pin;
+} BMUVOffsets;
+
 /* A data type large enough to hold 1 element from any custom-data layer type. */
 typedef struct {
   unsigned char data[64];
@@ -741,59 +756,6 @@ void CustomData_blend_write(BlendWriter *writer,
 
 void CustomData_blend_read(struct BlendDataReader *reader, struct CustomData *data, int count);
 
-/**
- * UV map related customdata offsets for BMesh.
- */
-typedef struct UVMap_Offsets {
-  int uv;
-  int vertsel;
-  int edgesel;
-  int pinned;
-} UVMap_Offsets;
-
-/**
- * UV related CustomData pointers.
- * The data pointers point directly to the attributes arrays.
- */
-typedef struct UVMap_Data {
-  float (*uv)[2];
-  bool *vertsel;
-  bool *edgesel;
-  bool *pinned;
-} UVMap_Data;
-
-#define UV_VERTSEL_NAME "vs"
-#define UV_EDGESEL_NAME "es"
-#define UV_PINNED_NAME "pn"
-
-#ifdef __cplusplus
-
-namespace blender::bke {
-
-inline std::string uv_sublayer_name_vert_selection(const StringRef uv_map_name)
-{
-  return std::string(".") + UV_VERTSEL_NAME + "." + uv_map_name;
-}
-
-inline std::string uv_sublayer_name_edge_selection(const StringRef uv_map_name)
-{
-  return std::string(".") + UV_EDGESEL_NAME + "." + uv_map_name;
-}
-
-inline std::string uv_sublayer_name_pin(const StringRef uv_map_name)
-{
-  return std::string(".") + UV_PINNED_NAME + "." + uv_map_name;
-}
-
-}  // namespace blender::bke
-
-#endif
-/**
- * Get a descriptor containing offsets for layers used for user interaction with the active UV map.
- */
-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
 struct DynStr;
 /** Use to inspect mesh data when debugging. */
diff --git a/source/blender/blenkernel/intern/attribute.cc b/source/blender/blenkernel/intern/attribute.cc
index c655be18fbd..e2662130a71 100644
--- a/source/blender/blenkernel/intern/attribute.cc
+++ b/source/blender/blenkernel/intern/attribute.cc
@@ -171,16 +171,16 @@ bool BKE_id_attribute_rename(ID *id,
   if (layer->type == CD_PROP_FLOAT2) {
     /* Rename UV sub-attributes. */
     BKE_id_attribute_rename(id,
-                            uv_sublayer_name_vert_selection(layer->name).c_str(),
-                            uv_sublayer_name_vert_selection(result_name).c_str(),
+                            get_uv_map_vert_selection_name(layer->name).c_str(),
+                            get_uv_map_vert_selection_name(result_name).c_str(),
                             reports);
     BKE_id_attribute_rename(id,
-                            uv_sublayer_name_edge_selection(layer->name).c_str(),
-                            uv_sublayer_name_edge_selection(result_name).c_str(),
+                            get_uv_map_edge_selection_name(layer->name).c_str(),
+                            get_uv_map_edge_selection_name(result_name).c_str(),
                             reports);
     BKE_id_attribute_rename(id,
-                            uv_sublayer_name_pin(layer->name).c_str(),
-                            uv_sublayer_name_pin(result_name).c_str(),
+                            get_uv_map_pin_name(layer->name).c_str(),
+                            get_uv_map_pin_name(result_name).c_str(),
                             reports);
   }
 
@@ -595,26 +595,6 @@ CustomDataLayer *BKE_id_attribute_from_index(ID *id,
   return nullptr;
 }
 
-static CustomDataLayer *attribute_from_layerindex(ID *id,
-                                                  const int lookup_index,
-                                                  const eAttrDomain domain,
-                                                  const eCustomDataMask layer_mask)
-{
-  DomainInfo info[ATTR_DOMAIN_NUM];
-  get_domains(id, info);
-
-  CustomData *customdata = info[domain].customdata;
-
-  BLI_assert(lookup_index >= 0);
-  BLI_assert(lookup_index < customdata->totlayer);
-
-  if (!(layer_mask & CD_TYPE_AS_MASK(customdata->layers[lookup_index].type))) {
-    return nullptr;
-  }
-
-  return customdata->layers + lookup_index;
-}
-
 /** Get list of domain types but with ATTR_DOMAIN_FACE and
  * ATTR_DOMAIN_CORNER swapped.
  */
@@ -829,57 +809,3 @@ void BKE_id_attribute_copy_domains_temp(short id_type,
 
   *((short *)r_id->name) = id_type;
 }
-
-UVMap_Data BKE_id_attributes_ensure_uvmap_layers_index(Mesh *mesh,
-                                                       const int index_of_uvmap,
-                                                       ReportList *reports,
-                                                       uint32_t needed_layer_flags)
-{
-  using namespace blender::bke;
-  UVMap_Data data;
-
-  const bool needvertsel = needed_layer_flags & MLOOPUV_VERTSEL;
-  const bool neededgesel = needed_layer_flags & MLOOPUV_EDGESEL;
-  const bool needpinned = needed_layer_flags & MLOOPUV_PINNED;
-
-  CustomDataLayer *uvlayer = attribute_from_layerindex(
-      &mesh->id, index_of_uvmap, ATTR_DOMAIN_CORNER, CD_MASK_PROP_FLOAT2);
-
-  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 *vertsel = BKE_id_attribute_find(
-      &mesh->id, vertsel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER);
-  data.vertsel = vertsel ? static_cast<bool *>(vertsel->data) : nullptr;
-
-  CustomDataLayer *edgesel = BKE_id_attribute_find(
-      &mesh->id, edgesel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER);
-  data.edgesel = edgesel ? static_cast<bool *>(edgesel->data) : nullptr;
-
-  CustomDataLayer *pin = BKE_id_attribute_find(
-      &mesh->id, pinned_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER);
-  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 = 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 = 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 = static_cast<bool *>(layer->data);
-  }
-
-  return data;
-}
diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc
index f3a12885d8a..ede6a02a151 100644
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@ -3485,7 +3485,6 @@ bool CustomData_set_layer_name(CustomData *data, const int type, const int n, co
 const char *CustomData_get_layer_name(const CustomData *data, const int type, const int n)
 {
   const int layer_index = CustomData_get_layer_index_n(data, type, n);
-
   return (layer_index == -1) ? nullptr : data->layers[layer_index].name;
 }
 
@@ -5312,64 +5311,6 @@ void CustomData_blend_read(BlendDataReader *reader, CustomData *data, const int
 
 /** \} */
 
-/* -------------------------------------------------------------------- */
-/** \name Custom Data UVmap Handling
- * \{ */
-
-static UVMap_Data retrieve_uv_map_data(const CustomData &ldata, const int layer_index)
-{
-  using namespace blender::bke;
-  const StringRef name = ldata.layers[layer_index].name;
-
-  const int vertsel = CustomData_get_named_layer_index(
-      &ldata, CD_PROP_BOOL, uv_sublayer_name_vert_selection(name).c_str());
-  co

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list