#ifndef MATERIAL_TEXTURE_HPP
#define MATERIAL_TEXTURE_HPP

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

#include "Material.hpp"
#include "Image/Image.hpp"

namespace USpeedGameEngine
{

class Material::Texture
{
    /****************
    * Les attributs *
    ****************/
    public :
        unsigned int textureID;                 //!< Identifiant de la texture sous OpenGL
        char *data;                             //!< Données de l'image chargée
        unsigned long int width;                //!< Largeur de l'image chargée
        unsigned long int height;               //!< Hauteur de l'image chargée
        USGE_TextureMode mode;                  //!< Le mode d'affichage de la texture
        bool prepared;                          //!< Permet de savoir si la texture est préparée et prête à l'emploi
        bool is4444;                            //!< Permet de savoir si la texture est en mode 16 bits (sinon elle est en 32 bits)
    protected :
    private :

    /***************
    * Les méthodes *
    ***************/
    public :
        // Constructeur par défaut
        Texture();
        // Destructeur par défaut
        ~Texture();

        // Permet de savoir si la texture est en mode 16 bits (sinon elle est en 32 bits).
        bool is16Bits();
        // Permet d'effacer les données et ré-initialiser les variables.
        void clear();
        // Chargement de la texture depuis l'image spécifiée (par transfert)
        bool fromImage(Image *image);
        // Chargement de la texture depuis l'image du fichier spécifié.
        bool fromImageFile(char *filename, USGE_Image type);
        // Chargement de la texture depuis l'image du fichier en mémoire spécifié.
        bool fromImageBuffer(unsigned char *data, unsigned long int bufferLength, USGE_Image type);
        // Chargement de la texture depuis l'image spécifiée (par transfert)
        bool fromPointer(char *ptrData, unsigned long int width, unsigned long int height);
        // Charge les données de texture pour l'affichage matériel
        void loadToGL();
        void loadToGL(bool mode16Bits);
        // La taille de l'image actuelle
        unsigned long int getWidth();
        unsigned long int getHeight();
        // L'identifiant de texture sous OpenGL (0 sur PSP)
        unsigned int getTextureID();
        // Retourne le pointeur des données de l'image.
        char *getData();

        ////////////////////////////
        // Les modes de texturage //
        ////////////////////////////
        // Permet de choisir le mode d'affichage de la texture : NEAREST par défaut.
        void setMode(USGE_TextureMode pMode);
        // Retourne le mode d'affichage de la texture actuellement choisi.
        USGE_TextureMode getMode();
        // Permet de choisir le mode d'affichage par défaut de la texture.
        static void setDefaultMode(USGE_TextureMode pMode);
        // Retourne le mode d'affichage par défaut de la texture actuellement choisi.
        static USGE_TextureMode getDefaultMode();

    protected :
    private :
};

}        // Fin "namespace USpeedGameEngine"

#endif
