- //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);