//These functions assume 'position' is of the _scale_ (0.0 to 1.0), though they can be outside that _range_.
//For consistency, this 'Coverts' an EaseIn function to... an EaseIn function. It doesn't actually do anything.
inline float DoEaseIn(EaseFunction easeFunction, float position) { return easeFunction(position); }
//Converts a EaseIn function to an EaseOut function.
float DoEaseOut(EaseFunction easeFunction, float position)
{
float result = easeFunction(1.0f - position);
return (1.0f - result);
}
//Converts a EaseIn function to an EaseInOut function.
float DoEaseInOut(EaseFunction easeFunction, float position)
{
//If less than halfway, Ease-In.
if(position < 0.5f)
{
//Doubles the positon to scales it from (0.0 - 0.5) to (0.0 - 1.0)
float result = easeFunction(position * 2.0f);
//Scale to (0.0 - 0.5), by halfing the result.
return (result * 0.5f);
}
//If more than halfway, Ease-Out.
else
{
//Scales the position from (0.5 - 1.0) to (0.0 - 1.0)
float result = DoEaseOut(easeFunction, (position * 2.0f) - 1.0f);
//Scale to (0.5 - 1.0), by halfing the result and then adding half.
return (result * 0.5f) + 0.5f;
}
}
//Converts an EaseIn function to an EaseOutIn function.
float DoEaseOutIn(EaseFunction easeFunction, float position)
{
//If less than halfway, Ease-Out.
if(position < 0.5f)
{
//Doubles the positon to scales it from (0.0 - 0.5) to (0.0 - 1.0)
float result = DoEaseOut(easeFunction, position * 2.0f);
//Scale to (0.0 - 0.5), by halfing the result.
return (result * 0.5f);
}
//If more than halfway, Ease-In.
else
{
//Scales the position from (0.5 - 1.0) to (0.0 - 1.0)
float result = easeFunction((position * 2.0f) - 1.0f);
//Scale to (0.5 - 1.0), by halfing the result and then adding half.
return (result * 0.5f) + 0.5f;
}
}
Ly9UaGVzZSBmdW5jdGlvbnMgYXNzdW1lICdwb3NpdGlvbicgaXMgb2YgdGhlIF9zY2FsZV8gKDAuMCB0byAxLjApLCB0aG91Z2ggdGhleSBjYW4gYmUgb3V0c2lkZSB0aGF0IF9yYW5nZV8uCgovL0ZvciBjb25zaXN0ZW5jeSwgdGhpcyAnQ292ZXJ0cycgYW4gRWFzZUluIGZ1bmN0aW9uIHRvLi4uIGFuIEVhc2VJbiBmdW5jdGlvbi4gSXQgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZy4KaW5saW5lIGZsb2F0IERvRWFzZUluKEVhc2VGdW5jdGlvbiBlYXNlRnVuY3Rpb24sIGZsb2F0IHBvc2l0aW9uKSB7IHJldHVybiBlYXNlRnVuY3Rpb24ocG9zaXRpb24pOyB9CgovL0NvbnZlcnRzIGEgRWFzZUluIGZ1bmN0aW9uIHRvIGFuIEVhc2VPdXQgZnVuY3Rpb24uCmZsb2F0IERvRWFzZU91dChFYXNlRnVuY3Rpb24gZWFzZUZ1bmN0aW9uLCBmbG9hdCBwb3NpdGlvbikKewogICAgZmxvYXQgcmVzdWx0ID0gZWFzZUZ1bmN0aW9uKDEuMGYgLSBwb3NpdGlvbik7CiAgICByZXR1cm4gKDEuMGYgLSByZXN1bHQpOwp9CgovL0NvbnZlcnRzIGEgRWFzZUluIGZ1bmN0aW9uIHRvIGFuIEVhc2VJbk91dCBmdW5jdGlvbi4KZmxvYXQgRG9FYXNlSW5PdXQoRWFzZUZ1bmN0aW9uIGVhc2VGdW5jdGlvbiwgZmxvYXQgcG9zaXRpb24pCnsKICAgIC8vSWYgbGVzcyB0aGFuIGhhbGZ3YXksIEVhc2UtSW4uCiAgICBpZihwb3NpdGlvbiA8IDAuNWYpCiAgICB7CiAgICAgICAgLy9Eb3VibGVzIHRoZSBwb3NpdG9uIHRvIHNjYWxlcyBpdCBmcm9tICgwLjAgLSAwLjUpIHRvICgwLjAgLSAxLjApCiAgICAgICAgZmxvYXQgcmVzdWx0ID0gZWFzZUZ1bmN0aW9uKHBvc2l0aW9uICogMi4wZik7IAogICAgICAgIAogICAgICAgIC8vU2NhbGUgdG8gKDAuMCAtIDAuNSksIGJ5IGhhbGZpbmcgdGhlIHJlc3VsdC4KICAgICAgICByZXR1cm4gKHJlc3VsdCAqIDAuNWYpOwogICAgfQogICAgLy9JZiBtb3JlIHRoYW4gaGFsZndheSwgRWFzZS1PdXQuCiAgICBlbHNlCiAgICB7CiAgICAgICAgLy9TY2FsZXMgdGhlIHBvc2l0aW9uIGZyb20gKDAuNSAtIDEuMCkgdG8gKDAuMCAtIDEuMCkKICAgICAgICBmbG9hdCByZXN1bHQgPSBEb0Vhc2VPdXQoZWFzZUZ1bmN0aW9uLCAocG9zaXRpb24gKiAyLjBmKSAtIDEuMGYpOwogICAgICAgIAogICAgICAgIC8vU2NhbGUgdG8gKDAuNSAtIDEuMCksIGJ5IGhhbGZpbmcgdGhlIHJlc3VsdCBhbmQgdGhlbiBhZGRpbmcgaGFsZi4KICAgICAgICByZXR1cm4gKHJlc3VsdCAqIDAuNWYpICsgMC41ZjsKICAgIH0KfQoKLy9Db252ZXJ0cyBhbiBFYXNlSW4gZnVuY3Rpb24gdG8gYW4gRWFzZU91dEluIGZ1bmN0aW9uLiAKZmxvYXQgRG9FYXNlT3V0SW4oRWFzZUZ1bmN0aW9uIGVhc2VGdW5jdGlvbiwgZmxvYXQgcG9zaXRpb24pCnsKICAgIC8vSWYgbGVzcyB0aGFuIGhhbGZ3YXksIEVhc2UtT3V0LgogICAgaWYocG9zaXRpb24gPCAwLjVmKQogICAgewogICAgICAgIC8vRG91YmxlcyB0aGUgcG9zaXRvbiB0byBzY2FsZXMgaXQgZnJvbSAoMC4wIC0gMC41KSB0byAoMC4wIC0gMS4wKQogICAgICAgIGZsb2F0IHJlc3VsdCA9IERvRWFzZU91dChlYXNlRnVuY3Rpb24sIHBvc2l0aW9uICogMi4wZik7CiAgICAgICAgCiAgICAgICAgLy9TY2FsZSB0byAoMC4wIC0gMC41KSwgYnkgaGFsZmluZyB0aGUgcmVzdWx0LgogICAgICAgIHJldHVybiAocmVzdWx0ICogMC41Zik7CiAgICB9CiAgICAvL0lmIG1vcmUgdGhhbiBoYWxmd2F5LCBFYXNlLUluLgogICAgZWxzZQogICAgewogICAgICAgIC8vU2NhbGVzIHRoZSBwb3NpdGlvbiBmcm9tICgwLjUgLSAxLjApIHRvICgwLjAgLSAxLjApCiAgICAgICAgZmxvYXQgcmVzdWx0ID0gZWFzZUZ1bmN0aW9uKChwb3NpdGlvbiAqIDIuMGYpIC0gMS4wZik7CiAgICAgICAgCiAgICAgICAgLy9TY2FsZSB0byAoMC41IC0gMS4wKSwgYnkgaGFsZmluZyB0aGUgcmVzdWx0IGFuZCB0aGVuIGFkZGluZyBoYWxmLgogICAgICAgIHJldHVybiAocmVzdWx0ICogMC41ZikgKyAwLjVmOwogICAgfQp9