SBSPSS/Utils/Libs/DaveLib/facestore.h

155 lines
3.8 KiB
C
Raw Normal View History

2001-02-08 15:04:49 +01:00
/****************************************/
/*** Generic Face Compilation Storage ***/
/****************************************/
#ifndef __FACESTORE_HEADER__
#define __FACESTORE_HEADER__
#include <ginio.h>
#include <gintex.h>
#include <Vector>
#include <TexGrab.h>
#include "..\..\..\tools\data\include\dStructs.h"
using namespace std;
//***************************************************************************
2001-03-08 00:20:09 +01:00
/*
2001-02-08 15:04:49 +01:00
struct sFaceTexList
{
GString Name;
int TexGrabId;
};
2001-03-08 00:20:09 +01:00
*/
2001-02-08 15:04:49 +01:00
//***************************************************************************
2001-06-28 19:48:30 +02:00
/*
2001-02-08 15:04:49 +01:00
class CFace
{
2001-03-08 00:20:09 +01:00
public:
2001-06-28 19:48:30 +02:00
int PntCount;
2001-03-08 00:20:09 +01:00
int Mat;
Vector3 vtx[4];
int pts[4];
2001-06-28 19:48:30 +02:00
// int idx[4];
2001-03-08 00:20:09 +01:00
sUV uvs[4];
2001-06-28 19:48:30 +02:00
// int vis[4];
2001-03-08 00:20:09 +01:00
Vector3 Normal;
bool Avail;
2001-05-02 20:40:41 +02:00
// int ID;
2001-03-08 00:20:09 +01:00
GString TexName;
2001-05-02 20:40:41 +02:00
int TPageFlag;
2001-03-08 00:20:09 +01:00
};
2001-06-28 19:48:30 +02:00
*/
2001-03-08 00:20:09 +01:00
class CFace
{
2001-02-08 15:04:49 +01:00
public:
CFace()
{
vtx.resize(3);
pts.resize(3);
uvs.resize(3);
}
int Mat;
vector<Vector3> vtx;
vector<int> pts;
vector<sUV> uvs;
Vector3 Normal;
bool Avail;
GString TexName;
2001-06-28 19:48:30 +02:00
int TPageFlag;
2001-07-11 21:02:00 +02:00
int OtOfs;
2001-02-08 15:04:49 +01:00
};
2001-06-28 19:48:30 +02:00
2001-02-08 15:04:49 +01:00
//***************************************************************************
#ifndef sTriFace
struct sTriFace
{
int Mat;
2001-05-02 20:40:41 +02:00
int Flags;
2001-02-08 15:04:49 +01:00
Vector3 vtx[3];
int pts[3];
sUV uvs[3];
};
#endif
//***************************************************************************
class CFaceStore
{
public:
2001-06-28 19:48:30 +02:00
CFaceStore() {MaxStrip = 3;TexGrab=0;}
CFaceStore(int Max) {MaxStrip=Max;TexGrab=0;}
2001-02-08 15:04:49 +01:00
~CFaceStore(){};
2001-05-02 20:40:41 +02:00
void SetTPageFlag(CFace &F,int MatFlag);
CFace &AddFace(vector<Vector3> const &P, const sGinTri &T, const sUVTri &uv,GString const &Tex,int MatFlag=0,bool ProcessTexFlag=false);
2001-03-08 00:20:09 +01:00
CFace &AddFace(CFace &F,bool TexFlag=true);
void AddFaces(vector<CFace>&Faces,bool TexFlag=true);
void AddFaces(CFaceStore &Faces,bool TexFlag=true);
2001-02-08 15:04:49 +01:00
CFace &AddFace(sTriFace &Face,int ID=0);
2001-02-08 17:30:06 +01:00
void SetTexGrab(CTexGrab &NewGrab) {TexGrab=&NewGrab;}
2001-02-08 15:04:49 +01:00
int AddTex(GString const &TexName);
2001-03-01 18:03:15 +01:00
2001-06-28 19:48:30 +02:00
void Process(vector<sTri> &OutTriList,vector<sQuad> &OutQuadList,vector<sVtx> &OutVtxList);
2001-03-12 18:11:40 +01:00
int WriteTriList(FILE *File,vector<sTri> &List);
int WriteQuadList(FILE *File,vector<sQuad> &List);
int WriteVtxList(FILE *File,vector<sVtx> &List);
2001-02-08 15:04:49 +01:00
vector<CFace> const &GetFaceList() {return(FaceList);}
int GetFaceCount() {return(FaceList.size());}
vector<CFace> const &GetTriFaceList() {return(TriFaceList);}
int GetTriFaceCount() {return(TriFaceList.size());}
vector<CFace> const &GetQuadFaceList() {return(QuadFaceList);}
int GetQuadFaceCount() {return(QuadFaceList.size());}
2001-06-28 19:48:30 +02:00
static int AddVtx(vector<sVtx> &OutVtxList,Vector3 &Vtx);
static int AddVtx(vector<sVtx> &OutVtxList,sVtx &ThisVtx);
void ParseVtx4BBox(sVtx &Vtx);
2001-02-08 15:04:49 +01:00
void setMaxStripLength(int v) {MaxStrip = v;}
CFace& operator []( int nIndex ) {return(FaceList[nIndex]);}
2001-06-28 19:48:30 +02:00
sBBox &GetBBox() {return(BBox);}
2001-02-08 15:04:49 +01:00
private:
void Quad();
void SetupUV(CFace const &In, sTri &Out);
void SetupUV(CFace const &In, sQuad &Out);
2001-06-28 19:48:30 +02:00
void BuildOutTriList(vector<sTri> &OutTriList,vector<sVtx> &OutVtxList);
void BuildOutQuadList(vector<sQuad> &OutQuadList,vector<sVtx> &OutVtxList);
2001-02-08 15:04:49 +01:00
2001-06-28 19:48:30 +02:00
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);
2001-02-08 15:04:49 +01:00
2001-06-28 19:48:30 +02:00
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 );
2001-02-08 15:04:49 +01:00
int MaxStrip;
vector<CFace> FaceList;
2001-06-28 19:48:30 +02:00
CTexGrab *TexGrab;
2001-02-08 15:04:49 +01:00
vector<CFace> TriFaceList;
vector<CFace> QuadFaceList;
2001-06-28 19:48:30 +02:00
vector<sVtx> VtxList;
sBBox BBox;
2001-02-08 15:04:49 +01:00
};
#endif