13constexpr float kPi = 3.14159265358979323846f;
14constexpr float kPi2 =
kPi / 2.f;
30float Linear(
float p) {
35float QuadraticIn(
float p) {
40float QuadraticOut(
float p) {
41 return -(
p * (
p - 2.f));
47float QuadraticInOut(
float p) {
48 return p < 0.5f ? 2.f *
p *
p : (-2.f *
p *
p) + (4.f *
p) - 1.f;
52float CubicIn(
float p) {
57float CubicOut(
float p) {
58 const float f = (
p - 1.f);
59 return f *
f *
f + 1.f;
65float CubicInOut(
float p) {
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;
74float QuarticIn(
float p) {
79float QuarticOut(
float p) {
80 const float f = (
p - 1.f);
81 return f *
f *
f * (1.f -
p) + 1.f;
87float QuarticInOut(
float p) {
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;
96float QuinticIn(
float p) {
97 return p *
p *
p *
p *
p;
101float QuinticOut(
float p) {
102 const float f = (
p - 1.f);
103 return f *
f *
f *
f *
f + 1.f;
109float QuinticInOut(
float p) {
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;
118float SineIn(
float p) {
119 return std::sin((
p - 1.f) *
kPi2) + 1.f;
123float SineOut(
float p) {
124 return std::sin(
p *
kPi2);
128float SineInOut(
float p) {
129 return 0.5f * (1.f - std::cos(
p *
kPi));
133float CircularIn(
float p) {
134 return 1.f - std::sqrt(1.f - (
p *
p));
138float CircularOut(
float p) {
139 return std::sqrt((2.f -
p) *
p);
145float CircularInOut(
float 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);
153float ExponentialIn(
float p) {
154 return (
p == 0.f) ?
p : std::pow(2.f, 10.f * (
p - 1.f));
158float ExponentialOut(
float p) {
159 return (
p == 1.f) ?
p : 1.f - std::pow(2.f, -10.f *
p);
165float ExponentialInOut(
float 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;
178float ElasticIn(
float p) {
179 return std::sin(13.f *
kPi2 *
p) * std::pow(2.f, 10.f * (
p - 1.f));
185float ElasticOut(
float p) {
186 return std::sin(-13.f *
kPi2 * (
p + 1.f)) * std::pow(2.f, -10.f *
p) + 1.f;
192float ElasticInOut(
float p) {
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)) +
203float BackIn(
float p) {
204 return p *
p *
p -
p * std::sin(
p *
kPi);
208float BackOut(
float p) {
209 const float f = (1.f -
p);
210 return 1.f - (
f *
f *
f -
f * std::sin(
f *
kPi));
216float BackInOut(
float p) {
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;
225float BounceIn(
float p) {
226 return 1.f - BounceOut(1.f -
p);
229float BounceOut(
float p) {
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;
245float BounceInOut(
float p) {
247 return 0.5f * BounceIn(
p * 2.f);
249 return 0.5f * BounceOut(
p * 2.f - 1.f) + 0.5f;
269 current_ +=
params.duration();
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 &)
std::chrono::duration< float > Duration
void RequestAnimationFrame()
Component Slider(SliderOption< T > options)
A slider in any direction.