From 5a0db3165d1ad050fd5e3f48d290f5ec7289a4f2 Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Mon, 29 Mar 2021 19:41:42 -0400 Subject: add jump type --- common/accel-jump.hpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 common/accel-jump.hpp (limited to 'common/accel-jump.hpp') diff --git a/common/accel-jump.hpp b/common/accel-jump.hpp new file mode 100644 index 0000000..2d13cae --- /dev/null +++ b/common/accel-jump.hpp @@ -0,0 +1,73 @@ +#pragma once + +#include "rawaccel-base.hpp" + +#define _USE_MATH_DEFINES +#include + +namespace rawaccel { + + struct jump_base { + vec2d step; + double smooth_rate; + + jump_base(const accel_args& args) : + step({ args.offset, args.cap - 1 }) + { + if (args.smooth == 0 || args.offset == 0) { + smooth_rate = 0; + } + else { + smooth_rate = 2 * M_PI / (args.offset * args.smooth); + } + + } + + bool is_smooth() const + { + return smooth_rate != 0; + } + + double decay(double x) const + { + return exp(smooth_rate * (step.x - x)); + } + + double smooth(double x) const + { + return step.y * 1 / (1 + decay(x)); + } + + double smooth_antideriv(double x) const + { + return step.y * (x + log(1 + decay(x)) / smooth_rate); + } + }; + + struct jump_legacy : jump_base { + using jump_base::jump_base; + + double operator()(double x) const + { + if (is_smooth()) return smooth(x) + 1; + else if (x < step.x) return 1; + else return step.y; + } + }; + + struct jump : jump_base { + double C; + + jump(const accel_args& args) : + jump_base(args), + C(-smooth_antideriv(0)) {} + + double operator()(double x) const + { + if (is_smooth()) return 1 + (smooth_antideriv(x) + C) / x; + else if (x < step.x) return 1; + else return 1 + step.y * (x - step.x) / x; + } + }; + +} -- cgit v1.2.3 From c55d1bfd01147fa014ac07d4b03ef3cad8427ae6 Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Thu, 8 Apr 2021 02:30:01 -0400 Subject: optimize a bit/refactor modify --- common/accel-jump.hpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'common/accel-jump.hpp') diff --git a/common/accel-jump.hpp b/common/accel-jump.hpp index 2d13cae..30f9a49 100644 --- a/common/accel-jump.hpp +++ b/common/accel-jump.hpp @@ -2,9 +2,6 @@ #include "rawaccel-base.hpp" -#define _USE_MATH_DEFINES -#include - namespace rawaccel { struct jump_base { @@ -18,7 +15,7 @@ namespace rawaccel { smooth_rate = 0; } else { - smooth_rate = 2 * M_PI / (args.offset * args.smooth); + smooth_rate = 2 * PI / (args.offset * args.smooth); } } -- cgit v1.2.3 From 0bff91add8525c3c3b3ac00d0508d3a798dee5e2 Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Wed, 14 Apr 2021 21:30:26 -0400 Subject: ensure normal return values from accel --- common/accel-jump.hpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'common/accel-jump.hpp') diff --git a/common/accel-jump.hpp b/common/accel-jump.hpp index 30f9a49..198891a 100644 --- a/common/accel-jump.hpp +++ b/common/accel-jump.hpp @@ -32,7 +32,7 @@ namespace rawaccel { double smooth(double x) const { - return step.y * 1 / (1 + decay(x)); + return step.y / (1 + decay(x)); } double smooth_antideriv(double x) const @@ -61,8 +61,11 @@ namespace rawaccel { double operator()(double x) const { + if (x <= 0) return 1; + if (is_smooth()) return 1 + (smooth_antideriv(x) + C) / x; - else if (x < step.x) return 1; + + if (x < step.x) return 1; else return 1 + step.y * (x - step.x) / x; } }; -- cgit v1.2.3 From 2b2e93576c44d5bf4a49d48f052175273396e49e Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Tue, 6 Jul 2021 22:01:35 -0400 Subject: guard against large values of smooth_rate for jump types --- common/accel-jump.hpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'common/accel-jump.hpp') diff --git a/common/accel-jump.hpp b/common/accel-jump.hpp index 198891a..47a1a30 100644 --- a/common/accel-jump.hpp +++ b/common/accel-jump.hpp @@ -5,19 +5,23 @@ namespace rawaccel { struct jump_base { + static constexpr double smooth_scale = 2 * PI; + vec2d step; double smooth_rate; + // requirements: args.smooth in range [0, 1] jump_base(const accel_args& args) : step({ args.offset, args.cap - 1 }) { - if (args.smooth == 0 || args.offset == 0) { + double rate_inverse = args.smooth * step.x; + + if (rate_inverse < 1) { smooth_rate = 0; } else { - smooth_rate = 2 * PI / (args.offset * args.smooth); + smooth_rate = smooth_scale / rate_inverse; } - } bool is_smooth() const -- cgit v1.2.3 From e9d116af80824c1a58ad4be0aa7a4066db380260 Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Tue, 6 Jul 2021 22:03:18 -0400 Subject: bugfix - off by 1 --- common/accel-jump.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'common/accel-jump.hpp') diff --git a/common/accel-jump.hpp b/common/accel-jump.hpp index 47a1a30..95fa461 100644 --- a/common/accel-jump.hpp +++ b/common/accel-jump.hpp @@ -52,7 +52,7 @@ namespace rawaccel { { if (is_smooth()) return smooth(x) + 1; else if (x < step.x) return 1; - else return step.y; + else return 1 + step.y; } }; -- cgit v1.2.3