Fix: Frame Channels fails when no keys in range #105179

Merged
Christoph Lendenfeld merged 1 commits from ChrisLend/blender:fix_frame_channel_warning into main 2023-03-02 13:05:09 +01:00
1 changed files with 21 additions and 14 deletions

View File

@ -3643,7 +3643,7 @@ static void ANIM_OT_channel_select_keys(wmOperatorType *ot)
/** \name View Channel Operator /** \name View Channel Operator
* \{ */ * \{ */
static void get_normalized_fcurve_bounds(FCurve *fcu, static bool get_normalized_fcurve_bounds(FCurve *fcu,
bAnimContext *ac, bAnimContext *ac,
const bAnimListElem *ale, const bAnimListElem *ale,
const bool include_handles, const bool include_handles,
@ -3651,14 +3651,18 @@ static void get_normalized_fcurve_bounds(FCurve *fcu,
rctf *r_bounds) rctf *r_bounds)
{ {
const bool fcu_selection_only = false; const bool fcu_selection_only = false;
BKE_fcurve_calc_bounds(fcu, const bool found_bounds = BKE_fcurve_calc_bounds(fcu,
&r_bounds->xmin, &r_bounds->xmin,
&r_bounds->xmax, &r_bounds->xmax,
&r_bounds->ymin, &r_bounds->ymin,
&r_bounds->ymax, &r_bounds->ymax,
fcu_selection_only, fcu_selection_only,
include_handles, include_handles,
range); range);
if (!found_bounds) {
return false;
}
const short mapping_flag = ANIM_get_normalization_flags(ac); const short mapping_flag = ANIM_get_normalization_flags(ac);
float offset; float offset;
@ -3674,9 +3678,10 @@ static void get_normalized_fcurve_bounds(FCurve *fcu,
r_bounds->ymin -= (min_height - height) / 2; r_bounds->ymin -= (min_height - height) / 2;
r_bounds->ymax += (min_height - height) / 2; r_bounds->ymax += (min_height - height) / 2;
} }
return true;
} }
static void get_gpencil_bounds(bGPDlayer *gpl, const float range[2], rctf *r_bounds) static bool get_gpencil_bounds(bGPDlayer *gpl, const float range[2], rctf *r_bounds)
{ {
bool found_start = false; bool found_start = false;
int start_frame = 0; int start_frame = 0;
@ -3698,6 +3703,8 @@ static void get_gpencil_bounds(bGPDlayer *gpl, const float range[2], rctf *r_bou
r_bounds->xmax = end_frame; r_bounds->xmax = end_frame;
r_bounds->ymin = 0; r_bounds->ymin = 0;
r_bounds->ymax = 1; r_bounds->ymax = 1;
return found_start;
} }
static bool get_channel_bounds(bAnimContext *ac, static bool get_channel_bounds(bAnimContext *ac,
@ -3710,14 +3717,12 @@ static bool get_channel_bounds(bAnimContext *ac,
switch (ale->datatype) { switch (ale->datatype) {
case ALE_GPFRAME: { case ALE_GPFRAME: {
bGPDlayer *gpl = (bGPDlayer *)ale->data; bGPDlayer *gpl = (bGPDlayer *)ale->data;
get_gpencil_bounds(gpl, range, r_bounds); found_bounds = get_gpencil_bounds(gpl, range, r_bounds);
found_bounds = true;
break; break;
} }
case ALE_FCURVE: { case ALE_FCURVE: {
FCurve *fcu = (FCurve *)ale->key_data; FCurve *fcu = (FCurve *)ale->key_data;
get_normalized_fcurve_bounds(fcu, ac, ale, include_handles, range, r_bounds); found_bounds = get_normalized_fcurve_bounds(fcu, ac, ale, include_handles, range, r_bounds);
found_bounds = true;
break; break;
} }
} }
@ -3806,6 +3811,7 @@ static int graphkeys_view_selected_channels_exec(bContext *C, wmOperator *op)
if (!valid_bounds) { if (!valid_bounds) {
ANIM_animdata_freelist(&anim_data); ANIM_animdata_freelist(&anim_data);
WM_report(RPT_WARNING, "No keyframes to focus on.");
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
} }
@ -3892,6 +3898,7 @@ static int graphkeys_channel_view_pick_invoke(bContext *C, wmOperator *op, const
if (!found_bounds) { if (!found_bounds) {
ANIM_animdata_freelist(&anim_data); ANIM_animdata_freelist(&anim_data);
WM_report(RPT_WARNING, "No keyframes to focus on.");
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
} }