summaryrefslogtreecommitdiff
path: root/common/accel-power.hpp
diff options
context:
space:
mode:
authora1xd <[email protected]>2021-08-28 01:19:18 -0400
committera1xd <[email protected]>2021-09-23 22:28:44 -0400
commit5b659e1cfbc4b8fbbd2f2bf41dc716929976c77d (patch)
tree4bffba32fa508494a268b6f53513fb3c7b1e3e5c /common/accel-power.hpp
parentMerge pull request #107 from a1xd/1.5.0-fix (diff)
downloadrawaccel-5b659e1cfbc4b8fbbd2f2bf41dc716929976c77d.tar.xz
rawaccel-5b659e1cfbc4b8fbbd2f2bf41dc716929976c77d.zip
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
Diffstat (limited to 'common/accel-power.hpp')
-rw-r--r--common/accel-power.hpp66
1 files changed, 54 insertions, 12 deletions
diff --git a/common/accel-power.hpp b/common/accel-power.hpp
index c8faabb..f727369 100644
--- a/common/accel-power.hpp
+++ b/common/accel-power.hpp
@@ -3,25 +3,67 @@
#include "rawaccel-base.hpp"
#include <math.h>
+#include <float.h>
namespace rawaccel {
- /// <summary> Struct to hold power (non-additive) acceleration implementation. </summary>
- struct power {
- double pre_scale;
- double exponent;
- double post_scale;
+ struct power_base {
+ static double base_fn(double x, const accel_args& args)
+ {
+ // f(x) = w(mx)^k
+ return args.weight * pow(args.scale * x, args.exponent_power);
+ }
+ };
- power(const accel_args& args) :
- pre_scale(args.scale),
- exponent(args.exponent),
- post_scale(args.weight) {}
+ template <bool Gain> struct power;
- double operator()(double speed) const
+ template <>
+ struct power<LEGACY> : power_base {
+ vec2d cap = { DBL_MAX, DBL_MAX };
+
+ power(const accel_args& args)
{
- // f(x) = (mx)^k
- return post_scale * pow(speed * pre_scale, exponent);
+ if (args.cap.x > 0) {
+ cap.x = args.cap.x;
+ cap.y = base_fn(cap.x, args);
+ }
}
+
+ double operator()(double speed, const accel_args& args) const
+ {
+ if (speed < cap.x) {
+ return base_fn(speed, args);
+ }
+ return cap.y;
+ }
+
+ };
+
+ template <>
+ struct power<GAIN> : power_base {
+ vec2d cap = { DBL_MAX, DBL_MAX };
+ double constant = 0;
+
+ power(const accel_args& args)
+ {
+ if (args.cap.x > 0) {
+ cap.x = args.cap.x;
+ double output = base_fn(cap.x, args);
+ cap.y = output * (args.exponent_power + 1);
+ constant = -args.exponent_power * output * args.cap.x;
+ }
+ }
+
+ double operator()(double speed, const accel_args& args) const
+ {
+ if (speed < cap.x) {
+ return base_fn(speed, args);
+ }
+ else {
+ return cap.y + constant / speed;
+ }
+ }
+
};
}