[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