-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLerpTransition.hpp
130 lines (106 loc) · 2.75 KB
/
LerpTransition.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#pragma once
#include <Siv3D.hpp>
namespace tomolatoon
{
using IsRatio = YesNo<struct IsRatioTag>;
struct LerpTransition
{
inline static double toRatio(double start, double finish, const Optional<double>& init = none, IsRatio isRatio = IsRatio::No)
{
if (isRatio)
{
return init.value_or(0.0);
}
else
{
return (finish - start != 0) ? ((init.value_or(start) - start) / (finish - start)) : 0.0;
}
}
using self = LerpTransition;
LerpTransition(const Duration& inDuration, const Duration& outDuration, double start, double finish, Optional<double> init = none, IsRatio isRatio = IsRatio::No)
: m_transition(inDuration, outDuration, toRatio(start, finish, init, isRatio))
, m_start(start)
, m_finish(finish)
, m_prevTransition(m_transition.value())
, m_inTime(inDuration.count())
, m_outTime(outDuration.count())
{}
double getStart() const
{
return m_start;
}
double getFinish() const
{
return m_finish;
}
// 構造化束縛して使う
auto getRange() const
{
return std::pair(m_start, m_finish);
}
self& setRange(Optional<double> start, Optional<double> finish)
{
m_start = start.value_or(m_start);
m_finish = finish.value_or(m_finish);
return *this;
}
self& setRange(std::pair<double, double> pair)
{
m_start = pair.first;
m_finish = pair.second;
return *this;
}
void updateByDeltaSec(bool in, double deltaSec = Scene::DeltaTime())
{
m_prevTransition = m_transition.value();
m_transition.update(in, deltaSec);
}
bool isFinish() const
{
return m_transition.isOne();
}
bool isStart() const
{
return m_transition.isZero();
}
double value(double easeFunc(double) = Easing::Linear) const
{
return Math::Lerp(m_start, m_finish, easeFunc(m_transition.value()));
}
double deltaValue(double easeFunc(double) = Easing::Linear) const
{
return value(easeFunc) - Math::Lerp(m_start, m_finish, easeFunc(m_prevTransition));
}
double transition(double easeFunc(double) = Easing::Linear) const
{
return easeFunc(m_transition.value());
}
double deltaTransition(double easeFunc(double) = Easing::Linear) const
{
return easeFunc(m_transition.value()) - easeFunc(m_prevTransition);
}
double setFinish(double thresholdPercent = 1.0)
{
if (1.0 - value() <= thresholdPercent)
{
m_transition.update(true, m_inTime + 1.0);
}
return m_finish;
}
double setStart(double thresholdPercent = 1.0)
{
if (1.0 - value() <= thresholdPercent)
{
m_transition.update(false, m_outTime + 1.0);
}
return m_start;
}
private:
Transition m_transition;
double m_start;
double m_finish;
double m_prevTransition;
double m_inTime;
double m_outTime;
};
} // namespace tomolatoon