// Liquid3D - Moteur 3D C++ NDS par Morukutsu
// Surcouche de l'ulibrary de Brunni
// Version alpha 1

#include "../L3DTypes.h"
#include "CSceneNode.h"
#include <ulib/ulib.h>
#include "MD2.h"

#ifndef _H_L3DSMD2MESHNODE
#define _H_L3DSMD2MESHNODE

#define ANIM_LOOP        0
#define ANIM_ONCE        1
#define ONCE_STAYLAST    0
#define ONCE_STAYFIRST   1

#define DSPack10(a,b,c) (((a)&0x3ff)|(((b)&0x3ff)<<10)|(((c)&0x3ff)<<20))
#define FIFO_VERTEX10			REG2ID(GFX_VERTEX10)
static inline void DSVertex10(uint32 xyz) { GFX_VERTEX10=xyz; }
static inline void DSVertex103v10(v10 x, v10 y, v10 z) { DSVertex10(DSPack10(x, y, z)); }

namespace L3D
{
	struct sModelAnim
    {
        //L'unité des positon est un multiple de la taille des frames
        u8  startFrame;       //Frame de départ
        u8  endFrame;         //Frame d'arrivée
        u8  fps;              //Vitesse de l'animation en frames
        int pas;              //Pas de l'animation (pour l'interpolation)
    };

	// - - - - - - - - -
	// Classe CMD2MeshNode - noeud de type modèle statique/animé au format MD2
	// - - - - - - - - - 
	class CMD2MeshNode : public CSceneNode
	{
	public:
		//Constructeur/Destructeur
		CMD2MeshNode();
		~CMD2MeshNode();
		//Fonction d'affichage
		void Draw();
		void Update();
		//Fonctions spécifiques à ce noeud
		void Play();
        void AssignModel(MD2Entity* Model);
		void AssignImage(UL_IMAGE* Image);
        int  AddAnim(u8 sta, u8 end, u8 fps);
        void PlayAnim(int mode, int anim, bool isTrans = true);
        void Interpolate(bool trigger);
        void SetAnimationSpeed(u8 animation, int speed);
        void SetOnceMonde(int mode);
        void Pause();
        void Restart();
        void Stop();

        void Tint(int color);
        void Outline(int color, bool trigger);
		void Alpha(int alpha, int polygroup);
	public:
		int alpha, polygroup, color, outlineColor;
		int onceMode, transition, transTimer, currentAnim;
		u8 animNbr, defaultAnim, frameCounter, currentFrame, interFrameCounter;
		bool isTexture, isStarted, isPaused, isLoop, isStatic, isInterpolation, isOutline, isTransition;
		
		MD2Entity* model;
		UL_IMAGE* img;
        sModelAnim animations[32];

		//Normales MD2
		static vec3_t anorms_table[162];
		static bool isInited;
        static v10 anormtable16[162][3];
	};
};

#endif