DWTD/Assets/Scripts/Easing.cs

240 lines
4.7 KiB
C#
Raw Normal View History

2024-09-02 20:06:18 +00:00
using UnityEngine;
/*
* Most functions taken from Tween.js - Licensed under the MIT license
* at https://github.com/sole/tween.js
* Quadratic.Bezier by @fonserbc - Licensed under WTFPL license
*/
public delegate float EasingFunction(float k);
public class Easing
{
public static float Linear(float k)
{
return k;
}
public class Quadratic
{
public static float In(float k)
{
return k * k;
}
public static float Out(float k)
{
return k * (2f - k);
}
public static float InOut(float k)
{
if ((k *= 2f) < 1f) return 0.5f * k * k;
return -0.5f * ((k -= 1f) * (k - 2f) - 1f);
}
/*
* Quadratic.Bezier(k,0) behaves like Quadratic.In(k)
* Quadratic.Bezier(k,1) behaves like Quadratic.Out(k)
*
* If you want to learn more check Alan Wolfe's post about it http://www.demofox.org/bezquad1d.html
*/
public static float Bezier(float k, float c)
{
return c * 2 * k * (1 - k) + k * k;
}
};
public class Cubic
{
public static float In(float k)
{
return k * k * k;
}
public static float Out(float k)
{
return 1f + ((k -= 1f) * k * k);
}
public static float InOut(float k)
{
if ((k *= 2f) < 1f) return 0.5f * k * k * k;
return 0.5f * ((k -= 2f) * k * k + 2f);
}
};
public class Quartic
{
public static float In(float k)
{
return k * k * k * k;
}
public static float Out(float k)
{
return 1f - ((k -= 1f) * k * k * k);
}
public static float InOut(float k)
{
if ((k *= 2f) < 1f) return 0.5f * k * k * k * k;
return -0.5f * ((k -= 2f) * k * k * k - 2f);
}
};
public class Quintic
{
public static float In(float k)
{
return k * k * k * k * k;
}
public static float Out(float k)
{
return 1f + ((k -= 1f) * k * k * k * k);
}
public static float InOut(float k)
{
if ((k *= 2f) < 1f) return 0.5f * k * k * k * k * k;
return 0.5f * ((k -= 2f) * k * k * k * k + 2f);
}
};
public class Sinusoidal
{
public static float In(float k)
{
return 1f - Mathf.Cos(k * Mathf.PI / 2f);
}
public static float Out(float k)
{
return Mathf.Sin(k * Mathf.PI / 2f);
}
public static float InOut(float k)
{
return 0.5f * (1f - Mathf.Cos(Mathf.PI * k));
}
};
public class Exponential
{
public static float In(float k)
{
return k == 0f ? 0f : Mathf.Pow(1024f, k - 1f);
}
public static float Out(float k)
{
return k == 1f ? 1f : 1f - Mathf.Pow(2f, -10f * k);
}
public static float InOut(float k)
{
if (k == 0f) return 0f;
if (k == 1f) return 1f;
if ((k *= 2f) < 1f) return 0.5f * Mathf.Pow(1024f, k - 1f);
return 0.5f * (-Mathf.Pow(2f, -10f * (k - 1f)) + 2f);
}
};
public class Circular
{
public static float In(float k)
{
return 1f - Mathf.Sqrt(1f - k * k);
}
public static float Out(float k)
{
return Mathf.Sqrt(1f - ((k -= 1f) * k));
}
public static float InOut(float k)
{
if ((k *= 2f) < 1f) return -0.5f * (Mathf.Sqrt(1f - k * k) - 1);
return 0.5f * (Mathf.Sqrt(1f - (k -= 2f) * k) + 1f);
}
};
public class Elastic
{
public static float In(float k)
{
if (k == 0) return 0;
if (k == 1) return 1;
return -Mathf.Pow(2f, 10f * (k -= 1f)) * Mathf.Sin((k - 0.1f) * (2f * Mathf.PI) / 0.4f);
}
public static float Out(float k)
{
if (k == 0) return 0;
if (k == 1) return 1;
return Mathf.Pow(2f, -10f * k) * Mathf.Sin((k - 0.1f) * (2f * Mathf.PI) / 0.4f) + 1f;
}
public static float InOut(float k)
{
if ((k *= 2f) < 1f) return -0.5f * Mathf.Pow(2f, 10f * (k -= 1f)) * Mathf.Sin((k - 0.1f) * (2f * Mathf.PI) / 0.4f);
return Mathf.Pow(2f, -10f * (k -= 1f)) * Mathf.Sin((k - 0.1f) * (2f * Mathf.PI) / 0.4f) * 0.5f + 1f;
}
};
public class Back
{
static float s = 1.70158f;
static float s2 = 2.5949095f;
public static float In(float k)
{
return k * k * ((s + 1f) * k - s);
}
public static float Out(float k)
{
return (k -= 1f) * k * ((s + 1f) * k + s) + 1f;
}
public static float InOut(float k)
{
if ((k *= 2f) < 1f) return 0.5f * (k * k * ((s2 + 1f) * k - s2));
return 0.5f * ((k -= 2f) * k * ((s2 + 1f) * k + s2) + 2f);
}
};
public class Bounce
{
public static float In(float k)
{
return 1f - Out(1f - k);
}
public static float Out(float k)
{
if (k < (1f / 2.75f))
{
return 7.5625f * k * k;
}
else if (k < (2f / 2.75f))
{
return 7.5625f * (k -= (1.5f / 2.75f)) * k + 0.75f;
}
else if (k < (2.5f / 2.75f))
{
return 7.5625f * (k -= (2.25f / 2.75f)) * k + 0.9375f;
}
else
{
return 7.5625f * (k -= (2.625f / 2.75f)) * k + 0.984375f;
}
}
public static float InOut(float k)
{
if (k < 0.5f) return In(k * 2f) * 0.5f;
return Out(k * 2f - 1f) * 0.5f + 0.5f;
}
};
}