diff options
author | Joshua Leung <aligorith@gmail.com> | 2019-01-04 04:57:09 +0300 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2019-01-08 15:41:58 +0300 |
commit | 9d4ed6d03b6910b5239c2f17b3559987330f9652 (patch) | |
tree | ca85f7825420ee8c2966a204cb04efad7fd50f6f | |
parent | b4bb9d59ee7b6e962738df630a1c77b44b70aa36 (diff) |
Fix T59984: Drivers don't update values in UI or show proper errors
We now perform COW -> original data flushing for all the debug values + error
status flags on Drivers/DriverVariables/DriverTargets, as these are only set
when errors are encountered when evaluating drivers.
-rw-r--r-- | source/blender/blenkernel/intern/anim_sys.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 2019554996c..c5a21342dc0 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -3484,11 +3484,34 @@ void BKE_animsys_eval_driver(Depsgraph *depsgraph, PathResolvedRNA anim_rna; 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); ok = animsys_write_rna_setting(&anim_rna, curval); + + /* Flush results & status codes to original data for UI (T59984) */ if (ok && DEG_is_active(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 */ + driver_orig->curval = fcu->driver->curval; + driver_orig->flag = fcu->driver->flag; + + DriverVar *dvar_orig = driver_orig->variables.first; + DriverVar *dvar = fcu->driver->variables.first; + for (; + dvar_orig && dvar; + dvar_orig = dvar_orig->next, dvar = dvar->next) + { + DriverTarget *dtar_orig = &dvar_orig->targets[0]; + DriverTarget *dtar = &dvar->targets[0]; + for (int i = 0; i < MAX_DRIVER_TARGETS; i++, dtar_orig++, dtar++) { + dtar_orig->flag = dtar->flag; + } + + dvar_orig->curval = dvar->curval; + dvar_orig->flag = dvar->flag; + } } } |