31 #ifndef TWEENY_EASING_H
32 #define TWEENY_EASING_H
35 #include <type_traits>
38 #define M_PI 3.14159265358979323846
138 static T run(
float position, T start, T end) {
148 template<
class...>
struct voidify {
using type = void; };
149 template<
class... Ts>
using void_t =
typename voidify<Ts...>::type;
151 template<
class T,
class =
void>
152 struct supports_arithmetic_operations : std::false_type {};
155 struct supports_arithmetic_operations<T, void_t<
156 decltype(std::declval<T>() + std::declval<T>()),
157 decltype(std::declval<T>() - std::declval<T>()),
158 decltype(std::declval<T>() * std::declval<T>()),
159 decltype(std::declval<T>() * std::declval<float>()),
160 decltype(std::declval<float>() * std::declval<T>())
161 >> : std::true_type{};
165 static typename std::enable_if<std::is_integral<T>::value, T>::type run(
float position, T start, T end) {
166 return static_cast<T
>(roundf((end - start) * position + start));
170 static typename std::enable_if<supports_arithmetic_operations<T>::value && !std::is_integral<T>::value, T>::type run(
float position, T start, T end) {
171 return static_cast<T
>((end - start) * position + start);
175 static typename std::enable_if<!supports_arithmetic_operations<T>::value, T>::type run(
float position, T start, T end) {
186 static typename std::enable_if<std::is_integral<T>::value, T>::type run(
float position, T start, T end) {
187 return static_cast<T
>(roundf((end - start) * position + start));
191 static typename std::enable_if<!std::is_integral<T>::value, T>::type run(
float position, T start, T end) {
192 return static_cast<T
>((end - start) * position + start);
202 static T run(
float position, T start, T end) {
203 return static_cast<T
>((end - start) * position * position + start);
213 static T run(
float position, T start, T end) {
214 return static_cast<T
>((-(end - start)) * position * (position - 2) + start);
224 static T run(
float position, T start, T end) {
227 return static_cast<T
>(((end - start) / 2) * position * position + start);
231 return static_cast<T
>((-(end - start) / 2) * (position * (position - 2) - 1) + start);
241 static T run(
float position, T start, T end) {
242 return static_cast<T
>((end - start) * position * position * position + start);
252 static T run(
float position, T start, T end) {
254 return static_cast<T
>((end - start) * (position * position * position + 1) + start);
264 static T run(
float position, T start, T end) {
267 return static_cast<T
>(((end - start) / 2) * position * position * position + start);
270 return static_cast<T
>(((end - start) / 2) * (position * position * position + 2) + start);
280 static T run(
float position, T start, T end) {
281 return static_cast<T
>((end - start) * position * position * position * position + start);
291 static T run(
float position, T start, T end) {
293 return static_cast<T
>( -(end - start) * (position * position * position * position - 1) + start);
303 static T run(
float position, T start, T end) {
306 return static_cast<T
>(((end - start) / 2) * (position * position * position * position) +
310 return static_cast<T
>((-(end - start) / 2) * (position * position * position * position - 2) +
321 static T run(
float position, T start, T end) {
322 return static_cast<T
>((end - start) * position * position * position * position * position + start);
332 static T run(
float position, T start, T end) {
334 return static_cast<T
>((end - start) * (position * position * position * position * position + 1) +
345 static T run(
float position, T start, T end) {
348 return static_cast<T
>(
349 ((end - start) / 2) * (position * position * position * position * position) +
353 return static_cast<T
>(
354 ((end - start) / 2) * (position * position * position * position * position + 2) +
365 static T run(
float position, T start, T end) {
366 return static_cast<T
>(-(end - start) * cosf(position *
static_cast<float>(M_PI) / 2) + (end - start) + start);
376 static T run(
float position, T start, T end) {
377 return static_cast<T
>((end - start) * sinf(position *
static_cast<float>(M_PI) / 2) + start);
387 static T run(
float position, T start, T end) {
388 return static_cast<T
>((-(end - start) / 2) * (cosf(position *
static_cast<float>(M_PI)) - 1) + start);
398 static T run(
float position, T start, T end) {
399 return static_cast<T
>((end - start) * powf(2, 10 * (position - 1)) + start);
409 static T run(
float position, T start, T end) {
410 return static_cast<T
>((end - start) * (-powf(2, -10 * position) + 1) + start);
420 static T run(
float position, T start, T end) {
423 return static_cast<T
>(((end - start) / 2) * powf(2, 10 * (position - 1)) + start);
426 return static_cast<T
>(((end - start) / 2) * (-powf(2, -10 * position) + 2) + start);
436 static T run(
float position, T start, T end) {
437 return static_cast<T
>( -(end - start) * (sqrtf(1 - position * position) - 1) + start );
447 static T run(
float position, T start, T end) {
449 return static_cast<T
>((end - start) * (sqrtf(1 - position * position)) + start);
459 static T run(
float position, T start, T end) {
462 return static_cast<T
>((-(end - start) / 2) * (sqrtf(1 - position * position) - 1) + start);
466 return static_cast<T
>(((end - start) / 2) * (sqrtf(1 - position * position) + 1) + start);
476 static T run(
float position, T start, T end) {
477 return (end - start) - bounceOut.run((1 - position), T(), end) + start;
487 static T run(
float position, T start, T end) {
489 if (position < (1 / 2.75f)) {
490 return static_cast<T
>(c * (7.5625f * position * position) + start);
491 }
else if (position < (2.0f / 2.75f)) {
492 float postFix = position -= (1.5f / 2.75f);
493 return static_cast<T
>(c * (7.5625f * (postFix) * position + .75f) + start);
494 }
else if (position < (2.5f / 2.75f)) {
495 float postFix = position -= (2.25f / 2.75f);
496 return static_cast<T
>(c * (7.5625f * (postFix) * position + .9375f) + start);
498 float postFix = position -= (2.625f / 2.75f);
499 return static_cast<T
>(c * (7.5625f * (postFix) * position + .984375f) + start);
510 static T run(
float position, T start, T end) {
511 if (position < 0.5f)
return static_cast<T
>(bounceIn.run(position * 2, T(), end) * .5f + start);
512 else return static_cast<T
>(bounceOut.run((position * 2 - 1), T(), end) * .5f + (end - start) * .5f + start);
522 static T run(
float position, T start, T end) {
523 if (position <= 0.00001f)
return start;
524 if (position >= 0.999f)
return end;
526 auto a = end - start;
529 a * powf(2, 10 * (position -= 1));
530 return static_cast<T
>(-(postFix * sinf((position - s) * (2 *
static_cast<float>(M_PI)) / p)) + start);
540 static T run(
float position, T start, T end) {
541 if (position <= 0.00001f)
return start;
542 if (position >= 0.999f)
return end;
544 auto a = end - start;
546 return static_cast<T
>(a * powf(2, -10 * position) * sinf((position - s) * (2 *
static_cast<float>(M_PI)) / p) + end);
556 static T run(
float position, T start, T end) {
557 if (position <= 0.00001f)
return start;
558 if (position >= 0.999f)
return end;
560 float p = (.3f * 1.5f);
561 auto a = end - start;
566 postFix = a * powf(2, 10 * (position -= 1));
567 return static_cast<T
>(-0.5f * (postFix * sinf((position - s) * (2 *
static_cast<float>(M_PI)) / p)) + start);
569 postFix = a * powf(2, -10 * (position -= 1));
570 return static_cast<T
>(postFix * sinf((position - s) * (2 *
static_cast<float>(M_PI)) / p) * .5f + end);
580 static T run(
float position, T start, T end) {
582 float postFix = position;
583 return static_cast<T
>((end - start) * (postFix) * position * ((s + 1) * position - s) + start);
593 static T run(
float position, T start, T end) {
596 return static_cast<T
>((end - start) * ((position) * position * ((s + 1) * position + s) + 1) + start);
606 static T run(
float position, T start, T end) {
610 auto c = end - start;
613 if ((t /= d / 2) < 1)
return static_cast<T
>(c / 2 * (t * t * (((s) + 1) * t - s)) + b);
614 float postFix = t -= 2;
615 return static_cast<T
>(c / 2 * ((postFix) * t * (((s) + 1) * t + s) + 2) + b);
620 #endif //TWEENY_EASING_H