package com.bitwaffle.spaceguts.util;
import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector3f;
public class MatrixHelper {
public static Matrix4f perspective(float fovy, float aspect, float zNear, float zFar){
Matrix4f result = new Matrix4f();
result.setIdentity();
float sine, cotangent, deltaZ;
float radians = fovy / 2 * (float)Math.PI / 180;
deltaZ = zFar - zNear;
sine = (float) Math.sin(radians);
if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) {
return result;
}
cotangent = (float) Math.cos(radians) / sine;
result.m00 = cotangent / aspect;
result.m01 = 0.0f;
result.m02 = 0.0f;
result.m03 = 0.0f;
result.m10 = 0.0f;
result.m11 = cotangent;
result.m12 = 0.0f;
result.m13 = 0.0f;
result.m20 = 0.0f;
result.m21 = 0.0f;
result.m22 = -(zFar + zNear) / deltaZ;
result.m23 = -1.0f;
result.m30 = 0.0f;
result.m31 = 0.0f;
result.m32 = -2.0f * zNear * zFar / deltaZ;
result.m33 = 0.0f;
return result;
}
public static Matrix4f lookAt(Vector3f eye, Vector3f center, Vector3f up){
Matrix4f result = new Matrix4f();
Vector3f forward = new Vector3f(center.x - eye.x, center.y - eye.y, center.z - eye.z);
forward.normalise();
Vector3f side = new Vector3f();
Vector3f.cross(forward, up, side);
side.normalise();
Vector3f.cross(side, forward, up);
result.m00 = side.x;
result.m01 = up.x;
result.m02 = -forward.x;
result.m03 = 0.0f;
result.m10 = side.y;
result.m11 = up.y;
result.m12 = -forward.y;
result.m13 = 0.0f;
result.m20 = side.z;
result.m21 = up.z;
result.m22 = -forward.z;
result.m23 = 0.0f;
result.m30 = 0.0f;
result.m31 = 0.0f;
result.m32 = 0.0f;
result.m33 = 0.0f;
result.translate(new Vector3f(-eye.x, -eye.y, -eye.z));
return result;
}
}