Commit: 4e845e06704bad3c11297ae8e86b400ef80b2a89
Author: Campbell Barton
Date:   Sat Jul 30 16:34:01 2016 +1000
Branches: master
https://developer.blender.org/rB4e845e06704bad3c11297ae8e86b400ef80b2a89

Py-Driver: add 'self' option

Drivers can use this to refer to the data which the driver is applied to,
useful for objects, bones, to avoid having to create a variable pointing to its 
self.

===================================================================

M       source/blender/blenkernel/BKE_animsys.h
M       source/blender/blenkernel/BKE_fcurve.h
M       source/blender/blenkernel/intern/anim_sys.c
M       source/blender/blenkernel/intern/fcurve.c
M       source/blender/editors/animation/keyframing.c
M       source/blender/editors/space_graph/graph_buttons.c
M       source/blender/makesdna/DNA_anim_types.h
M       source/blender/makesrna/RNA_access.h
M       source/blender/makesrna/RNA_types.h
M       source/blender/makesrna/intern/rna_access.c
M       source/blender/makesrna/intern/rna_fcurve.c
M       source/blender/python/BPY_extern.h
M       source/blender/python/intern/bpy_driver.c
M       source/blender/python/intern/bpy_driver.h
M       source/blender/python/intern/bpy_rna_driver.c
M       source/blender/python/intern/bpy_rna_driver.h

===================================================================

diff --git a/source/blender/blenkernel/BKE_animsys.h 
b/source/blender/blenkernel/BKE_animsys.h
index 983f3ce..00ea323 100644
--- a/source/blender/blenkernel/BKE_animsys.h
+++ b/source/blender/blenkernel/BKE_animsys.h
@@ -37,6 +37,7 @@ struct Main;
 struct AnimData;
 struct KeyingSet;
 struct KS_Path;
+struct PathResolvedRNA;
 struct bContext;
 
 struct PointerRNA;
diff --git a/source/blender/blenkernel/BKE_fcurve.h 
b/source/blender/blenkernel/BKE_fcurve.h
index bb4eb65..3a45097 100644
--- a/source/blender/blenkernel/BKE_fcurve.h
+++ b/source/blender/blenkernel/BKE_fcurve.h
@@ -48,6 +48,7 @@ struct AnimData;
 struct bAction;
 struct BezTriple;
 struct StructRNA;
+struct PathResolvedRNA;
 struct PointerRNA;
 struct PropertyRNA;
 
@@ -107,7 +108,7 @@ bool  driver_get_variable_property(
         struct ChannelDriver *driver, struct DriverTarget *dtar,
         struct PointerRNA *r_ptr, struct PropertyRNA **r_prop, int *r_index);
 
-float evaluate_driver(struct ChannelDriver *driver, const float evaltime);
+float evaluate_driver(struct PathResolvedRNA *anim_rna, struct ChannelDriver 
*driver, const float evaltime);
 
 /* ************** F-Curve Modifiers *************** */
 
@@ -278,8 +279,9 @@ void correct_bezpart(float v1[2], float v2[2], float v3[2], 
float v4[2]);
 
 /* evaluate fcurve */
 float evaluate_fcurve(struct FCurve *fcu, float evaltime);
+float evaluate_fcurve_driver(struct PathResolvedRNA *anim_rna, struct FCurve 
*fcu, float evaltime);
 /* evaluate fcurve and store value */
-float calculate_fcurve(struct FCurve *fcu, float evaltime);
+float calculate_fcurve(struct PathResolvedRNA *anim_rna, struct FCurve *fcu, 
float evaltime);
 
 /* ************* F-Curve Samples API ******************** */
 
diff --git a/source/blender/blenkernel/intern/anim_sys.c 
b/source/blender/blenkernel/intern/anim_sys.c
index d04b950..0d184b7 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -1482,41 +1482,87 @@ static bool animsys_remap_path(AnimMapper 
*UNUSED(remap), char *path, char **dst
        return false;
 }
 
+static bool animsys_store_rna_setting(
+        PointerRNA *ptr, AnimMapper *remap,
+        /* typically 'fcu->rna_path', 'fcu->array_index' */
+        const char *rna_path, const int array_index,
+        PathResolvedRNA *r_result)
+{
+       bool success = false;
+
+       char *path = NULL;
+       bool free_path;
+
+       /* get path, remapped as appropriate to work in its new environment */
+       free_path = animsys_remap_path(remap, (char *)rna_path, &path);
+
+       /* write value to setting */
+       if (path) {
+               /* get property to write to */
+               if (RNA_path_resolve_property(ptr, path, &r_result->ptr, 
&r_result->prop)) {
+                       if ((ptr->id.data == NULL) || 
RNA_property_animateable(&r_result->ptr, r_result->prop)) {
+                               int array_len = 
RNA_property_array_length(&r_result->ptr, r_result->prop);
+
+                               if (array_len && array_index >= array_len) {
+                                       if (G.debug & G_DEBUG) {
+                                               printf("Animato: Invalid array 
index. ID = '%s',  '%s[%d]', array length is %d\n",
+                                                      (ptr && ptr->id.data) ? 
(((ID *)ptr->id.data)->name + 2) : "<No ID>",
+                                                      path, array_index, 
array_len - 1);
+                                       }
+                               }
+                               else {
+                                       r_result->prop_index = array_len ? 
array_index : -1;
+                                       success = true;
+                               }
+                       }
+               }
+               else {
+                       /* failed to get path */
+                       /* XXX don't tag as failed yet though, as there are 
some legit situations (Action Constraint)
+                        * where some channels will not exist, but shouldn't 
lock up Action */
+                       if (G.debug & G_DEBUG) {
+                               printf("Animato: Invalid path. ID = '%s',  
'%s[%d]'\n",
+                                      (ptr->id.data) ? (((ID 
*)ptr->id.data)->name + 2) : "<No ID>",
+                                      path, array_index);
+                       }
+               }
+       }
+
+       /* free temp path-info */
+       if (free_path) {
+               MEM_freeN((void *)path);
+       }
+
+       return success;
+}
+
 
 /* less than 1.0 evaluates to false, use epsilon to avoid float error */
 #define ANIMSYS_FLOAT_AS_BOOL(value) ((value) > ((1.0f - FLT_EPSILON)))
 
 /* Write the given value to a setting using RNA, and return success */
-static bool animsys_write_rna_setting(PointerRNA *ptr, char *path, int 
array_index, float value)
+static bool animsys_write_rna_setting(PathResolvedRNA *anim_rna, float value)
 {
-       PropertyRNA *prop;
-       PointerRNA new_ptr;
+       PropertyRNA *prop = anim_rna->prop;
+       PointerRNA new_ptr = anim_rna->ptr;
+       int array_index = anim_rna->prop_index;
        
        //printf("%p %s %i %f\n", ptr, path, array_index, value);
        
        /* get property to write to */
-       if (RNA_path_resolve_property(ptr, path, &new_ptr, &prop)) {
+       // if (RNA_path_resolve_property(ptr, path, &new_ptr, &prop))
+       {
                /* set value for animatable numerical values only
                 * HACK: some local F-Curves (e.g. those on NLA Strips) are 
evaluated
                 *       without an ID provided, which causes the animateable 
test to fail!
                 */
-               if (RNA_property_animateable(&new_ptr, prop) || (ptr->id.data 
== NULL)) {
-                       int array_len = RNA_property_array_length(&new_ptr, 
prop);
+               // if (RNA_property_animateable(&new_ptr, prop) || 
(ptr->id.data == NULL))
+               {
                        bool written = false;
-                       
-                       if (array_len && array_index >= array_len) {
-                               if (G.debug & G_DEBUG) {
-                                       printf("Animato: Invalid array index. 
ID = '%s',  '%s[%d]', array length is %d\n",
-                                              (ptr && ptr->id.data) ? (((ID 
*)ptr->id.data)->name + 2) : "<No ID>",
-                                              path, array_index, array_len - 
1);
-                               }
-                               
-                               return false;
-                       }
-                       
+
                        switch (RNA_property_type(prop)) {
                                case PROP_BOOLEAN:
-                                       if (array_len) {
+                                       if (array_index != -1) {
                                                if 
(RNA_property_boolean_get_index(&new_ptr, prop, array_index) != 
ANIMSYS_FLOAT_AS_BOOL(value)) {
                                                        
RNA_property_boolean_set_index(&new_ptr, prop, array_index, 
ANIMSYS_FLOAT_AS_BOOL(value));
                                                        written = true;
@@ -1530,7 +1576,7 @@ static bool animsys_write_rna_setting(PointerRNA *ptr, 
char *path, int array_ind
                                        }
                                        break;
                                case PROP_INT:
-                                       if (array_len) {
+                                       if (array_index != -1) {
                                                if 
(RNA_property_int_get_index(&new_ptr, prop, array_index) != (int)value) {
                                                        
RNA_property_int_set_index(&new_ptr, prop, array_index, (int)value);
                                                        written = true;
@@ -1544,7 +1590,7 @@ static bool animsys_write_rna_setting(PointerRNA *ptr, 
char *path, int array_ind
                                        }
                                        break;
                                case PROP_FLOAT:
-                                       if (array_len) {
+                                       if (array_index != -1) {
                                                if 
(RNA_property_float_get_index(&new_ptr, prop, array_index) != value) {
                                                        
RNA_property_float_set_index(&new_ptr, prop, array_index, value);
                                                        written = true;
@@ -1606,37 +1652,18 @@ static bool animsys_write_rna_setting(PointerRNA *ptr, 
char *path, int array_ind
                /* successful */
                return true;
        }
-       else {
-               /* failed to get path */
-               /* XXX don't tag as failed yet though, as there are some legit 
situations (Action Constraint)
-                * where some channels will not exist, but shouldn't lock up 
Action */
-               if (G.debug & G_DEBUG) {
-                       printf("Animato: Invalid path. ID = '%s',  '%s[%d]'\n",
-                              (ptr->id.data) ? (((ID *)ptr->id.data)->name + 
2) : "<No ID>",
-                              path, array_index);
-               }
-               return false;
-       }
 }
 
 /* Simple replacement based data-setting of the FCurve using RNA */
 bool BKE_animsys_execute_fcurve(PointerRNA *ptr, AnimMapper *remap, FCurve 
*fcu, float curval)
 {
-       char *path = NULL;
-       bool free_path = false;
+       PathResolvedRNA anim_rna;
        bool ok = false;
-       
-       /* get path, remapped as appropriate to work in its new environment */
-       free_path = animsys_remap_path(remap, fcu->rna_path, &path);
-       
-       /* write value to setting */
-       if (path)
-               ok = animsys_write_rna_setting(ptr, path, fcu->array_index, 
curval);
-       
-       /* free temp path-info */
-       if (free_path)
-               MEM_freeN(path);
-               
+
+       if (animsys_store_rna_setting(ptr, remap, fcu->rna_path, 
fcu->array_index, &anim_rna)) {
+               ok = animsys_write_rna_setting(&anim_rna, curval);
+       }
+
        /* return whether we were successful */
        return ok;
 }
@@ -1654,8 +1681,11 @@ static void animsys_evaluate_fcurves(PointerRNA *ptr, 
ListBase *list, AnimMapper
                if ((fcu->grp == NULL) || (fcu->grp->flag & AGRP_MUTED) == 0) {
                        /* check if this curve should be skipped */
                        if ((fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED)) == 
0) {
-                               const float curval = calculate_fcurve(fcu, 
ctime);
-                               BKE_animsys_execute_fcurve(ptr, remap, fcu, 
curval);
+                               PathResolvedRNA anim_rna;
+                               if (animsys_store_rna_setting(ptr, remap, 
fcu->rna_path, fcu->array_index, &anim_rna)) {
+                                       const float curval = 
calculate_fcurve(&anim_rna, fcu, ctime);
+                                       animsys_write_rna_setting(&anim_rna, 
curval);
+                               }
                        }
                }
        }
@@ -1684,8 +1714,12 @@ static void animsys_evaluate_drivers(PointerRNA *ptr, 
AnimData *adt, float ctime
                                /* evaluate this using values set already in 
other places
                                 * NOTE: for 'layering' option later on, we 
should check if we should remove old value before adding
                                 *       new to only be done when drivers only 
changed */
-                               const float curval = calculate_fcurve(fcu, 
ctime);
-                               ok = BKE_animsys_execute_fcurve(ptr, NULL, fcu, 
curval);
+
+                               PathResolvedRNA anim_rna;
+                               if (animsys_store_rna_setting(ptr, NULL, 
fcu->rna_path, fcu->array_index, &anim_rna)) {
+                                       const float curval = 
calculate_fcurve(&anim_rna, fcu, ctime);
+                                       ok = 
animsys_write_rna_setting(&anim_rna, curval);
+                               }
                                
                                /* clear recalc flag */
                                driver->flag &= ~DRIVER_FLAG_RECALC;
@@ -1753,8 +1787,11 @@ void animsys_evaluate_action_group(PointerRNA *ptr, 
bAction *act, bActionGroup *
        for (fcu = agrp->channels.first; (fcu) && (fcu->grp == agrp); fcu = 
fcu->next) {
                /* check if this curve should be skipped */
                if ((fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED)) == 0) {
-                       const float curval = calculate_fcurve(fcu, ctime);
-                       BKE_animsys_execute_fcurve(ptr, remap, fcu, curval);
+                       PathResolvedRNA anim_rna;
+                       if (animsys_store_rna_setting(ptr, remap, 
fcu->rna_path, fcu->array_index, &anim_rna)) {
+                               const float curval = 
calculate_fcurve(&anim_rna, fcu, ctime);
+                               animsys_write_rna_setting(&anim_rna, curval);
+                       }
                }
        }
 }
@@ -2612,8 +2649,12 @@ static void animsys_evaluate_overrides(PointerRNA *ptr, 
AnimData *adt)
        AnimOverride *aor;
        
        /* for each override, simply execute... */
-       for (aor = adt->overrides.first; aor

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to