您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

564 行
29 KiB

// Copyright (c) Valve Corporation, All rights reserved. ======================================================================================================
#if (UNITY_EDITOR)
using System;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEditor
{
internal class ValveShaderGUI : ShaderGUI
{
public enum BlendMode
{
Opaque,
AlphaTest,
AlphaBlend,
Glass,
Additive
// TODO: MaskedGlass that will require an additional grayscale texture to act as a standard alpha blend mask
}
public enum SpecularMode
{
None,
BlinnPhong,
Metallic
//Anisotropic
}
private static class Styles
{
public static GUIStyle optionsButton = "PaneOptions";
public static GUIContent uvSetLabel = new GUIContent("UV Set");
public static GUIContent[] uvSetOptions = new GUIContent[] { new GUIContent("UV channel 0"), new GUIContent("UV channel 1") };
public static GUIContent unlitText = new GUIContent("Unlit", "");
public static string emptyTootip = "";
public static GUIContent albedoText = new GUIContent("Albedo", "Albedo (RGB) and Transparency (A)");
public static GUIContent alphaCutoffText = new GUIContent("Alpha Cutoff", "Threshold for alpha cutoff");
public static GUIContent specularMapText = new GUIContent("Specular", "Reflectance (RGB) and Gloss (A)");
public static GUIContent reflectanceMinText = new GUIContent("Reflectance Min", "");
public static GUIContent reflectanceMaxText = new GUIContent("Reflectance Max", "");
public static GUIContent metallicMapText = new GUIContent("Metallic", "Metallic (R) and Gloss (A)");
public static GUIContent smoothnessText = new GUIContent("Gloss", "");
public static GUIContent normalMapText = new GUIContent("Normal", "Normal Map");
//public static GUIContent heightMapText = new GUIContent("Height Map", "Height Map (G)");
public static GUIContent cubeMapScalarText = new GUIContent("Cube Map Scalar", "");
public static GUIContent occlusionText = new GUIContent("Occlusion", "Occlusion (G)");
public static GUIContent occlusionStrengthDirectDiffuseText = new GUIContent("Occlusion Direct Diffuse", "");
public static GUIContent occlusionStrengthDirectSpecularText = new GUIContent("Occlusion Direct Specular", "");
public static GUIContent occlusionStrengthIndirectDiffuseText = new GUIContent("Occlusion Indirect Diffuse", "");
public static GUIContent occlusionStrengthIndirectSpecularText = new GUIContent("Occlusion Indirect Specular", "");
public static GUIContent emissionText = new GUIContent("Emission", "Emission (RGB)");
public static GUIContent detailMaskText = new GUIContent("Detail Mask", "Mask for Secondary Maps (A)");
public static GUIContent detailAlbedoText = new GUIContent("Detail Albedo", "Detail Albedo (RGB) multiplied by 2");
public static GUIContent detailNormalMapText = new GUIContent("Detail Normal", "Detail Normal Map");
public static GUIContent overrideLightmapText = new GUIContent("Override Lightmap", "Requires ValveOverrideLightmap.cs scrip on object");
public static GUIContent worldAlignedTextureText = new GUIContent("World Aligned Texture", "");
public static GUIContent worldAlignedTextureSizeText = new GUIContent("Size", "");
public static GUIContent worldAlignedTextureNormalText = new GUIContent("Normal", "");
public static GUIContent worldAlignedTexturePositionText = new GUIContent("World Position", "");
public static string whiteSpaceString = " ";
public static string primaryMapsText = "Main Maps";
public static string secondaryMapsText = "Secondary Maps";
public static string renderingMode = "Rendering Mode";
public static string specularModeText = "Specular Mode";
public static GUIContent emissiveWarning = new GUIContent("Emissive value is animated but the material has not been configured to support emissive. Please make sure the material itself has some amount of emissive.");
public static GUIContent emissiveColorWarning = new GUIContent("Ensure emissive color is non-black for emission to have effect.");
public static readonly string[] blendNames = Enum.GetNames(typeof(BlendMode));
public static readonly string[] specularNames = Enum.GetNames(typeof(SpecularMode));
}
MaterialProperty unlit = null;
MaterialProperty blendMode = null;
MaterialProperty specularMode = null;
MaterialProperty albedoMap = null;
MaterialProperty albedoColor = null;
MaterialProperty alphaCutoff = null;
MaterialProperty specularMap = null;
MaterialProperty specularColor = null;
MaterialProperty reflectanceMin = null;
MaterialProperty reflectanceMax = null;
MaterialProperty metallicMap = null;
MaterialProperty metallic = null;
MaterialProperty smoothness = null;
MaterialProperty bumpScale = null;
MaterialProperty bumpMap = null;
MaterialProperty cubeMapScalar = null;
MaterialProperty occlusionStrength = null;
MaterialProperty occlusionMap = null;
MaterialProperty occlusionStrengthDirectDiffuse = null;
MaterialProperty occlusionStrengthDirectSpecular = null;
MaterialProperty occlusionStrengthIndirectDiffuse = null;
MaterialProperty occlusionStrengthIndirectSpecular = null;
//MaterialProperty heigtMapScale = null;
//MaterialProperty heightMap = null;
MaterialProperty emissionColorForRendering = null;
MaterialProperty emissionMap = null;
MaterialProperty detailMask = null;
MaterialProperty detailAlbedoMap = null;
MaterialProperty detailNormalMapScale = null;
MaterialProperty detailNormalMap = null;
MaterialProperty uvSetSecondary = null;
MaterialProperty overrideLightmap = null;
MaterialProperty worldAlignedTexture = null;
MaterialProperty worldAlignedTextureSize = null;
MaterialProperty worldAlignedTextureNormal = null;
MaterialProperty worldAlignedTexturePosition = null;
MaterialEditor m_MaterialEditor;
ColorPickerHDRConfig m_ColorPickerHDRConfig = new ColorPickerHDRConfig(0f, 99f, 1 / 99f, 3f);
bool m_FirstTimeApply = true;
public void FindProperties(MaterialProperty[] props)
{
unlit = FindProperty("g_bUnlit", props);
blendMode = FindProperty("_Mode", props);
specularMode = FindProperty("_SpecularMode", props);
albedoMap = FindProperty("_MainTex", props);
albedoColor = FindProperty("_Color", props);
alphaCutoff = FindProperty("_Cutoff", props);
specularMap = FindProperty("_SpecGlossMap", props, false);
specularColor = FindProperty("_SpecColor", props, false);
reflectanceMin = FindProperty("g_flReflectanceMin", props);
reflectanceMax = FindProperty("g_flReflectanceMax", props);
metallicMap = FindProperty("_MetallicGlossMap", props, false);
metallic = FindProperty("_Metallic", props, false);
smoothness = FindProperty("_Glossiness", props);
bumpScale = FindProperty("_BumpScale", props);
bumpMap = FindProperty("_BumpMap", props);
//heigtMapScale = FindProperty ("_Parallax", props);
//heightMap = FindProperty("_ParallaxMap", props);
cubeMapScalar = FindProperty("g_flCubeMapScalar", props);
occlusionStrength = FindProperty("_OcclusionStrength", props);
occlusionStrengthDirectDiffuse = FindProperty("_OcclusionStrengthDirectDiffuse", props);
occlusionStrengthDirectSpecular = FindProperty("_OcclusionStrengthDirectSpecular", props);
occlusionStrengthIndirectDiffuse = FindProperty("_OcclusionStrengthIndirectDiffuse", props);
occlusionStrengthIndirectSpecular = FindProperty("_OcclusionStrengthIndirectSpecular", props);
occlusionMap = FindProperty("_OcclusionMap", props);
emissionColorForRendering = FindProperty("_EmissionColor", props);
emissionMap = FindProperty("_EmissionMap", props);
detailMask = FindProperty("_DetailMask", props);
detailAlbedoMap = FindProperty("_DetailAlbedoMap", props);
detailNormalMapScale = FindProperty("_DetailNormalMapScale", props);
detailNormalMap = FindProperty("_DetailNormalMap", props);
uvSetSecondary = FindProperty("_UVSec", props);
overrideLightmap = FindProperty("g_tOverrideLightmap", props);
worldAlignedTexture = FindProperty("g_bWorldAlignedTexture", props, false);
worldAlignedTextureSize = FindProperty("g_vWorldAlignedTextureSize", props, worldAlignedTexture != null);
worldAlignedTextureNormal = FindProperty("g_vWorldAlignedTextureNormal", props, worldAlignedTexture != null);
worldAlignedTexturePosition = FindProperty("g_vWorldAlignedTexturePosition", props, worldAlignedTexture != null);
}
public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props)
{
FindProperties(props); // MaterialProperties can be animated so we do not cache them but fetch them every event to ensure animated values are updated correctly
m_MaterialEditor = materialEditor;
Material material = materialEditor.target as Material;
ShaderPropertiesGUI(material);
// Make sure that needed keywords are set up if we're switching some existing
// material to a standard shader.
if (m_FirstTimeApply)
{
SetMaterialKeywords(material);
m_FirstTimeApply = false;
}
}
public void Vector3GUI(GUIContent label, MaterialProperty materialProperty)
{
Vector4 v4 = materialProperty.vectorValue;
Vector3 v3 = EditorGUILayout.Vector3Field(label, new Vector3(v4.x, v4.y, v4.z));
materialProperty.vectorValue = new Vector4(v3.x, v3.y, v3.z, 0.0f);
}
public void ShaderPropertiesGUI(Material material)
{
// Use default labelWidth
EditorGUIUtility.labelWidth = 0f;
// Detect any changes to the material
EditorGUI.BeginChangeCheck();
{
m_MaterialEditor.ShaderProperty(unlit, Styles.unlitText.text);
bool bUnlit = (unlit.floatValue != 0.0f);
BlendModePopup();
if (!bUnlit)
{
SpecularModePopup();
}
EditorGUILayout.Space();
//GUILayout.Label( Styles.primaryMapsText, EditorStyles.boldLabel );
DoAlbedoArea(material);
if (!bUnlit)
{
m_MaterialEditor.TexturePropertySingleLine(Styles.normalMapText, bumpMap, bumpMap.textureValue != null ? bumpScale : null);
DoSpecularMetallicArea(material);
m_MaterialEditor.TexturePropertySingleLine(Styles.occlusionText, occlusionMap, occlusionMap.textureValue != null ? occlusionStrength : null);
if (occlusionMap.textureValue != null)
{
m_MaterialEditor.ShaderProperty(occlusionStrengthDirectDiffuse, Styles.occlusionStrengthDirectDiffuseText.text, 2);
m_MaterialEditor.ShaderProperty(occlusionStrengthDirectSpecular, Styles.occlusionStrengthDirectSpecularText.text, 2);
m_MaterialEditor.ShaderProperty(occlusionStrengthIndirectDiffuse, Styles.occlusionStrengthIndirectDiffuseText.text, 2);
m_MaterialEditor.ShaderProperty(occlusionStrengthIndirectSpecular, Styles.occlusionStrengthIndirectSpecularText.text, 2);
}
m_MaterialEditor.ShaderProperty(cubeMapScalar, Styles.cubeMapScalarText.text, 0);
}
//m_MaterialEditor.TexturePropertySingleLine(Styles.heightMapText, heightMap, heightMap.textureValue != null ? heigtMapScale : null);
DoEmissionArea(material);
m_MaterialEditor.TexturePropertySingleLine(Styles.detailMaskText, detailMask);
if (!bUnlit)
{
m_MaterialEditor.TexturePropertySingleLine(Styles.overrideLightmapText, overrideLightmap);
}
EditorGUI.BeginChangeCheck(); // !!! AV - This is from Unity's script. Can these Begin/End calls be nested like this?
m_MaterialEditor.TextureScaleOffsetProperty(albedoMap);
if (EditorGUI.EndChangeCheck())
{
emissionMap.textureScaleAndOffset = albedoMap.textureScaleAndOffset; // Apply the main texture scale and offset to the emission texture as well, for Enlighten's sake
}
if (worldAlignedTexture != null)
{
m_MaterialEditor.ShaderProperty(worldAlignedTexture, Styles.worldAlignedTextureText.text);
if (worldAlignedTexture.floatValue != 0.0f)
{
EditorGUI.indentLevel = 2;
Vector3GUI(Styles.worldAlignedTextureSizeText, worldAlignedTextureSize);
Vector3GUI(Styles.worldAlignedTextureNormalText, worldAlignedTextureNormal);
Vector3GUI(Styles.worldAlignedTexturePositionText, worldAlignedTexturePosition);
EditorGUI.indentLevel = 0;
}
}
EditorGUILayout.Space();
// Secondary properties
GUILayout.Label(Styles.secondaryMapsText, EditorStyles.boldLabel);
m_MaterialEditor.TexturePropertySingleLine(Styles.detailAlbedoText, detailAlbedoMap);
if (!bUnlit)
{
m_MaterialEditor.TexturePropertySingleLine(Styles.detailNormalMapText, detailNormalMap, detailNormalMapScale);
}
m_MaterialEditor.TextureScaleOffsetProperty(detailAlbedoMap);
m_MaterialEditor.ShaderProperty(uvSetSecondary, Styles.uvSetLabel.text);
}
if (EditorGUI.EndChangeCheck())
{
foreach (var obj in blendMode.targets)
{
MaterialChanged((Material)obj);
}
foreach (var obj in specularMode.targets)
{
MaterialChanged((Material)obj);
}
}
}
public override void AssignNewShaderToMaterial(Material material, Shader oldShader, Shader newShader)
{
base.AssignNewShaderToMaterial(material, oldShader, newShader);
if (oldShader == null)
return;
// Convert to vr_standard
if (newShader.name.Equals("Valve/vr_standard"))
{
List<string> unknownShaders = new List<string>();
ValveRefreshStandardShader.StandardToValveSingleMaterial(material, oldShader, newShader, false, unknownShaders);
}
// Legacy shaders
if (!oldShader.name.Contains("Legacy Shaders/"))
return;
BlendMode blendMode = BlendMode.Opaque;
if (oldShader.name.Contains("/Transparent/Cutout/"))
{
blendMode = BlendMode.AlphaTest;
}
else if (oldShader.name.Contains("/Transparent/"))
{
// NOTE: legacy shaders did not provide physically based transparency
// therefore Fade mode
blendMode = BlendMode.AlphaBlend;
}
material.SetFloat("_Mode", (float)blendMode);
MaterialChanged(material);
}
void BlendModePopup()
{
EditorGUI.showMixedValue = blendMode.hasMixedValue;
var mode = (BlendMode)blendMode.floatValue;
EditorGUI.BeginChangeCheck();
mode = (BlendMode)EditorGUILayout.Popup(Styles.renderingMode, (int)mode, Styles.blendNames);
if (EditorGUI.EndChangeCheck())
{
m_MaterialEditor.RegisterPropertyChangeUndo("Rendering Mode");
blendMode.floatValue = (float)mode;
}
EditorGUI.showMixedValue = false;
}
void SpecularModePopup()
{
EditorGUI.showMixedValue = specularMode.hasMixedValue;
var mode = (SpecularMode)specularMode.floatValue;
EditorGUI.BeginChangeCheck();
mode = (SpecularMode)EditorGUILayout.Popup(Styles.specularModeText, (int)mode, Styles.specularNames);
if (EditorGUI.EndChangeCheck())
{
m_MaterialEditor.RegisterPropertyChangeUndo("Specular Mode");
specularMode.floatValue = (float)mode;
}
EditorGUI.showMixedValue = false;
}
void DoAlbedoArea(Material material)
{
m_MaterialEditor.TexturePropertySingleLine(Styles.albedoText, albedoMap, albedoColor);
if (((BlendMode)material.GetFloat("_Mode") == BlendMode.AlphaTest))
{
m_MaterialEditor.ShaderProperty(alphaCutoff, Styles.alphaCutoffText.text, MaterialEditor.kMiniTextureFieldLabelIndentLevel + 1);
}
}
void DoEmissionArea(Material material)
{
float brightness = emissionColorForRendering.colorValue.maxColorComponent;
bool showHelpBox = !HasValidEmissiveKeyword(material);
bool showEmissionColorAndGIControls = brightness > 0.0f;
bool hadEmissionTexture = emissionMap.textureValue != null;
// Texture and HDR color controls
m_MaterialEditor.TexturePropertyWithHDRColor(Styles.emissionText, emissionMap, emissionColorForRendering, m_ColorPickerHDRConfig, false);
// If texture was assigned and color was black set color to white
if (emissionMap.textureValue != null && !hadEmissionTexture && brightness <= 0f)
emissionColorForRendering.colorValue = Color.white;
// Dynamic Lightmapping mode
if (showEmissionColorAndGIControls)
{
bool shouldEmissionBeEnabled = ShouldEmissionBeEnabled(emissionColorForRendering.colorValue);
using (new EditorGUI.DisabledScope(!shouldEmissionBeEnabled))
{
m_MaterialEditor.LightmapEmissionProperty(MaterialEditor.kMiniTextureFieldLabelIndentLevel + 1);
}
}
if (showHelpBox)
{
EditorGUILayout.HelpBox(Styles.emissiveWarning.text, MessageType.Warning);
}
}
void DoSpecularMetallicArea(Material material)
{
SpecularMode specularMode = (SpecularMode)material.GetInt("_SpecularMode");
if (specularMode == SpecularMode.BlinnPhong)
{
if (specularMap.textureValue == null)
{
m_MaterialEditor.TexturePropertyTwoLines(Styles.specularMapText, specularMap, specularColor, Styles.smoothnessText, smoothness);
}
else
{
m_MaterialEditor.TexturePropertySingleLine(Styles.specularMapText, specularMap);
m_MaterialEditor.ShaderProperty(reflectanceMin, Styles.reflectanceMinText.text, 2);
m_MaterialEditor.ShaderProperty(reflectanceMax, Styles.reflectanceMaxText.text, 2);
}
}
else if (specularMode == SpecularMode.Metallic)
{
if (metallicMap.textureValue == null)
m_MaterialEditor.TexturePropertyTwoLines(Styles.metallicMapText, metallicMap, metallic, Styles.smoothnessText, smoothness);
else
m_MaterialEditor.TexturePropertySingleLine(Styles.metallicMapText, metallicMap);
}
}
public static void SetupMaterialWithBlendMode(Material material, BlendMode blendMode)
{
switch (blendMode)
{
case BlendMode.Opaque:
material.SetOverrideTag("RenderType", "");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = -1;
break;
case BlendMode.AlphaTest:
material.SetOverrideTag("RenderType", "TransparentCutout");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.EnableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 2450;
break;
case BlendMode.AlphaBlend:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.EnableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 3000;
break;
case BlendMode.Glass:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 3000;
break;
case BlendMode.Additive:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 3000;
break;
}
}
static bool ShouldEmissionBeEnabled(Color color)
{
return color.maxColorComponent > (0.1f / 255.0f);
}
static void SetMaterialKeywords(Material material)
{
// Note: keywords must be based on Material value not on MaterialProperty due to multi-edit & material animation
// (MaterialProperty value might come from renderer material property block)
SetKeyword(material, "_NORMALMAP", material.GetTexture("_BumpMap") || material.GetTexture("_DetailNormalMap"));
SpecularMode specularMode = (SpecularMode)material.GetInt("_SpecularMode");
if (specularMode == SpecularMode.BlinnPhong)
{
SetKeyword(material, "_SPECGLOSSMAP", material.GetTexture("_SpecGlossMap"));
}
else if (specularMode == SpecularMode.Metallic)
{
SetKeyword(material, "_METALLICGLOSSMAP", material.GetTexture("_MetallicGlossMap"));
}
SetKeyword(material, "S_SPECULAR_NONE", specularMode == SpecularMode.None);
SetKeyword(material, "S_SPECULAR_BLINNPHONG", specularMode == SpecularMode.BlinnPhong);
SetKeyword(material, "S_SPECULAR_METALLIC", specularMode == SpecularMode.Metallic);
SetKeyword(material, "S_OCCLUSION", material.GetTexture("_OcclusionMap"));
SetKeyword(material, "_PARALLAXMAP", material.GetTexture("_ParallaxMap"));
SetKeyword(material, "_DETAIL_MULX2", material.GetTexture("_DetailAlbedoMap") || material.GetTexture("_DetailNormalMap"));
SetKeyword(material, "S_OVERRIDE_LIGHTMAP", material.GetTexture("g_tOverrideLightmap"));
SetKeyword(material, "S_UNLIT", material.GetInt("g_bUnlit") == 1);
SetKeyword(material, "S_WORLD_ALIGNED_TEXTURE", material.GetInt("g_bWorldAlignedTexture") == 1);
bool shouldEmissionBeEnabled = ShouldEmissionBeEnabled(material.GetColor("_EmissionColor"));
SetKeyword(material, "_EMISSION", shouldEmissionBeEnabled);
// Setup lightmap emissive flags
MaterialGlobalIlluminationFlags flags = material.globalIlluminationFlags;
if ((flags & (MaterialGlobalIlluminationFlags.BakedEmissive | MaterialGlobalIlluminationFlags.RealtimeEmissive)) != 0)
{
flags &= ~MaterialGlobalIlluminationFlags.EmissiveIsBlack;
if (!shouldEmissionBeEnabled)
flags |= MaterialGlobalIlluminationFlags.EmissiveIsBlack;
material.globalIlluminationFlags = flags;
}
// Reflectance constants
float flReflectanceMin = material.GetFloat("g_flReflectanceMin");
float flReflectanceMax = material.GetFloat("g_flReflectanceMax");
material.SetFloat("g_flReflectanceScale", Mathf.Max(flReflectanceMin, flReflectanceMax) - flReflectanceMin);
material.SetFloat("g_flReflectanceBias", flReflectanceMin);
// World aligned texture constants
Vector4 worldAlignedTextureNormal = material.GetVector("g_vWorldAlignedTextureNormal");
Vector3 normal = new Vector3(worldAlignedTextureNormal.x, worldAlignedTextureNormal.y, worldAlignedTextureNormal.z);
normal = (normal.sqrMagnitude > 0.0f) ? normal : Vector3.up;
Vector3 tangentU = Vector3.zero, tangentV = Vector3.zero;
Vector3.OrthoNormalize(ref normal, ref tangentU, ref tangentV);
material.SetVector("g_vWorldAlignedNormalTangentU", new Vector4(tangentU.x, tangentU.y, tangentU.z, 0.0f));
material.SetVector("g_vWorldAlignedNormalTangentV", new Vector4(tangentV.x, tangentV.y, tangentV.z, 0.0f));
// Static combo skips
if (material.GetInt("g_bUnlit") == 1)
{
material.DisableKeyword("_NORMALMAP");
material.EnableKeyword("S_SPECULAR_NONE");
material.DisableKeyword("S_SPECULAR_BLINNPHONG");
material.DisableKeyword("S_SPECULAR_METALLIC");
material.DisableKeyword("_METALLICGLOSSMAP");
material.DisableKeyword("_SPECGLOSSMAP");
material.DisableKeyword("S_OVERRIDE_LIGHTMAP");
}
}
bool HasValidEmissiveKeyword(Material material)
{
// Material animation might be out of sync with the material keyword.
// So if the emission support is disabled on the material, but the property blocks have a value that requires it, then we need to show a warning.
// (note: (Renderer MaterialPropertyBlock applies its values to emissionColorForRendering))
bool hasEmissionKeyword = material.IsKeywordEnabled("_EMISSION");
if (!hasEmissionKeyword && ShouldEmissionBeEnabled(emissionColorForRendering.colorValue))
return false;
else
return true;
}
static void MaterialChanged(Material material)
{
SetupMaterialWithBlendMode(material, (BlendMode)material.GetFloat("_Mode"));
SetMaterialKeywords(material);
}
static void SetKeyword(Material m, string keyword, bool state)
{
if (state)
m.EnableKeyword(keyword);
else
m.DisableKeyword(keyword);
}
}
} // namespace UnityEditor
#endif