#pragma once struct MeshVertex { vec4 Position; vec4 Normal; }; struct Instance { Matrix transform; }; class Mesh { public: Mesh(); struct VertexInfo { int Pos; int Normal; int UV; bool operator < (const VertexInfo& v) const { if (Pos == v.Pos) { if (Normal == v.Normal) { return UV < v.UV; } return Normal < v.Normal; } return Pos < v.Pos; } }; int VertexCount; int IndexCount; int FaceCount; static const int MaxVertexBuffer = 65536; static const int MaxIndexBuffer = 65536 * 9 / 2; MeshVertex* VertexBuffer; unsigned short* IndexBuffer; struct OpInfo { void Reset(); MeshVertex NextVB[Mesh::MaxVertexBuffer]; unsigned short int NextIB[Mesh::MaxIndexBuffer]; int NextVertexCount; int NextIndexCount; int NextFaceCount; int EdgeCount; unsigned int EdgeConfiguration[Mesh::MaxIndexBuffer]; unsigned char EdgeUsage[Mesh::MaxIndexBuffer]; int MakeEdgeID(unsigned short VertexA, unsigned short VertexB); unsigned short int EdgeID[Mesh::MaxIndexBuffer]; }; OpInfo OP; unsigned int VertexArrayObject; unsigned int VertexArrayBuffer; unsigned int IndexBufferObject; void Render(); void Lock(); void Unlock(); void Transform(const Matrix& transform); void CreateCube(); void CreateSphere(unsigned int lod); private: void Homogenize(); void GenerateNormals(); void NormalizeNormals(); void CatmullClarkSubdivide(); void StandardSubdivide(); void Extrude(float extend); void Bevel(float extend, float minAngle); void Triangulate(); };