// // EasingCore - https://github.com/setchi/EasingCore // // The MIT License (MIT) // // Copyright (c) 2019 setchi // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. using System; using UnityEngine; namespace UnityEngine.UI.Extensions.EasingCore { public enum Ease { Linear, InBack, InBounce, InCirc, InCubic, InElastic, InExpo, InQuad, InQuart, InQuint, InSine, OutBack, OutBounce, OutCirc, OutCubic, OutElastic, OutExpo, OutQuad, OutQuart, OutQuint, OutSine, InOutBack, InOutBounce, InOutCirc, InOutCubic, InOutElastic, InOutExpo, InOutQuad, InOutQuart, InOutQuint, InOutSine, } public static class EasingFunction { /// /// Gets the easing function /// /// Ease type /// Easing function public static Func Get(Ease type) { switch (type) { case Ease.Linear: return linear; case Ease.InBack: return inBack; case Ease.InBounce: return inBounce; case Ease.InCirc: return inCirc; case Ease.InCubic: return inCubic; case Ease.InElastic: return inElastic; case Ease.InExpo: return inExpo; case Ease.InQuad: return inQuad; case Ease.InQuart: return inQuart; case Ease.InQuint: return inQuint; case Ease.InSine: return inSine; case Ease.OutBack: return outBack; case Ease.OutBounce: return outBounce; case Ease.OutCirc: return outCirc; case Ease.OutCubic: return outCubic; case Ease.OutElastic: return outElastic; case Ease.OutExpo: return outExpo; case Ease.OutQuad: return outQuad; case Ease.OutQuart: return outQuart; case Ease.OutQuint: return outQuint; case Ease.OutSine: return outSine; case Ease.InOutBack: return inOutBack; case Ease.InOutBounce: return inOutBounce; case Ease.InOutCirc: return inOutCirc; case Ease.InOutCubic: return inOutCubic; case Ease.InOutElastic: return inOutElastic; case Ease.InOutExpo: return inOutExpo; case Ease.InOutQuad: return inOutQuad; case Ease.InOutQuart: return inOutQuart; case Ease.InOutQuint: return inOutQuint; case Ease.InOutSine: return inOutSine; default: return linear; } float linear(float t) => t; float inBack(float t) => t * t * t - t * Mathf.Sin(t * Mathf.PI); float outBack(float t) => 1f - inBack(1f - t); float inOutBack(float t) => t < 0.5f ? 0.5f * inBack(2f * t) : 0.5f * outBack(2f * t - 1f) + 0.5f; float inBounce(float t) => 1f - outBounce(1f - t); float outBounce(float t) => t < 4f / 11.0f ? (121f * t * t) / 16.0f : t < 8f / 11.0f ? (363f / 40.0f * t * t) - (99f / 10.0f * t) + 17f / 5.0f : t < 9f / 10.0f ? (4356f / 361.0f * t * t) - (35442f / 1805.0f * t) + 16061f / 1805.0f : (54f / 5.0f * t * t) - (513f / 25.0f * t) + 268f / 25.0f; float inOutBounce(float t) => t < 0.5f ? 0.5f * inBounce(2f * t) : 0.5f * outBounce(2f * t - 1f) + 0.5f; float inCirc(float t) => 1f - Mathf.Sqrt(1f - (t * t)); float outCirc(float t) => Mathf.Sqrt((2f - t) * t); float inOutCirc(float t) => t < 0.5f ? 0.5f * (1 - Mathf.Sqrt(1f - 4f * (t * t))) : 0.5f * (Mathf.Sqrt(-((2f * t) - 3f) * ((2f * t) - 1f)) + 1f); float inCubic(float t) => t * t * t; float outCubic(float t) => inCubic(t - 1f) + 1f; float inOutCubic(float t) => t < 0.5f ? 4f * t * t * t : 0.5f * inCubic(2f * t - 2f) + 1f; float inElastic(float t) => Mathf.Sin(13f * (Mathf.PI * 0.5f) * t) * Mathf.Pow(2f, 10f * (t - 1f)); float outElastic(float t) => Mathf.Sin(-13f * (Mathf.PI * 0.5f) * (t + 1)) * Mathf.Pow(2f, -10f * t) + 1f; float inOutElastic(float t) => t < 0.5f ? 0.5f * Mathf.Sin(13f * (Mathf.PI * 0.5f) * (2f * t)) * Mathf.Pow(2f, 10f * ((2f * t) - 1f)) : 0.5f * (Mathf.Sin(-13f * (Mathf.PI * 0.5f) * ((2f * t - 1f) + 1f)) * Mathf.Pow(2f, -10f * (2f * t - 1f)) + 2f); float inExpo(float t) => Mathf.Approximately(0.0f, t) ? t : Mathf.Pow(2f, 10f * (t - 1f)); float outExpo(float t) => Mathf.Approximately(1.0f, t) ? t : 1f - Mathf.Pow(2f, -10f * t); float inOutExpo(float v) => Mathf.Approximately(0.0f, v) || Mathf.Approximately(1.0f, v) ? v : v < 0.5f ? 0.5f * Mathf.Pow(2f, (20f * v) - 10f) : -0.5f * Mathf.Pow(2f, (-20f * v) + 10f) + 1f; float inQuad(float t) => t * t; float outQuad(float t) => -t * (t - 2f); float inOutQuad(float t) => t < 0.5f ? 2f * t * t : -2f * t * t + 4f * t - 1f; float inQuart(float t) => t * t * t * t; float outQuart(float t) { var u = t - 1f; return u * u * u * (1f - t) + 1f; } float inOutQuart(float t) => t < 0.5f ? 8f * inQuart(t) : -8f * inQuart(t - 1f) + 1f; float inQuint(float t) => t * t * t * t * t; float outQuint(float t) => inQuint(t - 1f) + 1f; float inOutQuint(float t) => t < 0.5f ? 16f * inQuint(t) : 0.5f * inQuint(2f * t - 2f) + 1f; float inSine(float t) => Mathf.Sin((t - 1f) * (Mathf.PI * 0.5f)) + 1f; float outSine(float t) => Mathf.Sin(t * (Mathf.PI * 0.5f)); float inOutSine(float t) => 0.5f * (1f - Mathf.Cos(t * Mathf.PI)); } } }