69 lines
1.6 KiB
Java
69 lines
1.6 KiB
Java
package com.danitheskunk.skunkworks;
|
|
|
|
public final class Mat4f {
|
|
private final double[] data;
|
|
|
|
public Mat4f() {
|
|
data = new double[16];
|
|
set(0, 0, 1.0);
|
|
set(1, 1, 1.0);
|
|
set(2, 2, 1.0);
|
|
set(3, 3, 1.0);
|
|
}
|
|
|
|
public static Mat4f perspective(
|
|
double fovy, double aspect, double zNear, double zFar
|
|
) {
|
|
/*
|
|
T const tanHalfFovy = tan(fovy / static_cast<T>(2));
|
|
|
|
mat<4, 4, T, defaultp> Result(static_cast<T>(0));
|
|
Result[0][0] = static_cast<T>(1) / (aspect * tanHalfFovy);
|
|
Result[1][1] = static_cast<T>(1) / (tanHalfFovy);
|
|
Result[2][2] = - (zFar + zNear) / (zFar - zNear);
|
|
Result[2][3] = - static_cast<T>(1);
|
|
Result[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear);
|
|
*/
|
|
|
|
/*
|
|
Result[2][2] = zFar / (zFar - zNear);
|
|
Result[2][3] = static_cast<T>(1);
|
|
Result[3][2] = -(zFar * zNear) / (zFar - zNear);
|
|
*/
|
|
var mat = new Mat4f();
|
|
double tanHalfFovy = Math.tan(fovy / 2.0);
|
|
mat.set(0, 0, 1.0 / (aspect * tanHalfFovy));
|
|
mat.set(1, 1, 1.0 / tanHalfFovy);
|
|
/*
|
|
mat.set(2, 2, - (zFar + zNear) / (zFar - zNear));
|
|
mat.set(2, 3, -1.0);
|
|
mat.set(3, 2, -(2.0 * zFar * zNear) / (zFar - zNear));
|
|
*/
|
|
mat.set(2, 2, zFar / (zFar - zNear));
|
|
mat.set(2, 3, 1.0);
|
|
mat.set(3, 2, -(zFar * zNear) / (zFar - zNear));
|
|
//mat.set(3, 3, 0);
|
|
return mat;
|
|
}
|
|
|
|
public double[] asArray() {
|
|
return data;
|
|
}
|
|
|
|
public float[] asFloatArray() {
|
|
var arr = new float[16];
|
|
for(int i = 0; i < 16; ++i) {
|
|
arr[i] = (float) data[i];
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
public double get(int x, int y) {
|
|
return data[x + y * 4];
|
|
}
|
|
|
|
public void set(int x, int y, double val) {
|
|
data[x + y * 4] = val;
|
|
}
|
|
}
|