
#ifndef RENDERER_MODEL_STATIC
#define RENDERER_MODEL_STATIC

#include "stdlib.h"
#include "stdio.h"
#include "math.h"
#include <vector>
#include "ModelStruct.h"
#include "Model.h"

#include "MemoryManager/DebugNew.h"

namespace RenderSystem
{

	/**
	*	Cette classe implémente l'interface Model pour la manipulation de model static
	* de type wavefront OBJ.
	*	Voici les prérequis du .OBJ : le model doit être composer excusivement de triangles et doit
	* posséder des coordonnées de texture ET des normals pour pour pouvoir génerer les TBN.
	* @author Hillaire Sébastien
	*/
	class ModelStatic : public Model
	{
	private:

		/**
		* Permet de savoir si un triangle est dégénerer pour ne pas le prendre en compte.
		*
		* @param v1 l'index du premier vertex.
		* @param v2 l'index du deuxième vertex.
		* @param v3 l'index du troisième vertex.
		* @param v le pointeur sur le vecteur qui contient les vertices.
		*/
		bool isDegeneratedTriangle(int v1,int v2,int v3,std::vector <float> *v);

		/**
		*	Permet de verifier qu'un vertex de la même surface n'existe pas déjà : vertex partager.
		* permet d'empêcher les doublet(ou plus) de vertex en mémoire.
		*
		* @param x la coordonnée x du vertex à vérifier.
		* @param y la coordonnée y du vertex à vérifier.
		* @param z la coordonnée z du vertex à vérifier.
		* @param tx la coordonnée de texture x du vertex à vérifier.
		* @param ty la coordonnée de texture y du vertex à vérifier.
		* @param nx la coordonnée x de la normal du vertex à vérifier.
		* @param ny la coordonnée y de la normal du vertex à vérifier.
		* @param nz la coordonnée z de la normal du vertex à vérifier.
		* @param s le numéro de surface du vertex à vérifier.
		* @param fvert le vector<float> contenant les vertices déjà présents.
		* @param ftex le vector<float> contenant les coordonnées de texture déjà présentes.
		* @param fnorm le vector<float> contenant les normales des vertices déjà présents.
		* @param surf le vector<int> contenant le numéro de surface des vertices déjà présents.
		*/
		int sameVertexSameSurfAlreadyExist(float x,float y,float z,float tx,float ty,float nx,float ny,float nz,int s,std::vector <float> *fvert,std::vector <float> *ftex,std::vector <float> *fnorm,std::vector <int> *surf);

	protected:

		/**
		* L'unique frame du model puisque le model est static
		*/
		AnimationFrame theFrame;

	public:

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

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

		/**
		* Permet de charger le model à partir d'un fichier.
		*
		* @param path le pointeur sur le chemin du fichier
		* @param _name le pointeur sur le nom du model(une copie est effectuée)
		* @return true si le fichier est chargé
		*/
		bool load(char *path, char* _name);

		/**
		*	Permet d'initialiser une instance de model. On règle les tableau de pointeur pour l'instance
		* la aabb. Pas d'anim poue un model statique.
		*
		* @param mi : le pointeur l'instance du model a créer.
		*/
		void initInstance(ModelInstance *mi);

		/**
		* Permet de relacher un instance.(rend la mémoire utilisé par celle ci).
		*
		* @param mi : l'instance de ce model a initialisé.
		*/
		virtual void releaseInstance(ModelInstance *mi);

		/**
		*	Permet d'updater 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);

		/**
		*	Permet d'updater 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);
		
		/**
		*	Fonction 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.
		*/
		void scale(float factor);

	};
};// namespace RenderSystem

#include "MemoryManager/DebugNewOff.h"

#endif