Exemple #1
0
        /// <summary>
        /// Modify the material to comply with its transparency parameters.
        /// </summary>
        /// <param name="material">The material/</param>
        private static void AdjustForTransparency(MaterialDescription material)
        {
            // Note: at this point, there is no other nodes than diffuse, specular, transparent, normal and displacement
            if (material.ColorNodes.ContainsKey(MaterialParameters.AlbedoDiffuse))
            {
                var diffuseNode = material.GetMaterialNode(MaterialParameters.AlbedoDiffuse);
                if (material.ColorNodes.ContainsKey(MaterialParameters.TransparencyMap))
                {
                    var diffuseNodeName     = material.ColorNodes[MaterialParameters.AlbedoDiffuse];
                    var transparentNodeName = material.ColorNodes[MaterialParameters.TransparencyMap];

                    var transparentNode = material.GetMaterialNode(MaterialParameters.TransparencyMap);

                    if (diffuseNode == null || transparentNode == null)
                    {
                        return;
                    }

                    var foundTextureDiffuse     = FindTextureNode(material, diffuseNodeName);
                    var foundTextureTransparent = FindTextureNode(material, transparentNodeName);

                    if (foundTextureDiffuse != null && foundTextureTransparent != null)
                    {
                        if (foundTextureDiffuse != foundTextureTransparent)
                        {
                            var alphaMixNode = new MaterialBinaryNode(diffuseNode, transparentNode, MaterialBinaryOperand.SubstituteAlpha);
                            material.AddColorNode(MaterialParameters.AlbedoDiffuse, "pdx_diffuseWithAlpha", alphaMixNode);
                        }
                    }

                    // set the key if it was missing
                    material.Parameters.Set(MaterialParameters.UseTransparent, true);
                }
                else
                {
                    // NOTE: MaterialParameters.UseTransparent is mostly runtime
                    var isTransparent = false;
                    if (material.Parameters.ContainsKey(MaterialParameters.UseTransparent))
                    {
                        isTransparent = (bool)material.Parameters[MaterialParameters.UseTransparent];
                    }

                    if (!isTransparent)
                    {
                        // remove the diffuse node
                        var diffuseName = material.ColorNodes[MaterialParameters.AlbedoDiffuse];
                        material.Nodes.Remove(diffuseName);

                        // add the new one
                        var opaqueNode = new MaterialBinaryNode(diffuseNode, null, MaterialBinaryOperand.Opaque);
                        material.AddColorNode(MaterialParameters.AlbedoDiffuse, "pdx_diffuseOpaque", opaqueNode);
                    }
                }
            }
        }