in GLTFSDK/Source/Serialize.cpp [394:496]
rapidjson::Value SerializeMaterial(const Material& material, const Document& gltfDocument, rapidjson::Document& document, const ExtensionSerializer& extensionSerializer)
{
rapidjson::Document::AllocatorType& a = document.GetAllocator();
rapidjson::Value materialValue(rapidjson::kObjectType);
{
rapidjson::Value pbrMetallicRoughness(rapidjson::kObjectType);
{
if (material.metallicRoughness.baseColorFactor != Color4(1.0f, 1.0f, 1.0f, 1.0f))
{
pbrMetallicRoughness.AddMember("baseColorFactor", RapidJsonUtils::ToJsonArray(material.metallicRoughness.baseColorFactor, a), a);
}
if (!material.metallicRoughness.baseColorTexture.textureId.empty())
{
rapidjson::Value baseColorTexture(rapidjson::kObjectType);
SerializeTextureInfo(gltfDocument, material.metallicRoughness.baseColorTexture, baseColorTexture, a, gltfDocument.textures, extensionSerializer);
pbrMetallicRoughness.AddMember("baseColorTexture", baseColorTexture, a);
}
if (material.metallicRoughness.metallicFactor != 1.0f)
{
pbrMetallicRoughness.AddMember("metallicFactor", material.metallicRoughness.metallicFactor, a);
}
if (material.metallicRoughness.roughnessFactor != 1.0f)
{
pbrMetallicRoughness.AddMember("roughnessFactor", material.metallicRoughness.roughnessFactor, a);
}
if (!material.metallicRoughness.metallicRoughnessTexture.textureId.empty())
{
rapidjson::Value metallicRoughnessTexture(rapidjson::kObjectType);
SerializeTextureInfo(gltfDocument, material.metallicRoughness.metallicRoughnessTexture, metallicRoughnessTexture, a, gltfDocument.textures, extensionSerializer);
pbrMetallicRoughness.AddMember("metallicRoughnessTexture", metallicRoughnessTexture, a);
}
}
materialValue.AddMember("pbrMetallicRoughness", pbrMetallicRoughness, a);
// Normal
if (!material.normalTexture.textureId.empty())
{
rapidjson::Value normalTexture(rapidjson::kObjectType);
SerializeTextureInfo(gltfDocument, material.normalTexture, normalTexture, a, gltfDocument.textures, extensionSerializer);
if (material.normalTexture.scale != 1.0f)
{
normalTexture.AddMember("scale", material.normalTexture.scale, a);
}
materialValue.AddMember("normalTexture", normalTexture, a);
}
// Occlusion
if (!material.occlusionTexture.textureId.empty())
{
rapidjson::Value occlusionTexture(rapidjson::kObjectType);
SerializeTextureInfo(gltfDocument, material.occlusionTexture, occlusionTexture, a, gltfDocument.textures, extensionSerializer);
if (material.occlusionTexture.strength != 1.0f)
{
occlusionTexture.AddMember("strength", material.occlusionTexture.strength, a);
}
materialValue.AddMember("occlusionTexture", occlusionTexture, a);
}
// Emissive Texture
if (!material.emissiveTexture.textureId.empty())
{
rapidjson::Value emissiveTexture(rapidjson::kObjectType);
SerializeTextureInfo(gltfDocument, material.emissiveTexture, emissiveTexture, a, gltfDocument.textures, extensionSerializer);
materialValue.AddMember("emissiveTexture", emissiveTexture, a);
}
//// Emissive Factor
if (material.emissiveFactor != Color3(0.0f, 0.0f, 0.0f))
{
materialValue.AddMember("emissiveFactor", RapidJsonUtils::ToJsonArray(material.emissiveFactor, a), a);
}
// Alpha Mode : do not serialize default value (opaque) or currently-unsupported value (unknown)
if (material.alphaMode != ALPHA_OPAQUE && material.alphaMode != ALPHA_UNKNOWN)
{
materialValue.AddMember("alphaMode", RapidJsonUtils::ToStringValue(AlphaModeToString(material.alphaMode), a), a);
}
// Alpha Cutoff
if (material.alphaCutoff != 0.5f)
{
materialValue.AddMember("alphaCutoff", material.alphaCutoff, a);
}
// Name
RapidJsonUtils::AddOptionalMember("name", materialValue, material.name, a);
// Double Sided
if (material.doubleSided)
{
materialValue.AddMember("doubleSided", material.doubleSided, a);
}
SerializeProperty(gltfDocument, material, materialValue, a, extensionSerializer);
}
return materialValue;
}