Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / intern / anim_sys.c
index b79a8d5cbed5cecbf899d9135e857d537074a0f8..ecdb180d2ede39e2b8d5bc1aa6bb57eca6d39cba 100644 (file)
@@ -77,6 +77,8 @@
 
 #include "atomic_ops.h"
 
+#include "DEG_depsgraph.h"
+
 /* ***************************************** */
 /* AnimData API */
 
@@ -2879,18 +2881,34 @@ void BKE_animsys_evaluate_all_animation(Main *main, Scene *scene, float ctime)
 /* ************** */
 /* Evaluation API */
 
-#define DEBUG_PRINT if (G.debug & G_DEBUG_DEPSGRAPH_EVAL) printf
-
 void BKE_animsys_eval_animdata(const EvaluationContext *eval_ctx, ID *id)
 {
        AnimData *adt = BKE_animdata_from_id(id);
        Scene *scene = NULL; /* XXX: this is only needed for flushing RNA updates,
                              * which should get handled as part of the dependency graph instead...
                              */
-       DEBUG_PRINT("%s on %s, time=%f\n\n", __func__, id->name, (double)eval_ctx->ctime);
+       DEG_debug_print_eval_time(__func__, id->name, id, eval_ctx->ctime);
        BKE_animsys_evaluate_animdata(scene, id, adt, eval_ctx->ctime, ADT_RECALC_ANIM);
 }
 
+/* TODO(sergey): This is slow lookup of driver from CoW datablock.
+ * Keep this for until we've got something smarter for depsgraph
+ * building.\
+ */
+static FCurve *find_driver_from_evaluated_id(ID *id, FCurve *fcu)
+{
+       /* We've got non-CoW datablock, can use f-curve as-is. */
+       if (id->orig_id == NULL) {
+               return fcu;
+       }
+       /*const*/ ID *id_orig = id->orig_id;
+       const AnimData *adt_orig = BKE_animdata_from_id(id_orig);
+       const AnimData *adt_cow = BKE_animdata_from_id(id);
+       const int fcu_index = BLI_findindex(&adt_orig->drivers, fcu);
+       BLI_assert(fcu_index != -1);
+       return BLI_findlink(&adt_cow->drivers, fcu_index);
+}
+
 void BKE_animsys_eval_driver(const EvaluationContext *eval_ctx,
                              ID *id,
                              FCurve *fcu)
@@ -2900,11 +2918,10 @@ void BKE_animsys_eval_driver(const EvaluationContext *eval_ctx,
        PointerRNA id_ptr;
        bool ok = false;
 
-       DEBUG_PRINT("%s on %s (%s[%d])\n",
-                   __func__,
-                   id->name,
-                   fcu->rna_path,
-                   fcu->array_index);
+       fcu = find_driver_from_evaluated_id(id, fcu);
+
+       DEG_debug_print_eval_subdata_index(
+               __func__, id->name, id, "fcu", fcu->rna_path, fcu, fcu->array_index);
 
        RNA_id_pointer_create(id, &id_ptr);
 
@@ -2937,5 +2954,3 @@ void BKE_animsys_eval_driver(const EvaluationContext *eval_ctx,
                }
        }
 }
-
-#undef DEBUG_PRINT