54 lines
1.0 KiB
C
54 lines
1.0 KiB
C
|
|
#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) {};
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
|