diff options
Diffstat (limited to 'source/blender/makesrna/intern/rna_access.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_access.c | 12483 |
1 files changed, 6411 insertions, 6072 deletions
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index b1c5ef66958..541c2184a94 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -18,7 +18,6 @@ * \ingroup RNA */ - #include <stdlib.h> #include <stddef.h> #include <string.h> @@ -75,633 +74,646 @@ const PointerRNA PointerRNA_NULL = {{NULL}}; void RNA_init(void) { - StructRNA *srna; - PropertyRNA *prop; + StructRNA *srna; + PropertyRNA *prop; - BLENDER_RNA.structs_map = BLI_ghash_str_new_ex(__func__, 2048); - BLENDER_RNA.structs_len = 0; + BLENDER_RNA.structs_map = BLI_ghash_str_new_ex(__func__, 2048); + BLENDER_RNA.structs_len = 0; - for (srna = BLENDER_RNA.structs.first; srna; srna = srna->cont.next) { - if (!srna->cont.prophash) { - srna->cont.prophash = BLI_ghash_str_new("RNA_init gh"); + for (srna = BLENDER_RNA.structs.first; srna; srna = srna->cont.next) { + if (!srna->cont.prophash) { + srna->cont.prophash = BLI_ghash_str_new("RNA_init gh"); - for (prop = srna->cont.properties.first; prop; prop = prop->next) { - if (!(prop->flag_internal & PROP_INTERN_BUILTIN)) { - BLI_ghash_insert(srna->cont.prophash, (void *)prop->identifier, prop); - } - } - } - BLI_assert(srna->flag & STRUCT_PUBLIC_NAMESPACE); - BLI_ghash_insert(BLENDER_RNA.structs_map, (void *)srna->identifier, srna); - BLENDER_RNA.structs_len += 1; - } + for (prop = srna->cont.properties.first; prop; prop = prop->next) { + if (!(prop->flag_internal & PROP_INTERN_BUILTIN)) { + BLI_ghash_insert(srna->cont.prophash, (void *)prop->identifier, prop); + } + } + } + BLI_assert(srna->flag & STRUCT_PUBLIC_NAMESPACE); + BLI_ghash_insert(BLENDER_RNA.structs_map, (void *)srna->identifier, srna); + BLENDER_RNA.structs_len += 1; + } } void RNA_exit(void) { - StructRNA *srna; + StructRNA *srna; - RNA_property_update_cache_free(); + RNA_property_update_cache_free(); - for (srna = BLENDER_RNA.structs.first; srna; srna = srna->cont.next) { - if (srna->cont.prophash) { - BLI_ghash_free(srna->cont.prophash, NULL, NULL); - srna->cont.prophash = NULL; - } - } + for (srna = BLENDER_RNA.structs.first; srna; srna = srna->cont.next) { + if (srna->cont.prophash) { + BLI_ghash_free(srna->cont.prophash, NULL, NULL); + srna->cont.prophash = NULL; + } + } - RNA_free(&BLENDER_RNA); + RNA_free(&BLENDER_RNA); } /* Pointer */ void RNA_main_pointer_create(struct Main *main, PointerRNA *r_ptr) { - r_ptr->id.data = NULL; - r_ptr->type = &RNA_BlendData; - r_ptr->data = main; + r_ptr->id.data = NULL; + r_ptr->type = &RNA_BlendData; + r_ptr->data = main; } void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr) { - StructRNA *type, *idtype = NULL; + StructRNA *type, *idtype = NULL; - if (id) { - PointerRNA tmp = {{NULL}}; - tmp.data = id; - idtype = rna_ID_refine(&tmp); + if (id) { + PointerRNA tmp = {{NULL}}; + tmp.data = id; + idtype = rna_ID_refine(&tmp); - while (idtype->refine) { - type = idtype->refine(&tmp); + while (idtype->refine) { + type = idtype->refine(&tmp); - if (type == idtype) - break; - else - idtype = type; - } - } + if (type == idtype) + break; + else + idtype = type; + } + } - r_ptr->id.data = id; - r_ptr->type = idtype; - r_ptr->data = id; + r_ptr->id.data = id; + r_ptr->type = idtype; + r_ptr->data = id; } void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr) { #if 0 /* UNUSED */ - StructRNA *idtype = NULL; + StructRNA *idtype = NULL; - if (id) { - PointerRNA tmp = {{0}}; - tmp.data = id; - idtype = rna_ID_refine(&tmp); - } + if (id) { + PointerRNA tmp = {{0}}; + tmp.data = id; + idtype = rna_ID_refine(&tmp); + } #endif - r_ptr->id.data = id; - r_ptr->type = type; - r_ptr->data = data; + r_ptr->id.data = id; + r_ptr->type = type; + r_ptr->data = data; - if (data) { - while (r_ptr->type && r_ptr->type->refine) { - StructRNA *rtype = r_ptr->type->refine(r_ptr); + if (data) { + while (r_ptr->type && r_ptr->type->refine) { + StructRNA *rtype = r_ptr->type->refine(r_ptr); - if (rtype == r_ptr->type) - break; - else - r_ptr->type = rtype; - } - } + if (rtype == r_ptr->type) + break; + else + r_ptr->type = rtype; + } + } } bool RNA_pointer_is_null(const PointerRNA *ptr) { - return !((ptr->data != NULL) && (ptr->id.data != NULL) && (ptr->type != NULL)); + return !((ptr->data != NULL) && (ptr->id.data != NULL) && (ptr->type != NULL)); } static void rna_pointer_inherit_id(StructRNA *type, PointerRNA *parent, PointerRNA *ptr) { - if (type && type->flag & STRUCT_ID) { - ptr->id.data = ptr->data; - } - else { - ptr->id.data = parent->id.data; - } + if (type && type->flag & STRUCT_ID) { + ptr->id.data = ptr->data; + } + else { + ptr->id.data = parent->id.data; + } } void RNA_blender_rna_pointer_create(PointerRNA *r_ptr) { - r_ptr->id.data = NULL; - r_ptr->type = &RNA_BlenderRNA; - r_ptr->data = &BLENDER_RNA; + r_ptr->id.data = NULL; + r_ptr->type = &RNA_BlenderRNA; + r_ptr->data = &BLENDER_RNA; } PointerRNA rna_pointer_inherit_refine(PointerRNA *ptr, StructRNA *type, void *data) { - if (data) { - PointerRNA result; - result.data = data; - result.type = type; - rna_pointer_inherit_id(type, ptr, &result); + if (data) { + PointerRNA result; + result.data = data; + result.type = type; + rna_pointer_inherit_id(type, ptr, &result); - while (result.type->refine) { - type = result.type->refine(&result); + while (result.type->refine) { + type = result.type->refine(&result); - if (type == result.type) - break; - else - result.type = type; - } - return result; - } - else { - return PointerRNA_NULL; - } + if (type == result.type) + break; + else + result.type = type; + } + return result; + } + else { + return PointerRNA_NULL; + } } void RNA_pointer_recast(PointerRNA *ptr, PointerRNA *r_ptr) { #if 0 /* works but this case if covered by more general code below. */ - if (RNA_struct_is_ID(ptr->type)) { - /* simple case */ - RNA_id_pointer_create(ptr->id.data, r_ptr); - } - else + if (RNA_struct_is_ID(ptr->type)) { + /* simple case */ + RNA_id_pointer_create(ptr->id.data, r_ptr); + } + else #endif - { - StructRNA *base; - PointerRNA t_ptr; - *r_ptr = *ptr; /* initialize as the same in case cant recast */ + { + StructRNA *base; + PointerRNA t_ptr; + *r_ptr = *ptr; /* initialize as the same in case cant recast */ - for (base = ptr->type->base; base; base = base->base) { - t_ptr = rna_pointer_inherit_refine(ptr, base, ptr->data); - if (t_ptr.type && t_ptr.type != ptr->type) { - *r_ptr = t_ptr; - } - } - } + for (base = ptr->type->base; base; base = base->base) { + t_ptr = rna_pointer_inherit_refine(ptr, base, ptr->data); + if (t_ptr.type && t_ptr.type != ptr->type) { + *r_ptr = t_ptr; + } + } + } } /* ID Properties */ static void rna_idproperty_touch(IDProperty *idprop) { - /* so the property is seen as 'set' by rna */ - idprop->flag &= ~IDP_FLAG_GHOST; + /* so the property is seen as 'set' by rna */ + idprop->flag &= ~IDP_FLAG_GHOST; } static IDProperty *rna_idproperty_ui_container(PropertyRNA *prop) { - IDProperty *idprop; + IDProperty *idprop; - for (idprop = ((IDProperty *)prop)->prev; idprop; idprop = idprop->prev) { - if (STREQ(RNA_IDP_UI, idprop->name)) - break; - } + for (idprop = ((IDProperty *)prop)->prev; idprop; idprop = idprop->prev) { + if (STREQ(RNA_IDP_UI, idprop->name)) + break; + } - if (idprop == NULL) { - for (idprop = ((IDProperty *)prop)->next; idprop; idprop = idprop->next) { - if (STREQ(RNA_IDP_UI, idprop->name)) - break; - } - } + if (idprop == NULL) { + for (idprop = ((IDProperty *)prop)->next; idprop; idprop = idprop->next) { + if (STREQ(RNA_IDP_UI, idprop->name)) + break; + } + } - return idprop; + return idprop; } /* return a UI local ID prop definition for this prop */ static IDProperty *rna_idproperty_ui(PropertyRNA *prop) { - IDProperty *idprop = rna_idproperty_ui_container(prop); + IDProperty *idprop = rna_idproperty_ui_container(prop); - if (idprop) { - return IDP_GetPropertyTypeFromGroup(idprop, ((IDProperty *)prop)->name, IDP_GROUP); - } + if (idprop) { + return IDP_GetPropertyTypeFromGroup(idprop, ((IDProperty *)prop)->name, IDP_GROUP); + } - return NULL; + return NULL; } /* return or create a UI local ID prop definition for this prop */ static IDProperty *rna_idproperty_ui_ensure(PointerRNA *ptr, PropertyRNA *prop, bool create) { - IDProperty *idprop = rna_idproperty_ui_container(prop); - IDPropertyTemplate dummy = { 0 }; - - if (idprop == NULL && create) { - IDProperty *props = RNA_struct_idprops(ptr, false); - - /* Sanity check: props is the actual container of this property. */ - if (props != NULL && BLI_findindex(&props->data.group, prop) >= 0) { - idprop = IDP_New(IDP_GROUP, &dummy, RNA_IDP_UI); - - if (!IDP_AddToGroup(props, idprop)) { - IDP_FreeProperty(idprop); - return NULL; - } - } - } - - if (idprop) { - const char *name = ((IDProperty *)prop)->name; - IDProperty *rv = IDP_GetPropertyTypeFromGroup(idprop, name, IDP_GROUP); - - if (rv == NULL && create) { - rv = IDP_New(IDP_GROUP, &dummy, name); - - if (!IDP_AddToGroup(idprop, rv)) { - IDP_FreeProperty(rv); - return NULL; - } - } - - return rv; - } - - return NULL; -} - -static bool rna_idproperty_ui_set_default(PointerRNA *ptr, PropertyRNA *prop, const char type, IDPropertyTemplate *value) -{ - BLI_assert(ELEM(type, IDP_INT, IDP_DOUBLE)); - - if (prop->magic == RNA_MAGIC) { - return false; - } - - /* attempt to get the local ID values */ - IDProperty *idp_ui = rna_idproperty_ui_ensure(ptr, prop, value != NULL); - - if (idp_ui == NULL) { - return (value == NULL); - } - - IDProperty *item = IDP_GetPropertyTypeFromGroup(idp_ui, "default", type); - - if (value == NULL) { - if (item != NULL) { - IDP_RemoveFromGroup(idp_ui, item); - } - } - else { - if (item != NULL) { - switch (type) { - case IDP_INT: - IDP_Int(item) = value->i; - break; - case IDP_DOUBLE: - IDP_Double(item) = value->d; - break; - default: - BLI_assert(false); - return false; - } - } - else { - item = IDP_New(type, value, "default"); - - if (!IDP_AddToGroup(idp_ui, item)) { - IDP_FreeProperty(item); - return false; - } - } - } - - return true; + IDProperty *idprop = rna_idproperty_ui_container(prop); + IDPropertyTemplate dummy = {0}; + + if (idprop == NULL && create) { + IDProperty *props = RNA_struct_idprops(ptr, false); + + /* Sanity check: props is the actual container of this property. */ + if (props != NULL && BLI_findindex(&props->data.group, prop) >= 0) { + idprop = IDP_New(IDP_GROUP, &dummy, RNA_IDP_UI); + + if (!IDP_AddToGroup(props, idprop)) { + IDP_FreeProperty(idprop); + return NULL; + } + } + } + + if (idprop) { + const char *name = ((IDProperty *)prop)->name; + IDProperty *rv = IDP_GetPropertyTypeFromGroup(idprop, name, IDP_GROUP); + + if (rv == NULL && create) { + rv = IDP_New(IDP_GROUP, &dummy, name); + + if (!IDP_AddToGroup(idprop, rv)) { + IDP_FreeProperty(rv); + return NULL; + } + } + + return rv; + } + + return NULL; +} + +static bool rna_idproperty_ui_set_default(PointerRNA *ptr, + PropertyRNA *prop, + const char type, + IDPropertyTemplate *value) +{ + BLI_assert(ELEM(type, IDP_INT, IDP_DOUBLE)); + + if (prop->magic == RNA_MAGIC) { + return false; + } + + /* attempt to get the local ID values */ + IDProperty *idp_ui = rna_idproperty_ui_ensure(ptr, prop, value != NULL); + + if (idp_ui == NULL) { + return (value == NULL); + } + + IDProperty *item = IDP_GetPropertyTypeFromGroup(idp_ui, "default", type); + + if (value == NULL) { + if (item != NULL) { + IDP_RemoveFromGroup(idp_ui, item); + } + } + else { + if (item != NULL) { + switch (type) { + case IDP_INT: + IDP_Int(item) = value->i; + break; + case IDP_DOUBLE: + IDP_Double(item) = value->d; + break; + default: + BLI_assert(false); + return false; + } + } + else { + item = IDP_New(type, value, "default"); + + if (!IDP_AddToGroup(idp_ui, item)) { + IDP_FreeProperty(item); + return false; + } + } + } + + return true; } IDProperty *RNA_struct_idprops(PointerRNA *ptr, bool create) { - StructRNA *type = ptr->type; + StructRNA *type = ptr->type; - if (type && type->idproperties) { - return type->idproperties(ptr, create); - } + if (type && type->idproperties) { + return type->idproperties(ptr, create); + } - return NULL; + return NULL; } bool RNA_struct_idprops_check(StructRNA *srna) { - return (srna && srna->idproperties); + return (srna && srna->idproperties); } static IDProperty *rna_idproperty_find(PointerRNA *ptr, const char *name) { - IDProperty *group = RNA_struct_idprops(ptr, 0); + IDProperty *group = RNA_struct_idprops(ptr, 0); - if (group) { - if (group->type == IDP_GROUP) { - return IDP_GetPropertyFromGroup(group, name); - } - else { - /* Not sure why that happens sometimes, with nested properties... */ - /* Seems to be actually array prop, name is usually "0"... To be sorted out later. */ -// printf("Got unexpected IDProp container when trying to retrieve %s: %d\n", name, group->type); - } - } + if (group) { + if (group->type == IDP_GROUP) { + return IDP_GetPropertyFromGroup(group, name); + } + else { + /* Not sure why that happens sometimes, with nested properties... */ + /* Seems to be actually array prop, name is usually "0"... To be sorted out later. */ + // printf("Got unexpected IDProp container when trying to retrieve %s: %d\n", name, group->type); + } + } - return NULL; + return NULL; } static void rna_idproperty_free(PointerRNA *ptr, const char *name) { - IDProperty *group = RNA_struct_idprops(ptr, 0); + IDProperty *group = RNA_struct_idprops(ptr, 0); - if (group) { - IDProperty *idprop = IDP_GetPropertyFromGroup(group, name); - if (idprop) { - IDP_FreeFromGroup(group, idprop); - } - } + if (group) { + IDProperty *idprop = IDP_GetPropertyFromGroup(group, name); + if (idprop) { + IDP_FreeFromGroup(group, idprop); + } + } } static int rna_ensure_property_array_length(PointerRNA *ptr, PropertyRNA *prop) { - if (prop->magic == RNA_MAGIC) { - int arraylen[RNA_MAX_ARRAY_DIMENSION]; - return (prop->getlength && ptr->data) ? prop->getlength(ptr, arraylen) : prop->totarraylength; - } - else { - IDProperty *idprop = (IDProperty *)prop; + if (prop->magic == RNA_MAGIC) { + int arraylen[RNA_MAX_ARRAY_DIMENSION]; + return (prop->getlength && ptr->data) ? prop->getlength(ptr, arraylen) : prop->totarraylength; + } + else { + IDProperty *idprop = (IDProperty *)prop; - if (idprop->type == IDP_ARRAY) - return idprop->len; - else - return 0; - } + if (idprop->type == IDP_ARRAY) + return idprop->len; + else + return 0; + } } static bool rna_ensure_property_array_check(PropertyRNA *prop) { - if (prop->magic == RNA_MAGIC) { - return (prop->getlength || prop->totarraylength); - } - else { - IDProperty *idprop = (IDProperty *)prop; + if (prop->magic == RNA_MAGIC) { + return (prop->getlength || prop->totarraylength); + } + else { + IDProperty *idprop = (IDProperty *)prop; - return (idprop->type == IDP_ARRAY); - } + return (idprop->type == IDP_ARRAY); + } } -static void rna_ensure_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int length[]) +static void rna_ensure_property_multi_array_length(PointerRNA *ptr, + PropertyRNA *prop, + int length[]) { - if (prop->magic == RNA_MAGIC) { - if (prop->getlength) - prop->getlength(ptr, length); - else - memcpy(length, prop->arraylength, prop->arraydimension * sizeof(int)); - } - else { - IDProperty *idprop = (IDProperty *)prop; + if (prop->magic == RNA_MAGIC) { + if (prop->getlength) + prop->getlength(ptr, length); + else + memcpy(length, prop->arraylength, prop->arraydimension * sizeof(int)); + } + else { + IDProperty *idprop = (IDProperty *)prop; - if (idprop->type == IDP_ARRAY) - length[0] = idprop->len; - else - length[0] = 0; - } + if (idprop->type == IDP_ARRAY) + length[0] = idprop->len; + else + length[0] = 0; + } } static bool rna_idproperty_verify_valid(PointerRNA *ptr, PropertyRNA *prop, IDProperty *idprop) { - /* this verifies if the idproperty actually matches the property - * description and otherwise removes it. this is to ensure that - * rna property access is type safe, e.g. if you defined the rna - * to have a certain array length you can count on that staying so */ - - switch (idprop->type) { - case IDP_IDPARRAY: - if (prop->type != PROP_COLLECTION) - return false; - break; - case IDP_ARRAY: - if (rna_ensure_property_array_length(ptr, prop) != idprop->len) - return false; - - if (idprop->subtype == IDP_FLOAT && prop->type != PROP_FLOAT) - return false; - if (idprop->subtype == IDP_INT && !ELEM(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM)) - return false; - - break; - case IDP_INT: - if (!ELEM(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM)) - return false; - break; - case IDP_FLOAT: - case IDP_DOUBLE: - if (prop->type != PROP_FLOAT) - return false; - break; - case IDP_STRING: - if (prop->type != PROP_STRING) - return false; - break; - case IDP_GROUP: - case IDP_ID: - if (prop->type != PROP_POINTER) - return false; - break; - default: - return false; - } - - return true; + /* this verifies if the idproperty actually matches the property + * description and otherwise removes it. this is to ensure that + * rna property access is type safe, e.g. if you defined the rna + * to have a certain array length you can count on that staying so */ + + switch (idprop->type) { + case IDP_IDPARRAY: + if (prop->type != PROP_COLLECTION) + return false; + break; + case IDP_ARRAY: + if (rna_ensure_property_array_length(ptr, prop) != idprop->len) + return false; + + if (idprop->subtype == IDP_FLOAT && prop->type != PROP_FLOAT) + return false; + if (idprop->subtype == IDP_INT && !ELEM(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM)) + return false; + + break; + case IDP_INT: + if (!ELEM(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM)) + return false; + break; + case IDP_FLOAT: + case IDP_DOUBLE: + if (prop->type != PROP_FLOAT) + return false; + break; + case IDP_STRING: + if (prop->type != PROP_STRING) + return false; + break; + case IDP_GROUP: + case IDP_ID: + if (prop->type != PROP_POINTER) + return false; + break; + default: + return false; + } + + return true; } static PropertyRNA *typemap[IDP_NUMTYPES] = { - (PropertyRNA *)&rna_PropertyGroupItem_string, - (PropertyRNA *)&rna_PropertyGroupItem_int, - (PropertyRNA *)&rna_PropertyGroupItem_float, - NULL, NULL, NULL, - (PropertyRNA *)&rna_PropertyGroupItem_group, - (PropertyRNA *)&rna_PropertyGroupItem_id, - (PropertyRNA *)&rna_PropertyGroupItem_double, - (PropertyRNA *)&rna_PropertyGroupItem_idp_array, + (PropertyRNA *)&rna_PropertyGroupItem_string, + (PropertyRNA *)&rna_PropertyGroupItem_int, + (PropertyRNA *)&rna_PropertyGroupItem_float, + NULL, + NULL, + NULL, + (PropertyRNA *)&rna_PropertyGroupItem_group, + (PropertyRNA *)&rna_PropertyGroupItem_id, + (PropertyRNA *)&rna_PropertyGroupItem_double, + (PropertyRNA *)&rna_PropertyGroupItem_idp_array, }; static PropertyRNA *arraytypemap[IDP_NUMTYPES] = { - NULL, (PropertyRNA *)&rna_PropertyGroupItem_int_array, - (PropertyRNA *)&rna_PropertyGroupItem_float_array, - NULL, NULL, NULL, - (PropertyRNA *)&rna_PropertyGroupItem_collection, NULL, - (PropertyRNA *)&rna_PropertyGroupItem_double_array, + NULL, + (PropertyRNA *)&rna_PropertyGroupItem_int_array, + (PropertyRNA *)&rna_PropertyGroupItem_float_array, + NULL, + NULL, + NULL, + (PropertyRNA *)&rna_PropertyGroupItem_collection, + NULL, + (PropertyRNA *)&rna_PropertyGroupItem_double_array, }; -static void *rna_idproperty_check_ex(PropertyRNA **prop, PointerRNA *ptr, const bool return_rnaprop) +static void *rna_idproperty_check_ex(PropertyRNA **prop, + PointerRNA *ptr, + const bool return_rnaprop) { - /* This is quite a hack, but avoids some complexity in the API. we - * pass IDProperty structs as PropertyRNA pointers to the outside. - * We store some bytes in PropertyRNA structs that allows us to - * distinguish it from IDProperty structs. If it is an ID property, - * we look up an IDP PropertyRNA based on the type, and set the data - * pointer to the IDProperty. */ + /* This is quite a hack, but avoids some complexity in the API. we + * pass IDProperty structs as PropertyRNA pointers to the outside. + * We store some bytes in PropertyRNA structs that allows us to + * distinguish it from IDProperty structs. If it is an ID property, + * we look up an IDP PropertyRNA based on the type, and set the data + * pointer to the IDProperty. */ - if ((*prop)->magic == RNA_MAGIC) { - if ((*prop)->flag & PROP_IDPROPERTY) { - IDProperty *idprop = rna_idproperty_find(ptr, (*prop)->identifier); + if ((*prop)->magic == RNA_MAGIC) { + if ((*prop)->flag & PROP_IDPROPERTY) { + IDProperty *idprop = rna_idproperty_find(ptr, (*prop)->identifier); - if (idprop && !rna_idproperty_verify_valid(ptr, *prop, idprop)) { - IDProperty *group = RNA_struct_idprops(ptr, 0); + if (idprop && !rna_idproperty_verify_valid(ptr, *prop, idprop)) { + IDProperty *group = RNA_struct_idprops(ptr, 0); - IDP_FreeFromGroup(group, idprop); - return NULL; - } + IDP_FreeFromGroup(group, idprop); + return NULL; + } - return idprop; - } - else { - return return_rnaprop ? *prop : NULL; - } - } + return idprop; + } + else { + return return_rnaprop ? *prop : NULL; + } + } - { - IDProperty *idprop = (IDProperty *)(*prop); + { + IDProperty *idprop = (IDProperty *)(*prop); - if (idprop->type == IDP_ARRAY) - *prop = arraytypemap[(int)(idprop->subtype)]; - else - *prop = typemap[(int)(idprop->type)]; + if (idprop->type == IDP_ARRAY) + *prop = arraytypemap[(int)(idprop->subtype)]; + else + *prop = typemap[(int)(idprop->type)]; - return idprop; - } + return idprop; + } } /* This function only returns an IDProperty, * or NULL (in case IDProp could not be found, or prop is a real RNA property). */ IDProperty *rna_idproperty_check(PropertyRNA **prop, PointerRNA *ptr) { - return rna_idproperty_check_ex(prop, ptr, false); + return rna_idproperty_check_ex(prop, ptr, false); } /* This function always return the valid, real data pointer, be it a regular RNA property one, or an IDProperty one. */ PropertyRNA *rna_ensure_property_realdata(PropertyRNA **prop, PointerRNA *ptr) { - return rna_idproperty_check_ex(prop, ptr, true); + return rna_idproperty_check_ex(prop, ptr, true); } static PropertyRNA *rna_ensure_property(PropertyRNA *prop) { - /* the quick version if we don't need the idproperty */ + /* the quick version if we don't need the idproperty */ - if (prop->magic == RNA_MAGIC) - return prop; + if (prop->magic == RNA_MAGIC) + return prop; - { - IDProperty *idprop = (IDProperty *)prop; + { + IDProperty *idprop = (IDProperty *)prop; - if (idprop->type == IDP_ARRAY) - return arraytypemap[(int)(idprop->subtype)]; - else - return typemap[(int)(idprop->type)]; - } + if (idprop->type == IDP_ARRAY) + return arraytypemap[(int)(idprop->subtype)]; + else + return typemap[(int)(idprop->type)]; + } } static const char *rna_ensure_property_identifier(const PropertyRNA *prop) { - if (prop->magic == RNA_MAGIC) - return prop->identifier; - else - return ((const IDProperty *)prop)->name; + if (prop->magic == RNA_MAGIC) + return prop->identifier; + else + return ((const IDProperty *)prop)->name; } static const char *rna_ensure_property_description(PropertyRNA *prop) { - const char *description = NULL; + const char *description = NULL; - if (prop->magic == RNA_MAGIC) - description = prop->description; - else { - /* attempt to get the local ID values */ - IDProperty *idp_ui = rna_idproperty_ui(prop); + if (prop->magic == RNA_MAGIC) + description = prop->description; + else { + /* attempt to get the local ID values */ + IDProperty *idp_ui = rna_idproperty_ui(prop); - if (idp_ui) { - IDProperty *item = IDP_GetPropertyTypeFromGroup(idp_ui, "description", IDP_STRING); - if (item) - description = IDP_String(item); - } + if (idp_ui) { + IDProperty *item = IDP_GetPropertyTypeFromGroup(idp_ui, "description", IDP_STRING); + if (item) + description = IDP_String(item); + } - if (description == NULL) - description = ((IDProperty *)prop)->name; /* XXX - not correct */ - } + if (description == NULL) + description = ((IDProperty *)prop)->name; /* XXX - not correct */ + } - return description; + return description; } static const char *rna_ensure_property_name(const PropertyRNA *prop) { - const char *name; + const char *name; - if (prop->magic == RNA_MAGIC) - name = prop->name; - else - name = ((const IDProperty *)prop)->name; + if (prop->magic == RNA_MAGIC) + name = prop->name; + else + name = ((const IDProperty *)prop)->name; - return name; + return name; } /* Structs */ StructRNA *RNA_struct_find(const char *identifier) { - return BLI_ghash_lookup(BLENDER_RNA.structs_map, identifier); + return BLI_ghash_lookup(BLENDER_RNA.structs_map, identifier); } const char *RNA_struct_identifier(const StructRNA *type) { - return type->identifier; + return type->identifier; } const char *RNA_struct_ui_name(const StructRNA *type) { - return CTX_IFACE_(type->translation_context, type->name); + return CTX_IFACE_(type->translation_context, type->name); } const char *RNA_struct_ui_name_raw(const StructRNA *type) { - return type->name; + return type->name; } int RNA_struct_ui_icon(const StructRNA *type) { - if (type) - return type->icon; - else - return ICON_DOT; + if (type) + return type->icon; + else + return ICON_DOT; } const char *RNA_struct_ui_description(const StructRNA *type) { - return TIP_(type->description); + return TIP_(type->description); } const char *RNA_struct_ui_description_raw(const StructRNA *type) { - return type->description; + return type->description; } const char *RNA_struct_translation_context(const StructRNA *type) { - return type->translation_context; + return type->translation_context; } PropertyRNA *RNA_struct_name_property(const StructRNA *type) { - return type->nameproperty; + return type->nameproperty; } const EnumPropertyItem *RNA_struct_property_tag_defines(const StructRNA *type) { - return type->prop_tag_defines; + return type->prop_tag_defines; } PropertyRNA *RNA_struct_iterator_property(StructRNA *type) { - return type->iteratorproperty; + return type->iteratorproperty; } StructRNA *RNA_struct_base(StructRNA *type) { - return type->base; + return type->base; } /** @@ -711,33 +723,33 @@ StructRNA *RNA_struct_base(StructRNA *type) */ const StructRNA *RNA_struct_base_child_of(const StructRNA *type, const StructRNA *parent_type) { - while (type) { - if (type->base == parent_type) { - return type; - } - type = type->base; - } - return NULL; + while (type) { + if (type->base == parent_type) { + return type; + } + type = type->base; + } + return NULL; } bool RNA_struct_is_ID(const StructRNA *type) { - return (type->flag & STRUCT_ID) != 0; + return (type->flag & STRUCT_ID) != 0; } bool RNA_struct_undo_check(const StructRNA *type) { - return (type->flag & STRUCT_UNDO) != 0; + return (type->flag & STRUCT_UNDO) != 0; } bool RNA_struct_idprops_register_check(const StructRNA *type) { - return (type->flag & STRUCT_NO_IDPROPERTIES) == 0; + return (type->flag & STRUCT_NO_IDPROPERTIES) == 0; } bool RNA_struct_idprops_datablock_allowed(const StructRNA *type) { - return (type->flag & (STRUCT_NO_DATABLOCK_IDPROPERTIES | STRUCT_NO_IDPROPERTIES)) == 0; + return (type->flag & (STRUCT_NO_DATABLOCK_IDPROPERTIES | STRUCT_NO_IDPROPERTIES)) == 0; } /** @@ -747,234 +759,230 @@ bool RNA_struct_idprops_datablock_allowed(const StructRNA *type) */ bool RNA_struct_idprops_contains_datablock(const StructRNA *type) { - return (type->flag & (STRUCT_CONTAINS_DATABLOCK_IDPROPERTIES | STRUCT_ID)) != 0; + return (type->flag & (STRUCT_CONTAINS_DATABLOCK_IDPROPERTIES | STRUCT_ID)) != 0; } /* remove an id-property */ bool RNA_struct_idprops_unset(PointerRNA *ptr, const char *identifier) { - IDProperty *group = RNA_struct_idprops(ptr, 0); + IDProperty *group = RNA_struct_idprops(ptr, 0); - if (group) { - IDProperty *idp = IDP_GetPropertyFromGroup(group, identifier); - if (idp) { - IDP_FreeFromGroup(group, idp); + if (group) { + IDProperty *idp = IDP_GetPropertyFromGroup(group, identifier); + if (idp) { + IDP_FreeFromGroup(group, idp); - return true; - } - } - return false; + return true; + } + } + return false; } bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna) { - const StructRNA *base; + const StructRNA *base; - if (srna == &RNA_AnyType) - return true; + if (srna == &RNA_AnyType) + return true; - if (!type) - return false; + if (!type) + return false; - /* ptr->type is always maximally refined */ - for (base = type; base; base = base->base) - if (base == srna) - return true; + /* ptr->type is always maximally refined */ + for (base = type; base; base = base->base) + if (base == srna) + return true; - return false; + return false; } PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier) { - if (identifier[0] == '[' && identifier[1] == '"') { /* " (dummy comment to avoid confusing some - * function lists in text editors) */ - /* id prop lookup, not so common */ - PropertyRNA *r_prop = NULL; - PointerRNA r_ptr; /* only support single level props */ - if (RNA_path_resolve_property(ptr, identifier, &r_ptr, &r_prop) && - (r_ptr.type == ptr->type) && (r_ptr.data == ptr->data)) - { - return r_prop; - } - } - else { - /* most common case */ - PropertyRNA *iterprop = RNA_struct_iterator_property(ptr->type); - PointerRNA propptr; - - if (RNA_property_collection_lookup_string(ptr, iterprop, identifier, &propptr)) - return propptr.data; - } - - return NULL; + if (identifier[0] == '[' && identifier[1] == '"') { /* " (dummy comment to avoid confusing some + * function lists in text editors) */ + /* id prop lookup, not so common */ + PropertyRNA *r_prop = NULL; + PointerRNA r_ptr; /* only support single level props */ + if (RNA_path_resolve_property(ptr, identifier, &r_ptr, &r_prop) && (r_ptr.type == ptr->type) && + (r_ptr.data == ptr->data)) { + return r_prop; + } + } + else { + /* most common case */ + PropertyRNA *iterprop = RNA_struct_iterator_property(ptr->type); + PointerRNA propptr; + + if (RNA_property_collection_lookup_string(ptr, iterprop, identifier, &propptr)) + return propptr.data; + } + + return NULL; } /* Find the property which uses the given nested struct */ static PropertyRNA *RNA_struct_find_nested(PointerRNA *ptr, StructRNA *srna) { - PropertyRNA *prop = NULL; + PropertyRNA *prop = NULL; - RNA_STRUCT_BEGIN (ptr, iprop) - { - /* This assumes that there can only be one user of this nested struct */ - if (RNA_property_pointer_type(ptr, iprop) == srna) { - prop = iprop; - break; - } - } - RNA_PROP_END; + RNA_STRUCT_BEGIN (ptr, iprop) { + /* This assumes that there can only be one user of this nested struct */ + if (RNA_property_pointer_type(ptr, iprop) == srna) { + prop = iprop; + break; + } + } + RNA_PROP_END; - return prop; + return prop; } bool RNA_struct_contains_property(PointerRNA *ptr, PropertyRNA *prop_test) { - /* note, prop_test could be freed memory, only use for comparison */ + /* note, prop_test could be freed memory, only use for comparison */ - /* validate the RNA is ok */ - PropertyRNA *iterprop; - bool found = false; + /* validate the RNA is ok */ + PropertyRNA *iterprop; + bool found = false; - iterprop = RNA_struct_iterator_property(ptr->type); + iterprop = RNA_struct_iterator_property(ptr->type); - RNA_PROP_BEGIN (ptr, itemptr, iterprop) - { - /* PropertyRNA *prop = itemptr.data; */ - if (prop_test == (PropertyRNA *)itemptr.data) { - found = true; - break; - } - } - RNA_PROP_END; + RNA_PROP_BEGIN (ptr, itemptr, iterprop) { + /* PropertyRNA *prop = itemptr.data; */ + if (prop_test == (PropertyRNA *)itemptr.data) { + found = true; + break; + } + } + RNA_PROP_END; - return found; + return found; } unsigned int RNA_struct_count_properties(StructRNA *srna) { - PointerRNA struct_ptr; - unsigned int counter = 0; + PointerRNA struct_ptr; + unsigned int counter = 0; - RNA_pointer_create(NULL, srna, NULL, &struct_ptr); + RNA_pointer_create(NULL, srna, NULL, &struct_ptr); - RNA_STRUCT_BEGIN (&struct_ptr, prop) - { - counter++; - UNUSED_VARS(prop); - } - RNA_STRUCT_END; + RNA_STRUCT_BEGIN (&struct_ptr, prop) { + counter++; + UNUSED_VARS(prop); + } + RNA_STRUCT_END; - return counter; + return counter; } /* low level direct access to type->properties, note this ignores parent classes so should be used with care */ const struct ListBase *RNA_struct_type_properties(StructRNA *srna) { - return &srna->cont.properties; + return &srna->cont.properties; } PropertyRNA *RNA_struct_type_find_property(StructRNA *srna, const char *identifier) { - return BLI_findstring_ptr(&srna->cont.properties, identifier, offsetof(PropertyRNA, identifier)); + return BLI_findstring_ptr(&srna->cont.properties, identifier, offsetof(PropertyRNA, identifier)); } FunctionRNA *RNA_struct_find_function(StructRNA *srna, const char *identifier) { #if 1 - FunctionRNA *func; - StructRNA *type; - for (type = srna; type; type = type->base) { - func = (FunctionRNA *)BLI_findstring_ptr(&type->functions, identifier, offsetof(FunctionRNA, identifier)); - if (func) { - return func; - } - } - return NULL; - - /* functional but slow */ + FunctionRNA *func; + StructRNA *type; + for (type = srna; type; type = type->base) { + func = (FunctionRNA *)BLI_findstring_ptr( + &type->functions, identifier, offsetof(FunctionRNA, identifier)); + if (func) { + return func; + } + } + return NULL; + + /* functional but slow */ #else - PointerRNA tptr; - PropertyRNA *iterprop; - FunctionRNA *func; + PointerRNA tptr; + PropertyRNA *iterprop; + FunctionRNA *func; - RNA_pointer_create(NULL, &RNA_Struct, srna, &tptr); - iterprop = RNA_struct_find_property(&tptr, "functions"); + RNA_pointer_create(NULL, &RNA_Struct, srna, &tptr); + iterprop = RNA_struct_find_property(&tptr, "functions"); - func = NULL; + func = NULL; - RNA_PROP_BEGIN (&tptr, funcptr, iterprop) - { - if (STREQ(identifier, RNA_function_identifier(funcptr.data))) { - func = funcptr.data; - break; - } - } - RNA_PROP_END; + RNA_PROP_BEGIN (&tptr, funcptr, iterprop) { + if (STREQ(identifier, RNA_function_identifier(funcptr.data))) { + func = funcptr.data; + break; + } + } + RNA_PROP_END; - return func; + return func; #endif } const ListBase *RNA_struct_type_functions(StructRNA *srna) { - return &srna->functions; + return &srna->functions; } StructRegisterFunc RNA_struct_register(StructRNA *type) { - return type->reg; + return type->reg; } StructUnregisterFunc RNA_struct_unregister(StructRNA *type) { - do { - if (type->unreg) - return type->unreg; - } while ((type = type->base)); + do { + if (type->unreg) + return type->unreg; + } while ((type = type->base)); - return NULL; + return NULL; } void **RNA_struct_instance(PointerRNA *ptr) { - StructRNA *type = ptr->type; + StructRNA *type = ptr->type; - do { - if (type->instance) - return type->instance(ptr); - } while ((type = type->base)); + do { + if (type->instance) + return type->instance(ptr); + } while ((type = type->base)); - return NULL; + return NULL; } void *RNA_struct_py_type_get(StructRNA *srna) { - return srna->py_type; + return srna->py_type; } void RNA_struct_py_type_set(StructRNA *srna, void *py_type) { - srna->py_type = py_type; + srna->py_type = py_type; } void *RNA_struct_blender_type_get(StructRNA *srna) { - return srna->blender_type; + return srna->blender_type; } void RNA_struct_blender_type_set(StructRNA *srna, void *blender_type) { - srna->blender_type = blender_type; + srna->blender_type = blender_type; } char *RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen, int *r_len) { - PropertyRNA *nameprop; + PropertyRNA *nameprop; - if (ptr->data && (nameprop = RNA_struct_name_property(ptr->type))) - return RNA_property_string_get_alloc(ptr, nameprop, fixedbuf, fixedlen, r_len); + if (ptr->data && (nameprop = RNA_struct_name_property(ptr->type))) + return RNA_property_string_get_alloc(ptr, nameprop, fixedbuf, fixedlen, r_len); - return NULL; + return NULL; } /** @@ -982,119 +990,118 @@ char *RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen, i */ bool RNA_struct_available_or_report(ReportList *reports, const char *identifier) { - const StructRNA *srna_exists = RNA_struct_find(identifier); - if (UNLIKELY(srna_exists != NULL)) { - /* Use comprehensive string construction since this is such a rare occurrence - * and information here may cut down time troubleshooting. */ - DynStr *dynstr = BLI_dynstr_new(); - BLI_dynstr_appendf(dynstr, "Type identifier '%s' is already in use: '", identifier); - BLI_dynstr_append(dynstr, srna_exists->identifier); - int i = 0; - if (srna_exists->base) { - for (const StructRNA *base = srna_exists->base; base; base = base->base) { - BLI_dynstr_append(dynstr, "("); - BLI_dynstr_append(dynstr, base->identifier); - i += 1; - } - while (i--) { - BLI_dynstr_append(dynstr, ")"); - } - } - BLI_dynstr_append(dynstr, "'."); - char *result = BLI_dynstr_get_cstring(dynstr); - BLI_dynstr_free(dynstr); - BKE_report(reports, RPT_ERROR, result); - MEM_freeN(result); - return false; - } - else { - return true; - } -} - -bool RNA_struct_bl_idname_ok_or_report(ReportList *reports, const char *identifier, const char *sep) -{ - const int len_sep = strlen(sep); - const int len_id = strlen(identifier); - const char *p = strstr(identifier, sep); - /* TODO: make error, for now warning until add-ons update. */ + const StructRNA *srna_exists = RNA_struct_find(identifier); + if (UNLIKELY(srna_exists != NULL)) { + /* Use comprehensive string construction since this is such a rare occurrence + * and information here may cut down time troubleshooting. */ + DynStr *dynstr = BLI_dynstr_new(); + BLI_dynstr_appendf(dynstr, "Type identifier '%s' is already in use: '", identifier); + BLI_dynstr_append(dynstr, srna_exists->identifier); + int i = 0; + if (srna_exists->base) { + for (const StructRNA *base = srna_exists->base; base; base = base->base) { + BLI_dynstr_append(dynstr, "("); + BLI_dynstr_append(dynstr, base->identifier); + i += 1; + } + while (i--) { + BLI_dynstr_append(dynstr, ")"); + } + } + BLI_dynstr_append(dynstr, "'."); + char *result = BLI_dynstr_get_cstring(dynstr); + BLI_dynstr_free(dynstr); + BKE_report(reports, RPT_ERROR, result); + MEM_freeN(result); + return false; + } + else { + return true; + } +} + +bool RNA_struct_bl_idname_ok_or_report(ReportList *reports, + const char *identifier, + const char *sep) +{ + const int len_sep = strlen(sep); + const int len_id = strlen(identifier); + const char *p = strstr(identifier, sep); + /* TODO: make error, for now warning until add-ons update. */ #if 1 - const int report_level = RPT_WARNING; - const bool failure = true; + const int report_level = RPT_WARNING; + const bool failure = true; #else - const int report_level = RPT_ERROR; - const bool failure = false; + const int report_level = RPT_ERROR; + const bool failure = false; #endif - if (p == NULL || p == identifier || p + len_sep >= identifier + len_id) { - BKE_reportf(reports, report_level, "'%s' doesn't contain '%s' with prefix & suffix", identifier, sep); - return failure; - } - - const char *c, *start, *end, *last; - start = identifier; - end = p; - last = end - 1; - for (c = start; c != end; c++) { - if (((*c >= 'A' && *c <= 'Z') || - ((c != start) && (*c >= '0' && *c <= '9')) || - ((c != start) && (c != last) && (*c == '_'))) == 0) - { - BKE_reportf(reports, report_level, "'%s' doesn't have upper case alpha-numeric prefix", identifier); - return failure; - } - } - - start = p + len_sep; - end = identifier + len_id; - last = end - 1; - for (c = start; c != end; c++) { - if (((*c >= 'A' && *c <= 'Z') || - (*c >= 'a' && *c <= 'z') || - (*c >= '0' && *c <= '9') || - ((c != start) && (c != last) && (*c == '_'))) == 0) - { - BKE_reportf(reports, report_level, "'%s' doesn't have an alpha-numeric suffix", identifier); - return failure; - } - } - return true; + if (p == NULL || p == identifier || p + len_sep >= identifier + len_id) { + BKE_reportf( + reports, report_level, "'%s' doesn't contain '%s' with prefix & suffix", identifier, sep); + return failure; + } + + const char *c, *start, *end, *last; + start = identifier; + end = p; + last = end - 1; + for (c = start; c != end; c++) { + if (((*c >= 'A' && *c <= 'Z') || ((c != start) && (*c >= '0' && *c <= '9')) || + ((c != start) && (c != last) && (*c == '_'))) == 0) { + BKE_reportf( + reports, report_level, "'%s' doesn't have upper case alpha-numeric prefix", identifier); + return failure; + } + } + + start = p + len_sep; + end = identifier + len_id; + last = end - 1; + for (c = start; c != end; c++) { + if (((*c >= 'A' && *c <= 'Z') || (*c >= 'a' && *c <= 'z') || (*c >= '0' && *c <= '9') || + ((c != start) && (c != last) && (*c == '_'))) == 0) { + BKE_reportf(reports, report_level, "'%s' doesn't have an alpha-numeric suffix", identifier); + return failure; + } + } + return true; } /* Property Information */ const char *RNA_property_identifier(const PropertyRNA *prop) { - return rna_ensure_property_identifier(prop); + return rna_ensure_property_identifier(prop); } const char *RNA_property_description(PropertyRNA *prop) { - return TIP_(rna_ensure_property_description(prop)); + return TIP_(rna_ensure_property_description(prop)); } PropertyType RNA_property_type(PropertyRNA *prop) { - return rna_ensure_property(prop)->type; + return rna_ensure_property(prop)->type; } PropertySubType RNA_property_subtype(PropertyRNA *prop) { - return rna_ensure_property(prop)->subtype; + return rna_ensure_property(prop)->subtype; } PropertyUnit RNA_property_unit(PropertyRNA *prop) { - return RNA_SUBTYPE_UNIT(rna_ensure_property(prop)->subtype); + return RNA_SUBTYPE_UNIT(rna_ensure_property(prop)->subtype); } int RNA_property_flag(PropertyRNA *prop) { - return rna_ensure_property(prop)->flag; + return rna_ensure_property(prop)->flag; } int RNA_property_override_flag(PropertyRNA *prop) { - return rna_ensure_property(prop)->flag_override; + return rna_ensure_property(prop)->flag_override; } /** @@ -1105,651 +1112,686 @@ int RNA_property_override_flag(PropertyRNA *prop) */ int RNA_property_tags(PropertyRNA *prop) { - return rna_ensure_property(prop)->tags; + return rna_ensure_property(prop)->tags; } bool RNA_property_builtin(PropertyRNA *prop) { - return (rna_ensure_property(prop)->flag_internal & PROP_INTERN_BUILTIN) != 0; + return (rna_ensure_property(prop)->flag_internal & PROP_INTERN_BUILTIN) != 0; } void *RNA_property_py_data_get(PropertyRNA *prop) { - return prop->py_data; + return prop->py_data; } int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop) { - return rna_ensure_property_array_length(ptr, prop); + return rna_ensure_property_array_length(ptr, prop); } bool RNA_property_array_check(PropertyRNA *prop) { - return rna_ensure_property_array_check(prop); + return rna_ensure_property_array_check(prop); } /* used by BPY to make an array from the python object */ int RNA_property_array_dimension(PointerRNA *ptr, PropertyRNA *prop, int length[]) { - PropertyRNA *rprop = rna_ensure_property(prop); + PropertyRNA *rprop = rna_ensure_property(prop); - if (length) - rna_ensure_property_multi_array_length(ptr, prop, length); + if (length) + rna_ensure_property_multi_array_length(ptr, prop, length); - return rprop->arraydimension; + return rprop->arraydimension; } /* Return the size of Nth dimension. */ int RNA_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int dim) { - int len[RNA_MAX_ARRAY_DIMENSION]; + int len[RNA_MAX_ARRAY_DIMENSION]; - rna_ensure_property_multi_array_length(ptr, prop, len); + rna_ensure_property_multi_array_length(ptr, prop, len); - return len[dim]; + return len[dim]; } char RNA_property_array_item_char(PropertyRNA *prop, int index) { - const char *vectoritem = "XYZW"; - const char *quatitem = "WXYZ"; - const char *coloritem = "RGBA"; - PropertySubType subtype = rna_ensure_property(prop)->subtype; - - BLI_assert(index >= 0); - - /* get string to use for array index */ - if ((index < 4) && ELEM(subtype, PROP_QUATERNION, PROP_AXISANGLE)) { - return quatitem[index]; - } - else if ((index < 4) && ELEM(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_XYZ_LENGTH, - PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION, PROP_COORDS)) - { - return vectoritem[index]; - } - else if ((index < 4) && ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA)) { - return coloritem[index]; - } - - return '\0'; + const char *vectoritem = "XYZW"; + const char *quatitem = "WXYZ"; + const char *coloritem = "RGBA"; + PropertySubType subtype = rna_ensure_property(prop)->subtype; + + BLI_assert(index >= 0); + + /* get string to use for array index */ + if ((index < 4) && ELEM(subtype, PROP_QUATERNION, PROP_AXISANGLE)) { + return quatitem[index]; + } + else if ((index < 4) && ELEM(subtype, + PROP_TRANSLATION, + PROP_DIRECTION, + PROP_XYZ, + PROP_XYZ_LENGTH, + PROP_EULER, + PROP_VELOCITY, + PROP_ACCELERATION, + PROP_COORDS)) { + return vectoritem[index]; + } + else if ((index < 4) && ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA)) { + return coloritem[index]; + } + + return '\0'; } int RNA_property_array_item_index(PropertyRNA *prop, char name) { - PropertySubType subtype = rna_ensure_property(prop)->subtype; - - /* get index based on string name/alias */ - /* maybe a function to find char index in string would be better than all the switches */ - if (ELEM(subtype, PROP_QUATERNION, PROP_AXISANGLE)) { - switch (name) { - case 'w': - return 0; - case 'x': - return 1; - case 'y': - return 2; - case 'z': - return 3; - } - } - else if (ELEM(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_XYZ_LENGTH, - PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION)) - { - switch (name) { - case 'x': - return 0; - case 'y': - return 1; - case 'z': - return 2; - case 'w': - return 3; - } - } - else if (ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA)) { - switch (name) { - case 'r': - return 0; - case 'g': - return 1; - case 'b': - return 2; - case 'a': - return 3; - } - } - - return -1; + PropertySubType subtype = rna_ensure_property(prop)->subtype; + + /* get index based on string name/alias */ + /* maybe a function to find char index in string would be better than all the switches */ + if (ELEM(subtype, PROP_QUATERNION, PROP_AXISANGLE)) { + switch (name) { + case 'w': + return 0; + case 'x': + return 1; + case 'y': + return 2; + case 'z': + return 3; + } + } + else if (ELEM(subtype, + PROP_TRANSLATION, + PROP_DIRECTION, + PROP_XYZ, + PROP_XYZ_LENGTH, + PROP_EULER, + PROP_VELOCITY, + PROP_ACCELERATION)) { + switch (name) { + case 'x': + return 0; + case 'y': + return 1; + case 'z': + return 2; + case 'w': + return 3; + } + } + else if (ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA)) { + switch (name) { + case 'r': + return 0; + case 'g': + return 1; + case 'b': + return 2; + case 'a': + return 3; + } + } + + return -1; } - void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, int *hardmax) { - IntPropertyRNA *iprop = (IntPropertyRNA *)rna_ensure_property(prop); - int softmin, softmax; + IntPropertyRNA *iprop = (IntPropertyRNA *)rna_ensure_property(prop); + int softmin, softmax; - if (prop->magic != RNA_MAGIC) { - /* attempt to get the local ID values */ - IDProperty *idp_ui = rna_idproperty_ui(prop); + if (prop->magic != RNA_MAGIC) { + /* attempt to get the local ID values */ + IDProperty *idp_ui = rna_idproperty_ui(prop); - if (idp_ui) { - IDProperty *item; + if (idp_ui) { + IDProperty *item; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "min", IDP_INT); - *hardmin = item ? IDP_Int(item) : INT_MIN; + item = IDP_GetPropertyTypeFromGroup(idp_ui, "min", IDP_INT); + *hardmin = item ? IDP_Int(item) : INT_MIN; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "max", IDP_INT); - *hardmax = item ? IDP_Int(item) : INT_MAX; + item = IDP_GetPropertyTypeFromGroup(idp_ui, "max", IDP_INT); + *hardmax = item ? IDP_Int(item) : INT_MAX; - return; - } - } + return; + } + } - if (iprop->range) { - *hardmin = INT_MIN; - *hardmax = INT_MAX; + if (iprop->range) { + *hardmin = INT_MIN; + *hardmax = INT_MAX; - iprop->range(ptr, hardmin, hardmax, &softmin, &softmax); - } - else if (iprop->range_ex) { - *hardmin = INT_MIN; - *hardmax = INT_MAX; + iprop->range(ptr, hardmin, hardmax, &softmin, &softmax); + } + else if (iprop->range_ex) { + *hardmin = INT_MIN; + *hardmax = INT_MAX; - iprop->range_ex(ptr, prop, hardmin, hardmax, &softmin, &softmax); - } - else { - *hardmin = iprop->hardmin; - *hardmax = iprop->hardmax; - } + iprop->range_ex(ptr, prop, hardmin, hardmax, &softmin, &softmax); + } + else { + *hardmin = iprop->hardmin; + *hardmax = iprop->hardmax; + } } -void RNA_property_int_ui_range(PointerRNA *ptr, PropertyRNA *prop, int *softmin, int *softmax, int *step) +void RNA_property_int_ui_range( + PointerRNA *ptr, PropertyRNA *prop, int *softmin, int *softmax, int *step) { - IntPropertyRNA *iprop = (IntPropertyRNA *)rna_ensure_property(prop); - int hardmin, hardmax; + IntPropertyRNA *iprop = (IntPropertyRNA *)rna_ensure_property(prop); + int hardmin, hardmax; - if (prop->magic != RNA_MAGIC) { - /* attempt to get the local ID values */ - IDProperty *idp_ui = rna_idproperty_ui(prop); + if (prop->magic != RNA_MAGIC) { + /* attempt to get the local ID values */ + IDProperty *idp_ui = rna_idproperty_ui(prop); - if (idp_ui) { - IDProperty *item; + if (idp_ui) { + IDProperty *item; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "soft_min", IDP_INT); - *softmin = item ? IDP_Int(item) : INT_MIN; + item = IDP_GetPropertyTypeFromGroup(idp_ui, "soft_min", IDP_INT); + *softmin = item ? IDP_Int(item) : INT_MIN; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "soft_max", IDP_INT); - *softmax = item ? IDP_Int(item) : INT_MAX; + item = IDP_GetPropertyTypeFromGroup(idp_ui, "soft_max", IDP_INT); + *softmax = item ? IDP_Int(item) : INT_MAX; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "step", IDP_INT); - *step = item ? IDP_Int(item) : 1; + item = IDP_GetPropertyTypeFromGroup(idp_ui, "step", IDP_INT); + *step = item ? IDP_Int(item) : 1; - return; - } - } + return; + } + } - *softmin = iprop->softmin; - *softmax = iprop->softmax; + *softmin = iprop->softmin; + *softmax = iprop->softmax; - if (iprop->range) { - hardmin = INT_MIN; - hardmax = INT_MAX; + if (iprop->range) { + hardmin = INT_MIN; + hardmax = INT_MAX; - iprop->range(ptr, &hardmin, &hardmax, softmin, softmax); + iprop->range(ptr, &hardmin, &hardmax, softmin, softmax); - *softmin = max_ii(*softmin, hardmin); - *softmax = min_ii(*softmax, hardmax); - } - else if (iprop->range_ex) { - hardmin = INT_MIN; - hardmax = INT_MAX; + *softmin = max_ii(*softmin, hardmin); + *softmax = min_ii(*softmax, hardmax); + } + else if (iprop->range_ex) { + hardmin = INT_MIN; + hardmax = INT_MAX; - iprop->range_ex(ptr, prop, &hardmin, &hardmax, softmin, softmax); + iprop->range_ex(ptr, prop, &hardmin, &hardmax, softmin, softmax); - *softmin = max_ii(*softmin, hardmin); - *softmax = min_ii(*softmax, hardmax); - } + *softmin = max_ii(*softmin, hardmin); + *softmax = min_ii(*softmax, hardmax); + } - *step = iprop->step; + *step = iprop->step; } void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax) { - FloatPropertyRNA *fprop = (FloatPropertyRNA *)rna_ensure_property(prop); - float softmin, softmax; + FloatPropertyRNA *fprop = (FloatPropertyRNA *)rna_ensure_property(prop); + float softmin, softmax; - if (prop->magic != RNA_MAGIC) { - /* attempt to get the local ID values */ - IDProperty *idp_ui = rna_idproperty_ui(prop); + if (prop->magic != RNA_MAGIC) { + /* attempt to get the local ID values */ + IDProperty *idp_ui = rna_idproperty_ui(prop); - if (idp_ui) { - IDProperty *item; + if (idp_ui) { + IDProperty *item; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "min", IDP_DOUBLE); - *hardmin = item ? (float)IDP_Double(item) : -FLT_MAX; + item = IDP_GetPropertyTypeFromGroup(idp_ui, "min", IDP_DOUBLE); + *hardmin = item ? (float)IDP_Double(item) : -FLT_MAX; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "max", IDP_DOUBLE); - *hardmax = item ? (float)IDP_Double(item) : FLT_MAX; + item = IDP_GetPropertyTypeFromGroup(idp_ui, "max", IDP_DOUBLE); + *hardmax = item ? (float)IDP_Double(item) : FLT_MAX; - return; - } - } + return; + } + } - if (fprop->range) { - *hardmin = -FLT_MAX; - *hardmax = FLT_MAX; + if (fprop->range) { + *hardmin = -FLT_MAX; + *hardmax = FLT_MAX; - fprop->range(ptr, hardmin, hardmax, &softmin, &softmax); - } - else if (fprop->range_ex) { - *hardmin = -FLT_MAX; - *hardmax = FLT_MAX; + fprop->range(ptr, hardmin, hardmax, &softmin, &softmax); + } + else if (fprop->range_ex) { + *hardmin = -FLT_MAX; + *hardmax = FLT_MAX; - fprop->range_ex(ptr, prop, hardmin, hardmax, &softmin, &softmax); - } - else { - *hardmin = fprop->hardmin; - *hardmax = fprop->hardmax; - } + fprop->range_ex(ptr, prop, hardmin, hardmax, &softmin, &softmax); + } + else { + *hardmin = fprop->hardmin; + *hardmax = fprop->hardmax; + } } -void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *softmin, float *softmax, - float *step, float *precision) +void RNA_property_float_ui_range(PointerRNA *ptr, + PropertyRNA *prop, + float *softmin, + float *softmax, + float *step, + float *precision) { - FloatPropertyRNA *fprop = (FloatPropertyRNA *)rna_ensure_property(prop); - float hardmin, hardmax; + FloatPropertyRNA *fprop = (FloatPropertyRNA *)rna_ensure_property(prop); + float hardmin, hardmax; - if (prop->magic != RNA_MAGIC) { - /* attempt to get the local ID values */ - IDProperty *idp_ui = rna_idproperty_ui(prop); + if (prop->magic != RNA_MAGIC) { + /* attempt to get the local ID values */ + IDProperty *idp_ui = rna_idproperty_ui(prop); - if (idp_ui) { - IDProperty *item; + if (idp_ui) { + IDProperty *item; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "soft_min", IDP_DOUBLE); - *softmin = item ? (float)IDP_Double(item) : -FLT_MAX; + item = IDP_GetPropertyTypeFromGroup(idp_ui, "soft_min", IDP_DOUBLE); + *softmin = item ? (float)IDP_Double(item) : -FLT_MAX; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "soft_max", IDP_DOUBLE); - *softmax = item ? (float)IDP_Double(item) : FLT_MAX; + item = IDP_GetPropertyTypeFromGroup(idp_ui, "soft_max", IDP_DOUBLE); + *softmax = item ? (float)IDP_Double(item) : FLT_MAX; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "step", IDP_DOUBLE); - *step = item ? (float)IDP_Double(item) : 1.0f; + item = IDP_GetPropertyTypeFromGroup(idp_ui, "step", IDP_DOUBLE); + *step = item ? (float)IDP_Double(item) : 1.0f; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "precision", IDP_DOUBLE); - *precision = item ? (float)IDP_Double(item) : 3.0f; + item = IDP_GetPropertyTypeFromGroup(idp_ui, "precision", IDP_DOUBLE); + *precision = item ? (float)IDP_Double(item) : 3.0f; - return; - } - } + return; + } + } - *softmin = fprop->softmin; - *softmax = fprop->softmax; + *softmin = fprop->softmin; + *softmax = fprop->softmax; - if (fprop->range) { - hardmin = -FLT_MAX; - hardmax = FLT_MAX; + if (fprop->range) { + hardmin = -FLT_MAX; + hardmax = FLT_MAX; - fprop->range(ptr, &hardmin, &hardmax, softmin, softmax); + fprop->range(ptr, &hardmin, &hardmax, softmin, softmax); - *softmin = max_ff(*softmin, hardmin); - *softmax = min_ff(*softmax, hardmax); - } - else if (fprop->range_ex) { - hardmin = -FLT_MAX; - hardmax = FLT_MAX; + *softmin = max_ff(*softmin, hardmin); + *softmax = min_ff(*softmax, hardmax); + } + else if (fprop->range_ex) { + hardmin = -FLT_MAX; + hardmax = FLT_MAX; - fprop->range_ex(ptr, prop, &hardmin, &hardmax, softmin, softmax); + fprop->range_ex(ptr, prop, &hardmin, &hardmax, softmin, softmax); - *softmin = max_ff(*softmin, hardmin); - *softmax = min_ff(*softmax, hardmax); - } + *softmin = max_ff(*softmin, hardmin); + *softmax = min_ff(*softmax, hardmax); + } - *step = fprop->step; - *precision = (float)fprop->precision; + *step = fprop->step; + *precision = (float)fprop->precision; } int RNA_property_float_clamp(PointerRNA *ptr, PropertyRNA *prop, float *value) { - float min, max; + float min, max; - RNA_property_float_range(ptr, prop, &min, &max); + RNA_property_float_range(ptr, prop, &min, &max); - if (*value < min) { - *value = min; - return -1; - } - else if (*value > max) { - *value = max; - return 1; - } - else { - return 0; - } + if (*value < min) { + *value = min; + return -1; + } + else if (*value > max) { + *value = max; + return 1; + } + else { + return 0; + } } int RNA_property_int_clamp(PointerRNA *ptr, PropertyRNA *prop, int *value) { - int min, max; + int min, max; - RNA_property_int_range(ptr, prop, &min, &max); + RNA_property_int_range(ptr, prop, &min, &max); - if (*value < min) { - *value = min; - return -1; - } - else if (*value > max) { - *value = max; - return 1; - } - else { - return 0; - } + if (*value < min) { + *value = min; + return -1; + } + else if (*value > max) { + *value = max; + return 1; + } + else { + return 0; + } } /* this is the max length including \0 terminator. * '0' used when their is no maximum */ int RNA_property_string_maxlength(PropertyRNA *prop) { - StringPropertyRNA *sprop = (StringPropertyRNA *)rna_ensure_property(prop); - return sprop->maxlength; + StringPropertyRNA *sprop = (StringPropertyRNA *)rna_ensure_property(prop); + return sprop->maxlength; } StructRNA *RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop) { - prop = rna_ensure_property(prop); + prop = rna_ensure_property(prop); - if (prop->type == PROP_POINTER) { - PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop; + if (prop->type == PROP_POINTER) { + PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop; - if (pprop->typef) - return pprop->typef(ptr); - else if (pprop->type) - return pprop->type; - } - else if (prop->type == PROP_COLLECTION) { - CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; + if (pprop->typef) + return pprop->typef(ptr); + else if (pprop->type) + return pprop->type; + } + else if (prop->type == PROP_COLLECTION) { + CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; - if (cprop->item_type) - return cprop->item_type; - } - /* ignore other types, RNA_struct_find_nested calls with unchecked props */ + if (cprop->item_type) + return cprop->item_type; + } + /* ignore other types, RNA_struct_find_nested calls with unchecked props */ - return &RNA_UnknownType; + return &RNA_UnknownType; } bool RNA_property_pointer_poll(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *value) { - prop = rna_ensure_property(prop); + prop = rna_ensure_property(prop); - if (prop->type == PROP_POINTER) { - PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop; + if (prop->type == PROP_POINTER) { + PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop; - if (pprop->poll) { - if (rna_idproperty_check(&prop, ptr)) { - return ((PropPointerPollFuncPy) pprop->poll)(ptr, *value, prop); - } - else { - return pprop->poll(ptr, *value); - } - } + if (pprop->poll) { + if (rna_idproperty_check(&prop, ptr)) { + return ((PropPointerPollFuncPy)pprop->poll)(ptr, *value, prop); + } + else { + return pprop->poll(ptr, *value); + } + } - return 1; - } + return 1; + } - printf("%s: %s is not a pointer property.\n", __func__, prop->identifier); - return 0; + printf("%s: %s is not a pointer property.\n", __func__, prop->identifier); + return 0; } -void RNA_property_enum_items_ex( - bContext *C, PointerRNA *ptr, PropertyRNA *prop, const bool use_static, - const EnumPropertyItem **r_item, int *r_totitem, bool *r_free) +void RNA_property_enum_items_ex(bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const bool use_static, + const EnumPropertyItem **r_item, + int *r_totitem, + bool *r_free) { - EnumPropertyRNA *eprop = (EnumPropertyRNA *)rna_ensure_property(prop); + EnumPropertyRNA *eprop = (EnumPropertyRNA *)rna_ensure_property(prop); - *r_free = false; + *r_free = false; - if (!use_static && eprop->itemf && (C != NULL || (prop->flag & PROP_ENUM_NO_CONTEXT))) { - const EnumPropertyItem *item; + if (!use_static && eprop->itemf && (C != NULL || (prop->flag & PROP_ENUM_NO_CONTEXT))) { + const EnumPropertyItem *item; - if (prop->flag & PROP_ENUM_NO_CONTEXT) - item = eprop->itemf(NULL, ptr, prop, r_free); - else - item = eprop->itemf(C, ptr, prop, r_free); + if (prop->flag & PROP_ENUM_NO_CONTEXT) + item = eprop->itemf(NULL, ptr, prop, r_free); + else + item = eprop->itemf(C, ptr, prop, r_free); - /* any callbacks returning NULL should be fixed */ - BLI_assert(item != NULL); + /* any callbacks returning NULL should be fixed */ + BLI_assert(item != NULL); - if (r_totitem) { - int tot; - for (tot = 0; item[tot].identifier; tot++) { - /* pass */ - } - *r_totitem = tot; - } + if (r_totitem) { + int tot; + for (tot = 0; item[tot].identifier; tot++) { + /* pass */ + } + *r_totitem = tot; + } - *r_item = item; - } - else { - *r_item = eprop->item; - if (r_totitem) - *r_totitem = eprop->totitem; - } + *r_item = item; + } + else { + *r_item = eprop->item; + if (r_totitem) + *r_totitem = eprop->totitem; + } } -void RNA_property_enum_items( - bContext *C, PointerRNA *ptr, PropertyRNA *prop, - const EnumPropertyItem **r_item, int *r_totitem, bool *r_free) +void RNA_property_enum_items(bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const EnumPropertyItem **r_item, + int *r_totitem, + bool *r_free) { - RNA_property_enum_items_ex(C, ptr, prop, false, r_item, r_totitem, r_free); + RNA_property_enum_items_ex(C, ptr, prop, false, r_item, r_totitem, r_free); } #ifdef WITH_INTERNATIONAL -static void property_enum_translate( - PropertyRNA *prop, EnumPropertyItem **r_item, int *r_totitem, bool *r_free) -{ - if (!(prop->flag & PROP_ENUM_NO_TRANSLATE)) { - int i; - - /* Note: Only do those tests once, and then use BLT_pgettext. */ - bool do_iface = BLT_translate_iface(); - bool do_tooltip = BLT_translate_tooltips(); - EnumPropertyItem *nitem; - - if (!(do_iface || do_tooltip)) - return; - - if (*r_free) { - nitem = *r_item; - } - else { - const EnumPropertyItem *item = *r_item; - int tot; - - if (r_totitem) { - tot = *r_totitem; - } - else { - /* count */ - for (tot = 0; item[tot].identifier; tot++) { - /* pass */ - } - } - - nitem = MEM_mallocN(sizeof(EnumPropertyItem) * (tot + 1), "enum_items_gettexted"); - memcpy(nitem, item, sizeof(EnumPropertyItem) * (tot + 1)); - - *r_free = true; - } - - for (i = 0; nitem[i].identifier; i++) { - if (nitem[i].name && do_iface) { - nitem[i].name = BLT_pgettext(prop->translation_context, nitem[i].name); - } - if (nitem[i].description && do_tooltip) { - nitem[i].description = BLT_pgettext(NULL, nitem[i].description); - } - } - - *r_item = nitem; - } +static void property_enum_translate(PropertyRNA *prop, + EnumPropertyItem **r_item, + int *r_totitem, + bool *r_free) +{ + if (!(prop->flag & PROP_ENUM_NO_TRANSLATE)) { + int i; + + /* Note: Only do those tests once, and then use BLT_pgettext. */ + bool do_iface = BLT_translate_iface(); + bool do_tooltip = BLT_translate_tooltips(); + EnumPropertyItem *nitem; + + if (!(do_iface || do_tooltip)) + return; + + if (*r_free) { + nitem = *r_item; + } + else { + const EnumPropertyItem *item = *r_item; + int tot; + + if (r_totitem) { + tot = *r_totitem; + } + else { + /* count */ + for (tot = 0; item[tot].identifier; tot++) { + /* pass */ + } + } + + nitem = MEM_mallocN(sizeof(EnumPropertyItem) * (tot + 1), "enum_items_gettexted"); + memcpy(nitem, item, sizeof(EnumPropertyItem) * (tot + 1)); + + *r_free = true; + } + + for (i = 0; nitem[i].identifier; i++) { + if (nitem[i].name && do_iface) { + nitem[i].name = BLT_pgettext(prop->translation_context, nitem[i].name); + } + if (nitem[i].description && do_tooltip) { + nitem[i].description = BLT_pgettext(NULL, nitem[i].description); + } + } + + *r_item = nitem; + } } #endif -void RNA_property_enum_items_gettexted( - bContext *C, PointerRNA *ptr, PropertyRNA *prop, - const EnumPropertyItem **r_item, int *r_totitem, bool *r_free) +void RNA_property_enum_items_gettexted(bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const EnumPropertyItem **r_item, + int *r_totitem, + bool *r_free) { - RNA_property_enum_items(C, ptr, prop, r_item, r_totitem, r_free); + RNA_property_enum_items(C, ptr, prop, r_item, r_totitem, r_free); #ifdef WITH_INTERNATIONAL - /* Normally dropping 'const' is _not_ ok, in this case it's only modified if we own the memory - * so allow the exception (callers are creating new arrays in this case). */ - property_enum_translate(prop, (EnumPropertyItem **)r_item, r_totitem, r_free); + /* Normally dropping 'const' is _not_ ok, in this case it's only modified if we own the memory + * so allow the exception (callers are creating new arrays in this case). */ + property_enum_translate(prop, (EnumPropertyItem **)r_item, r_totitem, r_free); #endif } -void RNA_property_enum_items_gettexted_all( - bContext *C, PointerRNA *ptr, PropertyRNA *prop, - const EnumPropertyItem **r_item, int *r_totitem, bool *r_free) -{ - EnumPropertyRNA *eprop = (EnumPropertyRNA *)rna_ensure_property(prop); - int mem_size = sizeof(EnumPropertyItem) * (eprop->totitem + 1); - /* first return all items */ - EnumPropertyItem *item_array = MEM_mallocN(mem_size, "enum_gettext_all"); - *r_free = true; - memcpy(item_array, eprop->item, mem_size); - - if (r_totitem) { - *r_totitem = eprop->totitem; - } - - if (eprop->itemf && (C != NULL || (prop->flag & PROP_ENUM_NO_CONTEXT))) { - const EnumPropertyItem *item; - int i; - bool free = false; - - if (prop->flag & PROP_ENUM_NO_CONTEXT) - item = eprop->itemf(NULL, ptr, prop, &free); - else - item = eprop->itemf(C, ptr, prop, &free); - - /* any callbacks returning NULL should be fixed */ - BLI_assert(item != NULL); - - for (i = 0; i < eprop->totitem; i++) { - bool exists = false; - int i_fixed; - - /* items that do not exist on list are returned, but have their names/identifiers NULLed out */ - for (i_fixed = 0; item[i_fixed].identifier; i_fixed++) { - if (STREQ(item[i_fixed].identifier, item_array[i].identifier)) { - exists = true; - break; - } - } - - if (!exists) { - item_array[i].name = NULL; - item_array[i].identifier = ""; - } - } - - if (free) { - MEM_freeN((void *)item); - } - } +void RNA_property_enum_items_gettexted_all(bContext *C, + PointerRNA *ptr, + PropertyRNA *prop, + const EnumPropertyItem **r_item, + int *r_totitem, + bool *r_free) +{ + EnumPropertyRNA *eprop = (EnumPropertyRNA *)rna_ensure_property(prop); + int mem_size = sizeof(EnumPropertyItem) * (eprop->totitem + 1); + /* first return all items */ + EnumPropertyItem *item_array = MEM_mallocN(mem_size, "enum_gettext_all"); + *r_free = true; + memcpy(item_array, eprop->item, mem_size); + + if (r_totitem) { + *r_totitem = eprop->totitem; + } + + if (eprop->itemf && (C != NULL || (prop->flag & PROP_ENUM_NO_CONTEXT))) { + const EnumPropertyItem *item; + int i; + bool free = false; + + if (prop->flag & PROP_ENUM_NO_CONTEXT) + item = eprop->itemf(NULL, ptr, prop, &free); + else + item = eprop->itemf(C, ptr, prop, &free); + + /* any callbacks returning NULL should be fixed */ + BLI_assert(item != NULL); + + for (i = 0; i < eprop->totitem; i++) { + bool exists = false; + int i_fixed; + + /* items that do not exist on list are returned, but have their names/identifiers NULLed out */ + for (i_fixed = 0; item[i_fixed].identifier; i_fixed++) { + if (STREQ(item[i_fixed].identifier, item_array[i].identifier)) { + exists = true; + break; + } + } + + if (!exists) { + item_array[i].name = NULL; + item_array[i].identifier = ""; + } + } + + if (free) { + MEM_freeN((void *)item); + } + } #ifdef WITH_INTERNATIONAL - property_enum_translate(prop, &item_array, r_totitem, r_free); + property_enum_translate(prop, &item_array, r_totitem, r_free); #endif - *r_item = item_array; + *r_item = item_array; } -bool RNA_property_enum_value(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *r_value) +bool RNA_property_enum_value( + bContext *C, PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *r_value) { - const EnumPropertyItem *item; - bool free; - bool found; + const EnumPropertyItem *item; + bool free; + bool found; - RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); + RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); - if (item) { - const int i = RNA_enum_from_identifier(item, identifier); - if (i != -1) { - *r_value = item[i].value; - found = true; - } - else { - found = false; - } + if (item) { + const int i = RNA_enum_from_identifier(item, identifier); + if (i != -1) { + *r_value = item[i].value; + found = true; + } + else { + found = false; + } - if (free) { - MEM_freeN((void *)item); - } - } - else { - found = false; - } - return found; + if (free) { + MEM_freeN((void *)item); + } + } + else { + found = false; + } + return found; } bool RNA_enum_identifier(const EnumPropertyItem *item, const int value, const char **r_identifier) { - const int i = RNA_enum_from_value(item, value); - if (i != -1) { - *r_identifier = item[i].identifier; - return true; - } - else { - return false; - } + const int i = RNA_enum_from_value(item, value); + if (i != -1) { + *r_identifier = item[i].identifier; + return true; + } + else { + return false; + } } -int RNA_enum_bitflag_identifiers(const EnumPropertyItem *item, const int value, const char **r_identifier) +int RNA_enum_bitflag_identifiers(const EnumPropertyItem *item, + const int value, + const char **r_identifier) { - int index = 0; - for (; item->identifier; item++) { - if (item->identifier[0] && item->value & value) { - r_identifier[index++] = item->identifier; - } - } - r_identifier[index] = NULL; - return index; + int index = 0; + for (; item->identifier; item++) { + if (item->identifier[0] && item->value & value) { + r_identifier[index++] = item->identifier; + } + } + r_identifier[index] = NULL; + return index; } bool RNA_enum_name(const EnumPropertyItem *item, const int value, const char **r_name) { - const int i = RNA_enum_from_value(item, value); - if (i != -1) { - *r_name = item[i].name; - return true; - } - else { - return false; - } + const int i = RNA_enum_from_value(item, value); + if (i != -1) { + *r_name = item[i].name; + return true; + } + else { + return false; + } } -bool RNA_enum_description(const EnumPropertyItem *item, const int value, const char **r_description) +bool RNA_enum_description(const EnumPropertyItem *item, + const int value, + const char **r_description) { - const int i = RNA_enum_from_value(item, value); - if (i != -1) { - *r_description = item[i].description; - return true; - } - else { - return false; - } + const int i = RNA_enum_from_value(item, value); + if (i != -1) { + *r_description = item[i].description; + return true; + } + else { + return false; + } } int RNA_enum_from_identifier(const EnumPropertyItem *item, const char *identifier) { - int i = 0; - for (; item->identifier; item++, i++) { - if (item->identifier[0] && STREQ(item->identifier, identifier)) { - return i; - } - } - return -1; + int i = 0; + for (; item->identifier; item++, i++) { + if (item->identifier[0] && STREQ(item->identifier, identifier)) { + return i; + } + } + return -1; } /** @@ -1758,199 +1800,198 @@ int RNA_enum_from_identifier(const EnumPropertyItem *item, const char *identifie */ int RNA_enum_from_name(const EnumPropertyItem *item, const char *name) { - int i = 0; - for (; item->identifier; item++, i++) { - if (item->identifier[0] && STREQ(item->name, name)) { - return i; - } - } - return -1; + int i = 0; + for (; item->identifier; item++, i++) { + if (item->identifier[0] && STREQ(item->name, name)) { + return i; + } + } + return -1; } int RNA_enum_from_value(const EnumPropertyItem *item, const int value) { - int i = 0; - for (; item->identifier; item++, i++) { - if (item->identifier[0] && item->value == value) { - return i; - } - } - return -1; + int i = 0; + for (; item->identifier; item++, i++) { + if (item->identifier[0] && item->value == value) { + return i; + } + } + return -1; } unsigned int RNA_enum_items_count(const EnumPropertyItem *item) { - unsigned int i = 0; + unsigned int i = 0; - while (item->identifier) { - item++; - i++; - } + while (item->identifier) { + item++; + i++; + } - return i; + return i; } -bool RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, - const char **identifier) +bool RNA_property_enum_identifier( + bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier) { - const EnumPropertyItem *item = NULL; - bool free; + const EnumPropertyItem *item = NULL; + bool free; - RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); - if (item) { - bool result; - result = RNA_enum_identifier(item, value, identifier); - if (free) { - MEM_freeN((void *)item); - } - return result; - } - return false; + RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); + if (item) { + bool result; + result = RNA_enum_identifier(item, value, identifier); + if (free) { + MEM_freeN((void *)item); + } + return result; + } + return false; } -bool RNA_property_enum_name(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **name) +bool RNA_property_enum_name( + bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **name) { - const EnumPropertyItem *item = NULL; - bool free; + const EnumPropertyItem *item = NULL; + bool free; - RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); - if (item) { - bool result; - result = RNA_enum_name(item, value, name); - if (free) { - MEM_freeN((void *)item); - } + RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); + if (item) { + bool result; + result = RNA_enum_name(item, value, name); + if (free) { + MEM_freeN((void *)item); + } - return result; - } - return false; + return result; + } + return false; } -bool RNA_property_enum_name_gettexted(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **name) +bool RNA_property_enum_name_gettexted( + bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **name) { - bool result; + bool result; - result = RNA_property_enum_name(C, ptr, prop, value, name); + result = RNA_property_enum_name(C, ptr, prop, value, name); - if (result) { - if (!(prop->flag & PROP_ENUM_NO_TRANSLATE)) { - if (BLT_translate_iface()) { - *name = BLT_pgettext(prop->translation_context, *name); - } - } - } + if (result) { + if (!(prop->flag & PROP_ENUM_NO_TRANSLATE)) { + if (BLT_translate_iface()) { + *name = BLT_pgettext(prop->translation_context, *name); + } + } + } - return result; + return result; } bool RNA_property_enum_item_from_value( - bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, - EnumPropertyItem *r_item) + bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, EnumPropertyItem *r_item) { - const EnumPropertyItem *item = NULL; - bool free; + const EnumPropertyItem *item = NULL; + bool free; - RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); - if (item) { - const int i = RNA_enum_from_value(item, value); - bool result; + RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); + if (item) { + const int i = RNA_enum_from_value(item, value); + bool result; - if (i != -1) { - *r_item = item[i]; - result = true; - } - else { - result = false; - } + if (i != -1) { + *r_item = item[i]; + result = true; + } + else { + result = false; + } - if (free) { - MEM_freeN((void *)item); - } + if (free) { + MEM_freeN((void *)item); + } - return result; - } - return false; + return result; + } + return false; } bool RNA_property_enum_item_from_value_gettexted( - bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, - EnumPropertyItem *r_item) + bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, EnumPropertyItem *r_item) { - bool result; + bool result; - result = RNA_property_enum_item_from_value(C, ptr, prop, value, r_item); + result = RNA_property_enum_item_from_value(C, ptr, prop, value, r_item); - if (!(prop->flag & PROP_ENUM_NO_TRANSLATE)) { - if (BLT_translate_iface()) { - r_item->name = BLT_pgettext(prop->translation_context, r_item->name); - } - } + if (!(prop->flag & PROP_ENUM_NO_TRANSLATE)) { + if (BLT_translate_iface()) { + r_item->name = BLT_pgettext(prop->translation_context, r_item->name); + } + } - return result; + return result; } -int RNA_property_enum_bitflag_identifiers(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, - const char **identifier) +int RNA_property_enum_bitflag_identifiers( + bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier) { - const EnumPropertyItem *item = NULL; - bool free; + const EnumPropertyItem *item = NULL; + bool free; - RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); - if (item) { - int result; - result = RNA_enum_bitflag_identifiers(item, value, identifier); - if (free) - MEM_freeN((void *)item); + RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); + if (item) { + int result; + result = RNA_enum_bitflag_identifiers(item, value, identifier); + if (free) + MEM_freeN((void *)item); - return result; - } - return 0; + return result; + } + return 0; } const char *RNA_property_ui_name(PropertyRNA *prop) { - return CTX_IFACE_(prop->translation_context, rna_ensure_property_name(prop)); + return CTX_IFACE_(prop->translation_context, rna_ensure_property_name(prop)); } const char *RNA_property_ui_name_raw(PropertyRNA *prop) { - return rna_ensure_property_name(prop); + return rna_ensure_property_name(prop); } const char *RNA_property_ui_description(PropertyRNA *prop) { - return TIP_(rna_ensure_property_description(prop)); + return TIP_(rna_ensure_property_description(prop)); } const char *RNA_property_ui_description_raw(PropertyRNA *prop) { - return rna_ensure_property_description(prop); + return rna_ensure_property_description(prop); } const char *RNA_property_translation_context(PropertyRNA *_prop) { - PropertyRNA *prop = rna_ensure_property(_prop); - return prop->translation_context; + PropertyRNA *prop = rna_ensure_property(_prop); + return prop->translation_context; } int RNA_property_ui_icon(PropertyRNA *prop) { - return rna_ensure_property(prop)->icon; + return rna_ensure_property(prop)->icon; } bool RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop) { - ID *id = ptr->id.data; - int flag; - const char *dummy_info; + ID *id = ptr->id.data; + int flag; + const char *dummy_info; - prop = rna_ensure_property(prop); - flag = prop->editable ? prop->editable(ptr, &dummy_info) : prop->flag; + prop = rna_ensure_property(prop); + flag = prop->editable ? prop->editable(ptr, &dummy_info) : prop->flag; - return ((flag & PROP_EDITABLE) && - (flag & PROP_REGISTER) == 0 && - (!id || ((!ID_IS_LINKED(id) || (prop->flag & PROP_LIB_EXCEPTION)) && - (!id->override_static || RNA_property_overridable_get(ptr, prop))))); + return ((flag & PROP_EDITABLE) && (flag & PROP_REGISTER) == 0 && + (!id || ((!ID_IS_LINKED(id) || (prop->flag & PROP_LIB_EXCEPTION)) && + (!id->override_static || RNA_property_overridable_get(ptr, prop))))); } /** @@ -1958,259 +1999,260 @@ bool RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop) */ bool RNA_property_editable_info(PointerRNA *ptr, PropertyRNA *prop, const char **r_info) { - ID *id = ptr->id.data; - int flag; - - prop = rna_ensure_property(prop); - *r_info = ""; - - /* get flag */ - if (prop->editable) { - flag = prop->editable(ptr, r_info); - } - else { - flag = prop->flag; - if ((flag & PROP_EDITABLE) == 0 || (flag & PROP_REGISTER)) { - *r_info = N_("This property is for internal use only and can't be edited"); - } - } - - /* property from linked data-block */ - if (id) { - if (ID_IS_LINKED(id) && (prop->flag & PROP_LIB_EXCEPTION) == 0) { - if (!(*r_info)[0]) { - *r_info = N_("Can't edit this property from a linked data-block"); - } - return false; - } - if (id->override_static != NULL && !RNA_property_overridable_get(ptr, prop)) { - if (!(*r_info)[0]) { - *r_info = N_("Can't edit this property from an override data-block"); - } - return false; - } - } - - return ((flag & PROP_EDITABLE) && (flag & PROP_REGISTER) == 0); + ID *id = ptr->id.data; + int flag; + + prop = rna_ensure_property(prop); + *r_info = ""; + + /* get flag */ + if (prop->editable) { + flag = prop->editable(ptr, r_info); + } + else { + flag = prop->flag; + if ((flag & PROP_EDITABLE) == 0 || (flag & PROP_REGISTER)) { + *r_info = N_("This property is for internal use only and can't be edited"); + } + } + + /* property from linked data-block */ + if (id) { + if (ID_IS_LINKED(id) && (prop->flag & PROP_LIB_EXCEPTION) == 0) { + if (!(*r_info)[0]) { + *r_info = N_("Can't edit this property from a linked data-block"); + } + return false; + } + if (id->override_static != NULL && !RNA_property_overridable_get(ptr, prop)) { + if (!(*r_info)[0]) { + *r_info = N_("Can't edit this property from an override data-block"); + } + return false; + } + } + + return ((flag & PROP_EDITABLE) && (flag & PROP_REGISTER) == 0); } bool RNA_property_editable_flag(PointerRNA *ptr, PropertyRNA *prop) { - int flag; - const char *dummy_info; + int flag; + const char *dummy_info; - prop = rna_ensure_property(prop); - flag = prop->editable ? prop->editable(ptr, &dummy_info) : prop->flag; - return (flag & PROP_EDITABLE) != 0; + prop = rna_ensure_property(prop); + flag = prop->editable ? prop->editable(ptr, &dummy_info) : prop->flag; + return (flag & PROP_EDITABLE) != 0; } /* same as RNA_property_editable(), except this checks individual items in an array */ bool RNA_property_editable_index(PointerRNA *ptr, PropertyRNA *prop, int index) { - ID *id; - int flag; + ID *id; + int flag; - BLI_assert(index >= 0); + BLI_assert(index >= 0); - prop = rna_ensure_property(prop); + prop = rna_ensure_property(prop); - flag = prop->flag; + flag = prop->flag; - if (prop->editable) { - const char *dummy_info; - flag &= prop->editable(ptr, &dummy_info); - } + if (prop->editable) { + const char *dummy_info; + flag &= prop->editable(ptr, &dummy_info); + } - if (prop->itemeditable) - flag &= prop->itemeditable(ptr, index); + if (prop->itemeditable) + flag &= prop->itemeditable(ptr, index); - id = ptr->id.data; + id = ptr->id.data; - return (flag & PROP_EDITABLE) && (!id || !ID_IS_LINKED(id) || (prop->flag & PROP_LIB_EXCEPTION)); + return (flag & PROP_EDITABLE) && (!id || !ID_IS_LINKED(id) || (prop->flag & PROP_LIB_EXCEPTION)); } bool RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop) { - /* check that base ID-block can support animation data */ - if (!id_can_have_animdata(ptr->id.data)) - return false; + /* check that base ID-block can support animation data */ + if (!id_can_have_animdata(ptr->id.data)) + return false; - prop = rna_ensure_property(prop); + prop = rna_ensure_property(prop); - if (!(prop->flag & PROP_ANIMATABLE)) - return false; + if (!(prop->flag & PROP_ANIMATABLE)) + return false; - return (prop->flag & PROP_EDITABLE) != 0; + return (prop->flag & PROP_EDITABLE) != 0; } bool RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop) { - int len = 1, index; - bool driven, special; + int len = 1, index; + bool driven, special; - if (!prop) - return false; + if (!prop) + return false; - if (RNA_property_array_check(prop)) - len = RNA_property_array_length(ptr, prop); + if (RNA_property_array_check(prop)) + len = RNA_property_array_length(ptr, prop); - for (index = 0; index < len; index++) { - if (rna_get_fcurve(ptr, prop, index, NULL, NULL, &driven, &special)) - return true; - } + for (index = 0; index < len; index++) { + if (rna_get_fcurve(ptr, prop, index, NULL, NULL, &driven, &special)) + return true; + } - return false; + return false; } /** \note Does not take into account editable status, this has to be checked separately * (using #RNA_property_editable_flag() usually). */ bool RNA_property_overridable_get(PointerRNA *ptr, PropertyRNA *prop) { - if (prop->magic == RNA_MAGIC) { - /* Special handling for insertions of constraints or modifiers... */ - /* TODO Note We may want to add a more generic system to RNA (like a special property in struct of items) - * if we get more overrideable collections, for now we can live with those special-cases handling I think. */ - if (RNA_struct_is_a(ptr->type, &RNA_Constraint)) { - bConstraint *con = ptr->data; - if (con->flag & CONSTRAINT_STATICOVERRIDE_LOCAL) { - return true; - } - } - else if (RNA_struct_is_a(ptr->type, &RNA_Modifier)) { - ModifierData *mod = ptr->data; - if (mod->flag & eModifierFlag_StaticOverride_Local) { - return true; - } - } - /* If this is a RNA-defined property (real or 'virtual' IDProp), we want to use RNA prop flag. */ - return !(prop->flag_override & PROPOVERRIDE_NO_COMPARISON) && (prop->flag_override & PROPOVERRIDE_OVERRIDABLE_STATIC); - } - else { - /* If this is a real 'pure' IDProp (aka custom property), we want to use the IDProp flag. */ - return !(prop->flag_override & PROPOVERRIDE_NO_COMPARISON) && (((IDProperty *)prop)->flag & IDP_FLAG_OVERRIDABLE_STATIC); - } + if (prop->magic == RNA_MAGIC) { + /* Special handling for insertions of constraints or modifiers... */ + /* TODO Note We may want to add a more generic system to RNA (like a special property in struct of items) + * if we get more overrideable collections, for now we can live with those special-cases handling I think. */ + if (RNA_struct_is_a(ptr->type, &RNA_Constraint)) { + bConstraint *con = ptr->data; + if (con->flag & CONSTRAINT_STATICOVERRIDE_LOCAL) { + return true; + } + } + else if (RNA_struct_is_a(ptr->type, &RNA_Modifier)) { + ModifierData *mod = ptr->data; + if (mod->flag & eModifierFlag_StaticOverride_Local) { + return true; + } + } + /* If this is a RNA-defined property (real or 'virtual' IDProp), we want to use RNA prop flag. */ + return !(prop->flag_override & PROPOVERRIDE_NO_COMPARISON) && + (prop->flag_override & PROPOVERRIDE_OVERRIDABLE_STATIC); + } + else { + /* If this is a real 'pure' IDProp (aka custom property), we want to use the IDProp flag. */ + return !(prop->flag_override & PROPOVERRIDE_NO_COMPARISON) && + (((IDProperty *)prop)->flag & IDP_FLAG_OVERRIDABLE_STATIC); + } } /* Should only be used for custom properties */ -bool RNA_property_overridable_static_set(PointerRNA *UNUSED(ptr), PropertyRNA *prop, const bool is_overridable) +bool RNA_property_overridable_static_set(PointerRNA *UNUSED(ptr), + PropertyRNA *prop, + const bool is_overridable) { - /* Only works for pure custom properties IDProps. */ - if (prop->magic != RNA_MAGIC) { - IDProperty *idprop = (IDProperty *)prop; + /* Only works for pure custom properties IDProps. */ + if (prop->magic != RNA_MAGIC) { + IDProperty *idprop = (IDProperty *)prop; - idprop->flag = is_overridable ? (idprop->flag | IDP_FLAG_OVERRIDABLE_STATIC) : - (idprop->flag & ~IDP_FLAG_OVERRIDABLE_STATIC); - return true; - } + idprop->flag = is_overridable ? (idprop->flag | IDP_FLAG_OVERRIDABLE_STATIC) : + (idprop->flag & ~IDP_FLAG_OVERRIDABLE_STATIC); + return true; + } - return false; + return false; } - bool RNA_property_overridden(PointerRNA *ptr, PropertyRNA *prop) { - char *rna_path = RNA_path_from_ID_to_property(ptr, prop); - ID *id = ptr->id.data; + char *rna_path = RNA_path_from_ID_to_property(ptr, prop); + ID *id = ptr->id.data; - if (rna_path == NULL || id == NULL || id->override_static == NULL) { - return false; - } + if (rna_path == NULL || id == NULL || id->override_static == NULL) { + return false; + } - return (BKE_override_static_property_find(id->override_static, rna_path) != NULL); + return (BKE_override_static_property_find(id->override_static, rna_path) != NULL); } bool RNA_property_comparable(PointerRNA *UNUSED(ptr), PropertyRNA *prop) { - prop = rna_ensure_property(prop); + prop = rna_ensure_property(prop); - return !(prop->flag_override & PROPOVERRIDE_NO_COMPARISON); + return !(prop->flag_override & PROPOVERRIDE_NO_COMPARISON); } /* this function is to check if its possible to create a valid path from the ID * its slow so don't call in a loop */ bool RNA_property_path_from_ID_check(PointerRNA *ptr, PropertyRNA *prop) { - char *path = RNA_path_from_ID_to_property(ptr, prop); - bool ret = false; - - if (path) { - PointerRNA id_ptr; - PointerRNA r_ptr; - PropertyRNA *r_prop; - - RNA_id_pointer_create(ptr->id.data, &id_ptr); - if (RNA_path_resolve(&id_ptr, path, &r_ptr, &r_prop) == true) { - ret = (prop == r_prop); - } - MEM_freeN(path); - } - - return ret; -} - - -static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerRNA *ptr, PropertyRNA *prop) -{ - const bool is_rna = (prop->magic == RNA_MAGIC); - prop = rna_ensure_property(prop); - - if (is_rna) { - if (prop->update) { - /* ideally no context would be needed for update, but there's some - * parts of the code that need it still, so we have this exception */ - if (prop->flag & PROP_CONTEXT_UPDATE) { - if (C) { - if ((prop->flag & PROP_CONTEXT_PROPERTY_UPDATE) == PROP_CONTEXT_PROPERTY_UPDATE) { - ((ContextPropUpdateFunc)prop->update)(C, ptr, prop); - } - else { - ((ContextUpdateFunc)prop->update)(C, ptr); - } - } - } - else - prop->update(bmain, scene, ptr); - } + char *path = RNA_path_from_ID_to_property(ptr, prop); + bool ret = false; + + if (path) { + PointerRNA id_ptr; + PointerRNA r_ptr; + PropertyRNA *r_prop; + + RNA_id_pointer_create(ptr->id.data, &id_ptr); + if (RNA_path_resolve(&id_ptr, path, &r_ptr, &r_prop) == true) { + ret = (prop == r_prop); + } + MEM_freeN(path); + } + + return ret; +} + +static void rna_property_update( + bContext *C, Main *bmain, Scene *scene, PointerRNA *ptr, PropertyRNA *prop) +{ + const bool is_rna = (prop->magic == RNA_MAGIC); + prop = rna_ensure_property(prop); + + if (is_rna) { + if (prop->update) { + /* ideally no context would be needed for update, but there's some + * parts of the code that need it still, so we have this exception */ + if (prop->flag & PROP_CONTEXT_UPDATE) { + if (C) { + if ((prop->flag & PROP_CONTEXT_PROPERTY_UPDATE) == PROP_CONTEXT_PROPERTY_UPDATE) { + ((ContextPropUpdateFunc)prop->update)(C, ptr, prop); + } + else { + ((ContextUpdateFunc)prop->update)(C, ptr); + } + } + } + else + prop->update(bmain, scene, ptr); + } #if 1 - /* TODO(campbell): Should eventually be replaced entirely by message bus (below) - * for now keep since COW, bugs are hard to track when we have other missing updates. */ - if (prop->noteflag) { - WM_main_add_notifier(prop->noteflag, ptr->id.data); - } + /* TODO(campbell): Should eventually be replaced entirely by message bus (below) + * for now keep since COW, bugs are hard to track when we have other missing updates. */ + if (prop->noteflag) { + WM_main_add_notifier(prop->noteflag, ptr->id.data); + } #endif - /* if C is NULL, we're updating from animation. - * avoid slow-down from f-curves by not publishing (for now). */ - if (C != NULL) { - struct wmMsgBus *mbus = CTX_wm_message_bus(C); - /* we could add NULL check, for now don't */ - WM_msg_publish_rna(mbus, ptr, prop); - } - if (ptr->id.data != NULL && ((prop->flag & PROP_NO_DEG_UPDATE) == 0)) { - const short id_type = GS(((ID *)ptr->id.data)->name); - if (ID_TYPE_IS_COW(id_type)) { - DEG_id_tag_update(ptr->id.data, ID_RECALC_COPY_ON_WRITE); - } - } - /* End message bus. */ - } - - if (!is_rna || (prop->flag & PROP_IDPROPERTY)) { - /* WARNING! This is so property drivers update the display! - * not especially nice */ - DEG_id_tag_update(ptr->id.data, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); - WM_main_add_notifier(NC_WINDOW, NULL); - /* Not nice as well, but the only way to make sure material preview - * is updated with custom nodes. - */ - if ((prop->flag & PROP_IDPROPERTY) != 0 && - (ptr->id.data != NULL) && - (GS(((ID *)ptr->id.data)->name) == ID_NT)) - { - WM_main_add_notifier(NC_MATERIAL | ND_SHADING, NULL); - } - } + /* if C is NULL, we're updating from animation. + * avoid slow-down from f-curves by not publishing (for now). */ + if (C != NULL) { + struct wmMsgBus *mbus = CTX_wm_message_bus(C); + /* we could add NULL check, for now don't */ + WM_msg_publish_rna(mbus, ptr, prop); + } + if (ptr->id.data != NULL && ((prop->flag & PROP_NO_DEG_UPDATE) == 0)) { + const short id_type = GS(((ID *)ptr->id.data)->name); + if (ID_TYPE_IS_COW(id_type)) { + DEG_id_tag_update(ptr->id.data, ID_RECALC_COPY_ON_WRITE); + } + } + /* End message bus. */ + } + + if (!is_rna || (prop->flag & PROP_IDPROPERTY)) { + /* WARNING! This is so property drivers update the display! + * not especially nice */ + DEG_id_tag_update(ptr->id.data, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); + WM_main_add_notifier(NC_WINDOW, NULL); + /* Not nice as well, but the only way to make sure material preview + * is updated with custom nodes. + */ + if ((prop->flag & PROP_IDPROPERTY) != 0 && (ptr->id.data != NULL) && + (GS(((ID *)ptr->id.data)->name) == ID_NT)) { + WM_main_add_notifier(NC_MATERIAL | ND_SHADING, NULL); + } + } } /* must keep in sync with 'rna_property_update' @@ -2218,20 +2260,19 @@ static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerR * but this isn't likely to be a performance problem. */ bool RNA_property_update_check(PropertyRNA *prop) { - return (prop->magic != RNA_MAGIC || prop->update || prop->noteflag); + return (prop->magic != RNA_MAGIC || prop->update || prop->noteflag); } void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop) { - rna_property_update(C, CTX_data_main(C), CTX_data_scene(C), ptr, prop); + rna_property_update(C, CTX_data_main(C), CTX_data_scene(C), ptr, prop); } void RNA_property_update_main(Main *bmain, Scene *scene, PointerRNA *ptr, PropertyRNA *prop) { - rna_property_update(NULL, bmain, scene, ptr, prop); + rna_property_update(NULL, bmain, scene, ptr, prop); } - /* RNA Updates Cache ------------------------ */ /* Overview of RNA Update cache system: * @@ -2248,10 +2289,10 @@ void RNA_property_update_main(Main *bmain, Scene *scene, PointerRNA *ptr, Proper /* cache element */ typedef struct tRnaUpdateCacheElem { - struct tRnaUpdateCacheElem *next, *prev; + struct tRnaUpdateCacheElem *next, *prev; - PointerRNA ptr; /* L1 key - id as primary, data secondary/ignored? */ - ListBase L2Funcs; /* L2 functions (LinkData<RnaUpdateFuncRef>) */ + PointerRNA ptr; /* L1 key - id as primary, data secondary/ignored? */ + ListBase L2Funcs; /* L2 functions (LinkData<RnaUpdateFuncRef>) */ } tRnaUpdateCacheElem; /* cache global (tRnaUpdateCacheElem's) - only accessible using these API calls */ @@ -2261,79 +2302,79 @@ static ListBase rna_updates_cache = {NULL, NULL}; void RNA_property_update_cache_add(PointerRNA *ptr, PropertyRNA *prop) { - const bool is_rna = (prop->magic == RNA_MAGIC); - tRnaUpdateCacheElem *uce = NULL; - UpdateFunc fn = NULL; - LinkData *ld; - - /* sanity check */ - if (NULL == ptr) - return; - - prop = rna_ensure_property(prop); - - /* we can only handle update calls with no context args for now (makes animsys updates easier) */ - if ((is_rna == false) || (prop->update == NULL) || (prop->flag & PROP_CONTEXT_UPDATE)) - return; - fn = prop->update; - - /* find cache element for which key matches... */ - for (uce = rna_updates_cache.first; uce; uce = uce->next) { - /* just match by id only for now, since most update calls that we'll encounter only really care about this */ - /* TODO: later, the cache might need to have some nesting on L1 to cope better - * with these problems + some tagging to indicate we need this */ - if (uce->ptr.id.data == ptr->id.data) - break; - } - if (uce == NULL) { - /* create new instance */ - uce = MEM_callocN(sizeof(tRnaUpdateCacheElem), "tRnaUpdateCacheElem"); - BLI_addtail(&rna_updates_cache, uce); - - /* copy pointer */ - RNA_pointer_create(ptr->id.data, ptr->type, ptr->data, &uce->ptr); - } - - /* check on the update func */ - for (ld = uce->L2Funcs.first; ld; ld = ld->next) { - /* stop on match - function already cached */ - if (fn == ld->data) - return; - } - /* else... if still here, we need to add it */ - BLI_addtail(&uce->L2Funcs, BLI_genericNodeN(fn)); + const bool is_rna = (prop->magic == RNA_MAGIC); + tRnaUpdateCacheElem *uce = NULL; + UpdateFunc fn = NULL; + LinkData *ld; + + /* sanity check */ + if (NULL == ptr) + return; + + prop = rna_ensure_property(prop); + + /* we can only handle update calls with no context args for now (makes animsys updates easier) */ + if ((is_rna == false) || (prop->update == NULL) || (prop->flag & PROP_CONTEXT_UPDATE)) + return; + fn = prop->update; + + /* find cache element for which key matches... */ + for (uce = rna_updates_cache.first; uce; uce = uce->next) { + /* just match by id only for now, since most update calls that we'll encounter only really care about this */ + /* TODO: later, the cache might need to have some nesting on L1 to cope better + * with these problems + some tagging to indicate we need this */ + if (uce->ptr.id.data == ptr->id.data) + break; + } + if (uce == NULL) { + /* create new instance */ + uce = MEM_callocN(sizeof(tRnaUpdateCacheElem), "tRnaUpdateCacheElem"); + BLI_addtail(&rna_updates_cache, uce); + + /* copy pointer */ + RNA_pointer_create(ptr->id.data, ptr->type, ptr->data, &uce->ptr); + } + + /* check on the update func */ + for (ld = uce->L2Funcs.first; ld; ld = ld->next) { + /* stop on match - function already cached */ + if (fn == ld->data) + return; + } + /* else... if still here, we need to add it */ + BLI_addtail(&uce->L2Funcs, BLI_genericNodeN(fn)); } void RNA_property_update_cache_flush(Main *bmain, Scene *scene) { - tRnaUpdateCacheElem *uce; + tRnaUpdateCacheElem *uce; - /* TODO: should we check that bmain and scene are valid? The above stuff doesn't! */ + /* TODO: should we check that bmain and scene are valid? The above stuff doesn't! */ - /* execute the cached updates */ - for (uce = rna_updates_cache.first; uce; uce = uce->next) { - LinkData *ld; + /* execute the cached updates */ + for (uce = rna_updates_cache.first; uce; uce = uce->next) { + LinkData *ld; - for (ld = uce->L2Funcs.first; ld; ld = ld->next) { - UpdateFunc fn = (UpdateFunc)ld->data; - fn(bmain, scene, &uce->ptr); - } - } + for (ld = uce->L2Funcs.first; ld; ld = ld->next) { + UpdateFunc fn = (UpdateFunc)ld->data; + fn(bmain, scene, &uce->ptr); + } + } } void RNA_property_update_cache_free(void) { - tRnaUpdateCacheElem *uce, *ucn; + tRnaUpdateCacheElem *uce, *ucn; - for (uce = rna_updates_cache.first; uce; uce = ucn) { - ucn = uce->next; + for (uce = rna_updates_cache.first; uce; uce = ucn) { + ucn = uce->next; - /* free L2 cache */ - BLI_freelistN(&uce->L2Funcs); + /* free L2 cache */ + BLI_freelistN(&uce->L2Funcs); - /* remove self */ - BLI_freelinkN(&rna_updates_cache, uce); - } + /* remove self */ + BLI_freelinkN(&rna_updates_cache, uce); + } } /* ---------------------------------------------------------------------- */ @@ -2342,1115 +2383,1131 @@ void RNA_property_update_cache_free(void) bool RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop) { - BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop; - IDProperty *idprop; - bool value; + BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop; + IDProperty *idprop; + bool value; - BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); - BLI_assert(RNA_property_array_check(prop) == false); + BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); + BLI_assert(RNA_property_array_check(prop) == false); - if ((idprop = rna_idproperty_check(&prop, ptr))) - value = IDP_Int(idprop) != 0; - else if (bprop->get) - value = bprop->get(ptr); - else if (bprop->get_ex) - value = bprop->get_ex(ptr, prop); - else - value = bprop->defaultvalue; + if ((idprop = rna_idproperty_check(&prop, ptr))) + value = IDP_Int(idprop) != 0; + else if (bprop->get) + value = bprop->get(ptr); + else if (bprop->get_ex) + value = bprop->get_ex(ptr, prop); + else + value = bprop->defaultvalue; - BLI_assert(ELEM(value, false, true)); + BLI_assert(ELEM(value, false, true)); - return value; + return value; } void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, bool value) { - BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop; - IDProperty *idprop; + BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); - BLI_assert(RNA_property_array_check(prop) == false); - BLI_assert(ELEM(value, false, true)); + BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); + BLI_assert(RNA_property_array_check(prop) == false); + BLI_assert(ELEM(value, false, true)); - /* just in case other values are passed */ - BLI_assert(ELEM(value, true, false)); + /* just in case other values are passed */ + BLI_assert(ELEM(value, true, false)); - if ((idprop = rna_idproperty_check(&prop, ptr))) { - IDP_Int(idprop) = (int)value; - rna_idproperty_touch(idprop); - } - else if (bprop->set) { - bprop->set(ptr, value); - } - else if (bprop->set_ex) { - bprop->set_ex(ptr, prop, value); - } - else if (prop->flag & PROP_EDITABLE) { - IDPropertyTemplate val = {0}; - IDProperty *group; + if ((idprop = rna_idproperty_check(&prop, ptr))) { + IDP_Int(idprop) = (int)value; + rna_idproperty_touch(idprop); + } + else if (bprop->set) { + bprop->set(ptr, value); + } + else if (bprop->set_ex) { + bprop->set_ex(ptr, prop, value); + } + else if (prop->flag & PROP_EDITABLE) { + IDPropertyTemplate val = {0}; + IDProperty *group; - val.i = value; + val.i = value; - group = RNA_struct_idprops(ptr, 1); - if (group) - IDP_AddToGroup(group, IDP_New(IDP_INT, &val, prop->identifier)); - } + group = RNA_struct_idprops(ptr, 1); + if (group) + IDP_AddToGroup(group, IDP_New(IDP_INT, &val, prop->identifier)); + } } static void rna_property_boolean_get_default_array_values(BoolPropertyRNA *bprop, bool *values) { - unsigned int length = bprop->property.totarraylength; + unsigned int length = bprop->property.totarraylength; - if (bprop->defaultarray) { - memcpy(values, bprop->defaultarray, sizeof(bool) * length); - } - else { - for (unsigned int i = 0; i < length; i++) { - values[i] = bprop->defaultvalue; - } - } + if (bprop->defaultarray) { + memcpy(values, bprop->defaultarray, sizeof(bool) * length); + } + else { + for (unsigned int i = 0; i < length; i++) { + values[i] = bprop->defaultvalue; + } + } } void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, bool *values) { - BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop; - IDProperty *idprop; - - BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); - BLI_assert(RNA_property_array_check(prop) != false); - - if ((idprop = rna_idproperty_check(&prop, ptr))) { - if (prop->arraydimension == 0) { - values[0] = RNA_property_boolean_get(ptr, prop); - } - else { - int *values_src = IDP_Array(idprop); - for (uint i = 0; i < idprop->len; i++) { - values[i] = (bool)values_src[i]; - } - } - } - else if (prop->arraydimension == 0) - values[0] = RNA_property_boolean_get(ptr, prop); - else if (bprop->getarray) - bprop->getarray(ptr, values); - else if (bprop->getarray_ex) - bprop->getarray_ex(ptr, prop, values); - else - rna_property_boolean_get_default_array_values(bprop, values); + BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop; + IDProperty *idprop; + + BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); + BLI_assert(RNA_property_array_check(prop) != false); + + if ((idprop = rna_idproperty_check(&prop, ptr))) { + if (prop->arraydimension == 0) { + values[0] = RNA_property_boolean_get(ptr, prop); + } + else { + int *values_src = IDP_Array(idprop); + for (uint i = 0; i < idprop->len; i++) { + values[i] = (bool)values_src[i]; + } + } + } + else if (prop->arraydimension == 0) + values[0] = RNA_property_boolean_get(ptr, prop); + else if (bprop->getarray) + bprop->getarray(ptr, values); + else if (bprop->getarray_ex) + bprop->getarray_ex(ptr, prop, values); + else + rna_property_boolean_get_default_array_values(bprop, values); } bool RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index) { - bool tmp[RNA_MAX_ARRAY_LENGTH]; - int len = rna_ensure_property_array_length(ptr, prop); - bool value; + bool tmp[RNA_MAX_ARRAY_LENGTH]; + int len = rna_ensure_property_array_length(ptr, prop); + bool value; - BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); - BLI_assert(RNA_property_array_check(prop) != false); - BLI_assert(index >= 0); - BLI_assert(index < len); + BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); + BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(index >= 0); + BLI_assert(index < len); - if (len <= RNA_MAX_ARRAY_LENGTH) { - RNA_property_boolean_get_array(ptr, prop, tmp); - value = tmp[index]; - } - else { - bool *tmparray; + if (len <= RNA_MAX_ARRAY_LENGTH) { + RNA_property_boolean_get_array(ptr, prop, tmp); + value = tmp[index]; + } + else { + bool *tmparray; - tmparray = MEM_mallocN(sizeof(bool) * len, __func__); - RNA_property_boolean_get_array(ptr, prop, tmparray); - value = tmparray[index]; - MEM_freeN(tmparray); - } + tmparray = MEM_mallocN(sizeof(bool) * len, __func__); + RNA_property_boolean_get_array(ptr, prop, tmparray); + value = tmparray[index]; + MEM_freeN(tmparray); + } - BLI_assert(ELEM(value, false, true)); + BLI_assert(ELEM(value, false, true)); - return value; + return value; } void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const bool *values) { - BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop; - IDProperty *idprop; - - BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); - BLI_assert(RNA_property_array_check(prop) != false); - - if ((idprop = rna_idproperty_check(&prop, ptr))) { - if (prop->arraydimension == 0) { - IDP_Int(idprop) = values[0]; - } - else { - int *values_dst = IDP_Array(idprop); - for (uint i = 0; i < idprop->len; i++) { - values_dst[i] = (int)values[i]; - } - } - rna_idproperty_touch(idprop); - } - else if (prop->arraydimension == 0) - RNA_property_boolean_set(ptr, prop, values[0]); - else if (bprop->setarray) - bprop->setarray(ptr, values); - else if (bprop->setarray_ex) - bprop->setarray_ex(ptr, prop, values); - else if (prop->flag & PROP_EDITABLE) { - IDPropertyTemplate val = {0}; - IDProperty *group; - - val.array.len = prop->totarraylength; - val.array.type = IDP_INT; - - group = RNA_struct_idprops(ptr, 1); - if (group) { - idprop = IDP_New(IDP_ARRAY, &val, prop->identifier); - IDP_AddToGroup(group, idprop); - int *values_dst = IDP_Array(idprop); - for (uint i = 0; i < idprop->len; i++) { - values_dst[i] = (int)values[i]; - } - } - } + BoolPropertyRNA *bprop = (BoolPropertyRNA *)prop; + IDProperty *idprop; + + BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); + BLI_assert(RNA_property_array_check(prop) != false); + + if ((idprop = rna_idproperty_check(&prop, ptr))) { + if (prop->arraydimension == 0) { + IDP_Int(idprop) = values[0]; + } + else { + int *values_dst = IDP_Array(idprop); + for (uint i = 0; i < idprop->len; i++) { + values_dst[i] = (int)values[i]; + } + } + rna_idproperty_touch(idprop); + } + else if (prop->arraydimension == 0) + RNA_property_boolean_set(ptr, prop, values[0]); + else if (bprop->setarray) + bprop->setarray(ptr, values); + else if (bprop->setarray_ex) + bprop->setarray_ex(ptr, prop, values); + else if (prop->flag & PROP_EDITABLE) { + IDPropertyTemplate val = {0}; + IDProperty *group; + + val.array.len = prop->totarraylength; + val.array.type = IDP_INT; + + group = RNA_struct_idprops(ptr, 1); + if (group) { + idprop = IDP_New(IDP_ARRAY, &val, prop->identifier); + IDP_AddToGroup(group, idprop); + int *values_dst = IDP_Array(idprop); + for (uint i = 0; i < idprop->len; i++) { + values_dst[i] = (int)values[i]; + } + } + } } void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, bool value) { - bool tmp[RNA_MAX_ARRAY_LENGTH]; - int len = rna_ensure_property_array_length(ptr, prop); + bool tmp[RNA_MAX_ARRAY_LENGTH]; + int len = rna_ensure_property_array_length(ptr, prop); - BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); - BLI_assert(RNA_property_array_check(prop) != false); - BLI_assert(index >= 0); - BLI_assert(index < len); - BLI_assert(ELEM(value, false, true)); + BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); + BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(index >= 0); + BLI_assert(index < len); + BLI_assert(ELEM(value, false, true)); - if (len <= RNA_MAX_ARRAY_LENGTH) { - RNA_property_boolean_get_array(ptr, prop, tmp); - tmp[index] = value; - RNA_property_boolean_set_array(ptr, prop, tmp); - } - else { - bool *tmparray; + if (len <= RNA_MAX_ARRAY_LENGTH) { + RNA_property_boolean_get_array(ptr, prop, tmp); + tmp[index] = value; + RNA_property_boolean_set_array(ptr, prop, tmp); + } + else { + bool *tmparray; - tmparray = MEM_mallocN(sizeof(bool) * len, __func__); - RNA_property_boolean_get_array(ptr, prop, tmparray); - tmparray[index] = value; - RNA_property_boolean_set_array(ptr, prop, tmparray); - MEM_freeN(tmparray); - } + tmparray = MEM_mallocN(sizeof(bool) * len, __func__); + RNA_property_boolean_get_array(ptr, prop, tmparray); + tmparray[index] = value; + RNA_property_boolean_set_array(ptr, prop, tmparray); + MEM_freeN(tmparray); + } } bool RNA_property_boolean_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop) { - BoolPropertyRNA *bprop = (BoolPropertyRNA *)rna_ensure_property(prop); + BoolPropertyRNA *bprop = (BoolPropertyRNA *)rna_ensure_property(prop); - BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); - BLI_assert(RNA_property_array_check(prop) == false); - BLI_assert(ELEM(bprop->defaultvalue, false, true)); + BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); + BLI_assert(RNA_property_array_check(prop) == false); + BLI_assert(ELEM(bprop->defaultvalue, false, true)); - return bprop->defaultvalue; + return bprop->defaultvalue; } -void RNA_property_boolean_get_default_array(PointerRNA *UNUSED(ptr), PropertyRNA *prop, bool *values) +void RNA_property_boolean_get_default_array(PointerRNA *UNUSED(ptr), + PropertyRNA *prop, + bool *values) { - BoolPropertyRNA *bprop = (BoolPropertyRNA *)rna_ensure_property(prop); + BoolPropertyRNA *bprop = (BoolPropertyRNA *)rna_ensure_property(prop); - BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); - BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); + BLI_assert(RNA_property_array_check(prop) != false); - if (prop->arraydimension == 0) - values[0] = bprop->defaultvalue; - else - rna_property_boolean_get_default_array_values(bprop, values); + if (prop->arraydimension == 0) + values[0] = bprop->defaultvalue; + else + rna_property_boolean_get_default_array_values(bprop, values); } bool RNA_property_boolean_get_default_index(PointerRNA *ptr, PropertyRNA *prop, int index) { - bool tmp[RNA_MAX_ARRAY_LENGTH]; - int len = rna_ensure_property_array_length(ptr, prop); + bool tmp[RNA_MAX_ARRAY_LENGTH]; + int len = rna_ensure_property_array_length(ptr, prop); - BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); - BLI_assert(RNA_property_array_check(prop) != false); - BLI_assert(index >= 0); - BLI_assert(index < prop->totarraylength); + BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN); + BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(index >= 0); + BLI_assert(index < prop->totarraylength); - if (len <= RNA_MAX_ARRAY_LENGTH) { - RNA_property_boolean_get_default_array(ptr, prop, tmp); - return tmp[index]; - } - else { - bool *tmparray, value; + if (len <= RNA_MAX_ARRAY_LENGTH) { + RNA_property_boolean_get_default_array(ptr, prop, tmp); + return tmp[index]; + } + else { + bool *tmparray, value; - tmparray = MEM_mallocN(sizeof(bool) * len, __func__); - RNA_property_boolean_get_default_array(ptr, prop, tmparray); - value = tmparray[index]; - MEM_freeN(tmparray); + tmparray = MEM_mallocN(sizeof(bool) * len, __func__); + RNA_property_boolean_get_default_array(ptr, prop, tmparray); + value = tmparray[index]; + MEM_freeN(tmparray); - return value; - } + return value; + } } int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop) { - IntPropertyRNA *iprop = (IntPropertyRNA *)prop; - IDProperty *idprop; + IntPropertyRNA *iprop = (IntPropertyRNA *)prop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_INT); - BLI_assert(RNA_property_array_check(prop) == false); + BLI_assert(RNA_property_type(prop) == PROP_INT); + BLI_assert(RNA_property_array_check(prop) == false); - if ((idprop = rna_idproperty_check(&prop, ptr))) - return IDP_Int(idprop); - else if (iprop->get) - return iprop->get(ptr); - else if (iprop->get_ex) - return iprop->get_ex(ptr, prop); - else - return iprop->defaultvalue; + if ((idprop = rna_idproperty_check(&prop, ptr))) + return IDP_Int(idprop); + else if (iprop->get) + return iprop->get(ptr); + else if (iprop->get_ex) + return iprop->get_ex(ptr, prop); + else + return iprop->defaultvalue; } void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value) { - IntPropertyRNA *iprop = (IntPropertyRNA *)prop; - IDProperty *idprop; + IntPropertyRNA *iprop = (IntPropertyRNA *)prop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_INT); - BLI_assert(RNA_property_array_check(prop) == false); - /* useful to check on bad values but set function should clamp */ - /* BLI_assert(RNA_property_int_clamp(ptr, prop, &value) == 0); */ + BLI_assert(RNA_property_type(prop) == PROP_INT); + BLI_assert(RNA_property_array_check(prop) == false); + /* useful to check on bad values but set function should clamp */ + /* BLI_assert(RNA_property_int_clamp(ptr, prop, &value) == 0); */ - if ((idprop = rna_idproperty_check(&prop, ptr))) { - RNA_property_int_clamp(ptr, prop, &value); - IDP_Int(idprop) = value; - rna_idproperty_touch(idprop); - } - else if (iprop->set) - iprop->set(ptr, value); - else if (iprop->set_ex) - iprop->set_ex(ptr, prop, value); - else if (prop->flag & PROP_EDITABLE) { - IDPropertyTemplate val = {0}; - IDProperty *group; + if ((idprop = rna_idproperty_check(&prop, ptr))) { + RNA_property_int_clamp(ptr, prop, &value); + IDP_Int(idprop) = value; + rna_idproperty_touch(idprop); + } + else if (iprop->set) + iprop->set(ptr, value); + else if (iprop->set_ex) + iprop->set_ex(ptr, prop, value); + else if (prop->flag & PROP_EDITABLE) { + IDPropertyTemplate val = {0}; + IDProperty *group; - RNA_property_int_clamp(ptr, prop, &value); + RNA_property_int_clamp(ptr, prop, &value); - val.i = value; + val.i = value; - group = RNA_struct_idprops(ptr, 1); - if (group) - IDP_AddToGroup(group, IDP_New(IDP_INT, &val, prop->identifier)); - } + group = RNA_struct_idprops(ptr, 1); + if (group) + IDP_AddToGroup(group, IDP_New(IDP_INT, &val, prop->identifier)); + } } static void rna_property_int_get_default_array_values(IntPropertyRNA *iprop, int *values) { - unsigned int length = iprop->property.totarraylength; + unsigned int length = iprop->property.totarraylength; - if (iprop->defaultarray) { - memcpy(values, iprop->defaultarray, sizeof(int) * length); - } - else { - for (unsigned int i = 0; i < length; i++) { - values[i] = iprop->defaultvalue; - } - } + if (iprop->defaultarray) { + memcpy(values, iprop->defaultarray, sizeof(int) * length); + } + else { + for (unsigned int i = 0; i < length; i++) { + values[i] = iprop->defaultvalue; + } + } } void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values) { - IntPropertyRNA *iprop = (IntPropertyRNA *)prop; - IDProperty *idprop; - - BLI_assert(RNA_property_type(prop) == PROP_INT); - BLI_assert(RNA_property_array_check(prop) != false); - - if ((idprop = rna_idproperty_check(&prop, ptr))) { - BLI_assert(idprop->len == RNA_property_array_length(ptr, prop) || (prop->flag & PROP_IDPROPERTY)); - if (prop->arraydimension == 0) - values[0] = RNA_property_int_get(ptr, prop); - else - memcpy(values, IDP_Array(idprop), sizeof(int) * idprop->len); - } - else if (prop->arraydimension == 0) - values[0] = RNA_property_int_get(ptr, prop); - else if (iprop->getarray) - iprop->getarray(ptr, values); - else if (iprop->getarray_ex) - iprop->getarray_ex(ptr, prop, values); - else - rna_property_int_get_default_array_values(iprop, values); + IntPropertyRNA *iprop = (IntPropertyRNA *)prop; + IDProperty *idprop; + + BLI_assert(RNA_property_type(prop) == PROP_INT); + BLI_assert(RNA_property_array_check(prop) != false); + + if ((idprop = rna_idproperty_check(&prop, ptr))) { + BLI_assert(idprop->len == RNA_property_array_length(ptr, prop) || + (prop->flag & PROP_IDPROPERTY)); + if (prop->arraydimension == 0) + values[0] = RNA_property_int_get(ptr, prop); + else + memcpy(values, IDP_Array(idprop), sizeof(int) * idprop->len); + } + else if (prop->arraydimension == 0) + values[0] = RNA_property_int_get(ptr, prop); + else if (iprop->getarray) + iprop->getarray(ptr, values); + else if (iprop->getarray_ex) + iprop->getarray_ex(ptr, prop, values); + else + rna_property_int_get_default_array_values(iprop, values); } void RNA_property_int_get_array_range(PointerRNA *ptr, PropertyRNA *prop, int values[2]) { - const int array_len = RNA_property_array_length(ptr, prop); - - if (array_len <= 0) { - values[0] = 0; - values[1] = 0; - } - else if (array_len == 1) { - RNA_property_int_get_array(ptr, prop, values); - values[1] = values[0]; - } - else { - int arr_stack[32]; - int *arr; - int i; - - if (array_len > 32) { - arr = MEM_mallocN(sizeof(int) * array_len, __func__); - } - else { - arr = arr_stack; - } - - RNA_property_int_get_array(ptr, prop, arr); - values[0] = values[1] = arr[0]; - for (i = 1; i < array_len; i++) { - values[0] = MIN2(values[0], arr[i]); - values[1] = MAX2(values[1], arr[i]); - } - - if (arr != arr_stack) { - MEM_freeN(arr); - } - } + const int array_len = RNA_property_array_length(ptr, prop); + + if (array_len <= 0) { + values[0] = 0; + values[1] = 0; + } + else if (array_len == 1) { + RNA_property_int_get_array(ptr, prop, values); + values[1] = values[0]; + } + else { + int arr_stack[32]; + int *arr; + int i; + + if (array_len > 32) { + arr = MEM_mallocN(sizeof(int) * array_len, __func__); + } + else { + arr = arr_stack; + } + + RNA_property_int_get_array(ptr, prop, arr); + values[0] = values[1] = arr[0]; + for (i = 1; i < array_len; i++) { + values[0] = MIN2(values[0], arr[i]); + values[1] = MAX2(values[1], arr[i]); + } + + if (arr != arr_stack) { + MEM_freeN(arr); + } + } } int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index) { - int tmp[RNA_MAX_ARRAY_LENGTH]; - int len = rna_ensure_property_array_length(ptr, prop); + int tmp[RNA_MAX_ARRAY_LENGTH]; + int len = rna_ensure_property_array_length(ptr, prop); - BLI_assert(RNA_property_type(prop) == PROP_INT); - BLI_assert(RNA_property_array_check(prop) != false); - BLI_assert(index >= 0); - BLI_assert(index < len); + BLI_assert(RNA_property_type(prop) == PROP_INT); + BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(index >= 0); + BLI_assert(index < len); - if (len <= RNA_MAX_ARRAY_LENGTH) { - RNA_property_int_get_array(ptr, prop, tmp); - return tmp[index]; - } - else { - int *tmparray, value; + if (len <= RNA_MAX_ARRAY_LENGTH) { + RNA_property_int_get_array(ptr, prop, tmp); + return tmp[index]; + } + else { + int *tmparray, value; - tmparray = MEM_mallocN(sizeof(int) * len, __func__); - RNA_property_int_get_array(ptr, prop, tmparray); - value = tmparray[index]; - MEM_freeN(tmparray); + tmparray = MEM_mallocN(sizeof(int) * len, __func__); + RNA_property_int_get_array(ptr, prop, tmparray); + value = tmparray[index]; + MEM_freeN(tmparray); - return value; - } + return value; + } } void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values) { - IntPropertyRNA *iprop = (IntPropertyRNA *)prop; - IDProperty *idprop; - - BLI_assert(RNA_property_type(prop) == PROP_INT); - BLI_assert(RNA_property_array_check(prop) != false); - - if ((idprop = rna_idproperty_check(&prop, ptr))) { - BLI_assert(idprop->len == RNA_property_array_length(ptr, prop) || (prop->flag & PROP_IDPROPERTY)); - if (prop->arraydimension == 0) - IDP_Int(idprop) = values[0]; - else - memcpy(IDP_Array(idprop), values, sizeof(int) * idprop->len); - - rna_idproperty_touch(idprop); - } - else if (prop->arraydimension == 0) - RNA_property_int_set(ptr, prop, values[0]); - else if (iprop->setarray) - iprop->setarray(ptr, values); - else if (iprop->setarray_ex) - iprop->setarray_ex(ptr, prop, values); - else if (prop->flag & PROP_EDITABLE) { - IDPropertyTemplate val = {0}; - IDProperty *group; - - /* TODO: RNA_property_int_clamp_array(ptr, prop, &value); */ - - val.array.len = prop->totarraylength; - val.array.type = IDP_INT; - - group = RNA_struct_idprops(ptr, 1); - if (group) { - idprop = IDP_New(IDP_ARRAY, &val, prop->identifier); - IDP_AddToGroup(group, idprop); - memcpy(IDP_Array(idprop), values, sizeof(int) * idprop->len); - } - } + IntPropertyRNA *iprop = (IntPropertyRNA *)prop; + IDProperty *idprop; + + BLI_assert(RNA_property_type(prop) == PROP_INT); + BLI_assert(RNA_property_array_check(prop) != false); + + if ((idprop = rna_idproperty_check(&prop, ptr))) { + BLI_assert(idprop->len == RNA_property_array_length(ptr, prop) || + (prop->flag & PROP_IDPROPERTY)); + if (prop->arraydimension == 0) + IDP_Int(idprop) = values[0]; + else + memcpy(IDP_Array(idprop), values, sizeof(int) * idprop->len); + + rna_idproperty_touch(idprop); + } + else if (prop->arraydimension == 0) + RNA_property_int_set(ptr, prop, values[0]); + else if (iprop->setarray) + iprop->setarray(ptr, values); + else if (iprop->setarray_ex) + iprop->setarray_ex(ptr, prop, values); + else if (prop->flag & PROP_EDITABLE) { + IDPropertyTemplate val = {0}; + IDProperty *group; + + /* TODO: RNA_property_int_clamp_array(ptr, prop, &value); */ + + val.array.len = prop->totarraylength; + val.array.type = IDP_INT; + + group = RNA_struct_idprops(ptr, 1); + if (group) { + idprop = IDP_New(IDP_ARRAY, &val, prop->identifier); + IDP_AddToGroup(group, idprop); + memcpy(IDP_Array(idprop), values, sizeof(int) * idprop->len); + } + } } void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value) { - int tmp[RNA_MAX_ARRAY_LENGTH]; - int len = rna_ensure_property_array_length(ptr, prop); + int tmp[RNA_MAX_ARRAY_LENGTH]; + int len = rna_ensure_property_array_length(ptr, prop); - BLI_assert(RNA_property_type(prop) == PROP_INT); - BLI_assert(RNA_property_array_check(prop) != false); - BLI_assert(index >= 0); - BLI_assert(index < len); + BLI_assert(RNA_property_type(prop) == PROP_INT); + BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(index >= 0); + BLI_assert(index < len); - if (len <= RNA_MAX_ARRAY_LENGTH) { - RNA_property_int_get_array(ptr, prop, tmp); - tmp[index] = value; - RNA_property_int_set_array(ptr, prop, tmp); - } - else { - int *tmparray; + if (len <= RNA_MAX_ARRAY_LENGTH) { + RNA_property_int_get_array(ptr, prop, tmp); + tmp[index] = value; + RNA_property_int_set_array(ptr, prop, tmp); + } + else { + int *tmparray; - tmparray = MEM_mallocN(sizeof(int) * len, __func__); - RNA_property_int_get_array(ptr, prop, tmparray); - tmparray[index] = value; - RNA_property_int_set_array(ptr, prop, tmparray); - MEM_freeN(tmparray); - } + tmparray = MEM_mallocN(sizeof(int) * len, __func__); + RNA_property_int_get_array(ptr, prop, tmparray); + tmparray[index] = value; + RNA_property_int_set_array(ptr, prop, tmparray); + MEM_freeN(tmparray); + } } int RNA_property_int_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop) { - IntPropertyRNA *iprop = (IntPropertyRNA *)rna_ensure_property(prop); + IntPropertyRNA *iprop = (IntPropertyRNA *)rna_ensure_property(prop); - if (prop->magic != RNA_MAGIC) { - /* attempt to get the local ID values */ - IDProperty *idp_ui = rna_idproperty_ui(prop); + if (prop->magic != RNA_MAGIC) { + /* attempt to get the local ID values */ + IDProperty *idp_ui = rna_idproperty_ui(prop); - if (idp_ui) { - IDProperty *item; + if (idp_ui) { + IDProperty *item; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "default", IDP_INT); - return item ? IDP_Int(item) : iprop->defaultvalue; - } - } + item = IDP_GetPropertyTypeFromGroup(idp_ui, "default", IDP_INT); + return item ? IDP_Int(item) : iprop->defaultvalue; + } + } - return iprop->defaultvalue; + return iprop->defaultvalue; } bool RNA_property_int_set_default(PointerRNA *ptr, PropertyRNA *prop, int value) { - if (value != 0) { - IDPropertyTemplate val = { .i = value, }; - return rna_idproperty_ui_set_default(ptr, prop, IDP_INT, &val); - } - else { - return rna_idproperty_ui_set_default(ptr, prop, IDP_INT, NULL); - } + if (value != 0) { + IDPropertyTemplate val = { + .i = value, + }; + return rna_idproperty_ui_set_default(ptr, prop, IDP_INT, &val); + } + else { + return rna_idproperty_ui_set_default(ptr, prop, IDP_INT, NULL); + } } void RNA_property_int_get_default_array(PointerRNA *UNUSED(ptr), PropertyRNA *prop, int *values) { - IntPropertyRNA *iprop = (IntPropertyRNA *)rna_ensure_property(prop); + IntPropertyRNA *iprop = (IntPropertyRNA *)rna_ensure_property(prop); - BLI_assert(RNA_property_type(prop) == PROP_INT); - BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(RNA_property_type(prop) == PROP_INT); + BLI_assert(RNA_property_array_check(prop) != false); - if (prop->arraydimension == 0) - values[0] = iprop->defaultvalue; - else - rna_property_int_get_default_array_values(iprop, values); + if (prop->arraydimension == 0) + values[0] = iprop->defaultvalue; + else + rna_property_int_get_default_array_values(iprop, values); } int RNA_property_int_get_default_index(PointerRNA *ptr, PropertyRNA *prop, int index) { - int tmp[RNA_MAX_ARRAY_LENGTH]; - int len = rna_ensure_property_array_length(ptr, prop); + int tmp[RNA_MAX_ARRAY_LENGTH]; + int len = rna_ensure_property_array_length(ptr, prop); - BLI_assert(RNA_property_type(prop) == PROP_INT); - BLI_assert(RNA_property_array_check(prop) != false); - BLI_assert(index >= 0); - BLI_assert(index < prop->totarraylength); + BLI_assert(RNA_property_type(prop) == PROP_INT); + BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(index >= 0); + BLI_assert(index < prop->totarraylength); - if (len <= RNA_MAX_ARRAY_LENGTH) { - RNA_property_int_get_default_array(ptr, prop, tmp); - return tmp[index]; - } - else { - int *tmparray, value; + if (len <= RNA_MAX_ARRAY_LENGTH) { + RNA_property_int_get_default_array(ptr, prop, tmp); + return tmp[index]; + } + else { + int *tmparray, value; - tmparray = MEM_mallocN(sizeof(int) * len, __func__); - RNA_property_int_get_default_array(ptr, prop, tmparray); - value = tmparray[index]; - MEM_freeN(tmparray); + tmparray = MEM_mallocN(sizeof(int) * len, __func__); + RNA_property_int_get_default_array(ptr, prop, tmparray); + value = tmparray[index]; + MEM_freeN(tmparray); - return value; - } + return value; + } } float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop) { - FloatPropertyRNA *fprop = (FloatPropertyRNA *)prop; - IDProperty *idprop; + FloatPropertyRNA *fprop = (FloatPropertyRNA *)prop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_FLOAT); - BLI_assert(RNA_property_array_check(prop) == false); + BLI_assert(RNA_property_type(prop) == PROP_FLOAT); + BLI_assert(RNA_property_array_check(prop) == false); - if ((idprop = rna_idproperty_check(&prop, ptr))) { - if (idprop->type == IDP_FLOAT) - return IDP_Float(idprop); - else - return (float)IDP_Double(idprop); - } - else if (fprop->get) - return fprop->get(ptr); - else if (fprop->get_ex) - return fprop->get_ex(ptr, prop); - else - return fprop->defaultvalue; + if ((idprop = rna_idproperty_check(&prop, ptr))) { + if (idprop->type == IDP_FLOAT) + return IDP_Float(idprop); + else + return (float)IDP_Double(idprop); + } + else if (fprop->get) + return fprop->get(ptr); + else if (fprop->get_ex) + return fprop->get_ex(ptr, prop); + else + return fprop->defaultvalue; } void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value) { - FloatPropertyRNA *fprop = (FloatPropertyRNA *)prop; - IDProperty *idprop; + FloatPropertyRNA *fprop = (FloatPropertyRNA *)prop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_FLOAT); - BLI_assert(RNA_property_array_check(prop) == false); - /* useful to check on bad values but set function should clamp */ - /* BLI_assert(RNA_property_float_clamp(ptr, prop, &value) == 0); */ + BLI_assert(RNA_property_type(prop) == PROP_FLOAT); + BLI_assert(RNA_property_array_check(prop) == false); + /* useful to check on bad values but set function should clamp */ + /* BLI_assert(RNA_property_float_clamp(ptr, prop, &value) == 0); */ - if ((idprop = rna_idproperty_check(&prop, ptr))) { - RNA_property_float_clamp(ptr, prop, &value); - if (idprop->type == IDP_FLOAT) - IDP_Float(idprop) = value; - else - IDP_Double(idprop) = value; + if ((idprop = rna_idproperty_check(&prop, ptr))) { + RNA_property_float_clamp(ptr, prop, &value); + if (idprop->type == IDP_FLOAT) + IDP_Float(idprop) = value; + else + IDP_Double(idprop) = value; - rna_idproperty_touch(idprop); - } - else if (fprop->set) { - fprop->set(ptr, value); - } - else if (fprop->set_ex) { - fprop->set_ex(ptr, prop, value); - } - else if (prop->flag & PROP_EDITABLE) { - IDPropertyTemplate val = {0}; - IDProperty *group; + rna_idproperty_touch(idprop); + } + else if (fprop->set) { + fprop->set(ptr, value); + } + else if (fprop->set_ex) { + fprop->set_ex(ptr, prop, value); + } + else if (prop->flag & PROP_EDITABLE) { + IDPropertyTemplate val = {0}; + IDProperty *group; - RNA_property_float_clamp(ptr, prop, &value); + RNA_property_float_clamp(ptr, prop, &value); - val.f = value; + val.f = value; - group = RNA_struct_idprops(ptr, 1); - if (group) - IDP_AddToGroup(group, IDP_New(IDP_FLOAT, &val, prop->identifier)); - } + group = RNA_struct_idprops(ptr, 1); + if (group) + IDP_AddToGroup(group, IDP_New(IDP_FLOAT, &val, prop->identifier)); + } } static void rna_property_float_get_default_array_values(FloatPropertyRNA *fprop, float *values) { - unsigned int length = fprop->property.totarraylength; + unsigned int length = fprop->property.totarraylength; - if (fprop->defaultarray) { - memcpy(values, fprop->defaultarray, sizeof(float) * length); - } - else { - for (unsigned int i = 0; i < length; i++) { - values[i] = fprop->defaultvalue; - } - } + if (fprop->defaultarray) { + memcpy(values, fprop->defaultarray, sizeof(float) * length); + } + else { + for (unsigned int i = 0; i < length; i++) { + values[i] = fprop->defaultvalue; + } + } } void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values) { - FloatPropertyRNA *fprop = (FloatPropertyRNA *)prop; - IDProperty *idprop; - int i; - - BLI_assert(RNA_property_type(prop) == PROP_FLOAT); - BLI_assert(RNA_property_array_check(prop) != false); - - if ((idprop = rna_idproperty_check(&prop, ptr))) { - BLI_assert(idprop->len == RNA_property_array_length(ptr, prop) || (prop->flag & PROP_IDPROPERTY)); - if (prop->arraydimension == 0) - values[0] = RNA_property_float_get(ptr, prop); - else if (idprop->subtype == IDP_FLOAT) { - memcpy(values, IDP_Array(idprop), sizeof(float) * idprop->len); - } - else { - for (i = 0; i < idprop->len; i++) - values[i] = (float)(((double *)IDP_Array(idprop))[i]); - } - } - else if (prop->arraydimension == 0) - values[0] = RNA_property_float_get(ptr, prop); - else if (fprop->getarray) - fprop->getarray(ptr, values); - else if (fprop->getarray_ex) - fprop->getarray_ex(ptr, prop, values); - else - rna_property_float_get_default_array_values(fprop, values); + FloatPropertyRNA *fprop = (FloatPropertyRNA *)prop; + IDProperty *idprop; + int i; + + BLI_assert(RNA_property_type(prop) == PROP_FLOAT); + BLI_assert(RNA_property_array_check(prop) != false); + + if ((idprop = rna_idproperty_check(&prop, ptr))) { + BLI_assert(idprop->len == RNA_property_array_length(ptr, prop) || + (prop->flag & PROP_IDPROPERTY)); + if (prop->arraydimension == 0) + values[0] = RNA_property_float_get(ptr, prop); + else if (idprop->subtype == IDP_FLOAT) { + memcpy(values, IDP_Array(idprop), sizeof(float) * idprop->len); + } + else { + for (i = 0; i < idprop->len; i++) + values[i] = (float)(((double *)IDP_Array(idprop))[i]); + } + } + else if (prop->arraydimension == 0) + values[0] = RNA_property_float_get(ptr, prop); + else if (fprop->getarray) + fprop->getarray(ptr, values); + else if (fprop->getarray_ex) + fprop->getarray_ex(ptr, prop, values); + else + rna_property_float_get_default_array_values(fprop, values); } void RNA_property_float_get_array_range(PointerRNA *ptr, PropertyRNA *prop, float values[2]) { - const int array_len = RNA_property_array_length(ptr, prop); - - if (array_len <= 0) { - values[0] = 0.0f; - values[1] = 0.0f; - } - else if (array_len == 1) { - RNA_property_float_get_array(ptr, prop, values); - values[1] = values[0]; - } - else { - float arr_stack[32]; - float *arr; - int i; - - if (array_len > 32) { - arr = MEM_mallocN(sizeof(float) * array_len, __func__); - } - else { - arr = arr_stack; - } - - RNA_property_float_get_array(ptr, prop, arr); - values[0] = values[1] = arr[0]; - for (i = 1; i < array_len; i++) { - values[0] = MIN2(values[0], arr[i]); - values[1] = MAX2(values[1], arr[i]); - } - - if (arr != arr_stack) { - MEM_freeN(arr); - } - } + const int array_len = RNA_property_array_length(ptr, prop); + + if (array_len <= 0) { + values[0] = 0.0f; + values[1] = 0.0f; + } + else if (array_len == 1) { + RNA_property_float_get_array(ptr, prop, values); + values[1] = values[0]; + } + else { + float arr_stack[32]; + float *arr; + int i; + + if (array_len > 32) { + arr = MEM_mallocN(sizeof(float) * array_len, __func__); + } + else { + arr = arr_stack; + } + + RNA_property_float_get_array(ptr, prop, arr); + values[0] = values[1] = arr[0]; + for (i = 1; i < array_len; i++) { + values[0] = MIN2(values[0], arr[i]); + values[1] = MAX2(values[1], arr[i]); + } + + if (arr != arr_stack) { + MEM_freeN(arr); + } + } } float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index) { - float tmp[RNA_MAX_ARRAY_LENGTH]; - int len = rna_ensure_property_array_length(ptr, prop); + float tmp[RNA_MAX_ARRAY_LENGTH]; + int len = rna_ensure_property_array_length(ptr, prop); - BLI_assert(RNA_property_type(prop) == PROP_FLOAT); - BLI_assert(RNA_property_array_check(prop) != false); - BLI_assert(index >= 0); - BLI_assert(index < len); + BLI_assert(RNA_property_type(prop) == PROP_FLOAT); + BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(index >= 0); + BLI_assert(index < len); - if (len <= RNA_MAX_ARRAY_LENGTH) { - RNA_property_float_get_array(ptr, prop, tmp); - return tmp[index]; - } - else { - float *tmparray, value; + if (len <= RNA_MAX_ARRAY_LENGTH) { + RNA_property_float_get_array(ptr, prop, tmp); + return tmp[index]; + } + else { + float *tmparray, value; - tmparray = MEM_mallocN(sizeof(float) * len, __func__); - RNA_property_float_get_array(ptr, prop, tmparray); - value = tmparray[index]; - MEM_freeN(tmparray); + tmparray = MEM_mallocN(sizeof(float) * len, __func__); + RNA_property_float_get_array(ptr, prop, tmparray); + value = tmparray[index]; + MEM_freeN(tmparray); - return value; - } + return value; + } } void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values) { - FloatPropertyRNA *fprop = (FloatPropertyRNA *)prop; - IDProperty *idprop; - int i; - - BLI_assert(RNA_property_type(prop) == PROP_FLOAT); - BLI_assert(RNA_property_array_check(prop) != false); - - if ((idprop = rna_idproperty_check(&prop, ptr))) { - BLI_assert(idprop->len == RNA_property_array_length(ptr, prop) || (prop->flag & PROP_IDPROPERTY)); - if (prop->arraydimension == 0) { - if (idprop->type == IDP_FLOAT) - IDP_Float(idprop) = values[0]; - else - IDP_Double(idprop) = values[0]; - } - else if (idprop->subtype == IDP_FLOAT) { - memcpy(IDP_Array(idprop), values, sizeof(float) * idprop->len); - } - else { - for (i = 0; i < idprop->len; i++) - ((double *)IDP_Array(idprop))[i] = values[i]; - } - - rna_idproperty_touch(idprop); - } - else if (prop->arraydimension == 0) - RNA_property_float_set(ptr, prop, values[0]); - else if (fprop->setarray) { - fprop->setarray(ptr, values); - } - else if (fprop->setarray_ex) { - fprop->setarray_ex(ptr, prop, values); - } - else if (prop->flag & PROP_EDITABLE) { - IDPropertyTemplate val = {0}; - IDProperty *group; - - /* TODO: RNA_property_float_clamp_array(ptr, prop, &value); */ - - val.array.len = prop->totarraylength; - val.array.type = IDP_FLOAT; - - group = RNA_struct_idprops(ptr, 1); - if (group) { - idprop = IDP_New(IDP_ARRAY, &val, prop->identifier); - IDP_AddToGroup(group, idprop); - memcpy(IDP_Array(idprop), values, sizeof(float) * idprop->len); - } - } + FloatPropertyRNA *fprop = (FloatPropertyRNA *)prop; + IDProperty *idprop; + int i; + + BLI_assert(RNA_property_type(prop) == PROP_FLOAT); + BLI_assert(RNA_property_array_check(prop) != false); + + if ((idprop = rna_idproperty_check(&prop, ptr))) { + BLI_assert(idprop->len == RNA_property_array_length(ptr, prop) || + (prop->flag & PROP_IDPROPERTY)); + if (prop->arraydimension == 0) { + if (idprop->type == IDP_FLOAT) + IDP_Float(idprop) = values[0]; + else + IDP_Double(idprop) = values[0]; + } + else if (idprop->subtype == IDP_FLOAT) { + memcpy(IDP_Array(idprop), values, sizeof(float) * idprop->len); + } + else { + for (i = 0; i < idprop->len; i++) + ((double *)IDP_Array(idprop))[i] = values[i]; + } + + rna_idproperty_touch(idprop); + } + else if (prop->arraydimension == 0) + RNA_property_float_set(ptr, prop, values[0]); + else if (fprop->setarray) { + fprop->setarray(ptr, values); + } + else if (fprop->setarray_ex) { + fprop->setarray_ex(ptr, prop, values); + } + else if (prop->flag & PROP_EDITABLE) { + IDPropertyTemplate val = {0}; + IDProperty *group; + + /* TODO: RNA_property_float_clamp_array(ptr, prop, &value); */ + + val.array.len = prop->totarraylength; + val.array.type = IDP_FLOAT; + + group = RNA_struct_idprops(ptr, 1); + if (group) { + idprop = IDP_New(IDP_ARRAY, &val, prop->identifier); + IDP_AddToGroup(group, idprop); + memcpy(IDP_Array(idprop), values, sizeof(float) * idprop->len); + } + } } void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value) { - float tmp[RNA_MAX_ARRAY_LENGTH]; - int len = rna_ensure_property_array_length(ptr, prop); + float tmp[RNA_MAX_ARRAY_LENGTH]; + int len = rna_ensure_property_array_length(ptr, prop); - BLI_assert(RNA_property_type(prop) == PROP_FLOAT); - BLI_assert(RNA_property_array_check(prop) != false); - BLI_assert(index >= 0); - BLI_assert(index < len); + BLI_assert(RNA_property_type(prop) == PROP_FLOAT); + BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(index >= 0); + BLI_assert(index < len); - if (len <= RNA_MAX_ARRAY_LENGTH) { - RNA_property_float_get_array(ptr, prop, tmp); - tmp[index] = value; - RNA_property_float_set_array(ptr, prop, tmp); - } - else { - float *tmparray; + if (len <= RNA_MAX_ARRAY_LENGTH) { + RNA_property_float_get_array(ptr, prop, tmp); + tmp[index] = value; + RNA_property_float_set_array(ptr, prop, tmp); + } + else { + float *tmparray; - tmparray = MEM_mallocN(sizeof(float) * len, __func__); - RNA_property_float_get_array(ptr, prop, tmparray); - tmparray[index] = value; - RNA_property_float_set_array(ptr, prop, tmparray); - MEM_freeN(tmparray); - } + tmparray = MEM_mallocN(sizeof(float) * len, __func__); + RNA_property_float_get_array(ptr, prop, tmparray); + tmparray[index] = value; + RNA_property_float_set_array(ptr, prop, tmparray); + MEM_freeN(tmparray); + } } float RNA_property_float_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop) { - FloatPropertyRNA *fprop = (FloatPropertyRNA *)rna_ensure_property(prop); + FloatPropertyRNA *fprop = (FloatPropertyRNA *)rna_ensure_property(prop); - BLI_assert(RNA_property_type(prop) == PROP_FLOAT); - BLI_assert(RNA_property_array_check(prop) == false); + BLI_assert(RNA_property_type(prop) == PROP_FLOAT); + BLI_assert(RNA_property_array_check(prop) == false); - if (prop->magic != RNA_MAGIC) { - /* attempt to get the local ID values */ - IDProperty *idp_ui = rna_idproperty_ui(prop); + if (prop->magic != RNA_MAGIC) { + /* attempt to get the local ID values */ + IDProperty *idp_ui = rna_idproperty_ui(prop); - if (idp_ui) { - IDProperty *item; + if (idp_ui) { + IDProperty *item; - item = IDP_GetPropertyTypeFromGroup(idp_ui, "default", IDP_DOUBLE); - return item ? IDP_Double(item) : fprop->defaultvalue; - } - } + item = IDP_GetPropertyTypeFromGroup(idp_ui, "default", IDP_DOUBLE); + return item ? IDP_Double(item) : fprop->defaultvalue; + } + } - return fprop->defaultvalue; + return fprop->defaultvalue; } bool RNA_property_float_set_default(PointerRNA *ptr, PropertyRNA *prop, float value) { - if (value != 0) { - IDPropertyTemplate val = { .d = value, }; - return rna_idproperty_ui_set_default(ptr, prop, IDP_DOUBLE, &val); - } - else { - return rna_idproperty_ui_set_default(ptr, prop, IDP_DOUBLE, NULL); - } + if (value != 0) { + IDPropertyTemplate val = { + .d = value, + }; + return rna_idproperty_ui_set_default(ptr, prop, IDP_DOUBLE, &val); + } + else { + return rna_idproperty_ui_set_default(ptr, prop, IDP_DOUBLE, NULL); + } } -void RNA_property_float_get_default_array(PointerRNA *UNUSED(ptr), PropertyRNA *prop, float *values) +void RNA_property_float_get_default_array(PointerRNA *UNUSED(ptr), + PropertyRNA *prop, + float *values) { - FloatPropertyRNA *fprop = (FloatPropertyRNA *)rna_ensure_property(prop); + FloatPropertyRNA *fprop = (FloatPropertyRNA *)rna_ensure_property(prop); - BLI_assert(RNA_property_type(prop) == PROP_FLOAT); - BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(RNA_property_type(prop) == PROP_FLOAT); + BLI_assert(RNA_property_array_check(prop) != false); - if (prop->arraydimension == 0) - values[0] = fprop->defaultvalue; - else - rna_property_float_get_default_array_values(fprop, values); + if (prop->arraydimension == 0) + values[0] = fprop->defaultvalue; + else + rna_property_float_get_default_array_values(fprop, values); } float RNA_property_float_get_default_index(PointerRNA *ptr, PropertyRNA *prop, int index) { - float tmp[RNA_MAX_ARRAY_LENGTH]; - int len = rna_ensure_property_array_length(ptr, prop); + float tmp[RNA_MAX_ARRAY_LENGTH]; + int len = rna_ensure_property_array_length(ptr, prop); - BLI_assert(RNA_property_type(prop) == PROP_FLOAT); - BLI_assert(RNA_property_array_check(prop) != false); - BLI_assert(index >= 0); - BLI_assert(index < prop->totarraylength); + BLI_assert(RNA_property_type(prop) == PROP_FLOAT); + BLI_assert(RNA_property_array_check(prop) != false); + BLI_assert(index >= 0); + BLI_assert(index < prop->totarraylength); - if (len <= RNA_MAX_ARRAY_LENGTH) { - RNA_property_float_get_default_array(ptr, prop, tmp); - return tmp[index]; - } - else { - float *tmparray, value; + if (len <= RNA_MAX_ARRAY_LENGTH) { + RNA_property_float_get_default_array(ptr, prop, tmp); + return tmp[index]; + } + else { + float *tmparray, value; - tmparray = MEM_mallocN(sizeof(float) * len, __func__); - RNA_property_float_get_default_array(ptr, prop, tmparray); - value = tmparray[index]; - MEM_freeN(tmparray); + tmparray = MEM_mallocN(sizeof(float) * len, __func__); + RNA_property_float_get_default_array(ptr, prop, tmparray); + value = tmparray[index]; + MEM_freeN(tmparray); - return value; - } + return value; + } } void RNA_property_string_get(PointerRNA *ptr, PropertyRNA *prop, char *value) { - StringPropertyRNA *sprop = (StringPropertyRNA *)prop; - IDProperty *idprop; + StringPropertyRNA *sprop = (StringPropertyRNA *)prop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_STRING); + BLI_assert(RNA_property_type(prop) == PROP_STRING); - if ((idprop = rna_idproperty_check(&prop, ptr))) { - /* editing bytes is not 100% supported - * since they can contain NIL chars */ - if (idprop->subtype == IDP_STRING_SUB_BYTE) { - memcpy(value, IDP_String(idprop), idprop->len); - value[idprop->len] = '\0'; - } - else { - memcpy(value, IDP_String(idprop), idprop->len); - } - } - else if (sprop->get) { - sprop->get(ptr, value); - } - else if (sprop->get_ex) { - sprop->get_ex(ptr, prop, value); - } - else { - strcpy(value, sprop->defaultvalue); - } + if ((idprop = rna_idproperty_check(&prop, ptr))) { + /* editing bytes is not 100% supported + * since they can contain NIL chars */ + if (idprop->subtype == IDP_STRING_SUB_BYTE) { + memcpy(value, IDP_String(idprop), idprop->len); + value[idprop->len] = '\0'; + } + else { + memcpy(value, IDP_String(idprop), idprop->len); + } + } + else if (sprop->get) { + sprop->get(ptr, value); + } + else if (sprop->get_ex) { + sprop->get_ex(ptr, prop, value); + } + else { + strcpy(value, sprop->defaultvalue); + } } -char *RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop, - char *fixedbuf, int fixedlen, int *r_len) +char *RNA_property_string_get_alloc( + PointerRNA *ptr, PropertyRNA *prop, char *fixedbuf, int fixedlen, int *r_len) { - char *buf; - int length; + char *buf; + int length; - BLI_assert(RNA_property_type(prop) == PROP_STRING); + BLI_assert(RNA_property_type(prop) == PROP_STRING); - length = RNA_property_string_length(ptr, prop); + length = RNA_property_string_length(ptr, prop); - if (length + 1 < fixedlen) - buf = fixedbuf; - else - buf = MEM_mallocN(sizeof(char) * (length + 1), "RNA_string_get_alloc"); + if (length + 1 < fixedlen) + buf = fixedbuf; + else + buf = MEM_mallocN(sizeof(char) * (length + 1), "RNA_string_get_alloc"); #ifndef NDEBUG - /* safety check to ensure the string is actually set */ - buf[length] = 255; + /* safety check to ensure the string is actually set */ + buf[length] = 255; #endif - RNA_property_string_get(ptr, prop, buf); + RNA_property_string_get(ptr, prop, buf); #ifndef NDEBUG - BLI_assert(buf[length] == '\0'); + BLI_assert(buf[length] == '\0'); #endif - if (r_len) { - *r_len = length; - } + if (r_len) { + *r_len = length; + } - return buf; + return buf; } /* this is the length without \0 terminator */ int RNA_property_string_length(PointerRNA *ptr, PropertyRNA *prop) { - StringPropertyRNA *sprop = (StringPropertyRNA *)prop; - IDProperty *idprop; + StringPropertyRNA *sprop = (StringPropertyRNA *)prop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_STRING); + BLI_assert(RNA_property_type(prop) == PROP_STRING); - if ((idprop = rna_idproperty_check(&prop, ptr))) { - if (idprop->subtype == IDP_STRING_SUB_BYTE) { - return idprop->len; - } - else { + if ((idprop = rna_idproperty_check(&prop, ptr))) { + if (idprop->subtype == IDP_STRING_SUB_BYTE) { + return idprop->len; + } + else { #ifndef NDEBUG - /* these _must_ stay in sync */ - BLI_assert(strlen(IDP_String(idprop)) == idprop->len - 1); + /* these _must_ stay in sync */ + BLI_assert(strlen(IDP_String(idprop)) == idprop->len - 1); #endif - return idprop->len - 1; - } - } - else if (sprop->length) - return sprop->length(ptr); - else if (sprop->length_ex) - return sprop->length_ex(ptr, prop); - else - return strlen(sprop->defaultvalue); + return idprop->len - 1; + } + } + else if (sprop->length) + return sprop->length(ptr); + else if (sprop->length_ex) + return sprop->length_ex(ptr, prop); + else + return strlen(sprop->defaultvalue); } void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *value) { - StringPropertyRNA *sprop = (StringPropertyRNA *)prop; - IDProperty *idprop; + StringPropertyRNA *sprop = (StringPropertyRNA *)prop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_STRING); + BLI_assert(RNA_property_type(prop) == PROP_STRING); - if ((idprop = rna_idproperty_check(&prop, ptr))) { - /* both IDP_STRING_SUB_BYTE / IDP_STRING_SUB_UTF8 */ - IDP_AssignString(idprop, value, RNA_property_string_maxlength(prop) - 1); - rna_idproperty_touch(idprop); - } - else if (sprop->set) - sprop->set(ptr, value); /* set function needs to clamp its self */ - else if (sprop->set_ex) - sprop->set_ex(ptr, prop, value); /* set function needs to clamp its self */ - else if (prop->flag & PROP_EDITABLE) { - IDProperty *group; + if ((idprop = rna_idproperty_check(&prop, ptr))) { + /* both IDP_STRING_SUB_BYTE / IDP_STRING_SUB_UTF8 */ + IDP_AssignString(idprop, value, RNA_property_string_maxlength(prop) - 1); + rna_idproperty_touch(idprop); + } + else if (sprop->set) + sprop->set(ptr, value); /* set function needs to clamp its self */ + else if (sprop->set_ex) + sprop->set_ex(ptr, prop, value); /* set function needs to clamp its self */ + else if (prop->flag & PROP_EDITABLE) { + IDProperty *group; - group = RNA_struct_idprops(ptr, 1); - if (group) - IDP_AddToGroup(group, IDP_NewString(value, prop->identifier, RNA_property_string_maxlength(prop))); - } + group = RNA_struct_idprops(ptr, 1); + if (group) + IDP_AddToGroup(group, + IDP_NewString(value, prop->identifier, RNA_property_string_maxlength(prop))); + } } void RNA_property_string_set_bytes(PointerRNA *ptr, PropertyRNA *prop, const char *value, int len) { - StringPropertyRNA *sprop = (StringPropertyRNA *)prop; - IDProperty *idprop; - - BLI_assert(RNA_property_type(prop) == PROP_STRING); - BLI_assert(RNA_property_subtype(prop) == PROP_BYTESTRING); - - if ((idprop = rna_idproperty_check(&prop, ptr))) { - IDP_ResizeArray(idprop, len); - memcpy(idprop->data.pointer, value, (size_t)len); - - rna_idproperty_touch(idprop); - } - else if (sprop->set) { - /* XXX, should take length argument (currently not used). */ - sprop->set(ptr, value); /* set function needs to clamp its self */ - } - else if (sprop->set_ex) { - /* XXX, should take length argument (currently not used). */ - sprop->set_ex(ptr, prop, value); /* set function needs to clamp its self */ - } - else if (prop->flag & PROP_EDITABLE) { - IDProperty *group; - - group = RNA_struct_idprops(ptr, 1); - if (group) { - IDPropertyTemplate val = {0}; - val.string.str = value; - val.string.len = len; - val.string.subtype = IDP_STRING_SUB_BYTE; - IDP_AddToGroup(group, IDP_New(IDP_STRING, &val, prop->identifier)); - } - } + StringPropertyRNA *sprop = (StringPropertyRNA *)prop; + IDProperty *idprop; + + BLI_assert(RNA_property_type(prop) == PROP_STRING); + BLI_assert(RNA_property_subtype(prop) == PROP_BYTESTRING); + + if ((idprop = rna_idproperty_check(&prop, ptr))) { + IDP_ResizeArray(idprop, len); + memcpy(idprop->data.pointer, value, (size_t)len); + + rna_idproperty_touch(idprop); + } + else if (sprop->set) { + /* XXX, should take length argument (currently not used). */ + sprop->set(ptr, value); /* set function needs to clamp its self */ + } + else if (sprop->set_ex) { + /* XXX, should take length argument (currently not used). */ + sprop->set_ex(ptr, prop, value); /* set function needs to clamp its self */ + } + else if (prop->flag & PROP_EDITABLE) { + IDProperty *group; + + group = RNA_struct_idprops(ptr, 1); + if (group) { + IDPropertyTemplate val = {0}; + val.string.str = value; + val.string.len = len; + val.string.subtype = IDP_STRING_SUB_BYTE; + IDP_AddToGroup(group, IDP_New(IDP_STRING, &val, prop->identifier)); + } + } } void RNA_property_string_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop, char *value) { - StringPropertyRNA *sprop = (StringPropertyRNA *)rna_ensure_property(prop); + StringPropertyRNA *sprop = (StringPropertyRNA *)rna_ensure_property(prop); - BLI_assert(RNA_property_type(prop) == PROP_STRING); + BLI_assert(RNA_property_type(prop) == PROP_STRING); - strcpy(value, sprop->defaultvalue); + strcpy(value, sprop->defaultvalue); } -char *RNA_property_string_get_default_alloc(PointerRNA *ptr, PropertyRNA *prop, char *fixedbuf, int fixedlen) +char *RNA_property_string_get_default_alloc(PointerRNA *ptr, + PropertyRNA *prop, + char *fixedbuf, + int fixedlen) { - char *buf; - int length; + char *buf; + int length; - BLI_assert(RNA_property_type(prop) == PROP_STRING); + BLI_assert(RNA_property_type(prop) == PROP_STRING); - length = RNA_property_string_default_length(ptr, prop); + length = RNA_property_string_default_length(ptr, prop); - if (length + 1 < fixedlen) - buf = fixedbuf; - else - buf = MEM_callocN(sizeof(char) * (length + 1), "RNA_string_get_alloc"); + if (length + 1 < fixedlen) + buf = fixedbuf; + else + buf = MEM_callocN(sizeof(char) * (length + 1), "RNA_string_get_alloc"); - RNA_property_string_get_default(ptr, prop, buf); + RNA_property_string_get_default(ptr, prop, buf); - return buf; + return buf; } /* this is the length without \0 terminator */ int RNA_property_string_default_length(PointerRNA *UNUSED(ptr), PropertyRNA *prop) { - StringPropertyRNA *sprop = (StringPropertyRNA *)prop; + StringPropertyRNA *sprop = (StringPropertyRNA *)prop; - BLI_assert(RNA_property_type(prop) == PROP_STRING); + BLI_assert(RNA_property_type(prop) == PROP_STRING); - return strlen(sprop->defaultvalue); + return strlen(sprop->defaultvalue); } int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop) { - EnumPropertyRNA *eprop = (EnumPropertyRNA *)prop; - IDProperty *idprop; + EnumPropertyRNA *eprop = (EnumPropertyRNA *)prop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_ENUM); + BLI_assert(RNA_property_type(prop) == PROP_ENUM); - if ((idprop = rna_idproperty_check(&prop, ptr))) - return IDP_Int(idprop); - else if (eprop->get) - return eprop->get(ptr); - else if (eprop->get_ex) - return eprop->get_ex(ptr, prop); - else - return eprop->defaultvalue; + if ((idprop = rna_idproperty_check(&prop, ptr))) + return IDP_Int(idprop); + else if (eprop->get) + return eprop->get(ptr); + else if (eprop->get_ex) + return eprop->get_ex(ptr, prop); + else + return eprop->defaultvalue; } void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value) { - EnumPropertyRNA *eprop = (EnumPropertyRNA *)prop; - IDProperty *idprop; + EnumPropertyRNA *eprop = (EnumPropertyRNA *)prop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_ENUM); + BLI_assert(RNA_property_type(prop) == PROP_ENUM); - if ((idprop = rna_idproperty_check(&prop, ptr))) { - IDP_Int(idprop) = value; - rna_idproperty_touch(idprop); - } - else if (eprop->set) { - eprop->set(ptr, value); - } - else if (eprop->set_ex) { - eprop->set_ex(ptr, prop, value); - } - else if (prop->flag & PROP_EDITABLE) { - IDPropertyTemplate val = {0}; - IDProperty *group; + if ((idprop = rna_idproperty_check(&prop, ptr))) { + IDP_Int(idprop) = value; + rna_idproperty_touch(idprop); + } + else if (eprop->set) { + eprop->set(ptr, value); + } + else if (eprop->set_ex) { + eprop->set_ex(ptr, prop, value); + } + else if (prop->flag & PROP_EDITABLE) { + IDPropertyTemplate val = {0}; + IDProperty *group; - val.i = value; + val.i = value; - group = RNA_struct_idprops(ptr, 1); - if (group) - IDP_AddToGroup(group, IDP_New(IDP_INT, &val, prop->identifier)); - } + group = RNA_struct_idprops(ptr, 1); + if (group) + IDP_AddToGroup(group, IDP_New(IDP_INT, &val, prop->identifier)); + } } int RNA_property_enum_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *prop) { - EnumPropertyRNA *eprop = (EnumPropertyRNA *)rna_ensure_property(prop); + EnumPropertyRNA *eprop = (EnumPropertyRNA *)rna_ensure_property(prop); - BLI_assert(RNA_property_type(prop) == PROP_ENUM); + BLI_assert(RNA_property_type(prop) == PROP_ENUM); - return eprop->defaultvalue; + return eprop->defaultvalue; } void *RNA_property_enum_py_data_get(PropertyRNA *prop) { - EnumPropertyRNA *eprop = (EnumPropertyRNA *)prop; + EnumPropertyRNA *eprop = (EnumPropertyRNA *)prop; - BLI_assert(RNA_property_type(prop) == PROP_ENUM); + BLI_assert(RNA_property_type(prop) == PROP_ENUM); - return eprop->py_data; + return eprop->py_data; } /** @@ -3460,1347 +3517,1431 @@ void *RNA_property_enum_py_data_get(PropertyRNA *prop) * \param step: Absolute value defines step size, sign defines direction. * E.g to get the next item, pass 1, for the previous -1. */ -int RNA_property_enum_step(const bContext *C, PointerRNA *ptr, PropertyRNA *prop, int from_value, int step) +int RNA_property_enum_step( + const bContext *C, PointerRNA *ptr, PropertyRNA *prop, int from_value, int step) { - const EnumPropertyItem *item_array; - int totitem; - bool free; - int result_value = from_value; - int i, i_init; - int single_step = (step < 0) ? -1 : 1; - int step_tot = 0; + const EnumPropertyItem *item_array; + int totitem; + bool free; + int result_value = from_value; + int i, i_init; + int single_step = (step < 0) ? -1 : 1; + int step_tot = 0; - RNA_property_enum_items((bContext *)C, ptr, prop, &item_array, &totitem, &free); - i = RNA_enum_from_value(item_array, from_value); - i_init = i; + RNA_property_enum_items((bContext *)C, ptr, prop, &item_array, &totitem, &free); + i = RNA_enum_from_value(item_array, from_value); + i_init = i; - do { - i = mod_i(i + single_step, totitem); - if (item_array[i].identifier[0]) { - step_tot += single_step; - } - } while ((i != i_init) && (step_tot != step)); + do { + i = mod_i(i + single_step, totitem); + if (item_array[i].identifier[0]) { + step_tot += single_step; + } + } while ((i != i_init) && (step_tot != step)); - if (i != i_init) { - result_value = item_array[i].value; - } + if (i != i_init) { + result_value = item_array[i].value; + } - if (free) { - MEM_freeN((void *)item_array); - } + if (free) { + MEM_freeN((void *)item_array); + } - return result_value; + return result_value; } PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop) { - PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop; - IDProperty *idprop; - - BLI_assert(RNA_property_type(prop) == PROP_POINTER); - - if ((idprop = rna_idproperty_check(&prop, ptr))) { - pprop = (PointerPropertyRNA *)prop; - - if (RNA_struct_is_ID(pprop->type)) { - return rna_pointer_inherit_refine(ptr, pprop->type, IDP_Id(idprop)); - } - - /* for groups, data is idprop itself */ - if (pprop->typef) - return rna_pointer_inherit_refine(ptr, pprop->typef(ptr), idprop); - else - return rna_pointer_inherit_refine(ptr, pprop->type, idprop); - } - else if (pprop->get) { - return pprop->get(ptr); - } - else if (prop->flag & PROP_IDPROPERTY) { - /* XXX temporary hack to add it automatically, reading should - * never do any write ops, to ensure thread safety etc .. */ - RNA_property_pointer_add(ptr, prop); - return RNA_property_pointer_get(ptr, prop); - } - else { - return PointerRNA_NULL; - } + PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop; + IDProperty *idprop; + + BLI_assert(RNA_property_type(prop) == PROP_POINTER); + + if ((idprop = rna_idproperty_check(&prop, ptr))) { + pprop = (PointerPropertyRNA *)prop; + + if (RNA_struct_is_ID(pprop->type)) { + return rna_pointer_inherit_refine(ptr, pprop->type, IDP_Id(idprop)); + } + + /* for groups, data is idprop itself */ + if (pprop->typef) + return rna_pointer_inherit_refine(ptr, pprop->typef(ptr), idprop); + else + return rna_pointer_inherit_refine(ptr, pprop->type, idprop); + } + else if (pprop->get) { + return pprop->get(ptr); + } + else if (prop->flag & PROP_IDPROPERTY) { + /* XXX temporary hack to add it automatically, reading should + * never do any write ops, to ensure thread safety etc .. */ + RNA_property_pointer_add(ptr, prop); + return RNA_property_pointer_get(ptr, prop); + } + else { + return PointerRNA_NULL; + } } void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value) { - PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop; - BLI_assert(RNA_property_type(prop) == PROP_POINTER); - - /* Check types */ - if (ptr_value.type != NULL && !RNA_struct_is_a(ptr_value.type, pprop->type)) { - printf("%s: expected %s type, not %s.\n", __func__, pprop->type->identifier, ptr_value.type->identifier); - return; - } - - /* RNA */ - if (pprop->set && - !((prop->flag & PROP_NEVER_NULL) && ptr_value.data == NULL) && - !((prop->flag & PROP_ID_SELF_CHECK) && ptr->id.data == ptr_value.id.data)) - { - pprop->set(ptr, ptr_value); - } - /* IDProperty */ - else if (prop->flag & PROP_EDITABLE) { - IDPropertyTemplate val = {0}; - IDProperty *group; - - val.id = ptr_value.data; - - group = RNA_struct_idprops(ptr, true); - if (group) { - IDP_ReplaceInGroup(group, IDP_New(IDP_ID, &val, prop->identifier)); - } - } + PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop; + BLI_assert(RNA_property_type(prop) == PROP_POINTER); + + /* Check types */ + if (ptr_value.type != NULL && !RNA_struct_is_a(ptr_value.type, pprop->type)) { + printf("%s: expected %s type, not %s.\n", + __func__, + pprop->type->identifier, + ptr_value.type->identifier); + return; + } + + /* RNA */ + if (pprop->set && !((prop->flag & PROP_NEVER_NULL) && ptr_value.data == NULL) && + !((prop->flag & PROP_ID_SELF_CHECK) && ptr->id.data == ptr_value.id.data)) { + pprop->set(ptr, ptr_value); + } + /* IDProperty */ + else if (prop->flag & PROP_EDITABLE) { + IDPropertyTemplate val = {0}; + IDProperty *group; + + val.id = ptr_value.data; + + group = RNA_struct_idprops(ptr, true); + if (group) { + IDP_ReplaceInGroup(group, IDP_New(IDP_ID, &val, prop->identifier)); + } + } } PointerRNA RNA_property_pointer_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop)) { - /*PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop; */ + /*PointerPropertyRNA *pprop = (PointerPropertyRNA *)prop; */ - /* BLI_assert(RNA_property_type(prop) == PROP_POINTER); */ + /* BLI_assert(RNA_property_type(prop) == PROP_POINTER); */ - return PointerRNA_NULL; /* FIXME: there has to be a way... */ + return PointerRNA_NULL; /* FIXME: there has to be a way... */ } void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop) { - /*IDProperty *idprop;*/ + /*IDProperty *idprop;*/ - BLI_assert(RNA_property_type(prop) == PROP_POINTER); + BLI_assert(RNA_property_type(prop) == PROP_POINTER); - if ((/*idprop=*/ rna_idproperty_check(&prop, ptr))) { - /* already exists */ - } - else if (prop->flag & PROP_IDPROPERTY) { - IDPropertyTemplate val = {0}; - IDProperty *group; + if ((/*idprop=*/rna_idproperty_check(&prop, ptr))) { + /* already exists */ + } + else if (prop->flag & PROP_IDPROPERTY) { + IDPropertyTemplate val = {0}; + IDProperty *group; - val.i = 0; + val.i = 0; - group = RNA_struct_idprops(ptr, 1); - if (group) - IDP_AddToGroup(group, IDP_New(IDP_GROUP, &val, prop->identifier)); - } - else - printf("%s %s.%s: only supported for id properties.\n", __func__, ptr->type->identifier, prop->identifier); + group = RNA_struct_idprops(ptr, 1); + if (group) + IDP_AddToGroup(group, IDP_New(IDP_GROUP, &val, prop->identifier)); + } + else + printf("%s %s.%s: only supported for id properties.\n", + __func__, + ptr->type->identifier, + prop->identifier); } void RNA_property_pointer_remove(PointerRNA *ptr, PropertyRNA *prop) { - IDProperty *idprop, *group; + IDProperty *idprop, *group; - BLI_assert(RNA_property_type(prop) == PROP_POINTER); + BLI_assert(RNA_property_type(prop) == PROP_POINTER); - if ((idprop = rna_idproperty_check(&prop, ptr))) { - group = RNA_struct_idprops(ptr, 0); + if ((idprop = rna_idproperty_check(&prop, ptr))) { + group = RNA_struct_idprops(ptr, 0); - if (group) { - IDP_FreeFromGroup(group, idprop); - } - } - else - printf("%s %s.%s: only supported for id properties.\n", __func__, ptr->type->identifier, prop->identifier); + if (group) { + IDP_FreeFromGroup(group, idprop); + } + } + else + printf("%s %s.%s: only supported for id properties.\n", + __func__, + ptr->type->identifier, + prop->identifier); } static void rna_property_collection_get_idp(CollectionPropertyIterator *iter) { - CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)iter->prop; + CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)iter->prop; - iter->ptr.data = rna_iterator_array_get(iter); - iter->ptr.type = cprop->item_type; - rna_pointer_inherit_id(cprop->item_type, &iter->parent, &iter->ptr); + iter->ptr.data = rna_iterator_array_get(iter); + iter->ptr.type = cprop->item_type; + rna_pointer_inherit_id(cprop->item_type, &iter->parent, &iter->ptr); } -void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, CollectionPropertyIterator *iter) +void RNA_property_collection_begin(PointerRNA *ptr, + PropertyRNA *prop, + CollectionPropertyIterator *iter) { - IDProperty *idprop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - memset(iter, 0, sizeof(*iter)); + memset(iter, 0, sizeof(*iter)); - if ((idprop = rna_idproperty_check(&prop, ptr)) || (prop->flag & PROP_IDPROPERTY)) { - iter->parent = *ptr; - iter->prop = prop; + if ((idprop = rna_idproperty_check(&prop, ptr)) || (prop->flag & PROP_IDPROPERTY)) { + iter->parent = *ptr; + iter->prop = prop; - if (idprop) - rna_iterator_array_begin(iter, IDP_IDPArray(idprop), sizeof(IDProperty), idprop->len, 0, NULL); - else - rna_iterator_array_begin(iter, NULL, sizeof(IDProperty), 0, 0, NULL); + if (idprop) + rna_iterator_array_begin( + iter, IDP_IDPArray(idprop), sizeof(IDProperty), idprop->len, 0, NULL); + else + rna_iterator_array_begin(iter, NULL, sizeof(IDProperty), 0, 0, NULL); - if (iter->valid) - rna_property_collection_get_idp(iter); + if (iter->valid) + rna_property_collection_get_idp(iter); - iter->idprop = 1; - } - else { - CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; - cprop->begin(iter, ptr); - } + iter->idprop = 1; + } + else { + CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; + cprop->begin(iter, ptr); + } } void RNA_property_collection_next(CollectionPropertyIterator *iter) { - CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(iter->prop); + CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(iter->prop); - if (iter->idprop) { - rna_iterator_array_next(iter); + if (iter->idprop) { + rna_iterator_array_next(iter); - if (iter->valid) - rna_property_collection_get_idp(iter); - } - else - cprop->next(iter); + if (iter->valid) + rna_property_collection_get_idp(iter); + } + else + cprop->next(iter); } void RNA_property_collection_skip(CollectionPropertyIterator *iter, int num) { - CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(iter->prop); - int i; + CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(iter->prop); + int i; - if (num > 1 && (iter->idprop || (cprop->property.flag_internal & PROP_INTERN_RAW_ARRAY))) { - /* fast skip for array */ - ArrayIterator *internal = &iter->internal.array; + if (num > 1 && (iter->idprop || (cprop->property.flag_internal & PROP_INTERN_RAW_ARRAY))) { + /* fast skip for array */ + ArrayIterator *internal = &iter->internal.array; - if (!internal->skip) { - internal->ptr += internal->itemsize * (num - 1); - iter->valid = (internal->ptr < internal->endptr); - if (iter->valid) - RNA_property_collection_next(iter); - return; - } - } + if (!internal->skip) { + internal->ptr += internal->itemsize * (num - 1); + iter->valid = (internal->ptr < internal->endptr); + if (iter->valid) + RNA_property_collection_next(iter); + return; + } + } - /* slow iteration otherwise */ - for (i = 0; i < num && iter->valid; i++) - RNA_property_collection_next(iter); + /* slow iteration otherwise */ + for (i = 0; i < num && iter->valid; i++) + RNA_property_collection_next(iter); } void RNA_property_collection_end(CollectionPropertyIterator *iter) { - CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(iter->prop); + CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(iter->prop); - if (iter->idprop) - rna_iterator_array_end(iter); - else - cprop->end(iter); + if (iter->idprop) + rna_iterator_array_end(iter); + else + cprop->end(iter); } int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop) { - CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; - IDProperty *idprop; + CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - if ((idprop = rna_idproperty_check(&prop, ptr))) { - return idprop->len; - } - else if (cprop->length) { - return cprop->length(ptr); - } - else { - CollectionPropertyIterator iter; - int length = 0; + if ((idprop = rna_idproperty_check(&prop, ptr))) { + return idprop->len; + } + else if (cprop->length) { + return cprop->length(ptr); + } + else { + CollectionPropertyIterator iter; + int length = 0; - RNA_property_collection_begin(ptr, prop, &iter); - for (; iter.valid; RNA_property_collection_next(&iter)) - length++; - RNA_property_collection_end(&iter); + RNA_property_collection_begin(ptr, prop, &iter); + for (; iter.valid; RNA_property_collection_next(&iter)) + length++; + RNA_property_collection_end(&iter); - return length; - } + return length; + } } void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr) { - IDProperty *idprop; -/* CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; */ - - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - - if ((idprop = rna_idproperty_check(&prop, ptr))) { - IDPropertyTemplate val = {0}; - IDProperty *item; - - item = IDP_New(IDP_GROUP, &val, ""); - IDP_AppendArray(idprop, item); - /* IDP_FreeProperty(item); *//* IDP_AppendArray does a shallow copy (memcpy), only free memory */ - MEM_freeN(item); - rna_idproperty_touch(idprop); - } - else if (prop->flag & PROP_IDPROPERTY) { - IDProperty *group, *item; - IDPropertyTemplate val = {0}; - - group = RNA_struct_idprops(ptr, 1); - if (group) { - idprop = IDP_NewIDPArray(prop->identifier); - IDP_AddToGroup(group, idprop); - - item = IDP_New(IDP_GROUP, &val, ""); - IDP_AppendArray(idprop, item); - /* IDP_FreeProperty(item); *//* IDP_AppendArray does a shallow copy (memcpy), only free memory */ - MEM_freeN(item); - } - } - - /* py api calls directly */ -#if 0 - else if (cprop->add) { - if (!(cprop->add->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */ - ParameterList params; - RNA_parameter_list_create(¶ms, ptr, cprop->add); - RNA_function_call(NULL, NULL, ptr, cprop->add, ¶ms); - RNA_parameter_list_free(¶ms); - } - } + IDProperty *idprop; + /* CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; */ + + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + + if ((idprop = rna_idproperty_check(&prop, ptr))) { + IDPropertyTemplate val = {0}; + IDProperty *item; + + item = IDP_New(IDP_GROUP, &val, ""); + IDP_AppendArray(idprop, item); + /* IDP_FreeProperty(item); */ /* IDP_AppendArray does a shallow copy (memcpy), only free memory */ + MEM_freeN(item); + rna_idproperty_touch(idprop); + } + else if (prop->flag & PROP_IDPROPERTY) { + IDProperty *group, *item; + IDPropertyTemplate val = {0}; + + group = RNA_struct_idprops(ptr, 1); + if (group) { + idprop = IDP_NewIDPArray(prop->identifier); + IDP_AddToGroup(group, idprop); + + item = IDP_New(IDP_GROUP, &val, ""); + IDP_AppendArray(idprop, item); + /* IDP_FreeProperty(item); */ /* IDP_AppendArray does a shallow copy (memcpy), only free memory */ + MEM_freeN(item); + } + } + + /* py api calls directly */ #if 0 - else { - printf("%s %s.%s: not implemented for this property.\n", __func__, ptr->type->identifier, prop->identifier); - } -#endif + else if (cprop->add) { + if (!(cprop->add->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */ + ParameterList params; + RNA_parameter_list_create(¶ms, ptr, cprop->add); + RNA_function_call(NULL, NULL, ptr, cprop->add, ¶ms); + RNA_parameter_list_free(¶ms); + } + } +# if 0 + else { + printf("%s %s.%s: not implemented for this property.\n", __func__, ptr->type->identifier, prop->identifier); + } +# endif #endif - if (r_ptr) { - if (idprop) { - CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; + if (r_ptr) { + if (idprop) { + CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; - r_ptr->data = IDP_GetIndexArray(idprop, idprop->len - 1); - r_ptr->type = cprop->item_type; - rna_pointer_inherit_id(NULL, ptr, r_ptr); - } - else - memset(r_ptr, 0, sizeof(*r_ptr)); - } + r_ptr->data = IDP_GetIndexArray(idprop, idprop->len - 1); + r_ptr->type = cprop->item_type; + rna_pointer_inherit_id(NULL, ptr, r_ptr); + } + else + memset(r_ptr, 0, sizeof(*r_ptr)); + } } bool RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key) { - IDProperty *idprop; -/* CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; */ + IDProperty *idprop; + /* CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)prop; */ - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - if ((idprop = rna_idproperty_check(&prop, ptr))) { - IDProperty tmp, *array; - int len; + if ((idprop = rna_idproperty_check(&prop, ptr))) { + IDProperty tmp, *array; + int len; - len = idprop->len; - array = IDP_IDPArray(idprop); + len = idprop->len; + array = IDP_IDPArray(idprop); - if (key >= 0 && key < len) { - if (key + 1 < len) { - /* move element to be removed to the back */ - memcpy(&tmp, &array[key], sizeof(IDProperty)); - memmove(array + key, array + key + 1, sizeof(IDProperty) * (len - (key + 1))); - memcpy(&array[len - 1], &tmp, sizeof(IDProperty)); - } + if (key >= 0 && key < len) { + if (key + 1 < len) { + /* move element to be removed to the back */ + memcpy(&tmp, &array[key], sizeof(IDProperty)); + memmove(array + key, array + key + 1, sizeof(IDProperty) * (len - (key + 1))); + memcpy(&array[len - 1], &tmp, sizeof(IDProperty)); + } - IDP_ResizeIDPArray(idprop, len - 1); - } + IDP_ResizeIDPArray(idprop, len - 1); + } - return true; - } - else if (prop->flag & PROP_IDPROPERTY) { - return true; - } + return true; + } + else if (prop->flag & PROP_IDPROPERTY) { + return true; + } - /* py api calls directly */ -#if 0 - else if (cprop->remove) { - if (!(cprop->remove->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */ - ParameterList params; - RNA_parameter_list_create(¶ms, ptr, cprop->remove); - RNA_function_call(NULL, NULL, ptr, cprop->remove, ¶ms); - RNA_parameter_list_free(¶ms); - } - - return false; - } + /* py api calls directly */ #if 0 - else { - printf("%s %s.%s: only supported for id properties.\n", __func__, ptr->type->identifier, prop->identifier); - } + else if (cprop->remove) { + if (!(cprop->remove->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */ + ParameterList params; + RNA_parameter_list_create(¶ms, ptr, cprop->remove); + RNA_function_call(NULL, NULL, ptr, cprop->remove, ¶ms); + RNA_parameter_list_free(¶ms); + } + + return false; + } +# if 0 + else { + printf("%s %s.%s: only supported for id properties.\n", __func__, ptr->type->identifier, prop->identifier); + } +# endif #endif -#endif - return false; + return false; } bool RNA_property_collection_move(PointerRNA *ptr, PropertyRNA *prop, int key, int pos) { - IDProperty *idprop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - if ((idprop = rna_idproperty_check(&prop, ptr))) { - IDProperty tmp, *array; - int len; + if ((idprop = rna_idproperty_check(&prop, ptr))) { + IDProperty tmp, *array; + int len; - len = idprop->len; - array = IDP_IDPArray(idprop); + len = idprop->len; + array = IDP_IDPArray(idprop); - if (key >= 0 && key < len && pos >= 0 && pos < len && key != pos) { - memcpy(&tmp, &array[key], sizeof(IDProperty)); - if (pos < key) - memmove(array + pos + 1, array + pos, sizeof(IDProperty) * (key - pos)); - else - memmove(array + key, array + key + 1, sizeof(IDProperty) * (pos - key)); - memcpy(&array[pos], &tmp, sizeof(IDProperty)); - } + if (key >= 0 && key < len && pos >= 0 && pos < len && key != pos) { + memcpy(&tmp, &array[key], sizeof(IDProperty)); + if (pos < key) + memmove(array + pos + 1, array + pos, sizeof(IDProperty) * (key - pos)); + else + memmove(array + key, array + key + 1, sizeof(IDProperty) * (pos - key)); + memcpy(&array[pos], &tmp, sizeof(IDProperty)); + } - return true; - } - else if (prop->flag & PROP_IDPROPERTY) { - return true; - } + return true; + } + else if (prop->flag & PROP_IDPROPERTY) { + return true; + } - return false; + return false; } void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop) { - IDProperty *idprop; + IDProperty *idprop; - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - if ((idprop = rna_idproperty_check(&prop, ptr))) { - IDP_ResizeIDPArray(idprop, 0); - rna_idproperty_touch(idprop); - } + if ((idprop = rna_idproperty_check(&prop, ptr))) { + IDP_ResizeIDPArray(idprop, 0); + rna_idproperty_touch(idprop); + } } int RNA_property_collection_lookup_index(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *t_ptr) { - CollectionPropertyIterator iter; - int index = 0; + CollectionPropertyIterator iter; + int index = 0; - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - RNA_property_collection_begin(ptr, prop, &iter); - for (index = 0; iter.valid; RNA_property_collection_next(&iter), index++) { - if (iter.ptr.data == t_ptr->data) - break; - } - RNA_property_collection_end(&iter); + RNA_property_collection_begin(ptr, prop, &iter); + for (index = 0; iter.valid; RNA_property_collection_next(&iter), index++) { + if (iter.ptr.data == t_ptr->data) + break; + } + RNA_property_collection_end(&iter); - /* did we find it? */ - if (iter.valid) - return index; - else - return -1; + /* did we find it? */ + if (iter.valid) + return index; + else + return -1; } -int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr) +int RNA_property_collection_lookup_int(PointerRNA *ptr, + PropertyRNA *prop, + int key, + PointerRNA *r_ptr) { - CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(prop); + CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(prop); - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - if (cprop->lookupint) { - /* we have a callback defined, use it */ - return cprop->lookupint(ptr, key, r_ptr); - } - else { - /* no callback defined, just iterate and find the nth item */ - CollectionPropertyIterator iter; - int i; + if (cprop->lookupint) { + /* we have a callback defined, use it */ + return cprop->lookupint(ptr, key, r_ptr); + } + else { + /* no callback defined, just iterate and find the nth item */ + CollectionPropertyIterator iter; + int i; - RNA_property_collection_begin(ptr, prop, &iter); - for (i = 0; iter.valid; RNA_property_collection_next(&iter), i++) { - if (i == key) { - *r_ptr = iter.ptr; - break; - } - } - RNA_property_collection_end(&iter); + RNA_property_collection_begin(ptr, prop, &iter); + for (i = 0; iter.valid; RNA_property_collection_next(&iter), i++) { + if (i == key) { + *r_ptr = iter.ptr; + break; + } + } + RNA_property_collection_end(&iter); - if (!iter.valid) - memset(r_ptr, 0, sizeof(*r_ptr)); + if (!iter.valid) + memset(r_ptr, 0, sizeof(*r_ptr)); - return iter.valid; - } + return iter.valid; + } } -int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr) +int RNA_property_collection_lookup_string(PointerRNA *ptr, + PropertyRNA *prop, + const char *key, + PointerRNA *r_ptr) { - CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(prop); + CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(prop); - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - if (cprop->lookupstring) { - /* we have a callback defined, use it */ - return cprop->lookupstring(ptr, key, r_ptr); - } - else { - /* no callback defined, compare with name properties if they exist */ - CollectionPropertyIterator iter; - PropertyRNA *nameprop; - char name[256], *nameptr; - int found = 0; - int keylen = strlen(key); - int namelen; + if (cprop->lookupstring) { + /* we have a callback defined, use it */ + return cprop->lookupstring(ptr, key, r_ptr); + } + else { + /* no callback defined, compare with name properties if they exist */ + CollectionPropertyIterator iter; + PropertyRNA *nameprop; + char name[256], *nameptr; + int found = 0; + int keylen = strlen(key); + int namelen; - RNA_property_collection_begin(ptr, prop, &iter); - for (; iter.valid; RNA_property_collection_next(&iter)) { - if (iter.ptr.data && iter.ptr.type->nameproperty) { - nameprop = iter.ptr.type->nameproperty; + RNA_property_collection_begin(ptr, prop, &iter); + for (; iter.valid; RNA_property_collection_next(&iter)) { + if (iter.ptr.data && iter.ptr.type->nameproperty) { + nameprop = iter.ptr.type->nameproperty; - nameptr = RNA_property_string_get_alloc(&iter.ptr, nameprop, name, sizeof(name), &namelen); + nameptr = RNA_property_string_get_alloc(&iter.ptr, nameprop, name, sizeof(name), &namelen); - if ((keylen == namelen) && STREQ(nameptr, key)) { - *r_ptr = iter.ptr; - found = 1; - } + if ((keylen == namelen) && STREQ(nameptr, key)) { + *r_ptr = iter.ptr; + found = 1; + } - if ((char *)&name != nameptr) - MEM_freeN(nameptr); + if ((char *)&name != nameptr) + MEM_freeN(nameptr); - if (found) - break; - } - } - RNA_property_collection_end(&iter); + if (found) + break; + } + } + RNA_property_collection_end(&iter); - if (!iter.valid) - memset(r_ptr, 0, sizeof(*r_ptr)); + if (!iter.valid) + memset(r_ptr, 0, sizeof(*r_ptr)); - return iter.valid; - } + return iter.valid; + } } /* zero return is an assignment error */ -int RNA_property_collection_assign_int(PointerRNA *ptr, PropertyRNA *prop, const int key, const PointerRNA *assign_ptr) +int RNA_property_collection_assign_int(PointerRNA *ptr, + PropertyRNA *prop, + const int key, + const PointerRNA *assign_ptr) { - CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(prop); + CollectionPropertyRNA *cprop = (CollectionPropertyRNA *)rna_ensure_property(prop); - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - if (cprop->assignint) { - /* we have a callback defined, use it */ - return cprop->assignint(ptr, key, assign_ptr); - } + if (cprop->assignint) { + /* we have a callback defined, use it */ + return cprop->assignint(ptr, key, assign_ptr); + } - return 0; + return 0; } bool RNA_property_collection_type_get(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr) { - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - - *r_ptr = *ptr; - return ((r_ptr->type = rna_ensure_property(prop)->srna) ? 1 : 0); -} - -int RNA_property_collection_raw_array(PointerRNA *ptr, PropertyRNA *prop, PropertyRNA *itemprop, RawArray *array) -{ - CollectionPropertyIterator iter; - ArrayIterator *internal; - char *arrayp; - - BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); - - if (!(prop->flag_internal & PROP_INTERN_RAW_ARRAY) || !(itemprop->flag_internal & PROP_INTERN_RAW_ACCESS)) - return 0; - - RNA_property_collection_begin(ptr, prop, &iter); - - if (iter.valid) { - /* get data from array iterator and item property */ - internal = &iter.internal.array; - arrayp = (iter.valid) ? iter.ptr.data : NULL; - - if (internal->skip || !RNA_property_editable(&iter.ptr, itemprop)) { - /* we might skip some items, so it's not a proper array */ - RNA_property_collection_end(&iter); - return 0; - } - - array->array = arrayp + itemprop->rawoffset; - array->stride = internal->itemsize; - array->len = ((char *)internal->endptr - arrayp) / internal->itemsize; - array->type = itemprop->rawtype; - } - else - memset(array, 0, sizeof(RawArray)); - - RNA_property_collection_end(&iter); - - return 1; -} - -#define RAW_GET(dtype, var, raw, a) \ -{ \ - switch (raw.type) { \ - case PROP_RAW_CHAR: var = (dtype)((char *)raw.array)[a]; break; \ - case PROP_RAW_SHORT: var = (dtype)((short *)raw.array)[a]; break; \ - case PROP_RAW_INT: var = (dtype)((int *)raw.array)[a]; break; \ - case PROP_RAW_BOOLEAN: var = (dtype)((bool *)raw.array)[a]; break; \ - case PROP_RAW_FLOAT: var = (dtype)((float *)raw.array)[a]; break; \ - case PROP_RAW_DOUBLE: var = (dtype)((double *)raw.array)[a]; break; \ - default: var = (dtype)0; \ - } \ -} (void)0 - -#define RAW_SET(dtype, raw, a, var) \ -{ \ - switch (raw.type) { \ - case PROP_RAW_CHAR: ((char *)raw.array)[a] = (char)var; break; \ - case PROP_RAW_SHORT: ((short *)raw.array)[a] = (short)var; break; \ - case PROP_RAW_INT: ((int *)raw.array)[a] = (int)var; break; \ - case PROP_RAW_BOOLEAN: ((bool *)raw.array)[a] = (bool)var; break; \ - case PROP_RAW_FLOAT: ((float *)raw.array)[a] = (float)var; break; \ - case PROP_RAW_DOUBLE: ((double *)raw.array)[a] = (double)var; break; \ - default: break; \ - } \ -} (void)0 + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + + *r_ptr = *ptr; + return ((r_ptr->type = rna_ensure_property(prop)->srna) ? 1 : 0); +} + +int RNA_property_collection_raw_array(PointerRNA *ptr, + PropertyRNA *prop, + PropertyRNA *itemprop, + RawArray *array) +{ + CollectionPropertyIterator iter; + ArrayIterator *internal; + char *arrayp; + + BLI_assert(RNA_property_type(prop) == PROP_COLLECTION); + + if (!(prop->flag_internal & PROP_INTERN_RAW_ARRAY) || + !(itemprop->flag_internal & PROP_INTERN_RAW_ACCESS)) + return 0; + + RNA_property_collection_begin(ptr, prop, &iter); + + if (iter.valid) { + /* get data from array iterator and item property */ + internal = &iter.internal.array; + arrayp = (iter.valid) ? iter.ptr.data : NULL; + + if (internal->skip || !RNA_property_editable(&iter.ptr, itemprop)) { + /* we might skip some items, so it's not a proper array */ + RNA_property_collection_end(&iter); + return 0; + } + + array->array = arrayp + itemprop->rawoffset; + array->stride = internal->itemsize; + array->len = ((char *)internal->endptr - arrayp) / internal->itemsize; + array->type = itemprop->rawtype; + } + else + memset(array, 0, sizeof(RawArray)); + + RNA_property_collection_end(&iter); + + return 1; +} + +#define RAW_GET(dtype, var, raw, a) \ + { \ + switch (raw.type) { \ + case PROP_RAW_CHAR: \ + var = (dtype)((char *)raw.array)[a]; \ + break; \ + case PROP_RAW_SHORT: \ + var = (dtype)((short *)raw.array)[a]; \ + break; \ + case PROP_RAW_INT: \ + var = (dtype)((int *)raw.array)[a]; \ + break; \ + case PROP_RAW_BOOLEAN: \ + var = (dtype)((bool *)raw.array)[a]; \ + break; \ + case PROP_RAW_FLOAT: \ + var = (dtype)((float *)raw.array)[a]; \ + break; \ + case PROP_RAW_DOUBLE: \ + var = (dtype)((double *)raw.array)[a]; \ + break; \ + default: \ + var = (dtype)0; \ + } \ + } \ + (void)0 + +#define RAW_SET(dtype, raw, a, var) \ + { \ + switch (raw.type) { \ + case PROP_RAW_CHAR: \ + ((char *)raw.array)[a] = (char)var; \ + break; \ + case PROP_RAW_SHORT: \ + ((short *)raw.array)[a] = (short)var; \ + break; \ + case PROP_RAW_INT: \ + ((int *)raw.array)[a] = (int)var; \ + break; \ + case PROP_RAW_BOOLEAN: \ + ((bool *)raw.array)[a] = (bool)var; \ + break; \ + case PROP_RAW_FLOAT: \ + ((float *)raw.array)[a] = (float)var; \ + break; \ + case PROP_RAW_DOUBLE: \ + ((double *)raw.array)[a] = (double)var; \ + break; \ + default: \ + break; \ + } \ + } \ + (void)0 int RNA_raw_type_sizeof(RawPropertyType type) { - switch (type) { - case PROP_RAW_CHAR: return sizeof(char); - case PROP_RAW_SHORT: return sizeof(short); - case PROP_RAW_INT: return sizeof(int); - case PROP_RAW_BOOLEAN: return sizeof(bool); - case PROP_RAW_FLOAT: return sizeof(float); - case PROP_RAW_DOUBLE: return sizeof(double); - default: return 0; - } + switch (type) { + case PROP_RAW_CHAR: + return sizeof(char); + case PROP_RAW_SHORT: + return sizeof(short); + case PROP_RAW_INT: + return sizeof(int); + case PROP_RAW_BOOLEAN: + return sizeof(bool); + case PROP_RAW_FLOAT: + return sizeof(float); + case PROP_RAW_DOUBLE: + return sizeof(double); + default: + return 0; + } } static int rna_property_array_length_all_dimensions(PointerRNA *ptr, PropertyRNA *prop) { - int i, len[RNA_MAX_ARRAY_DIMENSION]; - const int dim = RNA_property_array_dimension(ptr, prop, len); - int size; - - if (dim == 0) - return 0; - - for (size = 1, i = 0; i < dim; i++) - size *= len[i]; - - return size; -} - -static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, - void *inarray, RawPropertyType intype, int inlen, int set) -{ - StructRNA *ptype; - PointerRNA itemptr_base; - PropertyRNA *itemprop, *iprop; - PropertyType itemtype = 0; - RawArray in; - int itemlen = 0; - - /* initialize in array, stride assumed 0 in following code */ - in.array = inarray; - in.type = intype; - in.len = inlen; - in.stride = 0; - - ptype = RNA_property_pointer_type(ptr, prop); - - /* try to get item property pointer */ - RNA_pointer_create(NULL, ptype, NULL, &itemptr_base); - itemprop = RNA_struct_find_property(&itemptr_base, propname); - - if (itemprop) { - /* we have item property pointer */ - RawArray out; - - /* check type */ - itemtype = RNA_property_type(itemprop); - - if (!ELEM(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) { - BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported"); - return 0; - } - - /* check item array */ - itemlen = RNA_property_array_length(&itemptr_base, itemprop); - - /* dynamic array? need to get length per item */ - if (itemprop->getlength) { - itemprop = NULL; - } - /* try to access as raw array */ - else if (RNA_property_collection_raw_array(ptr, prop, itemprop, &out)) { - int arraylen = (itemlen == 0) ? 1 : itemlen; - if (in.len != arraylen * out.len) { - BKE_reportf(reports, RPT_ERROR, "Array length mismatch (expected %d, got %d)", - out.len * arraylen, in.len); - return 0; - } - - /* matching raw types */ - if (out.type == in.type) { - void *inp = in.array; - void *outp = out.array; - int a, size; - - size = RNA_raw_type_sizeof(out.type) * arraylen; - - for (a = 0; a < out.len; a++) { - if (set) memcpy(outp, inp, size); - else memcpy(inp, outp, size); - - inp = (char *)inp + size; - outp = (char *)outp + out.stride; - } - - return 1; - } - - /* could also be faster with non-matching types, - * for now we just do slower loop .. */ - } - } - - { - void *tmparray = NULL; - int tmplen = 0; - int err = 0, j, a = 0; - int needconv = 1; - - if (((itemtype == PROP_INT) && (in.type == PROP_RAW_INT)) || - ((itemtype == PROP_BOOLEAN) && (in.type == PROP_RAW_BOOLEAN)) || - ((itemtype == PROP_FLOAT) && (in.type == PROP_RAW_FLOAT))) - { - /* avoid creating temporary buffer if the data type match */ - needconv = 0; - } - /* no item property pointer, can still be id property, or - * property of a type derived from the collection pointer type */ - RNA_PROP_BEGIN (ptr, itemptr, prop) - { - if (itemptr.data) { - if (itemprop) { - /* we got the property already */ - iprop = itemprop; - } - else { - /* not yet, look it up and verify if it is valid */ - iprop = RNA_struct_find_property(&itemptr, propname); - - if (iprop) { - itemlen = rna_property_array_length_all_dimensions(&itemptr, iprop); - itemtype = RNA_property_type(iprop); - } - else { - BKE_reportf(reports, RPT_ERROR, "Property named '%s' not found", propname); - err = 1; - break; - } - - if (!ELEM(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) { - BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported"); - err = 1; - break; - } - } - - /* editable check */ - if (!set || RNA_property_editable(&itemptr, iprop)) { - if (a + itemlen > in.len) { - BKE_reportf(reports, RPT_ERROR, "Array length mismatch (got %d, expected more)", in.len); - err = 1; - break; - } - - if (itemlen == 0) { - /* handle conversions */ - if (set) { - switch (itemtype) { - case PROP_BOOLEAN: - { - int b; - RAW_GET(bool, b, in, a); - RNA_property_boolean_set(&itemptr, iprop, b); - break; - } - case PROP_INT: - { - int i; - RAW_GET(int, i, in, a); - RNA_property_int_set(&itemptr, iprop, i); - break; - } - case PROP_FLOAT: - { - float f; - RAW_GET(float, f, in, a); - RNA_property_float_set(&itemptr, iprop, f); - break; - } - default: - break; - } - } - else { - switch (itemtype) { - case PROP_BOOLEAN: - { - int b = RNA_property_boolean_get(&itemptr, iprop); - RAW_SET(bool, in, a, b); - break; - } - case PROP_INT: - { - int i = RNA_property_int_get(&itemptr, iprop); - RAW_SET(int, in, a, i); - break; - } - case PROP_FLOAT: - { - float f = RNA_property_float_get(&itemptr, iprop); - RAW_SET(float, in, a, f); - break; - } - default: - break; - } - } - a++; - } - else if (needconv == 1) { - /* allocate temporary array if needed */ - if (tmparray && tmplen != itemlen) { - MEM_freeN(tmparray); - tmparray = NULL; - } - if (!tmparray) { - tmparray = MEM_callocN(sizeof(float) * itemlen, "RNA tmparray"); - tmplen = itemlen; - } - - /* handle conversions */ - if (set) { - switch (itemtype) { - case PROP_BOOLEAN: - { - for (j = 0; j < itemlen; j++, a++) - RAW_GET(bool, ((bool *)tmparray)[j], in, a); - RNA_property_boolean_set_array(&itemptr, iprop, tmparray); - break; - } - case PROP_INT: - { - for (j = 0; j < itemlen; j++, a++) - RAW_GET(int, ((int *)tmparray)[j], in, a); - RNA_property_int_set_array(&itemptr, iprop, tmparray); - break; - } - case PROP_FLOAT: - { - for (j = 0; j < itemlen; j++, a++) - RAW_GET(float, ((float *)tmparray)[j], in, a); - RNA_property_float_set_array(&itemptr, iprop, tmparray); - break; - } - default: - break; - } - } - else { - switch (itemtype) { - case PROP_BOOLEAN: - { - RNA_property_boolean_get_array(&itemptr, iprop, tmparray); - for (j = 0; j < itemlen; j++, a++) - RAW_SET(int, in, a, ((bool *)tmparray)[j]); - break; - } - case PROP_INT: - { - RNA_property_int_get_array(&itemptr, iprop, tmparray); - for (j = 0; j < itemlen; j++, a++) - RAW_SET(int, in, a, ((int *)tmparray)[j]); - break; - } - case PROP_FLOAT: - { - RNA_property_float_get_array(&itemptr, iprop, tmparray); - for (j = 0; j < itemlen; j++, a++) - RAW_SET(float, in, a, ((float *)tmparray)[j]); - break; - } - default: - break; - } - } - } - else { - if (set) { - switch (itemtype) { - case PROP_BOOLEAN: - { - RNA_property_boolean_set_array(&itemptr, iprop, &((bool *)in.array)[a]); - a += itemlen; - break; - } - case PROP_INT: - { - RNA_property_int_set_array(&itemptr, iprop, &((int *)in.array)[a]); - a += itemlen; - break; - } - case PROP_FLOAT: - { - RNA_property_float_set_array(&itemptr, iprop, &((float *)in.array)[a]); - a += itemlen; - break; - } - default: - break; - } - } - else { - switch (itemtype) { - case PROP_BOOLEAN: - { - RNA_property_boolean_get_array(&itemptr, iprop, &((bool *)in.array)[a]); - a += itemlen; - break; - } - case PROP_INT: - { - RNA_property_int_get_array(&itemptr, iprop, &((int *)in.array)[a]); - a += itemlen; - break; - } - case PROP_FLOAT: - { - RNA_property_float_get_array(&itemptr, iprop, &((float *)in.array)[a]); - a += itemlen; - break; - } - default: - break; - } - } - } - } - } - } - RNA_PROP_END; - - if (tmparray) - MEM_freeN(tmparray); - - return !err; - } + int i, len[RNA_MAX_ARRAY_DIMENSION]; + const int dim = RNA_property_array_dimension(ptr, prop, len); + int size; + + if (dim == 0) + return 0; + + for (size = 1, i = 0; i < dim; i++) + size *= len[i]; + + return size; +} + +static int rna_raw_access(ReportList *reports, + PointerRNA *ptr, + PropertyRNA *prop, + const char *propname, + void *inarray, + RawPropertyType intype, + int inlen, + int set) +{ + StructRNA *ptype; + PointerRNA itemptr_base; + PropertyRNA *itemprop, *iprop; + PropertyType itemtype = 0; + RawArray in; + int itemlen = 0; + + /* initialize in array, stride assumed 0 in following code */ + in.array = inarray; + in.type = intype; + in.len = inlen; + in.stride = 0; + + ptype = RNA_property_pointer_type(ptr, prop); + + /* try to get item property pointer */ + RNA_pointer_create(NULL, ptype, NULL, &itemptr_base); + itemprop = RNA_struct_find_property(&itemptr_base, propname); + + if (itemprop) { + /* we have item property pointer */ + RawArray out; + + /* check type */ + itemtype = RNA_property_type(itemprop); + + if (!ELEM(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) { + BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported"); + return 0; + } + + /* check item array */ + itemlen = RNA_property_array_length(&itemptr_base, itemprop); + + /* dynamic array? need to get length per item */ + if (itemprop->getlength) { + itemprop = NULL; + } + /* try to access as raw array */ + else if (RNA_property_collection_raw_array(ptr, prop, itemprop, &out)) { + int arraylen = (itemlen == 0) ? 1 : itemlen; + if (in.len != arraylen * out.len) { + BKE_reportf(reports, + RPT_ERROR, + "Array length mismatch (expected %d, got %d)", + out.len * arraylen, + in.len); + return 0; + } + + /* matching raw types */ + if (out.type == in.type) { + void *inp = in.array; + void *outp = out.array; + int a, size; + + size = RNA_raw_type_sizeof(out.type) * arraylen; + + for (a = 0; a < out.len; a++) { + if (set) + memcpy(outp, inp, size); + else + memcpy(inp, outp, size); + + inp = (char *)inp + size; + outp = (char *)outp + out.stride; + } + + return 1; + } + + /* could also be faster with non-matching types, + * for now we just do slower loop .. */ + } + } + + { + void *tmparray = NULL; + int tmplen = 0; + int err = 0, j, a = 0; + int needconv = 1; + + if (((itemtype == PROP_INT) && (in.type == PROP_RAW_INT)) || + ((itemtype == PROP_BOOLEAN) && (in.type == PROP_RAW_BOOLEAN)) || + ((itemtype == PROP_FLOAT) && (in.type == PROP_RAW_FLOAT))) { + /* avoid creating temporary buffer if the data type match */ + needconv = 0; + } + /* no item property pointer, can still be id property, or + * property of a type derived from the collection pointer type */ + RNA_PROP_BEGIN (ptr, itemptr, prop) { + if (itemptr.data) { + if (itemprop) { + /* we got the property already */ + iprop = itemprop; + } + else { + /* not yet, look it up and verify if it is valid */ + iprop = RNA_struct_find_property(&itemptr, propname); + + if (iprop) { + itemlen = rna_property_array_length_all_dimensions(&itemptr, iprop); + itemtype = RNA_property_type(iprop); + } + else { + BKE_reportf(reports, RPT_ERROR, "Property named '%s' not found", propname); + err = 1; + break; + } + + if (!ELEM(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) { + BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported"); + err = 1; + break; + } + } + + /* editable check */ + if (!set || RNA_property_editable(&itemptr, iprop)) { + if (a + itemlen > in.len) { + BKE_reportf( + reports, RPT_ERROR, "Array length mismatch (got %d, expected more)", in.len); + err = 1; + break; + } + + if (itemlen == 0) { + /* handle conversions */ + if (set) { + switch (itemtype) { + case PROP_BOOLEAN: { + int b; + RAW_GET(bool, b, in, a); + RNA_property_boolean_set(&itemptr, iprop, b); + break; + } + case PROP_INT: { + int i; + RAW_GET(int, i, in, a); + RNA_property_int_set(&itemptr, iprop, i); + break; + } + case PROP_FLOAT: { + float f; + RAW_GET(float, f, in, a); + RNA_property_float_set(&itemptr, iprop, f); + break; + } + default: + break; + } + } + else { + switch (itemtype) { + case PROP_BOOLEAN: { + int b = RNA_property_boolean_get(&itemptr, iprop); + RAW_SET(bool, in, a, b); + break; + } + case PROP_INT: { + int i = RNA_property_int_get(&itemptr, iprop); + RAW_SET(int, in, a, i); + break; + } + case PROP_FLOAT: { + float f = RNA_property_float_get(&itemptr, iprop); + RAW_SET(float, in, a, f); + break; + } + default: + break; + } + } + a++; + } + else if (needconv == 1) { + /* allocate temporary array if needed */ + if (tmparray && tmplen != itemlen) { + MEM_freeN(tmparray); + tmparray = NULL; + } + if (!tmparray) { + tmparray = MEM_callocN(sizeof(float) * itemlen, "RNA tmparray"); + tmplen = itemlen; + } + + /* handle conversions */ + if (set) { + switch (itemtype) { + case PROP_BOOLEAN: { + for (j = 0; j < itemlen; j++, a++) + RAW_GET(bool, ((bool *)tmparray)[j], in, a); + RNA_property_boolean_set_array(&itemptr, iprop, tmparray); + break; + } + case PROP_INT: { + for (j = 0; j < itemlen; j++, a++) + RAW_GET(int, ((int *)tmparray)[j], in, a); + RNA_property_int_set_array(&itemptr, iprop, tmparray); + break; + } + case PROP_FLOAT: { + for (j = 0; j < itemlen; j++, a++) + RAW_GET(float, ((float *)tmparray)[j], in, a); + RNA_property_float_set_array(&itemptr, iprop, tmparray); + break; + } + default: + break; + } + } + else { + switch (itemtype) { + case PROP_BOOLEAN: { + RNA_property_boolean_get_array(&itemptr, iprop, tmparray); + for (j = 0; j < itemlen; j++, a++) + RAW_SET(int, in, a, ((bool *)tmparray)[j]); + break; + } + case PROP_INT: { + RNA_property_int_get_array(&itemptr, iprop, tmparray); + for (j = 0; j < itemlen; j++, a++) + RAW_SET(int, in, a, ((int *)tmparray)[j]); + break; + } + case PROP_FLOAT: { + RNA_property_float_get_array(&itemptr, iprop, tmparray); + for (j = 0; j < itemlen; j++, a++) + RAW_SET(float, in, a, ((float *)tmparray)[j]); + break; + } + default: + break; + } + } + } + else { + if (set) { + switch (itemtype) { + case PROP_BOOLEAN: { + RNA_property_boolean_set_array(&itemptr, iprop, &((bool *)in.array)[a]); + a += itemlen; + break; + } + case PROP_INT: { + RNA_property_int_set_array(&itemptr, iprop, &((int *)in.array)[a]); + a += itemlen; + break; + } + case PROP_FLOAT: { + RNA_property_float_set_array(&itemptr, iprop, &((float *)in.array)[a]); + a += itemlen; + break; + } + default: + break; + } + } + else { + switch (itemtype) { + case PROP_BOOLEAN: { + RNA_property_boolean_get_array(&itemptr, iprop, &((bool *)in.array)[a]); + a += itemlen; + break; + } + case PROP_INT: { + RNA_property_int_get_array(&itemptr, iprop, &((int *)in.array)[a]); + a += itemlen; + break; + } + case PROP_FLOAT: { + RNA_property_float_get_array(&itemptr, iprop, &((float *)in.array)[a]); + a += itemlen; + break; + } + default: + break; + } + } + } + } + } + } + RNA_PROP_END; + + if (tmparray) + MEM_freeN(tmparray); + + return !err; + } } RawPropertyType RNA_property_raw_type(PropertyRNA *prop) { - if (prop->rawtype == PROP_RAW_UNSET) { - /* this property has no raw access, yet we try to provide a raw type to help building the array */ - switch (prop->type) { - case PROP_BOOLEAN: - return PROP_RAW_BOOLEAN; - case PROP_INT: - return PROP_RAW_INT; - case PROP_FLOAT: - return PROP_RAW_FLOAT; - case PROP_ENUM: - return PROP_RAW_INT; - default: - break; - } - } - return prop->rawtype; -} - -int RNA_property_collection_raw_get(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, - void *array, RawPropertyType type, int len) -{ - return rna_raw_access(reports, ptr, prop, propname, array, type, len, 0); -} - -int RNA_property_collection_raw_set(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, - void *array, RawPropertyType type, int len) -{ - return rna_raw_access(reports, ptr, prop, propname, array, type, len, 1); + if (prop->rawtype == PROP_RAW_UNSET) { + /* this property has no raw access, yet we try to provide a raw type to help building the array */ + switch (prop->type) { + case PROP_BOOLEAN: + return PROP_RAW_BOOLEAN; + case PROP_INT: + return PROP_RAW_INT; + case PROP_FLOAT: + return PROP_RAW_FLOAT; + case PROP_ENUM: + return PROP_RAW_INT; + default: + break; + } + } + return prop->rawtype; +} + +int RNA_property_collection_raw_get(ReportList *reports, + PointerRNA *ptr, + PropertyRNA *prop, + const char *propname, + void *array, + RawPropertyType type, + int len) +{ + return rna_raw_access(reports, ptr, prop, propname, array, type, len, 0); +} + +int RNA_property_collection_raw_set(ReportList *reports, + PointerRNA *ptr, + PropertyRNA *prop, + const char *propname, + void *array, + RawPropertyType type, + int len) +{ + return rna_raw_access(reports, ptr, prop, propname, array, type, len, 1); } /* Standard iterator functions */ -void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb, IteratorSkipFunc skip) +void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, + ListBase *lb, + IteratorSkipFunc skip) { - ListBaseIterator *internal = &iter->internal.listbase; + ListBaseIterator *internal = &iter->internal.listbase; - internal->link = (lb) ? lb->first : NULL; - internal->skip = skip; + internal->link = (lb) ? lb->first : NULL; + internal->skip = skip; - iter->valid = (internal->link != NULL); + iter->valid = (internal->link != NULL); - if (skip && iter->valid && skip(iter, internal->link)) - rna_iterator_listbase_next(iter); + if (skip && iter->valid && skip(iter, internal->link)) + rna_iterator_listbase_next(iter); } void rna_iterator_listbase_next(CollectionPropertyIterator *iter) { - ListBaseIterator *internal = &iter->internal.listbase; + ListBaseIterator *internal = &iter->internal.listbase; - if (internal->skip) { - do { - internal->link = internal->link->next; - iter->valid = (internal->link != NULL); - } while (iter->valid && internal->skip(iter, internal->link)); - } - else { - internal->link = internal->link->next; - iter->valid = (internal->link != NULL); - } + if (internal->skip) { + do { + internal->link = internal->link->next; + iter->valid = (internal->link != NULL); + } while (iter->valid && internal->skip(iter, internal->link)); + } + else { + internal->link = internal->link->next; + iter->valid = (internal->link != NULL); + } } void *rna_iterator_listbase_get(CollectionPropertyIterator *iter) { - ListBaseIterator *internal = &iter->internal.listbase; + ListBaseIterator *internal = &iter->internal.listbase; - return internal->link; + return internal->link; } void rna_iterator_listbase_end(CollectionPropertyIterator *UNUSED(iter)) { } -PointerRNA rna_listbase_lookup_int(PointerRNA *ptr, StructRNA *type, struct ListBase *lb, int index) +PointerRNA rna_listbase_lookup_int(PointerRNA *ptr, + StructRNA *type, + struct ListBase *lb, + int index) { - void *data = BLI_findlink(lb, index); - return rna_pointer_inherit_refine(ptr, type, data); + void *data = BLI_findlink(lb, index); + return rna_pointer_inherit_refine(ptr, type, data); } -void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, - bool free_ptr, IteratorSkipFunc skip) +void rna_iterator_array_begin(CollectionPropertyIterator *iter, + void *ptr, + int itemsize, + int length, + bool free_ptr, + IteratorSkipFunc skip) { - ArrayIterator *internal; + ArrayIterator *internal; - if (ptr == NULL) - length = 0; - else if (length == 0) { - ptr = NULL; - itemsize = 0; - } + if (ptr == NULL) + length = 0; + else if (length == 0) { + ptr = NULL; + itemsize = 0; + } - internal = &iter->internal.array; - internal->ptr = ptr; - internal->free_ptr = free_ptr ? ptr : NULL; - internal->endptr = ((char *)ptr) + length * itemsize; - internal->itemsize = itemsize; - internal->skip = skip; - internal->length = length; + internal = &iter->internal.array; + internal->ptr = ptr; + internal->free_ptr = free_ptr ? ptr : NULL; + internal->endptr = ((char *)ptr) + length * itemsize; + internal->itemsize = itemsize; + internal->skip = skip; + internal->length = length; - iter->valid = (internal->ptr != internal->endptr); + iter->valid = (internal->ptr != internal->endptr); - if (skip && iter->valid && skip(iter, internal->ptr)) - rna_iterator_array_next(iter); + if (skip && iter->valid && skip(iter, internal->ptr)) + rna_iterator_array_next(iter); } void rna_iterator_array_next(CollectionPropertyIterator *iter) { - ArrayIterator *internal = &iter->internal.array; + ArrayIterator *internal = &iter->internal.array; - if (internal->skip) { - do { - internal->ptr += internal->itemsize; - iter->valid = (internal->ptr != internal->endptr); - } while (iter->valid && internal->skip(iter, internal->ptr)); - } - else { - internal->ptr += internal->itemsize; - iter->valid = (internal->ptr != internal->endptr); - } + if (internal->skip) { + do { + internal->ptr += internal->itemsize; + iter->valid = (internal->ptr != internal->endptr); + } while (iter->valid && internal->skip(iter, internal->ptr)); + } + else { + internal->ptr += internal->itemsize; + iter->valid = (internal->ptr != internal->endptr); + } } void *rna_iterator_array_get(CollectionPropertyIterator *iter) { - ArrayIterator *internal = &iter->internal.array; + ArrayIterator *internal = &iter->internal.array; - return internal->ptr; + return internal->ptr; } void *rna_iterator_array_dereference_get(CollectionPropertyIterator *iter) { - ArrayIterator *internal = &iter->internal.array; + ArrayIterator *internal = &iter->internal.array; - /* for ** arrays */ - return *(void **)(internal->ptr); + /* for ** arrays */ + return *(void **)(internal->ptr); } void rna_iterator_array_end(CollectionPropertyIterator *iter) { - ArrayIterator *internal = &iter->internal.array; + ArrayIterator *internal = &iter->internal.array; - if (internal->free_ptr) { - MEM_freeN(internal->free_ptr); - internal->free_ptr = NULL; - } + if (internal->free_ptr) { + MEM_freeN(internal->free_ptr); + internal->free_ptr = NULL; + } } -PointerRNA rna_array_lookup_int(PointerRNA *ptr, StructRNA *type, void *data, int itemsize, int length, int index) +PointerRNA rna_array_lookup_int( + PointerRNA *ptr, StructRNA *type, void *data, int itemsize, int length, int index) { - if (index < 0 || index >= length) - return PointerRNA_NULL; + if (index < 0 || index >= length) + return PointerRNA_NULL; - return rna_pointer_inherit_refine(ptr, type, ((char *)data) + index * itemsize); + return rna_pointer_inherit_refine(ptr, type, ((char *)data) + index * itemsize); } /* RNA Path - Experiment */ static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int bracket) { - const char *p; - char *buf; - char quote = '\0'; - int i, j, len, escape; - - len = 0; - - if (bracket) { - /* get data between [], check escaping ] with \] */ - if (**path == '[') (*path)++; - else return NULL; - - p = *path; - - /* 2 kinds of lookups now, quoted or unquoted */ - quote = *p; - - if (quote != '"') /* " - this comment is hack for Aligorith's text editor's sanity */ - quote = 0; - - if (quote == 0) { - while (*p && (*p != ']')) { - len++; - p++; - } - } - else { - escape = 0; - /* skip the first quote */ - len++; - p++; - while (*p && (*p != quote || escape)) { - escape = (*p == '\\'); - len++; - p++; - } - - /* skip the last quoted char to get the ']' */ - len++; - p++; - } - - if (*p != ']') return NULL; - } - else { - /* get data until . or [ */ - p = *path; - - while (*p && *p != '.' && *p != '[') { - len++; - p++; - } - } - - /* empty, return */ - if (len == 0) - return NULL; - - /* try to use fixed buffer if possible */ - if (len + 1 < fixedlen) - buf = fixedbuf; - else - buf = MEM_mallocN(sizeof(char) * (len + 1), "rna_path_token"); - - /* copy string, taking into account escaped ] */ - if (bracket) { - for (p = *path, i = 0, j = 0; i < len; i++, p++) { - if (*p == '\\' && *(p + 1) == quote) {} - else buf[j++] = *p; - } - - buf[j] = 0; - } - else { - memcpy(buf, *path, sizeof(char) * len); - buf[len] = '\0'; - } - - /* set path to start of next token */ - if (*p == ']') p++; - if (*p == '.') p++; - *path = p; - - return buf; + const char *p; + char *buf; + char quote = '\0'; + int i, j, len, escape; + + len = 0; + + if (bracket) { + /* get data between [], check escaping ] with \] */ + if (**path == '[') + (*path)++; + else + return NULL; + + p = *path; + + /* 2 kinds of lookups now, quoted or unquoted */ + quote = *p; + + if (quote != '"') /* " - this comment is hack for Aligorith's text editor's sanity */ + quote = 0; + + if (quote == 0) { + while (*p && (*p != ']')) { + len++; + p++; + } + } + else { + escape = 0; + /* skip the first quote */ + len++; + p++; + while (*p && (*p != quote || escape)) { + escape = (*p == '\\'); + len++; + p++; + } + + /* skip the last quoted char to get the ']' */ + len++; + p++; + } + + if (*p != ']') + return NULL; + } + else { + /* get data until . or [ */ + p = *path; + + while (*p && *p != '.' && *p != '[') { + len++; + p++; + } + } + + /* empty, return */ + if (len == 0) + return NULL; + + /* try to use fixed buffer if possible */ + if (len + 1 < fixedlen) + buf = fixedbuf; + else + buf = MEM_mallocN(sizeof(char) * (len + 1), "rna_path_token"); + + /* copy string, taking into account escaped ] */ + if (bracket) { + for (p = *path, i = 0, j = 0; i < len; i++, p++) { + if (*p == '\\' && *(p + 1) == quote) { + } + else + buf[j++] = *p; + } + + buf[j] = 0; + } + else { + memcpy(buf, *path, sizeof(char) * len); + buf[len] = '\0'; + } + + /* set path to start of next token */ + if (*p == ']') + p++; + if (*p == '.') + p++; + *path = p; + + return buf; } static int rna_token_strip_quotes(char *token) { - if (token[0] == '"') { - int len = strlen(token); - if (len >= 2 && token[len - 1] == '"') { - /* strip away "" */ - token[len - 1] = '\0'; - return 1; - } - } - return 0; -} - -static bool rna_path_parse_collection_key(const char **path, PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_nextptr) -{ - char fixedbuf[256]; - int intkey; - - *r_nextptr = *ptr; - - /* end of path, ok */ - if (!(**path)) - return true; - - if (**path == '[') { - char *token; - - /* resolve the lookup with [] brackets */ - token = rna_path_token(path, fixedbuf, sizeof(fixedbuf), 1); - - if (!token) - return false; - - /* check for "" to see if it is a string */ - if (rna_token_strip_quotes(token)) { - if (RNA_property_collection_lookup_string(ptr, prop, token + 1, r_nextptr)) { - /* pass */ - } - else { - r_nextptr->data = NULL; - } - } - else { - /* otherwise do int lookup */ - intkey = atoi(token); - if (intkey == 0 && (token[0] != '0' || token[1] != '\0')) { - return false; /* we can be sure the fixedbuf was used in this case */ - } - if (RNA_property_collection_lookup_int(ptr, prop, intkey, r_nextptr)) { - /* pass */ - } - else { - r_nextptr->data = NULL; - } - } - - if (token != fixedbuf) { - MEM_freeN(token); - } - } - else { - if (RNA_property_collection_type_get(ptr, prop, r_nextptr)) { - /* pass */ - } - else { - /* ensure we quit on invalid values */ - r_nextptr->data = NULL; - } - } - - return true; -} - -static bool rna_path_parse_array_index(const char **path, PointerRNA *ptr, PropertyRNA *prop, int *r_index) -{ - char fixedbuf[256]; - int index_arr[RNA_MAX_ARRAY_DIMENSION] = {0}; - int len[RNA_MAX_ARRAY_DIMENSION]; - const int dim = RNA_property_array_dimension(ptr, prop, len); - int i; - - *r_index = -1; - - /* end of path, ok */ - if (!(**path)) - return true; - - for (i = 0; i < dim; i++) { - int temp_index = -1; - char *token; - - /* multi index resolve */ - if (**path == '[') { - token = rna_path_token(path, fixedbuf, sizeof(fixedbuf), 1); - - if (token == NULL) { - /* invalid syntax blah[] */ - return false; - } - /* check for "" to see if it is a string */ - else if (rna_token_strip_quotes(token)) { - temp_index = RNA_property_array_item_index(prop, *(token + 1)); - } - else { - /* otherwise do int lookup */ - temp_index = atoi(token); - - if (temp_index == 0 && (token[0] != '0' || token[1] != '\0')) { - if (token != fixedbuf) { - MEM_freeN(token); - } - - return false; - } - } - } - else if (dim == 1) { - /* location.x || scale.X, single dimension arrays only */ - token = rna_path_token(path, fixedbuf, sizeof(fixedbuf), 0); - if (token == NULL) { - /* invalid syntax blah.. */ - return false; - } - temp_index = RNA_property_array_item_index(prop, *token); - } - else { - /* just to avoid uninitialized pointer use */ - token = fixedbuf; - } - - if (token != fixedbuf) { - MEM_freeN(token); - } - - /* out of range */ - if (temp_index < 0 || temp_index >= len[i]) - return false; - - index_arr[i] = temp_index; - /* end multi index resolve */ - } - - /* arrays always contain numbers so further values are not valid */ - if (**path) - return false; - - /* flatten index over all dimensions */ - { - int totdim = 1; - int flat_index = 0; - - for (i = dim - 1; i >= 0; i--) { - flat_index += index_arr[i] * totdim; - totdim *= len[i]; - } - - *r_index = flat_index; - } - return true; + if (token[0] == '"') { + int len = strlen(token); + if (len >= 2 && token[len - 1] == '"') { + /* strip away "" */ + token[len - 1] = '\0'; + return 1; + } + } + return 0; +} + +static bool rna_path_parse_collection_key(const char **path, + PointerRNA *ptr, + PropertyRNA *prop, + PointerRNA *r_nextptr) +{ + char fixedbuf[256]; + int intkey; + + *r_nextptr = *ptr; + + /* end of path, ok */ + if (!(**path)) + return true; + + if (**path == '[') { + char *token; + + /* resolve the lookup with [] brackets */ + token = rna_path_token(path, fixedbuf, sizeof(fixedbuf), 1); + + if (!token) + return false; + + /* check for "" to see if it is a string */ + if (rna_token_strip_quotes(token)) { + if (RNA_property_collection_lookup_string(ptr, prop, token + 1, r_nextptr)) { + /* pass */ + } + else { + r_nextptr->data = NULL; + } + } + else { + /* otherwise do int lookup */ + intkey = atoi(token); + if (intkey == 0 && (token[0] != '0' || token[1] != '\0')) { + return false; /* we can be sure the fixedbuf was used in this case */ + } + if (RNA_property_collection_lookup_int(ptr, prop, intkey, r_nextptr)) { + /* pass */ + } + else { + r_nextptr->data = NULL; + } + } + + if (token != fixedbuf) { + MEM_freeN(token); + } + } + else { + if (RNA_property_collection_type_get(ptr, prop, r_nextptr)) { + /* pass */ + } + else { + /* ensure we quit on invalid values */ + r_nextptr->data = NULL; + } + } + + return true; +} + +static bool rna_path_parse_array_index(const char **path, + PointerRNA *ptr, + PropertyRNA *prop, + int *r_index) +{ + char fixedbuf[256]; + int index_arr[RNA_MAX_ARRAY_DIMENSION] = {0}; + int len[RNA_MAX_ARRAY_DIMENSION]; + const int dim = RNA_property_array_dimension(ptr, prop, len); + int i; + + *r_index = -1; + + /* end of path, ok */ + if (!(**path)) + return true; + + for (i = 0; i < dim; i++) { + int temp_index = -1; + char *token; + + /* multi index resolve */ + if (**path == '[') { + token = rna_path_token(path, fixedbuf, sizeof(fixedbuf), 1); + + if (token == NULL) { + /* invalid syntax blah[] */ + return false; + } + /* check for "" to see if it is a string */ + else if (rna_token_strip_quotes(token)) { + temp_index = RNA_property_array_item_index(prop, *(token + 1)); + } + else { + /* otherwise do int lookup */ + temp_index = atoi(token); + + if (temp_index == 0 && (token[0] != '0' || token[1] != '\0')) { + if (token != fixedbuf) { + MEM_freeN(token); + } + + return false; + } + } + } + else if (dim == 1) { + /* location.x || scale.X, single dimension arrays only */ + token = rna_path_token(path, fixedbuf, sizeof(fixedbuf), 0); + if (token == NULL) { + /* invalid syntax blah.. */ + return false; + } + temp_index = RNA_property_array_item_index(prop, *token); + } + else { + /* just to avoid uninitialized pointer use */ + token = fixedbuf; + } + + if (token != fixedbuf) { + MEM_freeN(token); + } + + /* out of range */ + if (temp_index < 0 || temp_index >= len[i]) + return false; + + index_arr[i] = temp_index; + /* end multi index resolve */ + } + + /* arrays always contain numbers so further values are not valid */ + if (**path) + return false; + + /* flatten index over all dimensions */ + { + int totdim = 1; + int flat_index = 0; + + for (i = dim - 1; i >= 0; i--) { + flat_index += index_arr[i] * totdim; + totdim *= len[i]; + } + + *r_index = flat_index; + } + return true; } /** @@ -4822,153 +4963,158 @@ static bool rna_path_parse_array_index(const char **path, PointerRNA *ptr, Prope * Mutually exclusive with \a r_item_ptr. * \return \a true on success, \a false if the path is somehow invalid. */ -static bool rna_path_parse(PointerRNA *ptr, const char *path, - PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index, - PointerRNA *r_item_ptr, ListBase *r_elements, +static bool rna_path_parse(PointerRNA *ptr, + const char *path, + PointerRNA *r_ptr, + PropertyRNA **r_prop, + int *r_index, + PointerRNA *r_item_ptr, + ListBase *r_elements, const bool eval_pointer) { - BLI_assert(r_item_ptr == NULL || !eval_pointer); - PropertyRNA *prop; - PointerRNA curptr, nextptr; - PropertyElemRNA *prop_elem = NULL; - int index = -1; - char fixedbuf[256]; - int type; - const bool do_item_ptr = r_item_ptr != NULL && !eval_pointer; - - if (do_item_ptr) { - RNA_POINTER_INVALIDATE(&nextptr); - } - - prop = NULL; - curptr = *ptr; - - if (path == NULL || *path == '\0') - return false; - - while (*path) { - if (do_item_ptr) { - RNA_POINTER_INVALIDATE(&nextptr); - } - - int use_id_prop = (*path == '[') ? 1 : 0; - char *token; - /* custom property lookup ? - * C.object["someprop"] - */ - - if (!curptr.data) { - return false; - } - - /* look up property name in current struct */ - token = rna_path_token(&path, fixedbuf, sizeof(fixedbuf), use_id_prop); - - if (!token) { - return false; - } - - prop = NULL; - if (use_id_prop) { /* look up property name in current struct */ - IDProperty *group = RNA_struct_idprops(&curptr, 0); - if (group && rna_token_strip_quotes(token)) - prop = (PropertyRNA *)IDP_GetPropertyFromGroup(group, token + 1); - } - else { - prop = RNA_struct_find_property(&curptr, token); - } - - if (token != fixedbuf) { - MEM_freeN(token); - } - - if (!prop) { - return false; - } - - if (r_elements) { - prop_elem = MEM_mallocN(sizeof(PropertyElemRNA), __func__); - prop_elem->ptr = curptr; - prop_elem->prop = prop; - prop_elem->index = -1; /* index will be added later, if needed. */ - BLI_addtail(r_elements, prop_elem); - } - - type = RNA_property_type(prop); - - /* now look up the value of this property if it is a pointer or - * collection, otherwise return the property rna so that the - * caller can read the value of the property itself */ - switch (type) { - case PROP_POINTER: { - /* resolve pointer if further path elements follow - * or explicitly requested - */ - if (do_item_ptr || eval_pointer || *path != '\0') { - nextptr = RNA_property_pointer_get(&curptr, prop); - } - - if (eval_pointer || *path != '\0') { - curptr = nextptr; - prop = NULL; /* now we have a PointerRNA, the prop is our parent so forget it */ - index = -1; - } - break; - } - case PROP_COLLECTION: { - /* Resolve pointer if further path elements follow. - * Note that if path is empty, rna_path_parse_collection_key will do nothing anyway, - * so do_item_ptr is of no use in that case. - */ - if (*path) { - if (!rna_path_parse_collection_key(&path, &curptr, prop, &nextptr)) { - return false; - } - - if (eval_pointer || *path != '\0') { - curptr = nextptr; - prop = NULL; /* now we have a PointerRNA, the prop is our parent so forget it */ - index = -1; - } - } - break; - } - default: - if (r_index || prop_elem) { - if (!rna_path_parse_array_index(&path, &curptr, prop, &index)) { - return false; - } - - if (prop_elem) { - prop_elem->index = index; - } - } - break; - } - } - - if (r_ptr) { - *r_ptr = curptr; - } - if (r_prop) { - *r_prop = prop; - } - if (r_index) { - *r_index = index; - } - if (r_item_ptr && do_item_ptr) { - *r_item_ptr = nextptr; - } - - if (prop_elem && (prop_elem->ptr.data != curptr.data || prop_elem->prop != prop || prop_elem->index != index)) { - prop_elem = MEM_mallocN(sizeof(PropertyElemRNA), __func__); - prop_elem->ptr = curptr; - prop_elem->prop = prop; - prop_elem->index = index; - BLI_addtail(r_elements, prop_elem); - } - - return true; + BLI_assert(r_item_ptr == NULL || !eval_pointer); + PropertyRNA *prop; + PointerRNA curptr, nextptr; + PropertyElemRNA *prop_elem = NULL; + int index = -1; + char fixedbuf[256]; + int type; + const bool do_item_ptr = r_item_ptr != NULL && !eval_pointer; + + if (do_item_ptr) { + RNA_POINTER_INVALIDATE(&nextptr); + } + + prop = NULL; + curptr = *ptr; + + if (path == NULL || *path == '\0') + return false; + + while (*path) { + if (do_item_ptr) { + RNA_POINTER_INVALIDATE(&nextptr); + } + + int use_id_prop = (*path == '[') ? 1 : 0; + char *token; + /* custom property lookup ? + * C.object["someprop"] + */ + + if (!curptr.data) { + return false; + } + + /* look up property name in current struct */ + token = rna_path_token(&path, fixedbuf, sizeof(fixedbuf), use_id_prop); + + if (!token) { + return false; + } + + prop = NULL; + if (use_id_prop) { /* look up property name in current struct */ + IDProperty *group = RNA_struct_idprops(&curptr, 0); + if (group && rna_token_strip_quotes(token)) + prop = (PropertyRNA *)IDP_GetPropertyFromGroup(group, token + 1); + } + else { + prop = RNA_struct_find_property(&curptr, token); + } + + if (token != fixedbuf) { + MEM_freeN(token); + } + + if (!prop) { + return false; + } + + if (r_elements) { + prop_elem = MEM_mallocN(sizeof(PropertyElemRNA), __func__); + prop_elem->ptr = curptr; + prop_elem->prop = prop; + prop_elem->index = -1; /* index will be added later, if needed. */ + BLI_addtail(r_elements, prop_elem); + } + + type = RNA_property_type(prop); + + /* now look up the value of this property if it is a pointer or + * collection, otherwise return the property rna so that the + * caller can read the value of the property itself */ + switch (type) { + case PROP_POINTER: { + /* resolve pointer if further path elements follow + * or explicitly requested + */ + if (do_item_ptr || eval_pointer || *path != '\0') { + nextptr = RNA_property_pointer_get(&curptr, prop); + } + + if (eval_pointer || *path != '\0') { + curptr = nextptr; + prop = NULL; /* now we have a PointerRNA, the prop is our parent so forget it */ + index = -1; + } + break; + } + case PROP_COLLECTION: { + /* Resolve pointer if further path elements follow. + * Note that if path is empty, rna_path_parse_collection_key will do nothing anyway, + * so do_item_ptr is of no use in that case. + */ + if (*path) { + if (!rna_path_parse_collection_key(&path, &curptr, prop, &nextptr)) { + return false; + } + + if (eval_pointer || *path != '\0') { + curptr = nextptr; + prop = NULL; /* now we have a PointerRNA, the prop is our parent so forget it */ + index = -1; + } + } + break; + } + default: + if (r_index || prop_elem) { + if (!rna_path_parse_array_index(&path, &curptr, prop, &index)) { + return false; + } + + if (prop_elem) { + prop_elem->index = index; + } + } + break; + } + } + + if (r_ptr) { + *r_ptr = curptr; + } + if (r_prop) { + *r_prop = prop; + } + if (r_index) { + *r_index = index; + } + if (r_item_ptr && do_item_ptr) { + *r_item_ptr = nextptr; + } + + if (prop_elem && (prop_elem->ptr.data != curptr.data || prop_elem->prop != prop || + prop_elem->index != index)) { + prop_elem = MEM_mallocN(sizeof(PropertyElemRNA), __func__); + prop_elem->ptr = curptr; + prop_elem->prop = prop; + prop_elem->index = index; + BLI_addtail(r_elements, prop_elem); + } + + return true; } /** @@ -4979,10 +5125,10 @@ static bool rna_path_parse(PointerRNA *ptr, const char *path, */ bool RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop) { - if (!rna_path_parse(ptr, path, r_ptr, r_prop, NULL, NULL, NULL, true)) - return false; + if (!rna_path_parse(ptr, path, r_ptr, r_prop, NULL, NULL, NULL, true)) + return false; - return r_ptr->data != NULL; + return r_ptr->data != NULL; } /** @@ -4991,12 +5137,13 @@ bool RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, Prop * \note Assumes all pointers provided are valid. * \return True if path can be resolved to a valid "pointer + property" OR "pointer only" */ -bool RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index) +bool RNA_path_resolve_full( + PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index) { - if (!rna_path_parse(ptr, path, r_ptr, r_prop, r_index, NULL, NULL, true)) - return false; + if (!rna_path_parse(ptr, path, r_ptr, r_prop, r_index, NULL, NULL, true)) + return false; - return r_ptr->data != NULL; + return r_ptr->data != NULL; } /** @@ -5006,13 +5153,16 @@ bool RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, * \note Assumes all pointers provided are valid * \return True only if both a valid pointer and property are found after resolving the path */ -bool RNA_path_resolve_property(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop) +bool RNA_path_resolve_property(PointerRNA *ptr, + const char *path, + PointerRNA *r_ptr, + PropertyRNA **r_prop) { - if (!rna_path_parse(ptr, path, r_ptr, r_prop, NULL, NULL, NULL, false)) { - return false; - } + if (!rna_path_parse(ptr, path, r_ptr, r_prop, NULL, NULL, NULL, false)) { + return false; + } - return r_ptr->data != NULL && *r_prop != NULL; + return r_ptr->data != NULL && *r_prop != NULL; } /** @@ -5023,12 +5173,13 @@ bool RNA_path_resolve_property(PointerRNA *ptr, const char *path, PointerRNA *r_ * \note Assumes all pointers provided are valid * \return True only if both a valid pointer and property are found after resolving the path */ -bool RNA_path_resolve_property_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index) +bool RNA_path_resolve_property_full( + PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index) { - if (!rna_path_parse(ptr, path, r_ptr, r_prop, r_index, NULL, NULL, false)) - return false; + if (!rna_path_parse(ptr, path, r_ptr, r_prop, r_index, NULL, NULL, false)) + return false; - return r_ptr->data != NULL && *r_prop != NULL; + return r_ptr->data != NULL && *r_prop != NULL; } /** @@ -5041,14 +5192,17 @@ bool RNA_path_resolve_property_full(PointerRNA *ptr, const char *path, PointerRN * \param r_item_pointer: The final Pointer or Collection item value. You must check for its validity before use! * \return True only if both a valid pointer and property are found after resolving the path */ -bool RNA_path_resolve_property_and_item_pointer( - PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, PointerRNA *r_item_ptr) +bool RNA_path_resolve_property_and_item_pointer(PointerRNA *ptr, + const char *path, + PointerRNA *r_ptr, + PropertyRNA **r_prop, + PointerRNA *r_item_ptr) { - if (!rna_path_parse(ptr, path, r_ptr, r_prop, NULL, r_item_ptr, NULL, false)) { - return false; - } + if (!rna_path_parse(ptr, path, r_ptr, r_prop, NULL, r_item_ptr, NULL, false)) { + return false; + } - return r_ptr->data != NULL && *r_prop != NULL; + return r_ptr->data != NULL && *r_prop != NULL; } /** @@ -5061,13 +5215,17 @@ bool RNA_path_resolve_property_and_item_pointer( * \param r_item_pointer: The final Pointer or Collection item value. You must check for its validity before use! * \return True only if both a valid pointer and property are found after resolving the path */ -bool RNA_path_resolve_property_and_item_pointer_full( - PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index, PointerRNA *r_item_ptr) +bool RNA_path_resolve_property_and_item_pointer_full(PointerRNA *ptr, + const char *path, + PointerRNA *r_ptr, + PropertyRNA **r_prop, + int *r_index, + PointerRNA *r_item_ptr) { - if (!rna_path_parse(ptr, path, r_ptr, r_prop, r_index, r_item_ptr, NULL, false)) - return false; + if (!rna_path_parse(ptr, path, r_ptr, r_prop, r_index, r_item_ptr, NULL, false)) + return false; - return r_ptr->data != NULL && *r_prop != NULL; + return r_ptr->data != NULL && *r_prop != NULL; } /** * Resolve the given RNA Path into a linked list of PropertyElemRNA's. @@ -5080,325 +5238,335 @@ bool RNA_path_resolve_property_and_item_pointer_full( */ bool RNA_path_resolve_elements(PointerRNA *ptr, const char *path, ListBase *r_elements) { - return rna_path_parse(ptr, path, NULL, NULL, NULL, NULL, r_elements, false); + return rna_path_parse(ptr, path, NULL, NULL, NULL, NULL, r_elements, false); } -char *RNA_path_append(const char *path, PointerRNA *UNUSED(ptr), PropertyRNA *prop, int intkey, const char *strkey) +char *RNA_path_append( + const char *path, PointerRNA *UNUSED(ptr), PropertyRNA *prop, int intkey, const char *strkey) { - DynStr *dynstr; - const char *s; - char appendstr[128], *result; + DynStr *dynstr; + const char *s; + char appendstr[128], *result; - dynstr = BLI_dynstr_new(); + dynstr = BLI_dynstr_new(); - /* add .identifier */ - if (path) { - BLI_dynstr_append(dynstr, path); - if (*path) - BLI_dynstr_append(dynstr, "."); - } + /* add .identifier */ + if (path) { + BLI_dynstr_append(dynstr, path); + if (*path) + BLI_dynstr_append(dynstr, "."); + } - BLI_dynstr_append(dynstr, RNA_property_identifier(prop)); + BLI_dynstr_append(dynstr, RNA_property_identifier(prop)); - if (RNA_property_type(prop) == PROP_COLLECTION) { - /* add ["strkey"] or [intkey] */ - BLI_dynstr_append(dynstr, "["); + if (RNA_property_type(prop) == PROP_COLLECTION) { + /* add ["strkey"] or [intkey] */ + BLI_dynstr_append(dynstr, "["); - if (strkey) { - BLI_dynstr_append(dynstr, "\""); - for (s = strkey; *s; s++) { - if (*s == '[') { - appendstr[0] = '\\'; - appendstr[1] = *s; - appendstr[2] = 0; - } - else { - appendstr[0] = *s; - appendstr[1] = 0; - } - BLI_dynstr_append(dynstr, appendstr); - } - BLI_dynstr_append(dynstr, "\""); - } - else { - BLI_snprintf(appendstr, sizeof(appendstr), "%d", intkey); - BLI_dynstr_append(dynstr, appendstr); - } + if (strkey) { + BLI_dynstr_append(dynstr, "\""); + for (s = strkey; *s; s++) { + if (*s == '[') { + appendstr[0] = '\\'; + appendstr[1] = *s; + appendstr[2] = 0; + } + else { + appendstr[0] = *s; + appendstr[1] = 0; + } + BLI_dynstr_append(dynstr, appendstr); + } + BLI_dynstr_append(dynstr, "\""); + } + else { + BLI_snprintf(appendstr, sizeof(appendstr), "%d", intkey); + BLI_dynstr_append(dynstr, appendstr); + } - BLI_dynstr_append(dynstr, "]"); - } + BLI_dynstr_append(dynstr, "]"); + } - result = BLI_dynstr_get_cstring(dynstr); - BLI_dynstr_free(dynstr); + result = BLI_dynstr_get_cstring(dynstr); + BLI_dynstr_free(dynstr); - return result; + return result; } char *RNA_path_back(const char *path) { - char fixedbuf[256]; - const char *previous, *current; - char *result; - int i; + char fixedbuf[256]; + const char *previous, *current; + char *result; + int i; - if (!path) - return NULL; + if (!path) + return NULL; - previous = NULL; - current = path; + previous = NULL; + current = path; - /* parse token by token until the end, then we back up to the previous - * position and strip of the next token to get the path one step back */ - while (*current) { - char *token; + /* parse token by token until the end, then we back up to the previous + * position and strip of the next token to get the path one step back */ + while (*current) { + char *token; - token = rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 0); + token = rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 0); - if (!token) - return NULL; - if (token != fixedbuf) - MEM_freeN(token); + if (!token) + return NULL; + if (token != fixedbuf) + MEM_freeN(token); - /* in case of collection we also need to strip off [] */ - token = rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 1); - if (token && token != fixedbuf) - MEM_freeN(token); + /* in case of collection we also need to strip off [] */ + token = rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 1); + if (token && token != fixedbuf) + MEM_freeN(token); - if (!*current) - break; + if (!*current) + break; - previous = current; - } + previous = current; + } - if (!previous) - return NULL; + if (!previous) + return NULL; - /* copy and strip off last token */ - i = previous - path; - result = BLI_strdup(path); + /* copy and strip off last token */ + i = previous - path; + result = BLI_strdup(path); - if (i > 0 && result[i - 1] == '.') i--; - result[i] = 0; + if (i > 0 && result[i - 1] == '.') + i--; + result[i] = 0; - return result; + return result; } /* generic path search func * if its needed this could also reference the IDProperty direct */ typedef struct IDP_Chain { - struct IDP_Chain *up; /* parent member, reverse and set to child for path conversion. */ + struct IDP_Chain *up; /* parent member, reverse and set to child for path conversion. */ - const char *name; - int index; + const char *name; + int index; } IDP_Chain; static char *rna_idp_path_create(IDP_Chain *child_link) { - DynStr *dynstr = BLI_dynstr_new(); - char *path; - bool is_first = true; - - int tot = 0; - IDP_Chain *link = child_link; - - /* reverse the list */ - IDP_Chain *link_prev; - link_prev = NULL; - while (link) { - IDP_Chain *link_next = link->up; - link->up = link_prev; - link_prev = link; - link = link_next; - tot++; - } - - for (link = link_prev; link; link = link->up) { - /* pass */ - if (link->index >= 0) { - BLI_dynstr_appendf(dynstr, is_first ? "%s[%d]" : ".%s[%d]", link->name, link->index); - } - else { - BLI_dynstr_appendf(dynstr, is_first ? "%s" : ".%s", link->name); - } - - is_first = false; - } - - path = BLI_dynstr_get_cstring(dynstr); - BLI_dynstr_free(dynstr); - - if (*path == '\0') { - MEM_freeN(path); - path = NULL; - } - - return path; -} - -static char *rna_idp_path(PointerRNA *ptr, IDProperty *haystack, IDProperty *needle, IDP_Chain *parent_link) -{ - char *path = NULL; - IDP_Chain link; - - IDProperty *iter; - int i; - - BLI_assert(haystack->type == IDP_GROUP); - - link.up = parent_link; - /* always set both name and index, - * else a stale value might get used */ - link.name = NULL; - link.index = -1; - - for (i = 0, iter = haystack->data.group.first; iter; iter = iter->next, i++) { - if (needle == iter) { /* found! */ - link.name = iter->name; - link.index = -1; - path = rna_idp_path_create(&link); - break; - } - else { - if (iter->type == IDP_GROUP) { - /* ensure this is RNA */ - PropertyRNA *prop = RNA_struct_find_property(ptr, iter->name); - if (prop && prop->type == PROP_POINTER) { - PointerRNA child_ptr = RNA_property_pointer_get(ptr, prop); - link.name = iter->name; - link.index = -1; - if ((path = rna_idp_path(&child_ptr, iter, needle, &link))) { - break; - } - } - } - else if (iter->type == IDP_IDPARRAY) { - PropertyRNA *prop = RNA_struct_find_property(ptr, iter->name); - if (prop && prop->type == PROP_COLLECTION) { - IDProperty *array = IDP_IDPArray(iter); - if (needle >= array && needle < (iter->len + array)) { /* found! */ - link.name = iter->name; - link.index = (int)(needle - array); - path = rna_idp_path_create(&link); - break; - } - else { - int j; - link.name = iter->name; - for (j = 0; j < iter->len; j++, array++) { - PointerRNA child_ptr; - if (RNA_property_collection_lookup_int(ptr, prop, j, &child_ptr)) { - link.index = j; - if ((path = rna_idp_path(&child_ptr, array, needle, &link))) { - break; - } - } - } - if (path) - break; - } - } - } - } - } - - return path; + DynStr *dynstr = BLI_dynstr_new(); + char *path; + bool is_first = true; + + int tot = 0; + IDP_Chain *link = child_link; + + /* reverse the list */ + IDP_Chain *link_prev; + link_prev = NULL; + while (link) { + IDP_Chain *link_next = link->up; + link->up = link_prev; + link_prev = link; + link = link_next; + tot++; + } + + for (link = link_prev; link; link = link->up) { + /* pass */ + if (link->index >= 0) { + BLI_dynstr_appendf(dynstr, is_first ? "%s[%d]" : ".%s[%d]", link->name, link->index); + } + else { + BLI_dynstr_appendf(dynstr, is_first ? "%s" : ".%s", link->name); + } + + is_first = false; + } + + path = BLI_dynstr_get_cstring(dynstr); + BLI_dynstr_free(dynstr); + + if (*path == '\0') { + MEM_freeN(path); + path = NULL; + } + + return path; +} + +static char *rna_idp_path(PointerRNA *ptr, + IDProperty *haystack, + IDProperty *needle, + IDP_Chain *parent_link) +{ + char *path = NULL; + IDP_Chain link; + + IDProperty *iter; + int i; + + BLI_assert(haystack->type == IDP_GROUP); + + link.up = parent_link; + /* always set both name and index, + * else a stale value might get used */ + link.name = NULL; + link.index = -1; + + for (i = 0, iter = haystack->data.group.first; iter; iter = iter->next, i++) { + if (needle == iter) { /* found! */ + link.name = iter->name; + link.index = -1; + path = rna_idp_path_create(&link); + break; + } + else { + if (iter->type == IDP_GROUP) { + /* ensure this is RNA */ + PropertyRNA *prop = RNA_struct_find_property(ptr, iter->name); + if (prop && prop->type == PROP_POINTER) { + PointerRNA child_ptr = RNA_property_pointer_get(ptr, prop); + link.name = iter->name; + link.index = -1; + if ((path = rna_idp_path(&child_ptr, iter, needle, &link))) { + break; + } + } + } + else if (iter->type == IDP_IDPARRAY) { + PropertyRNA *prop = RNA_struct_find_property(ptr, iter->name); + if (prop && prop->type == PROP_COLLECTION) { + IDProperty *array = IDP_IDPArray(iter); + if (needle >= array && needle < (iter->len + array)) { /* found! */ + link.name = iter->name; + link.index = (int)(needle - array); + path = rna_idp_path_create(&link); + break; + } + else { + int j; + link.name = iter->name; + for (j = 0; j < iter->len; j++, array++) { + PointerRNA child_ptr; + if (RNA_property_collection_lookup_int(ptr, prop, j, &child_ptr)) { + link.index = j; + if ((path = rna_idp_path(&child_ptr, array, needle, &link))) { + break; + } + } + } + if (path) + break; + } + } + } + } + } + + return path; } static char *rna_path_from_ID_to_idpgroup(PointerRNA *ptr) { - PointerRNA id_ptr; - IDProperty *haystack; - IDProperty *needle; + PointerRNA id_ptr; + IDProperty *haystack; + IDProperty *needle; - BLI_assert(ptr->id.data != NULL); + BLI_assert(ptr->id.data != NULL); - /* TODO, Support Bones/PoseBones. no pointers stored to the bones from here, only the ID. See example in [#25746] - * Unless this is added only way to find this is to also search all bones and pose bones - * of an armature or object */ - RNA_id_pointer_create(ptr->id.data, &id_ptr); + /* TODO, Support Bones/PoseBones. no pointers stored to the bones from here, only the ID. See example in [#25746] + * Unless this is added only way to find this is to also search all bones and pose bones + * of an armature or object */ + RNA_id_pointer_create(ptr->id.data, &id_ptr); - haystack = RNA_struct_idprops(&id_ptr, false); - if (haystack) { /* can fail when called on bones */ - needle = ptr->data; - return rna_idp_path(&id_ptr, haystack, needle, NULL); - } - else { - return NULL; - } + haystack = RNA_struct_idprops(&id_ptr, false); + if (haystack) { /* can fail when called on bones */ + needle = ptr->data; + return rna_idp_path(&id_ptr, haystack, needle, NULL); + } + else { + return NULL; + } } char *RNA_path_from_ID_to_struct(PointerRNA *ptr) { - char *ptrpath = NULL; - - if (!ptr->id.data || !ptr->data) - return NULL; - - if (!RNA_struct_is_ID(ptr->type)) { - if (ptr->type->path) { - /* if type has a path to some ID, use it */ - ptrpath = ptr->type->path(ptr); - } - else if (ptr->type->nested && RNA_struct_is_ID(ptr->type->nested)) { - PointerRNA parentptr; - PropertyRNA *userprop; - - /* find the property in the struct we're nested in that references this struct, and - * use its identifier as the first part of the path used... - */ - RNA_id_pointer_create(ptr->id.data, &parentptr); - userprop = RNA_struct_find_nested(&parentptr, ptr->type); - - if (userprop) - ptrpath = BLI_strdup(RNA_property_identifier(userprop)); - else - return NULL; /* can't do anything about this case yet... */ - } - else if (RNA_struct_is_a(ptr->type, &RNA_PropertyGroup)) { - /* special case, easier to deal with here then in ptr->type->path() */ - return rna_path_from_ID_to_idpgroup(ptr); - } - else - return NULL; - } - - return ptrpath; -} - -static void rna_path_array_multi_from_flat_index( - const int dimsize[RNA_MAX_ARRAY_LENGTH], const int totdims, - const int index_dim, int index, - int r_index_multi[RNA_MAX_ARRAY_LENGTH]) -{ - int dimsize_step[RNA_MAX_ARRAY_LENGTH + 1]; - int i = totdims - 1; - dimsize_step[i + 1] = 1; - dimsize_step[i] = dimsize[i]; - while (--i != -1) { - dimsize_step[i] = dimsize[i] * dimsize_step[i + 1]; - } - while (++i != index_dim) { - int index_round = index / dimsize_step[i + 1]; - r_index_multi[i] = index_round; - index -= (index_round * dimsize_step[i + 1]); - } - BLI_assert(index == 0); -} - -static void rna_path_array_multi_string_from_flat_index( - PointerRNA *ptr, PropertyRNA *prop, int index_dim, int index, - char *index_str, int index_str_len) -{ - int dimsize[RNA_MAX_ARRAY_LENGTH]; - int totdims = RNA_property_array_dimension(ptr, prop, dimsize); - int index_multi[RNA_MAX_ARRAY_LENGTH]; - - rna_path_array_multi_from_flat_index(dimsize, totdims, index_dim, index, index_multi); - - for (int i = 0, offset = 0; (i < index_dim) && (offset < index_str_len); i++) { - offset += BLI_snprintf_rlen(&index_str[offset], index_str_len - offset, "[%d]", index_multi[i]); - } + char *ptrpath = NULL; + + if (!ptr->id.data || !ptr->data) + return NULL; + + if (!RNA_struct_is_ID(ptr->type)) { + if (ptr->type->path) { + /* if type has a path to some ID, use it */ + ptrpath = ptr->type->path(ptr); + } + else if (ptr->type->nested && RNA_struct_is_ID(ptr->type->nested)) { + PointerRNA parentptr; + PropertyRNA *userprop; + + /* find the property in the struct we're nested in that references this struct, and + * use its identifier as the first part of the path used... + */ + RNA_id_pointer_create(ptr->id.data, &parentptr); + userprop = RNA_struct_find_nested(&parentptr, ptr->type); + + if (userprop) + ptrpath = BLI_strdup(RNA_property_identifier(userprop)); + else + return NULL; /* can't do anything about this case yet... */ + } + else if (RNA_struct_is_a(ptr->type, &RNA_PropertyGroup)) { + /* special case, easier to deal with here then in ptr->type->path() */ + return rna_path_from_ID_to_idpgroup(ptr); + } + else + return NULL; + } + + return ptrpath; +} + +static void rna_path_array_multi_from_flat_index(const int dimsize[RNA_MAX_ARRAY_LENGTH], + const int totdims, + const int index_dim, + int index, + int r_index_multi[RNA_MAX_ARRAY_LENGTH]) +{ + int dimsize_step[RNA_MAX_ARRAY_LENGTH + 1]; + int i = totdims - 1; + dimsize_step[i + 1] = 1; + dimsize_step[i] = dimsize[i]; + while (--i != -1) { + dimsize_step[i] = dimsize[i] * dimsize_step[i + 1]; + } + while (++i != index_dim) { + int index_round = index / dimsize_step[i + 1]; + r_index_multi[i] = index_round; + index -= (index_round * dimsize_step[i + 1]); + } + BLI_assert(index == 0); +} + +static void rna_path_array_multi_string_from_flat_index(PointerRNA *ptr, + PropertyRNA *prop, + int index_dim, + int index, + char *index_str, + int index_str_len) +{ + int dimsize[RNA_MAX_ARRAY_LENGTH]; + int totdims = RNA_property_array_dimension(ptr, prop, dimsize); + int index_multi[RNA_MAX_ARRAY_LENGTH]; + + rna_path_array_multi_from_flat_index(dimsize, totdims, index_dim, index, index_multi); + + for (int i = 0, offset = 0; (i < index_dim) && (offset < index_str_len); i++) { + offset += BLI_snprintf_rlen( + &index_str[offset], index_str_len - offset, "[%d]", index_multi[i]); + } } /** @@ -5406,103 +5574,105 @@ static void rna_path_array_multi_string_from_flat_index( * \param index: The *flattened* index to use when \a ``index_dim > 0``, * this is expanded when used with multi-dimensional arrays. */ -char *RNA_path_from_ID_to_property_index(PointerRNA *ptr, PropertyRNA *prop, int index_dim, int index) -{ - const bool is_rna = (prop->magic == RNA_MAGIC); - const char *propname; - char *ptrpath, *path; - - if (!ptr->id.data || !ptr->data) - return NULL; - - /* path from ID to the struct holding this property */ - ptrpath = RNA_path_from_ID_to_struct(ptr); - - propname = RNA_property_identifier(prop); - - /* support indexing w/ multi-dimensional arrays */ - char index_str[RNA_MAX_ARRAY_LENGTH * 12 + 1]; - if (index_dim == 0) { - index_str[0] = '\0'; - } - else { - rna_path_array_multi_string_from_flat_index( - ptr, prop, index_dim, index, - index_str, sizeof(index_str)); - } - - if (ptrpath) { - if (is_rna) { - path = BLI_sprintfN("%s.%s%s", ptrpath, propname, index_str); - } - else { - char propname_esc[MAX_IDPROP_NAME * 2]; - BLI_strescape(propname_esc, propname, sizeof(propname_esc)); - path = BLI_sprintfN("%s[\"%s\"]%s", ptrpath, propname_esc, index_str); - } - MEM_freeN(ptrpath); - } - else if (RNA_struct_is_ID(ptr->type)) { - if (is_rna) { - path = BLI_sprintfN("%s%s", propname, index_str); - } - else { - char propname_esc[MAX_IDPROP_NAME * 2]; - BLI_strescape(propname_esc, propname, sizeof(propname_esc)); - path = BLI_sprintfN("[\"%s\"]%s", propname_esc, index_str); - } - } - else { - path = NULL; - } - - return path; +char *RNA_path_from_ID_to_property_index(PointerRNA *ptr, + PropertyRNA *prop, + int index_dim, + int index) +{ + const bool is_rna = (prop->magic == RNA_MAGIC); + const char *propname; + char *ptrpath, *path; + + if (!ptr->id.data || !ptr->data) + return NULL; + + /* path from ID to the struct holding this property */ + ptrpath = RNA_path_from_ID_to_struct(ptr); + + propname = RNA_property_identifier(prop); + + /* support indexing w/ multi-dimensional arrays */ + char index_str[RNA_MAX_ARRAY_LENGTH * 12 + 1]; + if (index_dim == 0) { + index_str[0] = '\0'; + } + else { + rna_path_array_multi_string_from_flat_index( + ptr, prop, index_dim, index, index_str, sizeof(index_str)); + } + + if (ptrpath) { + if (is_rna) { + path = BLI_sprintfN("%s.%s%s", ptrpath, propname, index_str); + } + else { + char propname_esc[MAX_IDPROP_NAME * 2]; + BLI_strescape(propname_esc, propname, sizeof(propname_esc)); + path = BLI_sprintfN("%s[\"%s\"]%s", ptrpath, propname_esc, index_str); + } + MEM_freeN(ptrpath); + } + else if (RNA_struct_is_ID(ptr->type)) { + if (is_rna) { + path = BLI_sprintfN("%s%s", propname, index_str); + } + else { + char propname_esc[MAX_IDPROP_NAME * 2]; + BLI_strescape(propname_esc, propname, sizeof(propname_esc)); + path = BLI_sprintfN("[\"%s\"]%s", propname_esc, index_str); + } + } + else { + path = NULL; + } + + return path; } char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop) { - return RNA_path_from_ID_to_property_index(ptr, prop, 0, -1); + return RNA_path_from_ID_to_property_index(ptr, prop, 0, -1); } /** * \return the path to given ptr/prop from the closest ancestor of given type, if any (else return NULL). */ -char *RNA_path_resolve_from_type_to_property( - PointerRNA *ptr, PropertyRNA *prop, - const StructRNA *type) +char *RNA_path_resolve_from_type_to_property(PointerRNA *ptr, + PropertyRNA *prop, + const StructRNA *type) { - /* Try to recursively find an "type"'d ancestor, - * to handle situations where path from ID is not enough. */ - PointerRNA idptr; - ListBase path_elems = {NULL}; - char *path = NULL; - char *full_path = RNA_path_from_ID_to_property(ptr, prop); + /* Try to recursively find an "type"'d ancestor, + * to handle situations where path from ID is not enough. */ + PointerRNA idptr; + ListBase path_elems = {NULL}; + char *path = NULL; + char *full_path = RNA_path_from_ID_to_property(ptr, prop); - if (full_path == NULL) { - return NULL; - } + if (full_path == NULL) { + return NULL; + } - RNA_id_pointer_create(ptr->id.data, &idptr); + RNA_id_pointer_create(ptr->id.data, &idptr); - if (RNA_path_resolve_elements(&idptr, full_path, &path_elems)) { - PropertyElemRNA *prop_elem; + if (RNA_path_resolve_elements(&idptr, full_path, &path_elems)) { + PropertyElemRNA *prop_elem; - for (prop_elem = path_elems.last; prop_elem; prop_elem = prop_elem->prev) { - if (RNA_struct_is_a(prop_elem->ptr.type, type)) { - char *ref_path = RNA_path_from_ID_to_struct(&prop_elem->ptr); - if (ref_path) { - path = BLI_strdup(full_path + strlen(ref_path) + 1); /* +1 for the linking '.' */ - MEM_freeN(ref_path); - } - break; - } - } + for (prop_elem = path_elems.last; prop_elem; prop_elem = prop_elem->prev) { + if (RNA_struct_is_a(prop_elem->ptr.type, type)) { + char *ref_path = RNA_path_from_ID_to_struct(&prop_elem->ptr); + if (ref_path) { + path = BLI_strdup(full_path + strlen(ref_path) + 1); /* +1 for the linking '.' */ + MEM_freeN(ref_path); + } + break; + } + } - BLI_freelistN(&path_elems); - } + BLI_freelistN(&path_elems); + } - MEM_freeN(full_path); - return path; + MEM_freeN(full_path); + return path; } /** @@ -5511,11 +5681,11 @@ char *RNA_path_resolve_from_type_to_property( */ char *RNA_path_full_ID_py(ID *id) { - char id_esc[(sizeof(id->name) - 2) * 2]; + char id_esc[(sizeof(id->name) - 2) * 2]; - BLI_strescape(id_esc, id->name + 2, sizeof(id_esc)); + BLI_strescape(id_esc, id->name + 2, sizeof(id_esc)); - return BLI_sprintfN("bpy.data.%s[\"%s\"]", BKE_idcode_to_name_plural(GS(id->name)), id_esc); + return BLI_sprintfN("bpy.data.%s[\"%s\"]", BKE_idcode_to_name_plural(GS(id->name)), id_esc); } /** @@ -5524,89 +5694,88 @@ char *RNA_path_full_ID_py(ID *id) */ char *RNA_path_full_struct_py(struct PointerRNA *ptr) { - char *id_path; - char *data_path; + char *id_path; + char *data_path; - char *ret; + char *ret; - if (!ptr->id.data) { - return NULL; - } + if (!ptr->id.data) { + return NULL; + } - /* never fails */ - id_path = RNA_path_full_ID_py(ptr->id.data); + /* never fails */ + id_path = RNA_path_full_ID_py(ptr->id.data); - data_path = RNA_path_from_ID_to_struct(ptr); + data_path = RNA_path_from_ID_to_struct(ptr); - /* XXX data_path may be NULL (see #36788), do we want to get the 'bpy.data.foo["bar"].(null)' stuff? */ - ret = BLI_sprintfN("%s.%s", id_path, data_path); + /* XXX data_path may be NULL (see #36788), do we want to get the 'bpy.data.foo["bar"].(null)' stuff? */ + ret = BLI_sprintfN("%s.%s", id_path, data_path); - if (data_path) { - MEM_freeN(data_path); - } - MEM_freeN(id_path); + if (data_path) { + MEM_freeN(data_path); + } + MEM_freeN(id_path); - return ret; + return ret; } /** * Get the ID.struct.property as a python representation, eg: * bpy.data.foo["bar"].some_struct.some_prop[10] */ -char *RNA_path_full_property_py_ex(PointerRNA *ptr, PropertyRNA *prop, int index, bool use_fallback) -{ - char *id_path; - const char *data_delim; - const char *data_path; - bool data_path_free; - - char *ret; - - if (!ptr->id.data) { - return NULL; - } - - /* never fails */ - id_path = RNA_path_full_ID_py(ptr->id.data); - - data_path = RNA_path_from_ID_to_property(ptr, prop); - if (data_path) { - data_delim = (data_path[0] == '[') ? "" : "."; - data_path_free = true; - } - else { - if (use_fallback) { - /* fuzzy fallback. be explicit in our ignoranc. */ - data_path = RNA_property_identifier(prop); - data_delim = " ... "; - } - else { - data_delim = "."; - - } - data_path_free = false; - } - - - if ((index == -1) || (RNA_property_array_check(prop) == false)) { - ret = BLI_sprintfN("%s%s%s", - id_path, data_delim, data_path); - } - else { - ret = BLI_sprintfN("%s%s%s[%d]", - id_path, data_delim, data_path, index); - } - MEM_freeN(id_path); - if (data_path_free) { - MEM_freeN((void *)data_path); - } - - return ret; +char *RNA_path_full_property_py_ex(PointerRNA *ptr, + PropertyRNA *prop, + int index, + bool use_fallback) +{ + char *id_path; + const char *data_delim; + const char *data_path; + bool data_path_free; + + char *ret; + + if (!ptr->id.data) { + return NULL; + } + + /* never fails */ + id_path = RNA_path_full_ID_py(ptr->id.data); + + data_path = RNA_path_from_ID_to_property(ptr, prop); + if (data_path) { + data_delim = (data_path[0] == '[') ? "" : "."; + data_path_free = true; + } + else { + if (use_fallback) { + /* fuzzy fallback. be explicit in our ignoranc. */ + data_path = RNA_property_identifier(prop); + data_delim = " ... "; + } + else { + data_delim = "."; + } + data_path_free = false; + } + + if ((index == -1) || (RNA_property_array_check(prop) == false)) { + ret = BLI_sprintfN("%s%s%s", id_path, data_delim, data_path); + } + else { + ret = BLI_sprintfN("%s%s%s[%d]", id_path, data_delim, data_path, index); + } + MEM_freeN(id_path); + if (data_path_free) { + MEM_freeN((void *)data_path); + } + + return ret; } char *RNA_path_full_property_py(PointerRNA *ptr, PropertyRNA *prop, int index) { - return RNA_path_full_property_py_ex(ptr, prop, index, false); + return RNA_path_full_property_py_ex(ptr, prop, index, false); } /** @@ -5615,41 +5784,39 @@ char *RNA_path_full_property_py(PointerRNA *ptr, PropertyRNA *prop, int index) */ char *RNA_path_struct_property_py(PointerRNA *ptr, PropertyRNA *prop, int index) { - char *data_path; + char *data_path; - char *ret; + char *ret; - if (!ptr->id.data) { - return NULL; - } + if (!ptr->id.data) { + return NULL; + } - data_path = RNA_path_from_ID_to_property(ptr, prop); + data_path = RNA_path_from_ID_to_property(ptr, prop); - if (data_path == NULL) { - /* this may not be an ID at all, check for simple when pointer owns property. - * TODO, more complex nested case */ - if (!RNA_struct_is_ID(ptr->type)) { - const char *prop_identifier = RNA_property_identifier(prop); - if (RNA_struct_find_property(ptr, prop_identifier) == prop) { - data_path = BLI_strdup(prop_identifier); - } - } - } + if (data_path == NULL) { + /* this may not be an ID at all, check for simple when pointer owns property. + * TODO, more complex nested case */ + if (!RNA_struct_is_ID(ptr->type)) { + const char *prop_identifier = RNA_property_identifier(prop); + if (RNA_struct_find_property(ptr, prop_identifier) == prop) { + data_path = BLI_strdup(prop_identifier); + } + } + } - if ((index == -1) || (RNA_property_array_check(prop) == false)) { - ret = BLI_sprintfN("%s", - data_path); - } - else { - ret = BLI_sprintfN("%s[%d]", - data_path, index); - } + if ((index == -1) || (RNA_property_array_check(prop) == false)) { + ret = BLI_sprintfN("%s", data_path); + } + else { + ret = BLI_sprintfN("%s[%d]", data_path, index); + } - if (data_path) { - MEM_freeN(data_path); - } + if (data_path) { + MEM_freeN(data_path); + } - return ret; + return ret; } /** @@ -5658,483 +5825,482 @@ char *RNA_path_struct_property_py(PointerRNA *ptr, PropertyRNA *prop, int index) */ char *RNA_path_property_py(PointerRNA *UNUSED(ptr), PropertyRNA *prop, int index) { - char *ret; + char *ret; - if ((index == -1) || (RNA_property_array_check(prop) == false)) { - ret = BLI_sprintfN("%s", - RNA_property_identifier(prop)); - } - else { - ret = BLI_sprintfN("%s[%d]", - RNA_property_identifier(prop), index); - } + if ((index == -1) || (RNA_property_array_check(prop) == false)) { + ret = BLI_sprintfN("%s", RNA_property_identifier(prop)); + } + else { + ret = BLI_sprintfN("%s[%d]", RNA_property_identifier(prop), index); + } - return ret; + return ret; } /* Quick name based property access */ bool RNA_boolean_get(PointerRNA *ptr, const char *name) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) { - return RNA_property_boolean_get(ptr, prop); - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - return 0; - } + if (prop) { + return RNA_property_boolean_get(ptr, prop); + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + return 0; + } } void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_boolean_set(ptr, prop, value); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_boolean_set(ptr, prop, value); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } void RNA_boolean_get_array(PointerRNA *ptr, const char *name, bool *values) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_boolean_get_array(ptr, prop, values); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_boolean_get_array(ptr, prop, values); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } void RNA_boolean_set_array(PointerRNA *ptr, const char *name, const bool *values) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_boolean_set_array(ptr, prop, values); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_boolean_set_array(ptr, prop, values); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } int RNA_int_get(PointerRNA *ptr, const char *name) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) { - return RNA_property_int_get(ptr, prop); - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - return 0; - } + if (prop) { + return RNA_property_int_get(ptr, prop); + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + return 0; + } } void RNA_int_set(PointerRNA *ptr, const char *name, int value) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_int_set(ptr, prop, value); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_int_set(ptr, prop, value); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } void RNA_int_get_array(PointerRNA *ptr, const char *name, int *values) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_int_get_array(ptr, prop, values); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_int_get_array(ptr, prop, values); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } void RNA_int_set_array(PointerRNA *ptr, const char *name, const int *values) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_int_set_array(ptr, prop, values); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_int_set_array(ptr, prop, values); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } float RNA_float_get(PointerRNA *ptr, const char *name) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) { - return RNA_property_float_get(ptr, prop); - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - return 0; - } + if (prop) { + return RNA_property_float_get(ptr, prop); + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + return 0; + } } void RNA_float_set(PointerRNA *ptr, const char *name, float value) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_float_set(ptr, prop, value); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_float_set(ptr, prop, value); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_float_get_array(ptr, prop, values); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_float_get_array(ptr, prop, values); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_float_set_array(ptr, prop, values); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_float_set_array(ptr, prop, values); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } int RNA_enum_get(PointerRNA *ptr, const char *name) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) { - return RNA_property_enum_get(ptr, prop); - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - return 0; - } + if (prop) { + return RNA_property_enum_get(ptr, prop); + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + return 0; + } } void RNA_enum_set(PointerRNA *ptr, const char *name, int value) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_enum_set(ptr, prop, value); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_enum_set(ptr, prop, value); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } void RNA_enum_set_identifier(bContext *C, PointerRNA *ptr, const char *name, const char *id) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) { - int value; - if (RNA_property_enum_value(C, ptr, prop, id, &value)) - RNA_property_enum_set(ptr, prop, value); - else - printf("%s: %s.%s has no enum id '%s'.\n", __func__, ptr->type->identifier, name, id); - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - } + if (prop) { + int value; + if (RNA_property_enum_value(C, ptr, prop, id, &value)) + RNA_property_enum_set(ptr, prop, value); + else + printf("%s: %s.%s has no enum id '%s'.\n", __func__, ptr->type->identifier, name, id); + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + } } bool RNA_enum_is_equal(bContext *C, PointerRNA *ptr, const char *name, const char *enumname) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); - const EnumPropertyItem *item; - bool free; + PropertyRNA *prop = RNA_struct_find_property(ptr, name); + const EnumPropertyItem *item; + bool free; - if (prop) { - int i; - bool cmp = false; + if (prop) { + int i; + bool cmp = false; - RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); - i = RNA_enum_from_identifier(item, enumname); - if (i != -1) { - cmp = (item[i].value == RNA_property_enum_get(ptr, prop)); - } + RNA_property_enum_items(C, ptr, prop, &item, NULL, &free); + i = RNA_enum_from_identifier(item, enumname); + if (i != -1) { + cmp = (item[i].value == RNA_property_enum_get(ptr, prop)); + } - if (free) { - MEM_freeN((void *)item); - } + if (free) { + MEM_freeN((void *)item); + } - if (i != -1) { - return cmp; - } + if (i != -1) { + return cmp; + } - printf("%s: %s.%s item %s not found.\n", __func__, ptr->type->identifier, name, enumname); - return false; - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - return false; - } + printf("%s: %s.%s item %s not found.\n", __func__, ptr->type->identifier, name, enumname); + return false; + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + return false; + } } bool RNA_enum_value_from_id(const EnumPropertyItem *item, const char *identifier, int *r_value) { - const int i = RNA_enum_from_identifier(item, identifier); - if (i != -1) { - *r_value = item[i].value; - return true; - } - else { - return false; - } + const int i = RNA_enum_from_identifier(item, identifier); + if (i != -1) { + *r_value = item[i].value; + return true; + } + else { + return false; + } } bool RNA_enum_id_from_value(const EnumPropertyItem *item, int value, const char **r_identifier) { - const int i = RNA_enum_from_value(item, value); - if (i != -1) { - *r_identifier = item[i].identifier; - return true; - } - else { - return false; - } + const int i = RNA_enum_from_value(item, value); + if (i != -1) { + *r_identifier = item[i].identifier; + return true; + } + else { + return false; + } } bool RNA_enum_icon_from_value(const EnumPropertyItem *item, int value, int *r_icon) { - const int i = RNA_enum_from_value(item, value); - if (i != -1) { - *r_icon = item[i].icon; - return true; - } - else { - return false; - } + const int i = RNA_enum_from_value(item, value); + if (i != -1) { + *r_icon = item[i].icon; + return true; + } + else { + return false; + } } bool RNA_enum_name_from_value(const EnumPropertyItem *item, int value, const char **r_name) { - const int i = RNA_enum_from_value(item, value); - if (i != -1) { - *r_name = item[i].name; - return true; - } - else { - return false; - } + const int i = RNA_enum_from_value(item, value); + if (i != -1) { + *r_name = item[i].name; + return true; + } + else { + return false; + } } void RNA_string_get(PointerRNA *ptr, const char *name, char *value) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) { - RNA_property_string_get(ptr, prop, value); - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - value[0] = '\0'; - } + if (prop) { + RNA_property_string_get(ptr, prop, value); + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + value[0] = '\0'; + } } char *RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) { - return RNA_property_string_get_alloc(ptr, prop, fixedbuf, fixedlen, NULL); /* TODO, pass length */ - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - return NULL; - } + if (prop) { + return RNA_property_string_get_alloc( + ptr, prop, fixedbuf, fixedlen, NULL); /* TODO, pass length */ + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + return NULL; + } } int RNA_string_length(PointerRNA *ptr, const char *name) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) { - return RNA_property_string_length(ptr, prop); - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - return 0; - } + if (prop) { + return RNA_property_string_length(ptr, prop); + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + return 0; + } } void RNA_string_set(PointerRNA *ptr, const char *name, const char *value) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_string_set(ptr, prop, value); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_string_set(ptr, prop, value); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) { - return RNA_property_pointer_get(ptr, prop); - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) { + return RNA_property_pointer_get(ptr, prop); + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - return PointerRNA_NULL; - } + return PointerRNA_NULL; + } } void RNA_pointer_set(PointerRNA *ptr, const char *name, PointerRNA ptr_value) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) { - RNA_property_pointer_set(ptr, prop, ptr_value); - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - } + if (prop) { + RNA_property_pointer_set(ptr, prop, ptr_value); + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + } } void RNA_pointer_add(PointerRNA *ptr, const char *name) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_pointer_add(ptr, prop); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_pointer_add(ptr, prop); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } void RNA_collection_begin(PointerRNA *ptr, const char *name, CollectionPropertyIterator *iter) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_collection_begin(ptr, prop, iter); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_collection_begin(ptr, prop, iter); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_collection_add(ptr, prop, r_value); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_collection_add(ptr, prop, r_value); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } void RNA_collection_clear(PointerRNA *ptr, const char *name) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) - RNA_property_collection_clear(ptr, prop); - else - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + if (prop) + RNA_property_collection_clear(ptr, prop); + else + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); } int RNA_collection_length(PointerRNA *ptr, const char *name) { - PropertyRNA *prop = RNA_struct_find_property(ptr, name); + PropertyRNA *prop = RNA_struct_find_property(ptr, name); - if (prop) { - return RNA_property_collection_length(ptr, prop); - } - else { - printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); - return 0; - } + if (prop) { + return RNA_property_collection_length(ptr, prop); + } + else { + printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); + return 0; + } } bool RNA_property_is_set_ex(PointerRNA *ptr, PropertyRNA *prop, bool use_ghost) { - prop = rna_ensure_property(prop); - if (prop->flag & PROP_IDPROPERTY) { - IDProperty *idprop = rna_idproperty_find(ptr, prop->identifier); - return ((idprop != NULL) && (use_ghost == false || !(idprop->flag & IDP_FLAG_GHOST))); - } - else { - return true; - } + prop = rna_ensure_property(prop); + if (prop->flag & PROP_IDPROPERTY) { + IDProperty *idprop = rna_idproperty_find(ptr, prop->identifier); + return ((idprop != NULL) && (use_ghost == false || !(idprop->flag & IDP_FLAG_GHOST))); + } + else { + return true; + } } bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop) { - prop = rna_ensure_property(prop); - if (prop->flag & PROP_IDPROPERTY) { - IDProperty *idprop = rna_idproperty_find(ptr, prop->identifier); - return ((idprop != NULL) && !(idprop->flag & IDP_FLAG_GHOST)); - } - else { - return true; - } + prop = rna_ensure_property(prop); + if (prop->flag & PROP_IDPROPERTY) { + IDProperty *idprop = rna_idproperty_find(ptr, prop->identifier); + return ((idprop != NULL) && !(idprop->flag & IDP_FLAG_GHOST)); + } + else { + return true; + } } void RNA_property_unset(PointerRNA *ptr, PropertyRNA *prop) { - prop = rna_ensure_property(prop); - if (prop->flag & PROP_IDPROPERTY) { - rna_idproperty_free(ptr, prop->identifier); - } + prop = rna_ensure_property(prop); + if (prop->flag & PROP_IDPROPERTY) { + rna_idproperty_free(ptr, prop->identifier); + } } bool RNA_struct_property_is_set_ex(PointerRNA *ptr, const char *identifier, bool use_ghost) { - PropertyRNA *prop = RNA_struct_find_property(ptr, identifier); + PropertyRNA *prop = RNA_struct_find_property(ptr, identifier); - if (prop) { - return RNA_property_is_set_ex(ptr, prop, use_ghost); - } - else { - /* python raises an error */ - /* printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); */ - return 0; - } + if (prop) { + return RNA_property_is_set_ex(ptr, prop, use_ghost); + } + else { + /* python raises an error */ + /* printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); */ + return 0; + } } bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier) { - PropertyRNA *prop = RNA_struct_find_property(ptr, identifier); + PropertyRNA *prop = RNA_struct_find_property(ptr, identifier); - if (prop) { - return RNA_property_is_set(ptr, prop); - } - else { - /* python raises an error */ - /* printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); */ - return 0; - } + if (prop) { + return RNA_property_is_set(ptr, prop); + } + else { + /* python raises an error */ + /* printf("%s: %s.%s not found.\n", __func__, ptr->type->identifier, name); */ + return 0; + } } void RNA_struct_property_unset(PointerRNA *ptr, const char *identifier) { - PropertyRNA *prop = RNA_struct_find_property(ptr, identifier); + PropertyRNA *prop = RNA_struct_find_property(ptr, identifier); - if (prop) { - RNA_property_unset(ptr, prop); - } + if (prop) { + RNA_property_unset(ptr, prop); + } } bool RNA_property_is_idprop(const PropertyRNA *prop) { - return (prop->magic != RNA_MAGIC); + return (prop->magic != RNA_MAGIC); } /* mainly for the UI */ bool RNA_property_is_unlink(PropertyRNA *prop) { - const int flag = RNA_property_flag(prop); - if (RNA_property_type(prop) == PROP_STRING) { - return (flag & PROP_NEVER_UNLINK) == 0; - } - else { - return (flag & (PROP_NEVER_UNLINK | PROP_NEVER_NULL)) == 0; - } + const int flag = RNA_property_flag(prop); + if (RNA_property_type(prop) == PROP_STRING) { + return (flag & PROP_NEVER_UNLINK) == 0; + } + else { + return (flag & (PROP_NEVER_UNLINK | PROP_NEVER_NULL)) == 0; + } } /* string representation of a property, python @@ -6142,1443 +6308,1505 @@ bool RNA_property_is_unlink(PropertyRNA *prop) * context may be NULL */ char *RNA_pointer_as_string_id(bContext *C, PointerRNA *ptr) { - DynStr *dynstr = BLI_dynstr_new(); - char *cstring; - - const char *propname; - int first_time = 1; + DynStr *dynstr = BLI_dynstr_new(); + char *cstring; - BLI_dynstr_append(dynstr, "{"); + const char *propname; + int first_time = 1; - RNA_STRUCT_BEGIN (ptr, prop) - { - propname = RNA_property_identifier(prop); + BLI_dynstr_append(dynstr, "{"); - if (STREQ(propname, "rna_type")) - continue; + RNA_STRUCT_BEGIN (ptr, prop) { + propname = RNA_property_identifier(prop); - if (first_time == 0) - BLI_dynstr_append(dynstr, ", "); - first_time = 0; + if (STREQ(propname, "rna_type")) + continue; - cstring = RNA_property_as_string(C, ptr, prop, -1, INT_MAX); - BLI_dynstr_appendf(dynstr, "\"%s\":%s", propname, cstring); - MEM_freeN(cstring); - } - RNA_STRUCT_END; + if (first_time == 0) + BLI_dynstr_append(dynstr, ", "); + first_time = 0; - BLI_dynstr_append(dynstr, "}"); + cstring = RNA_property_as_string(C, ptr, prop, -1, INT_MAX); + BLI_dynstr_appendf(dynstr, "\"%s\":%s", propname, cstring); + MEM_freeN(cstring); + } + RNA_STRUCT_END; + BLI_dynstr_append(dynstr, "}"); - cstring = BLI_dynstr_get_cstring(dynstr); - BLI_dynstr_free(dynstr); - return cstring; + cstring = BLI_dynstr_get_cstring(dynstr); + BLI_dynstr_free(dynstr); + return cstring; } static char *rna_pointer_as_string__bldata(PointerRNA *ptr) { - if (ptr->type == NULL || ptr->id.data == NULL) { - return BLI_strdup("None"); - } - else if (RNA_struct_is_ID(ptr->type)) { - return RNA_path_full_ID_py(ptr->id.data); - } - else { - return RNA_path_full_struct_py(ptr); - } -} - -char *RNA_pointer_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop_ptr, PointerRNA *ptr_prop) -{ - IDProperty *prop; - if (ptr_prop->data == NULL) { - return BLI_strdup("None"); - } - else if ((prop = rna_idproperty_check(&prop_ptr, ptr)) && prop->type != IDP_ID) { - return RNA_pointer_as_string_id(C, ptr_prop); - } - else { - return rna_pointer_as_string__bldata(ptr_prop); - } + if (ptr->type == NULL || ptr->id.data == NULL) { + return BLI_strdup("None"); + } + else if (RNA_struct_is_ID(ptr->type)) { + return RNA_path_full_ID_py(ptr->id.data); + } + else { + return RNA_path_full_struct_py(ptr); + } +} + +char *RNA_pointer_as_string(bContext *C, + PointerRNA *ptr, + PropertyRNA *prop_ptr, + PointerRNA *ptr_prop) +{ + IDProperty *prop; + if (ptr_prop->data == NULL) { + return BLI_strdup("None"); + } + else if ((prop = rna_idproperty_check(&prop_ptr, ptr)) && prop->type != IDP_ID) { + return RNA_pointer_as_string_id(C, ptr_prop); + } + else { + return rna_pointer_as_string__bldata(ptr_prop); + } } /* context can be NULL */ -char *RNA_pointer_as_string_keywords_ex(bContext *C, PointerRNA *ptr, - const bool as_function, const bool all_args, const bool nested_args, +char *RNA_pointer_as_string_keywords_ex(bContext *C, + PointerRNA *ptr, + const bool as_function, + const bool all_args, + const bool nested_args, const int max_prop_length, PropertyRNA *iterprop) { - const char *arg_name = NULL; - - PropertyRNA *prop; - - DynStr *dynstr = BLI_dynstr_new(); - char *cstring, *buf; - bool first_iter = true; - int flag, flag_parameter; - - RNA_PROP_BEGIN (ptr, propptr, iterprop) - { - prop = propptr.data; - - flag = RNA_property_flag(prop); - flag_parameter = RNA_parameter_flag(prop); - - if (as_function && (flag_parameter & PARM_OUTPUT)) { - continue; - } - - arg_name = RNA_property_identifier(prop); - - if (STREQ(arg_name, "rna_type")) { - continue; - } - - if ((nested_args == false) && (RNA_property_type(prop) == PROP_POINTER)) { - continue; - } - - if (as_function && (prop->flag_parameter & PARM_REQUIRED)) { - /* required args don't have useful defaults */ - BLI_dynstr_appendf(dynstr, first_iter ? "%s" : ", %s", arg_name); - first_iter = false; - } - else { - bool ok = true; - - if (all_args == true) { - /* pass */ - } - else if (RNA_struct_idprops_check(ptr->type)) { - ok = RNA_property_is_set(ptr, prop); - } - - if (ok) { - if (as_function && RNA_property_type(prop) == PROP_POINTER) { - /* don't expand pointers for functions */ - if (flag & PROP_NEVER_NULL) { - /* we cant really do the right thing here. arg=arg?, hrmf! */ - buf = BLI_strdup(arg_name); - } - else { - buf = BLI_strdup("None"); - } - } - else { - buf = RNA_property_as_string(C, ptr, prop, -1, max_prop_length); - } - - BLI_dynstr_appendf(dynstr, first_iter ? "%s=%s" : ", %s=%s", arg_name, buf); - first_iter = false; - MEM_freeN(buf); - } - } - } - RNA_PROP_END; - - cstring = BLI_dynstr_get_cstring(dynstr); - BLI_dynstr_free(dynstr); - return cstring; -} - -char *RNA_pointer_as_string_keywords(bContext *C, PointerRNA *ptr, - const bool as_function, const bool all_args, const bool nested_args, + const char *arg_name = NULL; + + PropertyRNA *prop; + + DynStr *dynstr = BLI_dynstr_new(); + char *cstring, *buf; + bool first_iter = true; + int flag, flag_parameter; + + RNA_PROP_BEGIN (ptr, propptr, iterprop) { + prop = propptr.data; + + flag = RNA_property_flag(prop); + flag_parameter = RNA_parameter_flag(prop); + + if (as_function && (flag_parameter & PARM_OUTPUT)) { + continue; + } + + arg_name = RNA_property_identifier(prop); + + if (STREQ(arg_name, "rna_type")) { + continue; + } + + if ((nested_args == false) && (RNA_property_type(prop) == PROP_POINTER)) { + continue; + } + + if (as_function && (prop->flag_parameter & PARM_REQUIRED)) { + /* required args don't have useful defaults */ + BLI_dynstr_appendf(dynstr, first_iter ? "%s" : ", %s", arg_name); + first_iter = false; + } + else { + bool ok = true; + + if (all_args == true) { + /* pass */ + } + else if (RNA_struct_idprops_check(ptr->type)) { + ok = RNA_property_is_set(ptr, prop); + } + + if (ok) { + if (as_function && RNA_property_type(prop) == PROP_POINTER) { + /* don't expand pointers for functions */ + if (flag & PROP_NEVER_NULL) { + /* we cant really do the right thing here. arg=arg?, hrmf! */ + buf = BLI_strdup(arg_name); + } + else { + buf = BLI_strdup("None"); + } + } + else { + buf = RNA_property_as_string(C, ptr, prop, -1, max_prop_length); + } + + BLI_dynstr_appendf(dynstr, first_iter ? "%s=%s" : ", %s=%s", arg_name, buf); + first_iter = false; + MEM_freeN(buf); + } + } + } + RNA_PROP_END; + + cstring = BLI_dynstr_get_cstring(dynstr); + BLI_dynstr_free(dynstr); + return cstring; +} + +char *RNA_pointer_as_string_keywords(bContext *C, + PointerRNA *ptr, + const bool as_function, + const bool all_args, + const bool nested_args, const int max_prop_length) { - PropertyRNA *iterprop; + PropertyRNA *iterprop; - iterprop = RNA_struct_iterator_property(ptr->type); + iterprop = RNA_struct_iterator_property(ptr->type); - return RNA_pointer_as_string_keywords_ex(C, ptr, as_function, all_args, nested_args, - max_prop_length, iterprop); + return RNA_pointer_as_string_keywords_ex( + C, ptr, as_function, all_args, nested_args, max_prop_length, iterprop); } -char *RNA_function_as_string_keywords(bContext *C, FunctionRNA *func, - const bool as_function, const bool all_args, +char *RNA_function_as_string_keywords(bContext *C, + FunctionRNA *func, + const bool as_function, + const bool all_args, const int max_prop_length) { - PointerRNA funcptr; - PropertyRNA *iterprop; + PointerRNA funcptr; + PropertyRNA *iterprop; - RNA_pointer_create(NULL, &RNA_Function, func, &funcptr); + RNA_pointer_create(NULL, &RNA_Function, func, &funcptr); - iterprop = RNA_struct_find_property(&funcptr, "parameters"); + iterprop = RNA_struct_find_property(&funcptr, "parameters"); - RNA_struct_iterator_property(funcptr.type); + RNA_struct_iterator_property(funcptr.type); - return RNA_pointer_as_string_keywords_ex(C, &funcptr, as_function, all_args, true, - max_prop_length, iterprop); + return RNA_pointer_as_string_keywords_ex( + C, &funcptr, as_function, all_args, true, max_prop_length, iterprop); } static const char *bool_as_py_string(const int var) { - return var ? "True" : "False"; + return var ? "True" : "False"; } static void *rna_array_as_string_alloc( - int type, int len, PointerRNA *ptr, PropertyRNA *prop, void **r_buf_end) -{ - void *buf_ret = NULL; - if (type == PROP_BOOLEAN) { - bool *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len, __func__); - RNA_property_boolean_get_array(ptr, prop, buf); - *r_buf_end = buf + len; - } - else if (type == PROP_INT) { - int *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len, __func__); - RNA_property_int_get_array(ptr, prop, buf); - *r_buf_end = buf + len; - } - else if (type == PROP_FLOAT) { - float *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len, __func__); - RNA_property_float_get_array(ptr, prop, buf); - *r_buf_end = buf + len; - } - else { - BLI_assert(0); - } - return buf_ret; -} - -static void rna_array_as_string_elem( - int type, void **buf_p, int len, DynStr *dynstr) -{ - /* This will print a comma seperated string of the array elements from - * buf start to len. We will add a comma if len == 1 to preserve tuples. */ - const int end = len - 1; - if (type == PROP_BOOLEAN) { - bool *buf = *buf_p; - for (int i = 0; i < len; i++, buf++) { - BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%s, " : "%s", bool_as_py_string(*buf)); - } - *buf_p = buf; - } - else if (type == PROP_INT) { - int *buf = *buf_p; - for (int i = 0; i < len; i++, buf++) { - BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%d, " : "%d", *buf); - } - *buf_p = buf; - } - else if (type == PROP_FLOAT) { - float *buf = *buf_p; - for (int i = 0; i < len; i++, buf++) { - BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%g, " : "%g", *buf); - } - *buf_p = buf; - } - else { - BLI_assert(0); - } + int type, int len, PointerRNA *ptr, PropertyRNA *prop, void **r_buf_end) +{ + void *buf_ret = NULL; + if (type == PROP_BOOLEAN) { + bool *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len, __func__); + RNA_property_boolean_get_array(ptr, prop, buf); + *r_buf_end = buf + len; + } + else if (type == PROP_INT) { + int *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len, __func__); + RNA_property_int_get_array(ptr, prop, buf); + *r_buf_end = buf + len; + } + else if (type == PROP_FLOAT) { + float *buf = buf_ret = MEM_mallocN(sizeof(*buf) * len, __func__); + RNA_property_float_get_array(ptr, prop, buf); + *r_buf_end = buf + len; + } + else { + BLI_assert(0); + } + return buf_ret; +} + +static void rna_array_as_string_elem(int type, void **buf_p, int len, DynStr *dynstr) +{ + /* This will print a comma seperated string of the array elements from + * buf start to len. We will add a comma if len == 1 to preserve tuples. */ + const int end = len - 1; + if (type == PROP_BOOLEAN) { + bool *buf = *buf_p; + for (int i = 0; i < len; i++, buf++) { + BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%s, " : "%s", bool_as_py_string(*buf)); + } + *buf_p = buf; + } + else if (type == PROP_INT) { + int *buf = *buf_p; + for (int i = 0; i < len; i++, buf++) { + BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%d, " : "%d", *buf); + } + *buf_p = buf; + } + else if (type == PROP_FLOAT) { + float *buf = *buf_p; + for (int i = 0; i < len; i++, buf++) { + BLI_dynstr_appendf(dynstr, (i < end || !end) ? "%g, " : "%g", *buf); + } + *buf_p = buf; + } + else { + BLI_assert(0); + } } static void rna_array_as_string_recursive( - int type, void **buf_p, int totdim, const int *dim_size, DynStr *dynstr) -{ - BLI_dynstr_append(dynstr, "("); - if (totdim > 1) { - totdim--; - const int end = dim_size[totdim] - 1; - for (int i = 0; i <= end; i++) { - rna_array_as_string_recursive(type, buf_p, totdim, dim_size, dynstr); - if (i < end || !end) { - BLI_dynstr_append(dynstr, ", "); - } - } - } - else { - rna_array_as_string_elem(type, buf_p, dim_size[0], dynstr); - } - BLI_dynstr_append(dynstr, ")"); -} - -static void rna_array_as_string(int type, int len, PointerRNA *ptr, PropertyRNA *prop, DynStr *dynstr) -{ - void *buf_end; - void *buf = rna_array_as_string_alloc(type, len, ptr, prop, &buf_end); - void *buf_step = buf; - int totdim, dim_size[RNA_MAX_ARRAY_DIMENSION]; - - totdim = RNA_property_array_dimension(ptr, prop, dim_size); - - rna_array_as_string_recursive(type, &buf_step, totdim, dim_size, dynstr); - BLI_assert(buf_step == buf_end); - MEM_freeN(buf); -} - -char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop, int index, int max_prop_length) -{ - int type = RNA_property_type(prop); - int len = RNA_property_array_length(ptr, prop); - - DynStr *dynstr = BLI_dynstr_new(); - char *cstring; - - /* see if we can coerce into a python type - PropertyType */ - switch (type) { - case PROP_BOOLEAN: - if (len == 0) { - BLI_dynstr_append(dynstr, bool_as_py_string(RNA_property_boolean_get(ptr, prop))); - } - else { - if (index != -1) { - BLI_dynstr_append(dynstr, bool_as_py_string(RNA_property_boolean_get_index(ptr, prop, index))); - } - else { - rna_array_as_string(type, len, ptr, prop, dynstr); - } - } - break; - case PROP_INT: - if (len == 0) { - BLI_dynstr_appendf(dynstr, "%d", RNA_property_int_get(ptr, prop)); - } - else { - if (index != -1) { - BLI_dynstr_appendf(dynstr, "%d", RNA_property_int_get_index(ptr, prop, index)); - } - else { - rna_array_as_string(type, len, ptr, prop, dynstr); - } - } - break; - case PROP_FLOAT: - if (len == 0) { - BLI_dynstr_appendf(dynstr, "%g", RNA_property_float_get(ptr, prop)); - } - else { - if (index != -1) { - BLI_dynstr_appendf(dynstr, "%g", RNA_property_float_get_index(ptr, prop, index)); - } - else { - rna_array_as_string(type, len, ptr, prop, dynstr); - } - } - break; - case PROP_STRING: - { - char *buf_esc; - char *buf; - int length; - - length = RNA_property_string_length(ptr, prop); - buf = MEM_mallocN(sizeof(char) * (length + 1), "RNA_property_as_string"); - buf_esc = MEM_mallocN(sizeof(char) * (length * 2 + 1), "RNA_property_as_string esc"); - RNA_property_string_get(ptr, prop, buf); - BLI_strescape(buf_esc, buf, length * 2 + 1); - MEM_freeN(buf); - BLI_dynstr_appendf(dynstr, "\"%s\"", buf_esc); - MEM_freeN(buf_esc); - break; - } - case PROP_ENUM: - { - /* string arrays don't exist */ - const char *identifier; - int val = RNA_property_enum_get(ptr, prop); - - if (RNA_property_flag(prop) & PROP_ENUM_FLAG) { - /* represent as a python set */ - if (val) { - const EnumPropertyItem *item_array; - bool free; - - BLI_dynstr_append(dynstr, "{"); - - RNA_property_enum_items(C, ptr, prop, &item_array, NULL, &free); - if (item_array) { - const EnumPropertyItem *item = item_array; - bool is_first = true; - for (; item->identifier; item++) { - if (item->identifier[0] && item->value & val) { - BLI_dynstr_appendf(dynstr, is_first ? "'%s'" : ", '%s'", item->identifier); - is_first = false; - } - } - - if (free) { - MEM_freeN((void *)item_array); - } - } - - BLI_dynstr_append(dynstr, "}"); - } - else { - /* annoying exception, don't confuse with dictionary syntax above: {} */ - BLI_dynstr_append(dynstr, "set()"); - } - } - else if (RNA_property_enum_identifier(C, ptr, prop, val, &identifier)) { - BLI_dynstr_appendf(dynstr, "'%s'", identifier); - } - else { - BLI_dynstr_append(dynstr, "'<UNKNOWN ENUM>'"); - } - break; - } - case PROP_POINTER: - { - PointerRNA tptr = RNA_property_pointer_get(ptr, prop); - cstring = RNA_pointer_as_string(C, ptr, prop, &tptr); - BLI_dynstr_append(dynstr, cstring); - MEM_freeN(cstring); - break; - } - case PROP_COLLECTION: - { - int i = 0; - CollectionPropertyIterator collect_iter; - BLI_dynstr_append(dynstr, "["); - - for (RNA_property_collection_begin(ptr, prop, &collect_iter); - (i < max_prop_length) && collect_iter.valid; - RNA_property_collection_next(&collect_iter), i++) - { - PointerRNA itemptr = collect_iter.ptr; - - if (i != 0) - BLI_dynstr_append(dynstr, ", "); - - /* now get every prop of the collection */ - cstring = RNA_pointer_as_string(C, ptr, prop, &itemptr); - BLI_dynstr_append(dynstr, cstring); - MEM_freeN(cstring); - } - - RNA_property_collection_end(&collect_iter); - BLI_dynstr_append(dynstr, "]"); - break; - } - default: - BLI_dynstr_append(dynstr, "'<UNKNOWN TYPE>'"); /* TODO */ - break; - } - - cstring = BLI_dynstr_get_cstring(dynstr); - BLI_dynstr_free(dynstr); - return cstring; + int type, void **buf_p, int totdim, const int *dim_size, DynStr *dynstr) +{ + BLI_dynstr_append(dynstr, "("); + if (totdim > 1) { + totdim--; + const int end = dim_size[totdim] - 1; + for (int i = 0; i <= end; i++) { + rna_array_as_string_recursive(type, buf_p, totdim, dim_size, dynstr); + if (i < end || !end) { + BLI_dynstr_append(dynstr, ", "); + } + } + } + else { + rna_array_as_string_elem(type, buf_p, dim_size[0], dynstr); + } + BLI_dynstr_append(dynstr, ")"); +} + +static void rna_array_as_string( + int type, int len, PointerRNA *ptr, PropertyRNA *prop, DynStr *dynstr) +{ + void *buf_end; + void *buf = rna_array_as_string_alloc(type, len, ptr, prop, &buf_end); + void *buf_step = buf; + int totdim, dim_size[RNA_MAX_ARRAY_DIMENSION]; + + totdim = RNA_property_array_dimension(ptr, prop, dim_size); + + rna_array_as_string_recursive(type, &buf_step, totdim, dim_size, dynstr); + BLI_assert(buf_step == buf_end); + MEM_freeN(buf); +} + +char *RNA_property_as_string( + bContext *C, PointerRNA *ptr, PropertyRNA *prop, int index, int max_prop_length) +{ + int type = RNA_property_type(prop); + int len = RNA_property_array_length(ptr, prop); + + DynStr *dynstr = BLI_dynstr_new(); + char *cstring; + + /* see if we can coerce into a python type - PropertyType */ + switch (type) { + case PROP_BOOLEAN: + if (len == 0) { + BLI_dynstr_append(dynstr, bool_as_py_string(RNA_property_boolean_get(ptr, prop))); + } + else { + if (index != -1) { + BLI_dynstr_append(dynstr, + bool_as_py_string(RNA_property_boolean_get_index(ptr, prop, index))); + } + else { + rna_array_as_string(type, len, ptr, prop, dynstr); + } + } + break; + case PROP_INT: + if (len == 0) { + BLI_dynstr_appendf(dynstr, "%d", RNA_property_int_get(ptr, prop)); + } + else { + if (index != -1) { + BLI_dynstr_appendf(dynstr, "%d", RNA_property_int_get_index(ptr, prop, index)); + } + else { + rna_array_as_string(type, len, ptr, prop, dynstr); + } + } + break; + case PROP_FLOAT: + if (len == 0) { + BLI_dynstr_appendf(dynstr, "%g", RNA_property_float_get(ptr, prop)); + } + else { + if (index != -1) { + BLI_dynstr_appendf(dynstr, "%g", RNA_property_float_get_index(ptr, prop, index)); + } + else { + rna_array_as_string(type, len, ptr, prop, dynstr); + } + } + break; + case PROP_STRING: { + char *buf_esc; + char *buf; + int length; + + length = RNA_property_string_length(ptr, prop); + buf = MEM_mallocN(sizeof(char) * (length + 1), "RNA_property_as_string"); + buf_esc = MEM_mallocN(sizeof(char) * (length * 2 + 1), "RNA_property_as_string esc"); + RNA_property_string_get(ptr, prop, buf); + BLI_strescape(buf_esc, buf, length * 2 + 1); + MEM_freeN(buf); + BLI_dynstr_appendf(dynstr, "\"%s\"", buf_esc); + MEM_freeN(buf_esc); + break; + } + case PROP_ENUM: { + /* string arrays don't exist */ + const char *identifier; + int val = RNA_property_enum_get(ptr, prop); + + if (RNA_property_flag(prop) & PROP_ENUM_FLAG) { + /* represent as a python set */ + if (val) { + const EnumPropertyItem *item_array; + bool free; + + BLI_dynstr_append(dynstr, "{"); + + RNA_property_enum_items(C, ptr, prop, &item_array, NULL, &free); + if (item_array) { + const EnumPropertyItem *item = item_array; + bool is_first = true; + for (; item->identifier; item++) { + if (item->identifier[0] && item->value & val) { + BLI_dynstr_appendf(dynstr, is_first ? "'%s'" : ", '%s'", item->identifier); + is_first = false; + } + } + + if (free) { + MEM_freeN((void *)item_array); + } + } + + BLI_dynstr_append(dynstr, "}"); + } + else { + /* annoying exception, don't confuse with dictionary syntax above: {} */ + BLI_dynstr_append(dynstr, "set()"); + } + } + else if (RNA_property_enum_identifier(C, ptr, prop, val, &identifier)) { + BLI_dynstr_appendf(dynstr, "'%s'", identifier); + } + else { + BLI_dynstr_append(dynstr, "'<UNKNOWN ENUM>'"); + } + break; + } + case PROP_POINTER: { + PointerRNA tptr = RNA_property_pointer_get(ptr, prop); + cstring = RNA_pointer_as_string(C, ptr, prop, &tptr); + BLI_dynstr_append(dynstr, cstring); + MEM_freeN(cstring); + break; + } + case PROP_COLLECTION: { + int i = 0; + CollectionPropertyIterator collect_iter; + BLI_dynstr_append(dynstr, "["); + + for (RNA_property_collection_begin(ptr, prop, &collect_iter); + (i < max_prop_length) && collect_iter.valid; + RNA_property_collection_next(&collect_iter), i++) { + PointerRNA itemptr = collect_iter.ptr; + + if (i != 0) + BLI_dynstr_append(dynstr, ", "); + + /* now get every prop of the collection */ + cstring = RNA_pointer_as_string(C, ptr, prop, &itemptr); + BLI_dynstr_append(dynstr, cstring); + MEM_freeN(cstring); + } + + RNA_property_collection_end(&collect_iter); + BLI_dynstr_append(dynstr, "]"); + break; + } + default: + BLI_dynstr_append(dynstr, "'<UNKNOWN TYPE>'"); /* TODO */ + break; + } + + cstring = BLI_dynstr_get_cstring(dynstr); + BLI_dynstr_free(dynstr); + return cstring; } /* Function */ const char *RNA_function_identifier(FunctionRNA *func) { - return func->identifier; + return func->identifier; } const char *RNA_function_ui_description(FunctionRNA *func) { - return TIP_(func->description); + return TIP_(func->description); } const char *RNA_function_ui_description_raw(FunctionRNA *func) { - return func->description; + return func->description; } int RNA_function_flag(FunctionRNA *func) { - return func->flag; + return func->flag; } int RNA_function_defined(FunctionRNA *func) { - return func->call != NULL; + return func->call != NULL; } PropertyRNA *RNA_function_get_parameter(PointerRNA *UNUSED(ptr), FunctionRNA *func, int index) { - return BLI_findlink(&func->cont.properties, index); + return BLI_findlink(&func->cont.properties, index); } -PropertyRNA *RNA_function_find_parameter(PointerRNA *UNUSED(ptr), FunctionRNA *func, const char *identifier) +PropertyRNA *RNA_function_find_parameter(PointerRNA *UNUSED(ptr), + FunctionRNA *func, + const char *identifier) { - PropertyRNA *parm; + PropertyRNA *parm; - parm = func->cont.properties.first; - for (; parm; parm = parm->next) - if (STREQ(RNA_property_identifier(parm), identifier)) - break; + parm = func->cont.properties.first; + for (; parm; parm = parm->next) + if (STREQ(RNA_property_identifier(parm), identifier)) + break; - return parm; + return parm; } const ListBase *RNA_function_defined_parameters(FunctionRNA *func) { - return &func->cont.properties; + return &func->cont.properties; } /* Utility */ int RNA_parameter_flag(PropertyRNA *prop) { - return (int)rna_ensure_property(prop)->flag_parameter; -} - -ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSED(ptr), FunctionRNA *func) -{ - PropertyRNA *parm; - void *data; - int alloc_size = 0, size; - - parms->arg_count = 0; - parms->ret_count = 0; - - /* allocate data */ - for (parm = func->cont.properties.first; parm; parm = parm->next) { - alloc_size += rna_parameter_size(parm); - - if (parm->flag_parameter & PARM_OUTPUT) - parms->ret_count++; - else - parms->arg_count++; - } - - parms->data = MEM_callocN(alloc_size, "RNA_parameter_list_create"); - parms->func = func; - parms->alloc_size = alloc_size; - - /* set default values */ - data = parms->data; - - for (parm = func->cont.properties.first; parm; parm = parm->next) { - size = rna_parameter_size(parm); - - /* set length to 0, these need to be set later, see bpy_array.c's py_to_array */ - if (parm->flag & PROP_DYNAMIC) { - ParameterDynAlloc *data_alloc = data; - data_alloc->array_tot = 0; - data_alloc->array = NULL; - } - - if (!(parm->flag_parameter & PARM_REQUIRED) && !(parm->flag & PROP_DYNAMIC)) { - switch (parm->type) { - case PROP_BOOLEAN: - if (parm->arraydimension) rna_property_boolean_get_default_array_values((BoolPropertyRNA *)parm, data); - else memcpy(data, &((BoolPropertyRNA *)parm)->defaultvalue, size); - break; - case PROP_INT: - if (parm->arraydimension) rna_property_int_get_default_array_values((IntPropertyRNA *)parm, data); - else memcpy(data, &((IntPropertyRNA *)parm)->defaultvalue, size); - break; - case PROP_FLOAT: - if (parm->arraydimension) rna_property_float_get_default_array_values((FloatPropertyRNA *)parm, data); - else memcpy(data, &((FloatPropertyRNA *)parm)->defaultvalue, size); - break; - case PROP_ENUM: - memcpy(data, &((EnumPropertyRNA *)parm)->defaultvalue, size); - break; - case PROP_STRING: - { - const char *defvalue = ((StringPropertyRNA *)parm)->defaultvalue; - if (defvalue && defvalue[0]) { - /* causes bug [#29988], possibly this is only correct for thick wrapped - * need to look further into it - campbell */ + return (int)rna_ensure_property(prop)->flag_parameter; +} + +ParameterList *RNA_parameter_list_create(ParameterList *parms, + PointerRNA *UNUSED(ptr), + FunctionRNA *func) +{ + PropertyRNA *parm; + void *data; + int alloc_size = 0, size; + + parms->arg_count = 0; + parms->ret_count = 0; + + /* allocate data */ + for (parm = func->cont.properties.first; parm; parm = parm->next) { + alloc_size += rna_parameter_size(parm); + + if (parm->flag_parameter & PARM_OUTPUT) + parms->ret_count++; + else + parms->arg_count++; + } + + parms->data = MEM_callocN(alloc_size, "RNA_parameter_list_create"); + parms->func = func; + parms->alloc_size = alloc_size; + + /* set default values */ + data = parms->data; + + for (parm = func->cont.properties.first; parm; parm = parm->next) { + size = rna_parameter_size(parm); + + /* set length to 0, these need to be set later, see bpy_array.c's py_to_array */ + if (parm->flag & PROP_DYNAMIC) { + ParameterDynAlloc *data_alloc = data; + data_alloc->array_tot = 0; + data_alloc->array = NULL; + } + + if (!(parm->flag_parameter & PARM_REQUIRED) && !(parm->flag & PROP_DYNAMIC)) { + switch (parm->type) { + case PROP_BOOLEAN: + if (parm->arraydimension) + rna_property_boolean_get_default_array_values((BoolPropertyRNA *)parm, data); + else + memcpy(data, &((BoolPropertyRNA *)parm)->defaultvalue, size); + break; + case PROP_INT: + if (parm->arraydimension) + rna_property_int_get_default_array_values((IntPropertyRNA *)parm, data); + else + memcpy(data, &((IntPropertyRNA *)parm)->defaultvalue, size); + break; + case PROP_FLOAT: + if (parm->arraydimension) + rna_property_float_get_default_array_values((FloatPropertyRNA *)parm, data); + else + memcpy(data, &((FloatPropertyRNA *)parm)->defaultvalue, size); + break; + case PROP_ENUM: + memcpy(data, &((EnumPropertyRNA *)parm)->defaultvalue, size); + break; + case PROP_STRING: { + const char *defvalue = ((StringPropertyRNA *)parm)->defaultvalue; + if (defvalue && defvalue[0]) { + /* causes bug [#29988], possibly this is only correct for thick wrapped + * need to look further into it - campbell */ #if 0 - BLI_strncpy(data, defvalue, size); + BLI_strncpy(data, defvalue, size); #else - memcpy(data, &defvalue, size); + memcpy(data, &defvalue, size); #endif - } - break; - } - case PROP_POINTER: - case PROP_COLLECTION: - break; - } - } + } + break; + } + case PROP_POINTER: + case PROP_COLLECTION: + break; + } + } - data = ((char *)data) + rna_parameter_size(parm); - } + data = ((char *)data) + rna_parameter_size(parm); + } - return parms; + return parms; } void RNA_parameter_list_free(ParameterList *parms) { - PropertyRNA *parm; - int tot; + PropertyRNA *parm; + int tot; - parm = parms->func->cont.properties.first; - for (tot = 0; parm; parm = parm->next) { - if (parm->type == PROP_COLLECTION) - BLI_freelistN((ListBase *)((char *)parms->data + tot)); - else if (parm->flag & PROP_DYNAMIC) { - /* for dynamic arrays and strings, data is a pointer to an array */ - ParameterDynAlloc *data_alloc = (void *)(((char *)parms->data) + tot); - if (data_alloc->array) - MEM_freeN(data_alloc->array); - } + parm = parms->func->cont.properties.first; + for (tot = 0; parm; parm = parm->next) { + if (parm->type == PROP_COLLECTION) + BLI_freelistN((ListBase *)((char *)parms->data + tot)); + else if (parm->flag & PROP_DYNAMIC) { + /* for dynamic arrays and strings, data is a pointer to an array */ + ParameterDynAlloc *data_alloc = (void *)(((char *)parms->data) + tot); + if (data_alloc->array) + MEM_freeN(data_alloc->array); + } - tot += rna_parameter_size(parm); - } + tot += rna_parameter_size(parm); + } - MEM_freeN(parms->data); - parms->data = NULL; + MEM_freeN(parms->data); + parms->data = NULL; - parms->func = NULL; + parms->func = NULL; } -int RNA_parameter_list_size(ParameterList *parms) +int RNA_parameter_list_size(ParameterList *parms) { - return parms->alloc_size; + return parms->alloc_size; } -int RNA_parameter_list_arg_count(ParameterList *parms) +int RNA_parameter_list_arg_count(ParameterList *parms) { - return parms->arg_count; + return parms->arg_count; } -int RNA_parameter_list_ret_count(ParameterList *parms) +int RNA_parameter_list_ret_count(ParameterList *parms) { - return parms->ret_count; + return parms->ret_count; } void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter) { - /* may be useful but unused now */ - /* RNA_pointer_create(NULL, &RNA_Function, parms->func, &iter->funcptr); */ /*UNUSED*/ + /* may be useful but unused now */ + /* RNA_pointer_create(NULL, &RNA_Function, parms->func, &iter->funcptr); */ /*UNUSED*/ - iter->parms = parms; - iter->parm = parms->func->cont.properties.first; - iter->valid = iter->parm != NULL; - iter->offset = 0; + iter->parms = parms; + iter->parm = parms->func->cont.properties.first; + iter->valid = iter->parm != NULL; + iter->offset = 0; - if (iter->valid) { - iter->size = rna_parameter_size(iter->parm); - iter->data = (((char *)iter->parms->data)); /* +iter->offset, always 0 */ - } + if (iter->valid) { + iter->size = rna_parameter_size(iter->parm); + iter->data = (((char *)iter->parms->data)); /* +iter->offset, always 0 */ + } } void RNA_parameter_list_next(ParameterIterator *iter) { - iter->offset += iter->size; - iter->parm = iter->parm->next; - iter->valid = iter->parm != NULL; + iter->offset += iter->size; + iter->parm = iter->parm->next; + iter->valid = iter->parm != NULL; - if (iter->valid) { - iter->size = rna_parameter_size(iter->parm); - iter->data = (((char *)iter->parms->data) + iter->offset); - } + if (iter->valid) { + iter->size = rna_parameter_size(iter->parm); + iter->data = (((char *)iter->parms->data) + iter->offset); + } } void RNA_parameter_list_end(ParameterIterator *UNUSED(iter)) { - /* nothing to do */ + /* nothing to do */ } void RNA_parameter_get(ParameterList *parms, PropertyRNA *parm, void **value) { - ParameterIterator iter; + ParameterIterator iter; - RNA_parameter_list_begin(parms, &iter); + RNA_parameter_list_begin(parms, &iter); - for (; iter.valid; RNA_parameter_list_next(&iter)) - if (iter.parm == parm) - break; + for (; iter.valid; RNA_parameter_list_next(&iter)) + if (iter.parm == parm) + break; - if (iter.valid) { - if (parm->flag & PROP_DYNAMIC) { - /* for dynamic arrays and strings, data is a pointer to an array */ - ParameterDynAlloc *data_alloc = iter.data; - *value = data_alloc->array; - } - else { - *value = iter.data; - } - } - else { - *value = NULL; - } + if (iter.valid) { + if (parm->flag & PROP_DYNAMIC) { + /* for dynamic arrays and strings, data is a pointer to an array */ + ParameterDynAlloc *data_alloc = iter.data; + *value = data_alloc->array; + } + else { + *value = iter.data; + } + } + else { + *value = NULL; + } - RNA_parameter_list_end(&iter); + RNA_parameter_list_end(&iter); } void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void **value) { - PropertyRNA *parm; + PropertyRNA *parm; - parm = parms->func->cont.properties.first; - for (; parm; parm = parm->next) - if (STREQ(RNA_property_identifier(parm), identifier)) - break; + parm = parms->func->cont.properties.first; + for (; parm; parm = parm->next) + if (STREQ(RNA_property_identifier(parm), identifier)) + break; - if (parm) - RNA_parameter_get(parms, parm, value); + if (parm) + RNA_parameter_get(parms, parm, value); } void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, const void *value) { - ParameterIterator iter; - - RNA_parameter_list_begin(parms, &iter); - - for (; iter.valid; RNA_parameter_list_next(&iter)) - if (iter.parm == parm) - break; - - if (iter.valid) { - if (parm->flag & PROP_DYNAMIC) { - /* for dynamic arrays and strings, data is a pointer to an array */ - ParameterDynAlloc *data_alloc = iter.data; - size_t size = 0; - switch (parm->type) { - case PROP_STRING: - size = sizeof(char); - break; - case PROP_INT: - case PROP_BOOLEAN: - size = sizeof(int); - break; - case PROP_FLOAT: - size = sizeof(float); - break; - default: - break; - } - size *= data_alloc->array_tot; - if (data_alloc->array) - MEM_freeN(data_alloc->array); - data_alloc->array = MEM_mallocN(size, __func__); - memcpy(data_alloc->array, value, size); - } - else { - memcpy(iter.data, value, iter.size); - } - } - - RNA_parameter_list_end(&iter); + ParameterIterator iter; + + RNA_parameter_list_begin(parms, &iter); + + for (; iter.valid; RNA_parameter_list_next(&iter)) + if (iter.parm == parm) + break; + + if (iter.valid) { + if (parm->flag & PROP_DYNAMIC) { + /* for dynamic arrays and strings, data is a pointer to an array */ + ParameterDynAlloc *data_alloc = iter.data; + size_t size = 0; + switch (parm->type) { + case PROP_STRING: + size = sizeof(char); + break; + case PROP_INT: + case PROP_BOOLEAN: + size = sizeof(int); + break; + case PROP_FLOAT: + size = sizeof(float); + break; + default: + break; + } + size *= data_alloc->array_tot; + if (data_alloc->array) + MEM_freeN(data_alloc->array); + data_alloc->array = MEM_mallocN(size, __func__); + memcpy(data_alloc->array, value, size); + } + else { + memcpy(iter.data, value, iter.size); + } + } + + RNA_parameter_list_end(&iter); } void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, const void *value) { - PropertyRNA *parm; + PropertyRNA *parm; - parm = parms->func->cont.properties.first; - for (; parm; parm = parm->next) - if (STREQ(RNA_property_identifier(parm), identifier)) - break; + parm = parms->func->cont.properties.first; + for (; parm; parm = parm->next) + if (STREQ(RNA_property_identifier(parm), identifier)) + break; - if (parm) - RNA_parameter_set(parms, parm, value); + if (parm) + RNA_parameter_set(parms, parm, value); } int RNA_parameter_dynamic_length_get(ParameterList *parms, PropertyRNA *parm) { - ParameterIterator iter; - int len = 0; + ParameterIterator iter; + int len = 0; - RNA_parameter_list_begin(parms, &iter); + RNA_parameter_list_begin(parms, &iter); - for (; iter.valid; RNA_parameter_list_next(&iter)) - if (iter.parm == parm) - break; + for (; iter.valid; RNA_parameter_list_next(&iter)) + if (iter.parm == parm) + break; - if (iter.valid) - len = RNA_parameter_dynamic_length_get_data(parms, parm, iter.data); + if (iter.valid) + len = RNA_parameter_dynamic_length_get_data(parms, parm, iter.data); - RNA_parameter_list_end(&iter); + RNA_parameter_list_end(&iter); - return len; + return len; } void RNA_parameter_dynamic_length_set(ParameterList *parms, PropertyRNA *parm, int length) { - ParameterIterator iter; + ParameterIterator iter; - RNA_parameter_list_begin(parms, &iter); + RNA_parameter_list_begin(parms, &iter); - for (; iter.valid; RNA_parameter_list_next(&iter)) - if (iter.parm == parm) - break; + for (; iter.valid; RNA_parameter_list_next(&iter)) + if (iter.parm == parm) + break; - if (iter.valid) - RNA_parameter_dynamic_length_set_data(parms, parm, iter.data, length); + if (iter.valid) + RNA_parameter_dynamic_length_set_data(parms, parm, iter.data, length); - RNA_parameter_list_end(&iter); + RNA_parameter_list_end(&iter); } -int RNA_parameter_dynamic_length_get_data(ParameterList *UNUSED(parms), PropertyRNA *parm, void *data) +int RNA_parameter_dynamic_length_get_data(ParameterList *UNUSED(parms), + PropertyRNA *parm, + void *data) { - if (parm->flag & PROP_DYNAMIC) { - return (int)((ParameterDynAlloc *)data)->array_tot; - } - return 0; + if (parm->flag & PROP_DYNAMIC) { + return (int)((ParameterDynAlloc *)data)->array_tot; + } + return 0; } -void RNA_parameter_dynamic_length_set_data(ParameterList *UNUSED(parms), PropertyRNA *parm, void *data, int length) +void RNA_parameter_dynamic_length_set_data(ParameterList *UNUSED(parms), + PropertyRNA *parm, + void *data, + int length) { - if (parm->flag & PROP_DYNAMIC) { - ((ParameterDynAlloc *)data)->array_tot = (intptr_t)length; - } + if (parm->flag & PROP_DYNAMIC) { + ((ParameterDynAlloc *)data)->array_tot = (intptr_t)length; + } } -int RNA_function_call(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms) +int RNA_function_call( + bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms) { - if (func->call) { - func->call(C, reports, ptr, parms); + if (func->call) { + func->call(C, reports, ptr, parms); - return 0; - } + return 0; + } - return -1; + return -1; } -int RNA_function_call_lookup(bContext *C, ReportList *reports, PointerRNA *ptr, const char *identifier, +int RNA_function_call_lookup(bContext *C, + ReportList *reports, + PointerRNA *ptr, + const char *identifier, ParameterList *parms) { - FunctionRNA *func; + FunctionRNA *func; - func = RNA_struct_find_function(ptr->type, identifier); + func = RNA_struct_find_function(ptr->type, identifier); - if (func) - return RNA_function_call(C, reports, ptr, func, parms); + if (func) + return RNA_function_call(C, reports, ptr, func, parms); - return -1; + return -1; } -int RNA_function_call_direct(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, - const char *format, ...) +int RNA_function_call_direct( + bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, ...) { - va_list args; - int ret; + va_list args; + int ret; - va_start(args, format); + va_start(args, format); - ret = RNA_function_call_direct_va(C, reports, ptr, func, format, args); + ret = RNA_function_call_direct_va(C, reports, ptr, func, format, args); - va_end(args); + va_end(args); - return ret; + return ret; } -int RNA_function_call_direct_lookup(bContext *C, ReportList *reports, PointerRNA *ptr, const char *identifier, - const char *format, ...) +int RNA_function_call_direct_lookup(bContext *C, + ReportList *reports, + PointerRNA *ptr, + const char *identifier, + const char *format, + ...) { - FunctionRNA *func; + FunctionRNA *func; - func = RNA_struct_find_function(ptr->type, identifier); + func = RNA_struct_find_function(ptr->type, identifier); - if (func) { - va_list args; - int ret; + if (func) { + va_list args; + int ret; - va_start(args, format); + va_start(args, format); - ret = RNA_function_call_direct_va(C, reports, ptr, func, format, args); + ret = RNA_function_call_direct_va(C, reports, ptr, func, format, args); - va_end(args); + va_end(args); - return ret; - } + return ret; + } - return -1; + return -1; } static int rna_function_format_array_length(const char *format, int ofs, int flen) { - char lenbuf[16]; - int idx = 0; - - if (format[ofs++] == '[') - for (; ofs < flen && format[ofs] != ']' && idx < sizeof(lenbuf) - 1; idx++, ofs++) - lenbuf[idx] = format[ofs]; - - if (ofs < flen && format[ofs + 1] == ']') { - /* XXX put better error reporting for (ofs >= flen) or idx over lenbuf capacity */ - lenbuf[idx] = '\0'; - return atoi(lenbuf); - } - - return 0; -} - -static int rna_function_parameter_parse(PointerRNA *ptr, PropertyRNA *prop, PropertyType type, - char ftype, int len, void *dest, const void *src, StructRNA *srna, - const char *tid, const char *fid, const char *pid) -{ - /* ptr is always a function pointer, prop always a parameter */ - - switch (type) { - case PROP_BOOLEAN: - { - if (ftype != 'b') { - fprintf(stderr, "%s.%s: wrong type for parameter %s, a boolean was expected\n", tid, fid, pid); - return -1; - } - - if (len == 0) - *((bool *)dest) = *((bool *)src); - else - memcpy(dest, src, len * sizeof(bool)); - - break; - } - case PROP_INT: - { - if (ftype != 'i') { - fprintf(stderr, "%s.%s: wrong type for parameter %s, an integer was expected\n", tid, fid, pid); - return -1; - } - - if (len == 0) - *((int *)dest) = *((int *)src); - else - memcpy(dest, src, len * sizeof(int)); - - break; - } - case PROP_FLOAT: - { - if (ftype != 'f') { - fprintf(stderr, "%s.%s: wrong type for parameter %s, a float was expected\n", tid, fid, pid); - return -1; - } - - if (len == 0) - *((float *)dest) = *((float *)src); - else - memcpy(dest, src, len * sizeof(float)); - - break; - } - case PROP_STRING: - { - if (ftype != 's') { - fprintf(stderr, "%s.%s: wrong type for parameter %s, a string was expected\n", tid, fid, pid); - return -1; - } - - *((char **)dest) = *((char **)src); - - break; - } - case PROP_ENUM: - { - if (ftype != 'e') { - fprintf(stderr, "%s.%s: wrong type for parameter %s, an enum was expected\n", tid, fid, pid); - return -1; - } - - *((int *)dest) = *((int *)src); - - break; - } - case PROP_POINTER: - { - StructRNA *ptype; - - if (ftype != 'O') { - fprintf(stderr, "%s.%s: wrong type for parameter %s, an object was expected\n", tid, fid, pid); - return -1; - } - - ptype = RNA_property_pointer_type(ptr, prop); - - if (prop->flag_parameter & PARM_RNAPTR) { - *((PointerRNA *)dest) = *((PointerRNA *)src); - break; - } - - if (ptype != srna && !RNA_struct_is_a(srna, ptype)) { - fprintf(stderr, "%s.%s: wrong type for parameter %s, " - "an object of type %s was expected, passed an object of type %s\n", - tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(srna)); - return -1; - } - - *((void **)dest) = *((void **)src); - - break; - } - case PROP_COLLECTION: - { - StructRNA *ptype; - ListBase *lb, *clb; - Link *link; - CollectionPointerLink *clink; - - if (ftype != 'C') { - fprintf(stderr, "%s.%s: wrong type for parameter %s, a collection was expected\n", tid, fid, pid); - return -1; - } - - lb = (ListBase *)src; - clb = (ListBase *)dest; - ptype = RNA_property_pointer_type(ptr, prop); - - if (ptype != srna && !RNA_struct_is_a(srna, ptype)) { - fprintf(stderr, "%s.%s: wrong type for parameter %s, " - "a collection of objects of type %s was expected, " - "passed a collection of objects of type %s\n", - tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(srna)); - return -1; - } - - for (link = lb->first; link; link = link->next) { - clink = MEM_callocN(sizeof(CollectionPointerLink), "CCollectionPointerLink"); - RNA_pointer_create(NULL, srna, link, &clink->ptr); - BLI_addtail(clb, clink); - } - - break; - } - default: - { - if (len == 0) - fprintf(stderr, "%s.%s: unknown type for parameter %s\n", tid, fid, pid); - else - fprintf(stderr, "%s.%s: unknown array type for parameter %s\n", tid, fid, pid); - - return -1; - } - } - - return 0; -} - -int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, - const char *format, va_list args) -{ - PointerRNA funcptr; - ParameterList parms; - ParameterIterator iter; - PropertyRNA *pret, *parm; - PropertyType type; - int i, ofs, flen, flag_parameter, len, alen, err = 0; - const char *tid, *fid, *pid = NULL; - char ftype; - void **retdata = NULL; - - RNA_pointer_create(NULL, &RNA_Function, func, &funcptr); - - tid = RNA_struct_identifier(ptr->type); - fid = RNA_function_identifier(func); - pret = func->c_ret; - flen = strlen(format); - - RNA_parameter_list_create(&parms, ptr, func); - RNA_parameter_list_begin(&parms, &iter); - - for (i = 0, ofs = 0; iter.valid; RNA_parameter_list_next(&iter), i++) { - parm = iter.parm; - flag_parameter = RNA_parameter_flag(parm); - - if (parm == pret) { - retdata = iter.data; - continue; - } - else if (flag_parameter & PARM_OUTPUT) { - continue; - } - - pid = RNA_property_identifier(parm); - - if (ofs >= flen || format[ofs] == 'N') { - if (parm->flag_parameter & PARM_REQUIRED) { - err = -1; - fprintf(stderr, "%s.%s: missing required parameter %s\n", tid, fid, pid); - break; - } - ofs++; - continue; - } - - type = RNA_property_type(parm); - ftype = format[ofs++]; - len = RNA_property_array_length(&funcptr, parm); - alen = rna_function_format_array_length(format, ofs, flen); - - if (len != alen) { - err = -1; - fprintf(stderr, "%s.%s: for parameter %s, " - "was expecting an array of %i elements, " - "passed %i elements instead\n", - tid, fid, pid, len, alen); - break; - } - - switch (type) { - case PROP_BOOLEAN: - case PROP_INT: - case PROP_ENUM: - { - int arg = va_arg(args, int); - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, &arg, - NULL, tid, fid, pid); - break; - } - case PROP_FLOAT: - { - double arg = va_arg(args, double); - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, &arg, - NULL, tid, fid, pid); - break; - } - case PROP_STRING: - { - const char *arg = va_arg(args, char *); - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, &arg, - NULL, tid, fid, pid); - break; - } - case PROP_POINTER: - { - StructRNA *srna = va_arg(args, StructRNA *); - void *arg = va_arg(args, void *); - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, &arg, - srna, tid, fid, pid); - break; - } - case PROP_COLLECTION: - { - StructRNA *srna = va_arg(args, StructRNA *); - ListBase *arg = va_arg(args, ListBase *); - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, &arg, - srna, tid, fid, pid); - break; - } - default: - { - /* handle errors */ - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, NULL, - NULL, tid, fid, pid); - break; - } - } - - if (err != 0) - break; - } - - if (err == 0) - err = RNA_function_call(C, reports, ptr, func, &parms); - - /* XXX throw error when more parameters than those needed are passed or leave silent? */ - if (err == 0 && pret && ofs < flen && format[ofs++] == 'R') { - parm = pret; - - type = RNA_property_type(parm); - ftype = format[ofs++]; - len = RNA_property_array_length(&funcptr, parm); - alen = rna_function_format_array_length(format, ofs, flen); - - if (len != alen) { - err = -1; - fprintf(stderr, "%s.%s: for return parameter %s, " - "was expecting an array of %i elements, passed %i elements instead\n", - tid, fid, pid, len, alen); - } - else { - switch (type) { - case PROP_BOOLEAN: - case PROP_INT: - case PROP_ENUM: - { - int *arg = va_arg(args, int *); - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, - NULL, tid, fid, pid); - break; - } - case PROP_FLOAT: - { - float *arg = va_arg(args, float *); - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, - NULL, tid, fid, pid); - break; - } - case PROP_STRING: - { - char **arg = va_arg(args, char **); - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, - NULL, tid, fid, pid); - break; - } - case PROP_POINTER: - { - StructRNA *srna = va_arg(args, StructRNA *); - void **arg = va_arg(args, void **); - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, - srna, tid, fid, pid); - break; - } - case PROP_COLLECTION: - { - StructRNA *srna = va_arg(args, StructRNA *); - ListBase **arg = va_arg(args, ListBase **); - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, - srna, tid, fid, pid); - break; - } - default: - { - /* handle errors */ - err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, NULL, NULL, - NULL, tid, fid, pid); - break; - } - } - } - } - - RNA_parameter_list_end(&iter); - RNA_parameter_list_free(&parms); - - return err; -} - -int RNA_function_call_direct_va_lookup(bContext *C, ReportList *reports, PointerRNA *ptr, - const char *identifier, const char *format, va_list args) -{ - FunctionRNA *func; - - func = RNA_struct_find_function(ptr->type, identifier); - - if (func) - return RNA_function_call_direct_va(C, reports, ptr, func, format, args); - - return 0; + char lenbuf[16]; + int idx = 0; + + if (format[ofs++] == '[') + for (; ofs < flen && format[ofs] != ']' && idx < sizeof(lenbuf) - 1; idx++, ofs++) + lenbuf[idx] = format[ofs]; + + if (ofs < flen && format[ofs + 1] == ']') { + /* XXX put better error reporting for (ofs >= flen) or idx over lenbuf capacity */ + lenbuf[idx] = '\0'; + return atoi(lenbuf); + } + + return 0; +} + +static int rna_function_parameter_parse(PointerRNA *ptr, + PropertyRNA *prop, + PropertyType type, + char ftype, + int len, + void *dest, + const void *src, + StructRNA *srna, + const char *tid, + const char *fid, + const char *pid) +{ + /* ptr is always a function pointer, prop always a parameter */ + + switch (type) { + case PROP_BOOLEAN: { + if (ftype != 'b') { + fprintf( + stderr, "%s.%s: wrong type for parameter %s, a boolean was expected\n", tid, fid, pid); + return -1; + } + + if (len == 0) + *((bool *)dest) = *((bool *)src); + else + memcpy(dest, src, len * sizeof(bool)); + + break; + } + case PROP_INT: { + if (ftype != 'i') { + fprintf(stderr, + "%s.%s: wrong type for parameter %s, an integer was expected\n", + tid, + fid, + pid); + return -1; + } + + if (len == 0) + *((int *)dest) = *((int *)src); + else + memcpy(dest, src, len * sizeof(int)); + + break; + } + case PROP_FLOAT: { + if (ftype != 'f') { + fprintf( + stderr, "%s.%s: wrong type for parameter %s, a float was expected\n", tid, fid, pid); + return -1; + } + + if (len == 0) + *((float *)dest) = *((float *)src); + else + memcpy(dest, src, len * sizeof(float)); + + break; + } + case PROP_STRING: { + if (ftype != 's') { + fprintf( + stderr, "%s.%s: wrong type for parameter %s, a string was expected\n", tid, fid, pid); + return -1; + } + + *((char **)dest) = *((char **)src); + + break; + } + case PROP_ENUM: { + if (ftype != 'e') { + fprintf( + stderr, "%s.%s: wrong type for parameter %s, an enum was expected\n", tid, fid, pid); + return -1; + } + + *((int *)dest) = *((int *)src); + + break; + } + case PROP_POINTER: { + StructRNA *ptype; + + if (ftype != 'O') { + fprintf( + stderr, "%s.%s: wrong type for parameter %s, an object was expected\n", tid, fid, pid); + return -1; + } + + ptype = RNA_property_pointer_type(ptr, prop); + + if (prop->flag_parameter & PARM_RNAPTR) { + *((PointerRNA *)dest) = *((PointerRNA *)src); + break; + } + + if (ptype != srna && !RNA_struct_is_a(srna, ptype)) { + fprintf(stderr, + "%s.%s: wrong type for parameter %s, " + "an object of type %s was expected, passed an object of type %s\n", + tid, + fid, + pid, + RNA_struct_identifier(ptype), + RNA_struct_identifier(srna)); + return -1; + } + + *((void **)dest) = *((void **)src); + + break; + } + case PROP_COLLECTION: { + StructRNA *ptype; + ListBase *lb, *clb; + Link *link; + CollectionPointerLink *clink; + + if (ftype != 'C') { + fprintf(stderr, + "%s.%s: wrong type for parameter %s, a collection was expected\n", + tid, + fid, + pid); + return -1; + } + + lb = (ListBase *)src; + clb = (ListBase *)dest; + ptype = RNA_property_pointer_type(ptr, prop); + + if (ptype != srna && !RNA_struct_is_a(srna, ptype)) { + fprintf(stderr, + "%s.%s: wrong type for parameter %s, " + "a collection of objects of type %s was expected, " + "passed a collection of objects of type %s\n", + tid, + fid, + pid, + RNA_struct_identifier(ptype), + RNA_struct_identifier(srna)); + return -1; + } + + for (link = lb->first; link; link = link->next) { + clink = MEM_callocN(sizeof(CollectionPointerLink), "CCollectionPointerLink"); + RNA_pointer_create(NULL, srna, link, &clink->ptr); + BLI_addtail(clb, clink); + } + + break; + } + default: { + if (len == 0) + fprintf(stderr, "%s.%s: unknown type for parameter %s\n", tid, fid, pid); + else + fprintf(stderr, "%s.%s: unknown array type for parameter %s\n", tid, fid, pid); + + return -1; + } + } + + return 0; +} + +int RNA_function_call_direct_va(bContext *C, + ReportList *reports, + PointerRNA *ptr, + FunctionRNA *func, + const char *format, + va_list args) +{ + PointerRNA funcptr; + ParameterList parms; + ParameterIterator iter; + PropertyRNA *pret, *parm; + PropertyType type; + int i, ofs, flen, flag_parameter, len, alen, err = 0; + const char *tid, *fid, *pid = NULL; + char ftype; + void **retdata = NULL; + + RNA_pointer_create(NULL, &RNA_Function, func, &funcptr); + + tid = RNA_struct_identifier(ptr->type); + fid = RNA_function_identifier(func); + pret = func->c_ret; + flen = strlen(format); + + RNA_parameter_list_create(&parms, ptr, func); + RNA_parameter_list_begin(&parms, &iter); + + for (i = 0, ofs = 0; iter.valid; RNA_parameter_list_next(&iter), i++) { + parm = iter.parm; + flag_parameter = RNA_parameter_flag(parm); + + if (parm == pret) { + retdata = iter.data; + continue; + } + else if (flag_parameter & PARM_OUTPUT) { + continue; + } + + pid = RNA_property_identifier(parm); + + if (ofs >= flen || format[ofs] == 'N') { + if (parm->flag_parameter & PARM_REQUIRED) { + err = -1; + fprintf(stderr, "%s.%s: missing required parameter %s\n", tid, fid, pid); + break; + } + ofs++; + continue; + } + + type = RNA_property_type(parm); + ftype = format[ofs++]; + len = RNA_property_array_length(&funcptr, parm); + alen = rna_function_format_array_length(format, ofs, flen); + + if (len != alen) { + err = -1; + fprintf(stderr, + "%s.%s: for parameter %s, " + "was expecting an array of %i elements, " + "passed %i elements instead\n", + tid, + fid, + pid, + len, + alen); + break; + } + + switch (type) { + case PROP_BOOLEAN: + case PROP_INT: + case PROP_ENUM: { + int arg = va_arg(args, int); + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, iter.data, &arg, NULL, tid, fid, pid); + break; + } + case PROP_FLOAT: { + double arg = va_arg(args, double); + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, iter.data, &arg, NULL, tid, fid, pid); + break; + } + case PROP_STRING: { + const char *arg = va_arg(args, char *); + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, iter.data, &arg, NULL, tid, fid, pid); + break; + } + case PROP_POINTER: { + StructRNA *srna = va_arg(args, StructRNA *); + void *arg = va_arg(args, void *); + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, iter.data, &arg, srna, tid, fid, pid); + break; + } + case PROP_COLLECTION: { + StructRNA *srna = va_arg(args, StructRNA *); + ListBase *arg = va_arg(args, ListBase *); + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, iter.data, &arg, srna, tid, fid, pid); + break; + } + default: { + /* handle errors */ + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, iter.data, NULL, NULL, tid, fid, pid); + break; + } + } + + if (err != 0) + break; + } + + if (err == 0) + err = RNA_function_call(C, reports, ptr, func, &parms); + + /* XXX throw error when more parameters than those needed are passed or leave silent? */ + if (err == 0 && pret && ofs < flen && format[ofs++] == 'R') { + parm = pret; + + type = RNA_property_type(parm); + ftype = format[ofs++]; + len = RNA_property_array_length(&funcptr, parm); + alen = rna_function_format_array_length(format, ofs, flen); + + if (len != alen) { + err = -1; + fprintf(stderr, + "%s.%s: for return parameter %s, " + "was expecting an array of %i elements, passed %i elements instead\n", + tid, + fid, + pid, + len, + alen); + } + else { + switch (type) { + case PROP_BOOLEAN: + case PROP_INT: + case PROP_ENUM: { + int *arg = va_arg(args, int *); + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, arg, retdata, NULL, tid, fid, pid); + break; + } + case PROP_FLOAT: { + float *arg = va_arg(args, float *); + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, arg, retdata, NULL, tid, fid, pid); + break; + } + case PROP_STRING: { + char **arg = va_arg(args, char **); + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, arg, retdata, NULL, tid, fid, pid); + break; + } + case PROP_POINTER: { + StructRNA *srna = va_arg(args, StructRNA *); + void **arg = va_arg(args, void **); + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, arg, retdata, srna, tid, fid, pid); + break; + } + case PROP_COLLECTION: { + StructRNA *srna = va_arg(args, StructRNA *); + ListBase **arg = va_arg(args, ListBase **); + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, arg, retdata, srna, tid, fid, pid); + break; + } + default: { + /* handle errors */ + err = rna_function_parameter_parse( + &funcptr, parm, type, ftype, len, NULL, NULL, NULL, tid, fid, pid); + break; + } + } + } + } + + RNA_parameter_list_end(&iter); + RNA_parameter_list_free(&parms); + + return err; +} + +int RNA_function_call_direct_va_lookup(bContext *C, + ReportList *reports, + PointerRNA *ptr, + const char *identifier, + const char *format, + va_list args) +{ + FunctionRNA *func; + + func = RNA_struct_find_function(ptr->type, identifier); + + if (func) + return RNA_function_call_direct_va(C, reports, ptr, func, format, args); + + return 0; } const char *RNA_translate_ui_text( - const char *text, const char *text_ctxt, StructRNA *type, PropertyRNA *prop, int translate) + const char *text, const char *text_ctxt, StructRNA *type, PropertyRNA *prop, int translate) { - return rna_translate_ui_text(text, text_ctxt, type, prop, translate); + return rna_translate_ui_text(text, text_ctxt, type, prop, translate); } bool RNA_property_reset(PointerRNA *ptr, PropertyRNA *prop, int index) { - int len; - - /* get the length of the array to work with */ - len = RNA_property_array_length(ptr, prop); - - /* get and set the default values as appropriate for the various types */ - switch (RNA_property_type(prop)) { - case PROP_BOOLEAN: - if (len) { - if (index == -1) { - bool *tmparray = MEM_callocN(sizeof(bool) * len, "reset_defaults - boolean"); - - RNA_property_boolean_get_default_array(ptr, prop, tmparray); - RNA_property_boolean_set_array(ptr, prop, tmparray); - - MEM_freeN(tmparray); - } - else { - int value = RNA_property_boolean_get_default_index(ptr, prop, index); - RNA_property_boolean_set_index(ptr, prop, index, value); - } - } - else { - int value = RNA_property_boolean_get_default(ptr, prop); - RNA_property_boolean_set(ptr, prop, value); - } - return true; - case PROP_INT: - if (len) { - if (index == -1) { - int *tmparray = MEM_callocN(sizeof(int) * len, "reset_defaults - int"); - - RNA_property_int_get_default_array(ptr, prop, tmparray); - RNA_property_int_set_array(ptr, prop, tmparray); - - MEM_freeN(tmparray); - } - else { - int value = RNA_property_int_get_default_index(ptr, prop, index); - RNA_property_int_set_index(ptr, prop, index, value); - } - } - else { - int value = RNA_property_int_get_default(ptr, prop); - RNA_property_int_set(ptr, prop, value); - } - return true; - case PROP_FLOAT: - if (len) { - if (index == -1) { - float *tmparray = MEM_callocN(sizeof(float) * len, "reset_defaults - float"); - - RNA_property_float_get_default_array(ptr, prop, tmparray); - RNA_property_float_set_array(ptr, prop, tmparray); - - MEM_freeN(tmparray); - } - else { - float value = RNA_property_float_get_default_index(ptr, prop, index); - RNA_property_float_set_index(ptr, prop, index, value); - } - } - else { - float value = RNA_property_float_get_default(ptr, prop); - RNA_property_float_set(ptr, prop, value); - } - return true; - case PROP_ENUM: - { - int value = RNA_property_enum_get_default(ptr, prop); - RNA_property_enum_set(ptr, prop, value); - return true; - } - - case PROP_STRING: - { - char *value = RNA_property_string_get_default_alloc(ptr, prop, NULL, 0); - RNA_property_string_set(ptr, prop, value); - MEM_freeN(value); - return true; - } - - case PROP_POINTER: - { - PointerRNA value = RNA_property_pointer_get_default(ptr, prop); - RNA_property_pointer_set(ptr, prop, value); - return true; - } - - default: - /* FIXME: are there still any cases that haven't been handled? comment out "default" block to check :) */ - return false; - } + int len; + + /* get the length of the array to work with */ + len = RNA_property_array_length(ptr, prop); + + /* get and set the default values as appropriate for the various types */ + switch (RNA_property_type(prop)) { + case PROP_BOOLEAN: + if (len) { + if (index == -1) { + bool *tmparray = MEM_callocN(sizeof(bool) * len, "reset_defaults - boolean"); + + RNA_property_boolean_get_default_array(ptr, prop, tmparray); + RNA_property_boolean_set_array(ptr, prop, tmparray); + + MEM_freeN(tmparray); + } + else { + int value = RNA_property_boolean_get_default_index(ptr, prop, index); + RNA_property_boolean_set_index(ptr, prop, index, value); + } + } + else { + int value = RNA_property_boolean_get_default(ptr, prop); + RNA_property_boolean_set(ptr, prop, value); + } + return true; + case PROP_INT: + if (len) { + if (index == -1) { + int *tmparray = MEM_callocN(sizeof(int) * len, "reset_defaults - int"); + + RNA_property_int_get_default_array(ptr, prop, tmparray); + RNA_property_int_set_array(ptr, prop, tmparray); + + MEM_freeN(tmparray); + } + else { + int value = RNA_property_int_get_default_index(ptr, prop, index); + RNA_property_int_set_index(ptr, prop, index, value); + } + } + else { + int value = RNA_property_int_get_default(ptr, prop); + RNA_property_int_set(ptr, prop, value); + } + return true; + case PROP_FLOAT: + if (len) { + if (index == -1) { + float *tmparray = MEM_callocN(sizeof(float) * len, "reset_defaults - float"); + + RNA_property_float_get_default_array(ptr, prop, tmparray); + RNA_property_float_set_array(ptr, prop, tmparray); + + MEM_freeN(tmparray); + } + else { + float value = RNA_property_float_get_default_index(ptr, prop, index); + RNA_property_float_set_index(ptr, prop, index, value); + } + } + else { + float value = RNA_property_float_get_default(ptr, prop); + RNA_property_float_set(ptr, prop, value); + } + return true; + case PROP_ENUM: { + int value = RNA_property_enum_get_default(ptr, prop); + RNA_property_enum_set(ptr, prop, value); + return true; + } + + case PROP_STRING: { + char *value = RNA_property_string_get_default_alloc(ptr, prop, NULL, 0); + RNA_property_string_set(ptr, prop, value); + MEM_freeN(value); + return true; + } + + case PROP_POINTER: { + PointerRNA value = RNA_property_pointer_get_default(ptr, prop); + RNA_property_pointer_set(ptr, prop, value); + return true; + } + + default: + /* FIXME: are there still any cases that haven't been handled? comment out "default" block to check :) */ + return false; + } } bool RNA_property_assign_default(PointerRNA *ptr, PropertyRNA *prop) { - if (!RNA_property_is_idprop(prop) || RNA_property_array_check(prop)) { - return false; - } - - /* get and set the default values as appropriate for the various types */ - switch (RNA_property_type(prop)) { - case PROP_INT: - { - int value = RNA_property_int_get(ptr, prop); - return RNA_property_int_set_default(ptr, prop, value); - } - - case PROP_FLOAT: - { - float value = RNA_property_float_get(ptr, prop); - return RNA_property_float_set_default(ptr, prop, value); - } - - default: - return false; - } -} - -static bool rna_property_override_operation_apply( - Main *bmain, - PointerRNA *ptr_local, PointerRNA *ptr_override, PointerRNA *ptr_storage, - PropertyRNA *prop_local, PropertyRNA *prop_override, PropertyRNA *prop_storage, - PointerRNA *ptr_item_local, PointerRNA *ptr_item_override, PointerRNA *ptr_item_storage, - IDOverrideStaticPropertyOperation *opop); - -bool RNA_property_copy(Main *bmain, PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, int index) -{ - if (!RNA_property_editable(ptr, prop)) { - return false; - } - - PropertyRNA *prop_dst = prop; - PropertyRNA *prop_src = prop; - - /* Ensure we get real property data, be it an actual RNA property, or an IDProperty in disguise. */ - prop_dst = rna_ensure_property_realdata(&prop_dst, ptr); - prop_src = rna_ensure_property_realdata(&prop_src, fromptr); - - /* IDprops: destination may not exist, if source does and is set, try to create it. */ - /* Note: this is sort of quick hack/bandage to fix the issue, we need to rethink how IDProps are handled - * in 'diff' RNA code completely, imho... */ - if (prop_src != NULL && prop_dst == NULL && RNA_property_is_set(fromptr, prop)) { - BLI_assert(prop_src->magic != RNA_MAGIC); - IDProperty *idp_dst = RNA_struct_idprops(ptr, true); - IDProperty *prop_idp_dst = IDP_CopyProperty((IDProperty *)prop_src); - IDP_AddToGroup(idp_dst, prop_idp_dst); - rna_idproperty_touch(prop_idp_dst); - /* Nothing else to do here... */ - return true; - } - - if (ELEM(NULL, prop_dst, prop_src)) { - return false; - } - - IDOverrideStaticPropertyOperation opop = { - .operation = IDOVERRIDESTATIC_OP_REPLACE, - .subitem_reference_index = index, - .subitem_local_index = index, - }; - return rna_property_override_operation_apply( - bmain, - ptr, fromptr, NULL, - prop_dst, prop_src, NULL, - NULL, NULL, NULL, - &opop); + if (!RNA_property_is_idprop(prop) || RNA_property_array_check(prop)) { + return false; + } + + /* get and set the default values as appropriate for the various types */ + switch (RNA_property_type(prop)) { + case PROP_INT: { + int value = RNA_property_int_get(ptr, prop); + return RNA_property_int_set_default(ptr, prop, value); + } + + case PROP_FLOAT: { + float value = RNA_property_float_get(ptr, prop); + return RNA_property_float_set_default(ptr, prop, value); + } + + default: + return false; + } +} + +static bool rna_property_override_operation_apply(Main *bmain, + PointerRNA *ptr_local, + PointerRNA *ptr_override, + PointerRNA *ptr_storage, + PropertyRNA *prop_local, + PropertyRNA *prop_override, + PropertyRNA *prop_storage, + PointerRNA *ptr_item_local, + PointerRNA *ptr_item_override, + PointerRNA *ptr_item_storage, + IDOverrideStaticPropertyOperation *opop); + +bool RNA_property_copy( + Main *bmain, PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, int index) +{ + if (!RNA_property_editable(ptr, prop)) { + return false; + } + + PropertyRNA *prop_dst = prop; + PropertyRNA *prop_src = prop; + + /* Ensure we get real property data, be it an actual RNA property, or an IDProperty in disguise. */ + prop_dst = rna_ensure_property_realdata(&prop_dst, ptr); + prop_src = rna_ensure_property_realdata(&prop_src, fromptr); + + /* IDprops: destination may not exist, if source does and is set, try to create it. */ + /* Note: this is sort of quick hack/bandage to fix the issue, we need to rethink how IDProps are handled + * in 'diff' RNA code completely, imho... */ + if (prop_src != NULL && prop_dst == NULL && RNA_property_is_set(fromptr, prop)) { + BLI_assert(prop_src->magic != RNA_MAGIC); + IDProperty *idp_dst = RNA_struct_idprops(ptr, true); + IDProperty *prop_idp_dst = IDP_CopyProperty((IDProperty *)prop_src); + IDP_AddToGroup(idp_dst, prop_idp_dst); + rna_idproperty_touch(prop_idp_dst); + /* Nothing else to do here... */ + return true; + } + + if (ELEM(NULL, prop_dst, prop_src)) { + return false; + } + + IDOverrideStaticPropertyOperation opop = { + .operation = IDOVERRIDESTATIC_OP_REPLACE, + .subitem_reference_index = index, + .subitem_local_index = index, + }; + return rna_property_override_operation_apply( + bmain, ptr, fromptr, NULL, prop_dst, prop_src, NULL, NULL, NULL, NULL, &opop); } /* use RNA_warning macro which includes __func__ suffix */ void _RNA_warning(const char *format, ...) { - va_list args; + va_list args; - va_start(args, format); - vprintf(format, args); - va_end(args); + va_start(args, format); + vprintf(format, args); + va_end(args); - /* gcc macro adds '\n', but cant use for other compilers */ + /* gcc macro adds '\n', but cant use for other compilers */ #ifndef __GNUC__ - fputc('\n', stdout); + fputc('\n', stdout); #endif #ifdef WITH_PYTHON - { - extern void PyC_LineSpit(void); - PyC_LineSpit(); - } + { + extern void PyC_LineSpit(void); + PyC_LineSpit(); + } #endif } -static int rna_property_override_diff( - Main *bmain, - PointerRNA *ptr_a, PointerRNA *ptr_b, PropertyRNA *prop, PropertyRNA *prop_a, PropertyRNA *prop_b, const char *rna_path, - eRNACompareMode mode, IDOverrideStatic *override, const int flags, eRNAOverrideMatchResult *r_report_flags); +static int rna_property_override_diff(Main *bmain, + PointerRNA *ptr_a, + PointerRNA *ptr_b, + PropertyRNA *prop, + PropertyRNA *prop_a, + PropertyRNA *prop_b, + const char *rna_path, + eRNACompareMode mode, + IDOverrideStatic *override, + const int flags, + eRNAOverrideMatchResult *r_report_flags); -bool RNA_property_equals(Main *bmain, PointerRNA *ptr_a, PointerRNA *ptr_b, PropertyRNA *prop, eRNACompareMode mode) +bool RNA_property_equals( + Main *bmain, PointerRNA *ptr_a, PointerRNA *ptr_b, PropertyRNA *prop, eRNACompareMode mode) { - BLI_assert(ELEM(mode, RNA_EQ_STRICT, RNA_EQ_UNSET_MATCH_ANY, RNA_EQ_UNSET_MATCH_NONE)); + BLI_assert(ELEM(mode, RNA_EQ_STRICT, RNA_EQ_UNSET_MATCH_ANY, RNA_EQ_UNSET_MATCH_NONE)); - return (rna_property_override_diff(bmain, ptr_a, ptr_b, prop, NULL, NULL, NULL, mode, NULL, 0, NULL) == 0); + return (rna_property_override_diff( + bmain, ptr_a, ptr_b, prop, NULL, NULL, NULL, mode, NULL, 0, NULL) == 0); } bool RNA_struct_equals(Main *bmain, PointerRNA *ptr_a, PointerRNA *ptr_b, eRNACompareMode mode) { - CollectionPropertyIterator iter; - PropertyRNA *iterprop; - bool equals = true; + CollectionPropertyIterator iter; + PropertyRNA *iterprop; + bool equals = true; - if (ptr_a == NULL && ptr_b == NULL) - return true; - else if (ptr_a == NULL || ptr_b == NULL) - return false; - else if (ptr_a->type != ptr_b->type) - return false; + if (ptr_a == NULL && ptr_b == NULL) + return true; + else if (ptr_a == NULL || ptr_b == NULL) + return false; + else if (ptr_a->type != ptr_b->type) + return false; - iterprop = RNA_struct_iterator_property(ptr_a->type); + iterprop = RNA_struct_iterator_property(ptr_a->type); - RNA_property_collection_begin(ptr_a, iterprop, &iter); - for (; iter.valid; RNA_property_collection_next(&iter)) { - PropertyRNA *prop = iter.ptr.data; + RNA_property_collection_begin(ptr_a, iterprop, &iter); + for (; iter.valid; RNA_property_collection_next(&iter)) { + PropertyRNA *prop = iter.ptr.data; - if (!RNA_property_equals(bmain, ptr_a, ptr_b, prop, mode)) { - equals = false; - break; - } - } - RNA_property_collection_end(&iter); + if (!RNA_property_equals(bmain, ptr_a, ptr_b, prop, mode)) { + equals = false; + break; + } + } + RNA_property_collection_end(&iter); - return equals; + return equals; } /* Low-level functions, also used by non-override RNA API like copy or equality check. */ @@ -7593,247 +7821,297 @@ bool RNA_struct_equals(Main *bmain, PointerRNA *ptr_a, PointerRNA *ptr_b, eRNACo * * \note When there is no equality, but we cannot determine an order (greater than/lesser than), we return 1. */ -static int rna_property_override_diff( - Main *bmain, - PointerRNA *ptr_a, PointerRNA *ptr_b, PropertyRNA *prop, PropertyRNA *prop_a, PropertyRNA *prop_b, - const char *rna_path, eRNACompareMode mode, - IDOverrideStatic *override, const int flags, eRNAOverrideMatchResult *r_report_flags) -{ - if (prop != NULL) { - BLI_assert(prop_a == NULL && prop_b == NULL); - prop_a = prop; - prop_b = prop; - } - - if (ELEM(NULL, prop_a, prop_b)) { - return (prop_a == prop_b) ? 0 : 1; - } - - if (!RNA_property_comparable(ptr_a, prop_a) || !RNA_property_comparable(ptr_b, prop_b)) { - return 0; - } - - if (mode == RNA_EQ_UNSET_MATCH_ANY) { - /* uninitialized properties are assumed to match anything */ - if (!RNA_property_is_set(ptr_a, prop_a) || !RNA_property_is_set(ptr_b, prop_b)) { - return 0; - } - } - else if (mode == RNA_EQ_UNSET_MATCH_NONE) { - /* unset properties never match set properties */ - if (RNA_property_is_set(ptr_a, prop_a) != RNA_property_is_set(ptr_b, prop_b)) { - return 1; - } - } - - if (prop != NULL) { - /* Ensure we get real property data, be it an actual RNA property, or an IDProperty in disguise. */ - prop_a = rna_ensure_property_realdata(&prop_a, ptr_a); - prop_b = rna_ensure_property_realdata(&prop_b, ptr_b); - - if (ELEM(NULL, prop_a, prop_b)) { - return (prop_a == prop_b) ? 0 : 1; - } - } - - /* Check if we are working with arrays. */ - const bool is_array_a = RNA_property_array_check(prop_a); - const bool is_array_b = RNA_property_array_check(prop_b); - - if (is_array_a != is_array_b) { - /* Should probably never happen actually... */ - BLI_assert(0); - return is_array_a ? 1 : -1; - } - - /* Get the length of the array to work with. */ - const int len_a = RNA_property_array_length(ptr_a, prop_a); - const int len_b = RNA_property_array_length(ptr_b, prop_b); - - if (len_a != len_b) { - /* Do not handle override in that case, we do not support insertion/deletion from arrays for now. */ - return len_a > len_b ? 1 : -1; - } - - if (is_array_a && len_a == 0) { - /* Empty arrays, will happen in some case with dynamic ones. */ - return 0; - } - - RNAPropOverrideDiff override_diff = NULL; - /* Special case for IDProps, we use default callback then. */ - if (prop_a->magic != RNA_MAGIC) { - override_diff = rna_property_override_diff_default; - if (prop_b->magic == RNA_MAGIC && prop_b->override_diff != override_diff) { - override_diff = NULL; - } - } - else if (prop_b->magic != RNA_MAGIC) { - override_diff = rna_property_override_diff_default; - if (prop_a->override_diff != override_diff) { - override_diff = NULL; - } - } - else if (prop_a->override_diff == prop_b->override_diff) { - override_diff = prop_a->override_diff; - } - - if (override_diff == NULL) { +static int rna_property_override_diff(Main *bmain, + PointerRNA *ptr_a, + PointerRNA *ptr_b, + PropertyRNA *prop, + PropertyRNA *prop_a, + PropertyRNA *prop_b, + const char *rna_path, + eRNACompareMode mode, + IDOverrideStatic *override, + const int flags, + eRNAOverrideMatchResult *r_report_flags) +{ + if (prop != NULL) { + BLI_assert(prop_a == NULL && prop_b == NULL); + prop_a = prop; + prop_b = prop; + } + + if (ELEM(NULL, prop_a, prop_b)) { + return (prop_a == prop_b) ? 0 : 1; + } + + if (!RNA_property_comparable(ptr_a, prop_a) || !RNA_property_comparable(ptr_b, prop_b)) { + return 0; + } + + if (mode == RNA_EQ_UNSET_MATCH_ANY) { + /* uninitialized properties are assumed to match anything */ + if (!RNA_property_is_set(ptr_a, prop_a) || !RNA_property_is_set(ptr_b, prop_b)) { + return 0; + } + } + else if (mode == RNA_EQ_UNSET_MATCH_NONE) { + /* unset properties never match set properties */ + if (RNA_property_is_set(ptr_a, prop_a) != RNA_property_is_set(ptr_b, prop_b)) { + return 1; + } + } + + if (prop != NULL) { + /* Ensure we get real property data, be it an actual RNA property, or an IDProperty in disguise. */ + prop_a = rna_ensure_property_realdata(&prop_a, ptr_a); + prop_b = rna_ensure_property_realdata(&prop_b, ptr_b); + + if (ELEM(NULL, prop_a, prop_b)) { + return (prop_a == prop_b) ? 0 : 1; + } + } + + /* Check if we are working with arrays. */ + const bool is_array_a = RNA_property_array_check(prop_a); + const bool is_array_b = RNA_property_array_check(prop_b); + + if (is_array_a != is_array_b) { + /* Should probably never happen actually... */ + BLI_assert(0); + return is_array_a ? 1 : -1; + } + + /* Get the length of the array to work with. */ + const int len_a = RNA_property_array_length(ptr_a, prop_a); + const int len_b = RNA_property_array_length(ptr_b, prop_b); + + if (len_a != len_b) { + /* Do not handle override in that case, we do not support insertion/deletion from arrays for now. */ + return len_a > len_b ? 1 : -1; + } + + if (is_array_a && len_a == 0) { + /* Empty arrays, will happen in some case with dynamic ones. */ + return 0; + } + + RNAPropOverrideDiff override_diff = NULL; + /* Special case for IDProps, we use default callback then. */ + if (prop_a->magic != RNA_MAGIC) { + override_diff = rna_property_override_diff_default; + if (prop_b->magic == RNA_MAGIC && prop_b->override_diff != override_diff) { + override_diff = NULL; + } + } + else if (prop_b->magic != RNA_MAGIC) { + override_diff = rna_property_override_diff_default; + if (prop_a->override_diff != override_diff) { + override_diff = NULL; + } + } + else if (prop_a->override_diff == prop_b->override_diff) { + override_diff = prop_a->override_diff; + } + + if (override_diff == NULL) { #ifndef NDEBUG - printf("'%s' gives unmatching or NULL RNA diff callbacks, should not happen (%d vs. %d).\n", - rna_path ? rna_path : (prop_a->magic != RNA_MAGIC ? ((IDProperty *)prop_a)->name : prop_a->identifier), - prop_a->magic == RNA_MAGIC, prop_b->magic == RNA_MAGIC); + printf("'%s' gives unmatching or NULL RNA diff callbacks, should not happen (%d vs. %d).\n", + rna_path ? + rna_path : + (prop_a->magic != RNA_MAGIC ? ((IDProperty *)prop_a)->name : prop_a->identifier), + prop_a->magic == RNA_MAGIC, + prop_b->magic == RNA_MAGIC); #endif - BLI_assert(0); - return 1; - } - - bool override_changed = false; - int diff_flags = flags; - if (!RNA_property_overridable_get(ptr_a, prop_a)) { - diff_flags &= ~RNA_OVERRIDE_COMPARE_CREATE; - } - const int diff = override_diff( - bmain, - ptr_a, ptr_b, prop_a, prop_b, len_a, len_b, - mode, override, rna_path, diff_flags, &override_changed); - if (override_changed && r_report_flags) { - *r_report_flags |= RNA_OVERRIDE_MATCH_RESULT_CREATED; - } - - return diff; + BLI_assert(0); + return 1; + } + + bool override_changed = false; + int diff_flags = flags; + if (!RNA_property_overridable_get(ptr_a, prop_a)) { + diff_flags &= ~RNA_OVERRIDE_COMPARE_CREATE; + } + const int diff = override_diff(bmain, + ptr_a, + ptr_b, + prop_a, + prop_b, + len_a, + len_b, + mode, + override, + rna_path, + diff_flags, + &override_changed); + if (override_changed && r_report_flags) { + *r_report_flags |= RNA_OVERRIDE_MATCH_RESULT_CREATED; + } + + return diff; } /* Modify local data-block to make it ready for override application (only needed for diff operations, where we use * the local data-block's data as second operand). */ -static bool rna_property_override_operation_store( - Main *bmain, - PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, - PropertyRNA *prop_local, PropertyRNA *prop_reference, PropertyRNA *prop_storage, - IDOverrideStaticProperty *op) -{ - int len_local, len_reference, len_storage = 0; - bool changed = false; - - if (ptr_storage == NULL) { - return changed; - } - - /* get the length of the array to work with */ - len_local = RNA_property_array_length(ptr_local, prop_local); - len_reference = RNA_property_array_length(ptr_reference, prop_reference); - if (prop_storage) { - len_storage = RNA_property_array_length(ptr_storage, prop_storage); - } - - if (len_local != len_reference || len_local != len_storage) { - /* Do not handle override in that case, we do not support insertion/deletion from arrays for now. */ - return changed; - } - - BLI_assert(prop_local->override_store == prop_reference->override_store && - (!ptr_storage || prop_local->override_store == prop_storage->override_store) && - prop_local->override_store != NULL); - - for (IDOverrideStaticPropertyOperation *opop = op->operations.first; opop; opop = opop->next) { - /* Only needed for diff operations. */ - if (!ELEM(opop->operation, IDOVERRIDESTATIC_OP_ADD, IDOVERRIDESTATIC_OP_SUBTRACT, IDOVERRIDESTATIC_OP_MULTIPLY)) { - continue; - } - - if (prop_local->override_store( - bmain, - ptr_local, ptr_reference, ptr_storage, - prop_local, prop_reference, prop_storage, - len_local, len_reference, len_storage, - opop)) - { - changed = true; - } - } - - return changed; -} - -static bool rna_property_override_operation_apply( - Main *bmain, - PointerRNA *ptr_local, PointerRNA *ptr_override, PointerRNA *ptr_storage, - PropertyRNA *prop_local, PropertyRNA *prop_override, PropertyRNA *prop_storage, - PointerRNA *ptr_item_local, PointerRNA *ptr_item_override, PointerRNA *ptr_item_storage, - IDOverrideStaticPropertyOperation *opop) -{ - int len_local, len_reference, len_storage = 0; - - const short override_op = opop->operation; - - if (override_op == IDOVERRIDESTATIC_OP_NOOP) { - return true; - } - - if (ELEM(override_op, IDOVERRIDESTATIC_OP_ADD, IDOVERRIDESTATIC_OP_SUBTRACT, IDOVERRIDESTATIC_OP_MULTIPLY) && !ptr_storage) { - /* We cannot apply 'diff' override operations without some reference storage. - * This should typically only happen at read time of .blend file... */ - return false; - } - - if (ELEM(override_op, IDOVERRIDESTATIC_OP_ADD, IDOVERRIDESTATIC_OP_SUBTRACT, IDOVERRIDESTATIC_OP_MULTIPLY) && !prop_storage) { - /* We cannot apply 'diff' override operations without some reference storage. - * This should typically only happen at read time of .blend file... */ - return false; - } - - RNAPropOverrideApply override_apply = NULL; - /* Special case for IDProps, we use default callback then. */ - if (prop_local->magic != RNA_MAGIC) { - override_apply = rna_property_override_apply_default; - if (prop_override->magic == RNA_MAGIC && prop_override->override_apply != override_apply) { - override_apply = NULL; - } - } - else if (prop_override->magic != RNA_MAGIC) { - override_apply = rna_property_override_apply_default; - if (prop_local->override_apply != override_apply) { - override_apply = NULL; - } - } - else if (prop_local->override_apply == prop_override->override_apply) { - override_apply = prop_local->override_apply; - } - - if (ptr_storage && prop_storage->magic == RNA_MAGIC && prop_storage->override_apply != override_apply) { - override_apply = NULL; - } - - if (override_apply == NULL) { +static bool rna_property_override_operation_store(Main *bmain, + PointerRNA *ptr_local, + PointerRNA *ptr_reference, + PointerRNA *ptr_storage, + PropertyRNA *prop_local, + PropertyRNA *prop_reference, + PropertyRNA *prop_storage, + IDOverrideStaticProperty *op) +{ + int len_local, len_reference, len_storage = 0; + bool changed = false; + + if (ptr_storage == NULL) { + return changed; + } + + /* get the length of the array to work with */ + len_local = RNA_property_array_length(ptr_local, prop_local); + len_reference = RNA_property_array_length(ptr_reference, prop_reference); + if (prop_storage) { + len_storage = RNA_property_array_length(ptr_storage, prop_storage); + } + + if (len_local != len_reference || len_local != len_storage) { + /* Do not handle override in that case, we do not support insertion/deletion from arrays for now. */ + return changed; + } + + BLI_assert(prop_local->override_store == prop_reference->override_store && + (!ptr_storage || prop_local->override_store == prop_storage->override_store) && + prop_local->override_store != NULL); + + for (IDOverrideStaticPropertyOperation *opop = op->operations.first; opop; opop = opop->next) { + /* Only needed for diff operations. */ + if (!ELEM(opop->operation, + IDOVERRIDESTATIC_OP_ADD, + IDOVERRIDESTATIC_OP_SUBTRACT, + IDOVERRIDESTATIC_OP_MULTIPLY)) { + continue; + } + + if (prop_local->override_store(bmain, + ptr_local, + ptr_reference, + ptr_storage, + prop_local, + prop_reference, + prop_storage, + len_local, + len_reference, + len_storage, + opop)) { + changed = true; + } + } + + return changed; +} + +static bool rna_property_override_operation_apply(Main *bmain, + PointerRNA *ptr_local, + PointerRNA *ptr_override, + PointerRNA *ptr_storage, + PropertyRNA *prop_local, + PropertyRNA *prop_override, + PropertyRNA *prop_storage, + PointerRNA *ptr_item_local, + PointerRNA *ptr_item_override, + PointerRNA *ptr_item_storage, + IDOverrideStaticPropertyOperation *opop) +{ + int len_local, len_reference, len_storage = 0; + + const short override_op = opop->operation; + + if (override_op == IDOVERRIDESTATIC_OP_NOOP) { + return true; + } + + if (ELEM(override_op, + IDOVERRIDESTATIC_OP_ADD, + IDOVERRIDESTATIC_OP_SUBTRACT, + IDOVERRIDESTATIC_OP_MULTIPLY) && + !ptr_storage) { + /* We cannot apply 'diff' override operations without some reference storage. + * This should typically only happen at read time of .blend file... */ + return false; + } + + if (ELEM(override_op, + IDOVERRIDESTATIC_OP_ADD, + IDOVERRIDESTATIC_OP_SUBTRACT, + IDOVERRIDESTATIC_OP_MULTIPLY) && + !prop_storage) { + /* We cannot apply 'diff' override operations without some reference storage. + * This should typically only happen at read time of .blend file... */ + return false; + } + + RNAPropOverrideApply override_apply = NULL; + /* Special case for IDProps, we use default callback then. */ + if (prop_local->magic != RNA_MAGIC) { + override_apply = rna_property_override_apply_default; + if (prop_override->magic == RNA_MAGIC && prop_override->override_apply != override_apply) { + override_apply = NULL; + } + } + else if (prop_override->magic != RNA_MAGIC) { + override_apply = rna_property_override_apply_default; + if (prop_local->override_apply != override_apply) { + override_apply = NULL; + } + } + else if (prop_local->override_apply == prop_override->override_apply) { + override_apply = prop_local->override_apply; + } + + if (ptr_storage && prop_storage->magic == RNA_MAGIC && + prop_storage->override_apply != override_apply) { + override_apply = NULL; + } + + if (override_apply == NULL) { #ifndef NDEBUG - printf("'%s' gives unmatching or NULL RNA copy callbacks, should not happen (%d vs. %d).\n", - prop_local->magic != RNA_MAGIC ? ((IDProperty *)prop_local)->name : prop_local->identifier, - prop_local->magic == RNA_MAGIC, prop_override->magic == RNA_MAGIC); + printf("'%s' gives unmatching or NULL RNA copy callbacks, should not happen (%d vs. %d).\n", + prop_local->magic != RNA_MAGIC ? ((IDProperty *)prop_local)->name : + prop_local->identifier, + prop_local->magic == RNA_MAGIC, + prop_override->magic == RNA_MAGIC); #endif - BLI_assert(0); - return false; - } - - /* get the length of the array to work with */ - len_local = RNA_property_array_length(ptr_local, prop_local); - len_reference = RNA_property_array_length(ptr_override, prop_override); - if (ptr_storage) { - len_storage = RNA_property_array_length(ptr_storage, prop_storage); - } - - if (len_local != len_reference || (ptr_storage && len_local != len_storage)) { - /* Do not handle override in that case, we do not support insertion/deletion from arrays for now. */ - return false; - } - - /* get and set the default values as appropriate for the various types */ - return override_apply( - bmain, - ptr_local, ptr_override, ptr_storage, - prop_local, prop_override, prop_storage, - len_local, len_reference, len_storage, - ptr_item_local, ptr_item_override, ptr_item_storage, - opop); + BLI_assert(0); + return false; + } + + /* get the length of the array to work with */ + len_local = RNA_property_array_length(ptr_local, prop_local); + len_reference = RNA_property_array_length(ptr_override, prop_override); + if (ptr_storage) { + len_storage = RNA_property_array_length(ptr_storage, prop_storage); + } + + if (len_local != len_reference || (ptr_storage && len_local != len_storage)) { + /* Do not handle override in that case, we do not support insertion/deletion from arrays for now. */ + return false; + } + + /* get and set the default values as appropriate for the various types */ + return override_apply(bmain, + ptr_local, + ptr_override, + ptr_storage, + prop_local, + prop_override, + prop_storage, + len_local, + len_reference, + len_storage, + ptr_item_local, + ptr_item_override, + ptr_item_storage, + opop); } /** @@ -7845,454 +8123,515 @@ static bool rna_property_override_operation_apply( * * \return True if _resulting_ \a ptr_local does match \a ptr_reference. */ -bool RNA_struct_override_matches( - Main *bmain, - PointerRNA *ptr_local, PointerRNA *ptr_reference, const char *root_path, - IDOverrideStatic *override, const eRNAOverrideMatch flags, - eRNAOverrideMatchResult *r_report_flags) -{ - CollectionPropertyIterator iter; - PropertyRNA *iterprop; - bool matching = true; - - BLI_assert(ptr_local->type == ptr_reference->type); - BLI_assert(ptr_local->id.data && ptr_reference->id.data); - - const bool ignore_non_overridable = (flags & RNA_OVERRIDE_COMPARE_IGNORE_NON_OVERRIDABLE) != 0; - const bool ignore_overridden = (flags & RNA_OVERRIDE_COMPARE_IGNORE_OVERRIDDEN) != 0; - const bool do_create = (flags & RNA_OVERRIDE_COMPARE_CREATE) != 0; - const bool do_restore = (flags & RNA_OVERRIDE_COMPARE_RESTORE) != 0; +bool RNA_struct_override_matches(Main *bmain, + PointerRNA *ptr_local, + PointerRNA *ptr_reference, + const char *root_path, + IDOverrideStatic *override, + const eRNAOverrideMatch flags, + eRNAOverrideMatchResult *r_report_flags) +{ + CollectionPropertyIterator iter; + PropertyRNA *iterprop; + bool matching = true; + + BLI_assert(ptr_local->type == ptr_reference->type); + BLI_assert(ptr_local->id.data && ptr_reference->id.data); + + const bool ignore_non_overridable = (flags & RNA_OVERRIDE_COMPARE_IGNORE_NON_OVERRIDABLE) != 0; + const bool ignore_overridden = (flags & RNA_OVERRIDE_COMPARE_IGNORE_OVERRIDDEN) != 0; + const bool do_create = (flags & RNA_OVERRIDE_COMPARE_CREATE) != 0; + const bool do_restore = (flags & RNA_OVERRIDE_COMPARE_RESTORE) != 0; //#define DEBUG_OVERRIDE_TIMEIT #ifdef DEBUG_OVERRIDE_TIMEIT - static float _sum_time_global = 0.0f; - static float _num_time_global = 0.0f; - double _timeit_time_global; - static float _sum_time_diffing = 0.0f; - static float _delta_time_diffing = 0.0f; - static int _num_delta_time_diffing = 0.0f; - static float _num_time_diffing = 0.0f; - double _timeit_time_diffing; - - if (!root_path) { - _delta_time_diffing = 0.0f; - _num_delta_time_diffing = 0; - _timeit_time_global = PIL_check_seconds_timer(); - } + static float _sum_time_global = 0.0f; + static float _num_time_global = 0.0f; + double _timeit_time_global; + static float _sum_time_diffing = 0.0f; + static float _delta_time_diffing = 0.0f; + static int _num_delta_time_diffing = 0.0f; + static float _num_time_diffing = 0.0f; + double _timeit_time_diffing; + + if (!root_path) { + _delta_time_diffing = 0.0f; + _num_delta_time_diffing = 0; + _timeit_time_global = PIL_check_seconds_timer(); + } #endif - iterprop = RNA_struct_iterator_property(ptr_local->type); + iterprop = RNA_struct_iterator_property(ptr_local->type); - for (RNA_property_collection_begin(ptr_local, iterprop, &iter); iter.valid; RNA_property_collection_next(&iter)) { - PropertyRNA *prop_local = iter.ptr.data; - PropertyRNA *prop_reference = iter.ptr.data; + for (RNA_property_collection_begin(ptr_local, iterprop, &iter); iter.valid; + RNA_property_collection_next(&iter)) { + PropertyRNA *prop_local = iter.ptr.data; + PropertyRNA *prop_reference = iter.ptr.data; - /* Ensure we get real property data, be it an actual RNA property, or an IDProperty in disguise. */ - prop_local = rna_ensure_property_realdata(&prop_local, ptr_local); - prop_reference = rna_ensure_property_realdata(&prop_reference, ptr_reference); + /* Ensure we get real property data, be it an actual RNA property, or an IDProperty in disguise. */ + prop_local = rna_ensure_property_realdata(&prop_local, ptr_local); + prop_reference = rna_ensure_property_realdata(&prop_reference, ptr_reference); - if (ELEM(NULL, prop_local, prop_reference)) { - continue; - } + if (ELEM(NULL, prop_local, prop_reference)) { + continue; + } - if (ignore_non_overridable && !RNA_property_overridable_get(ptr_local, prop_local)) { - continue; - } + if (ignore_non_overridable && !RNA_property_overridable_get(ptr_local, prop_local)) { + continue; + } -#if 0 /* This actually makes things slower, since it has to check for animation paths etc! */ - if (RNA_property_animated(ptr_local, prop_local)) { - /* We cannot do anything here really, animation is some kind of dynamic overrides that has - * precedence over static one... */ - continue; - } +#if 0 /* This actually makes things slower, since it has to check for animation paths etc! */ + if (RNA_property_animated(ptr_local, prop_local)) { + /* We cannot do anything here really, animation is some kind of dynamic overrides that has + * precedence over static one... */ + continue; + } #endif #define RNA_PATH_BUFFSIZE 8192 #define RNA_PATH_PRINTF(_str, ...) \ - if (BLI_snprintf(rna_path, RNA_PATH_BUFFSIZE, \ - (_str), __VA_ARGS__) >= RNA_PATH_BUFFSIZE) \ - { rna_path = BLI_sprintfN((_str), __VA_ARGS__); }(void)0 + if (BLI_snprintf(rna_path, RNA_PATH_BUFFSIZE, (_str), __VA_ARGS__) >= RNA_PATH_BUFFSIZE) { \ + rna_path = BLI_sprintfN((_str), __VA_ARGS__); \ + } \ + (void)0 #define RNA_PATH_FREE \ - if (rna_path != rna_path_buffer) MEM_freeN(rna_path) - - char rna_path_buffer[RNA_PATH_BUFFSIZE]; - char *rna_path = rna_path_buffer; - - /* XXX TODO this will have to be refined to handle collections insertions, and array items */ - if (root_path) { - /* Inlined building, much much more efficient. */ - if (prop_local->magic == RNA_MAGIC) { - RNA_PATH_PRINTF("%s.%s", root_path, RNA_property_identifier(prop_local)); - } - else { - RNA_PATH_PRINTF("%s[\"%s\"]", root_path, RNA_property_identifier(prop_local)); - } - } - else { - /* This is rather slow, but is not much called, so not really worth optimizing. */ - rna_path = RNA_path_from_ID_to_property(ptr_local, prop_local); - } - if (rna_path == NULL) { - continue; - } - -// printf("Override Checking %s\n", rna_path); - - if (ignore_overridden && BKE_override_static_property_find(override, rna_path) != NULL) { - RNA_PATH_FREE; - continue; - } + if (rna_path != rna_path_buffer) \ + MEM_freeN(rna_path) + + char rna_path_buffer[RNA_PATH_BUFFSIZE]; + char *rna_path = rna_path_buffer; + + /* XXX TODO this will have to be refined to handle collections insertions, and array items */ + if (root_path) { + /* Inlined building, much much more efficient. */ + if (prop_local->magic == RNA_MAGIC) { + RNA_PATH_PRINTF("%s.%s", root_path, RNA_property_identifier(prop_local)); + } + else { + RNA_PATH_PRINTF("%s[\"%s\"]", root_path, RNA_property_identifier(prop_local)); + } + } + else { + /* This is rather slow, but is not much called, so not really worth optimizing. */ + rna_path = RNA_path_from_ID_to_property(ptr_local, prop_local); + } + if (rna_path == NULL) { + continue; + } + + // printf("Override Checking %s\n", rna_path); + + if (ignore_overridden && BKE_override_static_property_find(override, rna_path) != NULL) { + RNA_PATH_FREE; + continue; + } #ifdef DEBUG_OVERRIDE_TIMEIT - if (!root_path) { - _timeit_time_diffing = PIL_check_seconds_timer(); - } + if (!root_path) { + _timeit_time_diffing = PIL_check_seconds_timer(); + } #endif - eRNAOverrideMatchResult report_flags = 0; - const int diff = rna_property_override_diff( - bmain, - ptr_local, ptr_reference, NULL, prop_local, prop_reference, rna_path, - RNA_EQ_STRICT, override, flags, &report_flags); + eRNAOverrideMatchResult report_flags = 0; + const int diff = rna_property_override_diff(bmain, + ptr_local, + ptr_reference, + NULL, + prop_local, + prop_reference, + rna_path, + RNA_EQ_STRICT, + override, + flags, + &report_flags); #ifdef DEBUG_OVERRIDE_TIMEIT - if (!root_path) { - const float _delta_time = (float)(PIL_check_seconds_timer() - _timeit_time_diffing); - _delta_time_diffing += _delta_time; - _num_delta_time_diffing++; - } + if (!root_path) { + const float _delta_time = (float)(PIL_check_seconds_timer() - _timeit_time_diffing); + _delta_time_diffing += _delta_time; + _num_delta_time_diffing++; + } #endif - matching = matching && diff == 0; - if (r_report_flags) { - *r_report_flags |= report_flags; - } - - if (diff != 0) { - /* XXX TODO: refine this for per-item overriding of arrays... */ - IDOverrideStaticProperty *op = BKE_override_static_property_find(override, rna_path); - IDOverrideStaticPropertyOperation *opop = op ? op->operations.first : NULL; - - if (do_restore && (report_flags & RNA_OVERRIDE_MATCH_RESULT_CREATED) == 0) { - /* We are allowed to restore to reference's values. */ - if (ELEM(NULL, op, opop) || opop->operation == IDOVERRIDESTATIC_OP_NOOP) { - /* We should restore that property to its reference value */ - if (RNA_property_editable(ptr_local, prop_local)) { - IDOverrideStaticPropertyOperation opop_tmp = { - .operation = IDOVERRIDESTATIC_OP_REPLACE, - .subitem_reference_index = -1, - .subitem_local_index = -1, - }; - rna_property_override_operation_apply( - bmain, - ptr_local, ptr_reference, NULL, - prop_local, prop_reference, NULL, - NULL, NULL, NULL, - &opop_tmp); - if (r_report_flags) { - *r_report_flags |= RNA_OVERRIDE_MATCH_RESULT_RESTORED; - } - } - else { - /* Too noisy for now, this triggers on runtime props like transform matrices etc. */ - /* BLI_assert(!"We have differences between reference and overriding data on non-editable property."); */ - matching = false; - } - } - } - else if ((report_flags & RNA_OVERRIDE_MATCH_RESULT_CREATED) == 0 && ELEM(NULL, op, opop)) { - /* This property is not overridden, and differs from reference, so we have no match. */ - matching = false; - if (!(do_create || do_restore)) { - /* Since we have no 'changing' action allowed, we can break here. */ - MEM_SAFE_FREE(rna_path); - break; - } - } - } - - RNA_PATH_FREE; + matching = matching && diff == 0; + if (r_report_flags) { + *r_report_flags |= report_flags; + } + + if (diff != 0) { + /* XXX TODO: refine this for per-item overriding of arrays... */ + IDOverrideStaticProperty *op = BKE_override_static_property_find(override, rna_path); + IDOverrideStaticPropertyOperation *opop = op ? op->operations.first : NULL; + + if (do_restore && (report_flags & RNA_OVERRIDE_MATCH_RESULT_CREATED) == 0) { + /* We are allowed to restore to reference's values. */ + if (ELEM(NULL, op, opop) || opop->operation == IDOVERRIDESTATIC_OP_NOOP) { + /* We should restore that property to its reference value */ + if (RNA_property_editable(ptr_local, prop_local)) { + IDOverrideStaticPropertyOperation opop_tmp = { + .operation = IDOVERRIDESTATIC_OP_REPLACE, + .subitem_reference_index = -1, + .subitem_local_index = -1, + }; + rna_property_override_operation_apply(bmain, + ptr_local, + ptr_reference, + NULL, + prop_local, + prop_reference, + NULL, + NULL, + NULL, + NULL, + &opop_tmp); + if (r_report_flags) { + *r_report_flags |= RNA_OVERRIDE_MATCH_RESULT_RESTORED; + } + } + else { + /* Too noisy for now, this triggers on runtime props like transform matrices etc. */ + /* BLI_assert(!"We have differences between reference and overriding data on non-editable property."); */ + matching = false; + } + } + } + else if ((report_flags & RNA_OVERRIDE_MATCH_RESULT_CREATED) == 0 && ELEM(NULL, op, opop)) { + /* This property is not overridden, and differs from reference, so we have no match. */ + matching = false; + if (!(do_create || do_restore)) { + /* Since we have no 'changing' action allowed, we can break here. */ + MEM_SAFE_FREE(rna_path); + break; + } + } + } + + RNA_PATH_FREE; #undef RNA_PATH_BUFFSIZE #undef RNA_PATH_PRINTF #undef RNA_PATH_FREE - } - RNA_property_collection_end(&iter); + } + RNA_property_collection_end(&iter); #ifdef DEBUG_OVERRIDE_TIMEIT - if (!root_path) { - const float _delta_time = (float)(PIL_check_seconds_timer() - _timeit_time_global); - _sum_time_global += _delta_time; - _num_time_global++; - _sum_time_diffing += _delta_time_diffing; - _num_time_diffing++; - printf("ID: %s\n", ((ID *)ptr_local->id.data)->name); - printf("time end (%s): %.6f\n", __func__, _delta_time); - printf("time averaged (%s): %.6f (total: %.6f, in %d runs)\n", __func__, - (_sum_time_global / _num_time_global), _sum_time_global, (int)_num_time_global); - printf("diffing time end (%s): %.6f (in %d runs)\n", __func__, _delta_time_diffing, _num_delta_time_diffing); - printf("diffing time averaged (%s): %.6f (total: %.6f, in %d runs)\n", __func__, - (_sum_time_diffing / _num_time_diffing), _sum_time_diffing, (int)_num_time_diffing); - } + if (!root_path) { + const float _delta_time = (float)(PIL_check_seconds_timer() - _timeit_time_global); + _sum_time_global += _delta_time; + _num_time_global++; + _sum_time_diffing += _delta_time_diffing; + _num_time_diffing++; + printf("ID: %s\n", ((ID *)ptr_local->id.data)->name); + printf("time end (%s): %.6f\n", __func__, _delta_time); + printf("time averaged (%s): %.6f (total: %.6f, in %d runs)\n", + __func__, + (_sum_time_global / _num_time_global), + _sum_time_global, + (int)_num_time_global); + printf("diffing time end (%s): %.6f (in %d runs)\n", + __func__, + _delta_time_diffing, + _num_delta_time_diffing); + printf("diffing time averaged (%s): %.6f (total: %.6f, in %d runs)\n", + __func__, + (_sum_time_diffing / _num_time_diffing), + _sum_time_diffing, + (int)_num_time_diffing); + } #endif - return matching; + return matching; } - /** Store needed second operands into \a storage data-block for differential override operations. */ -bool RNA_struct_override_store( - Main *bmain, - PointerRNA *ptr_local, PointerRNA *ptr_reference, PointerRNA *ptr_storage, IDOverrideStatic *override) +bool RNA_struct_override_store(Main *bmain, + PointerRNA *ptr_local, + PointerRNA *ptr_reference, + PointerRNA *ptr_storage, + IDOverrideStatic *override) { - bool changed = false; + bool changed = false; #ifdef DEBUG_OVERRIDE_TIMEIT - TIMEIT_START_AVERAGED(RNA_struct_override_store); + TIMEIT_START_AVERAGED(RNA_struct_override_store); #endif - for (IDOverrideStaticProperty *op = override->properties.first; op; op = op->next) { - /* Simplified for now! */ - PointerRNA data_reference, data_local; - PropertyRNA *prop_reference, *prop_local; - - if (RNA_path_resolve_property(ptr_local, op->rna_path, &data_local, &prop_local) && - RNA_path_resolve_property(ptr_reference, op->rna_path, &data_reference, &prop_reference)) - { - PointerRNA data_storage; - PropertyRNA *prop_storage = NULL; - - /* It is totally OK if this does not success, only a subset of override operations actually need storage. */ - if (ptr_storage && (ptr_storage->id.data != NULL)) { - RNA_path_resolve_property(ptr_storage, op->rna_path, &data_storage, &prop_storage); - } - - if (rna_property_override_operation_store( - bmain, - &data_local, &data_reference, &data_storage, - prop_reference, prop_local, prop_storage, - op)) - { - changed = true; - } - } - } + for (IDOverrideStaticProperty *op = override->properties.first; op; op = op->next) { + /* Simplified for now! */ + PointerRNA data_reference, data_local; + PropertyRNA *prop_reference, *prop_local; + + if (RNA_path_resolve_property(ptr_local, op->rna_path, &data_local, &prop_local) && + RNA_path_resolve_property(ptr_reference, op->rna_path, &data_reference, &prop_reference)) { + PointerRNA data_storage; + PropertyRNA *prop_storage = NULL; + + /* It is totally OK if this does not success, only a subset of override operations actually need storage. */ + if (ptr_storage && (ptr_storage->id.data != NULL)) { + RNA_path_resolve_property(ptr_storage, op->rna_path, &data_storage, &prop_storage); + } + + if (rna_property_override_operation_store(bmain, + &data_local, + &data_reference, + &data_storage, + prop_reference, + prop_local, + prop_storage, + op)) { + changed = true; + } + } + } #ifdef DEBUG_OVERRIDE_TIMEIT - TIMEIT_END_AVERAGED(RNA_struct_override_store); + TIMEIT_END_AVERAGED(RNA_struct_override_store); #endif - return changed; -} - -static void rna_property_override_apply_ex( - Main *bmain, - PointerRNA *ptr_local, PointerRNA *ptr_override, PointerRNA *ptr_storage, - PropertyRNA *prop_local, PropertyRNA *prop_override, PropertyRNA *prop_storage, - PointerRNA *ptr_item_local, PointerRNA *ptr_item_override, PointerRNA *ptr_item_storage, - IDOverrideStaticProperty *op, const bool do_insert) -{ - for (IDOverrideStaticPropertyOperation *opop = op->operations.first; opop; opop = opop->next) { - if (!do_insert != !ELEM(opop->operation, IDOVERRIDESTATIC_OP_INSERT_AFTER, IDOVERRIDESTATIC_OP_INSERT_BEFORE)) { - if (!do_insert) { - printf("Skipping insert override operations in first pass (%s)!\n", op->rna_path); - } - continue; - } - if (!rna_property_override_operation_apply( - bmain, - ptr_local, ptr_override, ptr_storage, - prop_local, prop_override, prop_storage, - ptr_item_local, ptr_item_override, ptr_item_storage, - opop)) - { - /* TODO No assert here, would be much much better to just report as warning, - * failing override applications will probably be fairly common! */ - BLI_assert(0); - } - } + return changed; +} + +static void rna_property_override_apply_ex(Main *bmain, + PointerRNA *ptr_local, + PointerRNA *ptr_override, + PointerRNA *ptr_storage, + PropertyRNA *prop_local, + PropertyRNA *prop_override, + PropertyRNA *prop_storage, + PointerRNA *ptr_item_local, + PointerRNA *ptr_item_override, + PointerRNA *ptr_item_storage, + IDOverrideStaticProperty *op, + const bool do_insert) +{ + for (IDOverrideStaticPropertyOperation *opop = op->operations.first; opop; opop = opop->next) { + if (!do_insert != !ELEM(opop->operation, + IDOVERRIDESTATIC_OP_INSERT_AFTER, + IDOVERRIDESTATIC_OP_INSERT_BEFORE)) { + if (!do_insert) { + printf("Skipping insert override operations in first pass (%s)!\n", op->rna_path); + } + continue; + } + if (!rna_property_override_operation_apply(bmain, + ptr_local, + ptr_override, + ptr_storage, + prop_local, + prop_override, + prop_storage, + ptr_item_local, + ptr_item_override, + ptr_item_storage, + opop)) { + /* TODO No assert here, would be much much better to just report as warning, + * failing override applications will probably be fairly common! */ + BLI_assert(0); + } + } } /** Apply given \a override operations on \a ptr_local, using \a ptr_override * (and \a ptr_storage form differential ops) as source. */ -void RNA_struct_override_apply( - Main *bmain, - PointerRNA *ptr_local, PointerRNA *ptr_override, PointerRNA *ptr_storage, IDOverrideStatic *override) +void RNA_struct_override_apply(Main *bmain, + PointerRNA *ptr_local, + PointerRNA *ptr_override, + PointerRNA *ptr_storage, + IDOverrideStatic *override) { #ifdef DEBUG_OVERRIDE_TIMEIT - TIMEIT_START_AVERAGED(RNA_struct_override_apply); + TIMEIT_START_AVERAGED(RNA_struct_override_apply); #endif - /* Note: Applying insert operations in a separate pass is mandatory. - * We could optimize this later, but for now, as inneficient as it is, don't think this is a critical point. - */ - bool do_insert = false; - for (int i = 0; i < 2; i++, do_insert = true) { - for (IDOverrideStaticProperty *op = override->properties.first; op; op = op->next) { - /* Simplified for now! */ - PointerRNA data_override, data_local; - PointerRNA data_item_override, data_item_local; - PropertyRNA *prop_override, *prop_local; - - if (RNA_path_resolve_property_and_item_pointer( - ptr_local, op->rna_path, &data_local, &prop_local, &data_item_local) && - RNA_path_resolve_property_and_item_pointer( - ptr_override, op->rna_path, &data_override, &prop_override, &data_item_override)) - { - PointerRNA data_storage, data_item_storage; - PropertyRNA *prop_storage = NULL; - - /* It is totally OK if this does not success, only a subset of override operations actually need storage. */ - if (ptr_storage && (ptr_storage->id.data != NULL)) { - RNA_path_resolve_property_and_item_pointer( - ptr_storage, op->rna_path, &data_storage, &prop_storage, &data_item_storage); - } - - rna_property_override_apply_ex( - bmain, - &data_local, &data_override, prop_storage ? &data_storage : NULL, - prop_local, prop_override, prop_storage, - &data_item_local, &data_item_override, prop_storage ? &data_item_storage : NULL, - op, do_insert); - } + /* Note: Applying insert operations in a separate pass is mandatory. + * We could optimize this later, but for now, as inneficient as it is, don't think this is a critical point. + */ + bool do_insert = false; + for (int i = 0; i < 2; i++, do_insert = true) { + for (IDOverrideStaticProperty *op = override->properties.first; op; op = op->next) { + /* Simplified for now! */ + PointerRNA data_override, data_local; + PointerRNA data_item_override, data_item_local; + PropertyRNA *prop_override, *prop_local; + + if (RNA_path_resolve_property_and_item_pointer( + ptr_local, op->rna_path, &data_local, &prop_local, &data_item_local) && + RNA_path_resolve_property_and_item_pointer( + ptr_override, op->rna_path, &data_override, &prop_override, &data_item_override)) { + PointerRNA data_storage, data_item_storage; + PropertyRNA *prop_storage = NULL; + + /* It is totally OK if this does not success, only a subset of override operations actually need storage. */ + if (ptr_storage && (ptr_storage->id.data != NULL)) { + RNA_path_resolve_property_and_item_pointer( + ptr_storage, op->rna_path, &data_storage, &prop_storage, &data_item_storage); + } + + rna_property_override_apply_ex(bmain, + &data_local, + &data_override, + prop_storage ? &data_storage : NULL, + prop_local, + prop_override, + prop_storage, + &data_item_local, + &data_item_override, + prop_storage ? &data_item_storage : NULL, + op, + do_insert); + } #ifndef NDEBUG - else { - printf("Failed to apply static override operation to '%s.%s' " - "(could not resolve some properties, local: %d, override: %d)\n", - ((ID *)ptr_override->id.data)->name, op->rna_path, - RNA_path_resolve_property(ptr_local, op->rna_path, &data_local, &prop_local), - RNA_path_resolve_property(ptr_override, op->rna_path, &data_override, &prop_override)); - } + else { + printf( + "Failed to apply static override operation to '%s.%s' " + "(could not resolve some properties, local: %d, override: %d)\n", + ((ID *)ptr_override->id.data)->name, + op->rna_path, + RNA_path_resolve_property(ptr_local, op->rna_path, &data_local, &prop_local), + RNA_path_resolve_property(ptr_override, op->rna_path, &data_override, &prop_override)); + } #endif - } - } + } + } #ifdef DEBUG_OVERRIDE_TIMEIT - TIMEIT_END_AVERAGED(RNA_struct_override_apply); + TIMEIT_END_AVERAGED(RNA_struct_override_apply); #endif } IDOverrideStaticProperty *RNA_property_override_property_find(PointerRNA *ptr, PropertyRNA *prop) { - ID *id = ptr->id.data; + ID *id = ptr->id.data; - if (!id || !id->override_static) { - return NULL; - } + if (!id || !id->override_static) { + return NULL; + } - char *rna_path = RNA_path_from_ID_to_property(ptr, prop); - if (rna_path) { - IDOverrideStaticProperty *op = BKE_override_static_property_find(id->override_static, rna_path); - MEM_freeN(rna_path); - return op; - } - return NULL; + char *rna_path = RNA_path_from_ID_to_property(ptr, prop); + if (rna_path) { + IDOverrideStaticProperty *op = BKE_override_static_property_find(id->override_static, + rna_path); + MEM_freeN(rna_path); + return op; + } + return NULL; } -IDOverrideStaticProperty *RNA_property_override_property_get(PointerRNA *ptr, PropertyRNA *prop, bool *r_created) +IDOverrideStaticProperty *RNA_property_override_property_get(PointerRNA *ptr, + PropertyRNA *prop, + bool *r_created) { - ID *id = ptr->id.data; + ID *id = ptr->id.data; - if (!id || !id->override_static) { - return NULL; - } + if (!id || !id->override_static) { + return NULL; + } - char *rna_path = RNA_path_from_ID_to_property(ptr, prop); - if (rna_path) { - IDOverrideStaticProperty *op = BKE_override_static_property_get(id->override_static, rna_path, r_created); - MEM_freeN(rna_path); - return op; - } - return NULL; + char *rna_path = RNA_path_from_ID_to_property(ptr, prop); + if (rna_path) { + IDOverrideStaticProperty *op = BKE_override_static_property_get( + id->override_static, rna_path, r_created); + MEM_freeN(rna_path); + return op; + } + return NULL; } IDOverrideStaticPropertyOperation *RNA_property_override_property_operation_find( - PointerRNA *ptr, PropertyRNA *prop, const int index, const bool strict, bool *r_strict) + PointerRNA *ptr, PropertyRNA *prop, const int index, const bool strict, bool *r_strict) { - IDOverrideStaticProperty *op = RNA_property_override_property_find(ptr, prop); + IDOverrideStaticProperty *op = RNA_property_override_property_find(ptr, prop); - if (!op) { - return NULL; - } + if (!op) { + return NULL; + } - return BKE_override_static_property_operation_find(op, NULL, NULL, index, index, strict, r_strict); + return BKE_override_static_property_operation_find( + op, NULL, NULL, index, index, strict, r_strict); } IDOverrideStaticPropertyOperation *RNA_property_override_property_operation_get( - PointerRNA *ptr, PropertyRNA *prop, const short operation, const int index, - const bool strict, bool *r_strict, bool *r_created) + PointerRNA *ptr, + PropertyRNA *prop, + const short operation, + const int index, + const bool strict, + bool *r_strict, + bool *r_created) { - IDOverrideStaticProperty *op = RNA_property_override_property_get(ptr, prop, NULL); + IDOverrideStaticProperty *op = RNA_property_override_property_get(ptr, prop, NULL); - if (!op) { - return NULL; - } + if (!op) { + return NULL; + } - return BKE_override_static_property_operation_get(op, operation, NULL, NULL, index, index, strict, r_strict, r_created); + return BKE_override_static_property_operation_get( + op, operation, NULL, NULL, index, index, strict, r_strict, r_created); } -eRNAOverrideStatus RNA_property_static_override_status(PointerRNA *ptr, PropertyRNA *prop, const int index) +eRNAOverrideStatus RNA_property_static_override_status(PointerRNA *ptr, + PropertyRNA *prop, + const int index) { - int override_status = 0; + int override_status = 0; - if (!BKE_override_static_is_enabled()) { - return override_status; - } + if (!BKE_override_static_is_enabled()) { + return override_status; + } - if (!ptr || !prop || !ptr->id.data || !((ID *)ptr->id.data)->override_static) { - return override_status; - } + if (!ptr || !prop || !ptr->id.data || !((ID *)ptr->id.data)->override_static) { + return override_status; + } - if (RNA_property_overridable_get(ptr, prop) && RNA_property_editable_flag(ptr, prop)) { - override_status |= RNA_OVERRIDE_STATUS_OVERRIDABLE; - } + if (RNA_property_overridable_get(ptr, prop) && RNA_property_editable_flag(ptr, prop)) { + override_status |= RNA_OVERRIDE_STATUS_OVERRIDABLE; + } - IDOverrideStaticPropertyOperation *opop = RNA_property_override_property_operation_find(ptr, prop, index, false, NULL); - if (opop != NULL) { - override_status |= RNA_OVERRIDE_STATUS_OVERRIDDEN; - if (opop->flag & IDOVERRIDESTATIC_FLAG_MANDATORY) { - override_status |= RNA_OVERRIDE_STATUS_MANDATORY; - } - if (opop->flag & IDOVERRIDESTATIC_FLAG_LOCKED) { - override_status |= RNA_OVERRIDE_STATUS_LOCKED; - } - } + IDOverrideStaticPropertyOperation *opop = RNA_property_override_property_operation_find( + ptr, prop, index, false, NULL); + if (opop != NULL) { + override_status |= RNA_OVERRIDE_STATUS_OVERRIDDEN; + if (opop->flag & IDOVERRIDESTATIC_FLAG_MANDATORY) { + override_status |= RNA_OVERRIDE_STATUS_MANDATORY; + } + if (opop->flag & IDOVERRIDESTATIC_FLAG_LOCKED) { + override_status |= RNA_OVERRIDE_STATUS_LOCKED; + } + } - return override_status; + return override_status; } - - -bool RNA_path_resolved_create( - PointerRNA *ptr, struct PropertyRNA *prop, - const int prop_index, - PathResolvedRNA *r_anim_rna) +bool RNA_path_resolved_create(PointerRNA *ptr, + struct PropertyRNA *prop, + const int prop_index, + PathResolvedRNA *r_anim_rna) { - int array_len = RNA_property_array_length(ptr, prop); + int array_len = RNA_property_array_length(ptr, prop); - if ((array_len == 0) || (prop_index < array_len)) { - r_anim_rna->ptr = *ptr; - r_anim_rna->prop = prop; - r_anim_rna->prop_index = array_len ? prop_index : -1; + if ((array_len == 0) || (prop_index < array_len)) { + r_anim_rna->ptr = *ptr; + r_anim_rna->prop = prop; + r_anim_rna->prop_index = array_len ? prop_index : -1; - return true; - } - else { - return false; - } + return true; + } + else { + return false; + } } static char rna_struct_state_owner[64]; void RNA_struct_state_owner_set(const char *name) { - if (name) { - BLI_strncpy(rna_struct_state_owner, name, sizeof(rna_struct_state_owner)); - } - else { - rna_struct_state_owner[0] = '\0'; - } + if (name) { + BLI_strncpy(rna_struct_state_owner, name, sizeof(rna_struct_state_owner)); + } + else { + rna_struct_state_owner[0] = '\0'; + } } const char *RNA_struct_state_owner_get(void) { - if (rna_struct_state_owner[0]) { - return rna_struct_state_owner; - } - return NULL; + if (rna_struct_state_owner[0]) { + return rna_struct_state_owner; + } + return NULL; } |