package jo.vecmath.logic; import jo.vecmath.Matrix3f; import jo.vecmath.Matrix4f; import jo.vecmath.Point3f; import jo.vecmath.Vector3f; public class QuadraticTransformer implements ITransformer { private Point3f mByEuler; // per second private Point3f mXQuad; private Point3f mYQuad; private Point3f mZQuad; private Point3f mScaleQuad; private long mStartTime; private long mLastTime; private Matrix4f mLastMatrix; public QuadraticTransformer() { mStartTime = System.currentTimeMillis(); } public QuadraticTransformer(long startTime) { mStartTime = startTime; } @Override public Matrix4f calcTransform(Matrix4f transform) { long now = System.currentTimeMillis(); if (now == mLastTime) { return mLastMatrix; } mLastTime = now; if (now > mStartTime) { mLastMatrix = new Matrix4f(transform); float seconds = (now - mStartTime) / 1000.0f; Matrix3f rot; if (mByEuler != null) { Point3f angles = new Point3f(mByEuler); angles.scale(seconds); rot = Matrix3fLogic.makeRotateMatrix(angles); } else { rot = new Matrix3f(); rot.setIdentity(); } Vector3f trans = new Vector3f(evalQuad(seconds, mXQuad), evalQuad(seconds, mYQuad), evalQuad(seconds, mZQuad)); float scale = (mScaleQuad != null) ? evalQuad(seconds, mScaleQuad) : 1; mLastMatrix.set(rot, trans, scale); } else { mLastMatrix = transform; } return mLastMatrix; } private float evalQuad(float t, Point3f coeff) { if (coeff == null) { return 0; } return t * t * coeff.x + t * coeff.y + coeff.z; } public Point3f getByEuler() { return mByEuler; } public void setByEuler(Point3f byEuler) { mByEuler = byEuler; } public Point3f getXQuad() { return mXQuad; } public void setXQuad(Point3f xQuad) { mXQuad = xQuad; } public Point3f getYQuad() { return mYQuad; } public void setYQuad(Point3f yQuad) { mYQuad = yQuad; } public Point3f getZQuad() { return mZQuad; } public void setZQuad(Point3f zQuad) { mZQuad = zQuad; } public Point3f getScaleQuad() { return mScaleQuad; } public void setScaleQuad(Point3f scaleQuad) { mScaleQuad = scaleQuad; } public long getStartTime() { return mStartTime; } public void setStartTime(long startTime) { mStartTime = startTime; } }