
#ifndef RENDERER_MODEL
#define RENDERER_MODEL

#include "stdlib.h"

#include "ModelStruct.h"
#include "ModelInstance.h"

#include "MemoryManager/DebugNew.h"

namespace RenderSystem
{

	//la class d'instance de model définie ici pour la double référence interne de ModelInstance et Model.
	class ModelInstance;

	/**
	*	Classe permettant de représenter un Model3D charger à partir d'un fichier sur le disque.
	* Cette classe permet la manipulation d model static et dynamique indépendement via un système
	* d'instance de model.
	*	La classe est implémenter différemment suivant que l'on a à faire a une model static ou dynamic
	* par Model_static ou Model_dynamic.
	*	Le model possède les attributs nécessaire au rendu des shadow volumes. Pour cela, le model doit
	* être bien formé : pas de edges avec plus de 2 faces en commun... isClosedModel indique si le model est
	* fermé : cela permet d'utiliser un algorithme optimisé de géneration des volumes.
	*	Le model gère aussi les informations utile pour le dot3 bumpmapping et autre parallax mapping
	* comme les normals, tangent, binormal, etc...
	* @author Hillaire Sébastien
	*/
	class Model
	{
	private:

	protected:

	public:

		/**
		* Le nom unique du model
		*/
		char *name;

		/**
		* Le nombre de vertices du model
		*/
		int nbVertex;

		/**
		* Le nombre de triangles du model
		*/
		int nbTris;

		/**
		*	Le nombre d'animations disponible du model
		* REM : -1 pour model static(pas d'animation).
		*/
		int nbAnimation;

		/**
		*	Le nombre de triangle dégenerer supprimé.(triangle point ou triangle ligne)
		*/
		int nbDegeneratedTris;

		/**
		*	Les id des vertex formant triangles qui forme les faces du model.
		* REM : la taille du tableau est nbFaces*3.
		*/
		unsigned short * triangles;

		/**
		*	Les coordonnées de texture 2D correspondantes au vertex de même indices.
		* REM : la taille du tableau est nbVertex*2.
		*/
		float * texCoords;

		/**
		*	Indique si le model est fermé(aucun edge incomplet).
		* Si un model est fermé, il plus rapide de génerer son volume d'ombre pour une lumière donnée.
		*/
		bool isClosedModel;


		/**
		* Le constructeur
		*/
		Model(void);

		/**
		* Le destructeur virtuel
		*/
		virtual ~Model(void);

		/**
		* Fonction virtuelle pure permettant de charger le model à partir d'un fichier.
		*
		* @param path : le pointeur sur le chemin du fichier
		* @param name : le nom du model(une copie local est effectuer)
		* @return true si le fichier est chargé
		*/
		virtual bool load(char *path, char* name) =0;

		/**
		* Fonction virtuelle pure permettant d'initialisé une instance de model
		* En partisulier indique si l'instance est static geometriquement ou non.
		*
		* @see releaseInstance
		* @param mi : l'instance de ce model a initialisé.
		*/
		virtual void initInstance(ModelInstance *mi) =0;

		/**
		* Fonction virtuelle pure permettant de relaché un instance.(rend la mémoire utilisé par celle ci).
		*
		* @param mi : l'instance de ce model a initialisé.
		*/
		virtual void releaseInstance(ModelInstance *mi) =0;

		/**
		*	Fonction virtuelle pure permettant d'updaté une instance de model suivant le temps
		* écouler. Seul la aabb et l'état d'animation sont updatés.
		*
		* @param mi : l'instance de ce model a updaté.
		* @param time_ms : le temp écouler depuis la dernière frame en milliseconde
		*/
		virtual void updateInstance_aabbAndAnimState(ModelInstance *mi, float time_ms) =0;

		/**
		*	Fonction virtuelle pure permettant d'updaté une instance de model suivant le temps
		* écouler. Seul la aabb et l'état d'animation sont updatés.
		*
		* @param mi : l'instance de ce model a updaté.
		*/
		virtual void updateInstance_geometry(ModelInstance *mi) =0;
		
		/**
		*	Fonction viruel pure permettant de changer l'échelle de l'objet. A faire de préference avant, enregistrement
		* des instances auprès du Renderer. Pour être sur, le faire juste après le chargement.
		*
		* @param factor : le facteur de changement de taille. Pour un objet 2 fois plus grand, factor=2.0f.
		*/
		virtual void scale(float factor) =0;

	};
};// namespace RenderSystem;

#include "MemoryManager/DebugNewOff.h"

#endif