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-power.hpp | 66 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 12 deletions(-) (limited to 'common/accel-power.hpp') 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 +#include namespace rawaccel { - /// Struct to hold power (non-additive) acceleration implementation. - 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 struct power; - double operator()(double speed) const + template <> + struct power : 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 : 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; + } + } + }; } -- cgit v1.2.3