[Bf-blender-cvs] [a521860909a] refactor-mesh-uv-map-generic: Merge branch 'master' into refactor-mesh-uv-map-generic
Hans Goudey
noreply at git.blender.org
Fri Aug 26 04:34:48 CEST 2022
Commit: a521860909a318dcea01185884969636917db7d9
Author: Hans Goudey
Date: Wed Aug 17 15:14:58 2022 -0400
Branches: refactor-mesh-uv-map-generic
https://developer.blender.org/rBa521860909a318dcea01185884969636917db7d9
Merge branch 'master' into refactor-mesh-uv-map-generic
===================================================================
===================================================================
diff --cc source/blender/blenkernel/BKE_customdata.h
index da6a6917957,2ced685884b..4332f711ab6
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@@ -121,7 -123,7 +123,7 @@@ void CustomData_data_mix_value
/**
* Compares if data1 is equal to data2. type is a valid CustomData type
-- * enum (e.g. #CD_MLOOPUV). the layer type's equal function is used to compare
++ * enum (e.g. #CD_PROP_FLOAT). the layer type's equal function is used to compare
* the data, if it exists, otherwise #memcmp is used.
*/
bool CustomData_data_equals(int type, const void *data1, const void *data2);
diff --cc source/blender/blenkernel/BKE_mesh_mapping.h
index 7d76168364a,abe590b6806..d7033e7bf75
--- a/source/blender/blenkernel/BKE_mesh_mapping.h
+++ b/source/blender/blenkernel/BKE_mesh_mapping.h
@@@ -76,8 -92,9 +91,9 @@@ typedef struct MeshElemMap
/* mapping */
UvVertMap *BKE_mesh_uv_vert_map_create(const struct MPoly *mpoly,
+ const bool *hide_poly,
const struct MLoop *mloop,
- const struct MLoopUV *mloopuv,
+ const float (*mloopuv)[2],
unsigned int totpoly,
unsigned int totvert,
const float limit[2],
diff --cc source/blender/blenkernel/intern/attribute.cc
index d6188936a08,b6d39486313..1c1c9f11788
--- a/source/blender/blenkernel/intern/attribute.cc
+++ b/source/blender/blenkernel/intern/attribute.cc
@@@ -858,112 -791,3 +868,111 @@@ void BKE_id_attribute_copy_domains_temp
*((short *)r_id->name) = id_type;
}
+
- UVMap_Data BKE_id_attributes_create_uvmap_layers(struct ID *id,
++UVMap_Data BKE_id_attributes_create_uvmap_layers(ID *id,
+ char const *name,
- struct ReportList *reports,
++ ReportList *reports,
+ uint32_t needed_layer_flags)
+{
+ 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);
+
+ data.uv = (float(*)[2])uvlayer->data;
+
+ data.uv_index = attribute_to_layerindex(
+ 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);
+
+ //! martijn still need to handle if one of the sublayer names is already taken.
+
+ if (needvertsel) {
+ CustomDataLayer *layer = BKE_id_attribute_new(
+ id, vertsel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER, reports);
+ data.vertsel = (bool *)layer->data;
+ }
+ else {
+ data.vertsel = nullptr;
- ;
+ }
+ if (neededgesel) {
+ CustomDataLayer *layer = BKE_id_attribute_new(
+ id, edgesel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER, reports);
+ data.edgesel = (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;
+ }
+ else {
+ data.pinned = nullptr;
+ }
+
+ return data;
+}
+
+UVMap_Data BKE_id_attributes_ensure_uvmap_layers_index(struct ID *id,
+ const int index_of_uvmap,
+ struct ReportList *reports,
+ uint32_t needed_layer_flags)
+{
+ 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(
+ 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);
+ 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);
+
+ CustomDataLayer *vslayer = BKE_id_attribute_find(
+ id, vertsel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER);
+ data.vertsel = vslayer ? (bool *)vslayer->data : nullptr;
+
+ CustomDataLayer *eslayer = BKE_id_attribute_find(
+ id, edgesel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER);
+ data.edgesel = eslayer ? (bool *)eslayer->data : nullptr;
+
+ CustomDataLayer *pnlayer = BKE_id_attribute_find(
+ id, pinned_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER);
+ data.pinned = pnlayer ? (bool *)pnlayer->data : nullptr;
+
+ if (needvertsel && data.vertsel == nullptr) {
+ CustomDataLayer *layer = BKE_id_attribute_new(
+ id, vertsel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER, reports);
+ data.vertsel = (bool *)layer->data;
+ }
+
+ if (neededgesel && data.edgesel == nullptr) {
+ CustomDataLayer *layer = BKE_id_attribute_new(
+ id, edgesel_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER, reports);
+ data.edgesel = (bool *)layer->data;
+ }
+
+ if (needpinned && data.pinned == nullptr) {
+ CustomDataLayer *layer = BKE_id_attribute_new(
+ id, pinned_name.c_str(), CD_PROP_BOOL, ATTR_DOMAIN_CORNER, reports);
+ data.pinned = (bool *)layer->data;
+ }
+
+ return data;
+}
diff --cc source/blender/blenkernel/intern/attribute_access.cc
index 7ffb572e71b,b9995796a21..1569f8cfa8e
--- a/source/blender/blenkernel/intern/attribute_access.cc
+++ b/source/blender/blenkernel/intern/attribute_access.cc
@@@ -56,20 -56,7 +56,22 @@@ const char *no_procedural_access_messag
bool allow_procedural_attribute_access(StringRef attribute_name)
{
- return !attribute_name.startswith(".selection") && !attribute_name.startswith(".hide");
+ if (attribute_name.startswith(".selection")) {
+ return false;
+ }
++ if (attribute_name.startswith(".hide")) {
++ return false;
++ }
+ if (attribute_name.startswith("." UV_VERTSEL_NAME ".")) {
+ return false;
+ }
+ if (attribute_name.startswith("." UV_EDGESEL_NAME ".")) {
+ return false;
+ }
+ if (attribute_name.startswith("." UV_PINNED_NAME ".")) {
+ return false;
+ }
-
+ return true;
}
static int attribute_data_type_complexity(const eCustomDataType data_type)
diff --cc source/blender/blenkernel/intern/customdata.cc
index 3291cdc8a48,69825031795..aa1c5c34f34
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@@ -3502,7 -3537,10 +3578,7 @@@ int CustomData_get_offset_named(const C
return data->layers[layer_index].offset;
}
- bool CustomData_set_layer_name(CustomData *data, int type, int n, const char *name)
-bool CustomData_set_layer_name(const CustomData *data,
- const int type,
- const int n,
- const char *name)
++bool CustomData_set_layer_name(CustomData *data, const int type, const int n, const char *name)
{
/* get the layer index of the first layer of type */
const int layer_index = CustomData_get_layer_index_n(data, type, n);
@@@ -5331,107 -5384,6 +5422,107 @@@ void CustomData_blend_read(BlendDataRea
/** \} */
+/* -------------------------------------------------------------------- */
+/** \name Custom Data UVmap Handling
+ * \{ */
+
+std::string UV_sublayer_name(char const *layername, char const *prefix)
+{
+ /* If you change the naming scheme here, change it as well in BM_uv_layer_ensure_sublayer() . */
+ return "." + std::string(prefix) + "." + std::string(layername);
+}
+
+UVMap_Data CustomData_get_uvmap_data(const CustomData *ldata, char const *name)
+{
+
+ 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;
+ }
+
+ std::string vertsel_name = UV_sublayer_name(ldata->layers[data.uv_index].name, UV_VERTSEL_NAME);
+ std::string edgesel_name = UV_sublayer_name(ldata->layers[data.uv_index].name, UV_EDGESEL_NAME);
+ std::string pinned_name = UV_sublayer_name(ldata->layers[data.uv_index].name, UV_PINNED_NAME);
+
+ int vertsel_index = CustomData_get_named_layer_index(ldata, CD_PROP_BOOL, vertsel_name.c_str());
+ int edgesel_index = CustomData_get_named_layer_index(ldata, CD_PROP_BOOL, edgesel_name.c_str());
+ 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;
+}
+
+UVMap_Data CustomData_get_uvmap_data_n(const CustomData *ldata, const int n)
+{
+
+ 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;
+ }
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list