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.
This commit is contained in:
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user