[Bf-blender-cvs] [3c5476e] gooseberry: Do the actual frame change on timer events, not mouse move - those can be buffered and choke the operator.
Antony Riakiotakis
noreply at git.blender.org
Fri Apr 24 17:47:41 CEST 2015
Commit: 3c5476e7f2c2d0f8a77423d86cd40434725e2d75
Author: Antony Riakiotakis
Date: Fri Apr 24 17:47:14 2015 +0200
Branches: gooseberry
https://developer.blender.org/rB3c5476e7f2c2d0f8a77423d86cd40434725e2d75
Do the actual frame change on timer events, not mouse move - those can
be buffered and choke the operator.
===================================================================
M source/blender/editors/animation/anim_ops.c
===================================================================
diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index 22eda47..ba5da48 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -60,6 +60,8 @@
#include "anim_intern.h"
+#include "MEM_guardedalloc.h"
+
/* ********************** frame change operator ***************************/
/* Check if the operator can be run from the current context */
@@ -192,13 +194,32 @@ static void change_frame_seq_preview_begin(bContext *C, const wmEvent *event)
}
}
}
-static void change_frame_seq_preview_end(bContext *C)
+
+typedef struct ChangeFrameData {
+ wmTimer *timer;
+ double last_duration;
+ int frame;
+ int last_frame;
+} ChangeFrameData;
+
+static void change_frame_seq_preview_end(bContext *C, wmOperator *op)
{
+ wmWindowManager *wm = CTX_wm_manager(C);
+ wmWindow *win = CTX_wm_window(C);
+
if (ED_sequencer_special_preview_get() != NULL) {
Scene *scene = CTX_data_scene(C);
ED_sequencer_special_preview_clear();
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
}
+
+ if (op->customdata) {
+ ChangeFrameData *data = op->customdata;
+ WM_event_remove_timer(wm, win, op->customdata);
+ MEM_freeN(data);
+ op->customdata = NULL;
+ }
+
}
/* Modal Operator init */
@@ -208,8 +229,16 @@ static int change_frame_invoke(bContext *C, wmOperator *op, const wmEvent *event
* as user could click on a single frame (jump to frame) as well as
* click-dragging over a range (modal scrubbing).
*/
+ wmWindowManager *wm = CTX_wm_manager(C);
+ wmWindow *win = CTX_wm_window(C);
+ Scene *scene = CTX_data_scene(C);
+ ChangeFrameData *data = MEM_callocN(sizeof(ChangeFrameData), "changeframedata");
+
+ data->timer = WM_event_add_timer(wm, win, TIMER, (1.0 / FPS));
+
RNA_int_set(op->ptr, "frame", frame_from_event(C, event));
+ op->customdata = data;
change_frame_seq_preview_begin(C, event);
change_frame_apply(C, op, false);
@@ -220,9 +249,9 @@ static int change_frame_invoke(bContext *C, wmOperator *op, const wmEvent *event
return OPERATOR_RUNNING_MODAL;
}
-static void change_frame_cancel(bContext *C, wmOperator *UNUSED(op))
+static void change_frame_cancel(bContext *C, wmOperator *op)
{
- change_frame_seq_preview_end(C);
+ change_frame_seq_preview_end(C, op);
}
/* Modal event handling of frame changing */
@@ -230,6 +259,8 @@ 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;
+
int ret = OPERATOR_RUNNING_MODAL;
/* execute the events */
switch (event->type) {
@@ -240,8 +271,18 @@ static int change_frame_modal(bContext *C, wmOperator *op, const wmEvent *event)
break;
case MOUSEMOVE:
- RNA_int_set(op->ptr, "frame", frame_from_event(C, event));
- change_frame_apply(C, op, false);
+ data->frame = frame_from_event(C, event);
+ break;
+
+ case TIMER:
+ if (data->timer->duration - data->last_duration > FRA2TIME(1)) {
+ if (data->frame != data->last_frame) {
+ RNA_int_set(op->ptr, "frame", data->frame);
+ change_frame_apply(C, op, false);
+ data->last_frame = data->frame;
+ data->last_duration = data->timer->duration;
+ }
+ }
break;
case LEFTMOUSE:
@@ -269,7 +310,7 @@ static int change_frame_modal(bContext *C, wmOperator *op, const wmEvent *event)
}
if (ret != OPERATOR_RUNNING_MODAL) {
- change_frame_seq_preview_end(C);
+ change_frame_seq_preview_end(C, op);
}
return ret;
More information about the Bf-blender-cvs
mailing list