2023-08-27 23:49:45 +02:00
|
|
|
package com.minelittlepony.unicopia.util;
|
|
|
|
|
|
|
|
import net.minecraft.util.Util;
|
|
|
|
import net.minecraft.util.math.MathHelper;
|
|
|
|
|
|
|
|
public class Lerp {
|
|
|
|
private long duration;
|
|
|
|
|
|
|
|
private long startTime;
|
|
|
|
private float start;
|
|
|
|
private float end;
|
|
|
|
|
|
|
|
private boolean finished = true;
|
2023-08-29 22:27:43 +02:00
|
|
|
private final boolean angle;
|
2023-08-27 23:49:45 +02:00
|
|
|
|
|
|
|
public Lerp(float initial) {
|
2023-08-29 22:27:43 +02:00
|
|
|
this(initial, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
public Lerp(float initial, boolean angle) {
|
2023-08-27 23:49:45 +02:00
|
|
|
end = initial;
|
2023-08-29 22:27:43 +02:00
|
|
|
this.angle = angle;
|
2023-08-27 23:49:45 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public boolean update(float newTarget, long changeDuration) {
|
|
|
|
if (MathHelper.approximatelyEquals(end, newTarget)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
start = getValue();
|
|
|
|
startTime = Util.getMeasuringTimeMs();
|
|
|
|
end = newTarget;
|
|
|
|
duration = changeDuration;
|
|
|
|
finished = false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public float getValue() {
|
|
|
|
if (finished) {
|
|
|
|
return end;
|
|
|
|
}
|
|
|
|
float delta = getDelta();
|
|
|
|
finished = delta >= 1F;
|
2023-08-29 22:27:43 +02:00
|
|
|
if (angle) {
|
|
|
|
return MathHelper.lerpAngleDegrees(delta, start, end);
|
|
|
|
}
|
2023-08-27 23:49:45 +02:00
|
|
|
return MathHelper.lerp(delta, start, end);
|
|
|
|
}
|
|
|
|
|
2023-08-29 22:27:43 +02:00
|
|
|
public float getTarget() {
|
|
|
|
return end;
|
|
|
|
}
|
|
|
|
|
2023-08-27 23:49:45 +02:00
|
|
|
public boolean isFinished() {
|
|
|
|
return finished;
|
|
|
|
}
|
|
|
|
|
|
|
|
private float getDelta() {
|
|
|
|
return MathHelper.clamp((float)(Util.getMeasuringTimeMs() - startTime) / (float)duration, 0, 1);
|
|
|
|
}
|
|
|
|
}
|