Commit: 392a95e0bcc9576b3e8dadc2484a1ce1e1ce42ca Author: Martijn Versteegh Date: Tue Jan 3 13:09:45 2023 +0100 Branches: refactor-mesh-uv-map-generic https://developer.blender.org/rB392a95e0bcc9576b3e8dadc2484a1ce1e1ce42ca
Handle UV map associated bool lyers on attribute removal =================================================================== M source/blender/blenkernel/BKE_customdata.h M source/blender/blenkernel/intern/attribute.cc M source/blender/blenkernel/intern/customdata.cc =================================================================== diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h index 01ceee78497..b725ec3b6ec 100644 --- a/source/blender/blenkernel/BKE_customdata.h +++ b/source/blender/blenkernel/BKE_customdata.h @@ -440,6 +440,7 @@ int CustomData_get_n_offset(const struct CustomData *data, int type, int n); int CustomData_get_layer_index(const struct CustomData *data, int type); int CustomData_get_layer_index_n(const struct CustomData *data, int type, int n); int CustomData_get_named_layer_index(const struct CustomData *data, int type, const char *name); +int CustomData_get_named_layer_index_notype(const struct CustomData *data, const char *name); int CustomData_get_active_layer_index(const struct CustomData *data, int type); int CustomData_get_render_layer_index(const struct CustomData *data, int type); int CustomData_get_clone_layer_index(const struct CustomData *data, int type); diff --git a/source/blender/blenkernel/intern/attribute.cc b/source/blender/blenkernel/intern/attribute.cc index 0431967ebc0..490f7d48833 100644 --- a/source/blender/blenkernel/intern/attribute.cc +++ b/source/blender/blenkernel/intern/attribute.cc @@ -341,11 +341,23 @@ bool BKE_id_attribute_remove(ID *id, const char *name, ReportList *reports) DomainInfo info[ATTR_DOMAIN_NUM]; get_domains(id, info); + + if (GS(id->name) == ID_ME) { Mesh *mesh = reinterpret_cast<Mesh *>(id); if (BMEditMesh *em = mesh->edit_mesh) { for (const int domain : IndexRange(ATTR_DOMAIN_NUM)) { if (CustomData *data = info[domain].customdata) { + int layer_index = CustomData_get_named_layer_index_notype(data, name); + if (layer_index >= 0) { + if (data->layers[layer_index].type == CD_PROP_FLOAT2) { + /* free associated UV map bool layers */ + char buffer_src[MAX_CUSTOMDATA_LAYER_NAME]; + BM_data_layer_free_named(em->bm, data, BKE_uv_map_vert_selection_name_get(name, buffer_src)); + BM_data_layer_free_named(em->bm, data, BKE_uv_map_edge_selection_name_get(name, buffer_src)); + BM_data_layer_free_named(em->bm, data, BKE_uv_map_pin_name_get(name, buffer_src)); + } + } if (BM_data_layer_free_named(em->bm, data, name)) { if (name == StringRef(mesh->active_color_attribute)) { MEM_SAFE_FREE(mesh->active_color_attribute); @@ -362,10 +374,30 @@ bool BKE_id_attribute_remove(ID *id, const char *name, ReportList *reports) } std::optional<MutableAttributeAccessor> attributes = get_attribute_accessor_for_write(*id); + if (!attributes) { return false; } + if (GS(id->name) == ID_ME) { + + std::optional<blender::bke::AttributeMetaData> metadata = attributes->lookup_meta_data(name); + if (metadata->data_type == CD_PROP_FLOAT2) + { + /* remove UV sub-attributes. */ + char buffer_src[MAX_CUSTOMDATA_LAYER_NAME]; + BKE_id_attribute_remove(id, + BKE_uv_map_vert_selection_name_get(name, buffer_src), + reports); + BKE_id_attribute_remove(id, + BKE_uv_map_edge_selection_name_get(name, buffer_src), + reports); + BKE_id_attribute_remove(id, + BKE_uv_map_pin_name_get(name, buffer_src), + reports); + } + } + return attributes->remove(name); } diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc index 0509592427a..04233d1aedc 100644 --- a/source/blender/blenkernel/intern/customdata.cc +++ b/source/blender/blenkernel/intern/customdata.cc @@ -2506,6 +2506,18 @@ int CustomData_get_named_layer_index(const CustomData *data, const int type, con return -1; } +int CustomData_get_named_layer_index_notype(const CustomData *data, const char *name) +{ + for (int i = 0; i < data->totlayer; i++) { + if (STREQ(data->layers[i].name, name)) { + return i; + } + } + + return -1; +} + + int CustomData_get_active_layer_index(const CustomData *data, const int type) { const int layer_index = data->typemap[type]; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs