package mods.eln.misc; public class SlewLimiter { private float positiveSlewRate; private float negativeSlewRate; private float target = 0; private float position = 0; public SlewLimiter(float slewRate) { setSlewRate(slewRate); } public SlewLimiter(float positive, float negative) { setSlewRate(positive, negative); } public float getTarget() { return target; } public void setTarget(float target) { this.target = target; } public float getPosition() { return position; } public void setPosition(float position) { this.position = position; } public boolean targetReached() { return position == target; } public boolean targetReached(float tolerance) { return Math.abs(position - target) <= tolerance; } public float getPositiveSlewRate() { return positiveSlewRate; } public float getNegativeSlewRate() { return negativeSlewRate; } public void setSlewRate(float slewRate) { this.positiveSlewRate = Math.abs(slewRate); this.negativeSlewRate = Math.abs(slewRate); } public void setSlewRate(float positive, float negative) { this.positiveSlewRate = Math.abs(positive); this.negativeSlewRate = Math.abs(negative); } public void step(float deltaTime) { float delta = target - position; if (delta > 0f) delta = Math.min(delta, positiveSlewRate * deltaTime); else if (delta < 0f) delta = Math.max(delta, -negativeSlewRate * deltaTime); position += delta; } }