///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// ZObject Class
///
///		- Object Class
///		- Manage the Object properties which have  a mesh !! 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include	"..\Basic\ZooScene.h"


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// ZObject Class
///
///		- Classe des objets
///		- Setting de la PRS et du mesh (referencés)
///		- Bounding box (rectangulaire)
///		- méthodes d'affichage dans différents modes
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////
/// Constructor	& Destructor	 										///
///////////////////////////////////////////////////////////////////////////
ZObject::ZObject(int s3d) : ZNodeGraph(s3d)
{
	type = OBJ_TYPE_ID;

	VertsTransf.resize(0);
	
	visible		= true;
	clickable	= true;

	isAvatar = false ;

	currentMesh = NULL;

	mesh = NULL;


	multiMeshes = false;

	
}


ZObject::~ZObject()
{
	if(mesh)		mesh->DecRef();
	CleanMeshList();

	VertsTransf.resize(0);

	ZNodeGraph::~ZNodeGraph();
}


///////////////////////////////////////////////////////////////////////////
///		AddMeshInList													///
///////////////////////////////////////////////////////////////////////////
void ZObject::AddMeshInList(ZMesh *newMesh, float range2)
{
	if( (multiMeshes==false) || (newMesh==NULL) )			return;

	int		tabSize = rangeSQR.Size();

	// Cas de zéro éléments
	if(tabSize==0)
	{
		rangeSQR.Add(range2);
		meshList.Add(newMesh);
		newMesh->IncRef();

		return;
	}

	// Recherche de la position
	for(int i=0; (i < tabSize) && (rangeSQR[i] > range2); i++);

	// Cas de dernière position
	if(i==tabSize)
	{
		rangeSQR.Add(range2);
		meshList.Add(newMesh);
		newMesh->IncRef();

		return;
	}
	else
	{
		rangeSQR.Insert(range2, i);
		meshList.Insert(newMesh, i);
		newMesh->IncRef();
		return;
	}
}


///////////////////////////////////////////////////////////////////////////
///		AddMeshInList													///
///////////////////////////////////////////////////////////////////////////
void ZObject::CleanMeshList()
{
	if(multiMeshes)		currentMesh = NULL;

	for(int i=0; i < meshList.Size(); i++)			meshList[i]->DecRef();
	
	meshList.Clear();
	rangeSQR.Clear();
}





///////////////////////////////////////////////////////////////////////////////////////////////
/// MACRO de détermination d'un vertex partagé - Object definition							///
///////////////////////////////////////////////////////////////////////////////////////////////
#define FIND_SHARED_VERTEX_ZObject											\
	ref    = *vrtRef;														\
	pere   = this;															\
	nbVert = currentMesh->NbVerts;											\
	while(ref >= nbVert)													\
	{																		\
		ref -= nbVert;														\
		pere = (ZObject*) pere->father;										\
		nbVert = pere->GetMesh()->NbVerts;									\
	}


#define RENDER_SHADE_LIST_TEXTURED_PASS1_CLASSIC							\
																			\
	/**** GOURAUD COLOR ****/												\
																			\
	if(shadeList->gour.size())												\
	{																		\
		glShadeModel(GL_SMOOTH);											\
		facelist = &(shadeList->gour);										\
																			\
		glBegin(GL_TRIANGLES);												\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV1;										\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 0 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glColor3fv(pere->GetMesh()->Verts[ref].color1.vals);	\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 1 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glColor3fv(pere->GetMesh()->Verts[ref].color1.vals);	\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glColor3fv(pere->GetMesh()->Verts[ref].color1.vals);	\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 2 */									\
					glColor3fv((*Verts)[*vrtRef].color1.vals);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 2 */									\
					glColor3fv((*Verts)[*vrtRef].color1.vals);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 2 */									\
					glColor3fv((*Verts)[*vrtRef].color1.vals);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
		glEnd();															\
	}																		\
																			\
	/**** FLAT COLOR ****/													\
																			\
	if(shadeList->flat.size() || shadeList->no.size())						\
	{																		\
		glShadeModel(GL_FLAT);												\
																			\
		glBegin(GL_TRIANGLES);												\
																			\
			/** Face color **/												\
			facelist = &(shadeList->flat);									\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV1;										\
				glColor3fv(curFace->GetMaterial()->color1.vals);			\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
			/** Default color **/											\
			facelist = &(shadeList->no);									\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV1;										\
				glColor3f(1.0f, 1.0f, 1.0f);								\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
		glEnd();															\
	}


#define RENDER_SHADE_LIST_TEXTURED_PASSLIGHTMAP_CLASSIC1						\
																			\
	/**** GOURAUD COLOR ****/												\
																			\
	if(shadeList->gour.size())												\
	{																		\
		glShadeModel(GL_SMOOTH);											\
		facelist = &(shadeList->gour);										\
																			\
		glBegin(GL_TRIANGLES);												\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV1;										\
				UV1		= curFace->UV3;										\
																			\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 0 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glColor3fv(pere->GetMesh()->Verts[ref].color1.vals);	\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 1 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glColor3fv(pere->GetMesh()->Verts[ref].color1.vals);	\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glColor3fv(pere->GetMesh()->Verts[ref].color1.vals);	\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 2 */									\
					glColor3fv((*Verts)[*vrtRef].color1.vals);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 2 */									\
					glColor3fv((*Verts)[*vrtRef].color1.vals);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 2 */									\
					glColor3fv((*Verts)[*vrtRef].color1.vals);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
		glEnd();															\
	}																		\
																			\
	/**** FLAT COLOR ****/													\
																			\
	if(shadeList->flat.size() || shadeList->no.size())						\
	{																		\
		glShadeModel(GL_FLAT);												\
																			\
		glBegin(GL_TRIANGLES);												\
																			\
			/** Face color **/												\
			facelist = &(shadeList->flat);									\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV1;										\
				UV1		= curFace->UV3;										\
				glColor3fv(curFace->GetMaterial()->color1.vals);			\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
			/** Default color **/											\
			facelist = &(shadeList->no);									\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV1;										\
				UV1		= curFace->UV3;										\
				glColor3f(1.0f, 1.0f, 1.0f);								\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);			\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV1->vals);			\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
		glEnd();															\
	}

#define RENDER_SHADE_LIST_TEXTURED_PASSLIGHTMAP_CLASSIC2						\
																			\
	/**** GOURAUD COLOR ****/												\
																			\
	if(shadeList->gour.size())												\
	{																		\
		glShadeModel(GL_SMOOTH);											\
		facelist = &(shadeList->gour);										\
																			\
		glBegin(GL_TRIANGLES);												\
		glActiveTextureARB( GL_TEXTURE0_ARB );								\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV3;										\
				UV1		= curFace->UV1;										\
				UV2		= curFace->UV2;										\
				alphaValue = 1.0 - curFace->GetMaterial()->alpha ;				\
																			\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 0 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glColor4f(pere->GetMesh()->Verts[ref].color1.x,pere->GetMesh()->Verts[ref].color1.y,pere->GetMesh()->Verts[ref].color1.z,alphaValue);				\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 1 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glColor4f(pere->GetMesh()->Verts[ref].color1.x,pere->GetMesh()->Verts[ref].color1.y,pere->GetMesh()->Verts[ref].color1.z,alphaValue);				\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glColor4f(pere->GetMesh()->Verts[ref].color1.x,pere->GetMesh()->Verts[ref].color1.y,pere->GetMesh()->Verts[ref].color1.z,alphaValue);				\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glColor4f((*Verts)[*vrtRef].color1.x,(*Verts)[*vrtRef].color1.y,(*Verts)[*vrtRef].color1.z,alphaValue);					\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glColor4f((*Verts)[*vrtRef].color1.x,(*Verts)[*vrtRef].color1.y,(*Verts)[*vrtRef].color1.z,alphaValue);					\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glColor4f((*Verts)[*vrtRef].color1.x,(*Verts)[*vrtRef].color1.y,(*Verts)[*vrtRef].color1.z,alphaValue);					\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
		glEnd();															\
	}																		\
																			\
	/**** FLAT COLOR ****/													\
																			\
	if(shadeList->flat.size() || shadeList->no.size())						\
	{																		\
		glShadeModel(GL_FLAT);												\
																			\
		glBegin(GL_TRIANGLES);												\
																			\
			/** Face color **/												\
			facelist = &(shadeList->flat);									\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV3;										\
				UV1		= curFace->UV1;										\
				UV2		= curFace->UV2;										\
				alphaValue = 1.0 - curFace->GetMaterial()->alpha ;				\
				glColor4f(curFace->GetMaterial()->color1.x,curFace->GetMaterial()->color1.y,curFace->GetMaterial()->color1.z,alphaValue);			\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
			/** Default color **/											\
			facelist = &(shadeList->no);									\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV3;										\
				UV1		= curFace->UV1;										\
				UV2		= curFace->UV2;										\
				alphaValue = 1.0 - curFace->GetMaterial()->alpha ;				\
				glColor4f(1.0f, 1.0f, 1.0f,alphaValue);								\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;													\
					UV1++;													\
					UV2++;													\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,UV->vals);								\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV2->vals);								\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
		glEnd();															\
	}


///////////////////////////////////////////////////////////////////////////
/// Direct rendering for dynamic objects (CLASSIC mode)					///
///////////////////////////////////////////////////////////////////////////
/// Input	: NONE
/// Output	: 
///		- Direct render the object on the screen (glBegin/glEnd)
/// Return	: NONE

void ZObject::RenderPass1Classic()
{
	int				i, j;
#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nZObject::RenderPass1Classic ");
#endif


	vector<ZVert>	*Verts = &(currentMesh->Verts);

	FaceList		*facelist;
	ZFace			*curFace;
	ZUV				*UV;
	int				*vrtRef;
	
	ZTexture		*curTex;

	int				nbVert;
	int				ref;
	ZObject			*pere;

	FacesBySHADE	*shadeList;


	glActiveTextureARB(GL_TEXTURE2_ARB);
	glDisable(GL_TEXTURE_2D);
	glActiveTextureARB(GL_TEXTURE1_ARB);
	glDisable(GL_TEXTURE_2D);
	glActiveTextureARB(GL_TEXTURE0_ARB);
	glDisable(GL_TEXTURE_2D);
	// ************* Treatment for non texturing ************** 

	glDisable(GL_TEXTURE_2D);
	glDisable(GL_BLEND);
	glDisable(GL_ALPHA_TEST);

	// ******* GOURAUD COLOR *******
	

	if(currentMesh->FacesFlat.gour.size())
	{
		glShadeModel(GL_SMOOTH);
		facelist = &(currentMesh->FacesFlat.gour);

		glBegin(GL_TRIANGLES);

			for(i=0; i< facelist->size(); i++)
			{
				curFace = (*facelist)[i];
				vrtRef	= curFace->VertRef;

				if(curFace->dependency)
				{
					// Vertex number 0
					FIND_SHARED_VERTEX_ZObject
					glColor3fv(pere->GetMesh()->Verts[ref].color1.vals);
					glVertex3fv(pere->VertsTransf[ref].vals);
					vrtRef++;

					// Vertex number 1
					FIND_SHARED_VERTEX_ZObject
					glColor3fv(pere->GetMesh()->Verts[ref].color1.vals);
					glVertex3fv(pere->VertsTransf[ref].vals);
					vrtRef++;

					// Vertex number 2
					FIND_SHARED_VERTEX_ZObject
					glColor3fv(pere->GetMesh()->Verts[ref].color1.vals);
					glVertex3fv(pere->VertsTransf[ref].vals);
				}
				else
				{
					// Vertex number 0
					glColor3fv((*Verts)[*vrtRef].color1.vals);
					glVertex3fv(VertsTransf[*vrtRef].vals);
					vrtRef++;

					// Vertex number 1
					glColor3fv((*Verts)[*vrtRef].color1.vals);
					glVertex3fv(VertsTransf[*vrtRef].vals);
					vrtRef++;

					// Vertex number 2
					glColor3fv((*Verts)[*vrtRef].color1.vals);
					glVertex3fv(VertsTransf[*vrtRef].vals);
				}
			}

		glEnd();
	}

	

	// ******* FLAT COLOR *******
	
	if(currentMesh->FacesFlat.flat.size() || currentMesh->FacesFlat.no.size())
	{
		glShadeModel(GL_FLAT);

		glBegin(GL_TRIANGLES);

			// **** Face color ****
			facelist = &(currentMesh->FacesFlat.flat);

			for(i=0; i< facelist->size(); i++)
			{
				curFace = (*facelist)[i];
				vrtRef	= curFace->VertRef;
				glColor3fv(curFace->GetMaterial()->color1.vals);

				if(curFace->dependency)
				{
					// Vertex number 0
					FIND_SHARED_VERTEX_ZObject
					glVertex3fv(pere->VertsTransf[ref].vals);
					vrtRef++;
			
					// Vertex number 1
					FIND_SHARED_VERTEX_ZObject
					glVertex3fv(pere->VertsTransf[ref].vals);
					vrtRef++;

					// Vertex number 2
					FIND_SHARED_VERTEX_ZObject
					glVertex3fv(pere->VertsTransf[ref].vals);
				}
				else
				{
					// Vertex number 0
					glVertex3fv(VertsTransf[*vrtRef].vals);
					vrtRef++;
			
					// Vertex number 1
					glVertex3fv(VertsTransf[*vrtRef].vals);
					vrtRef++;

					// Vertex number 2
					glVertex3fv(VertsTransf[*vrtRef].vals);
				}
			}

			// *** Default color ***
			facelist = &(currentMesh->FacesFlat.no);

			for(i=0; i< facelist->size(); i++)
			{
				curFace = (*facelist)[i];
				vrtRef	= curFace->VertRef;
				glColor3fv(curFace->GetMaterial()->color.vals);

				if(curFace->dependency)
				{
					// Vertex number 0
					FIND_SHARED_VERTEX_ZObject
					glVertex3fv(pere->VertsTransf[ref].vals);
					vrtRef++;
			
					// Vertex number 1
					FIND_SHARED_VERTEX_ZObject
					glVertex3fv(pere->VertsTransf[ref].vals);
					vrtRef++;

					// Vertex number 2
					FIND_SHARED_VERTEX_ZObject
					glVertex3fv(pere->VertsTransf[ref].vals);
				}
				else
				{
					// Vertex number 0
					glVertex3fv(VertsTransf[*vrtRef].vals);
					vrtRef++;
			
					// Vertex number 1
					glVertex3fv(VertsTransf[*vrtRef].vals);
					vrtRef++;

					// Vertex number 2
					glVertex3fv(VertsTransf[*vrtRef].vals);
				}
			}

		glEnd();
	}


	// ************* Treatment by type of texture ************** 

	glEnable(GL_TEXTURE_2D);

	// ******* CLASSICAL MAPPING *******

#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nCLASSICAL MAPPING ");
#endif


	for(j=0; j<currentMesh->FacesTex1.size(); j++)
	{
		curTex = currentMesh->FacesTex1[j].tex;
		curTex->PutGLMultiparams0();


		///////////////////////////////////////////
		///				clamp u v				///
		///////////////////////////////////////////

		shadeList = &currentMesh->FacesTex1[j].ClampUV;

		if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
		{

#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nclamp u v ");
#endif

			//$LB (02/11/2004)
			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, currentMesh->texRenderMode);
			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, currentMesh->texRenderMode);

			RENDER_SHADE_LIST_TEXTURED_PASS1_CLASSIC
		}

		///////////////////////////////////////////
		///				clamp u 				///
		///////////////////////////////////////////
		
		shadeList = &currentMesh->FacesTex1[j].ClampU;

		if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
		{
#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nclamp u ");
#endif

			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

			RENDER_SHADE_LIST_TEXTURED_PASS1_CLASSIC
		}


		///////////////////////////////////////////
		///				clamp V 				///
		///////////////////////////////////////////
		
		shadeList = &currentMesh->FacesTex1[j].ClampV;

		if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
		{
#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nclamp v ");
#endif

			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

			RENDER_SHADE_LIST_TEXTURED_PASS1_CLASSIC
		}

		///////////////////////////////////////////
		///				No clamp  				///
		///////////////////////////////////////////
		
		shadeList = &currentMesh->FacesTex1[j].NoClamp;

		if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
		{
#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nno clamp ");
#endif

			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

			RENDER_SHADE_LIST_TEXTURED_PASS1_CLASSIC
		}

		///////////////////////////////////////////
		///				End clamping			///
		///////////////////////////////////////////
	}


	// ******* COLOR TRANSP MAPPING *******

	if(currentMesh->FacesColTransp.size())
	{
		glEnable(GL_ALPHA_TEST);
		glAlphaFunc(GL_GREATER, CONST_ALPHA_TEST);

		for(j=0; j<currentMesh->FacesColTransp.size(); j++)
		{
			curTex = currentMesh->FacesColTransp[j].tex;
			curTex->PutGLMultiparams0();


			///////////////////////////////////////////
			///				clamp u v				///
			///////////////////////////////////////////

			shadeList = &currentMesh->FacesColTransp[j].ClampUV;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

				RENDER_SHADE_LIST_TEXTURED_PASS1_CLASSIC
			}

			///////////////////////////////////////////
			///				clamp u 				///
			///////////////////////////////////////////

			shadeList = &currentMesh->FacesColTransp[j].ClampU;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

				RENDER_SHADE_LIST_TEXTURED_PASS1_CLASSIC
			}


			///////////////////////////////////////////
			///				clamp V 				///
			///////////////////////////////////////////

			shadeList = &currentMesh->FacesColTransp[j].ClampV;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

				RENDER_SHADE_LIST_TEXTURED_PASS1_CLASSIC
			}

			///////////////////////////////////////////
			///				No clamp  				///
			///////////////////////////////////////////

			shadeList = &currentMesh->FacesColTransp[j].NoClamp;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

				RENDER_SHADE_LIST_TEXTURED_PASS1_CLASSIC
			}
		}

		glDisable(GL_ALPHA_TEST);
	}


	// ************* ENVIRONMENTAL MAPPING *************

	if( currentMesh->FacesEnv.size() )
	{
		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

		glEnable(GL_TEXTURE_GEN_S);
		glEnable(GL_TEXTURE_GEN_T);
		

		for(j=0; j<currentMesh->FacesEnv.size(); j++)
		{
			curTex = currentMesh->FacesEnv[j].tex;
			curTex->PutGLMultiparams0();

			shadeList = &currentMesh->FacesEnv[j].NoClamp;
			RENDER_SHADE_LIST_TEXTURED_PASS1_CLASSIC

		}


		glDisable(GL_TEXTURE_GEN_S);							// Enable Texture Coord Generation For S (NEW)
		glDisable(GL_TEXTURE_GEN_T);							// Enable Texture Coord Generation For T (NEW)
	}



#ifdef	_SHOW_NORMALS_

		ZVector3	centre;
		ZVector3	normale;

		glLineWidth(2.0);
		
		glShadeModel(GL_FLAT);
		glDisable(GL_TEXTURE_2D);

		glBegin(GL_LINES);

		for(j=0; j < currentMesh->Faces.size(); j++)
		{
			glColor3f(0.0f, 1.0f, 1.0f);

			curFace = &(currentMesh->Faces[j]);
			vrtRef	= curFace->VertRef;

			normale = FaceNormTransf[curFace->index];
			normale.Normalize();
			normale *= 0.1f;

			if(curFace->dependency)
			{
				// Vertex number 0
				FIND_SHARED_VERTEX_ZObject
				centre.x = pere->VertsTransf[ref].x;
				centre.y = pere->VertsTransf[ref].y;
				centre.z = pere->VertsTransf[ref].z;
				vrtRef++;

				// Vertex number 1
				FIND_SHARED_VERTEX_ZObject
				centre.x += pere->VertsTransf[ref].x;
				centre.y += pere->VertsTransf[ref].y;
				centre.z += pere->VertsTransf[ref].z;
				vrtRef++;

				// Vertex number 2
				FIND_SHARED_VERTEX_ZObject
				centre.x += pere->VertsTransf[ref].x;
				centre.y += pere->VertsTransf[ref].y;
				centre.z += pere->VertsTransf[ref].z;
				glVertex3fv(pere->VertsTransf[ref].vals);
			}
			else
			{
				// Vertex number 0
				centre.x = VertsTransf[*vrtRef].x;
				centre.y = VertsTransf[*vrtRef].y;
				centre.z = VertsTransf[*vrtRef].z;
				vrtRef++;

				// Vertex number 1
				centre.x += VertsTransf[*vrtRef].x;
				centre.y += VertsTransf[*vrtRef].y;
				centre.z += VertsTransf[*vrtRef].z;
				vrtRef++;

				// Vertex number 2
				centre.x += VertsTransf[*vrtRef].x;
				centre.y += VertsTransf[*vrtRef].y;
				centre.z += VertsTransf[*vrtRef].z;
			}

			centre *= 0.33333333f;
			glVertex3fv(centre.vals);
			centre += normale;
			glVertex3fv(centre.vals);
		}

		glEnd();

		glEnable(GL_TEXTURE_2D);

#endif

		glActiveTextureARB(GL_TEXTURE2_ARB);
		glDisable(GL_TEXTURE_2D);
		glActiveTextureARB(GL_TEXTURE1_ARB);
		glDisable(GL_TEXTURE_2D);
		glActiveTextureARB(GL_TEXTURE0_ARB);
		glDisable(GL_TEXTURE_2D);
}


#define RENDER_SHADE_LIST_TEXTURED_PASS2_CLASSIC							\
																			\
	/* Gouraud */															\
																			\
	if(shadeList->gour.size())												\
	{																		\
		glShadeModel(GL_SMOOTH);											\
		facelist = &(shadeList->gour);										\
																			\
		glBegin(GL_TRIANGLES);												\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV2;										\
				UV1		= curFace->UV1;										\
				alpha	= curFace->GetMaterial()->alpha;					\
				curFace->GetMaterial()->GetTexture1()->PutGLMultiparams0() ;\
				glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);\
				glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);						\
				glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE);						\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 0 */									\
					FIND_SHARED_VERTEX_ZObject								\
					color	= &(pere->GetMesh()->Verts[ref].color2);		\
					glColor4f(color->x, color->y, color->z, alpha);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 1 */									\
					FIND_SHARED_VERTEX_ZObject								\
					color	= &(pere->GetMesh()->Verts[ref].color2);		\
					glColor4f(color->x, color->y, color->z, alpha);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					color	= &(pere->GetMesh()->Verts[ref].color2);		\
					glColor4f(color->x, color->y, color->z, alpha);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 0 */									\
					color	= &((*Verts)[*vrtRef].color2);					\
					glColor4f(color->x, color->y, color->z, alpha);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 1 */									\
					color	= &((*Verts)[*vrtRef].color2);					\
					glColor4f(color->x, color->y, color->z, alpha);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 2 */									\
					color	= &((*Verts)[*vrtRef].color2);					\
					glColor4f(color->x, color->y, color->z, alpha);				\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
		glEnd();															\
	}																		\
																			\
	/* Flat */																\
																			\
	if(shadeList->flat.size() || shadeList->no.size())						\
	{																		\
		glShadeModel(GL_FLAT);												\
																			\
		glBegin(GL_TRIANGLES);												\
																			\
			/* COLOR 1 */													\
																			\
			facelist = &(shadeList->flat);									\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV2;										\
				UV1		= curFace->UV1;										\
				color	= &(curFace->GetMaterial()->color2);				\
				curFace->GetMaterial()->GetTexture1()->PutGLMultiparams0() ;\
				glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);\
				glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);						\
				glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE);						\
				glColor4f(color->x, color->y, color->z, curFace->GetMaterial()->alpha);		\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 0 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);							\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);							\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 1 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);							\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);							\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);							\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);							\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 0 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);							\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);							\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 1 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);							\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);							\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);							\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);							\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
			/* DEFAULT color */												\
																			\
			facelist = &(shadeList->no);									\
																			\
			for(i=0; i< facelist->size(); i++)								\
			{																\
				curFace = (*facelist)[i];									\
				vrtRef	= curFace->VertRef;									\
				UV		= curFace->UV2;										\
				UV1		= curFace->UV1;										\
				color	= &(curFace->GetMaterial()->color);					\
				curFace->GetMaterial()->GetTexture1()->PutGLMultiparams0() ;\
				glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);\
				glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);						\
				glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE);						\
				glColor4f(1.0f, 1.0f, 1.0f, curFace->GetMaterial()->alpha);	\
																			\
				if(curFace->dependency)										\
				{															\
					/* Vertex number 0 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 1 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 2 */									\
					FIND_SHARED_VERTEX_ZObject								\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(pere->VertsTransf[ref].vals);				\
				}															\
				else														\
				{															\
					/* Vertex number 0 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 1 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
					vrtRef++;												\
					UV++;														\
					UV1++;														\
																			\
					/* Vertex number 2 */									\
					glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV1->vals);									\
					glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,UV->vals);									\
					glVertex3fv(VertsTransf[*vrtRef].vals);					\
				}															\
			}																\
																			\
		glEnd();															\
	}


///////////////////////////////////////////////////////////////////////////
/// Direct rendering for dynamic objects (CLASSIC mode)					///
///////////////////////////////////////////////////////////////////////////
/// Input	: NONE
/// Output	: 
///		- Direct render the object on the screen (glBegin/glEnd)
/// Return	: NONE
void ZObject::RenderPass2Classic()
{

	vector<ZVert>	*Verts = &(currentMesh->Verts);
	int				i, j;

#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nZObject::RenderPass2Classic ");
#endif


	FaceList		*facelist;

	ZFace			*curFace;
	ZVector3		*color;
	ZUV				*UV;
	ZUV				*UV1;
	int				*vrtRef;
	
	ZTexture		*curTex;

	float			alpha;

	int				nbVert;
	int				ref;
	ZObject			*pere;

	FacesBySHADE	*shadeList;


	glActiveTextureARB(GL_TEXTURE0_ARB);
	glDisable(GL_TEXTURE_2D);
	glActiveTextureARB(GL_TEXTURE1_ARB);
	glDisable(GL_TEXTURE_2D);
	// --------------------------------------------------------
	// ------------- Treatment by type of texture -------------
	// --------------------------------------------------------

	glEnable(GL_TEXTURE_2D);

	
#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nZObject::RenderPass2Classic  : treatment by type of texture");
#endif	
	
	for(j=0; j<currentMesh->FacesTex2.size(); j++)
	{
		curTex = currentMesh->FacesTex2[j].tex;
		curTex->PutGLMultiparams1();

		glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS );
		glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE );
		glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE );


		if(curTex->A)				{	glEnable(GL_ALPHA_TEST);	glAlphaFunc(GL_NOTEQUAL, 0);	}
		else						{	glDisable(GL_ALPHA_TEST);	}

		///////////////////////////////////////////
		///				clamp u v				///
		///////////////////////////////////////////
		
		shadeList = &currentMesh->FacesTex2[j].ClampUV;

		if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
		{
#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nRenderPass2Classic clamp u v ");
#endif


			//$LB (02/11/2004)
			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, currentMesh->texRenderMode);
			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, currentMesh->texRenderMode);

			RENDER_SHADE_LIST_TEXTURED_PASS2_CLASSIC
		}

		///////////////////////////////////////////
		///				clamp u					///
		///////////////////////////////////////////
		
		shadeList = &currentMesh->FacesTex2[j].ClampU;

		if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
		{
#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nclamp u ");
#endif

			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

			RENDER_SHADE_LIST_TEXTURED_PASS2_CLASSIC
		}

		///////////////////////////////////////////
		///				clamp V					///
		///////////////////////////////////////////
		
		shadeList = &currentMesh->FacesTex2[j].ClampV;

		if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
		{
#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nclamp v ");
#endif

			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

			RENDER_SHADE_LIST_TEXTURED_PASS2_CLASSIC
		}

		///////////////////////////////////////////
		///				No clamp 				///
		///////////////////////////////////////////
		
		shadeList = &currentMesh->FacesTex2[j].NoClamp;

		if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
		{
#ifdef	_SCOL_DEBUG_
	MMechostr(0,"\nno clamp ");
#endif
			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
			glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

			RENDER_SHADE_LIST_TEXTURED_PASS2_CLASSIC
		}

		glActiveTextureARB(GL_TEXTURE2_ARB);
		glDisable(GL_TEXTURE_2D);
		glActiveTextureARB(GL_TEXTURE1_ARB);
		glDisable(GL_TEXTURE_2D);
		glActiveTextureARB(GL_TEXTURE0_ARB);
		glDisable(GL_TEXTURE_2D);

	}
}


///////////////////////////////////////////////////////////////////////////
/// Direct rendering for dynamic objects (CLASSIC mode)					///
///////////////////////////////////////////////////////////////////////////
/// Input	: NONE
/// Output	: 
///		- Direct render the object on the screen (glBegin/glEnd)
/// Return	: NONE
void ZObject::RenderPassLightMapClassic()
{

	int				i, j;
	vector<ZVert>	*Verts = &(currentMesh->Verts);

	FaceList		*facelist;
	ZFace			*curFace;
	ZUV				*UV;
	ZUV				*UV1;
	ZUV				*UV2;
	int				*vrtRef;
	float			alphaValue ;
	
	ZTexture		*curLightMap;
	ZTexture		*curTex1;
	ZTexture		*curTex2;

	int				nbVert;
	int				ref;
	ZObject			*pere;

	FacesBySHADE	*shadeList;

	glActiveTextureARB(GL_TEXTURE2_ARB);
	glDisable(GL_TEXTURE_2D);
	glActiveTextureARB(GL_TEXTURE1_ARB);
	glDisable(GL_TEXTURE_2D);
	glActiveTextureARB(GL_TEXTURE0_ARB);
	glDisable(GL_TEXTURE_2D);

	for(j=0; j<currentMesh->FacesLightMap.size(); j++)
	{	
		curLightMap = currentMesh->FacesLightMap[j].lightMap;
		curTex1 = currentMesh->FacesLightMap[j].tex ;
		curTex2 = currentMesh->FacesLightMap[j].tex2 ;

		if(curTex1 && (!curTex2 || currentMesh->FacesLightMap[j].multi == false)) 
		{
				curLightMap->PutGLMultiparams2();
				curTex1->PutGLMultiparams0() ;
							

			///////////////////////////////////////////
			///				clamp u v				///
			///////////////////////////////////////////

			shadeList = &currentMesh->FacesLightMap[j].ClampUV;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				if(currentMesh->FacesLightMap[j].env)
				{
					//$LB (02/11/2004)
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

					glEnable(GL_TEXTURE_GEN_S);
					glEnable(GL_TEXTURE_GEN_T);
				}
				else
				{
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
				}
				RENDER_SHADE_LIST_TEXTURED_PASSLIGHTMAP_CLASSIC1
			}
			glDisable(GL_TEXTURE_GEN_S);
			glDisable(GL_TEXTURE_GEN_T);

			///////////////////////////////////////////
			///				clamp u 				///
			///////////////////////////////////////////
			
			shadeList = &currentMesh->FacesLightMap[j].ClampU;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				if(currentMesh->FacesLightMap[j].env)
				{
					//$LB (02/11/2004)
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

					glEnable(GL_TEXTURE_GEN_S);
					glEnable(GL_TEXTURE_GEN_T);
				}
				else
				{
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
				}
				
				RENDER_SHADE_LIST_TEXTURED_PASSLIGHTMAP_CLASSIC1
			}
			//glDisable(GL_TEXTURE_GEN_S);
			//glDisable(GL_TEXTURE_GEN_T);


			///////////////////////////////////////////
			///				clamp V 				///
			///////////////////////////////////////////
			
			shadeList = &currentMesh->FacesLightMap[j].ClampV;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				if(currentMesh->FacesLightMap[j].env)
				{
					//$LB (02/11/2004)
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

					glEnable(GL_TEXTURE_GEN_S);
					glEnable(GL_TEXTURE_GEN_T);
				}
				else
				{
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
				}
				
				RENDER_SHADE_LIST_TEXTURED_PASSLIGHTMAP_CLASSIC1
			}
			//glDisable(GL_TEXTURE_GEN_S);
			//glDisable(GL_TEXTURE_GEN_T);

			///////////////////////////////////////////
			///				No clamp  				///
			///////////////////////////////////////////
			
			shadeList = &currentMesh->FacesLightMap[j].NoClamp;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
				if(currentMesh->FacesLightMap[j].env)
				{
					glEnable(GL_TEXTURE_GEN_S);
					glEnable(GL_TEXTURE_GEN_T);
				}
				
				RENDER_SHADE_LIST_TEXTURED_PASSLIGHTMAP_CLASSIC1
			}
			//glDisable(GL_TEXTURE_GEN_S);
			//glDisable(GL_TEXTURE_GEN_T);
			glActiveTextureARB(GL_TEXTURE0_ARB);
			glDisable(GL_TEXTURE_2D);

			glActiveTextureARB(GL_TEXTURE1_ARB);
			glDisable(GL_TEXTURE_2D);
		}
		else
		if(curTex1 && curTex2) 
		{
		

				curTex1->PutGLMultiparams0() ;
				//glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );

				curTex2->PutGLMultiparams1();
				
				glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
				glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB );

				glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB );
				glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR );

				glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE );
				glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );

				glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB );
				glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA );
				
				curLightMap->PutGLMultiparams2() ;

			///////////////////////////////////////////
			///				clamp u v				///
			///////////////////////////////////////////

			shadeList = &currentMesh->FacesLightMap[j].ClampUV;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				if(currentMesh->FacesLightMap[j].env)
				{
					//$LB (02/11/2004)
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

					glActiveTextureARB (GL_TEXTURE0_ARB);
					glEnable(GL_TEXTURE_GEN_S);
					glEnable(GL_TEXTURE_GEN_T);
				}
				else
				{
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
				}
				RENDER_SHADE_LIST_TEXTURED_PASSLIGHTMAP_CLASSIC2
			}
			glDisable(GL_TEXTURE_GEN_S);
			glDisable(GL_TEXTURE_GEN_T);

			///////////////////////////////////////////
			///				clamp u 				///
			///////////////////////////////////////////
			
			shadeList = &currentMesh->FacesLightMap[j].ClampU;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				if(currentMesh->FacesLightMap[j].env)
				{
					//$LB (02/11/2004)
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

					glActiveTextureARB (GL_TEXTURE0_ARB);
					glEnable(GL_TEXTURE_GEN_S);
					glEnable(GL_TEXTURE_GEN_T);
				}
				else
				{
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
				}
				RENDER_SHADE_LIST_TEXTURED_PASSLIGHTMAP_CLASSIC2
			}
			//glDisable(GL_TEXTURE_GEN_S);
			//glDisable(GL_TEXTURE_GEN_T);


			///////////////////////////////////////////
			///				clamp V 				///
			///////////////////////////////////////////
			
			shadeList = &currentMesh->FacesLightMap[j].ClampV;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				if(currentMesh->FacesLightMap[j].env)
				{
					//$LB (02/11/2004)
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

					glActiveTextureARB (GL_TEXTURE0_ARB);
					glEnable(GL_TEXTURE_GEN_S);
					glEnable(GL_TEXTURE_GEN_T);
				}
				else
				{
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
					glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
				}
				RENDER_SHADE_LIST_TEXTURED_PASSLIGHTMAP_CLASSIC2
			}
			//glDisable(GL_TEXTURE_GEN_S);
			//glDisable(GL_TEXTURE_GEN_T);

			///////////////////////////////////////////
			///				No clamp  				///
			///////////////////////////////////////////
			
			shadeList = &currentMesh->FacesLightMap[j].NoClamp;

			if(shadeList->flat.size() || shadeList->gour.size() || shadeList->no.size())
			{
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
				glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
				if(currentMesh->FacesLightMap[j].env)
				{
					glActiveTextureARB (GL_TEXTURE0_ARB);
					glEnable(GL_TEXTURE_GEN_S);
					glEnable(GL_TEXTURE_GEN_T);
				}

				RENDER_SHADE_LIST_TEXTURED_PASSLIGHTMAP_CLASSIC2
			}
			//glDisable(GL_TEXTURE_GEN_S);
			//glDisable(GL_TEXTURE_GEN_T);

			glActiveTextureARB(GL_TEXTURE0_ARB);
			glDisable(GL_TEXTURE_2D);

			glActiveTextureARB(GL_TEXTURE1_ARB);
			glDisable(GL_TEXTURE_2D);

			glActiveTextureARB(GL_TEXTURE2_ARB);
			glDisable(GL_TEXTURE_2D);
		}
		glActiveTextureARB(GL_TEXTURE2_ARB);
		glDisable(GL_TEXTURE_2D);
		glActiveTextureARB(GL_TEXTURE1_ARB);
		glDisable(GL_TEXTURE_2D);
		glActiveTextureARB(GL_TEXTURE0_ARB);
		glDisable(GL_TEXTURE_2D);
		
	}

}



///////////////////////////////////////////////////////////////////////////
/// Direct rendering for dynamic objects (CLASSIC mode)					///
///////////////////////////////////////////////////////////////////////////
/// Input	: NONE
/// Output	: 
///		- Direct render the object on the screen (glBegin/glEnd)
/// Return	: NONE
void ZObject::RenderPass3Classic()
{
	vector<ZVert>	*Verts = &(currentMesh->Verts);
	int				i, j;

	FaceList		*facelist;

	ZFace			*curFace;
	int				*vrtRef;
	
	ZMaterial		*curMat;

	int				nbVert;
	int				ref;
	ZObject			*pere;

	ZMatrix			matx;
	matx = worldMat;
	matx._14 = matx._24 = matx._34 = matx._41 = matx._42 = matx._43 = matx._44 = 0.0f;


	// --------------> LIGHTING <---------------
	// ---> PASS for SMOOTH light rendering <---

	if(currentMesh->FacesMatGour.size())
	{
		for(j=0; j < currentMesh->FacesMatGour.size(); j++)
		{
			curMat = currentMesh->FacesMatGour[j].mat;
			curMat->PutGLparams();

			facelist = &(currentMesh->FacesMatGour[j].faces);

			glBegin(GL_TRIANGLES);

				for(i=0; i< facelist->size(); i++)
				{
					curFace = (*facelist)[i];
					vrtRef	= curFace->VertRef;

					if(curFace->dependency)
					{
						// Vertex number 0
						FIND_SHARED_VERTEX_ZObject
						if(pere->normalsTransformed)		glNormal3fv(pere->VertNormTransf[ref].vals);
						else								glNormal3fv( (matx*pere->GetMesh()->Verts[ref].Normal).vals );
						glVertex3fv(pere->VertsTransf[ref].vals);
						vrtRef++;

						// Vertex number 1
						FIND_SHARED_VERTEX_ZObject
						if(pere->normalsTransformed)		glNormal3fv(pere->VertNormTransf[ref].vals);
						else								glNormal3fv( (matx*pere->GetMesh()->Verts[ref].Normal).vals );
						glVertex3fv(pere->VertsTransf[ref].vals);
						vrtRef++;

						// Vertex number 2
						FIND_SHARED_VERTEX_ZObject
						if(pere->normalsTransformed)		glNormal3fv(pere->VertNormTransf[ref].vals);
						else								glNormal3fv( (matx*pere->GetMesh()->Verts[ref].Normal).vals );
						glVertex3fv(pere->VertsTransf[ref].vals);
					}
					else
					{
						// Vertex number 0
						glNormal3fv(VertNormTransf[*vrtRef].vals);
						glVertex3fv(VertsTransf[*vrtRef].vals);
						vrtRef++;

						// Vertex number 1
						glNormal3fv(VertNormTransf[*vrtRef].vals);
						glVertex3fv(VertsTransf[*vrtRef].vals);
						vrtRef++;

						// Vertex number 2
						glNormal3fv(VertNormTransf[*vrtRef].vals);
						glVertex3fv(VertsTransf[*vrtRef].vals);
					}
				}

			glEnd();
		}
	}


	// --------------> LIGHTING <---------------
	// ----> PASS for FLAT light rendering <----

	if(currentMesh->FacesMatFlat.size())
	{
		for(j=0; j < currentMesh->FacesMatFlat.size(); j++)
		{
			curMat = currentMesh->FacesMatFlat[j].mat;
			curMat->PutGLparams();

			facelist = &(currentMesh->FacesMatFlat[j].faces);

			glBegin(GL_TRIANGLES);

				for(i=0; i< facelist->size(); i++)
				{
					curFace = (*facelist)[i];
					vrtRef	= curFace->VertRef;

					if(curFace->dependency)
					{
						// Vertex number 0
						FIND_SHARED_VERTEX_ZObject
						glNormal3fv(FaceNormTransf[curFace->index].vals);
						glVertex3fv(pere->VertsTransf[ref].vals);
						vrtRef++;

						// Vertex number 1
						FIND_SHARED_VERTEX_ZObject
						glNormal3fv(FaceNormTransf[curFace->index].vals);
						glVertex3fv(pere->VertsTransf[ref].vals);
						vrtRef++;

						// Vertex number 2
						FIND_SHARED_VERTEX_ZObject
						glNormal3fv(FaceNormTransf[curFace->index].vals);
						glVertex3fv(pere->VertsTransf[ref].vals);
					}
					else
					{
						// Vertex number 0
						glNormal3fv(FaceNormTransf[curFace->index].vals);
						glVertex3fv(VertsTransf[*vrtRef].vals);
						vrtRef++;

						// Vertex number 1
						glNormal3fv(FaceNormTransf[curFace->index].vals);
						glVertex3fv(VertsTransf[*vrtRef].vals);
						vrtRef++;

						// Vertex number 2
						glNormal3fv(FaceNormTransf[curFace->index].vals);
						glVertex3fv(VertsTransf[*vrtRef].vals);
					}
				}

			glEnd();
		}
	}
}


///////////////////////////////////////////////////////////////////////////
/// Direct rendering for dynamic objects (CLASSIC mode)					///
///////////////////////////////////////////////////////////////////////////
/// Input	: NONE
/// Output	: 
///		- Direct render the object on the screen (glBegin/glEnd)
/// Return	: NONE
void ZObject::RenderPass4Classic()
{
	vector<ZVert>	*Verts = &(currentMesh->Verts);
	int				i, j;

	FaceList		*facelist;

	ZFace			*curFace;
	int				*vrtRef;
	
	int				nbVert;
	int				ref;
	ZObject			*pere;


	// --------------> LIGHTING <---------------
	// ----> PASS for FLAT light rendering <----

	if(currentMesh->FacesMatNo.size())
	{
		glShadeModel(GL_FLAT);

		for(j=0; j < currentMesh->FacesMatNo.size(); j++)
		{
			if(currentMesh->FacesMatNo[j].mat->IsOnMode(RENDER_TRANSP)==false /*|| currentMesh->FacesMatNo[j].mat->GetCoeffTransp()==0*/)
			{
				facelist = &(currentMesh->FacesMatNo[j].faces);

				glBegin(GL_TRIANGLES);

					for(i=0; i< facelist->size(); i++)
					{
						glColor3f(0.5f, 0.5f, 0.5f);
						curFace = (*facelist)[i];
						vrtRef	= curFace->VertRef;

						if(curFace->dependency)
						{
							// Vertex number 0
							FIND_SHARED_VERTEX_ZObject
							glVertex3fv(pere->VertsTransf[ref].vals);
							vrtRef++;
					
							// Vertex number 1
							FIND_SHARED_VERTEX_ZObject
							glVertex3fv(pere->VertsTransf[ref].vals);
							vrtRef++;

							// Vertex number 2
							FIND_SHARED_VERTEX_ZObject
							glVertex3fv(pere->VertsTransf[ref].vals);
						}
						else
						{
							// Vertex number 0
							glVertex3fv(VertsTransf[*vrtRef].vals);
							vrtRef++;
					
							// Vertex number 1
							glVertex3fv(VertsTransf[*vrtRef].vals);
							vrtRef++;

							// Vertex number 2
							glVertex3fv(VertsTransf[*vrtRef].vals);
						}
					}

				glEnd();
			}
		}
	}
}


///////////////////////////////////////////////////////////////////////////
/// Render the object in wired mode										///
///////////////////////////////////////////////////////////////////////////
/// Input	: NONE
/// Output	: 
///		- Render the BBOX of the object
/// Return	: NONE
void ZObject::RenderWired(float lineWidth)
{
	vector<ZVert>	*vert = &(currentMesh->Verts);
	int				i, j;

	FaceList		*listFace;

	ZFace			*curFace;
	ZVector3		*pos[3];
	int				*vrtRef;
	
	ZMaterial		*curMat;

	int				nbVert;
	int				ref;
	ZObject			*pere;
	

	glLineWidth(lineWidth);

	// --------------------------------------------------------
	// ------------- Treatment by Material (color) ------------
	// --------------------------------------------------------
	glBegin(GL_LINES);

		for(j=0; j < currentMesh->FacesMatGour.size(); j++)
		{
			curMat = currentMesh->FacesMatGour[j].mat;
			glColor3fv(curMat->color.vals);		

			// --- List of gouro faces ---
			listFace = &(currentMesh->FacesMatGour[j].faces);

			for(i=0; i< listFace->size(); i++)
			{
				curFace = (*listFace)[i];
				vrtRef	= curFace->VertRef;

				if(curFace->dependency)
				{
					// Vertex number 0
					FIND_SHARED_VERTEX_ZObject
					pos[0] = &(pere->VertsTransf[ref]);
					vrtRef++;

					// Vertex number 1
					FIND_SHARED_VERTEX_ZObject
					pos[1] = &(pere->VertsTransf[ref]);
					vrtRef++;

					// Vertex number 2
					FIND_SHARED_VERTEX_ZObject
					pos[2] = &(pere->VertsTransf[ref]);

					glVertex3fv(pos[0]->vals);
					glVertex3fv(pos[1]->vals);

					glVertex3fv(pos[1]->vals);
					glVertex3fv(pos[2]->vals);

					glVertex3fv(pos[2]->vals);
					glVertex3fv(pos[0]->vals);
				}
				else
				{
					glVertex3fv(VertsTransf[curFace->VertRef[0]].vals);
					glVertex3fv(VertsTransf[curFace->VertRef[1]].vals);

					glVertex3fv(VertsTransf[curFace->VertRef[1]].vals);
					glVertex3fv(VertsTransf[curFace->VertRef[2]].vals);

					glVertex3fv(VertsTransf[curFace->VertRef[2]].vals);
					glVertex3fv(VertsTransf[curFace->VertRef[0]].vals);
				}
			}
		}


		for(j=0; j < currentMesh->FacesMatFlat.size(); j++)
		{
			curMat = currentMesh->FacesMatFlat[j].mat;
			glColor3fv(curMat->color.vals);		

			// --- List of gouro faces ---
			listFace = &(currentMesh->FacesMatFlat[j].faces);

			for(i=0; i< listFace->size(); i++)
			{
				curFace = (*listFace)[i];
				vrtRef	= curFace->VertRef;

				if(curFace->dependency)
				{
					// Vertex number 0
					FIND_SHARED_VERTEX_ZObject
					pos[0] = &(pere->VertsTransf[ref]);
					vrtRef++;

					// Vertex number 1
					FIND_SHARED_VERTEX_ZObject
					pos[1] = &(pere->VertsTransf[ref]);
					vrtRef++;

					// Vertex number 2
					FIND_SHARED_VERTEX_ZObject
					pos[2] = &(pere->VertsTransf[ref]);

					glVertex3fv(pos[0]->vals);
					glVertex3fv(pos[1]->vals);

					glVertex3fv(pos[1]->vals);
					glVertex3fv(pos[2]->vals);

					glVertex3fv(pos[2]->vals);
					glVertex3fv(pos[0]->vals);
				}
				else
				{
					glVertex3fv(VertsTransf[curFace->VertRef[0]].vals);
					glVertex3fv(VertsTransf[curFace->VertRef[1]].vals);

					glVertex3fv(VertsTransf[curFace->VertRef[1]].vals);
					glVertex3fv(VertsTransf[curFace->VertRef[2]].vals);

					glVertex3fv(VertsTransf[curFace->VertRef[2]].vals);
					glVertex3fv(VertsTransf[curFace->VertRef[0]].vals);
				}
			}
		}


		for(j=0; j < currentMesh->FacesMatNo.size(); j++)
		{
			curMat = currentMesh->FacesMatNo[j].mat;
			glColor3fv(curMat->color.vals);		

			// --- List of gouro faces ---
			listFace = &(currentMesh->FacesMatNo[j].faces);

			for(i=0; i< listFace->size(); i++)
			{
				curFace = (*listFace)[i];
				vrtRef	= curFace->VertRef;

				if(curFace->dependency)
				{
					// Vertex number 0
					FIND_SHARED_VERTEX_ZObject
					pos[0] = &(pere->VertsTransf[ref]);
					vrtRef++;

					// Vertex number 1
					FIND_SHARED_VERTEX_ZObject
					pos[1] = &(pere->VertsTransf[ref]);
					vrtRef++;

					// Vertex number 2
					FIND_SHARED_VERTEX_ZObject
					pos[2] = &(pere->VertsTransf[ref]);

					glVertex3fv(pos[0]->vals);
					glVertex3fv(pos[1]->vals);

					glVertex3fv(pos[1]->vals);
					glVertex3fv(pos[2]->vals);

					glVertex3fv(pos[2]->vals);
					glVertex3fv(pos[0]->vals);
				}
				else
				{
					glVertex3fv(VertsTransf[curFace->VertRef[0]].vals);
					glVertex3fv(VertsTransf[curFace->VertRef[1]].vals);

					glVertex3fv(VertsTransf[curFace->VertRef[1]].vals);
					glVertex3fv(VertsTransf[curFace->VertRef[2]].vals);

					glVertex3fv(VertsTransf[curFace->VertRef[2]].vals);
					glVertex3fv(VertsTransf[curFace->VertRef[0]].vals);
				}
			}
		}

	glEnd();
}


///////////////////////////////////////////////////////////////////////////
/// Render the object in wired mode										///
///////////////////////////////////////////////////////////////////////////
/// Input	: NONE
/// Output	: 
///		- Render the BBOX of the object
/// Return	: NONE
void ZObject::ShaderPass()
{
	/*
	int				i, j;
	vector<ZVert>	*Verts = &(currentMesh->Verts);
	FaceList		*facelist;
	ZFace			*curFace;
	ZUV				*UV;
	int				*vrtRef;
	ZTexture		*curTex;
	FacesBySHADE	*shadeList;
	ZMatrix mat ;

	// ************* Treatment for non texturing ************** 
	glDisable(GL_BLEND);
	glDisable(GL_ALPHA_TEST);
	// ******* GOURAUD COLOR *******
		mat = worldMat ;
		ZMatrix avamat ;
		avamat = this->GetPRS()->mat ;

		cgGLSetMatrixParameterfr(ModelViewProj,mat.matxArray);
		mat.Inverse() ;
		cgGLSetMatrixParameterfr(ModelViewInverseProj,mat.matxArray);
		cgGLSetMatrixParameterfr(AvaViewProj,avamat.matxArray);
		cgGLSetStateMatrixParameter(WorldViewProj, CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
		cgGLSetManageTextureParameters(cgContext, CG_TRUE) ;
		
	   // On lance l'activation du programme Cg!
		cgGLEnableProfile(cgVertexProfile);					// Enable Our Vertex Shader Profile
		// Bind Our Vertex Program To The Current State
		cgGLBindProgram(cgVertexProgram);
	   // On lance l'activation du programme Cg!
		cgGLEnableProfile(cgFragmentProfile);					// Enable Our Vertex Shader Profile
		// Bind Our Vertex Program To The Current State
		cgGLBindProgram(cgFragmentProgram);

		// $MS : Place it outside the render loop to optimise
		cgTexture    = cgGetNamedParameter(cgFragmentProgram, "decal");

		for(j = 0;j<currentMesh->FacesTex1.size();j++)
		{
			
			shadeList = &currentMesh->FacesTex1[j].ClampUV;
			facelist = &(shadeList->flat);
			glShadeModel(GL_SMOOTH);
			glBegin(GL_TRIANGLES);
				for(i=0; i< facelist->size(); i++)
				{
					
						curFace = (*facelist)[i];
						vrtRef	= curFace->VertRef;
						curTex = curFace->GetMaterial()->GetTexture1() ;
						curTex->PutGLMultiparams0();
						UV		= curFace->UV1;
					
						// $MS : Deplace it from the loop to optimise
						//cgTexture    = cgGetNamedParameter(cgFragmentProgram, "decal");
	
						// Identify the textures to use for the pixel shader...
						cgGLSetTextureParameter( cgTexture, curTex->texID );
						cgGLEnableTextureParameter( cgTexture );
						glColor3fv(curFace->GetMaterial()->color1.vals);

			
						// Recupération des valeurs à passer au shader
						ZVert * vert = &((*Verts)[*vrtRef]);
						cgGLSetParameter4f(Indices,(*Verts)[*vrtRef].ID1,(*Verts)[*vrtRef].ID2,0.0,0.0) ;
						cgGLSetParameter4f(Weights,(*Verts)[*vrtRef].weight1,(*Verts)[*vrtRef].weight2,0.0,0.0) ;			
						glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);	
						glVertex3f((*Verts)[*vrtRef].x,(*Verts)[*vrtRef].y ,(*Verts)[*vrtRef].z);
						vrtRef++;
						UV++;
				
						// Vertex number 1
						cgGLSetParameter4f(Indices,(*Verts)[*vrtRef].ID1,(*Verts)[*vrtRef].ID2,0.0,0.0) ;
						cgGLSetParameter4f(Weights,(*Verts)[*vrtRef].weight1,(*Verts)[*vrtRef].weight2,0.0,0.0) ;
						glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);
						glVertex3f((*Verts)[*vrtRef].x,(*Verts)[*vrtRef].y ,(*Verts)[*vrtRef].z);
						vrtRef++;
						UV++;

						// Vertex number 2
						cgGLSetParameter4f(Indices,(*Verts)[*vrtRef].ID1,(*Verts)[*vrtRef].ID2,0.0,0.0) ;
						cgGLSetParameter4f(Weights,(*Verts)[*vrtRef].weight1,(*Verts)[*vrtRef].weight2,0.0,0.0) ;
						glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,UV->vals);
						glVertex3f((*Verts)[*vrtRef].x,(*Verts)[*vrtRef].y ,(*Verts)[*vrtRef].z);

						cgGLDisableTextureParameter( cgTexture );
						cgGLDisableProfile( cgFragmentProfile );

						
				}
		
				glEnd();
			
		}
		
		
				glLoadIdentity();
				cgGLDisableProfile(cgVertexProfile);
				cgGLDisableProfile(cgFragmentProfile);
				*/
}
///////////////////////////////////////////////////////////////////////////
/// Transform the vertices with his matrix (in PRS)						///
///////////////////////////////////////////////////////////////////////////
/// Input	: matrix of the object in the World referencial
/// Output	: 
///		- compute the vertices transformated and store them in 'VertsTransf'
/// Return	: NONE
void ZObject::TransformAllVerts()
{
	if(currentMesh)
	{
		if(currentMesh->NbVerts<1)
		{
			VertsTransf.resize(0);
			return;
		}

		if(VertsTransf.size() != currentMesh->NbVerts)		VertsTransf.resize(currentMesh->NbVerts);

		vector<ZVert>		*vertInit;	
		vertInit	= &(currentMesh->Verts);

		VertsTransf[0] = worldMat * ((*vertInit)[0]);
		for(int i=1; i<currentMesh->NbVerts; i++)		VertsTransf[i] =  worldMat * ((*vertInit)[i]);
	}
	else
		VertsTransf.resize(0);
}


void ZObject::TransformNormals()
{
	if(currentMesh)
	{
		int i;

		ZMatrix		mat = worldMat;
		mat._14 = mat._24 = mat._34 = mat._41 = mat._42 = mat._43 = mat._44 = 0.0f;

		if( (currentMesh->NbFaces<1) || (currentMesh->NbVerts<1) )
		{
			FaceNormTransf.resize(0);
			VertNormTransf.resize(0);
			return;
		}

		if(FaceNormTransf.size() != currentMesh->NbFaces)		FaceNormTransf.resize(currentMesh->NbFaces);
		if(VertNormTransf.size() != currentMesh->NbVerts)		VertNormTransf.resize(currentMesh->NbVerts);

		ZFace		*Face;
		ZVert		*Vert;
		Vert = &(currentMesh->Verts[0]);
		Face = &(currentMesh->Faces[0]);

		if(currentMesh->dependency)
		{
			// Utlise les normales déjà calculées pour le mesh DEPENDENCY
			for(i=0; i<currentMesh->NbFaces; i++, Face++)		FaceNormTransf[i] = Face->Normal;
			for(i=0; i<currentMesh->NbVerts; i++, Vert++)		VertNormTransf[i] = Vert->Normal;
		}
		else
		{
			// Calcule les normales transformées à partir des normales statiques du mesh
			for(i=0; i<currentMesh->NbFaces; i++, Face++)		FaceNormTransf[i] = mat * Face->Normal;
			for(i=0; i<currentMesh->NbVerts; i++, Vert++)		VertNormTransf[i] = mat * Vert->Normal;
		}

		if(((ZScene*)scene3D)->accelerated==false)
		{
			// Normalisation pour le rendu Software
			for(i=0; i<currentMesh->NbFaces; i++)				FaceNormTransf[i].Normalize();
			for(i=0; i<currentMesh->NbVerts; i++)				VertNormTransf[i].Normalize();
		}
	}
	else
	{
		FaceNormTransf.resize(0);
		VertNormTransf.resize(0);
	}
}


///////////////////////////////////////////////////////////////////////////
/// Render the BBOX of the object										///
///////////////////////////////////////////////////////////////////////////
/// Input	: NONE
/// Output	: 
///		- Render the BBOX of the object
/// Return	: NONE
void ZObject::RenderBOX(const ZVector3 &color, float lineWidth)
{
	glColor3f(color.x, color.y, color.z);
	glLineWidth(lineWidth);

	glLoadMatrixf(worldMat.matxArray);		// load the world Matrix

	ZVector3	vect0, vect1;
	vect0.SetCoord(currentMesh->xmin, currentMesh->ymin, currentMesh->zmin);
	vect1.SetCoord(currentMesh->xmax, currentMesh->ymax, currentMesh->zmax);

	glBegin(GL_LINE_STRIP);
		glVertex3f(vect0.x, vect1.y, vect1.z);			glVertex3f(vect1.x, vect1.y, vect1.z);
		glVertex3f(vect1.x, vect1.y, vect0.z);			glVertex3f(vect0.x, vect1.y, vect0.z);
		glVertex3f(vect0.x, vect1.y, vect1.z);			glVertex3f(vect0.x, vect0.y, vect1.z);
		glVertex3f(vect1.x, vect0.y, vect1.z);			glVertex3f(vect1.x, vect0.y, vect0.z);
		glVertex3f(vect0.x, vect0.y, vect0.z);			glVertex3f(vect0.x, vect0.y, vect1.z);
	glEnd();

	glBegin(GL_LINES);
		glVertex3f(vect0.x, vect1.y, vect0.z);			glVertex3f(vect0.x, vect0.y, vect0.z);
		glVertex3f(vect1.x, vect1.y, vect0.z);			glVertex3f(vect1.x, vect0.y, vect0.z);
		glVertex3f(vect1.x, vect1.y, vect1.z);			glVertex3f(vect1.x, vect0.y, vect1.z);
	glEnd();
}
