Skip to content

Commit

Permalink
GLTF Loader: reworked material builder to only handle texture attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
TheMostDiligent committed Dec 15, 2023
1 parent ad0f568 commit dc6cdd4
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 49 deletions.
60 changes: 27 additions & 33 deletions AssetLoader/interface/GLTFBuilder.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1001,58 +1001,52 @@ void ModelBuilder::Execute(const GltfModelType& GltfModel,
InitVertexBuffers(pDevice);
}

struct MaterialBuilder
class MaterialBuilder
{
public:
Material::ShaderAttribs Attribs;

bool DoubleSided = false;
bool HasClearcoat = false;

MaterialBuilder() noexcept {}
MaterialBuilder(const Material& Mat) :
Attribs{Mat.Attribs},
DoubleSided{Mat.DoubleSided},
HasClearcoat{Mat.HasClearcoat}
{
}
MaterialBuilder(Material& Mat) noexcept :
m_Material{Mat}
{}

void SetTextureId(Uint32 Idx, int TextureId)
{
if (Idx >= m_TextureIds.size())
m_TextureIds.resize(Idx + 1, -1);

EnsureTextureAttribCount(Idx + 1);
m_TextureIds[Idx] = TextureId;
}

Material::TextureShaderAttribs& GetTextureAttrib(Uint32 Idx)
{
if (Idx >= m_TextureAttribs.size())
m_TextureAttribs.resize(Idx + 1);

EnsureTextureAttribCount(Idx + 1);
return m_TextureAttribs[Idx];
}

Material Build() const
void Finalize() const
{
const Uint32 NumTextureAttribs = static_cast<Uint32>(m_TextureAttribs.size());

Material Mat{NumTextureAttribs};
Mat.Attribs = Attribs;
Mat.DoubleSided = DoubleSided;
Mat.HasClearcoat = HasClearcoat;
VERIFY_EXPR(m_TextureAttribs.size() == m_TextureIds.size());
m_Material.NumTextureAttribs = static_cast<Uint32>(m_TextureAttribs.size());

for (Uint32 i = 0; i < NumTextureAttribs; ++i)
Mat.GetTextureAttrib(i) = m_TextureAttribs[i];

VERIFY_EXPR(m_TextureIds.empty() || m_TextureIds.size() == m_TextureAttribs.size());
for (Uint32 i = 0; i < m_TextureIds.size(); ++i)
Mat.SetTextureId(i, m_TextureIds[i]);
if (m_Material.NumTextureAttribs > 0)
{
m_Material.TextureAttribs = std::make_unique<Material::TextureShaderAttribs[]>(m_Material.NumTextureAttribs);
m_Material.TextureIds = std::make_unique<int[]>(m_Material.NumTextureAttribs);
memcpy(m_Material.TextureAttribs.get(), m_TextureAttribs.data(), sizeof(Material::TextureShaderAttribs) * m_Material.NumTextureAttribs);
memcpy(m_Material.TextureIds.get(), m_TextureIds.data(), sizeof(int) * m_Material.NumTextureAttribs);
}
}

return Mat;
private:
void EnsureTextureAttribCount(size_t Count)
{
VERIFY_EXPR(m_TextureAttribs.size() == m_TextureIds.size());
if (m_TextureAttribs.size() < Count)
m_TextureAttribs.resize(Count);
if (m_TextureIds.size() < Count)
m_TextureIds.resize(Count, -1);
}

private:
Material& m_Material;

std::vector<int> m_TextureIds;
std::vector<Material::TextureShaderAttribs> m_TextureAttribs;
};
Expand Down
3 changes: 3 additions & 0 deletions AssetLoader/interface/GLTFLoader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ namespace GLTF
{

class ModelBuilder;
class MaterialBuilder;

/// Texture attribute description.
struct TextureAttributeDesc
Expand Down Expand Up @@ -194,6 +195,8 @@ struct Material

Uint32 NumTextureAttribs = 0;

friend MaterialBuilder;

public:
bool DoubleSided = false;
bool HasClearcoat = false;
Expand Down
35 changes: 19 additions & 16 deletions AssetLoader/src/GLTFLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1313,15 +1313,16 @@ void Model::LoadMaterials(const tinygltf::Model& gltf_model, const ModelCreateIn
Materials.reserve(gltf_model.materials.size());
for (const tinygltf::Material& gltf_mat : gltf_model.materials)
{
MaterialBuilder Mat;
Material Mat;
MaterialBuilder MatBuilder{Mat};

auto FindTexture = [&Mat](const TextureAttributeDesc& Attrib, const tinygltf::ParameterMap& Mapping) {
auto FindTexture = [&MatBuilder](const TextureAttributeDesc& Attrib, const tinygltf::ParameterMap& Mapping) {
auto tex_it = Mapping.find(Attrib.Name);
if (tex_it == Mapping.end())
return false;

Mat.SetTextureId(Attrib.Index, tex_it->second.TextureIndex());
Mat.GetTextureAttrib(Attrib.Index).UVSelector = static_cast<float>(tex_it->second.TextureTexCoord());
MatBuilder.SetTextureId(Attrib.Index, tex_it->second.TextureIndex());
MatBuilder.GetTextureAttrib(Attrib.Index).UVSelector = static_cast<float>(tex_it->second.TextureTexCoord());

return true;
};
Expand Down Expand Up @@ -1389,11 +1390,11 @@ void Model::LoadMaterials(const tinygltf::Model& gltf_model, const ModelCreateIn

Mat.Attribs.Workflow = Material::PBR_WORKFLOW_METALL_ROUGH;

ReadKhrTextureTransform(*this, gltf_mat.pbrMetallicRoughness.baseColorTexture.extensions, Mat, BaseColorTextureName);
ReadKhrTextureTransform(*this, gltf_mat.pbrMetallicRoughness.metallicRoughnessTexture.extensions, Mat, MetallicRoughnessTextureName);
ReadKhrTextureTransform(*this, gltf_mat.normalTexture.extensions, Mat, NormalTextureName);
ReadKhrTextureTransform(*this, gltf_mat.emissiveTexture.extensions, Mat, EmissiveTextureName);
ReadKhrTextureTransform(*this, gltf_mat.occlusionTexture.extensions, Mat, OcclusionTextureName);
ReadKhrTextureTransform(*this, gltf_mat.pbrMetallicRoughness.baseColorTexture.extensions, MatBuilder, BaseColorTextureName);
ReadKhrTextureTransform(*this, gltf_mat.pbrMetallicRoughness.metallicRoughnessTexture.extensions, MatBuilder, MetallicRoughnessTextureName);
ReadKhrTextureTransform(*this, gltf_mat.normalTexture.extensions, MatBuilder, NormalTextureName);
ReadKhrTextureTransform(*this, gltf_mat.emissiveTexture.extensions, MatBuilder, EmissiveTextureName);
ReadKhrTextureTransform(*this, gltf_mat.occlusionTexture.extensions, MatBuilder, OcclusionTextureName);

// Extensions
{
Expand All @@ -1403,8 +1404,8 @@ void Model::LoadMaterials(const tinygltf::Model& gltf_model, const ModelCreateIn
Mat.Attribs.Workflow = Material::PBR_WORKFLOW_SPEC_GLOSS;

const auto& SpecGlossExt = ext_it->second;
LoadExtensionTexture(*this, SpecGlossExt, Mat, SpecularGlossinessTextureName);
LoadExtensionTexture(*this, SpecGlossExt, Mat, DiffuseTextureName);
LoadExtensionTexture(*this, SpecGlossExt, MatBuilder, SpecularGlossinessTextureName);
LoadExtensionTexture(*this, SpecGlossExt, MatBuilder, DiffuseTextureName);
LoadExtensionParameter(SpecGlossExt, "diffuseFactor", Mat.Attribs.BaseColorFactor);
LoadExtensionParameter(SpecGlossExt, "specularFactor", Mat.Attribs.SpecularFactor);
}
Expand All @@ -1419,18 +1420,20 @@ void Model::LoadMaterials(const tinygltf::Model& gltf_model, const ModelCreateIn
Mat.HasClearcoat = true;

const auto& ClearcoatExt = ext_it->second;
LoadExtensionTexture(*this, ClearcoatExt, Mat, ClearcoatTextureName);
LoadExtensionTexture(*this, ClearcoatExt, Mat, ClearcoatRoughnessTextureName);
LoadExtensionTexture(*this, ClearcoatExt, Mat, ClearcoatNormalTextureName);
LoadExtensionTexture(*this, ClearcoatExt, MatBuilder, ClearcoatTextureName);
LoadExtensionTexture(*this, ClearcoatExt, MatBuilder, ClearcoatRoughnessTextureName);
LoadExtensionTexture(*this, ClearcoatExt, MatBuilder, ClearcoatNormalTextureName);
LoadExtensionParameter(ClearcoatExt, "clearcoatFactor", Mat.Attribs.ClearcoatFactor);
LoadExtensionParameter(ClearcoatExt, "clearcoatRoughnessFactor", Mat.Attribs.ClearcoatRoughnessFactor);
}
}

Materials.push_back(Mat.Build());
MatBuilder.Finalize();

if (MaterialLoadCallback != nullptr)
MaterialLoadCallback(&gltf_mat, Materials.back());
MaterialLoadCallback(&gltf_mat, Mat);

Materials.push_back(std::move(Mat));
}

if (Materials.empty())
Expand Down

0 comments on commit dc6cdd4

Please sign in to comment.