rapidjson::Value SerializeMaterial()

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