[Bf-blender-cvs] [84e7b5a] depsgraph_refactor: Depsgraph: Cleanup of animation callbacks

Sergey Sharybin noreply at git.blender.org
Wed Nov 12 16:05:17 CET 2014


Commit: 84e7b5a1079deb0e75b95885f0c7ab722062294c
Author: Sergey Sharybin
Date:   Wed Nov 12 16:04:48 2014 +0100
Branches: depsgraph_refactor
https://developer.blender.org/rB84e7b5a1079deb0e75b95885f0c7ab722062294c

Depsgraph: Cleanup of animation callbacks

- Use single callback for all action fcurves
- Driver evaluation was actually evaluating the whole animation system,
  not just a given fcurve.

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

M	source/blender/blenkernel/BKE_animsys.h
M	source/blender/blenkernel/intern/anim_sys.c
M	source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
M	source/blender/depsgraph/intern/depsgraph_build_relations.cpp
M	source/blender/depsgraph/intern/depsgraph_type_defines.cpp
M	source/blender/depsgraph/intern/depsgraph_types.h
M	source/blender/depsgraph/intern/stubs.h

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

diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h
index a5109ac..02e280f 100644
--- a/source/blender/blenkernel/BKE_animsys.h
+++ b/source/blender/blenkernel/BKE_animsys.h
@@ -157,6 +157,9 @@ void BKE_animsys_evaluate_animdata(struct Scene *scene, struct ID *id, struct An
 /* Evaluation of all ID-blocks with Animation Data blocks - Animation Data Only */
 void BKE_animsys_evaluate_all_animation(struct Main *main, struct Scene *scene, float ctime);
 
+/* TODO(sergey): This is mainly a temp public function. */
+struct FCurve;
+bool BKE_animsys_execute_fcurve(struct PointerRNA *ptr, struct AnimMapper *remap, struct FCurve *fcu);
 
 /* ------------ Specialized API --------------- */
 /* There are a few special tools which require these following functions. They are NOT to be used
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c
index 2fb832d..ab80b32 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -1484,7 +1484,7 @@ static bool animsys_write_rna_setting(PointerRNA *ptr, char *path, int array_ind
 }
 
 /* Simple replacement based data-setting of the FCurve using RNA */
-static bool animsys_execute_fcurve(PointerRNA *ptr, AnimMapper *remap, FCurve *fcu)
+bool BKE_animsys_execute_fcurve(PointerRNA *ptr, AnimMapper *remap, FCurve *fcu)
 {
 	char *path = NULL;
 	bool free_path = false;
@@ -1519,7 +1519,7 @@ static void animsys_evaluate_fcurves(PointerRNA *ptr, ListBase *list, AnimMapper
 			/* check if this curve should be skipped */
 			if ((fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED)) == 0) {
 				calculate_fcurve(fcu, ctime);
-				animsys_execute_fcurve(ptr, remap, fcu); 
+				BKE_animsys_execute_fcurve(ptr, remap, fcu); 
 			}
 		}
 	}
@@ -1549,7 +1549,7 @@ static void animsys_evaluate_drivers(PointerRNA *ptr, AnimData *adt, float ctime
 				 * 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 */
 				calculate_fcurve(fcu, ctime);
-				ok = animsys_execute_fcurve(ptr, NULL, fcu);
+				ok = BKE_animsys_execute_fcurve(ptr, NULL, fcu);
 				
 				/* clear recalc flag */
 				driver->flag &= ~DRIVER_FLAG_RECALC;
@@ -1618,7 +1618,7 @@ void animsys_evaluate_action_group(PointerRNA *ptr, bAction *act, bActionGroup *
 		/* check if this curve should be skipped */
 		if ((fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED)) == 0) {
 			calculate_fcurve(fcu, ctime);
-			animsys_execute_fcurve(ptr, remap, fcu); 
+			BKE_animsys_execute_fcurve(ptr, remap, fcu); 
 		}
 	}
 }
diff --git a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
index 890cf86..85bf12f 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
@@ -349,19 +349,17 @@ void DepsgraphNodeBuilder::build_animdata(ID *id)
 
 		/* actions */
 		if (adt->action != NULL) {
-			for (FCurve *fcu = (FCurve *)adt->action->curves.first; fcu; fcu = fcu->next) {
-				TimeSourceDepsNode *time_src = m_graph->find_time_source();
-				add_operation_node(id, DEPSNODE_TYPE_ANIMATION,
-				                   DEPSOP_TYPE_EXEC, bind(BKE_animsys_eval_driver, _1, id, fcu, time_src),
-				                   deg_op_name_action_fcurve(adt->action, fcu));
-			}
+			TimeSourceDepsNode *time_src = m_graph->find_time_source();
+			add_operation_node(id, DEPSNODE_TYPE_ANIMATION,
+			                   DEPSOP_TYPE_EXEC, bind(BKE_animsys_eval_action, _1, id, adt->action, time_src),
+			                   deg_op_name_action(adt->action));
 			/* TODO(sergey): Action groups. */
 		}
 
 		/* drivers */
 		for (FCurve *fcu = (FCurve *)adt->drivers.first; fcu; fcu = fcu->next) {
 			/* create driver */
-			/*OperationDepsNode *driver_node =*/ build_driver(id, fcu);
+			/*OperationDepsNode *driver_node =*/ //build_driver(id, fcu);
 
 			/* hook up update callback associated with F-Curve */
 			// ...
diff --git a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
index 4babe4d..f6d455e 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
@@ -500,11 +500,12 @@ void DepsgraphRelationBuilder::build_driver(ID *id, FCurve *fcurve)
 			if ((dtar->flag & DTAR_FLAG_STRUCT_REF) && (dtar->pchan_name[0])) {
 				Object *ob = (Object *)dtar->id;
 				bPoseChannel *pchan = BKE_pose_channel_find_name(ob->pose, dtar->pchan_name);
-				
-				/* get node associated with bone */
-				ComponentKey target_key(dtar->id, DEPSNODE_TYPE_BONE, pchan->name);
-				add_relation(target_key, driver_key, DEPSREL_TYPE_DRIVER_TARGET,
-				             "[Target -> Driver] DepsRel");
+				if (pchan != NULL) {
+					/* get node associated with bone */
+					ComponentKey target_key(dtar->id, DEPSNODE_TYPE_BONE, pchan->name);
+					add_relation(target_key, driver_key, DEPSREL_TYPE_DRIVER_TARGET,
+					             "[Target -> Driver] DepsRel");
+				}
 			}
 			else {
 				/* resolve path to get node */
diff --git a/source/blender/depsgraph/intern/depsgraph_type_defines.cpp b/source/blender/depsgraph/intern/depsgraph_type_defines.cpp
index 4e10824..59603df 100644
--- a/source/blender/depsgraph/intern/depsgraph_type_defines.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_type_defines.cpp
@@ -44,6 +44,7 @@ extern "C" {
 #include "BKE_action.h"
 #include "BKE_animsys.h"
 #include "BKE_armature.h"
+#include "BKE_fcurve.h"
 #include "BKE_object.h"
 
 #include "DEG_depsgraph.h"
@@ -62,7 +63,7 @@ extern "C" {
 
 #include "stubs.h" // XXX: THIS MUST BE REMOVED WHEN THE DEPSGRAPH REFACTOR IS DONE
 
-void BKE_animsys_eval_driver(EvaluationContext *eval_ctx, ID *id, FCurve *fcurve, TimeSourceDepsNode *time_src)
+void BKE_animsys_eval_action(EvaluationContext *eval_ctx, ID *id, bAction *action, TimeSourceDepsNode *time_src)
 {
 	printf("%s on %s\n", __func__, id->name);
 	if (ID_REAL_USERS(id) > 0) {
@@ -72,6 +73,22 @@ void BKE_animsys_eval_driver(EvaluationContext *eval_ctx, ID *id, FCurve *fcurve
 	}
 }
 
+void BKE_animsys_eval_driver(EvaluationContext *eval_ctx, ID *id, FCurve *fcurve, TimeSourceDepsNode *time_src)
+{
+	/* TODO(sergey): De-duplicate with BKE animsys. */
+	printf("%s on %s\n", __func__, id->name);
+	if (ID_REAL_USERS(id) > 0 && (fcurve->driver->flag & DRIVER_FLAG_INVALID) == 0) {
+		float ctime = time_src->cfra;
+		PointerRNA id_ptr;
+		RNA_id_pointer_create(id, &id_ptr);
+		calculate_fcurve(fcurve, ctime);
+		if (!BKE_animsys_execute_fcurve(&id_ptr, NULL, fcurve)) {
+			fcurve->driver->flag |= DRIVER_FLAG_INVALID;
+		}
+		fcurve->driver->flag &= ~DRIVER_FLAG_RECALC;
+	}
+}
+
 void BKE_pose_constraints_evaluate(EvaluationContext *eval_ctx, Object *ob, bPoseChannel *pchan) {}
 
 void BKE_pose_iktree_evaluate(EvaluationContext *eval_ctx, Object *ob, bPoseChannel *rootchan) {}
@@ -108,14 +125,9 @@ const string deg_op_name_pose_eval_flush = "Flush Pose Eval";
 const string deg_op_name_ik_solver = "IK Solver";
 const string deg_op_name_spline_ik_solver = "Spline IK Solver";
 const string deg_op_name_psys_eval = "PSys Eval";
-string deg_op_name_action_fcurve(const bAction *action, const FCurve *fcu)
+string deg_op_name_action(const bAction *action)
 {
-	if (fcu->rna_path != NULL) {
-		return string_format("Action FCurve @ %s:%s[%d]", action->id.name + 2, fcu->rna_path, fcu->array_index);
-	}
-	else {
-		return string_format("Action FCurve @ %s:%p", action->id.name, fcu);
-	}
+	return string_format("Action %s", action->id.name);
 }
 string deg_op_name_driver(const ChannelDriver *driver)
 {
diff --git a/source/blender/depsgraph/intern/depsgraph_types.h b/source/blender/depsgraph/intern/depsgraph_types.h
index b283565..c772582 100644
--- a/source/blender/depsgraph/intern/depsgraph_types.h
+++ b/source/blender/depsgraph/intern/depsgraph_types.h
@@ -99,7 +99,7 @@ extern const string deg_op_name_pose_eval_flush;
 extern const string deg_op_name_ik_solver;
 extern const string deg_op_name_spline_ik_solver;
 extern const string deg_op_name_psys_eval;
-string deg_op_name_action_fcurve(const bAction *action, const FCurve *fcu);
+string deg_op_name_action(const bAction *action);
 string deg_op_name_driver(const ChannelDriver *driver);
 string deg_op_name_modifier(const ModifierData *md);
 
diff --git a/source/blender/depsgraph/intern/stubs.h b/source/blender/depsgraph/intern/stubs.h
index 86783cb..096650a 100644
--- a/source/blender/depsgraph/intern/stubs.h
+++ b/source/blender/depsgraph/intern/stubs.h
@@ -25,6 +25,7 @@ struct ParticleSystem;
 struct EvaluationContext;
 struct TimeSourceDepsNode;
 
+void BKE_animsys_eval_action(struct EvaluationContext *eval_ctx, ID *id, bAction *action, TimeSourceDepsNode *time_src);
 void BKE_animsys_eval_driver(struct EvaluationContext *eval_ctx, ID *id, FCurve *fcurve, TimeSourceDepsNode *time_src);
 
 void BKE_pose_constraints_evaluate(struct EvaluationContext *eval_ctx, Object *ob, bPoseChannel *pchan);




More information about the Bf-blender-cvs mailing list