/*
*	glFont2D.cpp
*
*	Programmé par Hillaire Sébastien
*
*
*	Se référé au fichier en-tête .h pour plus de détail
*
*/


#include "glFont2D.h"
#include "MemoryManager/DebugNew.h"



glFont2D::glFont2D()
{
	idTexFont = 0;

	width = 5;
	height = 5;

	for (int j=(NB_CAR_SIDE-1); j>=0; j--)
	{
		for (int i=0; i<NB_CAR_SIDE; i++)
		{
			tabTexCoord[i+j*NB_CAR_SIDE][0] = i*(float)TEX_CAR_OFFSET;
			tabTexCoord[i+j*NB_CAR_SIDE][1] = 1.0f - j*(float)TEX_CAR_OFFSET - TEX_CAR_OFFSET;
		}
	}
}

glFont2D::~glFont2D()
{
}

unsigned int glFont2D::getIdTexFont()
{
	return idTexFont;
}

void glFont2D::setIdTexFont(unsigned int id)
{
	idTexFont = id;
}

void glFont2D::renderText2D(float x, float y, const char *chaine, ...)
{
	// liste récupérant les information du paramètre ...
	va_list		argsPtr;

	// on met les inforamtion de ... dans le tableau text.
	va_start(argsPtr, chaine);
	vsprintf(texte, chaine, argsPtr);
	va_end(argsPtr);

	//on se place au début de la chaine de caractère a afficher
	int i=0;

	//les coordonnée de texture bas,gauche de la lettre courante
	float u,v;


	//on commence a dessinner
	glBegin(GL_QUADS);

	while(texte[i]!='\0')
	{
		//on récupere les coordonnée de texture bas,gauche
		if( (texte[i]>32) && (texte[i]<256) )	//protection contre "caractères invalides"
		{
			u=tabTexCoord[texte[i]-32][0];
			v=tabTexCoord[texte[i]-32][1];
		}
		else
		{
			u=tabTexCoord[0][0];
			v=tabTexCoord[0][1];
		}

		//affichage de la lettre
		glTexCoord2f(u,v);
		glVertex2f(x,y);
		glTexCoord2f(u+(float)TEX_CAR_OFFSET,v);
		glVertex2f(x+width,y);
		glTexCoord2f(u+(float)TEX_CAR_OFFSET,v+(float)TEX_CAR_OFFSET);
		glVertex2f(x+width,y+height);
		glTexCoord2f(u,v+(float)TEX_CAR_OFFSET);
		glVertex2f(x,y+height);

		//on ce décale de la taille de la lettre
		x+=width;
		//y+=0.0f;	//pas d'incrément sur y

		//on passe à la lettre suivante
		i++;
	}

	glEnd();


}

void glFont2D::setProjection2DForGLFont2D(double min_x, double max_x, double min_y, double max_y)
{
	//on sauvegadre la matrice courante de projection et on en crée un pour la 2d
	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
	glLoadIdentity();
	gluOrtho2D(min_x,max_x,min_y,max_y);

	//on sauvegadre la matrice courante de modelisation/visualisation et on charge la matric identité
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
	glLoadIdentity();
	
	//on active texture2D et bind la texture de font
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D,idTexFont);
	glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
}


void glFont2D::unsetProjection2DForGLFont2D()
{
	//on restaure la texture de projection précedente
	glMatrixMode(GL_PROJECTION);
	glPopMatrix();

	//on restaure la texture de modelisation/visualisation précedente
	glMatrixMode(GL_MODELVIEW);
	glPopMatrix();
	
	//on desactive texture2D
	glDisable(GL_TEXTURE_2D);
}


float glFont2D::getWidth()
{
	return width;
}

void glFont2D::setWidth(float w)
{
	width = w;
}

float glFont2D::getHeight()
{
	return height;
}

void glFont2D::setHeight(float h)
{
	height = h;
}