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