93 lines
1.5 KiB
C++
93 lines
1.5 KiB
C++
#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();
|
|
};
|