diff options
-rw-r--r-- | source/blender/blenkernel/BKE_animsys.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/anim_sys.c | 11 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_nodes.cc | 14 |
3 files changed, 13 insertions, 14 deletions
diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h index a2a14011595..7ef99fe1405 100644 --- a/source/blender/blenkernel/BKE_animsys.h +++ b/source/blender/blenkernel/BKE_animsys.h @@ -289,7 +289,7 @@ void BKE_animsys_eval_animdata(struct Depsgraph *depsgraph, struct ID *id); void BKE_animsys_eval_driver(struct Depsgraph *depsgraph, struct ID *id, int driver_index, - struct ChannelDriver *driver_orig); + struct FCurve *fcu_orig); void BKE_animsys_update_driver_array(struct ID *id); diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 4f6f299ecc5..2e655452a21 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -4082,11 +4082,10 @@ void BKE_animsys_update_driver_array(ID *id) } } -void BKE_animsys_eval_driver(Depsgraph *depsgraph, - ID *id, - int driver_index, - ChannelDriver *driver_orig) +void BKE_animsys_eval_driver(Depsgraph *depsgraph, ID *id, int driver_index, FCurve *fcu_orig) { + BLI_assert(fcu_orig != NULL); + /* TODO(sergey): De-duplicate with BKE animsys. */ PointerRNA id_ptr; bool ok = false; @@ -4111,6 +4110,7 @@ void BKE_animsys_eval_driver(Depsgraph *depsgraph, if ((fcu->flag & (FCURVE_MUTED | FCURVE_DISABLED)) == 0) { /* check if driver itself is tagged for recalculation */ /* XXX driver recalc flag is not set yet by depsgraph! */ + ChannelDriver *driver_orig = fcu_orig->driver; if ((driver_orig) && !(driver_orig->flag & DRIVER_FLAG_INVALID)) { /* evaluate this using values set already in other places * NOTE: for 'layering' option later on, we should check if we should remove old value before @@ -4121,7 +4121,7 @@ void BKE_animsys_eval_driver(Depsgraph *depsgraph, if (animsys_store_rna_setting(&id_ptr, fcu->rna_path, fcu->array_index, &anim_rna)) { /* Evaluate driver, and write results to COW-domain destination */ const float ctime = DEG_get_ctime(depsgraph); - const float curval = evaluate_fcurve_driver(&anim_rna, fcu, driver_orig, ctime); + const float curval = calculate_fcurve(&anim_rna, fcu, ctime); ok = animsys_write_rna_setting(&anim_rna, curval); /* Flush results & status codes to original data for UI (T59984) */ @@ -4129,6 +4129,7 @@ void BKE_animsys_eval_driver(Depsgraph *depsgraph, animsys_write_orig_anim_rna(&id_ptr, fcu->rna_path, fcu->array_index, curval); /* curval is displayed in the UI, and flag contains error-status codes */ + fcu_orig->curval = fcu->curval; driver_orig->curval = fcu->driver->curval; driver_orig->flag = fcu->driver->flag; diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 88f2f041354..d3bd61cc7c3 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -900,19 +900,17 @@ void DepsgraphNodeBuilder::build_driver(ID *id, FCurve *fcurve, int driver_index { /* Create data node for this driver */ ID *id_cow = get_cow_id(id); - ChannelDriver *driver_orig = fcurve->driver; /* TODO(sergey): ideally we could pass the COW of fcu, but since it * has not yet been allocated at this point we can't. As a workaround * the animation systems allocates an array so we can do a fast lookup * with the driver index. */ - ensure_operation_node( - id, - NodeType::PARAMETERS, - OperationCode::DRIVER, - function_bind(BKE_animsys_eval_driver, _1, id_cow, driver_index, driver_orig), - fcurve->rna_path ? fcurve->rna_path : "", - fcurve->array_index); + ensure_operation_node(id, + NodeType::PARAMETERS, + OperationCode::DRIVER, + function_bind(BKE_animsys_eval_driver, _1, id_cow, driver_index, fcurve), + fcurve->rna_path ? fcurve->rna_path : "", + fcurve->array_index); build_driver_variables(id, fcurve); } |