2
3
4
5
9#include "Resources/Mesh/MeshPack.h"
10#include "Core/Library/FileLibrary.h"
11#include "Core/Library/StringLibrary.h"
12#include "Systems/ResourceSystem.h"
13#include "Resources/Mesh/MeshProcessor.h"
15#include "tiny_obj_loader.h"
20
21
25
26
30
31
35
36
40
41
61 for (
auto& it : ResourceSystem::GetSearchFolder())
63 filePath = it + defaultOBJMeshPath + fileName +
".obj";
64 if (FileLibrary::FileLibrary_Exists(filePath.c_str()))
71 if (!isFind)
return false;
77 tinyobj::attrib_t attrib;
78 std::vector<tinyobj::shape_t> shapes;
79 std::vector<tinyobj::material_t> materials;
80 std::string warn, err;
82 if (!tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, filePath.c_str()))
87 outMeshPack->m_MeshResource.positions.attributes->resize(attrib.vertices.size() / 3);
88 for (uint32_t i = 0; i < attrib.vertices.size() / 3; i++)
90 (*outMeshPack->m_MeshResource.positions.attributes)[i].x = attrib.vertices[3 * i + 0];
91 (*outMeshPack->m_MeshResource.positions.attributes)[i].y = attrib.vertices[3 * i + 1];
92 (*outMeshPack->m_MeshResource.positions.attributes)[i].z = -attrib.vertices[3 * i + 2];
94 if (attrib.vertices.empty())
96 outMeshPack->m_MeshResource.positions.attributes->resize(1);
98 (*outMeshPack->m_MeshResource.positions.attributes)[0].x = 0.0f;
99 (*outMeshPack->m_MeshResource.positions.attributes)[0].y = 0.0f;
100 (*outMeshPack->m_MeshResource.positions.attributes)[0].z = 0.0f;
103 outMeshPack->m_MeshResource.normals.attributes->resize(attrib.normals.size() / 3);
104 for (uint32_t i = 0; i < attrib.normals.size() / 3; i++)
106 (*outMeshPack->m_MeshResource.normals.attributes)[i].x = attrib.normals[3 * i + 0];
107 (*outMeshPack->m_MeshResource.normals.attributes)[i].y = attrib.normals[3 * i + 1];
108 (*outMeshPack->m_MeshResource.normals.attributes)[i].z = -attrib.normals[3 * i + 2];
110 if (attrib.normals.empty())
112 outMeshPack->m_MeshResource.normals.attributes->resize(1);
114 (*outMeshPack->m_MeshResource.normals.attributes)[0].x = 0.0f;
115 (*outMeshPack->m_MeshResource.normals.attributes)[0].y = 1.0f;
116 (*outMeshPack->m_MeshResource.normals.attributes)[0].z = 0.0f;
119 outMeshPack->m_MeshResource.colors.attributes->resize(attrib.colors.size() / 3);
120 for (uint32_t i = 0; i < attrib.colors.size() / 3; i++)
122 (*outMeshPack->m_MeshResource.colors.attributes)[i].x = attrib.colors[3 * i + 0];
123 (*outMeshPack->m_MeshResource.colors.attributes)[i].y = attrib.colors[3 * i + 1];
124 (*outMeshPack->m_MeshResource.colors.attributes)[i].z = attrib.colors[3 * i + 2];
126 if (attrib.colors.empty())
128 outMeshPack->m_MeshResource.colors.attributes->resize(1);
130 (*outMeshPack->m_MeshResource.colors.attributes)[0].x = 1.0f;
131 (*outMeshPack->m_MeshResource.colors.attributes)[0].y = 1.0f;
132 (*outMeshPack->m_MeshResource.colors.attributes)[0].z = 1.0f;
135 outMeshPack->m_MeshResource.texCoords.attributes->resize(attrib.texcoords.size() / 2);
136 for (uint32_t i = 0; i < attrib.texcoords.size() / 2; i++)
138 (*outMeshPack->m_MeshResource.texCoords.attributes)[i].x = attrib.texcoords[2 * i + 0];
139 (*outMeshPack->m_MeshResource.texCoords.attributes)[i].y = 1.0f - attrib.texcoords[2 * i + 1];
141 if (attrib.texcoords.empty())
143 outMeshPack->m_MeshResource.texCoords.attributes->resize(1);
145 (*outMeshPack->m_MeshResource.texCoords.attributes)[0].x = 0.0f;
146 (*outMeshPack->m_MeshResource.texCoords.attributes)[0].y = 0.0f;
149 std::unordered_map<glm::uvec4, uint32_t> verticesMap;
150 for (
const auto& shape : shapes)
152 uint32_t start = outMeshPack->m_MeshResource.primitiveVertices.attributes->size();
153 outMeshPack->m_MeshResource.primitiveVertices.attributes->resize(start + shape.mesh.indices.size() / 3);
155 for (uint32_t i = 0; i < shape.mesh.indices.size() / 3; i++)
157 std::array<glm::uvec4, 3> vertexArray{};
158 for (uint32_t j = 0; j < 3; j++)
160 const auto& ind = shape.mesh.indices[3 * i + j];
162 vertexArray[j] = glm::uvec4(
163 ind.vertex_index == -1 ? 0 : ind.vertex_index,
164 ind.normal_index == -1 ? 0 : ind.normal_index,
165 ind.vertex_index == -1 ? 0 : ind.vertex_index,
166 ind.texcoord_index == -1 ? 0 : ind.texcoord_index
169 if (verticesMap.count(vertexArray[j]) == 0)
171 verticesMap[vertexArray[j]] =
static_cast<uint32_t>(outMeshPack->m_MeshResource.vertices.attributes->size());
172 outMeshPack->m_MeshResource.vertices.attributes->push_back(vertexArray[j]);
176 (*outMeshPack->m_MeshResource.primitiveVertices.attributes)[start + i].x = verticesMap[vertexArray[0]];
177 (*outMeshPack->m_MeshResource.primitiveVertices.attributes)[start + i].y = verticesMap[vertexArray[1]];
178 (*outMeshPack->m_MeshResource.primitiveVertices.attributes)[start + i].z = verticesMap[vertexArray[2]];
193 std::string filePath;
194 for (
auto& it : ResourceSystem::GetSearchFolder())
196 filePath = it + defaultFBXMeshPath + fileName +
".fbx";
197 if (FileLibrary::FileLibrary_Exists(filePath.c_str()))
203 if (!isFind)
return false;
214 std::string filePath;
215 for (
auto& it : ResourceSystem::GetSearchFolder())
217 filePath = it + defaultBinMeshPath + fileName +
".sasset";
218 if (FileLibrary::FileLibrary_Exists(filePath.c_str()))
224 if (!isFind)
return false;
244 uint32_t positionsCount = 0;
246 outMeshPack->m_MeshResource.positions.attributes->resize(positionsCount);
248 uint32_t normalsCount = 0;
250 outMeshPack->m_MeshResource.normals.attributes->resize(normalsCount);
252 uint32_t colorsCount = 0;
254 outMeshPack->m_MeshResource.colors.attributes->resize(colorsCount);
256 uint32_t texCoordsCount = 0;
258 outMeshPack->m_MeshResource.texCoords.attributes->resize(texCoordsCount);
260 uint32_t verticesCount = 0;
262 outMeshPack->m_MeshResource.vertices.attributes->resize(verticesCount);
264 uint32_t primitivePointsCount = 0;
266 outMeshPack->m_MeshResource.primitivePoints.attributes->resize(primitivePointsCount);
268 uint32_t primitiveVerticesCount = 0;
270 outMeshPack->m_MeshResource.primitiveVertices.attributes->resize(primitiveVerticesCount);
272 uint32_t primitiveLocationsCount = 0;
274 outMeshPack->m_MeshResource.primitiveLocations.attributes->resize(primitiveLocationsCount);
276 uint32_t meshletsCount = 0;
278 outMeshPack->m_MeshResource.meshlets.attributes->resize(meshletsCount);
280 uint32_t lodsCount = 0;
282 outMeshPack->m_MeshResource.lods.attributes->resize(lodsCount);
284 FileLibrary::FileLibrary_Read(&f,
sizeof(glm::vec3) * positionsCount , outMeshPack->m_MeshResource.positions.attributes ->data(), &readed);
285 FileLibrary::FileLibrary_Read(&f,
sizeof(glm::vec3) * normalsCount , outMeshPack->m_MeshResource.normals.attributes ->data(), &readed);
286 FileLibrary::FileLibrary_Read(&f,
sizeof(glm::vec3) * colorsCount , outMeshPack->m_MeshResource.colors.attributes ->data(), &readed);
287 FileLibrary::FileLibrary_Read(&f,
sizeof(glm::vec2) * texCoordsCount , outMeshPack->m_MeshResource.texCoords.attributes ->data(), &readed);
288 FileLibrary::FileLibrary_Read(&f,
sizeof(glm::uvec4) * verticesCount , outMeshPack->m_MeshResource.vertices.attributes ->data(), &readed);
289 FileLibrary::FileLibrary_Read(&f,
sizeof(glm::uvec3) * primitivePointsCount , outMeshPack->m_MeshResource.primitivePoints.attributes ->data(), &readed);
290 FileLibrary::FileLibrary_Read(&f,
sizeof(glm::uvec3) * primitiveVerticesCount , outMeshPack->m_MeshResource.primitiveVertices.attributes ->data(), &readed);
291 FileLibrary::FileLibrary_Read(&f,
sizeof(glm::uvec3) * primitiveLocationsCount , outMeshPack->m_MeshResource.primitiveLocations.attributes ->data(), &readed);
313 std::string filePath = ResourceSystem::GetSearchFolder()[folderIndex] + defaultBinMeshPath + fileName +
".sasset";
322 uint64_t written = 0;
326 const uint32_t positionsCount = (uint32_t)outMeshPack->m_MeshResource.positions.attributes->size();
329 const uint32_t normalsCount = (uint32_t)outMeshPack->m_MeshResource.normals.attributes->size();
332 const uint32_t colorsCount = (uint32_t)outMeshPack->m_MeshResource.colors.attributes->size();
335 const uint32_t texCoordsCount = (uint32_t)outMeshPack->m_MeshResource.texCoords.attributes->size();
338 const uint32_t verticesCount = (uint32_t)outMeshPack->m_MeshResource.vertices.attributes->size();
341 const uint32_t primitivePointsCount = (uint32_t)outMeshPack->m_MeshResource.primitivePoints.attributes->size();
344 const uint32_t primitiveVerticesCount = (uint32_t)outMeshPack->m_MeshResource.primitiveVertices.attributes->size();
347 const uint32_t primitiveLocationsCount = (uint32_t)outMeshPack->m_MeshResource.primitiveLocations.attributes->size();
350 const uint32_t meshletsCount = (uint32_t)outMeshPack->m_MeshResource.meshlets.attributes->size();
353 const uint32_t lodsCount = (uint32_t)outMeshPack->m_MeshResource.lods.attributes->size();
356 FileLibrary::FileLibrary_Write(&f,
sizeof(glm::vec3) * positionsCount , outMeshPack->m_MeshResource.positions.attributes ->data(), &written);
357 FileLibrary::FileLibrary_Write(&f,
sizeof(glm::vec3) * normalsCount , outMeshPack->m_MeshResource.normals.attributes ->data(), &written);
358 FileLibrary::FileLibrary_Write(&f,
sizeof(glm::vec3) * colorsCount , outMeshPack->m_MeshResource.colors.attributes ->data(), &written);
359 FileLibrary::FileLibrary_Write(&f,
sizeof(glm::vec2) * texCoordsCount , outMeshPack->m_MeshResource.texCoords.attributes ->data(), &written);
360 FileLibrary::FileLibrary_Write(&f,
sizeof(glm::uvec4) * verticesCount , outMeshPack->m_MeshResource.vertices.attributes ->data(), &written);
361 FileLibrary::FileLibrary_Write(&f,
sizeof(glm::uvec3) * primitivePointsCount , outMeshPack->m_MeshResource.primitivePoints.attributes ->data(), &written);
362 FileLibrary::FileLibrary_Write(&f,
sizeof(glm::uvec3) * primitiveVerticesCount , outMeshPack->m_MeshResource.primitiveVertices.attributes ->data(), &written);
363 FileLibrary::FileLibrary_Write(&f,
sizeof(glm::uvec3) * primitiveLocationsCount , outMeshPack->m_MeshResource.primitiveLocations.attributes ->data(), &written);
#define SPICES_PROFILE_ZONE
static bool FileLibrary_Read(const FileHandle *handle, uint64_t data_size, void *out_data, uint64_t *out_bytes_read)
Read Specific size of data form the current file handle pointer, and move pointer the same size.
static bool FileLibrary_Write(const FileHandle *handle, uint64_t data_size, const void *data, uint64_t *out_bytes_written)
Write given data to the file handle pointer.
static bool FileLibrary_Open(const char *path, FileModes mode, bool binary, FileHandle *out_handle)
Open the file using given string.
static void FileLibrary_Close(FileHandle *handle)
Close the file by the file handle.
static bool FileLibrary_Exists(const char *path)
Determine whether the given string is existing a file.
File Static Function Library.
static bool Load(const std::string &fileName, MeshPack *outMeshPack)
Public called API, it is entrance.
static bool WriteSASSET(int folderIndex, const std::string &fileName, const MeshPack *outMeshPack)
Write the read data to the sasset file.
static bool LoadFromSASSET(const std::string &fileName, const MeshPack *outMeshPack)
Load data from a .sasset file.
static bool LoadFromFBX(const std::string &fileName, MeshPack *outMeshPack)
Load data from a .fbx file.
static bool LoadFromOBJ(const std::string &fileName, MeshPack *outMeshPack)
Load data from a .obj file.
MeshLoader Class. This class only defines static function for load data from mesh file.
MeshPack Class. This class defines some basic behaves and variables. This class need to be inherited ...
static void GenerateMeshLodClusterHierarchy(MeshPack *meshPack)
Generate Mesh Lod Resources.
Class for provide functions of process Meshpack.
static bool StringsEqual(const char *str0, const char *str1)
Determine if the strings given are equal. Platform Specific.
String Static Function Library.
const std::string defaultFBXMeshPath
Const variable: FBX Mesh File Path.
constexpr char MeshLoaderSignOver[100]
Const variable: Mesh File Confirm header over.
constexpr char MeshLoaderSignStart[100]
Const variable: Mesh File Confirm header staer.
const std::string defaultBinMeshPath
Const variable: Bin Mesh File Path.
const std::string defaultOBJMeshPath
Const variable: OBJ Mesh File Path.
@ FILE_MODE_READ
model : read
@ FILE_MODE_WRITE
model : write
This Struct is FILE* handle pointer Wrapper.
Meshlet Class. This class defines what Meshlet data.