summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/accel-power.hpp77
-rw-r--r--common/rawaccel-base.hpp1
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;