in GLTFSDK/Source/Deserialize.cpp [664:757]
Material ParseMaterial(const rapidjson::Value& v, const ExtensionDeserializer& extensionDeserializer)
{
Material material;
auto mit = v.FindMember("pbrMetallicRoughness");
if (mit != v.MemberEnd())
{
auto& pbrMr = mit->value;
// Diffuse
auto baseColorFactorIt = pbrMr.FindMember("baseColorFactor");
if (baseColorFactorIt != pbrMr.MemberEnd())
{
std::vector<float> baseColorFactor;
for (rapidjson::Value::ConstValueIterator ait = baseColorFactorIt->value.Begin(); ait != baseColorFactorIt->value.End(); ++ait)
{
baseColorFactor.push_back(static_cast<float>(ait->GetDouble()));
}
material.metallicRoughness.baseColorFactor = Color4(baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]);
}
auto baseColorTextureIt = pbrMr.FindMember("baseColorTexture");
if (baseColorTextureIt != pbrMr.MemberEnd())
{
ParseTextureInfo(baseColorTextureIt->value, material.metallicRoughness.baseColorTexture, extensionDeserializer);
}
material.metallicRoughness.metallicFactor = GetMemberValueOrDefault<float>(pbrMr, "metallicFactor", 1.0f);
material.metallicRoughness.roughnessFactor = GetMemberValueOrDefault<float>(pbrMr, "roughnessFactor", 1.0f);
auto metallicRoughnessTextureIt = pbrMr.FindMember("metallicRoughnessTexture");
if (metallicRoughnessTextureIt != pbrMr.MemberEnd())
{
ParseTextureInfo(metallicRoughnessTextureIt->value, material.metallicRoughness.metallicRoughnessTexture, extensionDeserializer);
}
}
// Normal
auto normalTextureIt = v.FindMember("normalTexture");
if (normalTextureIt != v.MemberEnd())
{
ParseTextureInfo(normalTextureIt->value, material.normalTexture, extensionDeserializer);
material.normalTexture.scale = GetMemberValueOrDefault<float>(normalTextureIt->value, "scale", 1.0f);
}
// Occlusion
auto occlusionTextureIt = v.FindMember("occlusionTexture");
if (occlusionTextureIt != v.MemberEnd())
{
ParseTextureInfo(occlusionTextureIt->value, material.occlusionTexture, extensionDeserializer);
material.occlusionTexture.strength = GetMemberValueOrDefault<float>(occlusionTextureIt->value, "strength", 1.0f);
}
// Emissive Texture
auto emissionTextureIt = v.FindMember("emissiveTexture");
if (emissionTextureIt != v.MemberEnd())
{
ParseTextureInfo(emissionTextureIt->value, material.emissiveTexture, extensionDeserializer);
}
// Emissive Factor
auto emissionFactorIt = v.FindMember("emissiveFactor");
if (emissionFactorIt != v.MemberEnd())
{
std::vector<float> emissiveFactor;
for (rapidjson::Value::ConstValueIterator ait = emissionFactorIt->value.Begin(); ait != emissionFactorIt->value.End(); ++ait)
{
emissiveFactor.push_back(static_cast<float>(ait->GetDouble()));
}
material.emissiveFactor = Color3(emissiveFactor[0], emissiveFactor[1], emissiveFactor[2]);
}
// Alpha Mode
auto alphaModeIt = v.FindMember("alphaMode");
if (alphaModeIt != v.MemberEnd())
{
material.alphaMode = ParseAlphaMode(alphaModeIt->value.GetString());
}
// Alpha Cutoff
material.alphaCutoff = GetMemberValueOrDefault<float>(v, "alphaCutoff", 0.5f);
// Name
material.name = GetMemberValueOrDefault<std::string>(v, "name");
// Double Sided
material.doubleSided = GetMemberValueOrDefault<bool>(v, "doubleSided", false);
ParseProperty(v, material, extensionDeserializer);
ValidateMaterial(material);
return material;
}