camera.cpp

C++ software renderer

src/camera.cpp

1.62 KB
#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;
};