package aurelienribon.tweenengine.equations;

import aurelienribon.tweenengine.TweenEquation;

/**
 * Easing equation based on Robert Penner's work:
 * http://robertpenner.com/easing/
 * @author Aurelien Ribon | http://www.aurelienribon.com/
 */
public abstract class Elastic extends TweenEquation {
	private static final float PI = 3.14159265f;

	public static final Elastic IN = new Elastic() {
		@Override
		public final float compute(float t) {
			float a = param_a;
			float p = param_p;
			if (t==0) return 0;  if (t==1) return 1; if (!setP) p=.3f;
			float s;
			if (!setA || a < 1) { a=1; s=p/4; }
			else s = p/(2*PI) * (float)Math.asin(1/a);
			return -(a*(float)Math.pow(2,10*(t-=1)) * (float)Math.sin( (t-s)*(2*PI)/p ));
		}

		@Override
		public String toString() {
			return "Elastic.IN";
		}
	};

	public static final Elastic OUT = new Elastic() {
		@Override
		public final float compute(float t) {
			float a = param_a;
			float p = param_p;
			if (t==0) return 0;  if (t==1) return 1; if (!setP) p=.3f;
			float s;
			if (!setA || a < 1) { a=1; s=p/4; }
			else s = p/(2*PI) * (float)Math.asin(1/a);
			return a*(float)Math.pow(2,-10*t) * (float)Math.sin( (t-s)*(2*PI)/p ) + 1;
		}

		@Override
		public String toString() {
			return "Elastic.OUT";
		}
	};

	public static final Elastic INOUT = new Elastic() {
		@Override
		public final float compute(float t) {
			float a = param_a;
			float p = param_p;
			if (t==0) return 0;  if ((t*=2)==2) return 1; if (!setP) p=.3f*1.5f;
			float s;
			if (!setA || a < 1) { a=1; s=p/4; }
			else s = p/(2*PI) * (float)Math.asin(1/a);
			if (t < 1) return -.5f*(a*(float)Math.pow(2,10*(t-=1)) * (float)Math.sin( (t-s)*(2*PI)/p ));
			return a*(float)Math.pow(2,-10*(t-=1)) * (float)Math.sin( (t-s)*(2*PI)/p )*.5f + 1;
		}

		@Override
		public String toString() {
			return "Elastic.INOUT";
		}
	};

	// -------------------------------------------------------------------------

	protected float param_a;
	protected float param_p;
	protected boolean setA = false;
	protected boolean setP = false;

	public Elastic a(float a) {
		param_a = a;
		this.setA = true;
		return this;
	}

	public Elastic p(float p) {
		param_p = p;
		this.setP = true;
		return this;
	}
}