
#ifndef TEXTURE_MANAGER
#define TEXTURE_MANAGER

#ifdef WIN32
#include "windows.h"							//Pour que le compilo ce taisesur exit!
#endif

#include "GL/gl.h"								//OpenGL
#include "GL/glu.h"								//OpenGL

#include "console.h"

#include "RegistredTexture.h"					//la classe de manipulation de texture2D OpenGL
#include <vector>								//la classe de vector

#include "MemoryManager/DebugNew.h"


//la console extern d'affichage
extern RenderSystem::Console* console;

namespace RenderSystem
{

	/**
	*	Classe permettant de gérer les textures d'une application. Les format pris en compte sont 2D, 3D et CubeMap.
	* Les textures et propriété des textures(chemin, alpha, taille...) sont spécifier lors de leur ajout dans le manager.
	* Par la suite, seul les paramètre de répetition, de qualité, d'anisotropy et de filtrage peuvent être modifier lors
	* d'un rechargement pour un changement de qualité ou de contexte graphique.
	*
	*	Implémente un patern singleton.
	* @author Hillaire Sébastien
	*/
	class TextureManager
	{
	private:
		/**
		* l'unique instance du TextureManager
		*/
		static TextureManager *texManager;

		/**
		* La liste des textures
		*/
		std::vector<RegistredTexture*> textures;

		/**
		* Constructeur
		*/
		TextureManager();
		/**
		* destructeur
		*/
		~TextureManager();

	protected:
		
	public:

		/**
		* Méthode permettant d'accéder au singleton de cette classe
		*
		* @return le pointeur sur le singleton TextureManager.
		*/
		static TextureManager* getInstance()
		{
			if (texManager == NULL)
			{
				texManager = new TextureManager();
			}
			return texManager;
		}

		/**
		 * methode permettant de detruire l'instance unique de TextureManager. 
		 *
		 * Cette methode doit imperativement etre appelée avnt la fin du programe sous peine de laisser
		 * l'instance unique en memoire.
		 */
		static void destroy()
		{
			delete texManager;
			texManager = NULL;
		}

		/**
		* Permet de charger une texture 2D.
		* @param rgbPath : le chemin de la texture 2D utilisé pour les composantes rgb. Se sera le nom de la texture.
		* @param alphaPath : la texture dont l'image dont le rouge sera utilisé comme composante alpha de la texture. NULL pour non utilisé.
		* @param _downSizingLevel : assigne le niveau de qualité de la texture à l'initialisation
		* @param _magTexFilter : le filtre de magnification
		* @param _minTexFilter : le filtre de minification & de mipmap si désiré
		* @param _AnisotropyLevel : le niveau d'anisotropy (clampé au valeur correct)
		* @param _sRepeat : la répetition sur s de la texture
		* @param _tRepeat : la répetition sur t de la texture
		* @param _uRepeat : la répetition sur u de la texture
		* @param _generateAlpha : true si l'on doit génerer uen composante alpha de transparence
		* @param _rBlended : la composante rouge à vérifier
		* @param _gBlended : la composante verte à vérifier
		* @param _bBlended : la composante bleue à vérifier
		* @param _alphaBlendValue : la valeur alpha a appliqué à la couleur trouvé
		* @param _alphaDefault : la valeur alpha par défaut
		*/
		bool addTexture2D(char* rgbPath,char* alphaPath,int _downSizingLevel,int _magTexFilter,int _minTexFilter,int _AnisotropyLevel,int _sRepeat,int _tRepeat,int _uRepeat, bool _generateAlpha, unsigned char _rBlended, unsigned char _gBlended, unsigned char _bBlended, unsigned char _alphaBlendValue, unsigned char _alphaDefault);


		/**
		*	Permet de récupérer une RegistredTexture a partir de son nom. Attention, cette méthode est
		* lente(comparaison de chaine de caractère) il faut donc l'utilisé rarement.
		*	Il faut mieux la recheche par id en cour d'execution et cette méthode pour l'initialisation.
		*
		* @param name : le pointeur sur le nom de la texture a rechercher.
		*
		* @return NULL si non trouvé.
		*/
		RegistredTexture* getTextureByName(char* name);
		/**
		*	Permet de récupérer l'indentifiant de la texture dans le manager. Cette identifiant est
		* toujours valide. Permet, par la suite, de récupérer beaucoup plus rapidement une texture
		* dans le manager.
		*
		* @param name : le pointeur sur le nom de la texture a rechercher.
		*
		* @return -1 si non trouvé.
		*/
		int getTextureIdByName(char* name);
		/**
		*	Permet de récupérer une RegistredTexture a partir de son identifiant : méthode rapide.
		*
		* @return NULL si non trouvé.
		*/
		RegistredTexture* getTextureById(int id);


		/**
		*	Permet de supprimer toutes les texture de la mémoire vidéo
		*/
		void unloadAllTexture();
		/**
		*	Permet de recharger toutes les textures chargées avec leur nouveau paramètres.
		*/
		void reLoadAllTexture();
		/**
		*	Permet de forcer le chargement de toutes les textures enregistrer.
		*/
		void loadAllTexture();

		/**
		* Affiche les textures gérées par le manager
		*/
		void debug();

	};
};// namespace RenderSystem;

#include "MemoryManager/DebugNewOff.h"

#endif