[Bf-blender-cvs] [e6bdc950d25] master: Fix T61689: Crash when having image and regular animation

Sergey Sharybin noreply at git.blender.org
Wed Feb 20 11:54:57 CET 2019


Commit: e6bdc950d25ca9f57effaebe0d4505038901a610
Author: Sergey Sharybin
Date:   Wed Feb 20 11:32:22 2019 +0100
Branches: master
https://developer.blender.org/rBe6bdc950d25ca9f57effaebe0d4505038901a610

Fix T61689: Crash when having image and regular animation

Was caused by ambiguity in entry/exit operation for animation channel.
Made those explicit now,

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

M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/node/deg_node_operation.cc
M	source/blender/depsgraph/intern/node/deg_node_operation.h

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

diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 47574902b0d..b88d90ca2d8 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -845,10 +845,21 @@ void DepsgraphNodeBuilder::build_animdata(ID *id)
 	(void) add_id_node(id);
 	ID *id_cow = get_cow_id(id);
 	if (adt->action != NULL || !BLI_listbase_is_empty(&adt->nla_tracks)) {
-		add_operation_node(id, NodeType::ANIMATION,
-		                   OperationCode::ANIMATION,
-		                   function_bind(BKE_animsys_eval_animdata, _1, id_cow),
-		                   id->name);
+		OperationNode *operation_node;
+		/* Explicit entry operation. */
+		operation_node = add_operation_node(
+		        id, NodeType::ANIMATION, OperationCode::ANIMATION_ENTRY);
+		operation_node->set_as_entry();
+		/* All the evaluation nodes. */
+		add_operation_node(
+		        id,
+		        NodeType::ANIMATION,
+		        OperationCode::ANIMATION_EVAL,
+		        function_bind(BKE_animsys_eval_animdata, _1, id_cow));
+		/* Explicit exit operation. */
+		operation_node = add_operation_node(
+		        id, NodeType::ANIMATION, OperationCode::ANIMATION_EXIT);
+		operation_node->set_as_exit();
 	}
 	/* NLA strips contain actions. */
 	LISTBASE_FOREACH (NlaTrack *, nlt, &adt->nla_tracks) {
@@ -894,7 +905,7 @@ void DepsgraphNodeBuilder::build_action(bAction *action)
 		return;
 	}
 	add_operation_node(
-	        &action->id, NodeType::ANIMATION, OperationCode::ANIMATION);
+	        &action->id, NodeType::ANIMATION, OperationCode::ANIMATION_EVAL);
 }
 
 /**
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 9efa4d6bf16..b5ad391424b 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -1217,10 +1217,19 @@ void DepsgraphRelationBuilder::build_animdata_curves(ID *id)
 	if (adt->action != NULL) {
 		build_action(adt->action);
 	}
-	if (adt->action == NULL && adt->nla_tracks.first == NULL) {
+	if (adt->action == NULL && BLI_listbase_is_empty(&adt->nla_tracks)) {
 		return;
 	}
-	/* Wire up dependency to time source. */
+	/* Ensure evaluation order from entry to exit. */
+	OperationKey animation_entry_key(
+	        id, NodeType::ANIMATION, OperationCode::ANIMATION_ENTRY);
+	OperationKey animation_eval_key(
+	        id, NodeType::ANIMATION, OperationCode::ANIMATION_EVAL);
+	OperationKey animation_exit_key(
+	        id, NodeType::ANIMATION, OperationCode::ANIMATION_EXIT);
+	add_relation(animation_entry_key, animation_eval_key, "Init -> Eval");
+	add_relation(animation_eval_key, animation_exit_key, "Eval -> Exit");
+	/* Wire up dependency from action. */
 	ComponentKey adt_key(id, NodeType::ANIMATION);
 	/* Relation from action itself. */
 	if (adt->action != NULL) {
diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.cc b/source/blender/depsgraph/intern/node/deg_node_operation.cc
index 0d3ec70d22c..f852a32450d 100644
--- a/source/blender/depsgraph/intern/node/deg_node_operation.cc
+++ b/source/blender/depsgraph/intern/node/deg_node_operation.cc
@@ -43,7 +43,9 @@ const char *operationCodeAsString(OperationCode opcode)
 		case OperationCode::ID_PROPERTY: return "ID_PROPERTY";
 		case OperationCode::PARAMETERS_EVAL: return "PARAMETERS_EVAL";
 		/* Animation, Drivers, etc. */
-		case OperationCode::ANIMATION: return "ANIMATION";
+		case OperationCode::ANIMATION_ENTRY: return "ANIMATION_ENTRY";
+		case OperationCode::ANIMATION_EVAL: return "ANIMATION_EVAL";
+		case OperationCode::ANIMATION_EXIT: return "ANIMATION_EXIT";
 		case OperationCode::DRIVER: return "DRIVER";
 		/* Scene related. */
 		case OperationCode::SCENE_EVAL: return "SCENE_EVAL";
diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.h b/source/blender/depsgraph/intern/node/deg_node_operation.h
index da823595705..8ec71d1829f 100644
--- a/source/blender/depsgraph/intern/node/deg_node_operation.h
+++ b/source/blender/depsgraph/intern/node/deg_node_operation.h
@@ -51,7 +51,9 @@ enum class OperationCode {
 
 	/* Animation, Drivers, etc. --------------------------------------------- */
 	/* NLA + Action */
-	ANIMATION,
+	ANIMATION_ENTRY,
+	ANIMATION_EVAL,
+	ANIMATION_EXIT,
 	/* Driver */
 	DRIVER,



More information about the Bf-blender-cvs mailing list