1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324 |
- // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
- using System;
- using static UnityEngine.Mathf;
- using NormalizedDelegate = System.Func<float, float>;
- namespace Animancer
- {
- /// <summary>A set of common <see href="https://easings.net">easing functions</see>.</summary>
- /// <remarks>
- /// There are several different types of functions:
- /// <list type="bullet">
- /// <item>In: accelerating from zero velocity.</item>
- /// <item>Out: decelerating to zero velocity.</item>
- /// <item>InOut: uses the corresponding In function until halfway, then the Out function after that.</item>
- /// <item>Normalized: methods with a single parameter (<see cref="float"/> value) expect values from 0 to 1.</item>
- /// <item>Ranged: methods with 3 parameters (<see cref="float"/> start, <see cref="float"/> end,
- /// <see cref="float"/> value) use the specified range instead ot 0 to 1.</item>
- /// <item>Derivative: calculates the gradient of their corresponding non-derivative function.
- /// The more complex derivative functions were made with 'https://www.derivative-calculator.net'.</item>
- /// </list>
- /// </remarks>
- /// https://kybernetik.com.au/animancer/api/Animancer/Easing
- ///
- public static class Easing
- {
- /************************************************************************************************************************/
- #region Delegates
- /************************************************************************************************************************/
- /// <summary>The natural log of 2.</summary>
- public const float Ln2 = 0.693147180559945f;
- /************************************************************************************************************************/
- /// <summary>A variant of a <see cref="NormalizedDelegate"/> with a custom range instead of 0 to 1.</summary>
- public delegate float RangedDelegate(float start, float end, float value);
- /************************************************************************************************************************/
- /// <summary>The name of an easing function.</summary>
- /// <remarks>The <see cref="Easing"/> class contains various extension methods for this enum.</remarks>
- /// https://kybernetik.com.au/animancer/api/Animancer/Function
- ///
- public enum Function
- {
- /// <summary><see cref="Easing.Linear(float)"/></summary>
- Linear,
- /// <summary><see cref="Quadratic.In(float)"/></summary>
- QuadraticIn,
- /// <summary><see cref="Quadratic.Out(float)"/></summary>
- QuadraticOut,
- /// <summary><see cref="Quadratic.InOut(float)"/></summary>
- QuadraticInOut,
- /// <summary><see cref="Cubic.In(float)"/></summary>
- CubicIn,
- /// <summary><see cref="Cubic.Out(float)"/></summary>
- CubicOut,
- /// <summary><see cref="Cubic.InOut(float)"/></summary>
- CubicInOut,
- /// <summary><see cref="Quartic.In(float)"/></summary>
- QuarticIn,
- /// <summary><see cref="Quartic.Out(float)"/></summary>
- QuarticOut,
- /// <summary><see cref="Quartic.InOut(float)"/></summary>
- QuarticInOut,
- /// <summary><see cref="Quintic.In(float)"/></summary>
- QuinticIn,
- /// <summary><see cref="Quintic.Out(float)"/></summary>
- QuinticOut,
- /// <summary><see cref="Quintic.InOut(float)"/></summary>
- QuinticInOut,
- /// <summary><see cref="Sine.In(float)"/></summary>
- SineIn,
- /// <summary><see cref="Sine.Out(float)"/></summary>
- SineOut,
- /// <summary><see cref="Sine.InOut(float)"/></summary>
- SineInOut,
- /// <summary><see cref="Exponential.In(float)"/></summary>
- ExponentialIn,
- /// <summary><see cref="Exponential.Out(float)"/></summary>
- ExponentialOut,
- /// <summary><see cref="Exponential.InOut(float)"/></summary>
- ExponentialInOut,
- /// <summary><see cref="Circular.In(float)"/></summary>
- CircularIn,
- /// <summary><see cref="Circular.Out(float)"/></summary>
- CircularOut,
- /// <summary><see cref="Circular.InOut(float)"/></summary>
- CircularInOut,
- /// <summary><see cref="Back.In(float)"/></summary>
- BackIn,
- /// <summary><see cref="Back.Out(float)"/></summary>
- BackOut,
- /// <summary><see cref="Back.InOut(float)"/></summary>
- BackInOut,
- /// <summary><see cref="Bounce.In(float)"/></summary>
- BounceIn,
- /// <summary><see cref="Bounce.Out(float)"/></summary>
- BounceOut,
- /// <summary><see cref="Bounce.InOut(float)"/></summary>
- BounceInOut,
- /// <summary><see cref="Elastic.In(float)"/></summary>
- ElasticIn,
- /// <summary><see cref="Elastic.Out(float)"/></summary>
- ElasticOut,
- /// <summary><see cref="Elastic.InOut(float)"/></summary>
- ElasticInOut,
- }
- /// <summary>The total number of <see cref="Function"/> values.</summary>
- public const int FunctionCount = (int)Function.ElasticInOut + 1;
- /************************************************************************************************************************/
- private static NormalizedDelegate[] _FunctionDelegates;
- /// <summary>[Animancer Extension]
- /// Returns a cached delegate representing the specified `function` with a normalized range.
- /// </summary>
- public static NormalizedDelegate GetDelegate(this Function function)
- {
- var i = (int)function;
- if (_FunctionDelegates == null)
- {
- _FunctionDelegates = new NormalizedDelegate[FunctionCount];
- }
- else
- {
- var del = _FunctionDelegates[i];
- if (del != null)
- return del;
- }
- return _FunctionDelegates[i] = function switch
- {
- Function.Linear => Linear,
- Function.QuadraticIn => Quadratic.In,
- Function.QuadraticOut => Quadratic.Out,
- Function.QuadraticInOut => Quadratic.InOut,
- Function.CubicIn => Cubic.In,
- Function.CubicOut => Cubic.Out,
- Function.CubicInOut => Cubic.InOut,
- Function.QuarticIn => Quartic.In,
- Function.QuarticOut => Quartic.Out,
- Function.QuarticInOut => Quartic.InOut,
- Function.QuinticIn => Quintic.In,
- Function.QuinticOut => Quintic.Out,
- Function.QuinticInOut => Quintic.InOut,
- Function.SineIn => Sine.In,
- Function.SineOut => Sine.Out,
- Function.SineInOut => Sine.InOut,
- Function.ExponentialIn => Exponential.In,
- Function.ExponentialOut => Exponential.Out,
- Function.ExponentialInOut => Exponential.InOut,
- Function.CircularIn => Circular.In,
- Function.CircularOut => Circular.Out,
- Function.CircularInOut => Circular.InOut,
- Function.BackIn => Back.In,
- Function.BackOut => Back.Out,
- Function.BackInOut => Back.InOut,
- Function.BounceIn => Bounce.In,
- Function.BounceOut => Bounce.Out,
- Function.BounceInOut => Bounce.InOut,
- Function.ElasticIn => Elastic.In,
- Function.ElasticOut => Elastic.Out,
- Function.ElasticInOut => Elastic.InOut,
- _ => throw new ArgumentOutOfRangeException(nameof(function)),
- };
- }
- /************************************************************************************************************************/
- private static NormalizedDelegate[] _DerivativeDelegates;
- /// <summary>[Animancer Extension]
- /// Returns a cached delegate representing the derivative of the specified `function` with a normalized range.
- /// </summary>
- public static NormalizedDelegate GetDerivativeDelegate(this Function function)
- {
- var i = (int)function;
- if (_DerivativeDelegates == null)
- {
- _DerivativeDelegates = new NormalizedDelegate[FunctionCount];
- }
- else
- {
- var del = _DerivativeDelegates[i];
- if (del != null)
- return del;
- }
- return _DerivativeDelegates[i] = function switch
- {
- Function.Linear => LinearDerivative,
- Function.QuadraticIn => Quadratic.InDerivative,
- Function.QuadraticOut => Quadratic.OutDerivative,
- Function.QuadraticInOut => Quadratic.InOutDerivative,
- Function.CubicIn => Cubic.InDerivative,
- Function.CubicOut => Cubic.OutDerivative,
- Function.CubicInOut => Cubic.InOutDerivative,
- Function.QuarticIn => Quartic.InDerivative,
- Function.QuarticOut => Quartic.OutDerivative,
- Function.QuarticInOut => Quartic.InOutDerivative,
- Function.QuinticIn => Quintic.InDerivative,
- Function.QuinticOut => Quintic.OutDerivative,
- Function.QuinticInOut => Quintic.InOutDerivative,
- Function.SineIn => Sine.InDerivative,
- Function.SineOut => Sine.OutDerivative,
- Function.SineInOut => Sine.InOutDerivative,
- Function.ExponentialIn => Exponential.InDerivative,
- Function.ExponentialOut => Exponential.OutDerivative,
- Function.ExponentialInOut => Exponential.InOutDerivative,
- Function.CircularIn => Circular.InDerivative,
- Function.CircularOut => Circular.OutDerivative,
- Function.CircularInOut => Circular.InOutDerivative,
- Function.BackIn => Back.InDerivative,
- Function.BackOut => Back.OutDerivative,
- Function.BackInOut => Back.InOutDerivative,
- Function.BounceIn => Bounce.InDerivative,
- Function.BounceOut => Bounce.OutDerivative,
- Function.BounceInOut => Bounce.InOutDerivative,
- Function.ElasticIn => Elastic.InDerivative,
- Function.ElasticOut => Elastic.OutDerivative,
- Function.ElasticInOut => Elastic.InOutDerivative,
- _ => throw new ArgumentOutOfRangeException(nameof(function)),
- };
- }
- /************************************************************************************************************************/
- private static RangedDelegate[] _RangedFunctionDelegates;
- /// <summary>[Animancer Extension]
- /// Returns a cached delegate representing the specified `function` with a custom range.
- /// </summary>
- public static RangedDelegate GetRangedDelegate(this Function function)
- {
- var i = (int)function;
- if (_RangedFunctionDelegates == null)
- {
- _RangedFunctionDelegates = new RangedDelegate[FunctionCount];
- }
- else
- {
- var del = _RangedFunctionDelegates[i];
- if (del != null)
- return del;
- }
- return _RangedFunctionDelegates[i] = function switch
- {
- Function.Linear => Linear,
- Function.QuadraticIn => Quadratic.In,
- Function.QuadraticOut => Quadratic.Out,
- Function.QuadraticInOut => Quadratic.InOut,
- Function.CubicIn => Cubic.In,
- Function.CubicOut => Cubic.Out,
- Function.CubicInOut => Cubic.InOut,
- Function.QuarticIn => Quartic.In,
- Function.QuarticOut => Quartic.Out,
- Function.QuarticInOut => Quartic.InOut,
- Function.QuinticIn => Quintic.In,
- Function.QuinticOut => Quintic.Out,
- Function.QuinticInOut => Quintic.InOut,
- Function.SineIn => Sine.In,
- Function.SineOut => Sine.Out,
- Function.SineInOut => Sine.InOut,
- Function.ExponentialIn => Exponential.In,
- Function.ExponentialOut => Exponential.Out,
- Function.ExponentialInOut => Exponential.InOut,
- Function.CircularIn => Circular.In,
- Function.CircularOut => Circular.Out,
- Function.CircularInOut => Circular.InOut,
- Function.BackIn => Back.In,
- Function.BackOut => Back.Out,
- Function.BackInOut => Back.InOut,
- Function.BounceIn => Bounce.In,
- Function.BounceOut => Bounce.Out,
- Function.BounceInOut => Bounce.InOut,
- Function.ElasticIn => Elastic.In,
- Function.ElasticOut => Elastic.Out,
- Function.ElasticInOut => Elastic.InOut,
- _ => throw new ArgumentOutOfRangeException(nameof(function)),
- };
- }
- /************************************************************************************************************************/
- private static RangedDelegate[] _RangedDerivativeDelegates;
- /// <summary>[Animancer Extension]
- /// Returns a cached delegate representing the derivative of the specified `function` with a custom range.
- /// </summary>
- public static RangedDelegate GetRangedDerivativeDelegate(this Function function)
- {
- var i = (int)function;
- if (_RangedDerivativeDelegates == null)
- {
- _RangedDerivativeDelegates = new RangedDelegate[FunctionCount];
- }
- else
- {
- var del = _RangedDerivativeDelegates[i];
- if (del != null)
- return del;
- }
- return _RangedDerivativeDelegates[i] = function switch
- {
- Function.Linear => LinearDerivative,
- Function.QuadraticIn => Quadratic.InDerivative,
- Function.QuadraticOut => Quadratic.OutDerivative,
- Function.QuadraticInOut => Quadratic.InOutDerivative,
- Function.CubicIn => Cubic.InDerivative,
- Function.CubicOut => Cubic.OutDerivative,
- Function.CubicInOut => Cubic.InOutDerivative,
- Function.QuarticIn => Quartic.InDerivative,
- Function.QuarticOut => Quartic.OutDerivative,
- Function.QuarticInOut => Quartic.InOutDerivative,
- Function.QuinticIn => Quintic.InDerivative,
- Function.QuinticOut => Quintic.OutDerivative,
- Function.QuinticInOut => Quintic.InOutDerivative,
- Function.SineIn => Sine.InDerivative,
- Function.SineOut => Sine.OutDerivative,
- Function.SineInOut => Sine.InOutDerivative,
- Function.ExponentialIn => Exponential.InDerivative,
- Function.ExponentialOut => Exponential.OutDerivative,
- Function.ExponentialInOut => Exponential.InOutDerivative,
- Function.CircularIn => Circular.InDerivative,
- Function.CircularOut => Circular.OutDerivative,
- Function.CircularInOut => Circular.InOutDerivative,
- Function.BackIn => Back.InDerivative,
- Function.BackOut => Back.OutDerivative,
- Function.BackInOut => Back.InOutDerivative,
- Function.BounceIn => Bounce.InDerivative,
- Function.BounceOut => Bounce.OutDerivative,
- Function.BounceInOut => Bounce.InOutDerivative,
- Function.ElasticIn => Elastic.InDerivative,
- Function.ElasticOut => Elastic.OutDerivative,
- Function.ElasticInOut => Elastic.InOutDerivative,
- _ => throw new ArgumentOutOfRangeException(nameof(function)),
- };
- }
- /************************************************************************************************************************/
- /// <summary>Returns a linearly interpolated value between the `start` and `end` based on a normalized `value`.</summary>
- /// <remarks>
- /// <list type="bullet">
- /// <item><c>value = 0</c> returns <c>start</c>.</item>
- /// <item><c>value = 0.5</c> returns <c>(start + end) / 2</c>.</item>
- /// <item><c>value = 1</c> returns <c>end</c>.</item>
- /// </list>
- /// This method is identical to <see cref="LerpUnclamped"/>.
- /// </remarks>
- public static float Lerp(float start, float end, float value) => start + (end - start) * value;
- /// <summary>Returns a normalized value indicating how far the `value` is between the `start` and `end`.</summary>
- /// <remarks>
- /// <list type="bullet">
- /// <item><c>value = start</c> returns <c>0</c>.</item>
- /// <item><c>value = (start + end) / 2</c> returns <c>0.5</c>.</item>
- /// <item><c>value = end</c> returns <c>1</c>.</item>
- /// <item><c>start = end</c> returns <c>0</c>.</item>
- /// </list>
- /// This method is like <see cref="InverseLerp"/> except that it doesn't clamp the result between 0 and 1.
- /// </remarks>
- public static float UnLerp(float start, float end, float value)
- => start == end
- ? 0
- : (value - start) / (end - start);
- /************************************************************************************************************************/
- /// <summary>Re-scales the result of the `function` to use a custom range instead of 0 to 1.</summary>
- public static float ReScale(float start, float end, float value, NormalizedDelegate function)
- => Lerp(start, end, function(UnLerp(start, end, value)));
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- #region Linear
- /************************************************************************************************************************/
- /// <summary>Directly returns the `value`. Interpolates the `value` based on the line <c>y = x</c>.</summary>
- public static float Linear(float value) => value;
- /************************************************************************************************************************/
- /// <summary>Returns 1. The derivative of <see cref="Linear(float)"/>.</summary>
- public static float LinearDerivative(float value) => 1;
- /************************************************************************************************************************/
- /// <summary>Directly returns the `value`. Interpolates the `value` based on the line <c>y = x</c>.</summary>
- public static float Linear(float start, float end, float value) => value;
- /************************************************************************************************************************/
- /// <summary>Returns <c>end - start</c>. The derivative of <see cref="Linear(float, float, float)"/>.</summary>
- public static float LinearDerivative(float start, float end, float value) => end - start;
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- #region Quadratic
- /************************************************************************************************************************/
- /// <summary>Functions based on quadratic equations (<c>x^2</c>).</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer/Quadratic
- ///
- public static class Quadratic
- {
- /************************************************************************************************************************/
- /// <summary>Interpolates the `value` based on the line <c>y = x^2</c>.</summary>
- /// <remarks><see href="https://easings.net/#easeInQuad">Easings.net has a graph of this function.</see></remarks>
- public static float In(float value) => value * value;
- /// <summary>Interpolates the `value` based on the line <c>y = 1 - (x - 1)^2</c>.</summary>
- /// <remarks><see href="https://easings.net/#easeOutQuad">Easings.net has a graph of this function.</see></remarks>
- public static float Out(float value)
- {
- value--;
- return -value * value + 1;
- }
- /// <summary>Interpolate using <see cref="In"/> (0 to 0.5) or <see cref="Out"/> (0.5 to 1).</summary>
- /// <remarks><see href="https://easings.net/#easeInOutQuad">Easings.net has a graph of this function.</see></remarks>
- public static float InOut(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 0.5f * value * value;
- }
- else
- {
- value -= 2;
- return 0.5f * (-value * value + 2);
- }
- }
- /************************************************************************************************************************/
- /// <summary>Returns the derivative of <see cref="In(float)"/> (<c>y = 2x</c>).</summary>
- public static float InDerivative(float value) => 2 * value;
- /// <summary>Returns the derivative of <see cref="Out(float)"/> (<c>y = -2x + 2</c>).</summary>
- public static float OutDerivative(float value) => 2 - 2 * value;
- /// <summary>Returns the derivative of <see cref="InOut(float)"/>.</summary>
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 2 * value;
- }
- else
- {
- value--;
- return 2 - 2 * value;
- }
- }
- /************************************************************************************************************************/
- // Ranged Variants.
- /************************************************************************************************************************/
- /// <summary>A variant of <see cref="In(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="Out(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InOut(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
- /************************************************************************************************************************/
- }
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- #region Cubic
- /************************************************************************************************************************/
- /// <summary>Functions based on cubic equations (<c>x^3</c>).</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer/Cubic
- ///
- public static class Cubic
- {
- /************************************************************************************************************************/
- /// <summary>Interpolates the `value` based on the line <c>y = x^3</c>.</summary>
- /// <remarks><see href="https://easings.net/#easeInCubic">Easings.net has a graph of this function.</see></remarks>
- public static float In(float value) => value * value * value;
- /// <summary>Interpolates the `value` based on the line <c>y = 1 + (x - 1)^3</c>.</summary>
- /// <remarks><see href="https://easings.net/#easeOutCubic">Easings.net has a graph of this function.</see></remarks>
- public static float Out(float value)
- {
- value--;
- return value * value * value + 1;
- }
- /// <summary>Interpolate using <see cref="In"/> (0 to 0.5) or <see cref="Out"/> (0.5 to 1).</summary>
- /// <remarks><see href="https://easings.net/#easeInOutCubic">Easings.net has a graph of this function.</see></remarks>
- public static float InOut(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 0.5f * value * value * value;
- }
- else
- {
- value -= 2;
- return 0.5f * (value * value * value + 2);
- }
- }
- /************************************************************************************************************************/
- /// <summary>Returns the derivative of <see cref="In(float)"/> (<c>y = 3x</c>).</summary>
- public static float InDerivative(float value) => 3 * value * value;
- /// <summary>Returns the derivative of <see cref="Out(float)"/> (<c>y = 3 * (x - 1)</c>).</summary>
- public static float OutDerivative(float value)
- {
- value--;
- return 3 * value * value;
- }
- /// <summary>Returns the derivative of <see cref="InOut(float)"/>.</summary>
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 3 * value * value;
- }
- else
- {
- value -= 2;
- return 3 * value * value;
- }
- }
- /************************************************************************************************************************/
- // Ranged Variants.
- /************************************************************************************************************************/
- /// <summary>A variant of <see cref="In(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="Out(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InOut(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
- /************************************************************************************************************************/
- }
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- #region Quartic
- /************************************************************************************************************************/
- /// <summary>Functions based on quartic equations (<c>x^4</c>).</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer/Quartic
- ///
- public static class Quartic
- {
- /************************************************************************************************************************/
- /// <summary>Interpolates the `value` based on the line <c>y = x^4</c>.</summary>
- /// <remarks><see href="https://easings.net/#easeInQuart">Easings.net has a graph of this function.</see></remarks>
- public static float In(float value) => value * value * value * value;
- /// <summary>Interpolates the `value` based on the line <c>y = 1 - (x - 1)^4</c>.</summary>
- /// <remarks><see href="https://easings.net/#easeOutQuart">Easings.net has a graph of this function.</see></remarks>
- public static float Out(float value)
- {
- value--;
- return -value * value * value * value + 1;
- }
- /// <summary>Interpolate using <see cref="In"/> (0 to 0.5) or <see cref="Out"/> (0.5 to 1).</summary>
- /// <remarks><see href="https://easings.net/#easeInOutQuart">Easings.net has a graph of this function.</see></remarks>
- public static float InOut(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 0.5f * value * value * value * value;
- }
- else
- {
- value -= 2;
- return 0.5f * (-value * value * value * value + 2);
- }
- }
- /************************************************************************************************************************/
- /// <summary>Returns the derivative of <see cref="In(float)"/> (<c>y = 4x</c>).</summary>
- public static float InDerivative(float value) => 4 * value * value * value;
- /// <summary>Returns the derivative of <see cref="Out(float)"/> (<c>y = -4 * (x - 1)</c>).</summary>
- public static float OutDerivative(float value)
- {
- value--;
- return -4 * value * value * value;
- }
- /// <summary>Returns the derivative of <see cref="InOut(float)"/>.</summary>
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 4 * value * value * value;
- }
- else
- {
- value -= 2;
- return -4 * value * value * value;
- }
- }
- /************************************************************************************************************************/
- // Ranged Variants.
- /************************************************************************************************************************/
- /// <summary>A variant of <see cref="In(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="Out(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InOut(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
- /************************************************************************************************************************/
- }
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- #region Quintic
- /************************************************************************************************************************/
- /// <summary>Functions based on quintic equations (<c>x^5</c>).</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer/Quintic
- ///
- public static class Quintic
- {
- /************************************************************************************************************************/
- /// <summary>Interpolates the `value` based on the line <c>y = x^5</c>.</summary>
- /// <remarks><see href="https://easings.net/#easeInQuint">Easings.net has a graph of this function.</see></remarks>
- public static float In(float value) => value * value * value * value * value;
- /// <summary>Interpolates the `value` based on the line <c>y = 1 + (x - 1)^5</c>.</summary>
- /// <remarks><see href="https://easings.net/#easeOutQuint">Easings.net has a graph of this function.</see></remarks>
- public static float Out(float value)
- {
- value--;
- return value * value * value * value * value + 1;
- }
- /// <summary>Interpolate using <see cref="In"/> (0 to 0.5) or <see cref="Out"/> (0.5 to 1).</summary>
- /// <remarks><see href="https://easings.net/#easeInOutQuint">Easings.net has a graph of this function.</see></remarks>
- public static float InOut(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 0.5f * value * value * value * value * value;
- }
- else
- {
- value -= 2;
- return 0.5f * (value * value * value * value * value + 2);
- }
- }
- /************************************************************************************************************************/
- /// <summary>Returns the derivative of <see cref="In(float)"/> (<c>y = 5x</c>).</summary>
- public static float InDerivative(float value) => 5 * value * value * value * value;
- /// <summary>Returns the derivative of <see cref="Out(float)"/> (<c>y = -5 * (x - 1)</c>).</summary>
- public static float OutDerivative(float value)
- {
- value--;
- return 5 * value * value * value * value;
- }
- /// <summary>Returns the derivative of <see cref="InOut(float)"/>.</summary>
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 5 * value * value * value * value;
- }
- else
- {
- value -= 2;
- return 5 * value * value * value * value;
- }
- }
- /************************************************************************************************************************/
- // Ranged Variants.
- /************************************************************************************************************************/
- /// <summary>A variant of <see cref="In(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="Out(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InOut(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
- /************************************************************************************************************************/
- }
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- #region Sine
- /************************************************************************************************************************/
- /// <summary>Functions based on sinusoidal equations.</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer/Sine
- ///
- public static class Sine
- {
- /************************************************************************************************************************/
- /// <summary>Interpolates the `value` based on a quarter-cycle of a sine wave.</summary>
- /// <remarks><see href="https://easings.net/#easeInSine">Easings.net has a graph of this function.</see></remarks>
- public static float In(float value) => -Cos(value * (PI * 0.5f)) + 1;
- /// <summary>Interpolates the `value` based on a quarter-cycle of a sine wave.</summary>
- /// <remarks><see href="https://easings.net/#easeOutSine">Easings.net has a graph of this function.</see></remarks>
- public static float Out(float value) => Sin(value * (PI * 0.5f));
- /// <summary>Interpolate using <see cref="In"/> (0 to 0.5) or <see cref="Out"/> (0.5 to 1).</summary>
- /// <remarks><see href="https://easings.net/#easeInOutSine">Easings.net has a graph of this function.</see></remarks>
- public static float InOut(float value) => -0.5f * (Cos(PI * value) - 1);
- /************************************************************************************************************************/
- /// <summary>Returns the derivative of <see cref="In(float)"/>.</summary>
- public static float InDerivative(float value) => 0.5f * PI * Sin(0.5f * PI * value);
- /// <summary>Returns the derivative of <see cref="Out(float)"/>.</summary>
- public static float OutDerivative(float value) => PI * 0.5f * Cos(value * (PI * 0.5f));
- /// <summary>Returns the derivative of <see cref="InOut(float)"/>.</summary>
- public static float InOutDerivative(float value) => 0.5f * PI * Sin(PI * value);
- /************************************************************************************************************************/
- // Ranged Variants.
- /************************************************************************************************************************/
- /// <summary>A variant of <see cref="In(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="Out(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InOut(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
- /************************************************************************************************************************/
- }
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- #region Exponential
- /************************************************************************************************************************/
- /// <summary>Functions based on exponential equations (<c>2^(10(x))</c>).</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer/Exponential
- ///
- public static class Exponential
- {
- /************************************************************************************************************************/
- /// <summary>Interpolates the `value` based on the line (<c>y = 2^(10 * (x - 1))</c>).</summary>
- /// <remarks><see href="https://easings.net/#easeInExpo">Easings.net has a graph of this function.</see></remarks>
- public static float In(float value) => Pow(2, 10 * (value - 1));
- /// <summary>Interpolates the `value` based on the line (<c>y = -2^(-10x) + 1</c>).</summary>
- /// <remarks><see href="https://easings.net/#easeOutExpo">Easings.net has a graph of this function.</see></remarks>
- public static float Out(float value) => -Pow(2, -10 * value) + 1;
- /// <summary>Interpolate using <see cref="In"/> (0 to 0.5) or <see cref="Out"/> (0.5 to 1).</summary>
- /// <remarks><see href="https://easings.net/#easeInOutExpo">Easings.net has a graph of this function.</see></remarks>
- public static float InOut(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 0.5f * Pow(2, 10 * (value - 1));
- }
- else
- {
- value--;
- return 0.5f * (-Pow(2, -10 * value) + 2);
- }
- }
- /************************************************************************************************************************/
- /// <summary>Returns the derivative of <see cref="In(float)"/> (<c>y = 10 * ln(2) * 2^(10 * (x - 1))</c>).</summary>
- public static float InDerivative(float value) => 10 * Ln2 * Pow(2, 10 * (value - 1));
- /// <summary>Returns the derivative of <see cref="Out(float)"/> (<c>y = 5 * ln(2) * 2^(-10 * (x - 1) + 1)</c>).</summary>
- public static float OutDerivative(float value) => 5 * Ln2 * Pow(2, 1 - 10 * value);
- /// <summary>Returns the derivative of <see cref="InOut(float)"/>.</summary>
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 10 * Ln2 * Pow(2, 10 * (value - 1));
- }
- else
- {
- value--;
- return 5 * Ln2 * Pow(2, 1 - 10 * value);
- }
- }
- /************************************************************************************************************************/
- // Ranged Variants.
- /************************************************************************************************************************/
- /// <summary>A variant of <see cref="In(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="Out(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InOut(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
- /************************************************************************************************************************/
- }
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- #region Circular
- /************************************************************************************************************************/
- /// <summary>Functions based on circular equations.</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer/Circular
- ///
- public static class Circular
- {
- /************************************************************************************************************************/
- /// <summary>Interpolates the `value` based on a shifted quadrant IV of a unit circle.</summary>
- /// <remarks><see href="https://easings.net/#easeInCirc">Easings.net has a graph of this function.</see></remarks>
- public static float In(float value) => -(Sqrt(1 - value * value) - 1);
- /// <summary>Interpolates the `value` based on a shifted quadrant II of a unit circle.</summary>
- /// <remarks><see href="https://easings.net/#easeOutCirc">Easings.net has a graph of this function.</see></remarks>
- public static float Out(float value)
- {
- value--;
- return Sqrt(1 - value * value);
- }
- /// <summary>Interpolate using <see cref="In"/> (0 to 0.5) or <see cref="Out"/> (0.5 to 1).</summary>
- /// <remarks><see href="https://easings.net/#easeInOutCirc">Easings.net has a graph of this function.</see></remarks>
- public static float InOut(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return -0.5f * (Sqrt(1 - value * value) - 1);
- }
- else
- {
- value -= 2;
- return 0.5f * (Sqrt(1 - value * value) + 1);
- }
- }
- /************************************************************************************************************************/
- /// <summary>Returns the derivative of <see cref="In(float)"/>.</summary>
- public static float InDerivative(float value) => value / Sqrt(1 - value * value);
- /// <summary>Returns the derivative of <see cref="Out(float)"/>.</summary>
- public static float OutDerivative(float value)
- {
- value--;
- return -value / Sqrt(1 - value * value);
- }
- /// <summary>Returns the derivative of <see cref="InOut(float)"/>.</summary>
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return value / (2 * Sqrt(1 - value * value));
- }
- else
- {
- value -= 2;
- return -value / (2 * Sqrt(1 - value * value));
- }
- }
- /************************************************************************************************************************/
- // Ranged Variants.
- /************************************************************************************************************************/
- /// <summary>A variant of <see cref="In(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="Out(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InOut(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
- /************************************************************************************************************************/
- }
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- #region Back
- /************************************************************************************************************************/
- /// <summary>Functions based on equations which go out of bounds then come back.</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer/Back
- ///
- public static class Back
- {
- /************************************************************************************************************************/
- private const float C = 1.758f;
- /************************************************************************************************************************/
- /// <remarks><see href="https://easings.net/#easeInBack">Easings.net has a graph of this function.</see></remarks>
- public static float In(float value) => value * value * ((C + 1) * value - C);
- /// <remarks><see href="https://easings.net/#easeOutBack">Easings.net has a graph of this function.</see></remarks>
- public static float Out(float value)
- {
- value -= 1;
- return value * value * ((C + 1) * value + C) + 1;
- }
- /// <summary>Interpolate using <see cref="In"/> (0 to 0.5) or <see cref="Out"/> (0.5 to 1).</summary>
- /// <remarks><see href="https://easings.net/#easeInOutBack">Easings.net has a graph of this function.</see></remarks>
- public static float InOut(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 0.5f * value * value * ((C + 1) * value - C);
- }
- else
- {
- value -= 2;
- return 0.5f * (value * value * ((C + 1) * value + C) + 2);
- }
- }
- /************************************************************************************************************************/
- /// <summary>Returns the derivative of <see cref="In(float)"/>.</summary>
- public static float InDerivative(float value) => 3 * (C + 1) * value * value - 2 * C * value;
- /// <summary>Returns the derivative of <see cref="Out(float)"/>.</summary>
- public static float OutDerivative(float value)
- {
- value -= 1;
- return (C + 1) * value * value + 2 * value * ((C + 1) * value + C);
- }
- /// <summary>Returns the derivative of <see cref="InOut(float)"/>.</summary>
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 3 * (C + 1) * value * value - 2 * C * value;
- }
- else
- {
- value -= 2;
- return (C + 1) * value * value + 2 * value * ((C + 1) * value + C);
- }
- }
- /************************************************************************************************************************/
- // Ranged Variants.
- /************************************************************************************************************************/
- /// <summary>A variant of <see cref="In(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="Out(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InOut(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
- /************************************************************************************************************************/
- }
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- #region Bounce
- /************************************************************************************************************************/
- /// <summary>Functions based on equations with sharp bounces.</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer/Bounce
- ///
- public static class Bounce
- {
- /************************************************************************************************************************/
- /// <remarks><see href="https://easings.net/#easeInBounce">Easings.net has a graph of this function.</see></remarks>
- public static float In(float value)
- {
- return 1 - Out(1 - value);
- }
- /// <remarks><see href="https://easings.net/#easeOutBounce">Easings.net has a graph of this function.</see></remarks>
- public static float Out(float value)
- {
- switch (value)
- {
- case 0: return 0;
- case 1: return 1;
- }
- if (value < (1f / 2.75f))
- {
- return 7.5625f * value * value;
- }
- else if (value < (2f / 2.75f))
- {
- value -= 1.5f / 2.75f;
- return 7.5625f * value * value + 0.75f;
- }
- else if (value < (2.5f / 2.75f))
- {
- value -= 2.25f / 2.75f;
- return 7.5625f * value * value + 0.9375f;
- }
- else
- {
- value -= 2.625f / 2.75f;
- return 7.5625f * value * value + 0.984375f;
- }
- }
- /// <summary>Interpolate using <see cref="In"/> (0 to 0.5) or <see cref="Out"/> (0.5 to 1).</summary>
- /// <remarks><see href="https://easings.net/#easeInOutBounce">Easings.net has a graph of this function.</see></remarks>
- public static float InOut(float value)
- {
- if (value < 0.5f)
- return 0.5f * In(value * 2);
- else
- return 0.5f + 0.5f * Out(value * 2 - 1);
- }
- /************************************************************************************************************************/
- /// <summary>Returns the derivative of <see cref="In(float)"/>.</summary>
- public static float InDerivative(float value) => OutDerivative(1 - value);
- /// <summary>Returns the derivative of <see cref="Out(float)"/>.</summary>
- public static float OutDerivative(float value)
- {
- if (value < (1f / 2.75f))
- {
- return 2 * 7.5625f * value;
- }
- else if (value < (2f / 2.75f))
- {
- value -= 1.5f / 2.75f;
- return 2 * 7.5625f * value;
- }
- else if (value < (2.5f / 2.75f))
- {
- value -= 2.25f / 2.75f;
- return 2 * 7.5625f * value;
- }
- else
- {
- value -= 2.625f / 2.75f;
- return 2 * 7.5625f * value;
- }
- }
- /// <summary>Returns the derivative of <see cref="InOut(float)"/>.</summary>
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- return OutDerivative(1 - value);
- else
- return OutDerivative(value - 1);
- }
- /************************************************************************************************************************/
- // Ranged Variants.
- /************************************************************************************************************************/
- /// <summary>A variant of <see cref="In(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="Out(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InOut(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
- /************************************************************************************************************************/
- }
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- #region Elastic
- /************************************************************************************************************************/
- /// <summary>Functions based on equations with soft bounces.</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer/Elastic
- ///
- public static class Elastic
- {
- /************************************************************************************************************************/
- /// <summary><c>2 / 3 * pi</c></summary>
- public const float TwoThirdsPi = 2f / 3f * PI;
- /************************************************************************************************************************/
- /// <remarks><see href="https://easings.net/#easeInElastic">Easings.net has a graph of this function.</see></remarks>
- public static float In(float value)
- {
- return value switch
- {
- 0 => 0,
- 1 => 1,
- _ => -Pow(2, 10 * value - 10) * Sin((value * 10 - 10.75f) * TwoThirdsPi),
- };
- }
- /// <remarks><see href="https://easings.net/#easeOutElastic">Easings.net has a graph of this function.</see></remarks>
- public static float Out(float value)
- {
- return value switch
- {
- 0 => 0,
- 1 => 1,
- _ => 1 + Pow(2, -10 * value) * Sin((value * -10 - 0.75f) * TwoThirdsPi),
- };
- }
- /// <summary>Interpolate using <see cref="In"/> (0 to 0.5) or <see cref="Out"/> (0.5 to 1).</summary>
- /// <remarks><see href="https://easings.net/#easeInOutElastic">Easings.net has a graph of this function.</see></remarks>
- public static float InOut(float value)
- {
- switch (value)
- {
- case 0: return 0;
- case 0.5f: return 0.5f;
- case 1: return 1;
- }
- value *= 2;
- if (value <= 1)
- {
- return 0.5f * (-Pow(2, 10 * value - 10) * Sin((value * 10 - 10.75f) * TwoThirdsPi));
- }
- else
- {
- value--;
- return 0.5f + 0.5f * (1 + Pow(2, -10 * value) * Sin((value * -10 - 0.75f) * TwoThirdsPi));
- }
- }
- /************************************************************************************************************************/
- /// <summary>Returns the derivative of <see cref="In(float)"/>.</summary>
- public static float InDerivative(float value)
- {
- return -(5 * Pow(2, 10 * value - 9) *
- (3 * Ln2 * Sin(PI * (40 * value - 43) / 6) +
- 2 * PI * Cos(PI * (40 * value - 43) / 6))) / 3;
- }
- /// <summary>Returns the derivative of <see cref="Out(float)"/>.</summary>
- public static float OutDerivative(float value)
- {
- return -(30 * Ln2 * Sin(2 * PI * (10 * value - 3f / 4f) / 3) -
- 20 * PI * Cos(2 * PI * (10 * value - 3f / 4f) / 3)) /
- (3 * Pow(2, 10 * value));
- }
- /// <summary>Returns the derivative of <see cref="InOut(float)"/>.</summary>
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- return OutDerivative(1 - value);
- else
- return OutDerivative(value - 1);
- }
- /************************************************************************************************************************/
- // Ranged Variants.
- /************************************************************************************************************************/
- /// <summary>A variant of <see cref="In(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="Out(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InOut(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
- /// <summary>A variant of <see cref="InDerivative(float)"/> with a custom range instead of 0 to 1.</summary>
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
- /************************************************************************************************************************/
- }
- /************************************************************************************************************************/
- #endregion
- /************************************************************************************************************************/
- }
- }
|