#include "camera.h"
#include "util_math.h"
Mat4 perspective(float fov, float aspect, float near_plane, float far_plane) {
// far + near / far - near 0 0 -(2.0f * far * near)/ far - near) \\
// 0 near_plane / right 0 0 \\
// 0 0 near_plane / top 0 \\
// 1.0f 0 0 0 \\
Mat4 r = Mat4::zeroed();
float top = near_plane * tan(fov * 0.5f);
float right = top * aspect;
// X = depth
r.m[0][0] = (far_plane + near_plane) / (far_plane - near_plane);
r.m[0][3] = 1.0f; // w row
r.m[3][0] = -(2.0f * far_plane * near_plane) / (far_plane - near_plane);
// Y = Right
r.m[1][1] = near_plane / right;
// Z = up
r.m[2][2] = near_plane / top;
return r;
};
Mat4 lookAt(Camera *camera) {
vec3f f = camera->forward;
vec3f r = camera->right;
vec3f u = camera->up;
vec3f p = camera->position;
Mat4 view = Mat4::identity();
// mind the transpose here since its a complete inverse
view = {
{{f.x, r.x, u.x, 0.0}, // X+ forward row
{f.y, r.y, u.y, 0.0}, // Y- right row
{f.z, r.z, u.z, 0.0}, // Z+ up row
{-(f.dot(p)), -(r.dot(p)), -(u.dot(p)), 1.0f}} // negate cam world pos translateions
};
return view;
};