template <typename T> T bounceInOut(T t) { if (t < 0.5) { return 0.5 * bounceIn(t * 2.); } else { return 0.5 * bounceOut(t * 2. - 1.) + 0.5; } }
float interpolateScalar(float p1, float p2, float fraction, interpolation_t* inter) { if (!inter) return linear(fraction, p1, p2 - p1); switch (inter->function) { case IF_LINEAR: return linear(fraction, p1, p2 - p1); case IF_QUAD_IN: return quadIn(fraction, p1, p2 - p1, inter->slope); case IF_QUAD_OUT: return quadOut(fraction, p1, p2 - p1, inter->slope); case IF_QUAD_IN_OUT: return quadInOut(fraction, p1, p2 - p1, inter->slope); case IF_CUBIC_IN: return cubicIn(fraction, p1, p2 - p1, inter->slope); case IF_CUBIC_OUT: return cubicOut(fraction, p1, p2 - p1, inter->slope); case IF_CUBIC_IN_OUT: return cubicInOut(fraction, p1, p2 - p1, inter->slope); case IF_QUART_IN: return quartIn(fraction, p1, p2 - p1, inter->slope); case IF_QUART_OUT: return quartOut(fraction, p1, p2 - p1, inter->slope); case IF_QUART_IN_OUT: return quartInOut(fraction, p1, p2 - p1, inter->slope); case IF_QUINT_IN: return quintIn(fraction, p1, p2 - p1, inter->slope); case IF_QUINT_OUT: return quintOut(fraction, p1, p2 - p1, inter->slope); case IF_QUINT_IN_OUT: return quintInOut(fraction, p1, p2 - p1, inter->slope); case IF_CIRCLE_IN: return circleIn(fraction, p1, p2 - p1, inter->slope); case IF_CIRCLE_OUT: return circleOut(fraction, p1, p2 - p1, inter->slope); case IF_CIRCLE_IN_OUT: return circleInOut(fraction, p1, p2 - p1, inter->slope); case IF_EXPONENTIAL_IN: return exponentialIn(fraction, p1, p2 - p1); case IF_EXPONENTIAL_OUT: return exponentialOut(fraction, p1, p2 - p1); case IF_EXPONENTIAL_IN_OUT: return exponentialInOut(fraction, p1, p2 - p1); case IF_SINE_IN: return sineIn(fraction, p1, p2 - p1); case IF_SINE_OUT: return sineOut(fraction, p1, p2 - p1); case IF_SINE_IN_OUT: return sineInOut(fraction, p1, p2 - p1); case IF_ELASTIC_IN: return elasticIn(fraction, p1, p2 - p1, inter->amplitude, inter->bounces, inter->damping); case IF_ELASTIC_OUT: return elasticOut(fraction, p1, p2 - p1, inter->amplitude, inter->bounces, inter->damping); case IF_ELASTIC_IN_OUT: return elasticInOut(fraction, p1, p2 - p1, inter->amplitude, inter->bounces, inter->damping); case IF_BACK_IN: return backIn(fraction, p1, p2 - p1, inter->speed); case IF_BACK_OUT: return backOut(fraction, p1, p2 - p1, inter->speed); case IF_BACK_IN_OUT: return backInOut(fraction, p1, p2 - p1, inter->speed); case IF_BOUNCE_IN: return bounceIn(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); case IF_BOUNCE_OUT: return bounceOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); case IF_BOUNCE_IN_OUT: return bounceInOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); case IF_FAST_BOUNCE_IN: return fastBounceIn(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); case IF_FAST_BOUNCE_OUT: return fastBounceOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); case IF_FAST_BOUNCE_IN_OUT: return fastBounceInOut(fraction, p1, p2 - p1, inter->bounces, inter->growth, inter->damping); default: return linear(fraction, p1, p2 - p1); } }