Fix T81813: Keyframe handles don't follow keyframes

Add a new property `co_ui` to Keyframes, the modification of which will
apply to the keyframe itself as well as its Bézier handles.

Dragging the "Keyframe" slider in the properties panel now maintains the
deltas between the keyframe and its handles, just like moving the key in
the graph editor would.

Reviewed by @sybren in T81813.
This commit is contained in:
Wayde Moss 2020-11-12 11:53:12 +01:00 committed by Sybren A. Stüvel
parent 9067cd64a5
commit dbbfba9428
Notes: blender-bot 2023-02-13 23:16:02 +01:00
Referenced by issue #81813, Keyframe handles dont follow keyframes.
2 changed files with 36 additions and 4 deletions

View File

@ -423,13 +423,14 @@ static void graph_panel_key_properties(const bContext *C, Panel *panel)
but_max_width,
UI_UNIT_Y,
&bezt_ptr,
"co",
"co_ui",
0,
0,
0,
0,
0,
NULL);
UI_but_func_set(but, graphedit_activekey_update_cb, fcu, bezt);
uiItemL_respect_property_split(col, IFACE_("Value"), ICON_NONE);
but = uiDefButR(block,
@ -441,7 +442,7 @@ static void graph_panel_key_properties(const bContext *C, Panel *panel)
but_max_width,
UI_UNIT_Y,
&bezt_ptr,
"co",
"co_ui",
1,
0,
0,
@ -450,8 +451,6 @@ static void graph_panel_key_properties(const bContext *C, Panel *panel)
NULL);
UI_but_func_set(but, graphedit_activekey_update_cb, fcu, bezt);
UI_but_unit_type_set(but, unit);
UI_but_func_set(but, graphedit_activekey_update_cb, fcu, bezt);
}
/* previous handle - only if previous was Bezier interpolation */

View File

@ -463,6 +463,27 @@ static void rna_FKeyframe_ctrlpoint_set(PointerRNA *ptr, const float *values)
bezt->vec[1][1] = values[1];
}
static void rna_FKeyframe_ctrlpoint_ui_set(PointerRNA *ptr, const float *values)
{
BezTriple *bezt = (BezTriple *)ptr->data;
const float frame_delta = values[0] - bezt->vec[1][0];
const float value_delta = values[1] - bezt->vec[1][1];
/** To match the behavior of transforming the keyframe Co using the Graph Editor
* (transform_convert_graph.c) flushTransGraphData(), we will also move the handles by
* the same amount as the Co delta. */
bezt->vec[0][0] += frame_delta;
bezt->vec[0][1] += value_delta;
bezt->vec[1][0] = values[0];
bezt->vec[1][1] = values[1];
bezt->vec[2][0] += frame_delta;
bezt->vec[2][1] += value_delta;
}
/* ****************************** */
static void rna_FCurve_RnaPath_get(PointerRNA *ptr, char *value)
@ -2098,6 +2119,18 @@ static void rna_def_fkeyframe(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Control Point", "Coordinates of the control point");
RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, "rna_Keyframe_update");
prop = RNA_def_property(
srna, "co_ui", PROP_FLOAT, PROP_COORDS); /* keyframes are dimensionless */
RNA_def_property_array(prop, 2);
RNA_def_property_float_funcs(
prop, "rna_FKeyframe_ctrlpoint_get", "rna_FKeyframe_ctrlpoint_ui_set", NULL);
RNA_def_property_ui_text(
prop,
"Control Point",
"Coordinates of the control point. Note: Changing this value also updates the handles "
"similar to using the graph editor transform operator");
RNA_def_property_update(prop, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, "rna_Keyframe_update");
prop = RNA_def_property(
srna, "handle_right", PROP_FLOAT, PROP_COORDS); /* keyframes are dimensionless */
RNA_def_property_array(prop, 2);