Commit: 648b9c6159330f3ff313293b0126398963246627 Author: Hans Goudey Date: Mon Jul 5 13:14:40 2021 -0500 Branches: refactor-vertex-group-names https://developer.blender.org/rB648b9c6159330f3ff313293b0126398963246627
Safer RNA object vertex group API (should fix issues reported by @Mets, thanks!) =================================================================== M source/blender/blenkernel/BKE_deform.h M source/blender/blenkernel/intern/deform.c M source/blender/makesrna/intern/rna_object.c =================================================================== diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h index 1330bee87df..0ab126a70ae 100644 --- a/source/blender/blenkernel/BKE_deform.h +++ b/source/blender/blenkernel/BKE_deform.h @@ -39,6 +39,7 @@ struct Object; struct bDeformGroup; struct ID; +bool BKE_object_supports_vertex_groups(const struct Object *ob); const struct ListBase *BKE_object_defgroup_list(const struct Object *ob); struct ListBase *BKE_object_defgroup_list_mutable(struct Object *ob); diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index 4a2c084bde5..20c2b0425b8 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -540,13 +540,25 @@ ListBase *BKE_id_defgroup_list_get_mutable(ID *id) return (ListBase *)BKE_id_defgroup_list_get(id); } +bool BKE_object_supports_vertex_groups(const Object *ob) +{ + const ID *id = (const ID *)ob->data; + if (id == NULL) { + return false; + } + + return ELEM(GS(id->name), ID_ME, ID_LT, ID_GD); +} + const ListBase *BKE_object_defgroup_list(const Object *ob) { + BLI_assert(ob->data != NULL); return BKE_id_defgroup_list_get((const ID *)ob->data); } ListBase *BKE_object_defgroup_list_mutable(Object *ob) { + BLI_assert(ob->data != NULL); return BKE_id_defgroup_list_get_mutable((ID *)ob->data); } diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 5259c5367c0..e110459eeea 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -728,16 +728,6 @@ static const EnumPropertyItem *rna_Object_parent_type_itemf(bContext *UNUSED(C), return item; } -static void rna_Object_vertex_groups_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) -{ - Object *ob = (Object *)ptr->data; - - ListBase *defbase = BKE_object_defgroup_list_mutable(ob); - iter->valid = defbase != NULL; - - rna_iterator_listbase_begin(iter, defbase, NULL); -} - static void rna_Object_empty_display_type_set(PointerRNA *ptr, int value) { Object *ob = (Object *)ptr->data; @@ -800,9 +790,27 @@ static void rna_Object_dup_collection_set(PointerRNA *ptr, } } +static void rna_Object_vertex_groups_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) +{ + Object *ob = (Object *)ptr->data; + if (!BKE_object_supports_vertex_groups(ob)) { + iter->valid = 0; + return; + } + + ListBase *defbase = BKE_object_defgroup_list_mutable(ob); + iter->valid = defbase != NULL; + + rna_iterator_listbase_begin(iter, defbase, NULL); +} + static void rna_VertexGroup_name_set(PointerRNA *ptr, const char *value) { Object *ob = (Object *)ptr->owner_id; + if (!BKE_object_supports_vertex_groups(ob)) { + return; + } + bDeformGroup *dg = (bDeformGroup *)ptr->data; BLI_strncpy_utf8(dg->name, value, sizeof(dg->name)); BKE_object_defgroup_unique_name(dg, ob); @@ -811,6 +819,9 @@ static void rna_VertexGroup_name_set(PointerRNA *ptr, const char *value) static int rna_VertexGroup_index_get(PointerRNA *ptr) { Object *ob = (Object *)ptr->owner_id; + if (!BKE_object_supports_vertex_groups(ob)) { + return -1; + } const ListBase *defbase = BKE_object_defgroup_list(ob); return BLI_findindex(defbase, ptr->data); @@ -819,6 +830,10 @@ static int rna_VertexGroup_index_get(PointerRNA *ptr) static PointerRNA rna_Object_active_vertex_group_get(PointerRNA *ptr) { Object *ob = (Object *)ptr->owner_id; + if (!BKE_object_supports_vertex_groups(ob)) { + return PointerRNA_NULL; + } + const ListBase *defbase = BKE_object_defgroup_list(ob); return rna_pointer_inherit_refine( @@ -830,7 +845,12 @@ static void rna_Object_active_vertex_group_set(PointerRNA *ptr, struct ReportList *reports) { Object *ob = (Object *)ptr->owner_id; + if (!BKE_object_supports_vertex_groups(ob)) { + return; + } + const ListBase *defbase = BKE_object_defgroup_list(ob); + int index = BLI_findindex(defbase, value.data); if (index == -1) { BKE_reportf(reports, @@ -847,12 +867,20 @@ static void rna_Object_active_vertex_group_set(PointerRNA *ptr, static int rna_Object_active_vertex_group_index_get(PointerRNA *ptr) { Object *ob = (Object *)ptr->owner_id; + if (!BKE_object_supports_vertex_groups(ob)) { + return -1; + } + return BKE_object_defgroup_active_index_get(ob) - 1; } static void rna_Object_active_vertex_group_index_set(PointerRNA *ptr, int value) { Object *ob = (Object *)ptr->owner_id; + if (!BKE_object_supports_vertex_groups(ob)) { + return; + } + BKE_object_defgroup_active_index_set(ob, value + 1); } @@ -862,6 +890,10 @@ static void rna_Object_active_vertex_group_index_range( Object *ob = (Object *)ptr->owner_id; *min = 0; + if (!BKE_object_supports_vertex_groups(ob)) { + *max = 0; + return; + } const ListBase *defbase = BKE_object_defgroup_list(ob); *max = max_ii(0, BLI_listbase_count(defbase) - 1); } @@ -869,10 +901,13 @@ static void rna_Object_active_vertex_group_index_range( void rna_object_vgroup_name_index_get(PointerRNA *ptr, char *value, int index) { Object *ob = (Object *)ptr->owner_id; - bDeformGroup *dg; + if (!BKE_object_supports_vertex_groups(ob)) { + value[0] = '\0'; + return; + } const ListBase *defbase = BKE_object_defgroup_list(ob); - dg = BLI_findlink(defbase, index - 1); + const bDeformGroup *dg = BLI_findlink(defbase, index - 1); if (dg) { BLI_strncpy(value, dg->name, sizeof(dg->name)); @@ -885,22 +920,34 @@ void rna_object_vgroup_name_index_get(PointerRNA *ptr, char *value, int index) int rna_object_vgroup_name_index_length(PointerRNA *ptr, int index) { Object *ob = (Object *)ptr->owner_id; - bDeformGroup *dg; + if (!BKE_object_supports_vertex_groups(ob)) { + return 0; + } const ListBase *defbase = BKE_object_defgroup_list(ob); - dg = BLI_findlink(defbase, index - 1); + bDeformGroup *dg = BLI_findlink(defbase, index - 1); return (dg) ? strlen(dg->name) : 0; } void rna_object_vgroup_name_index_set(PointerRNA *ptr, const char *value, short *index) { Object *ob = (Object *)ptr->owner_id; + if (!BKE_object_supports_vertex_groups(ob)) { + *index = -1; + return; + } + *index = BKE_object_defgroup_name_index(ob, value) + 1; } void rna_object_vgroup_name_set(PointerRNA *ptr, const char *value, char *result, int maxlen) { Object *ob = (Object *)ptr->owner_id; + if (!BKE_object_supports_vertex_groups(ob)) { + result[0] = '\0'; + return; + } + bDeformGroup *dg = BKE_object_defgroup_find_name(ob, value); if (dg) { /* No need for BLI_strncpy_utf8, since this matches an existing group. */ _______________________________________________ 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