[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