Commit: 5eab813fc0788c4e737dbc6ea85e932fb8180618 Author: Christoph Lendenfeld Date: Fri Jan 6 13:38:43 2023 +0100 Branches: master https://developer.blender.org/rB5eab813fc0788c4e737dbc6ea85e932fb8180618
Fix T102746: Jumping to next/previous (key)frame doesn't take subframes into account Previously when on frame 2.5 and trying to jump to a keyframe that was on frame 2, it would instead jump past it. Now it properly respects the subframes for that. Reviewed by: Sybren A. Stüvel Differential Revision: https://developer.blender.org/D16651 Ref: D16651 =================================================================== M source/blender/editors/screen/screen_ops.c =================================================================== diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 9c0963d0fb1..dd0271f3155 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -2951,6 +2951,11 @@ static int frame_offset_exec(bContext *C, wmOperator *op) int delta = RNA_int_get(op->ptr, "delta"); + /* In order to jump from e.g. 1.5 to 1 the delta needs to be incremented by 1 since the subframe + * is always zeroed. Otherwise it would jump to 0.*/ + if (delta < 0 && scene->r.subframe > 0) { + delta += 1; + } scene->r.cfra += delta; FRAMENUMBER_MIN_CLAMP(scene->r.cfra); scene->r.subframe = 0.0f; @@ -3062,7 +3067,7 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - float cfra = (float)(scene->r.cfra); + const float cfra = BKE_scene_frame_get(scene); /* Initialize binary-tree-list for getting keyframes. */ struct AnimKeylist *keylist = ED_keylist_create(); @@ -3096,25 +3101,26 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op) /* find matching keyframe in the right direction */ const ActKeyColumn *ak; + if (next) { ak = ED_keylist_find_next(keylist, cfra); + while ((ak != NULL) && (done == false)) { + if (cfra < ak->cfra) { + BKE_scene_frame_set(scene, ak->cfra); + done = true; + } + else { + ak = ak->next; + } + } } + else { ak = ED_keylist_find_prev(keylist, cfra); - } - - while ((ak != NULL) && (done == false)) { - if (scene->r.cfra != (int)ak->cfra) { - /* this changes the frame, so set the frame and we're done */ - const int whole_frame = (int)ak->cfra; - scene->r.cfra = whole_frame; - scene->r.subframe = ak->cfra - whole_frame; - done = true; - } - else { - /* take another step... */ - if (next) { - ak = ak->next; + while ((ak != NULL) && (done == false)) { + if (cfra > ak->cfra) { + BKE_scene_frame_set(scene, ak->cfra); + done = true; } else { ak = ak->prev; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs