36 lines
947 B
TypeScript
36 lines
947 B
TypeScript
export class LinearExtrapolator {
|
|
private velocity = 0;
|
|
private compensationVelocity = 0;
|
|
private timeSinceSet = 0;
|
|
|
|
constructor(private currentValue: number) {}
|
|
|
|
public addFrame(value: number, rateOfChange: number) {
|
|
this.timeSinceSet = 0;
|
|
const differenceFromCurrent = value - this.currentValue;
|
|
|
|
if (Math.abs(differenceFromCurrent) > 200) {
|
|
this.currentValue = value;
|
|
this.compensationVelocity = 0;
|
|
} else {
|
|
this.compensationVelocity = differenceFromCurrent / (1 / 30);
|
|
}
|
|
|
|
this.velocity = rateOfChange;
|
|
}
|
|
|
|
public getValue(deltaTime: number): number {
|
|
this.currentValue += deltaTime * this.velocity;
|
|
|
|
const compensationTimeLeft = 1 / 30 - this.timeSinceSet;
|
|
|
|
if (compensationTimeLeft > 0) {
|
|
this.currentValue +=
|
|
Math.min(compensationTimeLeft, deltaTime) * this.compensationVelocity;
|
|
}
|
|
|
|
this.timeSinceSet += deltaTime;
|
|
|
|
return this.currentValue;
|
|
}
|
|
}
|