[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