#pragma once
#include <cstdint>
#include <tuple>
#include <vector>
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<int, int> 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) {};
};



