Fix: Toggling "mute" toggle in animation editors didn't work with copy-on-write
Tested on Autumn run cycle by muting master bone animation - when working, the dog should run forwards when the master bone animation is being muted.
This commit is contained in:
@@ -4049,6 +4049,15 @@ static void achannel_setting_flush_widget_cb(bContext *C, void *ale_npoin, void
|
||||
if (ale_setting->type == ANIMTYPE_GPLAYER)
|
||||
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA, NULL);
|
||||
|
||||
/* tag copy-on-write flushing (so that the settings will have an effect) */
|
||||
if (ale_setting->id) {
|
||||
DEG_id_tag_update(ale_setting->id, DEG_TAG_COPY_ON_WRITE);
|
||||
}
|
||||
if (ale_setting->adt && ale_setting->adt->action) {
|
||||
/* action is it's own datablock, so has to be tagged specifically... */
|
||||
DEG_id_tag_update(&ale_setting->adt->action->id, DEG_TAG_COPY_ON_WRITE);
|
||||
}
|
||||
|
||||
/* verify animation context */
|
||||
if (ANIM_animdata_get_context(C, &ac) == 0)
|
||||
return;
|
||||
|
||||
@@ -481,6 +481,18 @@ static void rna_FCurve_update_data(Main *UNUSED(bmain), Scene *UNUSED(scene), Po
|
||||
rna_FCurve_update_data_ex((FCurve *)ptr->data);
|
||||
}
|
||||
|
||||
/* RNA update callback for F-Curves to indicate that there are copy-on-write tagging/flushing needed
|
||||
* (e.g. for properties that affect how animation gets evaluated)
|
||||
*/
|
||||
static void rna_FCurve_update_eval(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
|
||||
{
|
||||
IdAdtTemplate *iat = (IdAdtTemplate *)ptr->id.data;
|
||||
if (iat && iat->adt && iat->adt->action) {
|
||||
/* action is separate datablock, needs separate tag */
|
||||
DEG_id_tag_update(&iat->adt->action->id, DEG_TAG_COPY_ON_WRITE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static PointerRNA rna_FCurve_active_modifier_get(PointerRNA *ptr)
|
||||
{
|
||||
@@ -590,10 +602,18 @@ static void rna_FModifier_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Poin
|
||||
ID *id = ptr->id.data;
|
||||
FModifier *fcm = (FModifier *)ptr->data;
|
||||
AnimData *adt = BKE_animdata_from_id(id);
|
||||
|
||||
DEG_id_tag_update(id, (GS(id->name) == ID_OB) ? OB_RECALC_OB : OB_RECALC_DATA);
|
||||
|
||||
if (adt != NULL) {
|
||||
adt->recalc |= ADT_RECALC_ANIM;
|
||||
|
||||
if (adt->action != NULL) {
|
||||
/* action is separate datablock, needs separate tag */
|
||||
DEG_id_tag_update(&adt->action->id, DEG_TAG_COPY_ON_WRITE);
|
||||
}
|
||||
}
|
||||
|
||||
if (fcm->curve && fcm->type == FMODIFIER_TYPE_CYCLES) {
|
||||
calchandles_fcurve(fcm->curve);
|
||||
}
|
||||
@@ -1967,7 +1987,7 @@ static void rna_def_fcurve(BlenderRNA *brna)
|
||||
prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", FCURVE_MUTED);
|
||||
RNA_def_property_ui_text(prop, "Muted", "F-Curve is not evaluated");
|
||||
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
|
||||
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, "rna_FCurve_update_eval");
|
||||
|
||||
prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", FCURVE_VISIBLE);
|
||||
|
||||
Reference in New Issue
Block a user