package mods.eln.misc;
public class PhysicalInterpolator {
float factor;
float factorSpeed = 0;
float factorPos = 0;
float factorFiltred = 0;
float accPerSPerError;
float slowPerS;
float ff;
float rebond;
float maxSpeed = 1000;
public PhysicalInterpolator(float preTao, float accPerSPerError, float slowPerS, float rebond) {
ff = 1 / preTao;
this.accPerSPerError = accPerSPerError;
this.slowPerS = slowPerS;
this.rebond = rebond;
}
public void step(float deltaT) {
factorFiltred += (factor - factorFiltred) * ff * deltaT;
float error = factorFiltred - factorPos;
factorSpeed *= 1 - (slowPerS * deltaT);
factorSpeed += error * accPerSPerError * deltaT;
if (factorSpeed > maxSpeed) factorSpeed = maxSpeed;
if (factorSpeed < -maxSpeed) factorSpeed = -maxSpeed;
factorPos += factorSpeed * deltaT;
if (factorPos > 1.0) {
factorFiltred = factor;
factorPos = 1.0f;
factorSpeed = -factorSpeed * rebond;
}
if (factorPos < 0.0) {
factorFiltred = factor;
factorPos = 0.0f;
factorSpeed = -factorSpeed * rebond;
}
}
/*public void stepGraphic()
{
step(FrameTime.get());
}*/
public float get() {
return factorPos;
}
public void setPos(float value) {
factorPos = value;
factorFiltred = value;
setTarget(value);
}
public void setTarget(float value) {
factor = value;
}
public float getTarget() {
return factor;
}
public void setMaxSpeed(float d) {
maxSpeed = d;
}
}