#include <stdlib.h>
#include <math.h>
#include <memory.h>
-#include "interpolation.h"
+#include "swfc-interpolation.h"
-static inline float poly(float fraction, float start, float delta, int degree)
+static inline float poly(float fraction, float start, float delta, float slope, int degree)
{
- return delta * pow(fraction, degree) + start;
+ return delta * ((1 - slope) * pow(fraction, degree) + slope * fraction) + start;
}
float linear(float fraction, float start, float delta)
{
- return poly(fraction, start, delta, 1);
+ return poly(fraction, start, delta, 0, 1);
}
-float quadIn(float fraction, float start, float delta)
+float quadIn(float fraction, float start, float delta, float slope)
{
- return poly(fraction, start, delta, 2);
+ return poly(fraction, start, delta, slope, 2);
}
-float quadOut(float fraction, float start, float delta)
+float quadOut(float fraction, float start, float delta, float slope)
{
- return quadIn(1 - fraction, start + delta, -delta);
+ return quadIn(1 - fraction, start + delta, -delta, slope);
}
-float quadInOut(float fraction, float start, float delta)
+float quadInOut(float fraction, float start, float delta, float slope)
{
if (fraction < 0.5)
- return quadIn(2 * fraction, start, delta / 2);
- return quadOut(2 * fraction - 1, start + delta / 2, delta / 2);
+ return quadIn(2 * fraction, start, delta / 2, slope);
+ return quadOut(2 * fraction - 1, start + delta / 2, delta / 2, slope);
}
-float cubicIn(float fraction, float start, float delta)
+float cubicIn(float fraction, float start, float delta, float slope)
{
- return poly(fraction, start, delta, 3);
+ return poly(fraction, start, delta, slope, 3);
}
-float cubicOut(float fraction, float start, float delta)
+float cubicOut(float fraction, float start, float delta, float slope)
{
- return cubicIn(1 - fraction, start + delta, -delta);
+ return cubicIn(1 - fraction, start + delta, -delta, slope);
}
-float cubicInOut(float fraction, float start, float delta)
+float cubicInOut(float fraction, float start, float delta, float slope)
{
if (fraction < 0.5)
- return cubicIn(2 * fraction, start, delta / 2);
- return cubicOut(2 * fraction - 1, start + delta / 2, delta / 2);
+ return cubicIn(2 * fraction, start, delta / 2, slope);
+ return cubicOut(2 * fraction - 1, start + delta / 2, delta / 2, slope);
}
-float quartIn(float fraction, float start, float delta)
+float quartIn(float fraction, float start, float delta, float slope)
{
- return poly(fraction, start, delta, 4);
+ return poly(fraction, start, delta, slope, 4);
}
-float quartOut(float fraction, float start, float delta)
+float quartOut(float fraction, float start, float delta, float slope)
{
- return quartIn(1 - fraction, start + delta, -delta);
+ return quartIn(1 - fraction, start + delta, -delta, slope);
}
-float quartInOut(float fraction, float start, float delta)
+float quartInOut(float fraction, float start, float delta, float slope)
{
if (fraction < 0.5)
- return quartIn(2 * fraction, start, delta / 2);
- return quartOut(2 * fraction - 1, start + delta / 2, delta / 2);
+ return quartIn(2 * fraction, start, delta / 2, slope);
+ return quartOut(2 * fraction - 1, start + delta / 2, delta / 2, slope);
}
-float quintIn(float fraction, float start, float delta)
+float quintIn(float fraction, float start, float delta, float slope)
{
- return poly(fraction, start, delta, 5);
+ return poly(fraction, start, delta, slope, 5);
}
-float quintOut(float fraction, float start, float delta)
+float quintOut(float fraction, float start, float delta, float slope)
{
- return quintIn(1 - fraction, start + delta, -delta);
+ return quintIn(1 - fraction, start + delta, -delta, slope);
}
-float quintInOut(float fraction, float start, float delta)
+float quintInOut(float fraction, float start, float delta, float slope)
{
if (fraction < 0.5)
- return quintIn(2 * fraction, start, delta / 2);
- return quintOut(2 * fraction - 1, start + delta / 2, delta / 2);
+ return quintIn(2 * fraction, start, delta / 2, slope);
+ return quintOut(2 * fraction - 1, start + delta / 2, delta / 2, slope);
}
-float circleIn(float fraction, float start, float delta)
+float circleIn(float fraction, float start, float delta, float slope)
{
- return delta * (1 - sqrt(1 - fraction * fraction)) + start;
+ return delta * (1 - sqrt(1 - (1 - 2 * slope) * fraction * fraction - 2 * slope * fraction)) + start;
}
-float circleOut(float fraction, float start, float delta)
+float circleOut(float fraction, float start, float delta, float slope)
{
- return circleIn(1 - fraction, start + delta, -delta);
+ return circleIn(1 - fraction, start + delta, -delta, slope);
}
-float circleInOut(float fraction, float start, float delta)
+float circleInOut(float fraction, float start, float delta, float slope)
{
if (fraction < 0.5)
- return circleIn(2 * fraction, start, delta / 2);
- return circleOut(2 * fraction - 1, start + delta / 2, delta / 2);
+ return circleIn(2 * fraction, start, delta / 2, slope);
+ return circleOut(2 * fraction - 1, start + delta / 2, delta / 2, slope);
}
float exponentialIn(float fraction, float start, float delta)
float sineIn(float fraction, float start, float delta)
{
- return delta * (1 - cos(fraction * PI/2)) + start;
+ return delta * (1 - cos(fraction * M_PI/2)) + start;
}
float sineOut(float fraction, float start, float delta)
if (amplitude < fabs(delta))
amplitude = delta;
float period = 1 / (bounces + 0.25);
-// float s = asin(delta / amplitude) - 2 * PI / period;
- return amplitude * pow(2, damping * (fraction - 1)) * sin(fraction * (2 * PI) / period /*+ fraction * s*/) + start;
+ return amplitude * pow(2, damping * (fraction - 1)) * sin(fraction * (2 * M_PI) / period) + start;
}
float elasticOut(float fraction, float start, float delta, float amplitude, int bounces, float damping)