// // Created by bakee on 03.11.2025. // #include "gamematrix.h" #include namespace Matrix3D { Mat4 gameMatrix::identity() { return {{ {1.0, 0.0, 0.0, 0.0}, {0.0, 1.0, 0.0, 0.0}, {0.0, 0.0, 1.0, 0.0}, {0.0, 0.0, 0.0, 1.0} }}; } Mat4 gameMatrix::matmul(const Mat4& A, const Mat4& B) { const int N = 4; Mat4 result = {}; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { for (int k = 0; k < N; ++k) { result[i][j] += A[i][k] * B[k][j]; } } } return result; } Mat4 gameMatrix::translate(const Vec3& pos) { Mat4 result = identity(); result[0][3] = pos[0]; // x result[1][3] = pos[1]; // y result[2][3] = pos[2]; // z return result; } Mat4 gameMatrix::rot3D(double angle_deg, char axis) { const double angle_rad = angle_deg * M_PI / 180.0; Mat4 result = identity(); const double c = std::cos(angle_rad); const double s = std::sin(angle_rad); switch (axis) { case 'x': result[1][1] = c; result[1][2] = -s; result[2][1] = s; result[2][2] = c; break; case 'y': result[0][0] = c; result[0][2] = s; result[2][0] = -s; result[2][2] = c; break; case 'z': result[0][0] = c; result[0][1] = -s; result[1][0] = s; result[1][1] = c; break; default: break; } return result; } Mat4 operator*(const Mat4& A, const Mat4& B) { return gameMatrix::matmul(A, B); } Vec3 operator*(const Mat4& m, const Vec3& v) { Vec4 v_hom = {v[0], v[1], v[2], 1.0}; Vec4 res_hom = {}; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { res_hom[i] += m[i][j] * v_hom[j]; } } return {res_hom[0], res_hom[1], res_hom[2]}; } }