#ifndef MATRIX_H
#define MATRIX_H

#include <iostream>

class Matrix final {
public:
    Matrix();

    Matrix& set(const Matrix& other);
    Matrix& setToIdentity();
    Matrix& set(unsigned int index, float f);

    const float* getValues() const;

    Matrix& mul(const Matrix& m);

    Matrix& scale(float sx, float sy, float sz);
    Matrix& scale(float s);

    Matrix& translate(float tx, float ty, float tz);
    Matrix& translateX(float tx);
    Matrix& translateY(float ty);
    Matrix& translateZ(float tz);
    Matrix& translateTo(float tx, float ty, float tz);

    Matrix& rotateX(float degrees);
    Matrix& rotateY(float degrees);
    Matrix& rotateZ(float degrees);

private:
    float data[16];
};

std::ostream& operator<<(std::ostream& os, const Matrix& m);

#endif