
#ifndef MODEL_STRUCT
#define MODEL_STRUCT

#define NOMINMAX
#include "Frustum.h"

#include "MemoryManager/DebugNew.h"


namespace RenderSystem
{
	#define MAX_ANIMATION_NAME_SIZE		16		//ne doit pas être inférieur a 16 mais peut être augmenté.


	/**
	* Structure représentant Une étape d'animation par key-frame (utilisé avec le md2 par exemple).
	*/
	struct AnimationFrame
	{
		/**
		* Le tableau des positions des vertices de cette key frame.
		*/
		float * vertex;
		/**
		* Le tableau des normales par triangle de cette key frame.
		*/
		float * trisNormal;
		/**
		* Le tableau des normales des vertices(vecteur hauteur repère texture) de cette key frame.
		*/
		float * normal;

		/**
		*	La bounding box pour cette Frame. Elle peut être interpolé linéairement comme les vertices lors
		* d'une l'animation par keyFrame pour avoir une aabb dynamique
		*/
		BoundingBox aabb;
	};


	/**
	* Structure représentant une animation posible d'un model par key-frames.
	*/
	struct Animation
	{
		/**
		* Le nom de l'animation
		*/
		char name[MAX_ANIMATION_NAME_SIZE];
		/**
		* Le nombre de key-frame de l'animation.
		*/
		int nbFrame;
		/**
		* Le tableau des key-frames de cette animation.
		*/
		AnimationFrame * frames;
		/**
		 * indique si l'animation boucle
		 */
		bool loop;
	};

	/**
	*	Permet de représenter l'état d'animation d'une instance d'un model 3D. Permet de connaitre
	* le prochain état suivant le temps écouler depuis la dernière frame.
	*/
	struct AnimationState
	{
		/**
		*	Le temps écouler depuis le dernier chagement de frame. Permet l'interpolation des frames
		* suivant le temps que dur une frame d'une animation.
		*/
		float curTime;
		/**
		* L'animation courante
		*/
		 int curAnim;
		/**
		* La frame courante de l'animation courante
		*/
		int curFrame;
		/**
		* La prochaine animation avec laquel on va interpoler.
		*/
		int nextAnim;
		/**
		* La frame de la prochaine animation avec laquel on va interpoler.
		*/
		int nextFrame;

		/**
		* La aabb courante du model
		*/
		BoundingBox aabb;

		/**
		* Insique si l'on doit updaté la géométrie du model cette frame ci
		*/
		bool allowGeometryUpdate;

		/**
		* initialise par défaut
		*/
		void initDefault();
	};
};// namespace RenderSystem;

#include "MemoryManager/DebugNewOff.h"

#endif