From 5b659e1cfbc4b8fbbd2f2bf41dc716929976c77d Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Sat, 28 Aug 2021 01:19:18 -0400 Subject: add per-device configuration adds input and [in, out] cap for classic mode adds input cap for power mode change wrapper/input, now gets useful device names change (now dev specific) dpi to adjust sensitivity change y sensitivity to y/x ratio remove spaced LUTs grapher and convert do not build --- common/accel-classic.hpp | 133 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 96 insertions(+), 37 deletions(-) (limited to 'common/accel-classic.hpp') diff --git a/common/accel-classic.hpp b/common/accel-classic.hpp index 4385897..ce343e7 100644 --- a/common/accel-classic.hpp +++ b/common/accel-classic.hpp @@ -10,77 +10,135 @@ namespace rawaccel { /// Struct to hold "classic" (linear raised to power) acceleration implementation. struct classic_base { - double offset; - double power; - double accel_raised; - - classic_base(const accel_args& args) : - offset(args.offset), - power(args.power), - accel_raised(pow(args.accel_classic, power - 1)) {} + double base_fn(double x, double accel_raised, const accel_args& args) const + { + return accel_raised * pow(x - args.offset, args.exponent_classic) / x; + } - double base_fn(double x) const + static double base_accel(double x, double y, double power, double offset) { - return accel_raised * pow(x - offset, power) / x; + return pow(x * y * pow(x - offset, -power), 1 / (power + 1)); } }; - struct classic_legacy : classic_base { - double sens_cap = DBL_MAX; + template struct classic; + + template<> + struct classic : classic_base { + double accel_raised; + double cap = DBL_MAX; double sign = 1; - classic_legacy(const accel_args& args) : - classic_base(args) + classic(const accel_args& args) { - if (args.cap > 0) { - sens_cap = args.cap - 1; + switch (args.cap_mode) { + case classic_cap_mode::io: + cap = args.cap.y - 1; - if (sens_cap < 0) { - sens_cap = -sens_cap; + if (cap < 0) { + cap = -cap; sign = -sign; } + + { + double a = base_accel(args.cap.x, cap, args.exponent_classic, args.offset); + accel_raised = pow(a, args.exponent_classic - 1); + } + break; + case classic_cap_mode::in: + accel_raised = pow(args.acceleration, args.exponent_classic - 1); + if (args.cap.x > 0) { + cap = base_fn(args.cap.x, accel_raised, args); + } + break; + case classic_cap_mode::out: + default: + accel_raised = pow(args.acceleration, args.exponent_classic - 1); + + if (args.cap.y > 0) { + cap = args.cap.y - 1; + + if (cap < 0) { + cap = -cap; + sign = -sign; + } + } + + break; } } - double operator()(double x) const + double operator()(double x, const accel_args& args) const { - if (x <= offset) return 1; - return sign * minsd(base_fn(x), sens_cap) + 1; - } + if (x <= args.offset) return 1; + return sign * minsd(base_fn(x, accel_raised, args), cap) + 1; + } + }; - struct classic : classic_base { - vec2d gain_cap = { DBL_MAX, DBL_MAX }; + template<> + struct classic : classic_base { + double accel_raised; + vec2d cap = { DBL_MAX, DBL_MAX }; double constant = 0; double sign = 1; - classic(const accel_args& args) : - classic_base(args) + classic(const accel_args& args) { - if (args.cap > 0) { - gain_cap.y = args.cap - 1; + switch (args.cap_mode) { + case classic_cap_mode::io: + cap.x = args.cap.x; + cap.y = args.cap.y - 1; - if (gain_cap.y < 0) { - gain_cap.y = -gain_cap.y; + if (cap.y < 0) { + cap.y = -cap.y; sign = -sign; } - gain_cap.x = gain_inverse(gain_cap.y, args.accel_classic, power, offset); - constant = (base_fn(gain_cap.x) - gain_cap.y) * gain_cap.x; + { + double a = gain_accel(cap.x, cap.y, args.exponent_classic, args.offset); + accel_raised = pow(a, args.exponent_classic - 1); + } + constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x; + break; + case classic_cap_mode::in: + if (args.cap.x > 0) { + cap.x = args.cap.x; + cap.y = gain(cap.x, args.acceleration, args.exponent_classic, args.offset); + constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x; + } + accel_raised = pow(args.acceleration, args.exponent_classic - 1); + break; + case classic_cap_mode::out: + default: + accel_raised = pow(args.acceleration, args.exponent_classic - 1); + + if (args.cap.y > 0) { + cap.y = args.cap.y - 1; + + if (cap.y < 0) { + cap.y = -cap.y; + sign = -sign; + } + + cap.x = gain_inverse(cap.y, args.acceleration, args.exponent_classic, args.offset); + constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x; + } + break; } } - double operator()(double x) const + double operator()(double x, const accel_args& args) const { double output; - if (x <= offset) return 1; + if (x <= args.offset) return 1; - if (x < gain_cap.x) { - output = base_fn(x); + if (x < cap.x) { + output = base_fn(x, accel_raised, args); } else { - output = constant / x + gain_cap.y; + output = constant / x + cap.y; } return sign * output + 1; @@ -100,6 +158,7 @@ namespace rawaccel { { return -pow(y / power, 1 / (power - 1)) / (offset - x); } + }; } -- cgit v1.2.3 From 6a9272d3af202274dfbced245f0ba20b263fcd8b Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Fri, 3 Sep 2021 18:09:00 -0400 Subject: refactor vec2/math --- common/accel-classic.hpp | 1 - 1 file changed, 1 deletion(-) (limited to 'common/accel-classic.hpp') diff --git a/common/accel-classic.hpp b/common/accel-classic.hpp index ce343e7..9f6a037 100644 --- a/common/accel-classic.hpp +++ b/common/accel-classic.hpp @@ -3,7 +3,6 @@ #include "rawaccel-base.hpp" #include "utility.hpp" -#include #include namespace rawaccel { -- cgit v1.2.3 From 28c76d5713964875a7efc12336582be6a04dd4b6 Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Wed, 15 Sep 2021 13:34:57 -0400 Subject: fix legacy classic with io cap mode --- common/accel-classic.hpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'common/accel-classic.hpp') diff --git a/common/accel-classic.hpp b/common/accel-classic.hpp index 9f6a037..0da4783 100644 --- a/common/accel-classic.hpp +++ b/common/accel-classic.hpp @@ -14,9 +14,10 @@ namespace rawaccel { return accel_raised * pow(x - args.offset, args.exponent_classic) / x; } - static double base_accel(double x, double y, double power, double offset) + static double base_accel(double x, double y, const accel_args& args) { - return pow(x * y * pow(x - offset, -power), 1 / (power + 1)); + auto power = args.exponent_classic; + return pow(x * y * pow(x - args.offset, -power), 1 / (power - 1)); } }; @@ -40,7 +41,7 @@ namespace rawaccel { } { - double a = base_accel(args.cap.x, cap, args.exponent_classic, args.offset); + double a = base_accel(args.cap.x, cap, args); accel_raised = pow(a, args.exponent_classic - 1); } break; -- cgit v1.2.3 From 19fed3fc7bec214e919ca89b889c0bd2b5caaaf9 Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Wed, 15 Sep 2021 13:45:00 -0400 Subject: fix gain classic with input cap mode --- common/accel-classic.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'common/accel-classic.hpp') diff --git a/common/accel-classic.hpp b/common/accel-classic.hpp index 0da4783..c230bb4 100644 --- a/common/accel-classic.hpp +++ b/common/accel-classic.hpp @@ -102,12 +102,12 @@ namespace rawaccel { constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x; break; case classic_cap_mode::in: + accel_raised = pow(args.acceleration, args.exponent_classic - 1); if (args.cap.x > 0) { cap.x = args.cap.x; cap.y = gain(cap.x, args.acceleration, args.exponent_classic, args.offset); constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x; } - accel_raised = pow(args.acceleration, args.exponent_classic - 1); break; case classic_cap_mode::out: default: -- cgit v1.2.3 From 115030165d539fde5440f6232879c7a076dea2ec Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Sat, 18 Sep 2021 05:20:53 -0400 Subject: generalize power start-from-1 starting output is determined by (gain) offset --- common/accel-classic.hpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'common/accel-classic.hpp') diff --git a/common/accel-classic.hpp b/common/accel-classic.hpp index c230bb4..ca0651c 100644 --- a/common/accel-classic.hpp +++ b/common/accel-classic.hpp @@ -11,13 +11,13 @@ namespace rawaccel { struct classic_base { double base_fn(double x, double accel_raised, const accel_args& args) const { - return accel_raised * pow(x - args.offset, args.exponent_classic) / x; + return accel_raised * pow(x - args.input_offset, args.exponent_classic) / x; } static double base_accel(double x, double y, const accel_args& args) { auto power = args.exponent_classic; - return pow(x * y * pow(x - args.offset, -power), 1 / (power - 1)); + return pow(x * y * pow(x - args.input_offset, -power), 1 / (power - 1)); } }; @@ -70,7 +70,7 @@ namespace rawaccel { double operator()(double x, const accel_args& args) const { - if (x <= args.offset) return 1; + if (x <= args.input_offset) return 1; return sign * minsd(base_fn(x, accel_raised, args), cap) + 1; } @@ -96,7 +96,7 @@ namespace rawaccel { } { - double a = gain_accel(cap.x, cap.y, args.exponent_classic, args.offset); + double a = gain_accel(cap.x, cap.y, args.exponent_classic, args.input_offset); accel_raised = pow(a, args.exponent_classic - 1); } constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x; @@ -105,7 +105,7 @@ namespace rawaccel { accel_raised = pow(args.acceleration, args.exponent_classic - 1); if (args.cap.x > 0) { cap.x = args.cap.x; - cap.y = gain(cap.x, args.acceleration, args.exponent_classic, args.offset); + cap.y = gain(cap.x, args.acceleration, args.exponent_classic, args.input_offset); constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x; } break; @@ -121,7 +121,7 @@ namespace rawaccel { sign = -sign; } - cap.x = gain_inverse(cap.y, args.acceleration, args.exponent_classic, args.offset); + cap.x = gain_inverse(cap.y, args.acceleration, args.exponent_classic, args.input_offset); constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x; } break; @@ -132,7 +132,7 @@ namespace rawaccel { { double output; - if (x <= args.offset) return 1; + if (x <= args.input_offset) return 1; if (x < cap.x) { output = base_fn(x, accel_raised, args); -- cgit v1.2.3 From d270a967b606116596114744417a182b3f16218b Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Sat, 18 Sep 2021 05:39:08 -0400 Subject: rename classic_cap_mode --- common/accel-classic.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'common/accel-classic.hpp') diff --git a/common/accel-classic.hpp b/common/accel-classic.hpp index ca0651c..2ca1233 100644 --- a/common/accel-classic.hpp +++ b/common/accel-classic.hpp @@ -32,7 +32,7 @@ namespace rawaccel { classic(const accel_args& args) { switch (args.cap_mode) { - case classic_cap_mode::io: + case cap_mode::io: cap = args.cap.y - 1; if (cap < 0) { @@ -45,13 +45,13 @@ namespace rawaccel { accel_raised = pow(a, args.exponent_classic - 1); } break; - case classic_cap_mode::in: + case cap_mode::in: accel_raised = pow(args.acceleration, args.exponent_classic - 1); if (args.cap.x > 0) { cap = base_fn(args.cap.x, accel_raised, args); } break; - case classic_cap_mode::out: + case cap_mode::out: default: accel_raised = pow(args.acceleration, args.exponent_classic - 1); @@ -86,7 +86,7 @@ namespace rawaccel { classic(const accel_args& args) { switch (args.cap_mode) { - case classic_cap_mode::io: + case cap_mode::io: cap.x = args.cap.x; cap.y = args.cap.y - 1; @@ -101,7 +101,7 @@ namespace rawaccel { } constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x; break; - case classic_cap_mode::in: + case cap_mode::in: accel_raised = pow(args.acceleration, args.exponent_classic - 1); if (args.cap.x > 0) { cap.x = args.cap.x; @@ -109,7 +109,7 @@ namespace rawaccel { constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x; } break; - case classic_cap_mode::out: + case cap_mode::out: default: accel_raised = pow(args.acceleration, args.exponent_classic - 1); -- cgit v1.2.3