diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..9dae3d4 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,10 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + + ] +} \ No newline at end of file diff --git a/gamecube.h b/includes/gamecube.h similarity index 100% rename from gamecube.h rename to includes/gamecube.h diff --git a/gamematrix.h b/includes/gamematrix.h similarity index 100% rename from gamematrix.h rename to includes/gamematrix.h diff --git a/gamecube.cpp b/src/gamecube.cpp similarity index 100% rename from gamecube.cpp rename to src/gamecube.cpp diff --git a/src/gamematrix.cpp b/src/gamematrix.cpp new file mode 100644 index 0000000..3a20980 --- /dev/null +++ b/src/gamematrix.cpp @@ -0,0 +1,97 @@ +// +// 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]}; + } + +} \ No newline at end of file diff --git a/main.cpp b/src/main.cpp similarity index 100% rename from main.cpp rename to src/main.cpp