[Bf-blender-cvs] [c985c60bdc7] master: Depsgraph: Fix relation when lamp has driver on custom property

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


Commit: c985c60bdc7cfc6914d583cf5179a03aaa68b302
Author: Sergey Sharybin
Date:   Wed Feb 20 11:48:42 2019 +0100
Branches: master
https://developer.blender.org/rBc985c60bdc7cfc6914d583cf5179a03aaa68b302

Depsgraph: Fix relation when lamp has driver on custom property

Was once again caused by an ambiguity of the entry/exit operations.

Only did for objects since those are the only one who needs this.
The rest types of IDs needs to be checked and only added extra
operations if needed (adding operations and relations causes some
overhead for evaluation, so need to be careful).

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

M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.h
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.h
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 b88d90ca2d8..51fc69fcee4 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -602,14 +602,14 @@ void DepsgraphNodeBuilder::build_object(int base_index,
 	}
 	/* Object data. */
 	build_object_data(object, is_visible);
+	/* Paramaters, used by both drivers/animation and also to inform dependency
+	 * from object's data. */
+	build_parameters(&object->id);
 	/* Build animation data,
 	 *
 	 * Do it now because it's possible object data will affect
 	 * on object's level animation, for example in case of rebuilding
 	 * pose for proxy. */
-	OperationNode *op_node = add_operation_node(
-	        &object->id, NodeType::PARAMETERS, OperationCode::PARAMETERS_EVAL);
-	op_node->set_as_exit();
 	build_animdata(&object->id);
 	/* Particle systems. */
 	if (object->particlesystem.first != NULL) {
@@ -983,6 +983,23 @@ void DepsgraphNodeBuilder::build_driver_id_property(ID *id,
 	                      prop_identifier);
 }
 
+void DepsgraphNodeBuilder::build_parameters(ID *id)
+{
+	(void) add_id_node(id);
+	OperationNode *op_node;
+	/* Explicit entry. */
+	op_node = add_operation_node(
+	        id, NodeType::PARAMETERS, OperationCode::PARAMETERS_ENTRY);
+	op_node->set_as_entry();
+	/* Generic evaluation node. */
+	add_operation_node(
+	        id, NodeType::PARAMETERS, OperationCode::PARAMETERS_EVAL);
+	/* Explicit exit operation. */
+	op_node = add_operation_node(
+	        id, NodeType::PARAMETERS, OperationCode::PARAMETERS_EXIT);
+	op_node->set_as_exit();
+}
+
 /* Recursively build graph for world */
 void DepsgraphNodeBuilder::build_world(World *world)
 {
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index ce3c6995fe7..40e710e755d 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -192,6 +192,7 @@ struct DepsgraphNodeBuilder {
 	void build_driver(ID *id, FCurve *fcurve, int driver_index);
 	void build_driver_variables(ID *id, FCurve *fcurve);
 	void build_driver_id_property(ID *id, const char *rna_path);
+	void build_parameters(ID *id);
 	void build_ik_pose(Object *object,
 	                   bPoseChannel *pchan,
 	                   bConstraint *con);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index b5ad391424b..dfd940a176f 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -710,6 +710,8 @@ void DepsgraphRelationBuilder::build_object(Base *base, Object *object)
 	                             OperationCode::SYNCHRONIZE_TO_ORIGINAL);
 	add_relation(
 	        final_transform_key, synchronize_key, "Synchronize to Original");
+	/* Parameters. */
+	build_parameters(&object->id);
 }
 
 void DepsgraphRelationBuilder::build_object_flags(Base *base, Object *object)
@@ -806,8 +808,8 @@ void DepsgraphRelationBuilder::build_object_data_lamp(Object *object)
 {
 	Lamp *lamp = (Lamp *)object->data;
 	build_lamp(lamp);
-	ComponentKey object_parameters_key(&object->id, NodeType::PARAMETERS);
 	ComponentKey lamp_parameters_key(&lamp->id, NodeType::PARAMETERS);
+	ComponentKey object_parameters_key(&object->id, NodeType::PARAMETERS);
 	add_relation(lamp_parameters_key, object_parameters_key, "Light -> Object");
 }
 
@@ -1625,6 +1627,20 @@ void DepsgraphRelationBuilder::build_driver_variables(ID *id, FCurve *fcu)
 	}
 }
 
+void DepsgraphRelationBuilder::build_parameters(ID *id)
+{
+	OperationKey parameters_entry_key(
+	        id, NodeType::PARAMETERS, OperationCode::PARAMETERS_ENTRY);
+	OperationKey parameters_eval_key(
+	        id, NodeType::PARAMETERS, OperationCode::PARAMETERS_EVAL);
+	OperationKey parameters_exit_key(
+	        id, NodeType::PARAMETERS, OperationCode::PARAMETERS_EXIT);
+	add_relation(
+	        parameters_entry_key, parameters_eval_key, "Entry -> Eval");
+	add_relation(
+	        parameters_eval_key, parameters_exit_key, "Entry -> Exit");
+}
+
 void DepsgraphRelationBuilder::build_world(World *world)
 {
 	if (built_map_.checkIsBuiltAndTag(world)) {
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
index b8dee11bebd..164f83fdaeb 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
@@ -243,6 +243,7 @@ struct DepsgraphRelationBuilder
 	void build_driver(ID *id, FCurve *fcurve);
 	void build_driver_data(ID *id, FCurve *fcurve);
 	void build_driver_variables(ID *id, FCurve *fcurve);
+	void build_parameters(ID *id);
 	void build_world(World *world);
 	void build_rigidbody(Scene *scene);
 	void build_particle_systems(Object *object);
diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.cc b/source/blender/depsgraph/intern/node/deg_node_operation.cc
index f852a32450d..893c108dc5a 100644
--- a/source/blender/depsgraph/intern/node/deg_node_operation.cc
+++ b/source/blender/depsgraph/intern/node/deg_node_operation.cc
@@ -41,7 +41,9 @@ const char *operationCodeAsString(OperationCode opcode)
 		/* Generic Operations. */
 		case OperationCode::OPERATION: return "OPERATION";
 		case OperationCode::ID_PROPERTY: return "ID_PROPERTY";
+		case OperationCode::PARAMETERS_ENTRY: return "PARAMETERS_ENTRY";
 		case OperationCode::PARAMETERS_EVAL: return "PARAMETERS_EVAL";
+		case OperationCode::PARAMETERS_EXIT: return "PARAMETERS_EXIT";
 		/* Animation, Drivers, etc. */
 		case OperationCode::ANIMATION_ENTRY: return "ANIMATION_ENTRY";
 		case OperationCode::ANIMATION_EVAL: return "ANIMATION_EVAL";
diff --git a/source/blender/depsgraph/intern/node/deg_node_operation.h b/source/blender/depsgraph/intern/node/deg_node_operation.h
index 8ec71d1829f..c6db7b012d7 100644
--- a/source/blender/depsgraph/intern/node/deg_node_operation.h
+++ b/source/blender/depsgraph/intern/node/deg_node_operation.h
@@ -47,7 +47,9 @@ enum class OperationCode {
 
 	/* Generic parameters evaluation. */
 	ID_PROPERTY,
+	PARAMETERS_ENTRY,
 	PARAMETERS_EVAL,
+	PARAMETERS_EXIT,
 
 	/* Animation, Drivers, etc. --------------------------------------------- */
 	/* NLA + Action */



More information about the Bf-blender-cvs mailing list