8#include "algorithm.hpp"
12namespace hi::inline
v1 {
31 bool update(value_type new_value, utc_nanoseconds current_time)
noexcept
33 if (not initialized) {
35 _old_value = new_value;
36 _new_value = new_value;
37 _start_time = current_time;
39 }
else if (new_value != _new_value) {
40 _old_value = _new_value;
41 _new_value = new_value;
42 _start_time = current_time;
44 _current_time = current_time;
45 return is_animating();
53 return progress() < 1.0f;
61 return std::lerp(_old_value, _new_value, progress());
65 value_type _old_value;
66 value_type _new_value;
67 utc_nanoseconds _start_time;
68 utc_nanoseconds _current_time;
70 bool initialized =
false;
72 float progress() const noexcept
74 using namespace std::chrono_literals;
76 hilet dt = _current_time - _start_time;
77 hilet p =
static_cast<float>(dt / 1ms) /
static_cast<float>(_animation_duration / 1ms);
78 return std::clamp(p, 0.0f, 1.0f);
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:133
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
DOXYGEN BUG.
Definition algorithm.hpp:15
A type that gets animated between two values.
Definition animator.hpp:17
animator(std::chrono::nanoseconds animation_duration) noexcept
Constructor.
Definition animator.hpp:24
bool update(value_type new_value, utc_nanoseconds current_time) noexcept
Update the value and time.
Definition animator.hpp:31
value_type current_value() const noexcept
The interpolated value between start and end value.
Definition animator.hpp:58
bool is_animating() const noexcept
Check if the animation is currently running.
Definition animator.hpp:50