Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-02-20 13:48:42 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-02-20 13:48:42 +0300
commitc985c60bdc7cfc6914d583cf5179a03aaa68b302 (patch)
treefd6e53c5219de8ee806bb99d06797becf1ae6cc9 /source/blender/depsgraph/intern
parente6bdc950d25ca9f57effaebe0d4505038901a610 (diff)
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).
Diffstat (limited to 'source/blender/depsgraph/intern')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc23
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.h1
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc18
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.h1
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_operation.cc2
-rw-r--r--source/blender/depsgraph/intern/node/deg_node_operation.h2
6 files changed, 43 insertions, 4 deletions
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 */