2
3
4
5
9#include "../Mesh/GltfPack.h"
11#include <nlohmann/json.hpp>
21 std::ifstream f(fileName);
25 ss <<
"Gltf File: " << fileName <<
" is not found.";
27 SPICES_CORE_ERROR(ss.str())
34 std::filesystem::path parentPath = std::filesystem::path(fileName).parent_path();
36 SPICES_CORE_INFO(
"----------------------------------------------------------------");
38 if(data.find(
"asset") != data.end()) collection->m_Asset = std::make_unique<GltfAsset >(data[
"asset"]);
39 if(data.find(
"accessors") != data.end()) collection->m_Accessors = std::make_unique<GltfAccessors >(data[
"accessors"]);
40 if(data.find(
"buffers") != data.end()) collection->m_Buffers = std::make_unique<GltfBuffers >(data[
"buffers"], parentPath);
41 if(data.find(
"bufferViews") != data.end()) collection->m_BufferViews = std::make_unique<GltfBufferViews>(data[
"bufferViews"]);
43 if(data.find(
"images") != data.end()) collection->m_Images = std::make_unique<GltfImages >(data[
"images"], parentPath);
44 if(data.find(
"materials") != data.end()) collection->m_Materials = std::make_unique<GltfMaterials >(data[
"materials"]);
45 if(data.find(
"meshes") != data.end()) collection->m_Meshes = std::make_unique<GltfMeshes >(data[
"meshes"]);
46 if(data.find(
"nodes") != data.end()) collection->m_Nodes = std::make_unique<GltfNodes >(data[
"nodes"]);
47 if(data.find(
"samplers") != data.end()) collection->m_Samplers = std::make_unique<GltfSamplers >(data[
"samplers"]);
48 if(data.find(
"scene") != data.end()) collection->m_Scene = std::make_unique<GltfScene >(data[
"scene"]);
49 if(data.find(
"scenes") != data.end()) collection->m_Scenes = std::make_unique<GltfScenes >(data[
"scenes"]);
50 if(data.find(
"textures") != data.end()) collection->m_Textures = std::make_unique<GltfTextures >(data[
"textures"]);
52 SPICES_CORE_INFO(
"----------------------------------------------------------------");
65 SPICES_CORE_ERROR(
"Positions buffer invalid.")
72 const VkFormat format = GltfHelper::GetFormat(positionAccessor.type, positionAccessor.componentType);
73 const uint32_t bytes = GltfHelper::SizeOfFormat(format);
75 pack->m_MeshResource.positions.attributes->resize(positionAccessor
.count);
76 for (uint32_t i = 0; i < pack->m_MeshResource.positions.attributes->size(); i++)
78 const uint32_t offset = i * bytes;
80 auto p =
reinterpret_cast<glm::vec3*>(&(*positionBuffer.buffer)[positionAccessor
.byteOffset + positionBufferView
.byteOffset + offset]);
81 (*pack->m_MeshResource.positions.attributes)[i] = *p;
83 glm::vec3& pos = (*pack->m_MeshResource.positions.attributes)[i];
89 bool hasNormal =
false;
93 pack->m_MeshResource.normals.attributes->resize(1);
94 (*pack->m_MeshResource.normals.attributes)[0] = glm::vec3(0.0f, 1.0f, 0.0f);
104 const VkFormat format = GltfHelper::GetFormat(normalAccessor.type, normalAccessor.componentType);
105 const uint32_t bytes = GltfHelper::SizeOfFormat(format);
107 pack->m_MeshResource.normals.attributes->resize(normalAccessor
.count);
108 for (uint32_t i = 0; i < pack->m_MeshResource.normals.attributes->size(); i++)
110 const uint32_t offset = i * bytes;
112 auto n =
reinterpret_cast<glm::vec3*>(&(*normalBuffer.buffer)[normalAccessor
.byteOffset + normalBufferView
.byteOffset + offset]);
113 (*pack->m_MeshResource.normals.attributes)[i] = *n;
115 glm::vec3& nor = (*pack->m_MeshResource.normals.attributes)[i];
122 bool hasColor =
false;
124 pack->m_MeshResource.colors.attributes->resize(1);
125 (*pack->m_MeshResource.colors.attributes)[0] = glm::vec3(0.0f);
129 bool hasTexCoords =
false;
133 pack->m_MeshResource.texCoords.attributes->resize(1);
134 (*pack->m_MeshResource.texCoords.attributes)[0] = glm::vec2(0.0f);
144 const VkFormat format = GltfHelper::GetFormat(texCoordAccessor.type, texCoordAccessor.componentType);
145 const uint32_t bytes = GltfHelper::SizeOfFormat(format);
147 pack->m_MeshResource.texCoords.attributes->resize(texCoordAccessor
.count);
148 for (uint32_t i = 0; i < pack->m_MeshResource.texCoords.attributes->size(); i++)
150 const uint32_t offset = i * bytes;
152 auto u =
reinterpret_cast<glm::vec2*>(&(*texCoordBuffer.buffer)[texCoordAccessor
.byteOffset + texCoordBufferView
.byteOffset + offset]);
153 (*pack->m_MeshResource.texCoords.attributes)[i] = *u;
155 glm::vec2& uv = (*pack->m_MeshResource.texCoords.attributes)[i];
165 pack->m_MeshResource.vertices.attributes->resize(positionAccessor
.count);
167 for(uint32_t i = 0; i < pack->m_MeshResource.vertices.attributes->size(); i++)
169 (*pack->m_MeshResource.vertices.attributes)[i] = glm::uvec4(i, hasNormal ? i : 0, hasColor ? i : 0, hasTexCoords ? i: 0);
177 SPICES_CORE_ERROR(
"indices buffer invalid.")
184 const VkFormat format = GltfHelper::GetFormat(indicesAccessor.type, indicesAccessor.componentType);
185 const uint32_t bytes = GltfHelper::SizeOfFormat(format);
187 pack->m_MeshResource.primitiveVertices.attributes->resize(indicesAccessor
.count / 3);
188 for (uint32_t i = 0; i < pack->m_MeshResource.primitiveVertices.attributes->size(); i++)
190 const uint32_t offset = i * 3 * bytes;
192 auto x =
reinterpret_cast<
unsigned short*>(&(*indicesBuffer.buffer)[indicesAccessor
.byteOffset + indicesBufferView
.byteOffset + offset + 0]);
193 auto y =
reinterpret_cast<
unsigned short*>(&(*indicesBuffer.buffer)[indicesAccessor
.byteOffset + indicesBufferView
.byteOffset + offset + bytes]);
194 auto z =
reinterpret_cast<
unsigned short*>(&(*indicesBuffer.buffer)[indicesAccessor
.byteOffset + indicesBufferView
.byteOffset + offset + bytes * 2]);
196 (*pack->m_MeshResource.primitiveVertices.attributes)[i] = glm::uvec3(*x, *y, *z);
207 std::stringstream ss;
208 ss <<
"BasePassRenderer.Mesh." << material
.name;
210 if(ResourcePool<Material>::Has(ss.str()))
212 return ResourcePool<Material>::Access(ss.str());
215 auto outMaterial = std::make_shared<
Material>();
217 outMaterial->SetName(ss.str());
219 outMaterial->PushToShaderPath(
"task",
"BasePassRenderer.Mesh.Default");
220 outMaterial->PushToShaderPath(
"mesh",
"BasePassRenderer.Mesh.Default");
221 outMaterial->PushToShaderPath(
"frag",
"BasePassRenderer.Mesh.PBRGltf");
222 outMaterial->PushToShaderPath(
"rchit",
"BasePassRenderer.Mesh.PBRGltf");
224 outMaterial->PushToTextureParams(
"baseColorTexture", {
"Texture2D", material.baseColorTexture.has_value() ? images->m_ImagesData[material.baseColorTexture.value()].uri :
"" });
225 outMaterial->PushToTextureParams(
"metallicRoughnessTexture", {
"Texture2D", material.metallicRoughnessTexture.has_value() ? images->m_ImagesData[material.metallicRoughnessTexture.value()].uri :
"" });
226 outMaterial->PushToTextureParams(
"normalTexture", {
"Texture2D", material.normalTexture.has_value() ? images->m_ImagesData[material.normalTexture.value()].uri :
""});
227 outMaterial->PushToTextureParams(
"emissiveTexture", {
"Texture2D", material.emissiveTexture.has_value() ? images->m_ImagesData[material.emissiveTexture.value()].uri :
"" });
228 outMaterial->PushToTextureParams(
"occlusionTexture", {
"Texture2D", material.occlusionTexture.has_value() ? images->m_ImagesData[material.occlusionTexture.value()].uri :
"" });
230 outMaterial->PushToConstParams(
"baseColorFactor", {
"float4", material.baseColorFactor});
231 outMaterial->PushToConstParams(
"emissiveFactor", {
"float4", material.emissiveFactor});
233 outMaterial->PushToConstParams(
"maxRayDepth", {
"int", 3});
234 outMaterial->PushToConstParams(
"maxLightDepth", {
"int", 2});
235 outMaterial->PushToConstParams(
"maxShadowDepth", {
"int", 1});
237 ResourcePool<Material>::Registry(ss.str(), outMaterial);
239 return ResourcePool<Material>::Access(ss.str());
#define SPICES_PROFILE_ZONE
Wrapper of Gltf Json Accessors.
Wrapper of Gltf Json BufferViews.
Wrapper of Gltf Json Buffers.
Wrapper of Gltf file data.
Wrapper of Gltf Json Images.
static bool Load(const std::string &fileName, GltfCollection *collection)
Load a gltf file to GltfCollection.
static bool LoadPack(GltfPack *pack, const GltfMeshes::Primitive &primitive, GltfAccessors *accessors, GltfBuffers *buffers, GltfBufferViews *bufferViews)
Load a gltf mesh to GltfPack.
static std::shared_ptr< Material > LoadMaterial(const GltfMaterials::Item &material, GltfImages *images)
Load a Material from Gltf file material component.
Loader of load gltf file or items.
Wrapper of Gltf Json Materials.
Wrapper of Gltf Json Meshes.
GltfPack Class. This class defines gltf type meshPack.
Material Class. This class contains a branch of parameter and shader, also descriptor.