package it.marteEngine.tween; import org.newdawn.slick.util.Log; /** * * @author Flashpunk (www.flashpunk.net) * */ public class Ease { // Easing constants. /** @private */ private static double PI = Math.PI; /** @private */ private static double PI2 = Math.PI / 2; /** @private */ @SuppressWarnings("unused") private static double EL = 2 * PI / .45; /** @private */ private static double B1 = 1 / 2.75; /** @private */ private static double B2 = 2 / 2.75; /** @private */ private static double B3 = 1.5 / 2.75; /** @private */ private static double B4 = 2.5 / 2.75; /** @private */ private static double B5 = 2.25 / 2.75; /** @private */ private static double B6 = 2.625 / 2.75; public static final int NONE = -1; public static final int QUAD_IN = 0; /** Quadratic in. */ public static float quadIn(float t) { return t * t; } public static final int QUAD_OUT = 1; /** Quadratic out. */ public static float quadOut(float t) { return -t * (t - 2); } public static final int QUAD_IN_OUT = 2; /** Quadratic in and out. */ public static float quadInOut(float t) { return t <= .5 ? t * t * 2 : 1 - (--t) * t * 2; } public static final int CUBE_IN = 3; /** Cubic in. */ public static float cubeIn(float t) { return t * t * t; } public static final int CUBE_OUT = 4; /** Cubic out. */ public static float cubeOut(float t) { return 1 + (--t) * t * t; } public static final int CUBE_IN_OUT = 5; /** Cubic in and out. */ public static float cubeInOut(float t) { return t <= .5 ? t * t * t * 4 : 1 + (--t) * t * t * 4; } public static final int QUART_IN = 6; /** Quart in. */ public static float quartIn(float t) { return t * t * t * t; } public static final int QUART_OUT = 7; /** Quart out. */ public static float quartOut(float t) { return 1 - (t -= 1) * t * t * t; } public static final int QUART_IN_OUT = 8; /** Quart in and out. */ public static float quartInOut(float t) { return (float) (t <= .5 ? t * t * t * t * 8 : (1 - (t = t * 2 - 2) * t * t * t) / 2 + .5); } public static final int QUINT_IN = 9; /** Quint in. */ public static float quintIn(float t) { return t * t * t * t * t; } public static final int QUINT_OUT = 10; /** Quint out. */ public static float quintOut(float t) { return (t = t - 1) * t * t * t * t + 1; } public static final int QUINT_IN_OUT = 11; /** Quint in and out. */ public static float quintInOut(float t) { return ((t *= 2) < 1) ? (t * t * t * t * t) / 2 : ((t -= 2) * t * t * t * t + 2) / 2; } public static final int SINE_IN = 12; /** Sine in. */ public static float sineIn(float t) { return (float) (-Math.cos(PI2 * t) + 1); } public static final int SINE_OUT = 13; /** Sine out. */ public static float sineOut(float t) { return (float) Math.sin(PI2 * t); } public static final int SINE_IN_OUT = 14; /** Sine in and out. */ public static float sineInOut(float t) { return (float) (-Math.cos(PI * t) / 2 + .5); } public static final int BOUNCE_IN = 15; /** Bounce in. */ public static float bounceIn(float t) { t = 1 - t; if (t < B1) return (float) (1 - 7.5625 * t * t); if (t < B2) return (float) (1 - (7.5625 * (t - B3) * (t - B3) + .75)); if (t < B4) return (float) (1 - (7.5625 * (t - B5) * (t - B5) + .9375)); return (float) (1 - (7.5625 * (t - B6) * (t - B6) + .984375)); } public static final int BOUNCE_OUT = 16; /** Bounce out. */ public static float bounceOut(float t) { if (t < B1) return (float) (7.5625 * t * t); if (t < B2) return (float) (7.5625 * (t - B3) * (t - B3) + .75); if (t < B4) return (float) (7.5625 * (t - B5) * (t - B5) + .9375); return (float) (7.5625 * (t - B6) * (t - B6) + .984375); } public static final int BOUNCE_IN_OUT = 17; /** Bounce in and out. */ public static float bounceInOut(float t) { if (t < .5) { t = 1 - t * 2; if (t < B1) return (float) ((1 - 7.5625 * t * t) / 2); if (t < B2) return (float) ((1 - (7.5625 * (t - B3) * (t - B3) + .75)) / 2); if (t < B4) return (float) ((1 - (7.5625 * (t - B5) * (t - B5) + .9375)) / 2); return (float) ((1 - (7.5625 * (t - B6) * (t - B6) + .984375)) / 2); } t = t * 2 - 1; if (t < B1) return (float) ((7.5625 * t * t) / 2 + .5); if (t < B2) return (float) ((7.5625 * (t - B3) * (t - B3) + .75) / 2 + .5); if (t < B4) return (float) ((7.5625 * (t - B5) * (t - B5) + .9375) / 2 + .5); return (float) ((7.5625 * (t - B6) * (t - B6) + .984375) / 2 + .5); } public static final int CIRC_IN = 18; /** Circle in. */ public static float circIn(float t) { return (float) -(Math.sqrt(1 - t * t) - 1); } public static final int CIRC_OUT = 19; /** Circle out. */ public static float circOut(float t) { return (float) Math.sqrt(1 - (t - 1) * (t - 1)); } public static final int CIRC_IN_OUT = 20; /** Circle in and out. */ public static float circInOut(float t) { return (float) (t <= .5 ? (Math.sqrt(1 - t * t * 4) - 1) / -2 : (Math .sqrt(1 - (t * 2 - 2) * (t * 2 - 2)) + 1) / 2); } public static final int EXPO_IN = 21; /** Exponential in. */ public static float expoIn(float t) { return (float) Math.pow(2, 10 * (t - 1)); } public static final int EXPO_OUT = 22; /** Exponential out. */ public static float expoOut(float t) { return (float) (-Math.pow(2, -10 * t) + 1); } public static final int EXPO_IN_OUT = 23; /** Exponential in and out. */ public static float expoInOut(float t) { return (float) (t < .5 ? Math.pow(2, 10 * (t * 2 - 1)) / 2 : (-Math .pow(2, -10 * (t * 2 - 1)) + 2) / 2); } public static final int BACK_IN = 24; /** Back in. */ public static float backIn(float t) { return (float) (t * t * (2.70158 * t - 1.70158)); } public static final int BACK_OUT = 25; /** Back out. */ public static float backOut(float t) { return (float) (1 - (--t) * (t) * (-2.70158 * t - 1.70158)); } public static final int BACK_IN_OUT = 26; /** Back in and out. */ public static float backInOut(float t) { t *= 2; if (t < 1) return (float) (t * t * (2.70158 * t - 1.70158) / 2); t--; return (float) ((1 - (--t) * (t) * (-2.70158 * t - 1.70158)) / 2 + .5); } public static String getName(int easeFunction) { switch (easeFunction) { case Ease.QUAD_IN: return "QUAD_IN"; case Ease.QUAD_OUT: return "QUAD_OUT"; case Ease.QUAD_IN_OUT: return "QUAD_IN_OUT"; case Ease.CUBE_IN: return "CUBE_IN"; case Ease.CUBE_OUT: return "CUBE_OUT"; case Ease.CUBE_IN_OUT: return "CUBE_IN_OUT"; case Ease.QUART_IN: return "QUART_IN"; case Ease.QUART_OUT: return "QUART_OUT"; case Ease.QUART_IN_OUT: return "QUART_IN_OUT"; case Ease.QUINT_IN: return "QUINT_IN"; case Ease.QUINT_OUT: return "QUINT_OUT"; case Ease.QUINT_IN_OUT: return "QUINT_IN_OUT"; case Ease.SINE_IN: return "SINE_IN"; case Ease.SINE_OUT: return "SINE_OUT"; case Ease.SINE_IN_OUT: return "SINE_IN_OUT"; case Ease.BOUNCE_IN: return "BOUNCE_IN"; case Ease.BOUNCE_OUT: return "BOUNCE_OUT"; case Ease.BOUNCE_IN_OUT: return "BOUNCE_IN_OUT"; case Ease.CIRC_IN: return "CIRC_IN"; case Ease.CIRC_OUT: return "CIRC_OUT"; case Ease.CIRC_IN_OUT: return "CIRC_IN_OUT"; case Ease.EXPO_IN: return "EXPO_IN"; case Ease.EXPO_OUT: return "EXPO_OUT"; case Ease.EXPO_IN_OUT: return "EXPO_IN_OUT"; case Ease.BACK_IN: return "BACK_IN"; case Ease.BACK_OUT: return "BACK_OUT"; case Ease.BACK_IN_OUT: return "BACK_IN_OUT"; default: Log.warn("Easing function not mapped " + easeFunction); break; } return "NONE"; } public static float ease(int easeFunction, float t) { switch (easeFunction) { case Ease.QUAD_IN: return Ease.quadIn(t); case Ease.QUAD_OUT: return Ease.quadOut(t); case Ease.QUAD_IN_OUT: return Ease.quadInOut(t); case Ease.CUBE_IN: return Ease.cubeIn(t); case Ease.CUBE_OUT: return Ease.cubeOut(t); case Ease.CUBE_IN_OUT: return Ease.cubeInOut(t); case Ease.QUART_IN: return Ease.quartIn(t); case Ease.QUART_OUT: return Ease.quartOut(t); case Ease.QUART_IN_OUT: return Ease.quartInOut(t); case Ease.QUINT_IN: return Ease.quintIn(t); case Ease.QUINT_OUT: return Ease.quintOut(t); case Ease.QUINT_IN_OUT: return Ease.quintInOut(t); case Ease.SINE_IN: return Ease.sineIn(t); case Ease.SINE_OUT: return Ease.sineOut(t); case Ease.SINE_IN_OUT: return Ease.sineInOut(t); case Ease.BOUNCE_IN: return Ease.bounceIn(t); case Ease.BOUNCE_OUT: return Ease.bounceOut(t); case Ease.BOUNCE_IN_OUT: return Ease.bounceInOut(t); case Ease.CIRC_IN: return Ease.circIn(t); case Ease.CIRC_OUT: return Ease.circOut(t); case Ease.CIRC_IN_OUT: return Ease.circInOut(t); case Ease.EXPO_IN: return Ease.expoIn(t); case Ease.EXPO_OUT: return Ease.expoOut(t); case Ease.EXPO_IN_OUT: return Ease.expoInOut(t); case Ease.BACK_IN: return Ease.backIn(t); case Ease.BACK_OUT: return Ease.backOut(t); case Ease.BACK_IN_OUT: return Ease.backInOut(t); default: Log.warn("Easing function not mapped " + easeFunction); break; } return 0; } }