cirnogodot/GTweensGodot/GTweens/Source/Easings/PresetEasingDelegateFactory.cs
2025-02-24 11:52:50 +01:00

239 lines
No EOL
8.2 KiB
C#

using System;
namespace GTweens.Easings
{
public static class PresetEasingDelegateFactory
{
const float C1 = 1.70158f;
const float C2 = C1 * 1.525f;
const float C3 = C1 + 1;
const float C4 = (2 * (float)Math.PI) / 3;
const float C5 = (2 * (float)Math.PI) / 4.5f;
const float N1 = 7.5625f;
const float D1 = 2.75f;
public static EasingDelegate GetEaseDelegate(Easing easing)
{
EasingDelegate result;
switch (easing)
{
default:
case Easing.Linear: result = Linear; break;
case Easing.InSine: result = InSine; break;
case Easing.OutSine: result = OutSine; break;
case Easing.InOutSine: result = InOutSine; break;
case Easing.InQuad: result = InQuad; break;
case Easing.OutQuad: result = OutQuad; break;
case Easing.InOutQuad: result = InOutQuad; break;
case Easing.InCubic: result = InCubic; break;
case Easing.OutCubic: result = OutCubic; break;
case Easing.InOutCubic: result = InOutCubic; break;
case Easing.InQuart: result = InQuart; break;
case Easing.OutQuart: result = OutQuart; break;
case Easing.InOutQuart: result = InOutQuart; break;
case Easing.InQuint: result = InQuint; break;
case Easing.OutQuint: result = OutQuint; break;
case Easing.InOutQuint: result = InOutQuint; break;
case Easing.InExpo: result = InExpo; break;
case Easing.OutExpo: result = OutExpo; break;
case Easing.InOutExpo: result = InOutExpo; break;
case Easing.InCirc: result = InCirc; break;
case Easing.OutCirc: result = OutCirc; break;
case Easing.InOutCirc: result = InOutCirc; break;
case Easing.InBack: result = InBack; break;
case Easing.OutBack: result = OutBack; break;
case Easing.InOutBack: result = InOutBack; break;
case Easing.InElastic: result = InElastic; break;
case Easing.OutElastic: result = OutElastic; break;
case Easing.InOutElastic: result = InOutElastic; break;
case Easing.InBounce: result = InBounce; break;
case Easing.OutBounce: result = OutBounce; break;
case Easing.InOutBounce: result = InOutBounce; break;
}
return result;
}
static float Linear(float a, float b, float t)
{
return Lerp(a, b, t);
}
static float InSine(float a, float b, float t)
{
return Lerp(a, b, 1 - (float)Math.Cos((t * (float)Math.PI) / 2f));
}
static float OutSine(float a, float b, float t)
{
return Lerp(a, b, (float)Math.Sin((t * (float)Math.PI) / 2f));
}
static float InOutSine(float a, float b, float t)
{
return Lerp(a, b, -((float)Math.Cos(t * (float)Math.PI) - 1) / 2f);
}
static float InQuad(float a, float b, float t)
{
return Lerp(a, b, t * t);
}
static float OutQuad(float a, float b, float t)
{
return Lerp(a, b, 1 - (1 - t) * (1 - t));
}
static float InOutQuad(float a, float b, float t)
{
return Lerp(a, b, t < 0.5f ? 2 * t * t : 1 - (float)Math.Pow(-2 * t + 2, 2) / 2);
}
static float InCubic(float a, float b, float t)
{
return Lerp(a, b, t * t * t);
}
static float OutCubic(float a, float b, float t)
{
return Lerp(a, b, 1 - (float)Math.Pow(1 - t, 3));
}
static float InOutCubic(float a, float b, float t)
{
return Lerp(a, b, t < 0.5f ? 4 * t * t * t : 1 -(float) Math.Pow(-2 * t + 2, 3) / 2);
}
static float InQuart(float a, float b, float t)
{
return Lerp(a, b, t * t * t * t);
}
static float OutQuart(float a, float b, float t)
{
return Lerp(a, b, 1 - (float)Math.Pow(1 - t, 4));
}
static float InOutQuart(float a, float b, float t)
{
return Lerp(a, b, t < 0.5f ? 8 * t * t * t * t : 1 - (float)Math.Pow(-2 * t + 2, 4) / 2);
}
static float InQuint(float a, float b, float t)
{
return Lerp(a, b, t * t * t * t * t);
}
static float OutQuint(float a, float b, float t)
{
return Lerp(a, b, 1 - (float)Math.Pow(1 - t, 5));
}
static float InOutQuint(float a, float b, float t)
{
return Lerp(a, b, t < 0.5f ? 16 * t * t * t * t * t : 1 - (float)Math.Pow(-2 * t + 2, 5) / 2);
}
static float InExpo(float a, float b, float t)
{
return Lerp(a, b, t == 0 ? 0 : (float)Math.Pow(2, 10 * t - 10));
}
static float OutExpo(float a, float b, float t)
{
return Lerp(a, b, t == 1 ? 1 : 1 - (float)Math.Pow(2, -10 * t));
}
static float InOutExpo(float a, float b, float t)
{
return Lerp(a, b, t == 0 ? 0 : t == 1 ? 1 : t < 0.5f ? (float)Math.Pow(2, 20 * t - 10) / 2 : (2 - (float)Math.Pow(2, -20 * t + 10)) / 2);
}
static float InCirc(float a, float b, float t)
{
return Lerp(a, b, 1 - (float)Math.Sqrt(1 - (float)Math.Pow(t, 2)));
}
static float OutCirc(float a, float b, float t)
{
return Lerp(a, b, (float)Math.Sqrt(1 - (float)Math.Pow(t - 1, 2)));
}
static float InOutCirc(float a, float b, float t)
{
return Lerp(a, b, t < 0.5f ? (1 - (float)Math.Sqrt(1 - (float)Math.Pow(2 * t, 2))) / 2 : (float)(Math.Sqrt(1 - Math.Pow(-2 * t + 2, 2)) + 1) / 2);
}
static float InBack(float a, float b, float t)
{
return Lerp(a, b, C3 * t * t * t - C1 * t * t);
}
static float OutBack(float a, float b, float t)
{
return Lerp(a, b, 1 + C3 * (float)Math.Pow(t - 1, 3) + C1 * (float)Math.Pow(t - 1, 2));
}
static float InOutBack(float a, float b, float t)
{
return Lerp(a, b, t < 0.5f ? ((float)Math.Pow(2 * t, 2) * ((C2 + 1) * 2 * t - C2)) / 2 : ((float)Math.Pow(2 * t - 2, 2) * ((C2 + 1) * (t * 2 - 2) + C2) + 2) / 2);
}
static float InElastic(float a, float b, float t)
{
return Lerp(a, b, t == 0 ? 0 : t == 1 ? 1 : -(float)Math.Pow(2, 10 * t - 10) * (float)Math.Sin((t * 10 - 10.75f) * C4));
}
static float OutElastic(float a, float b, float t)
{
return Lerp(a, b, t == 0 ? 0 : t == 1 ? 1 : (float)Math.Pow(2, -10 * t) * (float)Math.Sin((t * 10 - 0.75f) * C4) + 1);
}
static float InOutElastic(float a, float b, float t)
{
return Lerp(a, b, t == 0 ? 0 : t == 1 ? 1 : t < 0.5f ? -((float)Math.Pow(2, 20 * t - 10) * (float)Math.Sin((20 * t - 11.125f) * C5)) / 2 : ((float)Math.Pow(2, -20 * t + 10) * (float)Math.Sin((20 * t - 11.125f) * C5)) / +1);
}
static float InBounce(float a, float b, float t)
{
return Lerp(a, b, 1 - RawOutBounce(1 - t));
}
static float OutBounce(float a, float b, float t)
{
return Lerp(a, b, RawOutBounce(t));
}
static float InOutBounce(float a, float b, float t)
{
return Lerp(a, b, t < 0.5f ? (1 - RawOutBounce(1 - 2 * t)) / 2 : (1 + RawOutBounce(2 * t - 1)) / 2);
}
static float RawOutBounce(float t)
{
if (t < 1 / D1)
{
return N1 * t * t;
}
if (t < 2 / D1)
{
return N1 * (t -= 1.5f / D1) * t + 0.75f;
}
if (t < 2.5f / D1)
{
return N1 * (t -= 2.25f / D1) * t + 0.9375f;
}
return N1 * (t -= 2.625f / D1) * t + 0.984375f;
}
static float Lerp(float a, float b, float t)
{
return a + (b - a) * t;
}
}
}