diff options
author | Sybren A. Stüvel <sybren> | 2020-07-17 18:38:09 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@blender.org> | 2020-07-20 12:51:09 +0300 |
commit | 686ab4c9401a90b22fb17e46c992eb513fe4f693 (patch) | |
tree | c83b4da92fbd12b0c78e2ce5c3041ada23b5ef4b /source/blender/blenkernel/BKE_animsys.h | |
parent | 6fbfa522e66d41839449899ab53dbf20d280d5ec (diff) |
T77086 Animation: Passing Dependency Graph to Drivers
Custom driver functions need access to the dependency graph that is
triggering the evaluation of the driver. This patch passes the
dependency graph pointer through all the animation-related calls.
Instead of passing the evaluation time to functions, the code now passes
an `AnimationEvalContext` pointer:
```
typedef struct AnimationEvalContext {
struct Depsgraph *const depsgraph;
const float eval_time;
} AnimationEvalContext;
```
These structs are read-only, meaning that the code cannot change the
evaluation time. Note that the `depsgraph` pointer itself is const, but
it points to a non-const depsgraph.
FCurves and Drivers can be evaluated at a different time than the
current scene time, for example when evaluating NLA strips. This means
that, even though the current time is stored in the dependency graph, we
need an explicit evaluation time.
There are two functions that allow creation of `AnimationEvalContext`
objects:
- `BKE_animsys_eval_context_construct(Depsgraph *depsgraph, float
eval_time)`, which creates a new context object from scratch, and
- `BKE_animsys_eval_context_construct_at(AnimationEvalContext
*anim_eval_context, float eval_time)`, which can be used to create a
`AnimationEvalContext` with the same depsgraph, but at a different
time. This makes it possible to later add fields without changing any
of the code that just want to change the eval time.
This also provides a fix for T75553, although it does require a change
to the custom driver function. The driver should call
`custom_function(depsgraph)`, and the function should use that depsgraph
instead of information from `bpy.context`.
Reviewed By: brecht, sergey
Differential Revision: https://developer.blender.org/D8047
Diffstat (limited to 'source/blender/blenkernel/BKE_animsys.h')
-rw-r--r-- | source/blender/blenkernel/BKE_animsys.h | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h index 4a2ad28f90f..2b7162418f8 100644 --- a/source/blender/blenkernel/BKE_animsys.h +++ b/source/blender/blenkernel/BKE_animsys.h @@ -48,6 +48,23 @@ struct bAction; struct bActionGroup; struct bContext; +/* Container for data required to do FCurve and Driver evaluation. */ +typedef struct AnimationEvalContext { + /* For drivers, so that they have access to the dependency graph and the current view layer. See + * T77086. */ + struct Depsgraph *const depsgraph; + + /* FCurves and Drivers can be evaluated at a different time than the current scene time, for + * example when evaluating NLA strips. This means that, even though the current time is stored in + * the dependency graph, we need an explicit evaluation time. */ + const float eval_time; +} AnimationEvalContext; + +AnimationEvalContext BKE_animsys_eval_context_construct(struct Depsgraph *depsgraph, + float eval_time); +AnimationEvalContext BKE_animsys_eval_context_construct_at( + const AnimationEvalContext *anim_eval_context, float eval_time); + /* ************************************* */ /* KeyingSets API */ @@ -172,11 +189,12 @@ void BKE_fcurves_id_cb(struct ID *id, ID_FCurve_Edit_Callback func, void *user_d typedef struct NlaKeyframingContext NlaKeyframingContext; -struct NlaKeyframingContext *BKE_animsys_get_nla_keyframing_context(struct ListBase *cache, - struct PointerRNA *ptr, - struct AnimData *adt, - float ctime, - const bool flush_to_original); +struct NlaKeyframingContext *BKE_animsys_get_nla_keyframing_context( + struct ListBase *cache, + struct PointerRNA *ptr, + struct AnimData *adt, + const struct AnimationEvalContext *anim_eval_context, + const bool flush_to_original); bool BKE_animsys_nla_remap_keyframe_values(struct NlaKeyframingContext *context, struct PointerRNA *prop_ptr, struct PropertyRNA *prop, @@ -209,7 +227,7 @@ bool BKE_animsys_write_rna_setting(struct PathResolvedRNA *anim_rna, const float /* Evaluation loop for evaluating animation data */ void BKE_animsys_evaluate_animdata(struct ID *id, struct AnimData *adt, - float ctime, + const struct AnimationEvalContext *anim_eval_context, eAnimData_Recalc recalc, const bool flush_to_original); @@ -229,14 +247,14 @@ void BKE_animsys_evaluate_all_animation(struct Main *main, /* Evaluate Action (F-Curve Bag) */ void animsys_evaluate_action(struct PointerRNA *ptr, struct bAction *act, - float ctime, + const struct AnimationEvalContext *anim_eval_context, const bool flush_to_original); /* Evaluate Action Group */ void animsys_evaluate_action_group(struct PointerRNA *ptr, struct bAction *act, struct bActionGroup *agrp, - float ctime); + const struct AnimationEvalContext *anim_eval_context); /* ************************************* */ |