[Bf-blender-cvs] [1608abd78c3] refactor-mesh-uv-map-generic: Move the get_uv_map_vert/edge/pin_selection_name() functions to C from C++ and avoid std::string.

Martijn Versteegh noreply at git.blender.org
Thu Oct 6 15:53:19 CEST 2022


Commit: 1608abd78c3064d3079d74ef6beca1d3864a8d26
Author: Martijn Versteegh
Date:   Thu Oct 6 15:45:22 2022 +0200
Branches: refactor-mesh-uv-map-generic
https://developer.blender.org/rB1608abd78c3064d3079d74ef6beca1d3864a8d26

Move the get_uv_map_vert/edge/pin_selection_name() functions to C from C++ and avoid std::string.

We need these functions both in C and in C code, also the std::string
concatenation was quite slow because it onvolves allocation. It now
uses a (stack allocated) char buffer passed in from the caller.

This alos gives us a single place in the code to handle overflowing
MAX_CUSTOMDATA_LAYER_NAME (to be done in a future commit).

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

M	source/blender/blenkernel/BKE_attribute.h
M	source/blender/blenkernel/BKE_attribute.hh
M	source/blender/blenkernel/intern/attribute.cc
M	source/blender/blenkernel/intern/mesh_legacy_convert.cc
M	source/blender/bmesh/intern/bmesh_interp.c
M	source/blender/bmesh/intern/bmesh_query_uv.cc
M	source/blender/editors/mesh/mesh_data.cc

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

diff --git a/source/blender/blenkernel/BKE_attribute.h b/source/blender/blenkernel/BKE_attribute.h
index 13eefd27bec..cc25bc3b897 100644
--- a/source/blender/blenkernel/BKE_attribute.h
+++ b/source/blender/blenkernel/BKE_attribute.h
@@ -8,6 +8,9 @@
 
 #pragma once
 
+#include <string.h>
+
+#include "BLI_string.h"
 #include "BLI_sys_types.h"
 
 #include "BKE_customdata.h"
@@ -138,6 +141,44 @@ 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);
 
+
+inline char const *get_uv_map_vert_selection_name(char const *uv_map_name, char *buffer)
+{
+  size_t len = strlen(uv_map_name);
+
+  BLI_assert(strlen(UV_VERTSEL_NAME) == 2);
+  if (len >= MAX_CUSTOMDATA_LAYER_NAME - 5) {
+    /* TODO(martijn) come up with a way to generate a non-colliding shortening... */
+  }
+  BLI_snprintf(buffer, MAX_CUSTOMDATA_LAYER_NAME, ".%s.%s", UV_VERTSEL_NAME, uv_map_name);
+  return buffer;
+}
+
+inline char const *get_uv_map_edge_selection_name(char const *uv_map_name, char *buffer)
+{
+  size_t len = strlen(uv_map_name);
+
+  BLI_assert(strlen(UV_VERTSEL_NAME) == 2);
+  if (len >= MAX_CUSTOMDATA_LAYER_NAME - 5) {
+    /* TODO(martijn) come up with a way to generate a non-colliding shortening... */
+  }
+  BLI_snprintf(buffer, MAX_CUSTOMDATA_LAYER_NAME, ".%s.%s", UV_EDGESEL_NAME, uv_map_name);
+  return buffer;
+}
+
+inline char const *get_uv_map_pin_name(char const *uv_map_name, char *buffer)
+{
+  size_t len = strlen(uv_map_name);
+
+  BLI_assert(strlen(UV_VERTSEL_NAME) == 2);
+  if (len >= MAX_CUSTOMDATA_LAYER_NAME - 5) {
+    /* TODO(martijn) come up with a way to generate a non-colliding shortening... */
+  }
+  BLI_snprintf(buffer, MAX_CUSTOMDATA_LAYER_NAME, ".%s.%s", UV_PINNED_NAME, uv_map_name);
+  return buffer;
+}
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/BKE_attribute.hh b/source/blender/blenkernel/BKE_attribute.hh
index 4021de039ff..7b13b8a2b09 100644
--- a/source/blender/blenkernel/BKE_attribute.hh
+++ b/source/blender/blenkernel/BKE_attribute.hh
@@ -827,21 +827,6 @@ class CustomDataAttributes {
   bool foreach_attribute(const AttributeForeachCallback callback, eAttrDomain domain) const;
 };
 
-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;
-}
-
 /* -------------------------------------------------------------------- */
 /** \name #AttributeIDRef Inline Methods
  * \{ */
diff --git a/source/blender/blenkernel/intern/attribute.cc b/source/blender/blenkernel/intern/attribute.cc
index 93405166534..a8eea24cdb6 100644
--- a/source/blender/blenkernel/intern/attribute.cc
+++ b/source/blender/blenkernel/intern/attribute.cc
@@ -170,17 +170,19 @@ bool BKE_id_attribute_rename(ID *id,
 
   if (layer->type == CD_PROP_FLOAT2) {
     /* Rename UV sub-attributes. */
+    char buffer_src[MAX_CUSTOMDATA_LAYER_NAME];
+    char buffer_dst[MAX_CUSTOMDATA_LAYER_NAME];
     BKE_id_attribute_rename(id,
-                            get_uv_map_vert_selection_name(layer->name).c_str(),
-                            get_uv_map_vert_selection_name(result_name).c_str(),
+                            get_uv_map_vert_selection_name(layer->name, buffer_src),
+                            get_uv_map_vert_selection_name(result_name, buffer_dst),
                             reports);
     BKE_id_attribute_rename(id,
-                            get_uv_map_edge_selection_name(layer->name).c_str(),
-                            get_uv_map_edge_selection_name(result_name).c_str(),
+                            get_uv_map_edge_selection_name(layer->name, buffer_src),
+                            get_uv_map_edge_selection_name(result_name, buffer_dst),
                             reports);
     BKE_id_attribute_rename(id,
-                            get_uv_map_pin_name(layer->name).c_str(),
-                            get_uv_map_pin_name(result_name).c_str(),
+                            get_uv_map_pin_name(layer->name, buffer_src),
+                            get_uv_map_pin_name(result_name, buffer_dst),
                             reports);
   }
 
diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
index 132f2ff1a02..9e3b336a8ad 100644
--- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc
+++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc
@@ -1193,10 +1193,13 @@ void BKE_mesh_legacy_convert_uvs_to_struct(
 
   /* Don't write the boolean UV map sublayers which will be written in the legacy #MLoopUV type. */
   Set<std::string> uv_sublayers_to_skip;
+  char vert_name[MAX_CUSTOMDATA_LAYER_NAME];
+  char edge_name[MAX_CUSTOMDATA_LAYER_NAME];
+  char pin_name[MAX_CUSTOMDATA_LAYER_NAME];
   for (const CustomDataLayer &layer : face_corner_layers_to_write) {
-    uv_sublayers_to_skip.add_multiple_new({get_uv_map_vert_selection_name(layer.name),
-                                           get_uv_map_edge_selection_name(layer.name),
-                                           get_uv_map_pin_name(layer.name)});
+    uv_sublayers_to_skip.add_multiple_new({get_uv_map_vert_selection_name(layer.name, vert_name),
+                                           get_uv_map_edge_selection_name(layer.name, edge_name),
+                                           get_uv_map_pin_name(layer.name, pin_name)});
   }
 
   for (const CustomDataLayer &layer : face_corner_layers_to_write) {
@@ -1214,12 +1217,13 @@ void BKE_mesh_legacy_convert_uvs_to_struct(
         mesh->totloop);
     mloopuv_layer.data = mloopuv.data();
 
+	char buffer[MAX_CUSTOMDATA_LAYER_NAME];
     const VArray<bool> vert_selection = attributes.lookup_or_default<bool>(
-        get_uv_map_vert_selection_name(layer.name), ATTR_DOMAIN_CORNER, false);
+        get_uv_map_vert_selection_name(layer.name, buffer), ATTR_DOMAIN_CORNER, false);
     const VArray<bool> edge_selection = attributes.lookup_or_default<bool>(
-        get_uv_map_edge_selection_name(layer.name), ATTR_DOMAIN_CORNER, false);
+        get_uv_map_edge_selection_name(layer.name, buffer), ATTR_DOMAIN_CORNER, false);
     const VArray<bool> pin = attributes.lookup_or_default<bool>(
-        get_uv_map_pin_name(layer.name), ATTR_DOMAIN_CORNER, false);
+        get_uv_map_pin_name(layer.name, buffer), ATTR_DOMAIN_CORNER, false);
 
     threading::parallel_for(mloopuv.index_range(), 2048, [&](IndexRange range) {
       for (const int i : range) {
@@ -1310,13 +1314,14 @@ void BKE_mesh_legacy_convert_uvs_to_generic(Mesh *mesh)
     CustomData_free_layer_named(&mesh->ldata, name.c_str(), mesh->totloop);
     CustomData_add_layer_named(
         &mesh->ldata, CD_PROP_FLOAT2, CD_ASSIGN, coords, mesh->totloop, name.c_str());
+    char buffer[MAX_CUSTOMDATA_LAYER_NAME];
     if (vert_selection) {
       CustomData_add_layer_named(&mesh->ldata,
                                  CD_PROP_BOOL,
                                  CD_ASSIGN,
                                  vert_selection,
                                  mesh->totloop,
-                                 get_uv_map_vert_selection_name(name).c_str());
+                                 get_uv_map_vert_selection_name(name.c_str(), buffer));
     }
     if (edge_selection) {
       CustomData_add_layer_named(&mesh->ldata,
@@ -1324,7 +1329,7 @@ void BKE_mesh_legacy_convert_uvs_to_generic(Mesh *mesh)
                                  CD_ASSIGN,
                                  edge_selection,
                                  mesh->totloop,
-                                 get_uv_map_edge_selection_name(name).c_str());
+                                 get_uv_map_edge_selection_name(name.c_str(), buffer));
     }
     if (pin) {
       CustomData_add_layer_named(&mesh->ldata,
@@ -1332,7 +1337,7 @@ void BKE_mesh_legacy_convert_uvs_to_generic(Mesh *mesh)
                                  CD_ASSIGN,
                                  pin,
                                  mesh->totloop,
-                                 get_uv_map_pin_name(name).c_str());
+                                 get_uv_map_pin_name(name.c_str(), buffer));
     }
   }
 
diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c
index 028cbe90ee4..724845f1079 100644
--- a/source/blender/bmesh/intern/bmesh_interp.c
+++ b/source/blender/bmesh/intern/bmesh_interp.c
@@ -18,6 +18,7 @@
 #include "BLI_string.h"
 #include "BLI_task.h"
 
+#include "BKE_attribute.h"
 #include "BKE_customdata.h"
 #include "BKE_multires.h"
 
@@ -883,22 +884,19 @@ void BM_data_layer_ensure_named(BMesh *bm, CustomData *data, int type, const cha
 void BM_uv_map_ensure_vert_selection_attribute(BMesh *bm, const char *uv_map_name)
 {
   char name[MAX_CUSTOMDATA_LAYER_NAME];
-  BLI_snprintf(name, MAX_CUSTOMDATA_LAYER_NAME, ".%s.%s", UV_VERTSEL_NAME, uv_map_name);
-  BM_data_layer_ensure_named(bm, &bm->ldata, CD_PROP_FLOAT2, name);
+  BM_data_layer_ensure_named(bm, &bm->ldata, CD_PROP_FLOAT2, get_uv_map_vert_selection_name(uv_map_name, name));
 }
 
 void BM_uv_map_ensure_edge_selection_attribute(BMesh *bm, const char *uv_map_name)
 {
   char name[MAX_CUSTOMDATA_LAYER_NAME];
-  BLI_snprintf(name, MAX_CUSTOMDATA_LAYER_NAME, ".%s.%s", UV_EDGESEL_NAME, uv_map_name);
-  BM_data_layer_ensure_named(bm, &bm->ldata, CD_PROP_FLOAT2, name);
+  BM_data_layer_ensure_named(bm, &bm->ldata, CD_PROP_FLOAT2, get_uv_map_edge_selection_name(uv_map_name, name));
 }
 
 void BM_uv_map_ensure_pin_attribute(BMesh *bm, const char *uv_map_name)
 {
   char name[MAX_CUSTOMDATA_LAYER_NAME];
-  BLI_snprintf(name, MAX_CUSTOMDATA_LAYER_NAME, ".%s.%s", UV_PINNED_NAME, uv_map_name);
-  BM_data_layer_ensure_named(bm, &bm->ldata, CD_PROP_FLOAT2, name);
+  BM_data_layer_ensure_named(bm, &bm->ldata, CD_PROP_FLOAT2, get_uv_map_pin_name(uv_map_name, name));
 }
 
 void BM_data_layer_f

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list