package jo.vecmath.logic;
import jo.vecmath.AxisAngle4f;
import jo.vecmath.Matrix4f;
import jo.vecmath.Point3f;
public class SpinningTransformer implements ITransformer {
private Point3f mByEuler; // per second
private AxisAngle4f mByAxis;
private long mStartTime;
public SpinningTransformer() {
mStartTime = System.currentTimeMillis();
}
public SpinningTransformer(Point3f rotation) {
mByEuler = rotation;
mStartTime = System.currentTimeMillis();
}
public SpinningTransformer(AxisAngle4f axis) {
mByAxis = axis;
mStartTime = System.currentTimeMillis();
}
public SpinningTransformer(Point3f rotation, long startTime) {
mByEuler = rotation;
mStartTime = startTime;
}
public SpinningTransformer(AxisAngle4f axis, long startTime) {
mByAxis = axis;
mStartTime = startTime;
}
@Override
public Matrix4f calcTransform(Matrix4f transform) {
Matrix4f t;
long now = System.currentTimeMillis();
if (now > mStartTime) {
t = new Matrix4f(transform);
float seconds = (now - mStartTime) / 1000.0f;
if (mByEuler != null) {
Matrix4fLogic.rotateEuler(t, mByEuler.scaleBy(seconds));
} else {
t = new Matrix4f();
AxisAngle4f a = new AxisAngle4f(mByAxis);
a.angle *= seconds;
t.set(a);
t.mul(transform, t);
}
} else {
t = transform;
}
return t;
}
public long getStartTime() {
return mStartTime;
}
public void setStartTime(long startTime) {
mStartTime = startTime;
}
public Point3f getByEuler() {
return mByEuler;
}
public void setByEuler(Point3f byEuler) {
mByEuler = byEuler;
}
public AxisAngle4f getByAxis() {
return mByAxis;
}
public void setByAxis(AxisAngle4f byAxis) {
mByAxis = byAxis;
}
}