Newer
Older
Hierarchical-Task-Network-Unity-3D / Assets / Quixel / Scripts / BridgeImporter / MegascansMatertialUtils.cs
#if UNITY_EDITOR

using UnityEngine;
using UnityEditor;
using System;

namespace Quixel
{
    public class MegascansMaterialUtils : MonoBehaviour
    {
        public static Material CreateMaterial(int shaderType, string matPath, bool isAlembic, int dispType, int texPack)
        {
            if ((shaderType == 0 || shaderType == 1) && isAlembic)
            {
                Debug.Log("Alembic files are not supported in LWRP/HDRP. Please change your export file format in Bridge or change your SRP in Unity.");
                return null;
            }

            try
            {
                string rp = matPath + ".mat";
                Material mat = (Material)AssetDatabase.LoadAssetAtPath(rp, typeof(Material));
                if (!mat)
                {
                    mat = new Material(Shader.Find("Standard"));
                    AssetDatabase.CreateAsset(mat, rp);
                    AssetDatabase.Refresh();
                    if (shaderType < 1)
                    {
                        mat.shader = Shader.Find("HDRP/Lit");
#if UNITY_2018_1 || UNITY_2018_2
                        mat.shader = Shader.Find("HDRenderPipeline/Lit");
#endif
                        AddHDRPValues(mat);
                        mat.SetInt("_DisplacementMode", dispType);
                    }
                    if (shaderType > 0)
                    {
#if UNITY_2019_3 || UNITY_2019_4 || UNITY_2020 || UNITY_2021
                        mat.shader = Shader.Find("Universal Render Pipeline/Lit");
#else
                        if (MegascansUtilities.isLegacy())
                            mat.shader = Shader.Find("LightweightPipeline/Standard (Physically Based)");
                        else
                            mat.shader = Shader.Find("Lightweight Render Pipeline/Lit");
#endif
                    }
                    if (shaderType > 1)
                    {
                        if (isAlembic)
                        {
                            mat.shader = Shader.Find("Alembic/Standard");
                            if (texPack > 0)
                                mat.shader = Shader.Find("Alembic/Standard (Specular setup)");
                        }
                        else
                        {
                            mat.shader = Shader.Find("Standard");
                            if (texPack > 0)
                                mat.shader = Shader.Find("Standard (Specular setup)");
                        }
                    }
                }
                return mat;
            }
            catch (Exception ex)
            {
                Debug.Log("MegascansMaterialUtils::CreateMaterial::Exception: " + ex.ToString());
                MegascansUtilities.HideProgressBar();
                return null;
            }
        }


        public static void AddHDRPValues(Material mat)
        {
            mat.renderQueue = 2225;

            mat.EnableKeyword("_DISABLE_SSR_TRANSPARENT");

            mat.SetShaderPassEnabled("DistortionVectors", false);
            mat.SetShaderPassEnabled("MOTIONVECTORS", false);
            mat.SetShaderPassEnabled("TransparentDepthPrepass", false);
            mat.SetShaderPassEnabled("TransparentDepthPostpass", false);
            mat.SetShaderPassEnabled("TransparentBackface", false);
            mat.SetShaderPassEnabled("RayTracingPrepass", false);

            mat.SetColor("_EmissionColor", Color.white);

            mat.SetFloat("_AlphaDstBlend", 0.0f);
#if UNITY_2020
            mat.SetFloat("_DistortionBlurDstBlend", 1f);
            mat.SetFloat("_DistortionBlurSrcBlend", 1f);
            mat.SetFloat("_DistortionDstBlend", 1f);
            mat.SetFloat("_DistortionSrcBlend", 1f);
            mat.SetFloat("_ZTestModeDistortion", 4f);
#endif
            mat.SetFloat("_StencilRefDepth", 8f);
            mat.SetFloat("_StencilWriteMask", 6f);
            mat.SetFloat("_StencilWriteMaskGBuffer", 14f);
            mat.SetFloat("_StencilWriteMaskMV", 40f);
            mat.SetFloat("_StencilRefMV", 40f);
            mat.SetFloat("_ZTestDepthEqualForOpaque", 3f);
            mat.SetFloat("_ZWrite", 1.0f);

        }

        public static void AddSSSSettings(Material mat, int shaderType)
        {
            mat.SetOverrideTag("RenderType", "Transparent");
            mat.SetInt("_MaterialID", 0);
            //mat.EnableKeyword("_MATERIAL_FEATURE_SUBSURFACE_SCATTERING");
            //mat.EnableKeyword("_MATERIAL_FEATURE_TRANSMISSION");

            mat.SetFloat("_SurfaceType", 1.0f);
#if UNITY_2020
            mat.EnableKeyword("_SURFACE_TYPE_TRANSPARENT");
            mat.EnableKeyword("_ENABLE_FOG_ON_TRANSPARENT");
#endif

            if (shaderType == 0)
            {
                mat.SetFloat("_StencilRef", 4f);
                mat.SetFloat("_ReceivesSSR", 1f);
                mat.SetFloat("_ReceivesSSRTransparent", 1f);
                mat.SetFloat("_StencilRefGBuffer", 14f); // Check with plants
            }
        }
    }
}
#endif