HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
animator.hpp
1// Copyright Take Vos 2021.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "chrono.hpp"
8#include "algorithm.hpp"
9#include "concepts.hpp"
10#include <cmath>
11
12namespace tt {
13
16template<arithmetic T>
17class animator {
18public:
19 using value_type = T;
20
24 animator(std::chrono::nanoseconds animation_duration) noexcept : _animation_duration(animation_duration) {}
25
30 void update(value_type new_value, utc_nanoseconds current_time) noexcept
31 {
32 if (not initialized) {
33 initialized = true;
34 _old_value = new_value;
35 _new_value = new_value;
36 _start_time = current_time;
37
38 } else if (new_value != _new_value) {
39 _old_value = _new_value;
40 _new_value = new_value;
41 _start_time = current_time;
42 }
43 _current_time = current_time;
44 }
45
48 [[nodiscard]] bool is_animating() const noexcept
49 {
50 tt_axiom(initialized);
51 return progress() < 1.0f;
52 }
53
56 value_type current_value() const noexcept {
57 tt_axiom(initialized);
58 return std::lerp(_old_value, _new_value, progress());
59 }
60
61private:
62 value_type _old_value;
63 value_type _new_value;
64 utc_nanoseconds _start_time;
65 utc_nanoseconds _current_time;
66 std::chrono::nanoseconds _animation_duration;
67 bool initialized = false;
68
69 float progress() const noexcept
70 {
71 using namespace std::literals::chrono_literals;
72
73 ttlet dt = _current_time - _start_time;
74 ttlet p = static_cast<float>(dt / 1ms) / static_cast<float>(_animation_duration / 1ms);
75 return std::clamp(p, 0.0f, 1.0f);
76 }
77};
78
79} // namespace tt
A type that gets animated between two values.
Definition animator.hpp:17
animator(std::chrono::nanoseconds animation_duration) noexcept
Constructor.
Definition animator.hpp:24
void update(value_type new_value, utc_nanoseconds current_time) noexcept
Update the value and time.
Definition animator.hpp:30
bool is_animating() const noexcept
Check if the animation is currently running.
Definition animator.hpp:48
value_type current_value() const noexcept
The interpolated value between start and end value.
Definition animator.hpp:56