#include #include "MVP.hpp" #include "Math.hpp" namespace Math::MVP { Matrix<4, 4> model(Vector<3> position, Rotation angles) { auto transformation = Matrix<4, 4>::transformation(position); auto rotation = Matrix<4, 4>::rotation(angles); return transformation * rotation; } Matrix<4, 4> view(Vector<3> position, Rotation angles) { auto rotation = Matrix<4, 4>::rotation(angles); auto transformation = Matrix<4, 4>::transformation(-position); return rotation * transformation; } Matrix<4, 4> perspective_projection(float aspect, float fov, float near, float far) { auto fov_radians = Math::radians(fov); float x_scale = 1.0f / (tan(fov_radians / 2.0f) * aspect); float y_scale = 1.0f / tan(fov_radians / 2.0f); float frustum_length = far - near; float z_near = -(far + near) / frustum_length; float z_far = -(2 * far * near) / frustum_length; Matrix<4, 4> projection{ x_scale, 0.0f, 0.0f, 0.0f, 0.0f, y_scale, 0.0f, 0.0f, 0.0f, 0.0f, z_near, z_far, 0.0f, 0.0f, -1.0f, 0.0f, }; return projection; } Matrix<4, 4> orthographic_projection(float width, float height, float near, float far) { float x_scale = 2.0f / width; float y_scale = 2.0f / -height; float frustum_length = far - near; float z_near = -(far + near) / frustum_length; float z_far = -2 / frustum_length; Matrix<4, 4> projection{ x_scale, 0.0f, 0.0f, -1.0f, 0.0f, y_scale, 0.0f, 1.0f, 0.0f, 0.0f, z_near, z_far, 0.0f, 0.0f, 0.0f, 1.0f, }; return projection; } }