Material ParseMaterial()

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;
    }