/// @ref gtx_easing /// @file glm/gtx/easing.inl #include namespace glm{ template GLM_FUNC_QUALIFIER genType linearInterpolation(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return a; } template GLM_FUNC_QUALIFIER genType quadraticEaseIn(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return a * a; } template GLM_FUNC_QUALIFIER genType quadraticEaseOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return -(a * (a - static_cast(2))); } template GLM_FUNC_QUALIFIER genType quadraticEaseInOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); if(a < static_cast(0.5)) { return static_cast(2) * a * a; } else { return (-static_cast(2) * a * a) + (4 * a) - one(); } } template GLM_FUNC_QUALIFIER genType cubicEaseIn(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return a * a * a; } template GLM_FUNC_QUALIFIER genType cubicEaseOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); genType const f = a - one(); return f * f * f + one(); } template GLM_FUNC_QUALIFIER genType cubicEaseInOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); if (a < static_cast(0.5)) { return static_cast(4) * a * a * a; } else { genType const f = ((static_cast(2) * a) - static_cast(2)); return static_cast(0.5) * f * f * f + one(); } } template GLM_FUNC_QUALIFIER genType quarticEaseIn(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return a * a * a * a; } template GLM_FUNC_QUALIFIER genType quarticEaseOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); genType const f = (a - one()); return f * f * f * (one() - a) + one(); } template GLM_FUNC_QUALIFIER genType quarticEaseInOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); if(a < static_cast(0.5)) { return static_cast(8) * a * a * a * a; } else { genType const f = (a - one()); return -static_cast(8) * f * f * f * f + one(); } } template GLM_FUNC_QUALIFIER genType quinticEaseIn(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return a * a * a * a * a; } template GLM_FUNC_QUALIFIER genType quinticEaseOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); genType const f = (a - one()); return f * f * f * f * f + one(); } template GLM_FUNC_QUALIFIER genType quinticEaseInOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); if(a < static_cast(0.5)) { return static_cast(16) * a * a * a * a * a; } else { genType const f = ((static_cast(2) * a) - static_cast(2)); return static_cast(0.5) * f * f * f * f * f + one(); } } template GLM_FUNC_QUALIFIER genType sineEaseIn(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return sin((a - one()) * half_pi()) + one(); } template GLM_FUNC_QUALIFIER genType sineEaseOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return sin(a * half_pi()); } template GLM_FUNC_QUALIFIER genType sineEaseInOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return static_cast(0.5) * (one() - cos(a * pi())); } template GLM_FUNC_QUALIFIER genType circularEaseIn(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return one() - sqrt(one() - (a * a)); } template GLM_FUNC_QUALIFIER genType circularEaseOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return sqrt((static_cast(2) - a) * a); } template GLM_FUNC_QUALIFIER genType circularEaseInOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); if(a < static_cast(0.5)) { return static_cast(0.5) * (one() - std::sqrt(one() - static_cast(4) * (a * a))); } else { return static_cast(0.5) * (std::sqrt(-((static_cast(2) * a) - static_cast(3)) * ((static_cast(2) * a) - one())) + one()); } } template GLM_FUNC_QUALIFIER genType exponentialEaseIn(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); if(a <= zero()) return a; else { genType const Complementary = a - one(); genType const Two = static_cast(2); return glm::pow(Two, Complementary * static_cast(10)); } } template GLM_FUNC_QUALIFIER genType exponentialEaseOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); if(a >= one()) return a; else { return one() - glm::pow(static_cast(2), -static_cast(10) * a); } } template GLM_FUNC_QUALIFIER genType exponentialEaseInOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); if(a < static_cast(0.5)) return static_cast(0.5) * glm::pow(static_cast(2), (static_cast(20) * a) - static_cast(10)); else return -static_cast(0.5) * glm::pow(static_cast(2), (-static_cast(20) * a) + static_cast(10)) + one(); } template GLM_FUNC_QUALIFIER genType elasticEaseIn(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return std::sin(static_cast(13) * half_pi() * a) * glm::pow(static_cast(2), static_cast(10) * (a - one())); } template GLM_FUNC_QUALIFIER genType elasticEaseOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return std::sin(-static_cast(13) * half_pi() * (a + one())) * glm::pow(static_cast(2), -static_cast(10) * a) + one(); } template GLM_FUNC_QUALIFIER genType elasticEaseInOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); if(a < static_cast(0.5)) return static_cast(0.5) * std::sin(static_cast(13) * half_pi() * (static_cast(2) * a)) * glm::pow(static_cast(2), static_cast(10) * ((static_cast(2) * a) - one())); else return static_cast(0.5) * (std::sin(-static_cast(13) * half_pi() * ((static_cast(2) * a - one()) + one())) * glm::pow(static_cast(2), -static_cast(10) * (static_cast(2) * a - one())) + static_cast(2)); } template GLM_FUNC_QUALIFIER genType backEaseIn(genType const& a, genType const& o) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); genType z = ((o + one()) * a) - o; return (a * a * z); } template GLM_FUNC_QUALIFIER genType backEaseOut(genType const& a, genType const& o) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); genType n = a - one(); genType z = ((o + one()) * n) + o; return (n * n * z) + one(); } template GLM_FUNC_QUALIFIER genType backEaseInOut(genType const& a, genType const& o) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); genType s = o * static_cast(1.525); genType x = static_cast(0.5); genType n = a / static_cast(0.5); if (n < static_cast(1)) { genType z = ((s + static_cast(1)) * n) - s; genType m = n * n * z; return x * m; } else { n -= static_cast(2); genType z = ((s + static_cast(1)) * n) + s; genType m = (n*n*z) + static_cast(2); return x * m; } } template GLM_FUNC_QUALIFIER genType backEaseIn(genType const& a) { return backEaseIn(a, static_cast(1.70158)); } template GLM_FUNC_QUALIFIER genType backEaseOut(genType const& a) { return backEaseOut(a, static_cast(1.70158)); } template GLM_FUNC_QUALIFIER genType backEaseInOut(genType const& a) { return backEaseInOut(a, static_cast(1.70158)); } template GLM_FUNC_QUALIFIER genType bounceEaseOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); if(a < static_cast(4.0 / 11.0)) { return (static_cast(121) * a * a) / static_cast(16); } else if(a < static_cast(8.0 / 11.0)) { return (static_cast(363.0 / 40.0) * a * a) - (static_cast(99.0 / 10.0) * a) + static_cast(17.0 / 5.0); } else if(a < static_cast(9.0 / 10.0)) { return (static_cast(4356.0 / 361.0) * a * a) - (static_cast(35442.0 / 1805.0) * a) + static_cast(16061.0 / 1805.0); } else { return (static_cast(54.0 / 5.0) * a * a) - (static_cast(513.0 / 25.0) * a) + static_cast(268.0 / 25.0); } } template GLM_FUNC_QUALIFIER genType bounceEaseIn(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); return one() - bounceEaseOut(one() - a); } template GLM_FUNC_QUALIFIER genType bounceEaseInOut(genType const& a) { // Only defined in [0, 1] assert(a >= zero()); assert(a <= one()); if(a < static_cast(0.5)) { return static_cast(0.5) * (one() - bounceEaseOut(a * static_cast(2))); } else { return static_cast(0.5) * bounceEaseOut(a * static_cast(2) - one()) + static_cast(0.5); } } }//namespace glm