Revision: 29660 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29660 Author: blendix Date: 2010-06-23 20:47:56 +0200 (Wed, 23 Jun 2010)
Log Message: ----------- Fix #22553: dragging number buttons would run update functions more often than necessary due to the more accurate mouse move events that are useful for sculpting and painting (at least on Linux/X11, not sure about other platforms). If the update function takes a while to run, this in turn causes more mouse move events to be accumulated, making things even slower, .. going into a spiral of slower and slower redraws. As a solution I've added a INBETWEEN_MOUSEMOVE event next to MOUSEMOVE. A MOUSEMOVE event is automatically changed to INBETWEEN_MOUSEMOVE when a MOUSEMOVE event is added after it. This new event type is only handled by painting/sculpting operators, everything else can happily ignore it. Modified Paths: -------------- trunk/blender/source/blender/editors/gpencil/gpencil_paint.c trunk/blender/source/blender/editors/sculpt_paint/paint_image.c trunk/blender/source/blender/editors/sculpt_paint/paint_stroke.c trunk/blender/source/blender/makesrna/intern/rna_wm.c trunk/blender/source/blender/windowmanager/intern/wm_event_system.c trunk/blender/source/blender/windowmanager/wm_event_types.h Modified: trunk/blender/source/blender/editors/gpencil/gpencil_paint.c =================================================================== --- trunk/blender/source/blender/editors/gpencil/gpencil_paint.c 2010-06-23 18:28:34 UTC (rev 29659) +++ trunk/blender/source/blender/editors/gpencil/gpencil_paint.c 2010-06-23 18:47:56 UTC (rev 29660) @@ -1481,6 +1481,7 @@ /* moving mouse - assumed that mouse button is down if in painting status */ case MOUSEMOVE: + case INBETWEEN_MOUSEMOVE: /* check if we're currently painting */ if (p->status == GP_STATUS_PAINTING) { /* handle drawing event */ Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_image.c =================================================================== --- trunk/blender/source/blender/editors/sculpt_paint/paint_image.c 2010-06-23 18:28:34 UTC (rev 29659) +++ trunk/blender/source/blender/editors/sculpt_paint/paint_image.c 2010-06-23 18:47:56 UTC (rev 29660) @@ -4872,6 +4872,7 @@ paint_exit(C, op); return OPERATOR_FINISHED; case MOUSEMOVE: + case INBETWEEN_MOUSEMOVE: paint_apply_event(C, op, event); break; case TIMER: Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_stroke.c =================================================================== --- trunk/blender/source/blender/editors/sculpt_paint/paint_stroke.c 2010-06-23 18:28:34 UTC (rev 29659) +++ trunk/blender/source/blender/editors/sculpt_paint/paint_stroke.c 2010-06-23 18:47:56 UTC (rev 29660) @@ -275,7 +275,7 @@ MEM_freeN(stroke); return OPERATOR_FINISHED; } - else if(first || event->type == MOUSEMOVE || (event->type == TIMER && (event->customdata == stroke->timer))) { + else if(first || ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE) || (event->type == TIMER && (event->customdata == stroke->timer))) { if(stroke->stroke_started) { if(paint_smooth_stroke(stroke, mouse, event)) { if(paint_space_stroke_enabled(stroke->brush)) { Modified: trunk/blender/source/blender/makesrna/intern/rna_wm.c =================================================================== --- trunk/blender/source/blender/makesrna/intern/rna_wm.c 2010-06-23 18:28:34 UTC (rev 29659) +++ trunk/blender/source/blender/makesrna/intern/rna_wm.c 2010-06-23 18:47:56 UTC (rev 29660) @@ -114,6 +114,7 @@ {SELECTMOUSE, "SELECTMOUSE", 0, "Select Mouse", ""}, {0, "", 0, NULL, NULL}, {MOUSEMOVE, "MOUSEMOVE", 0, "Mouse Move", ""}, + {INBETWEEN_MOUSEMOVE, "INBETWEEN_MOUSEMOVE", 0, "Inbetween Move", ""}, {MOUSEPAN, "TRACKPADPAN", 0, "Mouse/Trackpad Pan", ""}, {MOUSEZOOM, "TRACKPADZOOM", 0, "Mouse/Trackpad Zoom", ""}, {MOUSEROTATE, "MOUSEROTATE", 0, "Mouse/Trackpad Rotate", ""}, Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c =================================================================== --- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c 2010-06-23 18:28:34 UTC (rev 29659) +++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c 2010-06-23 18:47:56 UTC (rev 29660) @@ -1614,7 +1614,7 @@ while( (event= win->queue.first) ) { int action = WM_HANDLER_CONTINUE; - if((G.f & G_DEBUG) && event && event->type!=MOUSEMOVE) + if((G.f & G_DEBUG) && event && !ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) printf("pass on evt %d val %d\n", event->type, event->val); wm_eventemulation(event); @@ -2138,6 +2138,7 @@ case GHOST_kEventCursorMove: { if(win->active) { GHOST_TEventCursorData *cd= customdata; + wmEvent *lastevent= win->queue.last; #if defined(__APPLE__) && defined(GHOST_COCOA) //Cocoa already uses coordinates with y=0 at bottom, and returns inwindow coordinates on mouse moved event @@ -2156,6 +2157,12 @@ event.type= MOUSEMOVE; + /* some painting operators want accurate mouse events, they can + handle inbetween mouse move moves, others can happily ignore + them for better performance */ + if(lastevent && lastevent->type == MOUSEMOVE) + lastevent->type = INBETWEEN_MOUSEMOVE; + update_tablet_data(win, &event); wm_event_add(win, &event); Modified: trunk/blender/source/blender/windowmanager/wm_event_types.h =================================================================== --- trunk/blender/source/blender/windowmanager/wm_event_types.h 2010-06-23 18:28:34 UTC (rev 29659) +++ trunk/blender/source/blender/windowmanager/wm_event_types.h 2010-06-23 18:47:56 UTC (rev 29660) @@ -70,6 +70,7 @@ /* mapped with userdef */ #define WHEELINMOUSE 0x00c #define WHEELOUTMOUSE 0x00d +#define INBETWEEN_MOUSEMOVE 0x011 /* SYSTEM : 0x01xx */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs