<<<<<<< HEAD
//
=======

 //
>>>>>>> 5fc4346 (funktioniert, 3 oder 6 + Timer komplett)
// Created by bakee on 03.11.2025.
//
#include "gamematrix.h"
#include <cmath>

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]};
    }

<<<<<<< HEAD
}
=======
}
>>>>>>> 5fc4346 (funktioniert, 3 oder 6 + Timer komplett)
