FCT
载入中...
搜索中...
未找到
ModelLoader.h
浏览该文件的文档.
1//
2// Created by Administrator on 2025/4/21.
3//
4#include "../Context/Vertex.h"
5#ifndef MODELLOADER_H
6#define MODELLOADER_H
7namespace FCT
8{
10 {
11 ModelVertex() : position(0.0f, 0.0f, 0.0f),
12 normal(0.0f, 0.0f, 1.0f),
13 tangent(1.0f, 0.0f, 0.0f),
14 bitangent(0.0f, 1.0f, 0.0f)
15 {
16 for (int i = 0; i < 8; i++) {
17 texCoords[i] = Vec2(0.0f, 0.0f);
18 }
19
20 for (int i = 0; i < 8; i++) {
21 colors[i] = Vec4(1.0f, 1.0f, 1.0f, 1.0f);
22 }
23 }
30 };
32 {
33
34 };
35 struct ModelMesh
36 {
38 std::vector<ModelVertex> vertices;
39 std::vector<uint32_t> indices;
40 std::string name;
41 };
43 {
44 std::vector<ModelObject*> children;
46 };
47 struct ModelData
48 {
49 std::vector<ModelMaterial*> materials;
50 std::vector<ModelMesh*> meshes;
51 std::vector<ModelObject*> objects;
52 ModelMesh* findMesh(const std::string &name)
53 {
54 auto it = std::find_if(meshes.begin(), meshes.end(), [&name](const ModelMesh* mesh)
55 {
56 return mesh->name == name;
57 });
58
59 return (it != meshes.end()) ? *it : nullptr;
60 }
61 };
62
63 inline void setVertexAttributeFromModel(Vertex& vertex, size_t elementIndex,
64 const VertexElement& element,
65 const ModelVertex& modelVertex) {
66 ModelVertexAttribute modelAttr = element.getModelAttribute();
67 Format format = element.getFormat();
68
69 if (modelAttr == ModelVertexAttribute::Position) {
70 switch (format) {
72 vertex.setAttribute(elementIndex, Vec2(modelVertex.position.x, modelVertex.position.y));
73 break;
75 vertex.setAttribute(elementIndex, Vec3(modelVertex.position.x, modelVertex.position.y, modelVertex.position.z));
76 break;
78 vertex.setAttribute(elementIndex, Vec4(modelVertex.position.x, modelVertex.position.y, modelVertex.position.z, 1.0f));
79 break;
80 default:
81 break;
82 }
83 return;
84 }
85
86 if (modelAttr == ModelVertexAttribute::Normal) {
87 switch (format) {
89 vertex.setAttribute(elementIndex, Vec3(modelVertex.normal.x, modelVertex.normal.y, modelVertex.normal.z));
90 break;
91 default:
92 break;
93 }
94 return;
95 }
96
97 if (modelAttr == ModelVertexAttribute::Tangent) {
98 switch (format) {
100 vertex.setAttribute(elementIndex, Vec3(modelVertex.tangent.x, modelVertex.tangent.y, modelVertex.tangent.z));
101 break;
102 default:
103 break;
104 }
105 return;
106 }
107
108 if (modelAttr == ModelVertexAttribute::Bitangent) {
109 switch (format) {
111 vertex.setAttribute(elementIndex, Vec3(modelVertex.bitangent.x, modelVertex.bitangent.y, modelVertex.bitangent.z));
112 break;
113 default:
114 break;
115 }
116 return;
117 }
118
119 if (modelAttr >= ModelVertexAttribute::TexCoord0 && modelAttr <= ModelVertexAttribute::TexCoord7) {
120 size_t texCoordIndex = static_cast<size_t>(modelAttr) - static_cast<size_t>(ModelVertexAttribute::TexCoord0);
121 if (texCoordIndex < 8) {
122 switch (format) {
124 vertex.setAttribute(elementIndex, Vec2(modelVertex.texCoords[texCoordIndex].x, modelVertex.texCoords[texCoordIndex].y));
125 break;
126 default:
127 break;
128 }
129 }
130 return;
131 }
132
133 if (modelAttr >= ModelVertexAttribute::Color0 && modelAttr <= ModelVertexAttribute::Color7) {
134 size_t colorIndex = static_cast<size_t>(modelAttr) - static_cast<size_t>(ModelVertexAttribute::Color0);
135 if (colorIndex < 8) {
136 switch (format) {
138 vertex.setAttribute(elementIndex, Vec3(modelVertex.colors[colorIndex].x, modelVertex.colors[colorIndex].y, modelVertex.colors[colorIndex].z));
139 break;
141 vertex.setAttribute(elementIndex, Vec4(modelVertex.colors[colorIndex].x, modelVertex.colors[colorIndex].y, modelVertex.colors[colorIndex].z, modelVertex.colors[colorIndex].w));
142 break;
144 {
145 Vector4<uint8_t> colorData(
146 static_cast<uint8_t>(modelVertex.colors[colorIndex].x * 255.0f),
147 static_cast<uint8_t>(modelVertex.colors[colorIndex].y * 255.0f),
148 static_cast<uint8_t>(modelVertex.colors[colorIndex].z * 255.0f),
149 static_cast<uint8_t>(modelVertex.colors[colorIndex].w * 255.0f)
150 );
151 vertex.setAttribute(elementIndex, colorData);
152 }
153 break;
155 {
156 Vector4<uint8_t> colorData(
157 static_cast<uint8_t>(modelVertex.colors[colorIndex].z * 255.0f),
158 static_cast<uint8_t>(modelVertex.colors[colorIndex].y * 255.0f),
159 static_cast<uint8_t>(modelVertex.colors[colorIndex].x * 255.0f),
160 static_cast<uint8_t>(modelVertex.colors[colorIndex].w * 255.0f)
161 );
162 vertex.setAttribute(elementIndex, colorData);
163 }
164 break;
165 default:
166 break;
167 }
168 }
169 return;
170 }
171 }
172
173 // 转换时,用一个map存ModelMaterial
174 // 转换时,用一个map存ModelMesh
175
177 public:
178 virtual std::unique_ptr<ModelData> loadModel(const std::string &path) = 0;
179 protected:
180
181 };
182}
183#endif //MODELLOADER_H
virtual std::unique_ptr< ModelData > loadModel(const std::string &path)=0
constexpr Format getFormat() const noexcept
constexpr ModelVertexAttribute getModelAttribute() const noexcept
void setAttribute(VtxType type, const T &value) noexcept
ModelVertexAttribute
void setVertexAttributeFromModel(Vertex &vertex, size_t elementIndex, const VertexElement &element, const ModelVertex &modelVertex)
ModelMesh * findMesh(const std::string &name)
std::vector< ModelObject * > objects
std::vector< ModelMaterial * > materials
std::vector< ModelMesh * > meshes
std::vector< uint32_t > indices
ModelMaterial * material
std::vector< ModelVertex > vertices
std::vector< ModelObject * > children
float x
定义 Vec.h:10
float y
定义 Vec.h:10
float x
定义 Vec.h:81
float z
定义 Vec.h:81
float y
定义 Vec.h:81
float z
定义 Vec.h:196
float y
定义 Vec.h:196
float w
定义 Vec.h:196
float x
定义 Vec.h:196