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:
parent
9067cd64a5
commit
dbbfba9428
Notes:
blender-bot
2023-02-13 23:16:02 +01:00
Referenced by issue #81813, Keyframe handles dont follow keyframes.
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue