Skip to content

Commit 2896b8a

Browse files
authored
Merge pull request #108 from a1xd/1.6r2
v1.6
2 parents c67f04a + e9705ec commit 2896b8a

File tree

88 files changed

+5044
-2517
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+5044
-2517
lines changed

common/accel-classic.hpp

Lines changed: 97 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,84 +3,142 @@
33
#include "rawaccel-base.hpp"
44
#include "utility.hpp"
55

6-
#include <math.h>
76
#include <float.h>
87

98
namespace rawaccel {
109

1110
/// <summary> Struct to hold "classic" (linear raised to power) acceleration implementation. </summary>
1211
struct classic_base {
13-
double offset;
14-
double power;
15-
double accel_raised;
16-
17-
classic_base(const accel_args& args) :
18-
offset(args.offset),
19-
power(args.power),
20-
accel_raised(pow(args.accel_classic, power - 1)) {}
12+
double base_fn(double x, double accel_raised, const accel_args& args) const
13+
{
14+
return accel_raised * pow(x - args.input_offset, args.exponent_classic) / x;
15+
}
2116

22-
double base_fn(double x) const
17+
static double base_accel(double x, double y, const accel_args& args)
2318
{
24-
return accel_raised * pow(x - offset, power) / x;
19+
auto power = args.exponent_classic;
20+
return pow(x * y * pow(x - args.input_offset, -power), 1 / (power - 1));
2521
}
2622
};
2723

28-
struct classic_legacy : classic_base {
29-
double sens_cap = DBL_MAX;
24+
template <bool Gain> struct classic;
25+
26+
template<>
27+
struct classic<LEGACY> : classic_base {
28+
double accel_raised;
29+
double cap = DBL_MAX;
3030
double sign = 1;
3131

32-
classic_legacy(const accel_args& args) :
33-
classic_base(args)
32+
classic(const accel_args& args)
3433
{
35-
if (args.cap > 0) {
36-
sens_cap = args.cap - 1;
34+
switch (args.cap_mode) {
35+
case cap_mode::io:
36+
cap = args.cap.y - 1;
3737

38-
if (sens_cap < 0) {
39-
sens_cap = -sens_cap;
38+
if (cap < 0) {
39+
cap = -cap;
4040
sign = -sign;
4141
}
42+
43+
{
44+
double a = base_accel(args.cap.x, cap, args);
45+
accel_raised = pow(a, args.exponent_classic - 1);
46+
}
47+
break;
48+
case cap_mode::in:
49+
accel_raised = pow(args.acceleration, args.exponent_classic - 1);
50+
if (args.cap.x > 0) {
51+
cap = base_fn(args.cap.x, accel_raised, args);
52+
}
53+
break;
54+
case cap_mode::out:
55+
default:
56+
accel_raised = pow(args.acceleration, args.exponent_classic - 1);
57+
58+
if (args.cap.y > 0) {
59+
cap = args.cap.y - 1;
60+
61+
if (cap < 0) {
62+
cap = -cap;
63+
sign = -sign;
64+
}
65+
}
66+
67+
break;
4268
}
4369
}
4470

45-
double operator()(double x) const
71+
double operator()(double x, const accel_args& args) const
4672
{
47-
if (x <= offset) return 1;
48-
return sign * minsd(base_fn(x), sens_cap) + 1;
49-
}
73+
if (x <= args.input_offset) return 1;
74+
return sign * minsd(base_fn(x, accel_raised, args), cap) + 1;
75+
}
76+
5077
};
5178

52-
struct classic : classic_base {
53-
vec2d gain_cap = { DBL_MAX, DBL_MAX };
79+
template<>
80+
struct classic<GAIN> : classic_base {
81+
double accel_raised;
82+
vec2d cap = { DBL_MAX, DBL_MAX };
5483
double constant = 0;
5584
double sign = 1;
5685

57-
classic(const accel_args& args) :
58-
classic_base(args)
86+
classic(const accel_args& args)
5987
{
60-
if (args.cap > 0) {
61-
gain_cap.y = args.cap - 1;
88+
switch (args.cap_mode) {
89+
case cap_mode::io:
90+
cap.x = args.cap.x;
91+
cap.y = args.cap.y - 1;
6292

63-
if (gain_cap.y < 0) {
64-
gain_cap.y = -gain_cap.y;
93+
if (cap.y < 0) {
94+
cap.y = -cap.y;
6595
sign = -sign;
6696
}
6797

68-
gain_cap.x = gain_inverse(gain_cap.y, args.accel_classic, power, offset);
69-
constant = (base_fn(gain_cap.x) - gain_cap.y) * gain_cap.x;
98+
{
99+
double a = gain_accel(cap.x, cap.y, args.exponent_classic, args.input_offset);
100+
accel_raised = pow(a, args.exponent_classic - 1);
101+
}
102+
constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x;
103+
break;
104+
case cap_mode::in:
105+
accel_raised = pow(args.acceleration, args.exponent_classic - 1);
106+
if (args.cap.x > 0) {
107+
cap.x = args.cap.x;
108+
cap.y = gain(cap.x, args.acceleration, args.exponent_classic, args.input_offset);
109+
constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x;
110+
}
111+
break;
112+
case cap_mode::out:
113+
default:
114+
accel_raised = pow(args.acceleration, args.exponent_classic - 1);
115+
116+
if (args.cap.y > 0) {
117+
cap.y = args.cap.y - 1;
118+
119+
if (cap.y < 0) {
120+
cap.y = -cap.y;
121+
sign = -sign;
122+
}
123+
124+
cap.x = gain_inverse(cap.y, args.acceleration, args.exponent_classic, args.input_offset);
125+
constant = (base_fn(cap.x, accel_raised, args) - cap.y) * cap.x;
126+
}
127+
break;
70128
}
71129
}
72130

73-
double operator()(double x) const
131+
double operator()(double x, const accel_args& args) const
74132
{
75133
double output;
76134

77-
if (x <= offset) return 1;
135+
if (x <= args.input_offset) return 1;
78136

79-
if (x < gain_cap.x) {
80-
output = base_fn(x);
137+
if (x < cap.x) {
138+
output = base_fn(x, accel_raised, args);
81139
}
82140
else {
83-
output = constant / x + gain_cap.y;
141+
output = constant / x + cap.y;
84142
}
85143

86144
return sign * output + 1;
@@ -100,6 +158,7 @@ namespace rawaccel {
100158
{
101159
return -pow(y / power, 1 / (power - 1)) / (offset - x);
102160
}
161+
103162
};
104163

105164
}

common/accel-invoke.hpp

Lines changed: 0 additions & 52 deletions
This file was deleted.

common/accel-jump.hpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
namespace rawaccel {
66

77
struct jump_base {
8-
static constexpr double smooth_scale = 2 * PI;
8+
static constexpr double smooth_scale = 2 * M_PI;
99

1010
vec2d step;
1111
double smooth_rate;
1212

1313
// requirements: args.smooth in range [0, 1]
1414
jump_base(const accel_args& args) :
15-
step({ args.offset, args.cap - 1 })
15+
step({ args.cap.x, args.cap.y - 1 })
1616
{
1717
double rate_inverse = args.smooth * step.x;
1818

@@ -43,27 +43,32 @@ namespace rawaccel {
4343
{
4444
return step.y * (x + log(1 + decay(x)) / smooth_rate);
4545
}
46+
4647
};
4748

48-
struct jump_legacy : jump_base {
49+
template <bool Gain> struct jump;
50+
51+
template<>
52+
struct jump<LEGACY> : jump_base {
4953
using jump_base::jump_base;
5054

51-
double operator()(double x) const
55+
double operator()(double x, const accel_args&) const
5256
{
5357
if (is_smooth()) return smooth(x) + 1;
5458
else if (x < step.x) return 1;
5559
else return 1 + step.y;
5660
}
5761
};
5862

59-
struct jump : jump_base {
63+
template<>
64+
struct jump<GAIN> : jump_base {
6065
double C;
6166

6267
jump(const accel_args& args) :
6368
jump_base(args),
6469
C(-smooth_antideriv(0)) {}
6570

66-
double operator()(double x) const
71+
double operator()(double x, const accel_args&) const
6772
{
6873
if (x <= 0) return 1;
6974

@@ -72,6 +77,7 @@ namespace rawaccel {
7277
if (x < step.x) return 1;
7378
else return 1 + step.y * (x - step.x) / x;
7479
}
80+
7581
};
7682

7783
}

0 commit comments

Comments
 (0)