Fix T67274: Graph Editor Normalization broken by Keyframe that uses Easing or Dynamic interpolation
We didn't include and of the newer interpolation types in the normalization function. Besides taking into account these newer types, we now also only evaluate the curves when needed. If the values between the control points won't exceed the control point values, we only use the start/end values for our normalization Reviewed By: Brecht Differential Revision: http://developer.blender.org/D5365
This commit is contained in:
parent
5662a5969b
commit
edb3b7a323
Notes:
blender-bot
2023-02-14 01:42:32 +01:00
Referenced by commit d0b0a0a894
, Fix T74927: Slow playback using Auto Normalization
Referenced by issue #71650, Bezier curve show as Constant
Referenced by issue #67274, Graph Editor Normalization broken by Keyframe that uses Easing or Dynamic interpolation
|
@ -422,23 +422,16 @@ static float normalization_factor_get(Scene *scene, FCurve *fcu, short flag, flo
|
|||
}
|
||||
else {
|
||||
const BezTriple *prev_bezt = bezt - 1;
|
||||
if (prev_bezt->ipo == BEZT_IPO_CONST) {
|
||||
/* Constant interpolation: previous CV value is used up
|
||||
* to the current keyframe.
|
||||
*/
|
||||
max_coord = max_ff(max_coord, bezt->vec[1][1]);
|
||||
min_coord = min_ff(min_coord, bezt->vec[1][1]);
|
||||
}
|
||||
else if (prev_bezt->ipo == BEZT_IPO_LIN) {
|
||||
/* Linear interpolation: min/max using both previous and
|
||||
* and current CV.
|
||||
if (!ELEM(prev_bezt->ipo, BEZT_IPO_BEZ, BEZT_IPO_BACK, BEZT_IPO_ELASTIC)) {
|
||||
/* The points on the curve will lie inside the start and end points.
|
||||
* Calculate min/max using both previous and current CV.
|
||||
*/
|
||||
max_coord = max_ff(max_coord, bezt->vec[1][1]);
|
||||
min_coord = min_ff(min_coord, bezt->vec[1][1]);
|
||||
max_coord = max_ff(max_coord, prev_bezt->vec[1][1]);
|
||||
min_coord = min_ff(min_coord, prev_bezt->vec[1][1]);
|
||||
}
|
||||
else if (prev_bezt->ipo == BEZT_IPO_BEZ) {
|
||||
else {
|
||||
const int resol = fcu->driver ?
|
||||
32 :
|
||||
min_ii((int)(5.0f * len_v2v2(bezt->vec[1], prev_bezt->vec[1])),
|
||||
|
@ -448,30 +441,12 @@ static float normalization_factor_get(Scene *scene, FCurve *fcu, short flag, flo
|
|||
min_coord = min_ff(min_coord, prev_bezt->vec[1][1]);
|
||||
}
|
||||
else {
|
||||
float data[120];
|
||||
float v1[2], v2[2], v3[2], v4[2];
|
||||
|
||||
v1[0] = prev_bezt->vec[1][0];
|
||||
v1[1] = prev_bezt->vec[1][1];
|
||||
v2[0] = prev_bezt->vec[2][0];
|
||||
v2[1] = prev_bezt->vec[2][1];
|
||||
|
||||
v3[0] = bezt->vec[0][0];
|
||||
v3[1] = bezt->vec[0][1];
|
||||
v4[0] = bezt->vec[1][0];
|
||||
v4[1] = bezt->vec[1][1];
|
||||
|
||||
correct_bezpart(v1, v2, v3, v4);
|
||||
|
||||
BKE_curve_forward_diff_bezier(
|
||||
v1[0], v2[0], v3[0], v4[0], data, resol, sizeof(float) * 3);
|
||||
BKE_curve_forward_diff_bezier(
|
||||
v1[1], v2[1], v3[1], v4[1], data + 1, resol, sizeof(float) * 3);
|
||||
|
||||
float step_size = (bezt->vec[1][0] - prev_bezt->vec[1][0]) / resol;
|
||||
for (int j = 0; j <= resol; ++j) {
|
||||
const float *fp = &data[j * 3];
|
||||
max_coord = max_ff(max_coord, fp[1]);
|
||||
min_coord = min_ff(min_coord, fp[1]);
|
||||
float eval_time = prev_bezt->vec[1][0] + step_size * j;
|
||||
float eval_value = evaluate_fcurve_only_curve(fcu, eval_time);
|
||||
max_coord = max_ff(max_coord, eval_value);
|
||||
min_coord = min_ff(min_coord, eval_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue