Commit: dc25505aeada5ef9f964f11834f8bd37ec6cb8a7
Author: Antony Riakiotakis
Date:   Thu Apr 30 16:48:10 2015 +0200
Branches: gooseberry
https://developer.blender.org/rBdc25505aeada5ef9f964f11834f8bd37ec6cb8a7

Make Hjalti happier commit.

Treat scrubbing as animation. This takes care of too many updates from
our armature system.

===================================================================

M       source/blender/blenkernel/intern/sound.c
M       source/blender/editors/animation/anim_ops.c
M       source/blender/editors/screen/screen_ops.c
M       source/blender/makesdna/DNA_screen_types.h

===================================================================

diff --git a/source/blender/blenkernel/intern/sound.c 
b/source/blender/blenkernel/intern/sound.c
index 6a831d2..fb5d87d 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -615,13 +615,13 @@ void BKE_sound_seek_scene(struct Main *bmain, struct 
Scene *scene)
 
        animation_playing = 0;
        for (screen = bmain->screen.first; screen; screen = screen->id.next) {
-               if (screen->animtimer) {
+               if (screen->animtimer || screen->scrubbing) {
                        animation_playing = 1;
                        break;
                }
        }
 
-       if (scene->audio.flag & AUDIO_SCRUB && !animation_playing) {
+       if ((scene->audio.flag & AUDIO_SCRUB) && !animation_playing) {
                if (scene->audio.flag & AUDIO_SYNC) {
                        AUD_seek(scene->sound_scene_handle, cur_time);
                        AUD_seekSequencer(scene->sound_scene_handle, cur_time);
diff --git a/source/blender/editors/animation/anim_ops.c 
b/source/blender/editors/animation/anim_ops.c
index efcc707..be992ba 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -121,10 +121,8 @@ static void change_frame_apply(bContext *C, wmOperator 
*op, bool final)
                wmWindowManager *wm = CTX_wm_manager(C);
                wmWindow *window;
                ScrArea *sa;
-               /* since we follow drawflags, we can't send notifier but tag 
regions ourselves */
-               /* only do audio if scrubbing */
-               if (scene->audio.flag & AUDIO_SCRUB)
-                       BKE_sound_seek_scene(bmain, scene);
+
+               BKE_sound_seek_scene(bmain, scene);
 
                ED_update_for_newframe(bmain, scene, 1);
 
@@ -218,6 +216,9 @@ static void change_frame_seq_preview_end(bContext *C, 
wmOperator *op)
                WM_event_remove_timer(wm, win, data->timer);
                MEM_freeN(data);
                op->customdata = NULL;
+               /* add here too to take care of cancelling */
+               if (win->screen)
+                       win->screen->scrubbing = false;
        }
 
 }
@@ -241,6 +242,9 @@ static int change_frame_invoke(bContext *C, wmOperator *op, 
const wmEvent *event
        op->customdata = data;
        change_frame_seq_preview_begin(C, event);
 
+       if (win->screen)
+               win->screen->scrubbing = true;
+
        change_frame_apply(C, op, false);
        
        /* add temp handler */
@@ -260,12 +264,15 @@ static int change_frame_modal(bContext *C, wmOperator 
*op, const wmEvent *event)
        Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
        ChangeFrameData *data = op->customdata;
+       wmWindow *win = CTX_wm_window(C);
 
        int ret = OPERATOR_RUNNING_MODAL;
        /* execute the events */
        switch (event->type) {
                case ESCKEY:
                        WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
+                       if (win->screen)
+                               win->screen->scrubbing = false;
                        BKE_sound_seek_scene(bmain, scene);
                        ret = OPERATOR_FINISHED;
                        break;
@@ -292,8 +299,11 @@ static int change_frame_modal(bContext *C, wmOperator *op, 
const wmEvent *event)
                         * the modal op) doesn't work for some reason
                         */
                        if (event->val == KM_RELEASE) {
-                               WM_event_add_notifier(C, NC_SCENE | ND_FRAME, 
scene);
-                               BKE_sound_seek_scene(bmain, scene);
+                               if (win->screen)
+                                       win->screen->scrubbing = false;
+                               data->frame = frame_from_event(C, event);
+                               RNA_int_set(op->ptr, "frame", data->frame);
+                               change_frame_apply(C, op, true);
                                ret = OPERATOR_FINISHED;
                        }
                        break;
diff --git a/source/blender/editors/screen/screen_ops.c 
b/source/blender/editors/screen/screen_ops.c
index 9a36e82..89098f3 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -3517,7 +3517,7 @@ bScreen *ED_screen_animation_playing(const 
wmWindowManager *wm)
        wmWindow *win;
 
        for (win = wm->windows.first; win; win = win->next) {
-               if (win->screen->animtimer) {
+               if (win->screen->animtimer || win->screen->scrubbing) {
                        return win->screen;
                }
        }
diff --git a/source/blender/makesdna/DNA_screen_types.h 
b/source/blender/makesdna/DNA_screen_types.h
index 9b35925..5a707ef 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -69,7 +69,8 @@ typedef struct bScreen {
        char do_draw_drag;                                      /* notifier for 
dragging draw. */
        char swap;                                                      /* 
indicator to survive swap-exchange systems */
        char skip_handling;                                     /* set to delay 
screen handling after switching back from maximized area */
-       char pad[7];
+       char scrubbing;                                         /* set while 
scrubbing to skip some updates done while animating */
+       char pad[6];
        
        short mainwin;                                          /* screensize 
subwindow, for screenedges and global menus */
        short subwinactive;                                     /* active 
subwindow */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to