diff options
Diffstat (limited to 'source/blender/makesrna/intern/rna_mesh.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_mesh.c | 111 |
1 files changed, 103 insertions, 8 deletions
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index da4be3cd0da..65468977ccb 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -21,6 +21,7 @@ #include "BLI_math_rotation.h" #include "BLI_utildefines.h" +#include "BKE_attribute.h" #include "BKE_editmesh.h" #include "RNA_access.h" @@ -166,27 +167,62 @@ static CustomData *rna_cd_from_layer(PointerRNA *ptr, CustomDataLayer *cdl) static void rna_MeshVertexLayer_name_set(PointerRNA *ptr, const char *value) { - rna_cd_layer_name_set(rna_mesh_vdata(ptr), (CustomDataLayer *)ptr->data, value); + CustomDataLayer *layer = (CustomDataLayer *)ptr->data; + + if (CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL) { + BKE_id_attribute_rename(ptr->owner_id, layer->name, value, NULL); + } + else { + rna_cd_layer_name_set(rna_mesh_vdata(ptr), layer, value); + } } # if 0 static void rna_MeshEdgeLayer_name_set(PointerRNA *ptr, const char *value) { - rna_cd_layer_name_set(rna_mesh_edata(ptr), (CustomDataLayer *)ptr->data, value); + CustomDataLayer *layer = (CustomDataLayer *)ptr->data; + + if (CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL) { + BKE_id_attribute_rename(ptr->owner_id, layer->name, value, NULL); + } + else { + rna_cd_layer_name_set(rna_mesh_edata(ptr), layer, value); + } } # endif static void rna_MeshPolyLayer_name_set(PointerRNA *ptr, const char *value) { - rna_cd_layer_name_set(rna_mesh_pdata(ptr), (CustomDataLayer *)ptr->data, value); + CustomDataLayer *layer = (CustomDataLayer *)ptr->data; + + if (CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL) { + BKE_id_attribute_rename(ptr->owner_id, layer->name, value, NULL); + } + else { + rna_cd_layer_name_set(rna_mesh_pdata(ptr), layer, value); + } } static void rna_MeshLoopLayer_name_set(PointerRNA *ptr, const char *value) { - rna_cd_layer_name_set(rna_mesh_ldata(ptr), (CustomDataLayer *)ptr->data, value); + CustomDataLayer *layer = (CustomDataLayer *)ptr->data; + + if (CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL) { + BKE_id_attribute_rename(ptr->owner_id, layer->name, value, NULL); + } + else { + rna_cd_layer_name_set(rna_mesh_ldata(ptr), layer, value); + } } /* only for layers shared between types */ static void rna_MeshAnyLayer_name_set(PointerRNA *ptr, const char *value) { - CustomData *cd = rna_cd_from_layer(ptr, (CustomDataLayer *)ptr->data); - rna_cd_layer_name_set(cd, (CustomDataLayer *)ptr->data, value); + CustomDataLayer *layer = (CustomDataLayer *)ptr->data; + + if (CD_TYPE_AS_MASK(layer->type) & CD_MASK_PROP_ALL) { + BKE_id_attribute_rename(ptr->owner_id, layer->name, value, NULL); + } + else { + CustomData *cd = rna_cd_from_layer(ptr, layer); + rna_cd_layer_name_set(cd, layer, value); + } } static bool rna_Mesh_has_custom_normals_get(PointerRNA *ptr) @@ -295,6 +331,13 @@ static void rna_Mesh_update_facemask(Main *bmain, Scene *scene, PointerRNA *ptr) rna_Mesh_update_draw(bmain, scene, ptr); } +static void rna_Mesh_update_positions_tag(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + Mesh *mesh = rna_mesh(ptr); + BKE_mesh_tag_coords_changed(mesh); + rna_Mesh_update_data_legacy_deg_tag_all(bmain, scene, ptr); +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -1094,7 +1137,7 @@ static int rna_MeshPoly_vertices_get_length(const PointerRNA *ptr, { const MPoly *mp = (MPoly *)ptr->data; /* NOTE: raw access uses dummy item, this _could_ crash, - * watch out for this, mface uses it but it can't work here. */ + * watch out for this, #MFace uses it but it can't work here. */ return (length[0] = mp->totloop); } @@ -1680,6 +1723,56 @@ static void UNUSED_FUNCTION(rna_mesh_unused)(void) /* end unused function block */ } +static bool rna_Mesh_materials_override_apply(Main *bmain, + PointerRNA *ptr_dst, + PointerRNA *UNUSED(ptr_src), + PointerRNA *UNUSED(ptr_storage), + PropertyRNA *prop_dst, + PropertyRNA *UNUSED(prop_src), + PropertyRNA *UNUSED(prop_storage), + const int UNUSED(len_dst), + const int UNUSED(len_src), + const int UNUSED(len_storage), + PointerRNA *ptr_item_dst, + PointerRNA *ptr_item_src, + PointerRNA *UNUSED(ptr_item_storage), + IDOverrideLibraryPropertyOperation *opop) +{ + BLI_assert_msg(opop->operation == IDOVERRIDE_LIBRARY_OP_REPLACE, + "Unsupported RNA override operation on collections' objects"); + UNUSED_VARS_NDEBUG(opop); + + Mesh *mesh_dst = (Mesh *)ptr_dst->owner_id; + + if (ptr_item_dst->type == NULL || ptr_item_src->type == NULL) { + // BLI_assert_msg(0, "invalid source or destination material."); + return false; + } + + Material *mat_dst = ptr_item_dst->data; + Material *mat_src = ptr_item_src->data; + + if (mat_src == mat_dst) { + return true; + } + + bool is_modified = false; + for (int i = 0; i < mesh_dst->totcol; i++) { + if (mesh_dst->mat[i] == mat_dst) { + id_us_min(&mat_dst->id); + mesh_dst->mat[i] = mat_src; + id_us_plus(&mat_src->id); + is_modified = true; + } + } + + if (is_modified) { + RNA_property_update_main(bmain, NULL, ptr_dst, prop_dst); + } + + return true; +} + /** \} */ #else @@ -1727,7 +1820,7 @@ static void rna_def_mvert(BlenderRNA *brna) prop = RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION); RNA_def_property_ui_text(prop, "Location", ""); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data_legacy_deg_tag_all"); + RNA_def_property_update(prop, 0, "rna_Mesh_update_positions_tag"); prop = RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION); RNA_def_property_array(prop, 3); @@ -2435,6 +2528,8 @@ void rna_def_texmat_common(StructRNA *srna, const char *texspace_editable) RNA_def_property_struct_type(prop, "Material"); RNA_def_property_ui_text(prop, "Materials", ""); RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.c */ + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_override_funcs(prop, NULL, NULL, "rna_Mesh_materials_override_apply"); RNA_def_property_collection_funcs( prop, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "rna_IDMaterials_assign_int"); } |