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

Reply via email to