diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-01-17 07:41:23 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-01-17 07:41:23 +0400 |
commit | 0f981edc990195c699eeb2c9f9544ed4eaba8b5e (patch) | |
tree | cd444d0c49f75cf434bc3a5711fd3e72974a5ca3 /source | |
parent | 60e558393321edf4c8a41376c600981ae8636d24 (diff) |
fix airbrush + tablet pressure bug.
Timer events used by the airbrush would always give a pressure of 1.0, ignoring the tablets real pressure in all paint modes.
Move tablet data into its own struct-member so it can be used with timer events.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/gpencil/gpencil_paint.c | 4 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_image.c | 5 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_stroke.c | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_types.h | 5 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 20 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_event_types.h | 9 |
6 files changed, 26 insertions, 21 deletions
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index c40312758fc..41ef4bd0b95 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -1564,8 +1564,8 @@ static void gpencil_draw_apply_event(wmOperator *op, wmEvent *event) p->curtime = PIL_check_seconds_timer(); /* handle pressure sensitivity (which is supplied by tablets) */ - if (event->custom == EVT_DATA_TABLET) { - wmTabletData *wmtab = event->customdata; + if (event->tablet_data) { + wmTabletData *wmtab = event->tablet_data; tablet = (wmtab->Active != EVT_TABLET_NONE); p->pressure = wmtab->Pressure; diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index 9ece2a9185c..cad19a7b5b8 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -5295,7 +5295,6 @@ static void paint_apply_event(bContext *C, wmOperator *op, wmEvent *event) { const Scene *scene = CTX_data_scene(C); PaintOperation *pop = op->customdata; - wmTabletData *wmtab; PointerRNA itemptr; float pressure, mousef[2]; double time; @@ -5306,8 +5305,8 @@ static void paint_apply_event(bContext *C, wmOperator *op, wmEvent *event) tablet = 0; pop->s.blend = pop->s.brush->blend; - if (event->custom == EVT_DATA_TABLET) { - wmtab = event->customdata; + if (event->tablet_data) { + wmTabletData *wmtab = event->tablet_data; tablet = (wmtab->Active != EVT_TABLET_NONE); pressure = wmtab->Pressure; diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c index 3b52dc3410f..5d9313485d2 100644 --- a/source/blender/editors/sculpt_paint/paint_stroke.c +++ b/source/blender/editors/sculpt_paint/paint_stroke.c @@ -125,8 +125,8 @@ static float event_tablet_data(wmEvent *event, int *pen_flip) int erasor = 0; float pressure = 1; - if (event->custom == EVT_DATA_TABLET) { - wmTabletData *wmtab = event->customdata; + if (event->tablet_data) { + wmTabletData *wmtab = event->tablet_data; erasor = (wmtab->Active == EVT_TABLET_ERASER); pressure = (wmtab->Active != EVT_TABLET_NONE) ? wmtab->Pressure : 1; diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 96a7b156cd8..86fd4856f7e 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -445,7 +445,10 @@ typedef struct wmEvent { /* keymap item, set by handler (weak?) */ const char *keymap_idname; - + + /* tablet info, only use when the tablet is active */ + struct wmTabletData *tablet_data; + /* custom data */ short custom; /* custom data type, stylus, 6dof, see wm_event_types.h */ short customdatafree; diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 531e8bed998..84fee9ff34c 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -84,6 +84,8 @@ # include "RNA_enum_types.h" #endif +static void update_tablet_data(wmWindow *win, wmEvent *event); + static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA *properties, ReportList *reports, short context, short poll_only); @@ -94,6 +96,9 @@ void wm_event_add(wmWindow *win, wmEvent *event_to_add) wmEvent *event = MEM_callocN(sizeof(wmEvent), "wmEvent"); *event = *event_to_add; + + update_tablet_data(win, event); + BLI_addtail(&win->queue, event); } @@ -108,6 +113,11 @@ void wm_event_free(wmEvent *event) MEM_freeN(event->customdata); } } + + if (event->tablet_data) { + MEM_freeN(event->tablet_data); + } + MEM_freeN(event); } @@ -2652,12 +2662,11 @@ static void update_tablet_data(wmWindow *win, wmEvent *event) wmtab->Xtilt = td->Xtilt; wmtab->Ytilt = td->Ytilt; - event->custom = EVT_DATA_TABLET; - event->customdata = wmtab; - event->customdatafree = 1; + event->tablet_data = wmtab; // printf("%s: using tablet %.5f\n", __func__, wmtab->Pressure); } else { + event->tablet_data = NULL; // printf("%s: not using tablet\n", __func__); } } @@ -2800,7 +2809,6 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U if (lastevent && lastevent->type == MOUSEMOVE) lastevent->type = INBETWEEN_MOUSEMOVE; - update_tablet_data(win, &event); wm_event_add(win, &event); /* also add to other window if event is there, this makes overdraws disappear nicely */ @@ -2813,7 +2821,6 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U oevent.y = owin->eventstate->y = event.y; oevent.type = MOUSEMOVE; - update_tablet_data(owin, &oevent); wm_event_add(owin, &oevent); } @@ -2845,7 +2852,6 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U event.prevx = event.x - pd->deltaX; event.prevy = event.y - (-pd->deltaY); - update_tablet_data(win, &event); wm_event_add(win, &event); break; } @@ -2911,11 +2917,9 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int U oevent.type = event.type; oevent.val = event.val; - update_tablet_data(owin, &oevent); wm_event_add(owin, &oevent); } else { - update_tablet_data(win, &event); wm_event_add(win, &event); } diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h index 78a67a31e0f..bc7e7efdcfd 100644 --- a/source/blender/windowmanager/wm_event_types.h +++ b/source/blender/windowmanager/wm_event_types.h @@ -39,11 +39,10 @@ #define __WM_EVENT_TYPES_H__ /* customdata type */ -#define EVT_DATA_TABLET 1 -#define EVT_DATA_GESTURE 2 -#define EVT_DATA_TIMER 3 -#define EVT_DATA_LISTBASE 4 -#define EVT_DATA_NDOF_MOTION 5 +#define EVT_DATA_GESTURE 1 +#define EVT_DATA_TIMER 2 +#define EVT_DATA_LISTBASE 3 +#define EVT_DATA_NDOF_MOTION 4 /* tablet active, matches GHOST_TTabletMode */ #define EVT_TABLET_NONE 0 |