diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2018-11-20 15:35:59 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2018-11-21 16:34:07 +0300 |
commit | 539b465b32102d90a6d356d8f94300e70338856e (patch) | |
tree | afffb5a179ea2530033ff1eaeaa93a049d5e90d1 /source/blender/windowmanager/intern/wm_event_system.c | |
parent | b93c81e0023624f62695b082e7e35a2b8c7b3b5a (diff) |
Implement basic global tablet pressure curve options.
Grease Pencil already implements support for full-featured
per-brush pressure curves, but it is useful to have some
basic global settings that affect all brushes and tools.
This adds two simple options:
- Raw pressure required to achieve full brush intensity.
- Softness control, using a gamma curve internally.
The most important one is the max pressure setting, because it is
critical for ergonomics, but the Linux Wacom driver lacks it.
The softness option internally converts to gamma = 4^-softness.
Reviewers: brecht, campbellbarton
Differential Revision: https://developer.blender.org/D3967
Diffstat (limited to 'source/blender/windowmanager/intern/wm_event_system.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index f82df000288..03a80ff240b 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -3662,6 +3662,22 @@ static void wm_eventemulation(wmEvent *event) } } +/* applies the global tablet pressure correction curve */ +float wm_pressure_curve(float pressure) +{ + if (U.pressure_threshold_max != 0.0f) { + pressure /= U.pressure_threshold_max; + } + + CLAMP(pressure, 0.0f, 1.0f); + + if (U.pressure_softness != 0.0f) { + pressure = powf(pressure, powf(4.0f, -U.pressure_softness)); + } + + return pressure; +} + /* adds customdata to event */ static void update_tablet_data(wmWindow *win, wmEvent *event) { @@ -3672,7 +3688,7 @@ static void update_tablet_data(wmWindow *win, wmEvent *event) struct wmTabletData *wmtab = MEM_mallocN(sizeof(wmTabletData), "customdata tablet"); wmtab->Active = (int)td->Active; - wmtab->Pressure = td->Pressure; + wmtab->Pressure = wm_pressure_curve(td->Pressure); wmtab->Xtilt = td->Xtilt; wmtab->Ytilt = td->Ytilt; |