[Bf-blender-cvs] [eabdf1dc827] refactor-mesh-uv-map-generic: Refactor reading and writing, other changes

Hans Goudey noreply at git.blender.org
Fri Aug 26 04:34:49 CEST 2022


Commit: eabdf1dc82729283cfa162211f5f8e21037caf6c
Author: Hans Goudey
Date:   Thu Aug 18 22:00:28 2022 -0400
Branches: refactor-mesh-uv-map-generic
https://developer.blender.org/rBeabdf1dc82729283cfa162211f5f8e21037caf6c

Refactor reading and writing, other changes

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

M	source/blender/blenkernel/BKE_attribute.h
M	source/blender/blenkernel/BKE_customdata.h
M	source/blender/blenkernel/BKE_mesh_legacy_convert.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/intern/bmesh_interp.c
M	source/blender/io/wavefront_obj/importer/obj_import_mesh.cc
M	source/blender/makesrna/intern/rna_mesh.c

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

diff --git a/source/blender/blenkernel/BKE_attribute.h b/source/blender/blenkernel/BKE_attribute.h
index 64019bb7a26..3e2598a6c05 100644
--- a/source/blender/blenkernel/BKE_attribute.h
+++ b/source/blender/blenkernel/BKE_attribute.h
@@ -20,6 +20,7 @@ struct CustomData;
 struct CustomDataLayer;
 struct ID;
 struct ReportList;
+struct Mesh;
 
 /** #Attribute.domain */
 typedef enum eAttrDomain {
@@ -142,11 +143,11 @@ 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_create_uvmap_layers(struct ID *id,
+UVMap_Data BKE_id_attributes_create_uvmap_layers(struct Mesh *mesh,
                                                  char const *name,
                                                  struct ReportList *reports,
                                                  uint32_t needed_layer_flags);
-UVMap_Data BKE_id_attributes_ensure_uvmap_layers_index(struct ID *id,
+UVMap_Data BKE_id_attributes_ensure_uvmap_layers_index(struct Mesh *mesh,
                                                        int index_of_uvmap,
                                                        struct ReportList *reports,
                                                        uint32_t needed_layer_flags);
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index b1ec14534f5..f9868d614e5 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -769,7 +769,24 @@ typedef struct UVMap_Data {
 
 #ifdef __cplusplus
 
-std::string UV_sublayer_name(char const *layername, char const *prefix);
+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
 /**
diff --git a/source/blender/blenkernel/BKE_mesh_legacy_convert.h b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
index 0eb94de7929..2d4664bf278 100644
--- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h
+++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h
@@ -9,6 +9,12 @@
 
 #include "BLI_utildefines.h"
 
+#ifdef __cplusplus
+#  include "BLI_array.hh"
+#  include "BLI_resource_scope.hh"
+#  include "BLI_vector.hh"
+#endif
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -17,7 +23,15 @@ struct CustomData;
 struct Mesh;
 struct MFace;
 
-void BKE_mesh_legacy_convert_uvs_to_struct(const Mesh *mesh);
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef __cplusplus
+
+void BKE_mesh_legacy_convert_uvs_to_struct(const Mesh *mesh,
+                                           blender::ResourceScope &temp_mloopuv_for_convert,
+                                           blender::Vector<CustomDataLayer, 16> &layers_to_write);
 void BKE_mesh_legacy_convert_uvs_to_generic(Mesh *mesh);
 
 /**
@@ -30,6 +44,12 @@ void BKE_mesh_legacy_convert_hide_layers_to_flags(struct Mesh *mesh);
  */
 void BKE_mesh_legacy_convert_flags_to_hide_layers(struct Mesh *mesh);
 
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /**
  * Recreate #MFace Tessellation.
  *
diff --git a/source/blender/blenkernel/intern/attribute.cc b/source/blender/blenkernel/intern/attribute.cc
index 1c1c9f11788..ebd335fc68a 100644
--- a/source/blender/blenkernel/intern/attribute.cc
+++ b/source/blender/blenkernel/intern/attribute.cc
@@ -145,6 +145,7 @@ bool BKE_id_attribute_rename(ID *id,
                              const char *new_name,
                              ReportList *reports)
 {
+  using namespace blender::bke;
   if (BKE_id_attribute_required(id, old_name)) {
     BLI_assert_msg(0, "Required attribute name is not editable");
     return false;
@@ -170,13 +171,13 @@ bool BKE_id_attribute_rename(ID *id,
 
   if (layer->type == CD_PROP_FLOAT2) {
     /* Scan for and rename uv sublayers layers. */
-    std::string old_vertsel_layer_name = UV_sublayer_name(layer->name, UV_VERTSEL_NAME);
-    std::string old_edgesel_layer_name = UV_sublayer_name(layer->name, UV_EDGESEL_NAME);
-    std::string old_pinned_layer_name = UV_sublayer_name(layer->name, UV_PINNED_NAME);
+    std::string old_vertsel_layer_name = uv_sublayer_name_vert_selection(layer->name);
+    std::string old_edgesel_layer_name = uv_sublayer_name_edge_selection(layer->name);
+    std::string old_pinned_layer_name = uv_sublayer_name_pin(layer->name);
 
-    std::string new_vertsel_layer_name = UV_sublayer_name(result_name, UV_VERTSEL_NAME);
-    std::string new_edgesel_layer_name = UV_sublayer_name(result_name, UV_EDGESEL_NAME);
-    std::string new_pinned_layer_name = UV_sublayer_name(result_name, UV_PINNED_NAME);
+    std::string new_vertsel_layer_name = uv_sublayer_name_vert_selection(result_name);
+    std::string new_edgesel_layer_name = uv_sublayer_name_edge_selection(result_name);
+    std::string new_pinned_layer_name = uv_sublayer_name_pin(result_name);
 
     BKE_id_attribute_rename(
         id, old_vertsel_layer_name.c_str(), new_vertsel_layer_name.c_str(), reports);
@@ -869,51 +870,55 @@ void BKE_id_attribute_copy_domains_temp(short id_type,
   *((short *)r_id->name) = id_type;
 }
 
-UVMap_Data BKE_id_attributes_create_uvmap_layers(ID *id,
+UVMap_Data BKE_id_attributes_create_uvmap_layers(Mesh *mesh,
                                                  char const *name,
                                                  ReportList *reports,
                                                  uint32_t needed_layer_flags)
 {
+  using namespace blender::bke;
   UVMap_Data data;
 
-  bool needvertsel = needed_layer_flags & MLOOPUV_VERTSEL;
-  bool neededgesel = needed_layer_flags & MLOOPUV_EDGESEL;
-  bool needpinned = needed_layer_flags & MLOOPUV_PINNED;
-
   CustomDataLayer *uvlayer = BKE_id_attribute_new(
-      id, name, CD_PROP_FLOAT2, ATTR_DOMAIN_CORNER, reports);
+      &mesh->id, name, CD_PROP_FLOAT2, ATTR_DOMAIN_CORNER, reports);
 
   data.uv = (float(*)[2])uvlayer->data;
 
   data.uv_index = attribute_to_layerindex(
-      id, uvlayer, ATTR_DOMAIN_MASK_CORNER, CD_MASK_PROP_FLOAT2);
+      &mesh->id, uvlayer, ATTR_DOMAIN_MASK_CORNER, CD_MASK_PROP_FLOAT2);
 
-  std::string vertsel_name = UV_sublayer_name(uvlayer->name, UV_VERTSEL_NAME);
-  std::string edgesel_name = UV_sublayer_name(uvlayer->name, UV_EDGESEL_NAME);
-  std::string pinned_name = UV_sublayer_name(uvlayer->name, UV_PINNED_NAME);
+  /* TODO(@Baardaap): martijn still need to handle if one of the names is already taken. */
 
-  //! martijn still need to handle if one of the sublayer names is already taken.
-
-  if (needvertsel) {
+  if (needed_layer_flags & MLOOPUV_VERTSEL) {
     CustomDataLayer *layer = BKE_id_attribute_new(
-        id, vertsel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER, reports);
-    data.vertsel = (bool *)layer->data;
+        &mesh->id,
+        uv_sublayer_name_vert_selection(uvlayer->name).c_str(),
+        CD_PROP_BOOL,
+        ATTR_DOMAIN_CORNER,
+        reports);
+    data.vertsel = static_cast<bool *>(layer->data);
   }
   else {
     data.vertsel = nullptr;
   }
-  if (neededgesel) {
+  if (needed_layer_flags & MLOOPUV_EDGESEL) {
     CustomDataLayer *layer = BKE_id_attribute_new(
-        id, edgesel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER, reports);
-    data.edgesel = (bool *)layer->data;
+        &mesh->id,
+        uv_sublayer_name_edge_selection(uvlayer->name).c_str(),
+        CD_PROP_BOOL,
+        ATTR_DOMAIN_CORNER,
+        reports);
+    data.edgesel = static_cast<bool *>(layer->data);
   }
   else {
     data.edgesel = nullptr;
   }
-  if (needpinned) {
-    CustomDataLayer *layer = BKE_id_attribute_new(
-        id, pinned_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER, reports);
-    data.pinned = (bool *)layer->data;
+  if (needed_layer_flags & MLOOPUV_PINNED) {
+    CustomDataLayer *layer = BKE_id_attribute_new(&mesh->id,
+                                                  uv_sublayer_name_pin(uvlayer->name).c_str(),
+                                                  CD_PROP_BOOL,
+                                                  ATTR_DOMAIN_CORNER,
+                                                  reports);
+    data.pinned = static_cast<bool *>(layer->data);
   }
   else {
     data.pinned = nullptr;
@@ -922,11 +927,12 @@ UVMap_Data BKE_id_attributes_create_uvmap_layers(ID *id,
   return data;
 }
 
-UVMap_Data BKE_id_attributes_ensure_uvmap_layers_index(struct ID *id,
+UVMap_Data BKE_id_attributes_ensure_uvmap_layers_index(Mesh *mesh,
                                                        const int index_of_uvmap,
                                                        struct ReportList *reports,
                                                        uint32_t needed_layer_flags)
 {
+  using namespace blender::bke;
   UVMap_Data data;
 
   const bool needvertsel = needed_layer_flags & MLOOPUV_VERTSEL;
@@ -934,43 +940,43 @@ UVMap_Data BKE_id_attributes_ensure_uvmap_layers_index(struct ID *id,
   const bool needpinned = needed_layer_flags & MLOOPUV_PINNED;
 
   CustomDataLayer *uvlayer = attribute_from_layerindex(
-      id, index_of_uvmap, ATTR_DOMAIN_CORNER, CD_MASK_PROP_FLOAT2);
+      &mesh->id, index_of_uvmap, ATTR_DOMAIN_CORNER, CD_MASK_PROP_FLOAT2);
 
   data.uv_index = attribute_to_layerindex(
-      id, uvlayer, ATTR_DOMAIN_MASK_CORNER, CD_MASK_PROP_FLOAT2);
+      &mesh->id, uvlayer, ATTR_DOMAIN_MASK_CORNER, CD_MASK_PROP_FLOAT2);
   data.uv = (float(*)[2])uvlayer->data;
 
-  std::string vertsel_name = UV_sublayer_name(uvlayer->name, UV_VERTSEL_NAME);
-  std::string edgesel_name = UV_sublayer_name(uvlayer->name, UV_EDGESEL_NAME);
-  std::string pinned_name = UV_sublayer_name(uvlayer->name, UV_PINNED_NAME);
+  std::string vertsel_name = uv_sublayer_name_vert_selection(uvlayer->name);
+  std::string edgesel_name = uv_sublayer_name_edge_selection(uvlayer->name);
+  std::string p

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list