diff options
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ZBufferOpHelper.cs')
-rw-r--r-- | Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ZBufferOpHelper.cs | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ZBufferOpHelper.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ZBufferOpHelper.cs new file mode 100644 index 00000000..d09b8c04 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ZBufferOpHelper.cs @@ -0,0 +1,272 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum ZWriteMode + { + On, + Off + } + + public enum ZTestMode + { + Less, + Greater, + LEqual, + GEqual, + Equal, + NotEqual, + Always + } + + [Serializable] + class ZBufferOpHelper + { + public static readonly string DepthParametersStr = " Depth"; + public static readonly string ZWriteModeStr = "ZWrite Mode"; + public static readonly string ZTestModeStr = "ZTest Mode"; + public static readonly string OffsetStr = "Offset"; + public static readonly string OffsetFactorStr = "Factor"; + public static readonly string OffsetUnitsStr = "Units"; + private const string ExtraDepthPassStr = "Extra Depth Pass"; + private const string DepthZTestStr = "Depth ZTest"; + + public static readonly string[] ZTestModeLabels = + { + "<Default>", + "Less", + "Greater", + "Less or Equal", + "Greater or Equal", + "Equal", + "Not Equal", + "Always" + }; + + public static readonly string[] ZTestModeValues = + { + "<Default>", + "Less", + "Greater", + "LEqual", + "GEqual", + "Equal", + "NotEqual", + "Always" + }; + + public static readonly string[] ZWriteModeValues = + { + "<Default>", + "On", + "Off" + }; + + public static readonly Dictionary<ZTestMode, int> ZTestModeDict = new Dictionary<ZTestMode, int> + { + {ZTestMode.Less,1 }, + {ZTestMode.Greater,2}, + {ZTestMode.LEqual,3}, + {ZTestMode.GEqual,4}, + {ZTestMode.Equal,5}, + {ZTestMode.NotEqual,6}, + {ZTestMode.Always,7} + }; + + public static readonly Dictionary<ZWriteMode, int> ZWriteModeDict = new Dictionary<ZWriteMode, int> + { + { ZWriteMode.On,1}, + { ZWriteMode.Off,2} + }; + + + [SerializeField] + private InlineProperty m_zTestMode = new InlineProperty(); + + [SerializeField] + private InlineProperty m_zWriteMode = new InlineProperty(); + [SerializeField] + private InlineProperty m_offsetFactor = new InlineProperty(); + + [SerializeField] + private InlineProperty m_offsetUnits = new InlineProperty(); + + [SerializeField] + private bool m_offsetEnabled; + + [SerializeField] + private bool m_extraDepthPass; + + [SerializeField] + private int m_extrazTestMode = 0; + + [SerializeField] + private StandardSurfaceOutputNode m_parentSurface; + + public string CreateDepthInfo( bool outlineZWrite, bool outlineZTest ) + { + string result = string.Empty; + if( m_zWriteMode.IntValue != 0 || m_zWriteMode.Active ) + { + MasterNode.AddRenderState( ref result, "ZWrite", m_zWriteMode.GetValueOrProperty( ZWriteModeValues[ m_zWriteMode.IntValue ] ) ); + } + else if( outlineZWrite ) + { + MasterNode.AddRenderState( ref result, "ZWrite", ZWriteModeValues[ 1 ] ); + } + + if( m_zTestMode.IntValue != 0 || m_zTestMode.Active ) + { + MasterNode.AddRenderState( ref result, "ZTest", m_zTestMode.GetValueOrProperty( ZTestModeValues[ m_zTestMode.IntValue ] ) ); + } + else if( outlineZTest ) + { + MasterNode.AddRenderState( ref result, "ZTest", ZTestModeValues[ 3 ] ); + } + + if( m_offsetEnabled ) + { + MasterNode.AddRenderState( ref result, "Offset ", m_offsetFactor.GetValueOrProperty() + " , " + m_offsetUnits.GetValueOrProperty() ); + } + + return result; + } + + public void Draw( UndoParentNode owner, GUIStyle toolbarstyle, bool customBlendAvailable ) + { + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal( toolbarstyle ); + GUI.color = cachedColor; + EditorGUI.BeginChangeCheck(); + m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth = owner.GUILayoutToggle( m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth, DepthParametersStr, UIUtils.MenuItemToggleStyle ); + if( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetBool( "ExpandedDepth", m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth ); + } + EditorGUILayout.EndHorizontal(); + + if( m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth ) + { + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + GUI.color = cachedColor; + + EditorGUI.indentLevel++; + if( !customBlendAvailable ) + EditorGUILayout.HelpBox( "Depth Writing is only available for Opaque or Custom blend modes", MessageType.Warning ); + + EditorGUILayout.Separator(); + EditorGUI.BeginDisabledGroup( !customBlendAvailable ); + + m_zWriteMode.EnumTypePopup( ref owner, ZWriteModeStr, ZWriteModeValues ); + m_zTestMode.EnumTypePopup( ref owner, ZTestModeStr, ZTestModeLabels ); + //m_zWriteMode = owner.EditorGUILayoutPopup( ZWriteModeStr, m_zWriteMode, ZWriteModeValues ); + //m_zTestMode = owner.EditorGUILayoutPopup( ZTestModeStr, m_zTestMode, ZTestModeLabels ); + m_offsetEnabled = owner.EditorGUILayoutToggle( OffsetStr, m_offsetEnabled ); + if( m_offsetEnabled ) + { + EditorGUI.indentLevel++; + m_offsetFactor.FloatField( ref owner , OffsetFactorStr ); + m_offsetUnits.FloatField( ref owner , OffsetUnitsStr ); + EditorGUI.indentLevel--; + } + + m_extraDepthPass = owner.EditorGUILayoutToggle( ExtraDepthPassStr, m_extraDepthPass ); + if( m_extraDepthPass ) + { + EditorGUI.indentLevel++; + m_extrazTestMode = owner.EditorGUILayoutPopup( DepthZTestStr, m_extrazTestMode, ZTestModeLabels ); + EditorGUI.indentLevel--; + } + EditorGUILayout.Separator(); + EditorGUI.indentLevel--; + EditorGUI.EndDisabledGroup(); + EditorGUILayout.EndVertical(); + } + + EditorGUI.EndDisabledGroup(); + } + + public void DrawExtraDepthPass( ref string shaderBody ) + { + if( m_extraDepthPass ) + { + shaderBody += "\t\tPass\n"; + shaderBody += "\t\t{\n"; + shaderBody += "\t\t\tColorMask 0\n"; + if( m_extrazTestMode != 0 ) + shaderBody += "\t\t\tZTest " + ZTestModeValues[ m_extrazTestMode ] + "\n"; + shaderBody += "\t\t\tZWrite On\n"; + shaderBody += "\t\t}\n\n"; + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + if( UIUtils.CurrentShaderVersion() < 2502 ) + { + string zWriteMode = nodeParams[ index++ ]; + m_zWriteMode.IntValue = zWriteMode.Equals( "Off" ) ? 2 : 0; + + string zTestMode = nodeParams[ index++ ]; + for( int i = 0; i < ZTestModeValues.Length; i++ ) + { + if( zTestMode.Equals( ZTestModeValues[ i ] ) ) + { + m_zTestMode.IntValue = i; + break; + } + } + } + else + { + if( UIUtils.CurrentShaderVersion() > 14501 ) + { + m_zWriteMode.ReadFromString( ref index, ref nodeParams ); + m_zTestMode.ReadFromString( ref index, ref nodeParams ); + } + else + { + m_zWriteMode.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_zTestMode.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + } + m_offsetEnabled = Convert.ToBoolean( nodeParams[ index++ ] ); + + if( UIUtils.CurrentShaderVersion() > 15303 ) + { + m_offsetFactor.ReadFromString( ref index, ref nodeParams ); + m_offsetUnits.ReadFromString( ref index, ref nodeParams ); + } + else + { + m_offsetFactor.FloatValue = Convert.ToSingle( nodeParams[ index++ ] ); + m_offsetUnits.FloatValue = Convert.ToSingle( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 14202 ) + { + m_extraDepthPass = Convert.ToBoolean( nodeParams[ index++ ] ); + m_extrazTestMode = Convert.ToInt32( nodeParams[ index++ ] ); + } + } + } + + public void WriteToString( ref string nodeInfo ) + { + m_zWriteMode.WriteToString( ref nodeInfo ); + m_zTestMode.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_offsetEnabled ); + m_offsetFactor.WriteToString( ref nodeInfo ); + m_offsetUnits.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_extraDepthPass ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_extrazTestMode ); + } + public bool IsActive { get { return m_zTestMode.IntValue != 0 || m_zWriteMode.IntValue != 0 || m_offsetEnabled || m_zTestMode.Active || m_zWriteMode.Active; } } + public StandardSurfaceOutputNode ParentSurface { get { return m_parentSurface; } set { m_parentSurface = value; } } + } +} |