[Bf-blender-cvs] [5eab813fc07] master: Fix T102746: Jumping to next/previous (key)frame doesn't take subframes into account
Christoph Lendenfeld
noreply at git.blender.org
Fri Jan 6 13:38:53 CET 2023
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;
More information about the Bf-blender-cvs
mailing list