You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

272 lines
8.1 KiB

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; } }
}
}