
#ifndef RENDERER_MODEL_INSTANCE
#define RENDERER_MODEL_INSTANCE

/*#ifdef WIN32
#include "windows.h"
#endif*/

#include "stdlib.h"
#include "Model.h"
#include "Texture2D.h"
#include "RegistredTexture.h"

#include "MemoryManager/DebugNew.h"

namespace RenderSystem
{

	//la class stockant le model de l'instance.
	class Model;


	/**
	*	Représente l'instance d'un model 3d. L'instance sert à différencier les différent objets 3D
	* dans une scène alors que ceux-ci on même model 3D. De plus, si le model est dynamic, chaques
	* instance garde ces état propre à son animation courante. Si l'instance est static, il ce peut
	* que les tableaux pointé soit les originaux : n'aller donc pas vous amusé à modifier toutes les
	* instance d'un coup!!!
	*	Chaque model instance a un pointeur sur une RegistredTexture se qui permet de donner différent skin
	* à différente instance du même modele.
	* @author Hillaire Sébastien
	*/
	class ModelInstance
	{
	private:

	protected:

	public:
		/**
		* Le tableau des positions des vertices de cette instance.
		*/
		float * vertex;
		/**
		* Le tableau des coordonnée de textures des vertices de cette instance.
		*/
		float * texCoord;
		/**
		* Le tableau des positions des vertices de cette instance.
		*/
		unsigned short * triangles;
		/**
		* Le tableau des normales par triangles de cette instance.
		*/
		float * trisNormal;
		/**
		* Le tableau des normales des vertices(vecteur hauteur repère texture) de cette key frame.
		*/
		float * normal;

		/**
		*	Indique si le model ne bouge pas. Permet au moteur de rendu d'éviter de mettre a jour certain paramètre
		* d'affichage et de culling comme l'a AABB dans l'espace global par exemple.
		*/
		bool isStatic;
		/**
		*	Indique si l'instance du model est animé ou non. Si on enregistre le model comme non animé, le moteur de rendu
		* ne calculera pas les animations.
		*	Si une instance est animé, on considere qu'elle n'est pas static(quel que soit la valeur de isStatic).
		*/
		bool isGeometricalyStatic;

		/**
		* Le material à appliquer au model
		*/
		RegistredTexture* rtex;

		/**
		* Le model instancié.
		*/
		Model *model;

		/**
		* L'état courant de l'animation.
		*/
		AnimationState animState;


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

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

		/**
		*	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 time_ms : le temp écouler depuis la dernière frame en milliseconde
		*/
		void updateInstance_aabbAndAnimState(float time_ms);

		/**
		*	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é.
		*/
		void updateInstance_geometry();
	};

};// namespace RenderSystem

#include "MemoryManager/DebugNewOff.h"

#endif