#pragma once #include #include #include using namespace std; #define sizeof_field(_struct, _field) sizeof(((_struct*)0)->_field) // 顶点最多关联4个骨骼 #define MAX_NUM_BONES_PER_VERTEX 4 struct Vector2 { float x; float y; }; struct Vector3 { float x; float y; float z; }; struct Vertex { struct UClass { virtual void BindLayout() = 0; }; }; struct PosVertex : public Vertex { Vector3 Position = {}; struct UClass : public Vertex::UClass{ int MemCount = 1; tuple Position{sizeof_field(PosVertex, Position), offsetof(PosVertex, Position)}; virtual void BindLayout() {}; }; }; struct TexVertex : public Vertex { Vector3 Position = {}; Vector3 Normal = {}; Vector2 TexCoords = {}; }; struct BoneVertex : public Vertex { Vector3 Position = {}; Vector2 TexCoords = {}; Vector3 Normal = {}; Vector3 Tangent = {}; // 骨骼蒙皮数据 float Weights[MAX_NUM_BONES_PER_VERTEX] = {}; uint32_t BoneIDs[MAX_NUM_BONES_PER_VERTEX] = {}; void AddBoneData(uint32_t boneID, float weight) {}; };