Exemplo n.º 1
0
        private string GetRoughnessTexture(SharpGLTF.Schema2.Material mat, string ddsPath)
        {
            var channel = mat.FindChannel(KnownChannel.MetallicRoughness.ToString());

            if (channel?.Texture?.PrimaryImage?.Name != null)
            {
                return(channel.Value.Texture.PrimaryImage.Name);
            }

            if (ddsPath != null)
            {
                var filename  = $"{Guid.NewGuid().ToString().Substring(0, 8)}.dds";
                var converter = new ImageConverter(ddsPath);
                if (channel.HasValue)
                {
                    converter.GenerateMetallicRoughnessOcclusion(filename, channel.Value.Parameter.X, channel.Value.Parameter.Y, 1);
                }
                else
                {
                    converter.GenerateMetallicRoughnessOcclusion(filename, 0, 0.8f, 1);
                }

                return(Path.GetFileNameWithoutExtension(filename));
            }

            return(null);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Gets the diffuse color for the specified material.
        /// </summary>
        protected Color GetMaterialDiffuseColor(SharpGLTF.Schema2.Material material)
        {
            if (material == null)
            {
                return(Color.White);
            }

            var diffuse = material.FindChannel("Diffuse") ?? material.FindChannel("BaseColor");

            if (diffuse == null)
            {
                return(Color.White);
            }

            return(new Color(diffuse.Value.Parameter.X, diffuse.Value.Parameter.Y, diffuse.Value.Parameter.Z));
        }
Exemplo n.º 3
0
 private Material CreateMaterial(SharpGLTF.Schema2.Material mat, string ddsPath, int id)
 {
     if (mat != null)
     {
         return(new Material()
         {
             Id = (uint)id,
             Shader = DecodeShaderName(mat.Name),
             Textures = new[]
             {
                 GetBaseColorTexture(mat, ddsPath),
                 GetRoughnessTexture(mat, ddsPath),
                 mat.FindChannel(KnownChannel.Normal.ToString())?.Texture?.PrimaryImage?.Name,
             }
         });
     }
     else
     {
         return(new Material()
         {
             Id = (uint)id,
             Shader = GmdUtils.PBR_MAT,
             Textures = new string[]
             {
             }
         });
     }
 }
Exemplo n.º 4
0
        /// <summary>
        /// Gets the specular color for the specified material.
        /// </summary>
        protected Color GetMaterialSpecularColor(SharpGLTF.Schema2.Material material)
        {
            if (material == null)
            {
                return(Color.White);
            }

            var mr = material.FindChannel("MetallicRoughness");

            if (mr == null)
            {
                return(Color.White);
            }

            var diffuse   = GetMaterialDiffuseColor(material).ToVector3();
            var metallic  = mr.Value.Parameter.X;
            var roughness = mr.Value.Parameter.Y;

            var k = Vector3.Zero;

            k += Vector3.Lerp(diffuse, Vector3.Zero, roughness);
            k += Vector3.Lerp(diffuse, Vector3.One, metallic);
            k *= 0.5f;

            return(new Color(k));
        }
Exemplo n.º 5
0
        public static Material WithChannelColor(this Material material, string channelName, Vector4 color)
        {
            Guard.NotNull(material, nameof(material));

            var channel = material.FindChannel(channelName).Value;

            channel.Color = color;

            return(material);
        }
Exemplo n.º 6
0
        public static Material WithChannelFactor(this Material material, string channelName, string paramName, float factor)
        {
            Guard.NotNull(material, nameof(material));

            var channel = material.FindChannel(channelName).Value;

            channel.SetFactor(paramName, factor);

            return(material);
        }
Exemplo n.º 7
0
        public static Material WithChannelParameter(this Material material, string channelName, Vector4 parameter)
        {
            Guard.NotNull(material, nameof(material));

            var channel = material.FindChannel(channelName).Value;

            channel.Parameter = parameter;

            return(material);
        }
Exemplo n.º 8
0
        public static Material WithChannelTexture(this Material material, string channelName, int textureSet, Image image)
        {
            Guard.NotNull(material, nameof(material));

            var channel = material.FindChannel(channelName).Value;

            channel.SetTexture(textureSet, image);

            return(material);
        }
Exemplo n.º 9
0
        public static void CopyTo(this Material srcMaterial, MaterialBuilder dstMaterial)
        {
            _CopyDefaultTo(srcMaterial, dstMaterial);

            if (srcMaterial.Unlit)
            {
                dstMaterial.WithUnlitShader();
                srcMaterial.CopyChannelsTo(dstMaterial, "BaseColor");
                return;
            }

            if (srcMaterial.FindChannel("Diffuse") != null || srcMaterial.FindChannel("SpecularGlossiness") != null)
            {
                dstMaterial.WithSpecularGlossinessShader();
                srcMaterial.CopyChannelsTo(dstMaterial, "Diffuse", "SpecularGlossiness");
                // srcMaterial.CopyChannelsTo(dstMaterial, "ClearCoat", "ClearCoatRoughness", "ClearCoatNormal");

                if (srcMaterial.FindChannel("BaseColor") != null || srcMaterial.FindChannel("MetallicRoughness") != null)
                {
                    var fallback = new MaterialBuilder(srcMaterial.Name);

                    _CopyDefaultTo(srcMaterial, fallback);
                    _CopyMetallicRoughnessTo(srcMaterial, fallback);

                    dstMaterial.WithFallback(fallback);
                }

                return;
            }

            if (srcMaterial.FindChannel("BaseColor") != null || srcMaterial.FindChannel("MetallicRoughness") != null)
            {
                _CopyMetallicRoughnessTo(srcMaterial, dstMaterial);
            }
        }
Exemplo n.º 10
0
        public static Texture GetDiffuseTexture(this Material material)
        {
            if (material == null)
            {
                return(null);
            }

            var channel = material.FindChannel("Diffuse");

            if (channel.HasValue)
            {
                return(channel.Value.Texture);
            }

            channel = material.FindChannel("BaseColor");
            if (channel.HasValue)
            {
                return(channel.Value.Texture);
            }

            return(null);
        }
Exemplo n.º 11
0
        public static Vector4 GetDiffuseColor(this Material material, Vector4 defaultColor)
        {
            if (material == null)
            {
                return(defaultColor);
            }

            var channel = material.FindChannel("Diffuse");

            if (channel.HasValue)
            {
                return(channel.Value.Parameter);
            }

            channel = material.FindChannel("BaseColor");
            if (channel.HasValue)
            {
                return(channel.Value.Parameter);
            }

            return(defaultColor);
        }
Exemplo n.º 12
0
        public static void CopyTo(this Material srcMaterial, Materials.MaterialBuilder dstMaterial)
        {
            Guard.NotNull(srcMaterial, nameof(srcMaterial));
            Guard.NotNull(dstMaterial, nameof(dstMaterial));

            dstMaterial.Name        = srcMaterial.Name;
            dstMaterial.AlphaMode   = srcMaterial.Alpha.ToToolkit();
            dstMaterial.AlphaCutoff = srcMaterial.AlphaCutoff;
            dstMaterial.DoubleSided = srcMaterial.DoubleSided;

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

            if (srcMaterial.Unlit)
            {
                dstMaterial.WithUnlitShader();
            }

            if (srcMaterial.FindChannel("BaseColor") != null || srcMaterial.FindChannel("MetallicRoughness") != null)
            {
                dstMaterial.WithMetallicRoughnessShader();
                srcMaterial.CopyChannelsTo(dstMaterial, "BaseColor", "MetallicRoughness");
                srcMaterial.CopyChannelsTo(dstMaterial, "ClearCoat", "ClearCoatRoughness", "ClearCoatNormal");
            }

            if (srcMaterial.FindChannel("Diffuse") != null || srcMaterial.FindChannel("SpecularGlossiness") != null)
            {
                dstMaterial = new Materials.MaterialBuilder(srcMaterial.Name).WithFallback(dstMaterial);

                dstMaterial.Name        = srcMaterial.Name;
                dstMaterial.AlphaMode   = srcMaterial.Alpha.ToToolkit();
                dstMaterial.AlphaCutoff = srcMaterial.AlphaCutoff;
                dstMaterial.DoubleSided = srcMaterial.DoubleSided;

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

                dstMaterial.WithSpecularGlossinessShader();
                srcMaterial.CopyChannelsTo(dstMaterial, "Diffuse", "SpecularGlossiness");
            }
        }
Exemplo n.º 13
0
        /// <summary>
        /// Gets the texture for the specified material.
        /// </summary>
        protected Texture2D GetMaterialTexture(ContentManager contentManager, SharpGLTF.Schema2.Material material)
        {
            if (material == null)
            {
                return(null);
            }

            var diffuse = material.FindChannel("Diffuse") ?? material.FindChannel("BaseColor");

            if (diffuse == null)
            {
                return(null);
            }

            var texture = diffuse.Value.Texture;

            if (texture != null)
            {
                var textureName    = $"{diffuse.Value.LogicalParent.Name ?? "null"}-{diffuse.Value.Key}";
                var textureContent = texture.PrimaryImage?.Content;
                if (textureContent != null && textureContent.Value.IsValid)
                {
                    if (!textureCache.TryGetValue(textureName, out var textureResource))
                    {
                        using (var textureStream = textureContent.Value.Open())
                        {
                            textureResource = contentManager.LoadFromStream <Texture2D>(textureStream, textureContent.Value.FileExtension);
                        }
                        textureCache[textureName] = textureResource;
                    }
                    return(textureResource);
                }
            }

            return(null);
        }
Exemplo n.º 14
0
        /// <summary>
        /// Gets the emissive color for the specified material.
        /// </summary>
        protected Color GetMaterialEmissiveColor(SharpGLTF.Schema2.Material material)
        {
            if (material == null)
            {
                return(Color.Black);
            }

            var emissive = material.FindChannel("Emissive");

            if (emissive == null)
            {
                return(Color.Black);
            }

            return(new Color(emissive.Value.Parameter.X, emissive.Value.Parameter.Y, emissive.Value.Parameter.Z));
        }
Exemplo n.º 15
0
        /// <summary>
        /// Gets the specular power for the specified material.
        /// </summary>
        protected Single GetMaterialSpecularPower(SharpGLTF.Schema2.Material material)
        {
            if (material == null)
            {
                return(16f);
            }

            var mr = material.FindChannel("MetallicRoughness");

            if (mr == null)
            {
                return(16f);
            }

            var metallic = mr.Value.Parameter.X;

            return(4f + 16f * metallic);
        }
Exemplo n.º 16
0
        public static void CopyChannelsTo(this Material srcMaterial, Materials.MaterialBuilder dstMaterial, params string[] channelKeys)
        {
            Guard.NotNull(srcMaterial, nameof(srcMaterial));
            Guard.NotNull(dstMaterial, nameof(dstMaterial));

            foreach (var k in channelKeys)
            {
                var src = srcMaterial.FindChannel(k);
                if (src == null)
                {
                    continue;
                }

                var dst = dstMaterial.UseChannel(k);

                src.Value.CopyTo(dst);
            }
        }
Exemplo n.º 17
0
        private string GetBaseColorTexture(SharpGLTF.Schema2.Material mat, string ddsPath)
        {
            var channel = mat.FindChannel(KnownChannel.BaseColor.ToString());

            if (channel?.Texture?.PrimaryImage?.Name != null)
            {
                return(channel.Value.Texture.PrimaryImage.Name);
            }

            if (ddsPath != null && channel.HasValue)
            {
                var filename  = $"{Guid.NewGuid().ToString().Substring(0, 8)}.dds";
                var converter = new ImageConverter(ddsPath);
                converter.GenerateColorTexture(filename, channel.Value.Parameter.X, channel.Value.Parameter.Y, channel.Value.Parameter.Z,
                                               channel.Value.Parameter.W);

                return(Path.GetFileNameWithoutExtension(filename));
            }

            return(null);
        }
Exemplo n.º 18
0
        /// <summary>
        /// Gets the alpha for the specified material.
        /// </summary>
        protected Single GetMaterialAlpha(SharpGLTF.Schema2.Material material)
        {
            if (material == null)
            {
                return(1f);
            }

            if (material.Alpha == AlphaMode.OPAQUE)
            {
                return(1f);
            }

            var baseColor = material.FindChannel("BaseColor");

            if (baseColor == null)
            {
                return(1f);
            }

            return(baseColor.Value.Parameter.W);
        }
Exemplo n.º 19
0
 public static Material WithChannelTexture(this Material material, string channelName, int textureSet, string imageFilePath)
 {
     material.FindChannel(channelName).SetTexture(textureSet, material.LogicalParent.UseImageWithFile(imageFilePath));
     return(material);
 }
Exemplo n.º 20
0
 public static Material WithChannelTexture(this Material material, string channelName, int textureSet, Image image)
 {
     material.FindChannel(channelName).SetTexture(textureSet, image);
     return(material);
 }