/****************************************/ /*** Generic Face Compilation Storage ***/ /****************************************/ #ifndef __FACESTORE_HEADER__ #define __FACESTORE_HEADER__ #include #include #include #include #include "..\..\..\tools\data\include\dStructs.h" using namespace std; //*************************************************************************** /* struct sFaceTexList { GString Name; int TexGrabId; }; */ //*************************************************************************** /* class CFace { public: int PntCount; int Mat; Vector3 vtx[4]; int pts[4]; // int idx[4]; sUV uvs[4]; // int vis[4]; Vector3 Normal; bool Avail; // int ID; GString TexName; int TPageFlag; }; */ class CFace { public: CFace() { vtx.resize(3); pts.resize(3); uvs.resize(3); } int Mat; vector vtx; vector pts; vector uvs; Vector3 Normal; bool Avail; GString TexName; int TPageFlag; int OtOfs; }; //*************************************************************************** #ifndef sTriFace struct sTriFace { int Mat; int Flags; Vector3 vtx[3]; int pts[3]; sUV uvs[3]; }; #endif //*************************************************************************** class CFaceStore { public: CFaceStore() {MaxStrip = 3;TexGrab=0;} CFaceStore(int Max) {MaxStrip=Max;TexGrab=0;} ~CFaceStore(){}; void SetTPageFlag(CFace &F,int MatFlag); CFace &AddFace(vector const &P, const sGinTri &T, const sUVTri &uv,GString const &Tex,int MatFlag=0,bool ProcessTexFlag=false); CFace &AddFace(CFace &F,bool TexFlag=true); void AddFaces(vector&Faces,bool TexFlag=true); void AddFaces(CFaceStore &Faces,bool TexFlag=true); CFace &AddFace(sTriFace &Face,int ID=0); void SetTexGrab(CTexGrab &NewGrab) {TexGrab=&NewGrab;} int AddTex(GString const &TexName); void Process(vector &OutTriList,vector &OutQuadList,vector &OutVtxList); int WriteTriList(FILE *File,vector &List); int WriteQuadList(FILE *File,vector &List); int WriteVtxList(FILE *File,vector &List); vector const &GetFaceList() {return(FaceList);} int GetFaceCount() {return(FaceList.size());} vector const &GetTriFaceList() {return(TriFaceList);} int GetTriFaceCount() {return(TriFaceList.size());} vector const &GetQuadFaceList() {return(QuadFaceList);} int GetQuadFaceCount() {return(QuadFaceList.size());} static int AddVtx(vector &OutVtxList,Vector3 &Vtx); static int AddVtx(vector &OutVtxList,sVtx &ThisVtx); void ParseVtx4BBox(sVtx &Vtx); void setMaxStripLength(int v) {MaxStrip = v;} CFace& operator []( int nIndex ) {return(FaceList[nIndex]);} sBBox &GetBBox() {return(BBox);} private: void Quad(); void SetupUV(CFace const &In, sTri &Out); void SetupUV(CFace const &In, sQuad &Out); void BuildOutTriList(vector &OutTriList,vector &OutVtxList); void BuildOutQuadList(vector &OutQuadList,vector &OutVtxList); int QuadGetAttached(int FaceNo); void QuadGetPnts(CFace &F,int *Join0,int *Join1,int *Pnt); void QuadGetUVs(CFace &F,int *Join0,int *Join1,int *Pnt); void OrderPnts( CFace &F ,int unc); bool CanConnect( int f0, int f1 ); int CountFacesAttached ( int f ); void FollowFace( int id, CFace &F ); int GetUnconnectedPoint( int f0, int f1, int &f0p0, int &f0p1 ); bool GetFace( CFace & F ); int MaxStrip; vector FaceList; CTexGrab *TexGrab; vector TriFaceList; vector QuadFaceList; vector VtxList; sBBox BBox; }; #endif