#ifndef MATRIX_4X4_HPP
#define MATRIX_4X4_HPP

// Détection du système cible...
#include "usgeDetectSystem.h"

// Classe mère
#include "Math.hpp"


namespace USpeedGameEngine
{

class Math::Matrix4x4
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :
        float matrix[16];           //!< Les 16 valeurs de la matrice 4x4

    /***************
    * Les méthodes *
    ***************/
    public :
        // Constructeurs
        Matrix4x4();
        Matrix4x4(const float pMatrix[16]);
        Matrix4x4(Math::Vector3D *vector);
        Matrix4x4(float angle, Math::Vector3D *vector);
        // Destructeur par défaut
        ~Matrix4x4();

        // Affectations
        void setValues(const float pMatrix[16]);
        void setValues(Math::Point3D *point);
        void setValues(Math::Vector3D *vector);
        void setValues(float angle, Math::Vector3D *vector);

        // Chargement d'une matrice rotation selon l'axe spécifié.
        void loadRotationMatrix(float angle, char axis);
        // Récupération de la matrice 4x4.
        void getMatrix(float *matrix);
        void getMatrix(float *matrix, bool rows);

        // Charge la matrice identité
        void loadIdentity();
        // Les valeurs proches de zéro sont mise à zéro (tolérance définie par Math::Epsilon)
        void zeroClamp();
        // Force la dernière ligne de la matrice à être [ 0, 0, 0, 1 ].
        void verifyMatrix();
        // Génération des 3 angles d'Euler à partir de la matrice courante.
        void toEuler(float *x, float *y, float *z);
        void toEulerXYZ(float *x, float *y, float *z);
        // Effectue le produit de la matrice actuelle par la matrice fournie.
        void product(Math::Matrix4x4 *pMatrix);

    protected :
    private :

};

}        // Fin "namespace USpeedGameEngine"

#endif
