Files
Mindustry/core/src/mindustry/net/Interpolator.java
Patrick 'Quezler' Mounier e06d8eabec [formatting] add newline to file(s) (#1508)
* Trail appropriate files with a new line

* For some ironic reason it ignored itself

Probably because it wasn’t tracked/commited yet.

* Rename newlines to server executable naming pattern
2020-02-05 18:36:56 -05:00

69 lines
1.8 KiB
Java

package mindustry.net;
import arc.math.*;
import arc.math.geom.*;
import arc.util.*;
public class Interpolator{
//used for movement
public Vec2 target = new Vec2();
public Vec2 last = new Vec2();
public float[] targets = {};
public float[] lasts = {};
public long lastUpdated, updateSpacing;
//current state
public Vec2 pos = new Vec2();
public float[] values = {};
public void read(float cx, float cy, float x, float y, float... target1ds){
if(lastUpdated != 0) updateSpacing = Time.timeSinceMillis(lastUpdated);
lastUpdated = Time.millis();
targets = target1ds;
if(lasts.length != values.length){
lasts = new float[values.length];
}
for(int i = 0; i < values.length; i++){
lasts[i] = values[i];
}
last.set(cx, cy);
target.set(x, y);
}
public void reset(){
values = new float[0];
targets = new float[0];
target.setZero();
last.setZero();
lastUpdated = 0;
updateSpacing = 16; //1 frame
pos.setZero();
}
public void update(){
if(lastUpdated != 0 && updateSpacing != 0){
float timeSinceUpdate = Time.timeSinceMillis(lastUpdated);
float alpha = Math.min(timeSinceUpdate / updateSpacing, 2f);
pos.set(last).lerpPast(target, alpha);
if(values.length != targets.length){
values = new float[targets.length];
}
if(lasts.length != targets.length){
lasts = new float[targets.length];
}
for(int i = 0; i < values.length; i++){
values[i] = Mathf.slerp(lasts[i], targets[i], alpha);
}
}else{
pos.set(target);
}
}
}