package rajawali.animation;
import rajawali.ATransformable3D;
import rajawali.BaseObject3D;
import rajawali.math.Number3D;
import android.view.animation.Interpolator;
public class TranslateAnimation3D extends Animation3D {
protected Number3D mToPosition;
protected Number3D mFromPosition;
protected Number3D mDiffPosition;
protected Number3D mMultipliedPosition = new Number3D();
protected Number3D mAddedPosition = new Number3D();
protected boolean mOrientToPath = false;
protected ISpline mSplinePath;
protected float mDelta;
public TranslateAnimation3D(Number3D toPosition) {
super();
mToPosition = toPosition;
}
public TranslateAnimation3D(Number3D fromPosition, Number3D toPosition) {
super();
mFromPosition = fromPosition;
mToPosition = toPosition;
}
public TranslateAnimation3D(ISpline splinePath) {
super();
mSplinePath = splinePath;
}
public TranslateAnimation3D(BaseObject3D object, Number3D toPosition, long duration, long start, long length, int repeatCount, int repeatMode, Interpolator interpolator) {
this(toPosition);
setTransformable3D(object);
setDuration(duration);
setStart(start);
setLength(length);
setRepeatCount(repeatCount);
setRepeatMode(repeatMode);
setInterpolator(interpolator);
}
public TranslateAnimation3D(BaseObject3D object, Number3D fromPosition, Number3D toPosition, long duration, long start, long length, int repeatCount, int repeatMode, Interpolator interpolator) {
this(fromPosition, toPosition);
setTransformable3D(object);
setDuration(duration);
setStart(start);
setLength(length);
setRepeatCount(repeatCount);
setRepeatMode(repeatMode);
setInterpolator(interpolator);
}
public TranslateAnimation3D(BaseObject3D object, ISpline splinePath, long duration, long start, long length, int repeatCount, int repeatMode, Interpolator interpolator) {
this(splinePath);
setTransformable3D(object);
setDuration(duration);
setStart(start);
setLength(length);
setRepeatCount(repeatCount);
setRepeatMode(repeatMode);
setInterpolator(interpolator);
}
@Override
public void setTransformable3D(ATransformable3D transformable3D) {
super.setTransformable3D(transformable3D);
if (mFromPosition == null)
mFromPosition = new Number3D(transformable3D.getPosition());
}
@Override
protected void applyTransformation(float interpolatedTime) {
super.applyTransformation(interpolatedTime);
if (mSplinePath == null) {
if (mDiffPosition == null)
mDiffPosition = Number3D.subtract(mToPosition, mFromPosition);
mMultipliedPosition.setAllFrom(mDiffPosition);
mMultipliedPosition.multiply(interpolatedTime);
mAddedPosition.setAllFrom(mFromPosition);
mAddedPosition.add(mMultipliedPosition);
mTransformable3D.getPosition().setAllFrom(mAddedPosition);
} else {
Number3D pathPoint = mSplinePath.calculatePoint(interpolatedTime);
mTransformable3D.getPosition().setAllFrom(pathPoint);
if (mOrientToPath) {
mTransformable3D.setLookAt(mSplinePath.calculatePoint(interpolatedTime + (mDelta * mDirection)));
}
}
}
public boolean getOrientToPath() {
return mOrientToPath;
}
public void setOrientToPath(boolean orientToPath) {
this.mOrientToPath = orientToPath;
mSplinePath.setCalculateTangents(orientToPath);
}
public void setDuration(long duration) {
super.setDuration(duration);
mDelta = 300.f / duration;
}
}