4#include "CoreMinimal.h"
6enum class QUICKTWEEN_API EEasePath : uint8
16 static FORCEINLINE T Lerp(
const T& A,
const T& B,
float Alpha, EEasePath )
18 return FMath::Lerp(A, B, Alpha);
26 static FORCEINLINE FRotator Lerp(
const FRotator& A,
const FRotator& B,
float Alpha, EEasePath Path)
28 Alpha = FMath::Clamp(Alpha, 0.f, 1.f);
29 if (Alpha <= 0.f)
return A;
30 if (Alpha >= 1.f)
return B;
32 const FQuat QA = A.Quaternion();
33 FQuat QB = B.Quaternion();
37 if (Dot > 1.f - UE_KINDA_SMALL_NUMBER)
40 FQuat R = FQuat::FastLerp(QA, QB, Alpha);
45 if (Path == EEasePath::Longest)
48 if (Dot > 0.f) { QB = -QB; }
49 const FQuat R = FQuat::SlerpFullPath(QA, QB, Alpha);
54 const FQuat R = FQuat::Slerp(QA, QB, Alpha);
82 static T
Ease(T Start, T End,
float Alpha, EEaseType EaseType, EEasePath Path = EEasePath::Default)
86 case EEaseType::Linear:
87 return TEaseLerp<T>::Lerp(Start, End, Alpha, Path);
88 case EEaseType::InSine:
90 case EEaseType::OutSine:
92 case EEaseType::InOutSine:
94 case EEaseType::InQuad:
96 case EEaseType::OutQuad:
98 case EEaseType::InOutQuad:
100 case EEaseType::InCubic:
102 case EEaseType::OutCubic:
104 case EEaseType::InOutCubic:
106 case EEaseType::InQuart:
108 case EEaseType::OutQuart:
110 case EEaseType::InOutQuart:
112 case EEaseType::InQuint:
114 case EEaseType::OutQuint:
116 case EEaseType::InOutQuint:
118 case EEaseType::InExpo:
120 case EEaseType::OutExpo:
122 case EEaseType::InOutExpo:
125 return TEaseLerp<T>::Lerp(Start, End,
126 1.f - FMath::Sqrt(1.f - FMath::Pow(Alpha * 2.f - 1.f, 2.f)), Path);
130 static T Ease(T Start, T End,
float Alpha,
const UCurveFloat* EaseCurve, EEasePath Path = EEasePath::Default)
132 ensureAlways(EaseCurve);
133 return TEaseLerp<T>::Lerp(Start, End, EaseCurve->GetFloatValue(Alpha), Path);
142 static T
EaseInSine(T Start, T End,
float Alpha, EEasePath Path)
144 return TEaseLerp<T>::Lerp(Start, End, 1.f - FMath::Cos(Alpha * PI / 2.f), Path);
152 return TEaseLerp<T>::Lerp(Start, End, FMath::Sin(Alpha * PI / 2.f), Path);
160 return TEaseLerp<T>::Lerp(Start, End, 0.5f * (1.f - FMath::Cos(Alpha * PI)), Path);
170 static T
EaseInQuad(T Start, T End,
float Alpha, EEasePath Path)
172 return TEaseLerp<T>::Lerp(Start, End, Alpha * Alpha, Path);
180 return TEaseLerp<T>::Lerp(Start, End, Alpha * (2.f - Alpha), Path);
188 float Result = (Alpha < 0.5f)
189 ? 2.f * Alpha * Alpha
190 : -1.f + (4.f - 2.f * Alpha) * Alpha;
191 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
203 return TEaseLerp<T>::Lerp(Start, End, Alpha * Alpha * Alpha, Path);
211 return TEaseLerp<T>::Lerp(Start, End, 1.f - FMath::Pow(1.f - Alpha, 3), Path);
219 float Result = (Alpha < 0.5f)
220 ? 4.f * Alpha * Alpha * Alpha
221 : 1.f - FMath::Pow(-2.f * Alpha + 2.f, 3.f) / 2.f;
222 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
234 return TEaseLerp<T>::Lerp(Start, End, FMath::Pow(Alpha, 4.f), Path);
242 return TEaseLerp<T>::Lerp(Start, End, 1.f - FMath::Pow(1.f - Alpha, 4.f), Path);
250 float Result = (Alpha < 0.5f)
251 ? 8.f * FMath::Pow(Alpha, 4.f)
252 : 1.f - FMath::Pow(-2.f * Alpha + 2.f, 4.f) / 2.f;
253 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
265 return TEaseLerp<T>::Lerp(Start, End, FMath::Pow(Alpha, 5.f), Path);
273 return TEaseLerp<T>::Lerp(Start, End, 1.f - FMath::Pow(1.f - Alpha, 5.f), Path);
281 float Result = (Alpha < 0.5f)
282 ? 16.f * FMath::Pow(Alpha, 5.f)
283 : 1.f - FMath::Pow(-2.f * Alpha + 2.f, 5.f) / 2.f;
284 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
294 static T
EaseInExpo(T Start, T End,
float Alpha, EEasePath Path)
296 return TEaseLerp<T>::Lerp(Start, End, (Alpha == 0.f) ? 0.f : FMath::Pow(2.f, 10.f * Alpha - 10.f), Path);
304 return TEaseLerp<T>::Lerp(Start, End, (Alpha == 1.f) ? 1.f : 1.f - FMath::Pow(2.f, -10.f * Alpha), Path);
312 if (Alpha == 0.f)
return Start;
313 if (Alpha == 1.f)
return End;
315 float Result = (Alpha < 0.5f)
316 ? FMath::Pow(2.f, 20.f * Alpha - 10.f) / 2.f
317 : (2.f - FMath::Pow(2.f, -20.f * Alpha + 10.f)) / 2.f;
319 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
329 static T
EaseInCirc(T Start, T End,
float Alpha, EEasePath Path)
331 return TEaseLerp<T>::Lerp(Start, End, 1.f - FMath::Sqrt(1.f - Alpha * Alpha), Path);
339 return TEaseLerp<T>::Lerp(Start, End, FMath::Sqrt(1.f - FMath::Pow(Alpha - 1.f, 2.f)), Path);
347 float Result = (Alpha < 0.5f)
348 ? (1.f - FMath::Sqrt(1.f - 4.f * Alpha * Alpha)) / 2.f
349 : (FMath::Sqrt(1.f - FMath::Pow(-2.f * Alpha + 2.f, 2.f)) + 1.f) / 2.f;
351 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
361 static T
EaseInBack(T Start, T End,
float Alpha, EEasePath Path)
363 constexpr float C1 = 1.70158f;
364 constexpr float C3 = C1 + 1.f;
365 return TEaseLerp<T>::Lerp(Start, End, Alpha * Alpha * (C3 * Alpha - C1), Path);
373 constexpr float C1 = 1.70158f;
374 constexpr float C3 = C1 + 1.f;
375 float Inv = 1.f - Alpha;
376 return TEaseLerp<T>::Lerp(Start, End, 1.f - Inv * Inv * (C3 * Inv - C1), Path);
384 constexpr float C1 = 1.70158f;
385 constexpr float C2 = C1 * 1.525f;
387 float Result = (Alpha < 0.5f)
388 ? (FMath::Pow(2.f * Alpha, 2.f) * ((C2 + 1.f) * 2.f * Alpha - C2)) / 2.f
389 : (FMath::Pow(2.f * Alpha - 2.f, 2.f) * ((C2 + 1.f) * (Alpha * 2.f - 2.f) + C2) + 2.f) / 2.f;
391 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
403 if (Alpha == 0.f)
return Start;
404 if (Alpha == 1.f)
return End;
406 constexpr float C4 = (2.f * PI) / 3.f;
407 float Result = -FMath::Pow(2.f, 10.f * Alpha - 10.f) * FMath::Sin((Alpha * 10.f - 10.75f) * C4);
409 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
417 if (Alpha == 0.f)
return Start;
418 if (Alpha == 1.f)
return End;
420 constexpr float C4 = (2.f * PI) / 3.f;
421 float Result = FMath::Pow(2.f, -10.f * Alpha) * FMath::Sin((Alpha * 10.f - 0.75f) * C4) + 1.f;
423 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
431 if (Alpha == 0.f)
return Start;
432 if (Alpha == 1.f)
return End;
434 constexpr float C5 = (2.f * PI) / 4.5f;
436 float Result = (Alpha < 0.5f)
437 ? -(FMath::Pow(2.f, 20.f * Alpha - 10.f) * FMath::Sin((20.f * Alpha - 11.125f) * C5)) / 2.f
438 : (FMath::Pow(2.f, -20.f * Alpha + 10.f) * FMath::Sin((20.f * Alpha - 11.125f) * C5)) / 2.f + 1.f;
440 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
452 constexpr float N1 = 7.5625f;
453 constexpr float D1 = 2.75f;
457 if (Alpha < 1.f / D1)
459 Result = N1 * Alpha * Alpha;
461 else if (Alpha < 2.f / D1)
464 Result = N1 * Alpha * Alpha + 0.75f;
466 else if (Alpha < 2.5f / D1)
469 Result = N1 * Alpha * Alpha + 0.9375f;
473 Alpha -= 2.625f / D1;
474 Result = N1 * Alpha * Alpha + 0.984375f;
477 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
485 return TEaseLerp<T>::Lerp(Start, End, 1.f -
EaseOutBounce(0.f, 1.f, 1.f - Alpha), Path);
493 float Result = (Alpha < 0.5f)
497 return TEaseLerp<T>::Lerp(Start, End, Result, Path);
Provides a collection of static easing functions for interpolation.
Definition EaseFunctions.h:71
static T EaseInBack(T Start, T End, float Alpha, EEasePath Path)
Back ease-in interpolation.
Definition EaseFunctions.h:361
static T EaseOutQuart(T Start, T End, float Alpha, EEasePath Path)
Quartic ease-out interpolation.
Definition EaseFunctions.h:240
static T EaseInCirc(T Start, T End, float Alpha, EEasePath Path)
Circular ease-in interpolation.
Definition EaseFunctions.h:329
static T EaseInOutElastic(T Start, T End, float Alpha, EEasePath Path)
Elastic ease-in-out interpolation.
Definition EaseFunctions.h:429
static T EaseInOutQuint(T Start, T End, float Alpha, EEasePath Path)
Quintic ease-in-out interpolation.
Definition EaseFunctions.h:279
static T EaseOutCubic(T Start, T End, float Alpha, EEasePath Path)
Cubic ease-out interpolation.
Definition EaseFunctions.h:209
static T EaseInQuint(T Start, T End, float Alpha, EEasePath Path)
Quintic ease-in interpolation.
Definition EaseFunctions.h:263
static T EaseOutElastic(T Start, T End, float Alpha, EEasePath Path)
Elastic ease-out interpolation.
Definition EaseFunctions.h:415
static T EaseInQuad(T Start, T End, float Alpha, EEasePath Path)
Quadratic ease-in interpolation.
Definition EaseFunctions.h:170
static T EaseOutQuad(T Start, T End, float Alpha, EEasePath Path)
Quadratic ease-out interpolation.
Definition EaseFunctions.h:178
static T EaseOutExpo(T Start, T End, float Alpha, EEasePath Path)
Exponential ease-out interpolation.
Definition EaseFunctions.h:302
static T EaseInOutCubic(T Start, T End, float Alpha, EEasePath Path)
Cubic ease-in-out interpolation.
Definition EaseFunctions.h:217
static T EaseOutBack(T Start, T End, float Alpha, EEasePath Path)
Back ease-out interpolation.
Definition EaseFunctions.h:371
static T EaseInSine(T Start, T End, float Alpha, EEasePath Path)
Sine ease-in interpolation.
Definition EaseFunctions.h:142
static T EaseInOutQuart(T Start, T End, float Alpha, EEasePath Path)
Quartic ease-in-out interpolation.
Definition EaseFunctions.h:248
static T EaseOutCirc(T Start, T End, float Alpha, EEasePath Path)
Circular ease-out interpolation.
Definition EaseFunctions.h:337
static T EaseOutBounce(T Start, T End, float Alpha, EEasePath Path)
Bounce ease-out interpolation.
Definition EaseFunctions.h:450
static T EaseInQuart(T Start, T End, float Alpha, EEasePath Path)
Quartic ease-in interpolation.
Definition EaseFunctions.h:232
static T EaseInOutQuad(T Start, T End, float Alpha, EEasePath Path)
Quadratic ease-in-out interpolation.
Definition EaseFunctions.h:186
static T EaseInCubic(T Start, T End, float Alpha, EEasePath Path)
Cubic ease-in interpolation.
Definition EaseFunctions.h:201
static T EaseInExpo(T Start, T End, float Alpha, EEasePath Path)
Exponential ease-in interpolation.
Definition EaseFunctions.h:294
static T EaseInOutBounce(T Start, T End, float Alpha, EEasePath Path)
Bounce ease-in-out interpolation.
Definition EaseFunctions.h:491
static T EaseInOutBack(T Start, T End, float Alpha, EEasePath Path)
Back ease-in-out interpolation.
Definition EaseFunctions.h:382
static T EaseInOutCirc(T Start, T End, float Alpha, EEasePath Path)
Circular ease-in-out interpolation.
Definition EaseFunctions.h:345
static T EaseInElastic(T Start, T End, float Alpha, EEasePath Path)
Elastic ease-in interpolation.
Definition EaseFunctions.h:401
static T EaseInBounce(T Start, T End, float Alpha, EEasePath Path)
Bounce ease-in interpolation.
Definition EaseFunctions.h:483
static T EaseOutQuint(T Start, T End, float Alpha, EEasePath Path)
Quintic ease-out interpolation.
Definition EaseFunctions.h:271
static T EaseInOutExpo(T Start, T End, float Alpha, EEasePath Path)
Exponential ease-in-out interpolation.
Definition EaseFunctions.h:310
static T EaseOutSine(T Start, T End, float Alpha, EEasePath Path)
Sine ease-out interpolation.
Definition EaseFunctions.h:150
static T Ease(T Start, T End, float Alpha, EEaseType EaseType, EEasePath Path=EEasePath::Default)
Interpolates between Start and End using the specified easing type.
Definition EaseFunctions.h:82
static T EaseInOutSine(T Start, T End, float Alpha, EEasePath Path)
Sine ease-in-out interpolation.
Definition EaseFunctions.h:158
Definition EaseFunctions.h:15