content: package net.optifine.util;
  
  public class SmoothFloat {
      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 getValueLast() {
          return this.valueLast;
      }
  
      public float getTimeFadeUpSec() {
          return this.timeFadeUpSec;
      }
  
      public float getTimeFadeDownSec() {
          return this.timeFadeDownSec;
      }
  
      public long getTimeLastMs() {
          return this.timeLastMs;
      }
  
      public float getSmoothValue(float value, float timeFadeUpSec, float timeFadeDownSec) {
          this.timeFadeUpSec = timeFadeUpSec;
          this.timeFadeDownSec = timeFadeDownSec;
          return this.getSmoothValue(value);
      }
  
      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 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;
          }
      }
  }
  