diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/accel-power.hpp | 77 | ||||
| -rw-r--r-- | common/rawaccel-base.hpp | 1 |
2 files changed, 64 insertions, 14 deletions
diff --git a/common/accel-power.hpp b/common/accel-power.hpp index 3baeda0..014acae 100644 --- a/common/accel-power.hpp +++ b/common/accel-power.hpp @@ -23,7 +23,7 @@ namespace rawaccel { power(const accel_args& args) { - // Note that cap types may overwrite this below. + // Note that cap types may overwrite scale below. scale = args.scale; switch (args.cap_mode){ @@ -65,7 +65,12 @@ namespace rawaccel { double operator()(double speed, const accel_args& args) const { - return minsd(base_fn(speed, scale, args), cap); + if (args.powerStartFromOne) { + return minsd(maxsd(base_fn(speed, scale, args), 1), cap); + } + else { + return minsd(base_fn(speed, scale, args), cap); + } } double static scale_from_sens_point(double sens, double input, double power) @@ -79,6 +84,7 @@ namespace rawaccel { vec2d cap = { DBL_MAX, DBL_MAX }; double constant = 0; double scale = 0; + vec2d startFromOne{ 0, 0 }; power(const accel_args& args) { @@ -102,12 +108,8 @@ namespace rawaccel { args.cap.x, args.exponent_power, scale); - - constant = integration_constant( - cap.x, - cap.y, - base_fn(cap.x, scale, args)); } + break; case classic_cap_mode::io: if (args.cap.x > 0 && args.cap.y > 1) { @@ -117,12 +119,8 @@ namespace rawaccel { args.cap.x, args.cap.y, args.exponent_power); - - constant = integration_constant( - cap.x, - cap.y, - base_fn(cap.x, scale, args)); } + break; case classic_cap_mode::out: default: if (args.cap.y > 1) { @@ -131,26 +129,77 @@ namespace rawaccel { args.cap.y, args.exponent_power, scale); + } + break; + } + + if (args.powerStartFromOne) + { + startFromOne.x = gain_inverse( + 1, + args.exponent_power, + scale); + startFromOne.y = -1 * integration_constant(startFromOne.x, + 1, + base_fn(startFromOne.x, scale, args)); + } + if (cap.x < DBL_MAX && cap.y < DBL_MAX) + { + if (args.powerStartFromOne) { + constant = integration_constant( + cap.x, + cap.y, + startFromOneOutput( + startFromOne, + cap.x, + scale, + args)); + } + else { constant = integration_constant( cap.x, cap.y, base_fn(cap.x, scale, args)); } - break; } + } double operator()(double speed, const accel_args& args) const { if (speed < cap.x) { - return base_fn(speed, scale, args); + if (args.powerStartFromOne) { + return startFromOneOutput( + startFromOne, + speed, + scale, + args); + } + else { + return base_fn(speed, scale, args); + } } else { return cap.y + constant / speed; } } + double static startFromOneOutput( + const vec2d& startFromOne, + double speed, + double scale, + const accel_args& args) + { + if (speed > startFromOne.x) { + return base_fn(speed, scale, args) + startFromOne.y / speed; + } + else + { + return 1; + } + } + double static gain_inverse(double gain, double power, double scale) { return pow(gain / (power + 1), 1 / power) / scale; diff --git a/common/rawaccel-base.hpp b/common/rawaccel-base.hpp index d8a089c..08d42c6 100644 --- a/common/rawaccel-base.hpp +++ b/common/rawaccel-base.hpp @@ -53,6 +53,7 @@ namespace rawaccel { double limit = 1.5; double midpoint = 5; double smooth = 0.5; + bool powerStartFromOne = true; vec2d cap = { 15, 1.5 }; classic_cap_mode cap_mode = classic_cap_mode::out; |