#ifndef CORE_MATRIX_H
#define CORE_MATRIX_H

#include "core/Quaternion.h"
#include "core/Vector.h"

typedef struct {
    Vector4 data[4];
} Matrix;

#define ZERO_MATRIX ((Matrix){0})
#define UNIT_MATRIX \
    ((Matrix){{{{1, 0, 0, 0}}, {{0, 1, 0, 0}}, {{0, 0, 1, 0}}, {{0, 0, 0, 1}}}})

Matrix* transposeMatrix(Matrix* m);
Matrix* mulSetMatrix(Matrix* m, const Matrix* a);
Matrix* mulMatrix(Matrix* m, const Matrix* a, const Matrix* b);
Vector3* mulMatrixV3(Vector3* v, const Matrix* m, const Vector3* a);
Matrix* scaleMatrix(Matrix* m, const Vector3* v);
Matrix* scaleMatrixF(Matrix* m, float f);
Matrix* translateMatrix(Matrix* m, const Vector3* v);
Matrix* translateMatrixX(Matrix* m, float tx);
Matrix* translateMatrixY(Matrix* m, float ty);
Matrix* translateMatrixZ(Matrix* m, float tz);
Matrix* translateMatrixTo(Matrix* m, const Vector3* v);
Matrix* rotateMatrixX(Matrix* m, float radians);
Matrix* rotateMatrixY(Matrix* m, float radians);
Matrix* rotateMatrixZ(Matrix* m, float radians);
Matrix* rotateMatrix(Matrix* m, const Quaternion* q);
size_t toStringMatrix(const Matrix* m, char* buffer, size_t n);

#endif