diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/anim_sys.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/fcurve.c | 2 | ||||
-rw-r--r-- | source/blender/editors/animation/anim_channels_defines.c | 6 | ||||
-rw-r--r-- | source/blender/editors/animation/anim_deps.c | 2 | ||||
-rw-r--r-- | source/blender/editors/animation/anim_draw.c | 2 | ||||
-rw-r--r-- | source/blender/editors/animation/anim_ipo_utils.c | 2 | ||||
-rw-r--r-- | source/blender/editors/animation/drivers.c | 6 | ||||
-rw-r--r-- | source/blender/editors/animation/keyframing.c | 8 | ||||
-rw-r--r-- | source/blender/editors/animation/keyingsets.c | 2 | ||||
-rw-r--r-- | source/blender/editors/armature/pose_slide.c | 2 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_ops.c | 4 | ||||
-rw-r--r-- | source/blender/editors/space_graph/graph_buttons.c | 2 | ||||
-rw-r--r-- | source/blender/makesrna/RNA_access.h | 12 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_access.c | 37 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_rna_anim.c | 2 |
15 files changed, 66 insertions, 31 deletions
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 9cdb35586ce..48d83652f56 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -550,7 +550,7 @@ void BKE_animdata_separate_by_basepath(ID *srcID, ID *dstID, ListBase *basepaths /* Path Validation -------------------------------------------- */ /* Check if a given RNA Path is valid, by tracing it from the given ID, and seeing if we can resolve it */ -static short check_rna_path_is_valid(ID *owner_id, const char *path) +static bool check_rna_path_is_valid(ID *owner_id, const char *path) { PointerRNA id_ptr, ptr; PropertyRNA *prop = NULL; @@ -559,7 +559,7 @@ static short check_rna_path_is_valid(ID *owner_id, const char *path) RNA_id_pointer_create(owner_id, &id_ptr); /* try to resolve */ - return RNA_path_resolve(&id_ptr, path, &ptr, &prop); + return RNA_path_resolve_property(&id_ptr, path, &ptr, &prop); } /* Check if some given RNA Path needs fixing - free the given path and set a new one as appropriate @@ -1164,7 +1164,7 @@ static short animsys_write_rna_setting(PointerRNA *ptr, char *path, int array_in //printf("%p %s %i %f\n", ptr, path, array_index, value); /* get property to write to */ - if (RNA_path_resolve(ptr, path, &new_ptr, &prop)) { + if (RNA_path_resolve_property(ptr, path, &new_ptr, &prop)) { /* set value - only for animatable numerical values */ if (RNA_property_animateable(&new_ptr, prop)) { int array_len = RNA_property_array_length(&new_ptr, prop); @@ -1650,7 +1650,7 @@ static NlaEvalChannel *nlaevalchan_verify(PointerRNA *ptr, ListBase *channels, N /* free_path = */ /* UNUSED */ animsys_remap_path(strip->remap, fcu->rna_path, &path); /* a valid property must be available, and it must be animatable */ - if (RNA_path_resolve(ptr, path, &new_ptr, &prop) == 0) { + if (RNA_path_resolve_property(ptr, path, &new_ptr, &prop) == false) { if (G.debug & G_DEBUG) printf("NLA Strip Eval: Cannot resolve path\n"); return NULL; } diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index 3141d52e22a..c86ee11985a 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -1040,7 +1040,7 @@ static float dtar_get_prop_val(ChannelDriver *driver, DriverTarget *dtar) RNA_id_pointer_create(id, &id_ptr); /* get property to read from, and get value as appropriate */ - if (RNA_path_resolve_full(&id_ptr, dtar->rna_path, &ptr, &prop, &index)) { + if (RNA_path_resolve_property_full(&id_ptr, dtar->rna_path, &ptr, &prop, &index)) { if (RNA_property_array_check(prop)) { /* array */ if ((index >= 0) && (index < RNA_property_array_length(&ptr, prop))) { diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c index bd580ab590f..430e7f719b9 100644 --- a/source/blender/editors/animation/anim_channels_defines.c +++ b/source/blender/editors/animation/anim_channels_defines.c @@ -3280,7 +3280,7 @@ static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poi RNA_id_pointer_create(id, &id_ptr); /* try to resolve the path stored in the F-Curve */ - if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) { + if (RNA_path_resolve_property(&id_ptr, fcu->rna_path, &ptr, &prop)) { /* set the special 'replace' flag if on a keyframe */ if (fcurve_frame_has_keyframe(fcu, cfra, 0)) flag |= INSERTKEY_REPLACE; @@ -3318,7 +3318,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi RNA_id_pointer_create((ID *)key, &id_ptr); /* try to resolve the path stored in the F-Curve */ - if (RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop)) { + if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop)) { /* find or create new F-Curve */ // XXX is the group name for this ok? bAction *act = verify_adt_action((ID *)key, 1); @@ -3615,7 +3615,7 @@ void ANIM_channel_draw_widgets(bContext *C, bAnimContext *ac, bAnimListElem *ale RNA_id_pointer_create(ale->id, &id_ptr); /* try to resolve the path */ - if (RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop)) { + if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop)) { uiBut *but; /* create the slider button, and assign relevant callback to ensure keyframes are inserted... */ diff --git a/source/blender/editors/animation/anim_deps.c b/source/blender/editors/animation/anim_deps.c index 98071fafc1e..618c1b04a71 100644 --- a/source/blender/editors/animation/anim_deps.c +++ b/source/blender/editors/animation/anim_deps.c @@ -87,7 +87,7 @@ void ANIM_list_elem_update(Scene *scene, bAnimListElem *ale) RNA_id_pointer_create(id, &id_ptr); - if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) + if (RNA_path_resolve_property(&id_ptr, fcu->rna_path, &ptr, &prop)) RNA_property_update_main(G.main, scene, &ptr, prop); } else { diff --git a/source/blender/editors/animation/anim_draw.c b/source/blender/editors/animation/anim_draw.c index eb1f5ef1043..bd4c2347815 100644 --- a/source/blender/editors/animation/anim_draw.c +++ b/source/blender/editors/animation/anim_draw.c @@ -373,7 +373,7 @@ float ANIM_unit_mapping_get_factor(Scene *scene, ID *id, FCurve *fcu, short rest /* get RNA property that F-Curve affects */ RNA_id_pointer_create(id, &id_ptr); - if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) { + if (RNA_path_resolve_property(&id_ptr, fcu->rna_path, &ptr, &prop)) { /* rotations: radians <-> degrees? */ if (RNA_SUBTYPE_UNIT(RNA_property_subtype(prop)) == PROP_UNIT_ROTATION) { /* if the radians flag is not set, default to using degrees which need conversions */ diff --git a/source/blender/editors/animation/anim_ipo_utils.c b/source/blender/editors/animation/anim_ipo_utils.c index 2352cad0cbc..21941c7ed62 100644 --- a/source/blender/editors/animation/anim_ipo_utils.c +++ b/source/blender/editors/animation/anim_ipo_utils.c @@ -79,7 +79,7 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu) RNA_id_pointer_create(id, &id_ptr); /* try to resolve the path */ - if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) { + if (RNA_path_resolve_property(&id_ptr, fcu->rna_path, &ptr, &prop)) { const char *structname = NULL, *propname = NULL; char arrayindbuf[16]; const char *arrayname = NULL; diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c index cd5e873f40d..d9965ebdcac 100644 --- a/source/blender/editors/animation/drivers.c +++ b/source/blender/editors/animation/drivers.c @@ -145,7 +145,7 @@ short ANIM_add_driver(ReportList *reports, ID *id, const char rna_path[], int ar /* validate pointer first - exit if failure */ RNA_id_pointer_create(id, &id_ptr); - if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) { + if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop) == false) { BKE_reportf(reports, RPT_ERROR, "Could not add driver, as RNA path is invalid for the given ID (ID = %s, path = %s)", id->name, rna_path); @@ -308,7 +308,7 @@ short ANIM_copy_driver(ReportList *reports, ID *id, const char rna_path[], int a /* validate pointer first - exit if failure */ RNA_id_pointer_create(id, &id_ptr); - if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) { + if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop) == false) { BKE_reportf(reports, RPT_ERROR, "Could not find driver to copy, as RNA path is invalid for the given ID (ID = %s, path = %s)", id->name, rna_path); @@ -355,7 +355,7 @@ short ANIM_paste_driver(ReportList *reports, ID *id, const char rna_path[], int /* validate pointer first - exit if failure */ RNA_id_pointer_create(id, &id_ptr); - if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) { + if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop) == false) { BKE_reportf(reports, RPT_ERROR, "Could not paste driver, as RNA path is invalid for the given ID (ID = %s, path = %s)", id->name, rna_path); diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index bc20311f773..d1df93f49f5 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -810,7 +810,7 @@ short insert_keyframe_direct(ReportList *reports, PointerRNA ptr, PropertyRNA *p PointerRNA tmp_ptr; /* try to get property we should be affecting */ - if ((RNA_path_resolve(&ptr, fcu->rna_path, &tmp_ptr, &prop) == 0) || (prop == NULL)) { + if (RNA_path_resolve_property(&ptr, fcu->rna_path, &tmp_ptr, &prop) == false) { /* property not found... */ const char *idname = (ptr.id.data) ? ((ID *)ptr.id.data)->name : TIP_("<No ID pointer>"); @@ -920,7 +920,7 @@ short insert_keyframe(ReportList *reports, ID *id, bAction *act, const char grou } RNA_id_pointer_create(id, &id_ptr); - if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) { + if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop) == false) { BKE_reportf(reports, RPT_ERROR, "Could not insert keyframe, as RNA path is invalid for the given ID (ID = %s, path = %s)", (id) ? id->name : TIP_("<Missing ID block>"), rna_path); @@ -1012,7 +1012,7 @@ short delete_keyframe(ReportList *reports, ID *id, bAction *act, const char grou /* validate pointer first - exit if failure */ RNA_id_pointer_create(id, &id_ptr); - if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) { + if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop) == false) { BKE_reportf(reports, RPT_ERROR, "Could not delete keyframe, as RNA path is invalid for the given ID (ID = %s, path = %s)", id->name, rna_path); @@ -1113,7 +1113,7 @@ static short clear_keyframe(ReportList *reports, ID *id, bAction *act, const cha /* validate pointer first - exit if failure */ RNA_id_pointer_create(id, &id_ptr); - if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) { + if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop) == false) { BKE_reportf(reports, RPT_ERROR, "Could not clear keyframe, as RNA path is invalid for the given ID (ID = %s, path = %s)", id->name, rna_path); diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c index ad09fcb5966..07825f59c2f 100644 --- a/source/blender/editors/animation/keyingsets.c +++ b/source/blender/editors/animation/keyingsets.c @@ -977,7 +977,7 @@ int ANIM_apply_keyingset(bContext *C, ListBase *dsources, bAction *act, KeyingSe PropertyRNA *prop; RNA_id_pointer_create(ksp->id, &id_ptr); - if (RNA_path_resolve(&id_ptr, ksp->rna_path, &ptr, &prop) && prop) + if (RNA_path_resolve_property(&id_ptr, ksp->rna_path, &ptr, &prop)) arraylen = RNA_property_array_length(&ptr, prop); } diff --git a/source/blender/editors/armature/pose_slide.c b/source/blender/editors/armature/pose_slide.c index ac01cbb5f4a..0ff0e0d498c 100644 --- a/source/blender/editors/armature/pose_slide.c +++ b/source/blender/editors/armature/pose_slide.c @@ -1027,7 +1027,7 @@ static short pose_propagate_get_refVal(Object *ob, FCurve *fcu, float *value) RNA_id_pointer_create(&ob->id, &id_ptr); /* resolve the property... */ - if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) { + if (RNA_path_resolve_property(&id_ptr, fcu->rna_path, &ptr, &prop)) { if (RNA_property_array_check(prop)) { /* array */ if (fcu->array_index < RNA_property_array_length(&ptr, prop)) { diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c index 52a26f4f528..e4b76cb0399 100644 --- a/source/blender/editors/interface/interface_ops.c +++ b/source/blender/editors/interface/interface_ops.c @@ -551,7 +551,7 @@ static int copy_to_selected_button_poll(bContext *C) if (use_path) { lprop = NULL; RNA_id_pointer_create(link->ptr.id.data, &idptr); - RNA_path_resolve(&idptr, path, &lptr, &lprop); + RNA_path_resolve_property(&idptr, path, &lptr, &lprop); } else { lptr = link->ptr; @@ -601,7 +601,7 @@ static int copy_to_selected_button_exec(bContext *C, wmOperator *op) if (use_path) { lprop = NULL; RNA_id_pointer_create(link->ptr.id.data, &idptr); - RNA_path_resolve(&idptr, path, &lptr, &lprop); + RNA_path_resolve_property(&idptr, path, &lptr, &lprop); } else { lptr = link->ptr; diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c index f7ec8e8682d..d62ab2850b4 100644 --- a/source/blender/editors/space_graph/graph_buttons.c +++ b/source/blender/editors/space_graph/graph_buttons.c @@ -296,7 +296,7 @@ static void graph_panel_key_properties(const bContext *C, Panel *pa) /* get property that F-Curve affects, for some unit-conversion magic */ RNA_id_pointer_create(ale->id, &id_ptr); - if (RNA_path_resolve(&id_ptr, fcu->rna_path, &fcu_prop_ptr, &fcu_prop) && fcu_prop) { + if (RNA_path_resolve_property(&id_ptr, fcu->rna_path, &fcu_prop_ptr, &fcu_prop)) { /* determine the unit for this property */ unit = RNA_SUBTYPE_UNIT(RNA_property_subtype(fcu_prop)); } diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 7d817f3dbe0..a61a9b3da85 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -898,10 +898,18 @@ char *RNA_path_append(const char *path, PointerRNA *ptr, PropertyRNA *prop, int intkey, const char *strkey); char *RNA_path_back(const char *path); -int RNA_path_resolve(PointerRNA *ptr, const char *path, +/* path_resolve() variants only ensure that a valid pointer (and optionally property) exist */ +bool RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop); -int RNA_path_resolve_full(PointerRNA *ptr, const char *path, +bool RNA_path_resolve_full(PointerRNA *ptr, const char *path, + PointerRNA *r_ptr, PropertyRNA **r_prop, int *index); + +/* path_resolve_property() variants ensure that pointer + property both exist */ +bool RNA_path_resolve_property(PointerRNA *ptr, const char *path, + PointerRNA *r_ptr, PropertyRNA **r_prop); + +bool RNA_path_resolve_property_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *index); char *RNA_path_from_ID_to_struct(PointerRNA *ptr); diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index 9f36131a6c9..9a102c823a9 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -630,7 +630,7 @@ PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier) /* id prop lookup, not so common */ PropertyRNA *r_prop = NULL; PointerRNA r_ptr; /* only support single level props */ - if (RNA_path_resolve(ptr, identifier, &r_ptr, &r_prop) && r_ptr.type == ptr->type && r_ptr.data == ptr->data) + if (RNA_path_resolve(ptr, identifier, &r_ptr, &r_prop) && (r_ptr.type == ptr->type) && (r_ptr.data == ptr->data)) return r_prop; } else { @@ -1533,7 +1533,7 @@ bool RNA_property_path_from_ID_check(PointerRNA *ptr, PropertyRNA *prop) PropertyRNA *r_prop; RNA_id_pointer_create(ptr->id.data, &id_ptr); - if (RNA_path_resolve(&id_ptr, path, &r_ptr, &r_prop) == TRUE) { + if (RNA_path_resolve(&id_ptr, path, &r_ptr, &r_prop) == true) { ret = (prop == r_prop); } MEM_freeN(path); @@ -3791,13 +3791,40 @@ static int rna_token_strip_quotes(char *token) return 0; } -/* Resolve the given RNA path to find the pointer+property indicated at the end of the path */ -int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop) +/* Resolve the given RNA Path to find both the pointer AND property indicated by fully resolving the path + * ! This is a convenience method to avoid logic errors and ugly syntax + * ! Assumes all pointers provided are valid + * > returns: 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) +{ + return RNA_path_resolve_full(ptr, path, r_ptr, r_prop, NULL) && (*r_prop != NULL); +} + +/* Resolve the given RNA Path to find the pointer AND property (as well as the array index) indicated by fully resolving the path + * ! This is a convenience method to avoid logic errors and ugly syntax + * ! Assumes all pointers provided are valid + * > returns: 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 *index) +{ + return RNA_path_resolve_full(ptr, path, r_ptr, r_prop, index) && (*r_prop != NULL); +} + +/* Resolve the given RNA Path to find the pointer and/or property indicated by fully resolving the path + * ! Assumes all pointers provided are valid + * > returns: True if path can be resolved to a valid "pointer + property" OR "pointer only" + */ +bool RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop) { return RNA_path_resolve_full(ptr, path, r_ptr, r_prop, NULL); } -int RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *index) +/* Resolve the given RNA Path to find the pointer and/or property + array index indicated by fully resolving the path + * ! Assumes all pointers provided are valid + * > returns: 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 *index) { PropertyRNA *prop; PointerRNA curptr; diff --git a/source/blender/python/intern/bpy_rna_anim.c b/source/blender/python/intern/bpy_rna_anim.c index b61ed55da06..6e78a543481 100644 --- a/source/blender/python/intern/bpy_rna_anim.c +++ b/source/blender/python/intern/bpy_rna_anim.c @@ -72,7 +72,7 @@ static int pyrna_struct_anim_args_parse( /* full paths can only be given from ID base */ if (is_idbase) { int r_index = -1; - if (RNA_path_resolve_full(ptr, path, &r_ptr, &prop, &r_index) == 0) { + if (RNA_path_resolve_property_full(ptr, path, &r_ptr, &prop, &r_index) == false) { prop = NULL; } else if (r_index != -1) { |