123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338 |
- using System;
- using static UnityEngine.Mathf;
- using NormalizedDelegate = System.Func<float, float>;
- namespace Animancer
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public static class Easing
- {
-
- #region Delegates
-
-
- public const float Ln2 = 0.693147180559945f;
-
-
- public delegate float RangedDelegate(float start, float end, float value);
-
-
-
-
-
- public enum Function
- {
-
- Linear,
-
- QuadraticIn,
-
- QuadraticOut,
-
- QuadraticInOut,
-
- CubicIn,
-
- CubicOut,
-
- CubicInOut,
-
- QuarticIn,
-
- QuarticOut,
-
- QuarticInOut,
-
- QuinticIn,
-
- QuinticOut,
-
- QuinticInOut,
-
- SineIn,
-
- SineOut,
-
- SineInOut,
-
- ExponentialIn,
-
- ExponentialOut,
-
- ExponentialInOut,
-
- CircularIn,
-
- CircularOut,
-
- CircularInOut,
-
- BackIn,
-
- BackOut,
-
- BackInOut,
-
- BounceIn,
-
- BounceOut,
-
- BounceInOut,
-
- ElasticIn,
-
- ElasticOut,
-
- ElasticInOut,
- }
-
- public const int FunctionCount = (int)Function.ElasticInOut + 1;
-
- private static NormalizedDelegate[] _FunctionDelegates;
-
-
-
- public static NormalizedDelegate GetDelegate(this Function function)
- {
- var i = (int)function;
- NormalizedDelegate del;
- if (_FunctionDelegates == null)
- {
- _FunctionDelegates = new NormalizedDelegate[FunctionCount];
- }
- else
- {
- del = _FunctionDelegates[i];
- if (del != null)
- return del;
- }
- switch (function)
- {
- case Function.Linear: del = Linear; break;
- case Function.QuadraticIn: del = Quadratic.In; break;
- case Function.QuadraticOut: del = Quadratic.Out; break;
- case Function.QuadraticInOut: del = Quadratic.InOut; break;
- case Function.CubicIn: del = Cubic.In; break;
- case Function.CubicOut: del = Cubic.Out; break;
- case Function.CubicInOut: del = Cubic.InOut; break;
- case Function.QuarticIn: del = Quartic.In; break;
- case Function.QuarticOut: del = Quartic.Out; break;
- case Function.QuarticInOut: del = Quartic.InOut; break;
- case Function.QuinticIn: del = Quintic.In; break;
- case Function.QuinticOut: del = Quintic.Out; break;
- case Function.QuinticInOut: del = Quintic.InOut; break;
- case Function.SineIn: del = Sine.In; break;
- case Function.SineOut: del = Sine.Out; break;
- case Function.SineInOut: del = Sine.InOut; break;
- case Function.ExponentialIn: del = Exponential.In; break;
- case Function.ExponentialOut: del = Exponential.Out; break;
- case Function.ExponentialInOut: del = Exponential.InOut; break;
- case Function.CircularIn: del = Circular.In; break;
- case Function.CircularOut: del = Circular.Out; break;
- case Function.CircularInOut: del = Circular.InOut; break;
- case Function.BackIn: del = Back.In; break;
- case Function.BackOut: del = Back.Out; break;
- case Function.BackInOut: del = Back.InOut; break;
- case Function.BounceIn: del = Bounce.In; break;
- case Function.BounceOut: del = Bounce.Out; break;
- case Function.BounceInOut: del = Bounce.InOut; break;
- case Function.ElasticIn: del = Elastic.In; break;
- case Function.ElasticOut: del = Elastic.Out; break;
- case Function.ElasticInOut: del = Elastic.InOut; break;
- default: throw new ArgumentOutOfRangeException(nameof(function));
- }
- _FunctionDelegates[i] = del;
- return del;
- }
-
- private static NormalizedDelegate[] _DerivativeDelegates;
-
-
-
- public static NormalizedDelegate GetDerivativeDelegate(this Function function)
- {
- var i = (int)function;
- NormalizedDelegate del;
- if (_DerivativeDelegates == null)
- {
- _DerivativeDelegates = new NormalizedDelegate[FunctionCount];
- }
- else
- {
- del = _DerivativeDelegates[i];
- if (del != null)
- return del;
- }
- switch (function)
- {
- case Function.Linear: del = LinearDerivative; break;
- case Function.QuadraticIn: del = Quadratic.InDerivative; break;
- case Function.QuadraticOut: del = Quadratic.OutDerivative; break;
- case Function.QuadraticInOut: del = Quadratic.InOutDerivative; break;
- case Function.CubicIn: del = Cubic.InDerivative; break;
- case Function.CubicOut: del = Cubic.OutDerivative; break;
- case Function.CubicInOut: del = Cubic.InOutDerivative; break;
- case Function.QuarticIn: del = Quartic.InDerivative; break;
- case Function.QuarticOut: del = Quartic.OutDerivative; break;
- case Function.QuarticInOut: del = Quartic.InOutDerivative; break;
- case Function.QuinticIn: del = Quintic.InDerivative; break;
- case Function.QuinticOut: del = Quintic.OutDerivative; break;
- case Function.QuinticInOut: del = Quintic.InOutDerivative; break;
- case Function.SineIn: del = Sine.InDerivative; break;
- case Function.SineOut: del = Sine.OutDerivative; break;
- case Function.SineInOut: del = Sine.InOutDerivative; break;
- case Function.ExponentialIn: del = Exponential.InDerivative; break;
- case Function.ExponentialOut: del = Exponential.OutDerivative; break;
- case Function.ExponentialInOut: del = Exponential.InOutDerivative; break;
- case Function.CircularIn: del = Circular.InDerivative; break;
- case Function.CircularOut: del = Circular.OutDerivative; break;
- case Function.CircularInOut: del = Circular.InOutDerivative; break;
- case Function.BackIn: del = Back.InDerivative; break;
- case Function.BackOut: del = Back.OutDerivative; break;
- case Function.BackInOut: del = Back.InOutDerivative; break;
- case Function.BounceIn: del = Bounce.InDerivative; break;
- case Function.BounceOut: del = Bounce.OutDerivative; break;
- case Function.BounceInOut: del = Bounce.InOutDerivative; break;
- case Function.ElasticIn: del = Elastic.InDerivative; break;
- case Function.ElasticOut: del = Elastic.OutDerivative; break;
- case Function.ElasticInOut: del = Elastic.InOutDerivative; break;
- default: throw new ArgumentOutOfRangeException(nameof(function));
- }
- _DerivativeDelegates[i] = del;
- return del;
- }
-
- private static RangedDelegate[] _RangedFunctionDelegates;
-
-
-
- public static RangedDelegate GetRangedDelegate(this Function function)
- {
- var i = (int)function;
- RangedDelegate del;
- if (_RangedFunctionDelegates == null)
- {
- _RangedFunctionDelegates = new RangedDelegate[FunctionCount];
- }
- else
- {
- del = _RangedFunctionDelegates[i];
- if (del != null)
- return del;
- }
- switch (function)
- {
- case Function.Linear: del = Linear; break;
- case Function.QuadraticIn: del = Quadratic.In; break;
- case Function.QuadraticOut: del = Quadratic.Out; break;
- case Function.QuadraticInOut: del = Quadratic.InOut; break;
- case Function.CubicIn: del = Cubic.In; break;
- case Function.CubicOut: del = Cubic.Out; break;
- case Function.CubicInOut: del = Cubic.InOut; break;
- case Function.QuarticIn: del = Quartic.In; break;
- case Function.QuarticOut: del = Quartic.Out; break;
- case Function.QuarticInOut: del = Quartic.InOut; break;
- case Function.QuinticIn: del = Quintic.In; break;
- case Function.QuinticOut: del = Quintic.Out; break;
- case Function.QuinticInOut: del = Quintic.InOut; break;
- case Function.SineIn: del = Sine.In; break;
- case Function.SineOut: del = Sine.Out; break;
- case Function.SineInOut: del = Sine.InOut; break;
- case Function.ExponentialIn: del = Exponential.In; break;
- case Function.ExponentialOut: del = Exponential.Out; break;
- case Function.ExponentialInOut: del = Exponential.InOut; break;
- case Function.CircularIn: del = Circular.In; break;
- case Function.CircularOut: del = Circular.Out; break;
- case Function.CircularInOut: del = Circular.InOut; break;
- case Function.BackIn: del = Back.In; break;
- case Function.BackOut: del = Back.Out; break;
- case Function.BackInOut: del = Back.InOut; break;
- case Function.BounceIn: del = Bounce.In; break;
- case Function.BounceOut: del = Bounce.Out; break;
- case Function.BounceInOut: del = Bounce.InOut; break;
- case Function.ElasticIn: del = Elastic.In; break;
- case Function.ElasticOut: del = Elastic.Out; break;
- case Function.ElasticInOut: del = Elastic.InOut; break;
- default: throw new ArgumentOutOfRangeException(nameof(function));
- }
- _RangedFunctionDelegates[i] = del;
- return del;
- }
-
- private static RangedDelegate[] _RangedDerivativeDelegates;
-
-
-
- public static RangedDelegate GetRangedDerivativeDelegate(this Function function)
- {
- var i = (int)function;
- RangedDelegate del;
- if (_RangedDerivativeDelegates == null)
- {
- _RangedDerivativeDelegates = new RangedDelegate[FunctionCount];
- }
- else
- {
- del = _RangedDerivativeDelegates[i];
- if (del != null)
- return del;
- }
- switch (function)
- {
- case Function.Linear: del = LinearDerivative; break;
- case Function.QuadraticIn: del = Quadratic.InDerivative; break;
- case Function.QuadraticOut: del = Quadratic.OutDerivative; break;
- case Function.QuadraticInOut: del = Quadratic.InOutDerivative; break;
- case Function.CubicIn: del = Cubic.InDerivative; break;
- case Function.CubicOut: del = Cubic.OutDerivative; break;
- case Function.CubicInOut: del = Cubic.InOutDerivative; break;
- case Function.QuarticIn: del = Quartic.InDerivative; break;
- case Function.QuarticOut: del = Quartic.OutDerivative; break;
- case Function.QuarticInOut: del = Quartic.InOutDerivative; break;
- case Function.QuinticIn: del = Quintic.InDerivative; break;
- case Function.QuinticOut: del = Quintic.OutDerivative; break;
- case Function.QuinticInOut: del = Quintic.InOutDerivative; break;
- case Function.SineIn: del = Sine.InDerivative; break;
- case Function.SineOut: del = Sine.OutDerivative; break;
- case Function.SineInOut: del = Sine.InOutDerivative; break;
- case Function.ExponentialIn: del = Exponential.InDerivative; break;
- case Function.ExponentialOut: del = Exponential.OutDerivative; break;
- case Function.ExponentialInOut: del = Exponential.InOutDerivative; break;
- case Function.CircularIn: del = Circular.InDerivative; break;
- case Function.CircularOut: del = Circular.OutDerivative; break;
- case Function.CircularInOut: del = Circular.InOutDerivative; break;
- case Function.BackIn: del = Back.InDerivative; break;
- case Function.BackOut: del = Back.OutDerivative; break;
- case Function.BackInOut: del = Back.InOutDerivative; break;
- case Function.BounceIn: del = Bounce.InDerivative; break;
- case Function.BounceOut: del = Bounce.OutDerivative; break;
- case Function.BounceInOut: del = Bounce.InOutDerivative; break;
- case Function.ElasticIn: del = Elastic.InDerivative; break;
- case Function.ElasticOut: del = Elastic.OutDerivative; break;
- case Function.ElasticInOut: del = Elastic.InOutDerivative; break;
- default: throw new ArgumentOutOfRangeException(nameof(function));
- }
- _RangedDerivativeDelegates[i] = del;
- return del;
- }
-
-
-
-
-
-
-
-
-
-
- public static float Lerp(float start, float end, float value) => start + (end - start) * value;
-
-
-
-
-
-
-
-
-
-
- public static float UnLerp(float start, float end, float value) => start == end ? 0 : (value - start) / (end - start);
-
-
- public static float ReScale(float start, float end, float value, NormalizedDelegate function)
- => Lerp(start, end, function(UnLerp(start, end, value)));
-
- #endregion
-
- #region Linear
-
-
- public static float Linear(float value) => value;
-
-
- public static float LinearDerivative(float value) => 1;
-
-
- public static float Linear(float start, float end, float value) => value;
-
-
- public static float LinearDerivative(float start, float end, float value) => end - start;
-
- #endregion
-
- #region Quadratic
-
-
-
-
- public static class Quadratic
- {
-
-
-
- public static float In(float value) => value * value;
-
-
- public static float Out(float value)
- {
- value--;
- return -value * value + 1;
- }
-
-
- 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);
- }
- }
-
-
- public static float InDerivative(float value) => 2 * value;
-
- public static float OutDerivative(float value) => 2 - 2 * value;
-
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 2 * value;
- }
- else
- {
- value--;
- return 2 - 2 * value;
- }
- }
-
-
-
-
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
-
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
-
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
-
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
-
- }
-
- #endregion
-
- #region Cubic
-
-
-
-
- public static class Cubic
- {
-
-
-
- public static float In(float value) => value * value * value;
-
-
- public static float Out(float value)
- {
- value--;
- return value * value * value + 1;
- }
-
-
- 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);
- }
- }
-
-
- public static float InDerivative(float value) => 3 * value * value;
-
- public static float OutDerivative(float value)
- {
- value--;
- return 3 * value * value;
- }
-
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 3 * value * value;
- }
- else
- {
- value -= 2;
- return 3 * value * value;
- }
- }
-
-
-
-
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
-
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
-
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
-
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
-
- }
-
- #endregion
-
- #region Quartic
-
-
-
-
- public static class Quartic
- {
-
-
-
- public static float In(float value) => value * value * value * value;
-
-
- public static float Out(float value)
- {
- value--;
- return -value * value * value * value + 1;
- }
-
-
- 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);
- }
- }
-
-
- public static float InDerivative(float value) => 4 * value * value * value;
-
- public static float OutDerivative(float value)
- {
- value--;
- return -4 * value * value * value;
- }
-
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- {
- return 4 * value * value * value;
- }
- else
- {
- value -= 2;
- return -4 * value * value * value;
- }
- }
-
-
-
-
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
-
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
-
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
-
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
-
- }
-
- #endregion
-
- #region Quintic
-
-
-
-
- public static class Quintic
- {
-
-
-
- public static float In(float value) => value * value * value * value * value;
-
-
- public static float Out(float value)
- {
- value--;
- return value * value * value * value * value + 1;
- }
-
-
- 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);
- }
- }
-
-
- public static float InDerivative(float value) => 5 * value * value * value * value;
-
- public static float OutDerivative(float value)
- {
- value--;
- return 5 * value * value * value * value;
- }
-
- 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;
- }
- }
-
-
-
-
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
-
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
-
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
-
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
-
- }
-
- #endregion
-
- #region Sine
-
-
-
-
- public static class Sine
- {
-
-
-
- public static float In(float value) => -Cos(value * (PI * 0.5f)) + 1;
-
-
- public static float Out(float value) => Sin(value * (PI * 0.5f));
-
-
- public static float InOut(float value) => -0.5f * (Cos(PI * value) - 1);
-
-
- public static float InDerivative(float value) => 0.5f * PI * Sin(0.5f * PI * value);
-
- public static float OutDerivative(float value) => PI * 0.5f * Cos(value * (PI * 0.5f));
-
- public static float InOutDerivative(float value) => 0.5f * PI * Sin(PI * value);
-
-
-
-
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
-
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
-
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
-
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
-
- }
-
- #endregion
-
- #region Exponential
-
-
-
-
- public static class Exponential
- {
-
-
-
- public static float In(float value) => Pow(2, 10 * (value - 1));
-
-
- public static float Out(float value) => -Pow(2, -10 * value) + 1;
-
-
- 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);
- }
- }
-
-
- public static float InDerivative(float value) => 10 * Ln2 * Pow(2, 10 * (value - 1));
-
- public static float OutDerivative(float value) => 5 * Ln2 * Pow(2, 1 - 10 * value);
-
- 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);
- }
- }
-
-
-
-
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
-
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
-
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
-
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
-
- }
-
- #endregion
-
- #region Circular
-
-
-
-
- public static class Circular
- {
-
-
-
- public static float In(float value) => -(Sqrt(1 - value * value) - 1);
-
-
- public static float Out(float value)
- {
- value--;
- return Sqrt(1 - value * value);
- }
-
-
- 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);
- }
- }
-
-
- public static float InDerivative(float value) => value / Sqrt(1 - value * value);
-
- public static float OutDerivative(float value)
- {
- value--;
- return -value / Sqrt(1 - value * value);
- }
-
- 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));
- }
- }
-
-
-
-
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
-
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
-
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
-
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
-
- }
-
- #endregion
-
- #region Back
-
-
-
-
- public static class Back
- {
-
- private const float C = 1.758f;
-
-
- public static float In(float value) => value * value * ((C + 1) * value - C);
-
- public static float Out(float value)
- {
- value -= 1;
- return value * value * ((C + 1) * value + C) + 1;
- }
-
-
- 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);
- }
- }
-
-
- public static float InDerivative(float value) => 3 * (C + 1) * value * value - 2 * C * value;
-
- public static float OutDerivative(float value)
- {
- value -= 1;
- return (C + 1) * value * value + 2 * value * ((C + 1) * value + C);
- }
-
- 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);
- }
- }
-
-
-
-
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
-
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
-
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
-
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
-
- }
-
- #endregion
-
- #region Bounce
-
-
-
-
- public static class Bounce
- {
-
-
- public static float In(float value)
- {
- return 1 - Out(1 - value);
- }
-
- 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;
- }
- }
-
-
- 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);
- }
-
-
- public static float InDerivative(float value) => OutDerivative(1 - value);
-
- 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;
- }
- }
-
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- return OutDerivative(1 - value);
- else
- return OutDerivative(value - 1);
- }
-
-
-
-
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
-
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
-
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
-
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
-
- }
-
- #endregion
-
- #region Elastic
-
-
-
-
- public static class Elastic
- {
-
-
- public const float TwoThirdsPi = 2f / 3f * PI;
-
-
- public static float In(float value)
- {
- switch (value)
- {
- case 0: return 0;
- case 1: return 1;
- }
- return -Pow(2, 10 * value - 10) * Sin((value * 10 - 10.75f) * TwoThirdsPi);
- }
-
- public static float Out(float value)
- {
- switch (value)
- {
- case 0: return 0;
- case 1: return 1;
- }
- return 1 + Pow(2, -10 * value) * Sin((value * -10 - 0.75f) * TwoThirdsPi);
- }
-
-
- 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));
- }
- }
-
-
- 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;
- }
-
- 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));
- }
-
- public static float InOutDerivative(float value)
- {
- value *= 2;
- if (value <= 1)
- return OutDerivative(1 - value);
- else
- return OutDerivative(value - 1);
- }
-
-
-
-
- public static float In(float start, float end, float value) => Lerp(start, end, In(UnLerp(start, end, value)));
-
- public static float Out(float start, float end, float value) => Lerp(start, end, Out(UnLerp(start, end, value)));
-
- public static float InOut(float start, float end, float value) => Lerp(start, end, InOut(UnLerp(start, end, value)));
-
- public static float InDerivative(float start, float end, float value) => InDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float OutDerivative(float start, float end, float value) => OutDerivative(UnLerp(start, end, value)) * (end - start);
-
- public static float InOutDerivative(float start, float end, float value) => InOutDerivative(UnLerp(start, end, value)) * (end - start);
-
- }
-
- #endregion
-
- }
- }
|