Depsgraph: Cleanup, split driver builder function
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 4 Dec 2017 17:11:43 +0000 (18:11 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 6 Dec 2017 09:21:33 +0000 (10:21 +0100)
source/blender/depsgraph/intern/builder/deg_builder_relations.cc
source/blender/depsgraph/intern/builder/deg_builder_relations.h

index df69c64f9aab68194f6becc3ee57fbf760c2df81..522ed9956cabd19ee42a8769a393afe093f475b5 100644 (file)
@@ -961,11 +961,33 @@ void DepsgraphRelationBuilder::build_driver(ID *id, FCurve *fcu)
                                DEG_OPCODE_DRIVER,
                                fcu->rna_path ? fcu->rna_path : "",
                                fcu->array_index);
-       const char *rna_path = fcu->rna_path ? fcu->rna_path : "";
-       const RNAPathKey self_key(id, rna_path);
        /* Driver -> data components (for interleaved evaluation
         * bones/constraints/modifiers).
         */
+       build_driver_data(id, fcu);
+       /* Loop over variables to get the target relationships. */
+       build_driver_variables(id, fcu);
+       /* It's quite tricky to detect if the driver actually depends on time or
+        * not, so for now we'll be quite conservative here about optimization and
+        * consider all python drivers to be depending on time.
+        */
+       if ((driver->type == DRIVER_TYPE_PYTHON) &&
+           python_driver_depends_on_time(driver))
+       {
+               TimeSourceKey time_src_key;
+               add_relation(time_src_key, driver_key, "TimeSrc -> Driver");
+       }
+}
+
+void DepsgraphRelationBuilder::build_driver_data(ID *id, FCurve *fcu)
+{
+       OperationKey driver_key(id,
+                               DEG_NODE_TYPE_PARAMETERS,
+                               DEG_OPCODE_DRIVER,
+                               fcu->rna_path ? fcu->rna_path : "",
+                               fcu->array_index);
+       const char *rna_path = fcu->rna_path ? fcu->rna_path : "";
+       const RNAPathKey self_key(id, rna_path);
        if (GS(id->name) == ID_AR && strstr(rna_path, "bones[")) {
                /* Drivers on armature-level bone settings (i.e. bbone stuff),
                 * which will affect the evaluation of corresponding pose bones.
@@ -1009,18 +1031,6 @@ void DepsgraphRelationBuilder::build_driver(ID *id, FCurve *fcu)
                RNAPathKey target_key(id, rna_path);
                add_relation(driver_key, target_key, "Driver -> Target");
        }
-       /* Loop over variables to get the target relationships. */
-       build_driver_variables(id, fcu);
-       /* It's quite tricky to detect if the driver actually depends on time or
-        * not, so for now we'll be quite conservative here about optimization and
-        * consider all python drivers to be depending on time.
-        */
-       if ((driver->type == DRIVER_TYPE_PYTHON) &&
-           python_driver_depends_on_time(driver))
-       {
-               TimeSourceKey time_src_key;
-               add_relation(time_src_key, driver_key, "TimeSrc -> Driver");
-       }
 }
 
 void DepsgraphRelationBuilder::build_driver_variables(ID *id, FCurve *fcu)
index 7aadf197c7b5e5790b8681419bc38d84cfad409c..1cf2f9847e200413bffc5a3e63c5d155d86c3c6d 100644 (file)
@@ -198,6 +198,7 @@ struct DepsgraphRelationBuilder
                               RootPChanMap *root_map);
        void build_animdata(ID *id);
        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_world(World *world);
        void build_rigidbody(Scene *scene);