/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///																																  ///
///		FICHIER :	ZooM3D.h																									  ///
///																																  ///
///		NATURE	:	Reading and saving an M3D File for a scene          														  ///
///																																  ///
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



#ifndef __ZOOM3D_H__
#define	__ZOOM3D_H__




#include	"..\..\SCOL\ZooSCOL.h"






///////////////////////////////////////////////////
////										   ////
///					CHARGEMENT					///
////										   ////
///////////////////////////////////////////////////
struct Load3d
{
	FILE	*f;
	char	*buf;
	char	bufload3d[1024] ;
	int		argn;
	char	*argv[512] ;
};
typedef struct Load3d *load3d;


///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3Dlitligne																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3Dlitligne(FILE *f, char *buf, int n);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3Dlitlignebuf																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3Dlitlignebuf(load3d l, char *buf, int n);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3Ddecoupe																			///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3Ddecoupe(char *comm, char **mots);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3Dnextline																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3Dnextline(load3d l);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3Dloadvrt																			///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3Dloadvrt(ZScene *s, load3d l, ZMesh *curMesh, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3Dloadpol2																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3Dloadpol2(ZScene *s, load3d l, ZMesh *curMesh, ZTexture *curTex, ZMaterial *curMat);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3Dloadpol																			///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3Dloadpol(ZScene *s, load3d l, ZMesh *curMesh);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3Dlitligne																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadUnknown(ZScene *s, load3d l, ZObject *nodeBase);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DrecursObj																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DrecursObj(ZScene *s, load3d l, ZNode *nodeBase, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadMesh																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadMesh(ZScene *s, load3d l, ZNode *nodeBase, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadCam																			///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadCam(ZScene *s, load3d l, ZNode *nodeBase, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadShell																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadShell(ZScene *s, load3d l, ZNode *nodeBase, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadLight																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadLight(ZScene *s, load3d l, ZNode *baseNode, float coeff);

//////////////////////////////////////////////////////////////////////////////////////////////////
//////// ZM3loadBone /////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadBone(ZScene *s, load3d l, ZNode *baseNode,float coeff);

//////////////////////////////////////////////////////////////////////////////////////////////////
//////// M3DloadSkelet/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadSkelet(ZScene *s, load3d l, ZNode *baseNode, float coeff);

///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadColorLight																	///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadColorLight(ZScene *s, load3d l, ZNode *baseNode, float coeff);


///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadMat																			///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadMat(ZScene *s, load3d l);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadCollRec																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadCollRec(ZScene *s, load3d l, ZColl *coll, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadColSph																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadColSph(ZScene *s, load3d l, ZColl *coll, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadColObb																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadColObb(ZScene *s, load3d l, ZColl *coll, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadColTri																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadColTri(ZScene *s, load3d l, ZColl *coll, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadColNode																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadColNode(ZScene *s, load3d l, ZColl *coll, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadColl																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadColl(ZScene *s, load3d l, ZNode *baseNode, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadAnim																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadAnim(ZScene *s, load3d l, ZNode *baseNode, float coeff);


///////////////////////////////////////////////////////////////////////////////////////////////
///		M3DloadEmitter																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadEmitter(ZScene *s, load3d l, ZNode *nodeBase, float coeff);

//////////////////////////////////////////////////////////////////////////////////////////////////
///  renvoie un bones en fonction d'un ID 
///////////////////////////////////////////////////////////////////////////////////////////////////
ZBone* M3DGetBoneByID(ZScene *s,int ID) ;

///////////////////////////////////////////////////////////////////////////////////////////////
///		M3DloadParticle																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadParticle(ZScene *s, load3d l, ZNode *nodeBase, float coeff);


///////////////////////////////////////////////////////////////////////////////////////////////
///		M3DloadEffect																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadEffect(ZScene *s, load3d l, ZNode *nodeBase, float coeff);


///////////////////////////////////////////////////////////////////////////////////////////////
///		M3DloadColor																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadColor(ZScene *s, load3d l, ZNode *nodeBase, float coeff);



ZAnim *M3DloadAnimFromFile(ZScene *s, load3d l, ZNode *baseNode, float coeff) ;
ZAnim * M3DloadAnimationFile(ZScene *s, load3d l, ZNode* nodeBase, float coeff) ;
///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadA																			///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3DloadA(ZScene *s, load3d l, ZNode*	nodeBase, float coeff);


int M3DloadFilter(char *buf, ZTexture *curTex);


///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3Dload																			///
///////////////////////////////////////////////////////////////////////////////////////////////
int M3Dload(ZScene *s, FILE *f, ZNode*	nodeBase, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3DloadFILE																		///
///////////////////////////////////////////////////////////////////////////////////////////////
int ZM3DloadFILE(mmachine m, int s3d_buf, FILE *f, ZNode* nodeBase, float coeff);



///////////////////////////////////////////////////////////////////////////////////////////////
///		ZM3Dloadbuf																			///
///////////////////////////////////////////////////////////////////////////////////////////////
int ZM3Dloadbuf(mmachine m, int s3d_buf, char *buf, ZNode* nodeBase, float coeff);









///////////////////////////////////////////////////
////										   ////
///					SAUVEGARDE					///
////										   ////
///////////////////////////////////////////////////
struct Save3d
{
	int		(*cb)(char *buf,int *user);
	int		*user;
	FILE	*file;
};
typedef struct Save3d *save3d;



struct Sv3d
{
	mmachine m;
	int n;
};
typedef struct Sv3d *sv3d;





int ZM3DsaveAnim(ZScene *s, save3d l, ZAnim *curAnim, float coeff);

void ZM3DsaveBuf(ZScene *s, save3d l, char *format, ...);

int ZM3DsaveMat(ZScene *s, save3d l);
int ZM3DsaveMat(ZScene *s, save3d l, ZMaterial *curMat);
int ZM3DsaveEmitter(ZScene *s, save3d l, ZEmitter *emitter);
int ZM3DsaveParticle(ZScene *s, save3d l, ZParticle *particle);
int ZM3DsaveEffect(ZScene *s, save3d l, ZEffect *effect);

//int ZM3Dsave(ZScene *s, FILE *file, ZNode *curNode, bool mat, bool mesh, bool anim, bool cam, bool coll, bool light);
int ZM3Dsave(ZScene *s, save3d l, ZNode *curNode, bool first, int flag);






#endif