summaryrefslogtreecommitdiffhomepage
path: root/logic
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2018-03-10 17:29:38 +0100
committerStanislaw Halik <sthalik@misaki.pl>2018-03-10 18:35:13 +0100
commit6286bffbf988ed5ec47462a92a11c902e4d9669f (patch)
tree91f20c48fd8783226f707a916120fd596ed77807 /logic
parent130715a4209c0f0efb5b35659eb76911a0bc6bbb (diff)
logic/pipeline: smoothen transition for reltrans not aiming
Requested by: HOPPING_PONY on the Russian IL-2 Sturmovik forum.
Diffstat (limited to 'logic')
-rw-r--r--logic/pipeline.cpp14
-rw-r--r--logic/pipeline.hpp6
2 files changed, 19 insertions, 1 deletions
diff --git a/logic/pipeline.cpp b/logic/pipeline.cpp
index c5dfe2d7..7774b02e 100644
--- a/logic/pipeline.cpp
+++ b/logic/pipeline.cpp
@@ -88,6 +88,8 @@ Pose reltrans::apply_pipeline(reltrans_state state, const Pose& value,
//qDebug() << "reltrans-interp: START" << tcomp_in_zone_;
cur = true;
interp_timer.start();
+ interp_phase_timer.start();
+ RC_phase = 0;
}
in_zone = tcomp_in_zone_;
@@ -114,10 +116,20 @@ Pose reltrans::apply_pipeline(reltrans_state state, const Pose& value,
if (cur)
{
+ static constexpr double RC_phases[] = { 2, 1, .5, .1, };
+ static constexpr double RC_time_deltas[] = { 1, .25, 25., };
+
const double dt = interp_timer.elapsed_seconds();
interp_timer.start();
- constexpr double RC = .1;
+ if (RC_phase + 1 != std::size(RC_phases) &&
+ interp_phase_timer.elapsed_seconds() > RC_time_deltas[RC_phase])
+ {
+ RC_phase++;
+ interp_phase_timer.start();
+ }
+
+ const double RC = RC_phases[RC_phase];
const double alpha = dt/(dt+RC);
constexpr double eps = .05;
diff --git a/logic/pipeline.hpp b/logic/pipeline.hpp
index 7f618ea1..82a339a3 100644
--- a/logic/pipeline.hpp
+++ b/logic/pipeline.hpp
@@ -42,6 +42,12 @@ class reltrans
{
euler_t interp_pos, last_value;
Timer interp_timer;
+
+ // this implements smooth transition into reltrans mode
+ // once not aiming anymore. see `apply_pipeline()'.
+ Timer interp_phase_timer;
+ unsigned RC_phase;
+
bool cur = false;
bool in_zone = false;