package net.optifine.util;

public class SmoothFloat {
	public static float getSmoothValue(float valPrev, float value, float timeDeltaSec, float timeFadeSec) {
		if (timeDeltaSec <= 0.0F) {
			return valPrev;
		} else {
			float f = value - valPrev;
			float f1;

			if (timeFadeSec > 0.0F && timeDeltaSec < timeFadeSec && Math.abs(f) > 1.0E-6F) {
				float f2 = timeFadeSec / timeDeltaSec;
				float f3 = 4.61F;
				float f4 = 0.13F;
				float f5 = 10.0F;
				float f6 = f3 - 1.0F / (f4 + f2 / f5);
				float f7 = timeDeltaSec / timeFadeSec * f6;
				f7 = NumUtils.limit(f7, 0.0F, 1.0F);
				f1 = valPrev + f * f7;
			} else {
				f1 = value;
			}

			return f1;
		}
	}

	private float valueLast;
	private float timeFadeUpSec;
	private float timeFadeDownSec;

	private long timeLastMs;

	public SmoothFloat(float valueLast, float timeFadeSec) {
		this(valueLast, timeFadeSec, timeFadeSec);
	}

	public SmoothFloat(float valueLast, float timeFadeUpSec, float timeFadeDownSec) {
		this.valueLast = valueLast;
		this.timeFadeUpSec = timeFadeUpSec;
		this.timeFadeDownSec = timeFadeDownSec;
		this.timeLastMs = System.currentTimeMillis();
	}

	public float getSmoothValue(float value) {
		long i = System.currentTimeMillis();
		float f = this.valueLast;
		long j = this.timeLastMs;
		float f1 = (float) (i - j) / 1000.0F;
		float f2 = value >= f ? this.timeFadeUpSec : this.timeFadeDownSec;
		float f3 = getSmoothValue(f, value, f1, f2);
		this.valueLast = f3;
		this.timeLastMs = i;
		return f3;
	}

	public float getSmoothValue(float value, float timeFadeUpSec, float timeFadeDownSec) {
		this.timeFadeUpSec = timeFadeUpSec;
		this.timeFadeDownSec = timeFadeDownSec;
		return this.getSmoothValue(value);
	}

	public float getTimeFadeDownSec() {
		return this.timeFadeDownSec;
	}

	public float getTimeFadeUpSec() {
		return this.timeFadeUpSec;
	}

	public long getTimeLastMs() {
		return this.timeLastMs;
	}

	public float getValueLast() {
		return this.valueLast;
	}
}
