package openmods.renderer.rotations;
import com.google.common.collect.Maps;
import java.nio.FloatBuffer;
import java.util.Map;
import openmods.geometry.Matrix3d;
import openmods.geometry.Orientation;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.vector.Matrix4f;
public class TransformProvider {
public static final TransformProvider instance = new TransformProvider();
private static class Transformation {
private final Matrix4f asMatrix;
private final Matrix4f asInverseMatrix;
private final FloatBuffer asBuffer;
private final FloatBuffer asInverseBuffer;
public Transformation(Orientation orientation) {
final Matrix3d originalMatrix = orientation.createTransformMatrix();
asMatrix = new Matrix4f();
asMatrix.setIdentity();
asMatrix.m00 = (float)originalMatrix.m00;
asMatrix.m10 = (float)originalMatrix.m10;
asMatrix.m20 = (float)originalMatrix.m20;
asMatrix.m01 = (float)originalMatrix.m01;
asMatrix.m11 = (float)originalMatrix.m11;
asMatrix.m21 = (float)originalMatrix.m21;
asMatrix.m02 = (float)originalMatrix.m02;
asMatrix.m12 = (float)originalMatrix.m12;
asMatrix.m22 = (float)originalMatrix.m22;
asBuffer = BufferUtils.createFloatBuffer(16);
asMatrix.store(asBuffer);
asBuffer.rewind();
asInverseMatrix = new Matrix4f();
Matrix4f.invert(asMatrix, asInverseMatrix);
asInverseBuffer = BufferUtils.createFloatBuffer(16);
asInverseMatrix.store(asInverseBuffer);
asInverseBuffer.rewind();
}
}
private final Map<Orientation, Transformation> transformations = Maps.newEnumMap(Orientation.class);
private TransformProvider() {
}
private Transformation getTransformation(Orientation orientation) {
Transformation r = transformations.get(orientation);
if (r == null) {
r = new Transformation(orientation);
transformations.put(orientation, r);
}
return r;
}
public Matrix4f getMatrixForOrientation(Orientation orientation) {
final Transformation transformation = getTransformation(orientation);
return new Matrix4f(transformation.asMatrix);
}
public Matrix4f getInverseMatrixForOrientation(Orientation orientation) {
final Transformation transformation = getTransformation(orientation);
return new Matrix4f(transformation.asInverseMatrix);
}
public void multMatrix(Orientation orientation) {
final Transformation transformation = getTransformation(orientation);
GL11.glMultMatrix(transformation.asBuffer);
transformation.asBuffer.rewind();
}
public void multInverseMatrix(Orientation orientation) {
final Transformation transformation = getTransformation(orientation);
GL11.glMultMatrix(transformation.asInverseBuffer);
transformation.asInverseBuffer.rewind();
}
}