diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 5 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_userdef_types.h | 3 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_userdef.c | 14 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 18 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_event_system.h | 2 |
6 files changed, 42 insertions, 2 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 50bf2f79fdc..f07f9363167 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8793,6 +8793,11 @@ static void do_versions_userdef(FileData *fd, BlendFileData *bfd) if (!DNA_struct_elem_find(fd->filesdna, "UserDef", "short", "gpencil_multisamples")) { user->gpencil_multisamples = 4; } + + /* tablet pressure threshold */ + if (!DNA_struct_elem_find(fd->filesdna, "UserDef", "float", "pressure_threshold_max")) { + user->pressure_threshold_max = 1.0f; + } } static void do_versions(FileData *fd, Library *lib, Main *main) diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 6ae6eaed1c6..c9d16351635 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -618,6 +618,9 @@ typedef struct UserDef { short anisotropic_filter; short use_16bit_textures, use_gpu_mipmap; + float pressure_threshold_max; /* raw tablet pressure that maps to 100% */ + float pressure_softness; /* curve non-linearity parameter */ + float ndof_sensitivity; /* overall sensitivity of 3D mouse */ float ndof_orbit_sensitivity; float ndof_deadzone; /* deadzone of 3D mouse */ diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 15618759ffa..03f86eba601 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -4582,6 +4582,20 @@ static void rna_def_userdef_input(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Tweak Threshold", "Number of pixels you have to drag before tweak event is triggered"); + /* tablet pressure curve */ + prop = RNA_def_property(srna, "pressure_threshold_max", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.01f, 3); + RNA_def_property_ui_text(prop, "Max Threshold", + "Raw input pressure value that is interpreted as 100% by Blender"); + + prop = RNA_def_property(srna, "pressure_softness", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -1.0f, 1.0f, 0.1f, 2); + RNA_def_property_ui_text(prop, "Softness", + "Adjusts softness of the low pressure response onset using a gamma curve"); + #ifdef WITH_INPUT_NDOF /* 3D mouse settings */ /* global options */ 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; diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index b84b851476a..df20dbd8055 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -2014,7 +2014,7 @@ float WM_cursor_pressure(const struct wmWindow *win) const GHOST_TabletData *td = GHOST_GetTabletData(win->ghostwin); /* if there's tablet data from an active tablet device then add it */ if ((td != NULL) && td->Active != GHOST_kTabletModeNone) { - return td->Pressure; + return wm_pressure_curve(td->Pressure); } else { return -1.0f; diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index a0610ffcff3..fe28cbf9895 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -101,6 +101,8 @@ void wm_event_do_depsgraph(bContext *C); void wm_event_do_refresh_wm_and_depsgraph(bContext *C); void wm_event_do_notifiers(bContext *C); +float wm_pressure_curve(float raw_pressure); + /* wm_keymap.c */ /* wm_dropbox.c */ |