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 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; } 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 static Mat4f perspective( double fovy, double aspect, double zNear, double zFar ) { /* T const tanHalfFovy = tan(fovy / static_cast(2)); mat<4, 4, T, defaultp> Result(static_cast(0)); Result[0][0] = static_cast(1) / (aspect * tanHalfFovy); Result[1][1] = static_cast(1) / (tanHalfFovy); Result[2][2] = - (zFar + zNear) / (zFar - zNear); Result[2][3] = - static_cast(1); Result[3][2] = - (static_cast(2) * zFar * zNear) / (zFar - zNear); */ /* Result[2][2] = zFar / (zFar - zNear); Result[2][3] = static_cast(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; } }