[Bf-blender-cvs] [4e845e0] master: Py-Driver: add 'self' option

Campbell Barton noreply at git.blender.org
Sat Jul 30 08:48:22 CEST 2016


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. @@




More information about the Bf-blender-cvs mailing list