664 lines
36 KiB
C#

#if UNITY_EDITOR
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace lilToon
{
public class lilMaterialUtils
{
internal static void SetupMaterialWithRenderingMode(Material material, RenderingMode renderingMode, TransparentMode transparentMode, bool isoutl, bool islite, bool istess, bool ismulti)
{
int renderQueue = GetTrueRenderQueue(material);
RenderingMode rend = renderingMode;
lilRenderPipeline RP = lilRenderPipelineReader.GetRP();
if(ismulti)
{
float tpmode = material.GetFloat("_TransparentMode");
switch((int)tpmode)
{
case 1 : rend = RenderingMode.Cutout; break;
case 2 : rend = RenderingMode.Transparent; break;
case 3 : rend = RenderingMode.Refraction; break;
case 4 : rend = RenderingMode.Fur; break;
case 5 : rend = RenderingMode.FurCutout; break;
case 6 : rend = RenderingMode.Gem; break;
default : rend = RenderingMode.Opaque; break;
}
}
switch(rend)
{
case RenderingMode.Opaque:
if(islite)
{
if(isoutl) material.shader = lilShaderManager.ltslo;
else material.shader = lilShaderManager.ltsl;
}
else if(ismulti)
{
if(isoutl) material.shader = lilShaderManager.ltsmo;
else material.shader = lilShaderManager.ltsm;
material.SetOverrideTag("RenderType", "");
material.renderQueue = -1;
}
else if(istess)
{
if(isoutl) material.shader = lilShaderManager.ltstesso;
else material.shader = lilShaderManager.ltstess;
}
else
{
if(isoutl) material.shader = lilShaderManager.ltso;
else material.shader = lilShaderManager.lts;
}
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_AlphaToMask", 0);
if(isoutl)
{
material.SetInt("_OutlineSrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_OutlineDstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_OutlineAlphaToMask", 0);
}
break;
case RenderingMode.Cutout:
if(islite)
{
if(isoutl) material.shader = lilShaderManager.ltslco;
else material.shader = lilShaderManager.ltslc;
}
else if(ismulti)
{
if(isoutl) material.shader = lilShaderManager.ltsmo;
else material.shader = lilShaderManager.ltsm;
material.SetOverrideTag("RenderType", "TransparentCutout");
material.renderQueue = 2450;
}
else if(istess)
{
if(isoutl) material.shader = lilShaderManager.ltstessco;
else material.shader = lilShaderManager.ltstessc;
}
else
{
if(isoutl) material.shader = lilShaderManager.ltsco;
else material.shader = lilShaderManager.ltsc;
}
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_AlphaToMask", 1);
if(isoutl)
{
material.SetInt("_OutlineSrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_OutlineDstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_OutlineAlphaToMask", 1);
}
break;
case RenderingMode.Transparent:
if(ismulti)
{
if(isoutl) material.shader = lilShaderManager.ltsmo;
else material.shader = lilShaderManager.ltsm;
material.SetOverrideTag("RenderType", "TransparentCutout");
material.renderQueue = RP == lilRenderPipeline.HDRP ? 3000 : 2460;
}
else
{
switch (transparentMode)
{
case TransparentMode.Normal:
if(islite)
{
if(isoutl) material.shader = lilShaderManager.ltslto;
else material.shader = lilShaderManager.ltslt;
}
else if(istess)
{
if(isoutl) material.shader = lilShaderManager.ltstessto;
else material.shader = lilShaderManager.ltstesst;
}
else
{
if(isoutl) material.shader = lilShaderManager.ltsto;
else material.shader = lilShaderManager.ltst;
}
break;
case TransparentMode.OnePass:
if(islite)
{
if(isoutl) material.shader = lilShaderManager.ltsloto;
else material.shader = lilShaderManager.ltslot;
}
else if(istess)
{
if(isoutl) material.shader = lilShaderManager.ltstessoto;
else material.shader = lilShaderManager.ltstessot;
}
else
{
if(isoutl) material.shader = lilShaderManager.ltsoto;
else material.shader = lilShaderManager.ltsot;
}
break;
case TransparentMode.TwoPass:
if(islite)
{
if(isoutl) material.shader = lilShaderManager.ltsltto;
else material.shader = lilShaderManager.ltsltt;
}
else if(istess)
{
if(isoutl) material.shader = lilShaderManager.ltstesstto;
else material.shader = lilShaderManager.ltstesstt;
}
else
{
if(isoutl) material.shader = lilShaderManager.ltstto;
else material.shader = lilShaderManager.ltstt;
}
break;
}
}
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_AlphaToMask", 0);
if(isoutl)
{
material.SetInt("_OutlineSrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_OutlineDstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_OutlineAlphaToMask", 0);
}
break;
case RenderingMode.Refraction:
if(ismulti)
{
material.shader = lilShaderManager.ltsmref;
material.SetOverrideTag("RenderType", "");
material.renderQueue = -1;
}
else
{
material.shader = lilShaderManager.ltsref;
}
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_AlphaToMask", 0);
break;
case RenderingMode.RefractionBlur:
material.shader = lilShaderManager.ltsrefb;
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_AlphaToMask", 0);
break;
case RenderingMode.Fur:
if(ismulti)
{
material.shader = lilShaderManager.ltsmfur;
material.SetOverrideTag("RenderType", "TransparentCutout");
material.renderQueue = 3000;
}
else
{
material.shader = lilShaderManager.ltsfur;
}
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_AlphaToMask", 0);
material.SetInt("_FurSrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_FurDstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_FurZWrite", 0);
material.SetInt("_FurAlphaToMask", 0);
break;
case RenderingMode.FurCutout:
if(ismulti)
{
material.shader = lilShaderManager.ltsmfur;
material.SetOverrideTag("RenderType", "TransparentCutout");
material.renderQueue = 2450;
}
else
{
material.shader = lilShaderManager.ltsfurc;
}
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_AlphaToMask", 1);
material.SetInt("_FurSrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_FurDstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_FurZWrite", 1);
material.SetInt("_FurAlphaToMask", 1);
break;
case RenderingMode.FurTwoPass:
material.shader = lilShaderManager.ltsfurtwo;
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_AlphaToMask", 0);
material.SetInt("_FurSrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_FurDstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_FurZWrite", 0);
material.SetInt("_FurAlphaToMask", 0);
break;
case RenderingMode.Gem:
if(ismulti)
{
material.shader = lilShaderManager.ltsmgem;
material.SetOverrideTag("RenderType", "");
material.renderQueue = -1;
}
else
{
material.shader = lilShaderManager.ltsgem;
}
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_AlphaToMask", 0);
break;
}
if(!ismulti) material.renderQueue = renderQueue;
FixTransparentRenderQueue(material, renderingMode);
if(rend == RenderingMode.Gem)
{
material.SetInt("_Cull", 0);
material.SetInt("_ZWrite", 0);
}
else
{
material.SetInt("_ZWrite", 1);
}
if(transparentMode != TransparentMode.TwoPass)
{
material.SetInt("_ZTest", 4);
}
material.SetFloat("_OffsetFactor", 0.0f);
material.SetFloat("_OffsetUnits", 0.0f);
material.SetInt("_ColorMask", 15);
material.SetInt("_SrcBlendAlpha", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlendAlpha", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_BlendOp", (int)UnityEngine.Rendering.BlendOp.Add);
material.SetInt("_BlendOpAlpha", (int)UnityEngine.Rendering.BlendOp.Add);
material.SetInt("_SrcBlendFA", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlendFA", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_SrcBlendAlphaFA", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_DstBlendAlphaFA", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_BlendOpFA", (int)UnityEngine.Rendering.BlendOp.Max);
material.SetInt("_BlendOpAlphaFA", (int)UnityEngine.Rendering.BlendOp.Max);
if(isoutl)
{
material.SetInt("_OutlineCull", 1);
material.SetInt("_OutlineZWrite", 1);
material.SetInt("_OutlineZTest", 2);
material.SetFloat("_OutlineOffsetFactor", 0.0f);
material.SetFloat("_OutlineOffsetUnits", 0.0f);
material.SetInt("_OutlineColorMask", 15);
material.SetInt("_OutlineSrcBlendAlpha", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_OutlineDstBlendAlpha", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_OutlineBlendOp", (int)UnityEngine.Rendering.BlendOp.Add);
material.SetInt("_OutlineBlendOpAlpha", (int)UnityEngine.Rendering.BlendOp.Add);
material.SetInt("_OutlineSrcBlendFA", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_OutlineDstBlendFA", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_OutlineSrcBlendAlphaFA", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_OutlineDstBlendAlphaFA", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_OutlineBlendOpFA", (int)UnityEngine.Rendering.BlendOp.Max);
material.SetInt("_OutlineBlendOpAlphaFA", (int)UnityEngine.Rendering.BlendOp.Max);
}
if(renderingMode == RenderingMode.Fur || renderingMode == RenderingMode.FurCutout || renderingMode == RenderingMode.FurTwoPass)
{
material.SetInt("_FurZTest", 4);
material.SetFloat("_FurOffsetFactor", 0.0f);
material.SetFloat("_FurOffsetUnits", 0.0f);
material.SetInt("_FurColorMask", 15);
material.SetInt("_FurSrcBlendAlpha", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_FurDstBlendAlpha", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_FurBlendOp", (int)UnityEngine.Rendering.BlendOp.Add);
material.SetInt("_FurBlendOpAlpha", (int)UnityEngine.Rendering.BlendOp.Add);
material.SetInt("_FurSrcBlendFA", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_FurDstBlendFA", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_FurSrcBlendAlphaFA", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_FurDstBlendAlphaFA", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_FurBlendOpFA", (int)UnityEngine.Rendering.BlendOp.Max);
material.SetInt("_FurBlendOpAlphaFA", (int)UnityEngine.Rendering.BlendOp.Max);
}
}
public static bool CheckMainTextureName(string name)
{
return lilConstants.mainTexCheckWords.Any(word => !name.Contains(word));
}
private static void FixTransparentRenderQueue(Material material, RenderingMode renderingMode)
{
#if VRC_SDK_VRCSDK3 && UDON
if( renderingMode == RenderingMode.Transparent ||
renderingMode == RenderingMode.Refraction ||
renderingMode == RenderingMode.RefractionBlur ||
renderingMode == RenderingMode.Fur ||
renderingMode == RenderingMode.FurTwoPass ||
renderingMode == RenderingMode.Gem
)
{
material.renderQueue = 3000;
}
#endif
}
public static void SetupMultiMaterial(Material material)
{
int tpmode = 0;
if(material.HasProperty("_TransparentMode")) tpmode = (int)material.GetFloat("_TransparentMode");
bool useShadow = IsFeatureOnFloat(material, "_UseShadow");
bool useDistanceFade = IsFeatureOnVectorZ(material, "_DistanceFade");
bool useEmission = IsFeatureOnFloat(material, "_UseEmission");
bool useEmission2nd = IsFeatureOnFloat(material, "_UseEmission2nd");
bool useBumpMap = IsFeatureOnFloat(material, "_UseBumpMap");
bool useBump2ndMap = IsFeatureOnFloat(material, "_UseBump2ndMap");
bool useAnisotropy = IsFeatureOnFloat(material, "_UseAnisotropy");
bool useMatCap = IsFeatureOnFloat(material, "_UseMatCap");
bool useMatCap2nd = IsFeatureOnFloat(material, "_UseMatCap2nd");
bool useMatCapCustomNormal = IsFeatureOnFloat(material, "_MatCapCustomNormal");
bool useMatCap2ndCustomNormal = IsFeatureOnFloat(material, "_MatCap2ndCustomNormal");
bool useRim = IsFeatureOnFloat(material, "_UseRim");
bool useRimDir = IsFeatureOnFloat(material, "_RimDirStrength");
bool useGlitter = IsFeatureOnFloat(material, "_UseGlitter");
bool useAudioLink = IsFeatureOnFloat(material, "_UseAudioLink");
bool audioLinkAsLocal = IsFeatureOnFloat(material, "_AudioLinkAsLocal");
bool useDissolve = IsFeatureOnVectorX(material, "_DissolveParams");
bool useMain2ndDissolve = IsFeatureOnVectorX(material, "_Main2ndDissolveParams");
bool useMain3rdDissolve = IsFeatureOnVectorX(material, "_Main3rdDissolveParams");
bool useMainTexHSVG = IsFeatureOnHSVG(material, "_MainTexHSVG");
bool useMainGradation = IsFeatureOnFloat(material, "_MainGradationStrength");
bool useMain2ndTex = IsFeatureOnFloat(material, "_UseMain2ndTex");
bool useMain3rdTex = IsFeatureOnFloat(material, "_UseMain3rdTex");
bool useBacklight = IsFeatureOnFloat(material, "_UseBacklight");
bool useParallax = IsFeatureOnFloat(material, "_UseParallax");
bool usePOM = IsFeatureOnFloat(material, "_UsePOM");
bool useReflection = IsFeatureOnFloat(material, "_UseReflection");
bool useAlphaMask = IsFeatureOnFloat(material, "_AlphaMaskMode");
bool useMain2ndTexDecalAnimation = IsFeatureOnDecalAnimation(material, "_Main2ndTexDecalAnimation");
bool useMain3rdTexDecalAnimation = IsFeatureOnDecalAnimation(material, "_Main3rdTexDecalAnimation");
bool useEmissionBlendMask = IsFeatureOnTexture(material, "_EmissionBlendMask");
bool useEmission2ndBlendMask = IsFeatureOnTexture(material, "_Emission2ndBlendMask");
bool isOutl = material.shader.name.Contains("Outline");
bool isRefr = material.shader.name.Contains("Refraction");
bool isFur = material.shader.name.Contains("Fur");
bool isGem = material.shader.name.Contains("Gem");
SetShaderKeywords(material, "UNITY_UI_ALPHACLIP", tpmode == 1);
SetShaderKeywords(material, "UNITY_UI_CLIP_RECT", tpmode == 2 || tpmode == 4);
material.SetShaderPassEnabled("ShadowCaster", material.GetFloat("_AsOverlay") == 0.0f);
material.SetShaderPassEnabled("DepthOnly", material.GetFloat("_AsOverlay") == 0.0f);
material.SetShaderPassEnabled("DepthNormals", material.GetFloat("_AsOverlay") == 0.0f);
material.SetShaderPassEnabled("DepthForwardOnly", material.GetFloat("_AsOverlay") == 0.0f);
material.SetShaderPassEnabled("MotionVectors", material.GetFloat("_AsOverlay") == 0.0f);
if(isGem)
{
SetShaderKeywords(material, "_REQUIRE_UV2", false);
SetShaderKeywords(material, "_FADING_ON", false);
}
else
{
SetShaderKeywords(material, "_REQUIRE_UV2", useShadow);
SetShaderKeywords(material, "_FADING_ON", useDistanceFade);
}
SetShaderKeywords(material, "_EMISSION", useEmission);
SetShaderKeywords(material, "GEOM_TYPE_BRANCH", useEmission2nd);
SetShaderKeywords(material, "_SUNDISK_SIMPLE", (useEmission && useEmissionBlendMask) || (useEmission2nd && useEmission2ndBlendMask));
SetShaderKeywords(material, "_NORMALMAP", useBumpMap);
SetShaderKeywords(material, "EFFECT_BUMP", useBump2ndMap);
SetShaderKeywords(material, "SOURCE_GBUFFER", useAnisotropy);
SetShaderKeywords(material, "_SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A", useMatCap);
SetShaderKeywords(material, "_SPECULARHIGHLIGHTS_OFF", useMatCap2nd);
SetShaderKeywords(material, "GEOM_TYPE_MESH", (useMatCap && useMatCapCustomNormal) || (useMatCap2nd && useMatCap2ndCustomNormal));
SetShaderKeywords(material, "_METALLICGLOSSMAP", useRim);
SetShaderKeywords(material, "GEOM_TYPE_LEAF", useRim && useRimDir);
SetShaderKeywords(material, "_SPECGLOSSMAP", useGlitter);
SetShaderKeywords(material, "_MAPPING_6_FRAMES_LAYOUT", useAudioLink);
SetShaderKeywords(material, "_SUNDISK_HIGH_QUALITY", useAudioLink && audioLinkAsLocal);
SetShaderKeywords(material, "GEOM_TYPE_BRANCH_DETAIL", useDissolve);
if(isGem)
{
SetShaderKeywords(material, "EFFECT_HUE_VARIATION", false);
SetShaderKeywords(material, "_COLORADDSUBDIFF_ON", false);
SetShaderKeywords(material, "_COLORCOLOR_ON", false);
SetShaderKeywords(material, "_SUNDISK_NONE", false);
SetShaderKeywords(material, "GEOM_TYPE_FROND", false);
SetShaderKeywords(material, "_COLOROVERLAY_ON", false);
SetShaderKeywords(material, "ANTI_FLICKER", false);
SetShaderKeywords(material, "_PARALLAXMAP", false);
SetShaderKeywords(material, "PIXELSNAP_ON", false);
SetShaderKeywords(material, "_GLOSSYREFLECTIONS_OFF", false);
}
else
{
SetShaderKeywords(material, "EFFECT_HUE_VARIATION", useMainTexHSVG || useMainGradation);
SetShaderKeywords(material, "_COLORADDSUBDIFF_ON", useMain2ndTex);
SetShaderKeywords(material, "_COLORCOLOR_ON", useMain3rdTex);
SetShaderKeywords(material, "_SUNDISK_NONE", (useMain2ndTex && useMain2ndTexDecalAnimation) || (useMain3rdTex && useMain3rdTexDecalAnimation));
SetShaderKeywords(material, "GEOM_TYPE_FROND", (useMain2ndTex && useMain2ndDissolve) || (useMain3rdTex && useMain3rdDissolve));
SetShaderKeywords(material, "_COLOROVERLAY_ON", tpmode != 0 && useAlphaMask);
SetShaderKeywords(material, "ANTI_FLICKER", useBacklight);
SetShaderKeywords(material, "_PARALLAXMAP", useParallax);
SetShaderKeywords(material, "PIXELSNAP_ON", useParallax && usePOM);
SetShaderKeywords(material, "_GLOSSYREFLECTIONS_OFF", useReflection);
}
if(isRefr || isFur || isGem)
{
SetShaderKeywords(material, "ETC1_EXTERNAL_ALPHA", false);
SetShaderKeywords(material, "_DETAIL_MULX2", false);
}
else
{
SetShaderKeywords(material, "ETC1_EXTERNAL_ALPHA", false);
SetShaderKeywords(material, "_DETAIL_MULX2", isOutl && material.GetVector("_OutlineTexHSVG") != lilConstants.defaultHSVG);
}
// Remove old keywords
material.SetShaderPassEnabled("SRPDEFAULTUNLIT", true);
SetShaderKeywords(material, "BILLBOARD_FACE_CAMERA_POS", false);
}
private static bool IsFeatureOnFloat(Material material, string propname)
{
if(material.HasProperty(propname)) return material.GetFloat(propname) != 0.0f;
return false;
}
private static bool IsFeatureOnVectorZ(Material material, string propname)
{
if(material.HasProperty(propname)) return material.GetVector(propname).z != 0.0f;
return false;
}
private static bool IsFeatureOnVectorX(Material material, string propname)
{
if(material.HasProperty(propname)) return material.GetVector(propname).x != 0.0f;
return false;
}
private static bool IsFeatureOnHSVG(Material material, string propname)
{
if(material.HasProperty(propname)) return material.GetVector(propname) != lilConstants.defaultHSVG;
return false;
}
private static bool IsFeatureOnDecalAnimation(Material material, string propname)
{
if(material.HasProperty(propname)) return material.GetVector(propname) != lilConstants.defaultDecalAnim;
return false;
}
private static bool IsFeatureOnTexture(Material material, string propname)
{
if(material.HasProperty(propname)) return material.GetTexture(propname) != null;
return false;
}
private static void SetShaderKeywords(Material material, string keyword, bool enable)
{
if(enable) material.EnableKeyword(keyword);
else material.DisableKeyword(keyword);
}
public static void RemoveUnusedTexture(Material material)
{
if(!material.shader.name.Contains("lilToon")) return;
RemoveUnusedTexture(material, material.shader.name.Contains("Lite"));
}
public static void RemoveUnusedTexture(Material material, bool islite)
{
RemoveUnusedProperties(material);
if(islite)
{
if(material.GetFloat("_UseShadow") == 0.0f)
{
material.SetTexture("_ShadowColorTex", null);
material.SetTexture("_Shadow2ndColorTex", null);
}
if(material.GetFloat("_UseEmission") == 0.0f)
{
material.SetTexture("_EmissionMap", null);
}
if(material.GetFloat("_UseMatCap") == 0.0f)
{
material.SetTexture("_MatCapTex", null);
}
}
else
{
if(material.GetFloat("_MainGradationStrength") == 0.0f) material.SetTexture("_MainGradationTex", null);
if(material.GetFloat("_UseMain2ndTex") == 0.0f)
{
material.SetTexture("_Main2ndTex", null);
material.SetTexture("_Main2ndBlendMask", null);
material.SetTexture("_Main2ndDissolveMask", null);
material.SetTexture("_Main2ndDissolveNoiseMask", null);
}
if(material.GetFloat("_UseMain3rdTex") == 0.0f)
{
material.SetTexture("_Main3rdTex", null);
material.SetTexture("_Main3rdBlendMask", null);
material.SetTexture("_Main3rdDissolveMask", null);
material.SetTexture("_Main3rdDissolveNoiseMask", null);
}
if(material.GetFloat("_UseShadow") == 0.0f)
{
material.SetTexture("_ShadowBlurMask", null);
material.SetTexture("_ShadowBorderMask", null);
material.SetTexture("_ShadowStrengthMask", null);
material.SetTexture("_ShadowColorTex", null);
material.SetTexture("_Shadow2ndColorTex", null);
material.SetTexture("_Shadow3rdColorTex", null);
}
if(material.GetFloat("_UseEmission") == 0.0f)
{
material.SetTexture("_EmissionMap", null);
material.SetTexture("_EmissionBlendMask", null);
material.SetTexture("_EmissionGradTex", null);
}
if(material.GetFloat("_UseEmission2nd") == 0.0f)
{
material.SetTexture("_Emission2ndMap", null);
material.SetTexture("_Emission2ndBlendMask", null);
material.SetTexture("_Emission2ndGradTex", null);
}
if(material.GetFloat("_UseBumpMap") == 0.0f) material.SetTexture("_BumpMap", null);
if(material.GetFloat("_UseBump2ndMap") == 0.0f)
{
material.SetTexture("_Bump2ndMap", null);
material.SetTexture("_Bump2ndScaleMask", null);
}
if(material.GetFloat("_UseAnisotropy") == 0.0f)
{
material.SetTexture("_AnisotropyTangentMap", null);
material.SetTexture("_AnisotropyScaleMask", null);
material.SetTexture("_AnisotropyShiftNoiseMask", null);
}
if(material.GetFloat("_UseReflection") == 0.0f)
{
material.SetTexture("_SmoothnessTex", null);
material.SetTexture("_MetallicGlossMap", null);
material.SetTexture("_ReflectionColorTex", null);
}
if(material.GetFloat("_UseMatCap") == 0.0f)
{
material.SetTexture("_MatCapTex", null);
material.SetTexture("_MatCapBlendMask", null);
}
if(material.GetFloat("_UseMatCap2nd") == 0.0f)
{
material.SetTexture("_MatCap2ndTex", null);
material.SetTexture("_MatCap2ndBlendMask", null);
}
if(material.GetFloat("_UseRim") == 0.0f) material.SetTexture("_RimColorTex", null);
if(material.GetFloat("_UseGlitter") == 0.0f) material.SetTexture("_GlitterColorTex", null);
if(material.GetFloat("_UseParallax") == 0.0f) material.SetTexture("_ParallaxMap", null);
if(material.GetFloat("_UseAudioLink") == 0.0f || material.GetFloat("_AudioLinkUVMode") != 3.0f) material.SetTexture("_AudioLinkMask", null);
if(material.GetFloat("_UseAudioLink") == 0.0f || material.GetFloat("_AudioLinkAsLocal") == 0.0f) material.SetTexture("_AudioLinkLocalMap", null);
}
}
public static void RemoveShaderKeywords(Material material)
{
foreach(string keyword in material.shaderKeywords)
{
material.DisableKeyword(keyword);
}
}
private static void RemoveUnusedProperties(Material material)
{
// https://light11.hatenadiary.com/entry/2018/12/04/224253
var so = new SerializedObject(material);
so.Update();
var savedProps = so.FindProperty("m_SavedProperties");
var texs = savedProps.FindPropertyRelative("m_TexEnvs");
DeleteUnused(ref texs, material);
var floats = savedProps.FindPropertyRelative("m_Floats");
DeleteUnused(ref floats, material);
var colors = savedProps.FindPropertyRelative("m_Colors");
DeleteUnused(ref colors, material);
so.ApplyModifiedProperties();
}
private static void DeleteUnused(ref SerializedProperty props, Material material)
{
for(int i = props.arraySize - 1; i >= 0; i--)
{
if(!material.HasProperty(props.GetArrayElementAtIndex(i).FindPropertyRelative("first").stringValue))
{
props.DeleteArrayElementAtIndex(i);
}
}
}
public static int GetTrueRenderQueue(Material material)
{
var so = new SerializedObject(material);
return so.FindProperty("m_CustomRenderQueue").intValue;
}
public static bool CheckShaderIslilToon(Material material)
{
if(material == null) return false;
return CheckShaderIslilToon(material.shader);
}
public static bool CheckShaderIslilToon(Shader shader)
{
if(shader == null) return false;
if(shader.name.Contains("lilToon") || shader.name.Contains("lts_pass")) return true;
string shaderPath = AssetDatabase.GetAssetPath(shader);
return !string.IsNullOrEmpty(shaderPath) && shaderPath.Contains(".lilcontainer");
}
}
}
#endif