Esempio n. 1
0
        public static void CopyTo(this Materials.MaterialBuilder srcMaterial, Material dstMaterial)
        {
            Guard.NotNull(srcMaterial, nameof(srcMaterial));
            Guard.NotNull(dstMaterial, nameof(dstMaterial));

            srcMaterial.ValidateForSchema2();

            dstMaterial.Alpha       = srcMaterial.AlphaMode.ToSchema2();
            dstMaterial.AlphaCutoff = srcMaterial.AlphaCutoff;
            dstMaterial.DoubleSided = srcMaterial.DoubleSided;

            var hasClearCoat = srcMaterial.GetChannel("ClearCoat") != null ||
                               srcMaterial.GetChannel("ClearCoatRoughness") != null ||
                               srcMaterial.GetChannel("ClearCoatNormal") != null;

            srcMaterial.CopyChannelsTo(dstMaterial, "Normal", "Occlusion", "Emissive");

            Materials.MaterialBuilder defMaterial = null;

            if (srcMaterial.ShaderStyle == "Unlit")
            {
                dstMaterial.InitializePBRMetallicRoughness();
                srcMaterial.CopyChannelsTo(dstMaterial, "BaseColor");
                return;
            }

            if (srcMaterial.ShaderStyle == "PBRMetallicRoughness")
            {
                if (hasClearCoat)
                {
                    dstMaterial.InitializePBRMetallicRoughnessClearCoat();
                }
                else
                {
                    dstMaterial.InitializePBRMetallicRoughness();
                }
                defMaterial = srcMaterial;
            }

            if (srcMaterial.ShaderStyle == "PBRSpecularGlossiness")
            {
                dstMaterial.InitializePBRSpecularGlossiness(srcMaterial.CompatibilityFallback != null);
                srcMaterial.CopyChannelsTo(dstMaterial, "Diffuse", "SpecularGlossiness");
                defMaterial = srcMaterial.CompatibilityFallback;
            }

            if (defMaterial != null)
            {
                if (defMaterial.ShaderStyle != "PBRMetallicRoughness")
                {
                    throw new ArgumentException(nameof(srcMaterial.CompatibilityFallback.ShaderStyle));
                }
                srcMaterial.CopyChannelsTo(dstMaterial, "BaseColor", "MetallicRoughness");
                srcMaterial.CopyChannelsTo(dstMaterial, "ClearCoat", "ClearCoatRoughness", "ClearCoatNormal");
            }
        }