package org.saintandreas.gl; import org.saintandreas.math.Matrix3f; import org.saintandreas.math.Matrix4f; import org.saintandreas.math.Quaternion; import org.saintandreas.math.Vector2f; import org.saintandreas.math.Vector3f; public abstract class AbstractTransformable<T extends AbstractTransformable<T>> implements Transformable<T> { Matrix4f transform = new Matrix4f(); @Override public Matrix4f getTransform() { return transform; } @SuppressWarnings("unchecked") public T set(Matrix4f m) { transform = m; return (T) this; } @Override public T identity() { return set(new Matrix4f()); } @Override public T transpose() { return set(getTransform().transpose()); } @Override public T translate(float x) { return translate(new Vector3f(x, 0, 0)); } @Override public T translate(Vector2f vec) { return set(getTransform().translate(vec)); } @Override public T translate(Vector3f vec) { return set(getTransform().translate(vec)); } @Override public T rotate(float angle, Vector3f axis) { return set(getTransform().rotate(angle, axis)); } @Override public T rotate(Quaternion q) { return set(getTransform().rotate(q)); } @Override public T rotate(Matrix3f m) { return set(getTransform().rotate(m)); } @Override public T scale(Vector3f vec) { return set(getTransform().scale(vec)); } @Override public T scale(float f) { return set(getTransform().scale(f)); } @Override public T multiply(Matrix4f m) { return set(getTransform().mult(m)); } @Override public T preMultiply(Matrix4f m) { return set(m.mult(getTransform())); } @Override public T preTranslate(float x) { return preTranslate(new Vector2f(x, 0)); } @Override public T preTranslate(Vector2f v) { return preMultiply(new Matrix4f().translate(v)); } @Override public T preTranslate(Vector3f v) { return preMultiply(new Matrix4f().translate(v)); } @Override public T preRotate(float angle, Vector3f axis) { return preMultiply(new Matrix4f().rotate(angle, axis)); } @Override public T preRotate(Quaternion q) { return preMultiply(new Matrix4f().rotate(q)); } @Override public T preRotate(Matrix3f m) { return preMultiply(new Matrix4f().rotate(m)); } @Override public T lookat(Vector3f eye, Vector3f center, Vector3f up) { return set(Matrix4f.lookat(eye, center, up)); } @Override public T orthographic(float left, float right, float bottom, float top, float near, float far) { return set(Matrix4f.orthographic(left, right, bottom, top, near, far)); } @Override public T perspective(float fovy, float aspect, float zNear, float zFar) { return set(Matrix4f.perspective(fovy, aspect, zNear, zFar)); } public Vector3f getTranslation() { return getTransform().toTranslationVector(); } public Quaternion getRotation() { return getTransform().toRotationQuat(); } public T untranslate() { return translate(getTranslation().scale(-1)); } public T unrotate() { return set(new Matrix4f().translate(getTranslation())); } }