rawaccel/common/accel-natural.hpp
a1xd 16dc4df3d4 refactor common/settings
only driver compiles

remove accel-base types

merge linear + classic

move gain cap logic into classic impl, cap is now set in terms of output

use cap/limit to determine negation

remove weight, add replacement for power mode only

remove legacy offset option
remove naturalgain mode
add legacy mode flag

naturalgain -> natural
natural -> natural + legacy flag

add dpi setting and more accel args + defaults (prep for ips mode)

replace output speed cap with input cap
2021-03-29 17:14:49 -04:00

53 lines
1.1 KiB
C++

#pragma once
#include <math.h>
#include "rawaccel-settings.h"
namespace rawaccel {
/// <summary> Struct to hold "natural" (vanishing difference) acceleration implementation. </summary>
struct natural_base {
double offset;
double accel;
double limit;
natural_base(const accel_args& args) :
offset(args.offset),
limit(args.limit - 1)
{
accel = args.accel_natural / fabs(limit);
}
};
struct natural_legacy : natural_base {
double operator()(double x) const {
if (x <= offset) return 1;
double offset_x = x - offset;
double decay = exp(-accel * offset_x);
return limit * (1 - (decay * offset_x + offset) / x) + 1;
}
using natural_base::natural_base;
};
struct natural : natural_base {
double constant;
double operator()(double x) const {
if (x <= offset) return 1;
double offset_x = x - offset;
double decay = exp(-accel * offset_x);
double output = limit * (offset_x + decay / accel) + constant;
return output / x + 1;
}
natural(const accel_args& args) :
natural_base(args),
constant(-limit / accel) {}
};
}