13constexpr float kPi = 3.14159265358979323846f;
14constexpr float kPi2 = kPi / 2.f;
41 return -(p * (p - 2.f));
48 return p < 0.5f ? 2.f * p * p : (-2.f * p * p) + (4.f * p) - 1.f;
58 const float f = (p - 1.f);
59 return f * f * f + 1.f;
67 return 4.f * p * p * p;
69 const float f = ((2.f * p) - 2.f);
70 return 0.5f * f * f * f + 1.f;
80 const float f = (p - 1.f);
81 return f * f * f * (1.f - p) + 1.f;
89 return 8.f * p * p * p * p;
91 const float f = (p - 1.f);
92 return -8.f * f * f * f * f + 1.f;
97 return p * p * p * p * p;
102 const float f = (p - 1.f);
103 return f * f * f * f * f + 1.f;
111 return 16.f * p * p * p * p * p;
113 const float f = ((2.f * p) - 2.f);
114 return 0.5f * f * f * f * f * f + 1.f;
119 return std::sin((p - 1.f) * kPi2) + 1.f;
124 return std::sin(p * kPi2);
129 return 0.5f * (1.f - std::cos(p * kPi));
134 return 1.f - std::sqrt(1.f - (p * p));
139 return std::sqrt((2.f - p) * p);
147 return 0.5f * (1.f - std::sqrt(1.f - 4.f * (p * p)));
149 return 0.5f * (std::sqrt(-((2.f * p) - 3.f) * ((2.f * p) - 1.f)) + 1.f);
154 return (p == 0.f) ? p : std::pow(2.f, 10.f * (p - 1.f));
159 return (p == 1.f) ? p : 1.f - std::pow(2.f, -10.f * p);
166 if (p == 0.f || p == 1.f) {
171 return 0.5f * std::pow(2.f, (20.f * p) - 10.f);
173 return -0.5f * std::pow(2.f, (-20.f * p) + 10.f) + 1.f;
179 return std::sin(13.f * kPi2 * p) * std::pow(2.f, 10.f * (p - 1.f));
186 return std::sin(-13.f * kPi2 * (p + 1.f)) * std::pow(2.f, -10.f * p) + 1.f;
194 return 0.5f * std::sin(13.f * kPi2 * (2.f * p)) *
195 std::pow(2.f, 10.f * ((2.f * p) - 1.f));
197 return 0.5f * (std::sin(-13.f * kPi2 * ((2.f * p - 1.f) + 1.f)) *
198 std::pow(2.f, -10.f * (2.f * p - 1.f)) +
204 return p * p * p - p * std::sin(p * kPi);
209 const float f = (1.f - p);
210 return 1.f - (f * f * f - f * std::sin(f * kPi));
218 const float f = 2.f * p;
219 return 0.5f * (f * f * f - f * std::sin(f * kPi));
221 const float f = (1.f - (2.f * p - 1.f));
222 return 0.5f * (1.f - (f * f * f - f * std::sin(f * kPi))) + 0.5f;
230 if (p < 4.f / 11.f) {
231 return (121.f * p * p) / 16.f;
234 if (p < 8.f / 11.f) {
235 return (363.f / 40.f * p * p) - (99.f / 10.f * p) + 17.f / 5.f;
238 if (p < 9.f / 10.f) {
239 return (4356.f / 361.f * p * p) - (35442.f / 1805.f * p) + 16061.f / 1805.f;
242 return (54.f / 5.f * p * p) - (513 / 25.f * p) + 268 / 25.f;
249 return 0.5f *
BounceOut(p * 2.f - 1.f) + 0.5f;
263 easing_function_(std::move(easing_function)),
271 if (current_ >= duration_) {
279 *value_ = from_ + (to_ - from_) * easing_function_(current_ / duration_);
Animator(float *from, float to=0.f, Duration duration=std::chrono::milliseconds(250), easing::Function easing_function=easing::Linear, Duration delay=std::chrono::milliseconds(0))
void OnAnimation(Params &)
Duration duration() const
The duration this animation step represents.
float CircularInOut(float p)
float BounceInOut(float p)
float CubicInOut(float p)
float Linear(float p)
Modeled after the line y = x.
float CircularOut(float p)
float ExponentialInOut(float p)
float ElasticInOut(float p)
float QuarticInOut(float p)
float QuadraticInOut(float p)
float QuarticOut(float p)
float CircularIn(float p)
float ExponentialOut(float p)
float QuadraticOut(float p)
float QuinticOut(float p)
float QuadraticIn(float p)
Modeled after the parabola y = x^2.
float ExponentialIn(float p)
float ElasticOut(float p)
std::function< float(float)> Function
float QuinticInOut(float p)
std::chrono::duration< float > Duration
void RequestAnimationFrame()