//abstract Mesh class
struct TKar_Face
{
unsigned int Start;
unsigned int Count;
};
class TKar_Mesh
{
protected:
vector<TKar_Face> Faces;
public:
bool UseColor;
bool UseNormal;
bool UseTexCoord;
bool UseIndex;
virtual void SetVerticeList(void* List,unsigned int Size)=0;
virtual void SetNormalList(void* List,unsigned int Size)=0;
virtual void SetColorList(void* List,unsigned int Size)=0;
virtual void SetTexCoordList(void* List,unsigned int Size)=0;
virtual void SetIndexList(void* List,unsigned int Size)=0;
virtual void SetFaceList(TKar_Face* List,unsigned int Size)=0;
virtual void AddVertex(float x,float y,float z)=0;
virtual void AddColor(float r,float g,float b)=0;
virtual void AddNormal(float x,float y,float z)=0;
virtual void AddTexCoord(float u,float v)=0;
virtual void AddIndex(unsigned int ind)=0;
virtual void AddFace(unsigned int Start,unsigned int Count)=0;
virtual void Generate()=0;
virtual void Draw(unsigned int Face)=0;
};
//OpenGL implementation
struct TKar_Vertex{float x,y,z;};
struct TKar_Normal{float x,y,z;};
struct TKar_TexCoord{float u,v;};
struct TKar_VertexColor{float r,g,b;};
typedef unsigned int TKar_Index;
template <class T> class TKar_GraphicBufferOGL
{
protected:
T* Data;
unsigned int Count;
unsigned int ReservedElements;
unsigned int VBOID;
unsigned int BufferType;
unsigned int BufferDataType;
bool ExternalList;
public:
TKar_GraphicBufferOGL();
bool Generate(unsigned int ABufferType,unsigned int ABufferDataType);
void AddElement(const T AElement);
void Clean();
void Bind();
void Unbind();
unsigned int GetLen();
T* Get(unsigned int Index);
};
class TKar_MeshOGL:public TKar_Mesh
{
protected:
vector<TKar_GraphicBufferOGL<TKar_Index>> IndexBuffers;
TKar_GraphicBufferOGL<TKar_Vertex> VertexBuffer;
TKar_GraphicBufferOGL<TKar_Normal> NormalBuffer;
TKar_GraphicBufferOGL<TKar_VertexColor> ColorBuffer;
TKar_GraphicBufferOGL<TKar_TexCoord> TexCoordBuffer;
TKar_GraphicBufferOGL<TKar_Index> IndexBuffer;
public:
void SetVerticeList(void* List,unsigned int Size);
void SetNormalList(void* List,unsigned int Size);
void SetColorList(void* List,unsigned int Size);
void SetTexCoordList(void* List,unsigned int Size);
void SetIndexList(void* List,unsigned int Size);
void SetFaceList(TKar_Face* List,unsigned int Size);
void AddVertex(float x,float y,float z);
void AddColor(float r,float g,float b);
void AddNormal(float x,float y,float z);
void AddTexCoord(float u,float v);
void AddIndex(unsigned int ind);
void AddFace(unsigned int Start,unsigned int Count);
void Generate();
void Draw(unsigned int Face);
};
//how to use
TKar_Mesh* Mesh=Context->GenerateMesh(FileName);
if (Data->VertexCount>0)
Mesh->SetVerticeList(Data->Vertice,Data->VertexCount*sizeof(TKar_ModelVertex));
if (Data->NormalCount>0)
{
Mesh->UseNormal=true;
Mesh->SetNormalList(Data->Normals,Data->NormalCount*sizeof(TKar_ModelNormal));
}
if (Data->ColorCount>0)
{
Mesh->UseColor=true;
Mesh->SetColorList(Data->Colors,Data->ColorCount*sizeof(TKar_ModelVertexColor));
}
if (Data->IndexCount>0)
{
Mesh->UseIndex=true;
Mesh->SetIndexList(Data->Indices,Data->IndexCount*sizeof(TKar_ModelIndex));
}
if (Data->TexCoordCount>0)
{
Mesh->UseTexCoord=true;
Mesh->SetTexCoordList(Data->TexCoords,Data->TexCoordCount*sizeof(TKar_ModelTexCoord));
}
for (unsigned int i=0;i<Data->FaceCount;i++)
Mesh->AddFace(Data->Faces[i].Start,Data->Faces[i].Count);
Mesh->Generate();
//draw
for (int i=0;i<Mesh->Faces.size();i++)
Mesh->Draw(i);