123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683 |
- // Amplify Shader Editor - Visual Shader Editing Tool
- // Copyright (c) Amplify Creations, Lda <info@amplify.pt>
- using UnityEngine;
- using UnityEditor;
- using System;
- using System.Collections.Generic;
- namespace AmplifyShaderEditor
- {
- public enum OutlineMode
- {
- VertexOffset,
- VertexScale
- }
- [Serializable]
- public sealed class OutlineOpHelper
- {
- private string[] ModeTags =
- {
- "Tags{ }",
- "Tags{ \"RenderType\" = \"TransparentCutout\" \"Queue\" = \"AlphaTest+0\"}",
- "Tags{ \"RenderType\" = \"Transparent\" \"Queue\" = \"Transparent+0\"}",
- "Tags{ \"RenderType\" = \"Transparent\" \"Queue\" = \"Transparent+0\" }"
- };
- private string[] ModePragma =
- {
- string.Empty,
- string.Empty,
- "alpha:fade ",
- "alpha:premul "
- };
- private readonly string OutlineSurfaceConfig = "#pragma surface outlineSurf Outline {0} keepalpha noshadow noambient novertexlights nolightmap nodynlightmap nodirlightmap nometa noforwardadd vertex:outlineVertexDataFunc ";
- private readonly string OutlineBodyStructBegin = "struct Input {";
- private readonly string OutlineBodyStructDefault = "\thalf filler;";
- private readonly string OutlineBodyStructEnd = "};";
- private readonly string OutlineDefaultUniformColor = "half4 _ASEOutlineColor;";
- private readonly string OutlineDefaultUniformWidth = "half _ASEOutlineWidth;";
- private readonly string OutlineDefaultUniformColorInstanced = "UNITY_DEFINE_INSTANCED_PROP( half4, _ASEOutlineColor )";
- private readonly string OutlineDefaultUniformWidthInstanced = "UNITY_DEFINE_INSTANCED_PROP( half, _ASEOutlineWidth )";
- private readonly string OutlineDefaultVertexHeader = "void outlineVertexDataFunc( inout appdata_full v, out Input o )\n\t\t{";
- private readonly string OutlineTessVertexHeader = "void outlineVertexDataFunc( inout appdata_full v )\n\t\t{";
- private readonly string OutlineDefaultVertexOutputDeclaration = "\tUNITY_INITIALIZE_OUTPUT( Input, o );";
- private readonly string[] OutlineSurfBody = {
- "\to.Emission = _ASEOutlineColor.rgb;",
- "\to.Alpha = 1;"
- };
- private readonly string[] OutlineSurfBodyInstanced = {
- "\to.Emission = UNITY_ACCESS_INSTANCED_PROP(_ASEOutlineColor).rgb;",
- "\to.Alpha = 1;"
- };
- private readonly string[] OutlineBodyDefaultSurfBegin = {
- "}",
- "inline half4 LightingOutline( SurfaceOutput s, half3 lightDir, half atten ) { return half4 ( 0,0,0, s.Alpha); }",
- "void outlineSurf( Input i, inout SurfaceOutput o )",
- "{"};
- private readonly string[] OutlineBodyDefaultSurfEnd = {
- "}",
- "ENDCG",
- "\n"};
- //private const string OutlineInstancedHeader = "#pragma multi_compile_instancing";
- //private readonly string[] OutlineBodyInstancedBegin = {
- // "UNITY_INSTANCING_CBUFFER_START({0})",
- // "\tUNITY_DEFINE_INSTANCED_PROP( half4, _ASEOutlineColor )",
- // "\tUNITY_DEFINE_INSTANCED_PROP(half, _ASEOutlineWidth)",
- // "UNITY_INSTANCING_CBUFFER_END",
- // "void outlineVertexDataFunc( inout appdata_full v, out Input o )",
- // "{",
- // "\tUNITY_INITIALIZE_OUTPUT( Input, o );"};
- //private readonly string[] OutlineBodyInstancedEnd = {
- // "}",
- // "inline half4 LightingOutline( SurfaceOutput s, half3 lightDir, half atten ) { return half4 ( 0,0,0, s.Alpha); }",
- // "void outlineSurf( Input i, inout SurfaceOutput o ) { o.Emission = UNITY_ACCESS_INSTANCED_PROP( _ASEOutlineColor ).rgb; o.Alpha = 1; }",
- // "ENDCG",
- // "\n"};
- private const string WidthVariableAccessInstanced = "UNITY_ACCESS_INSTANCED_PROP( _ASEOutlineWidth )";
- private const string OutlineVertexOffsetMode = "\tv.vertex.xyz += ( v.normal * {0} );";
- private const string OutlineVertexScaleMode = "\tv.vertex.xyz *= ( 1 + {0});";
- private const string OutlineVertexCustomMode = "\tv.vertex.xyz += {0};";
- private const string OutlineColorLabel = "Color";
- private const string OutlineWidthLabel = "Width";
- private const string ColorPropertyName = "_ASEOutlineColor";
- private const string WidthPropertyName = "_ASEOutlineWidth";
- private const string WidthPropertyNameInstanced = "UNITY_ACCESS_INSTANCED_PROP(_ASEOutlineWidth)";
-
- private const string ColorPropertyDec = "_ASEOutlineColor( \"Outline Color\", Color ) = ({0})";
- private const string OutlinePropertyDec = "_ASEOutlineWidth( \"Outline Width\", Float ) = {0}";
- private const string ModePropertyStr = "Mode";
- private const string NoFogStr = "No Fog";
- private const string BillboardInstructionFormat = "\t{0};";
- private readonly char[] m_colorMaskChar = { 'R' , 'G' , 'B' , 'A' };
- [SerializeField]
- private Color m_outlineColor;
- [SerializeField]
- private float m_outlineWidth;
- [SerializeField]
- private bool m_enabled;
- [SerializeField]
- private OutlineMode m_mode = OutlineMode.VertexOffset;
- [SerializeField]
- private bool m_noFog = true;
- private bool[] m_colorMask = { true , true , true , true };
- private CullMode m_cullMode = CullMode.Front;
- private int m_zTestMode = 0;
- private int m_zWriteMode = 0;
- private bool m_dirtyInput = false;
- private string m_inputs = string.Empty;
- private List<PropertyDataCollector> m_inputList = new List<PropertyDataCollector>();
- private string m_uniforms = string.Empty;
- private List<PropertyDataCollector> m_uniformList = new List<PropertyDataCollector>();
- private List<PropertyDataCollector> m_instancedPropertiesList = new List<PropertyDataCollector>();
- private string m_instancedProperties = string.Empty;
- private string m_instructions = string.Empty;
- private string m_functions = string.Empty;
- private string m_includes = string.Empty;
- private string m_pragmas = string.Empty;
- private string m_defines = string.Empty;
- private string m_standardAdditionalDirectives = string.Empty;
- private string m_vertexData = string.Empty;
- private string m_grabPasses = string.Empty;
- private Dictionary<string, string> m_localFunctions;
- //private OutlineMode m_customMode = OutlineMode.VertexOffset;
- private int m_offsetMode = 0;
- private bool m_customNoFog = true;
- public void Draw( ParentNode owner, GUIStyle toolbarstyle, Material mat )
- {
- Color cachedColor = GUI.color;
- GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f );
- EditorGUILayout.BeginHorizontal( toolbarstyle );
- GUI.color = cachedColor;
- owner.ContainerGraph.ParentWindow.InnerWindowVariables.OutlineActiveMode = owner.GUILayoutToggle( owner.ContainerGraph.ParentWindow.InnerWindowVariables.OutlineActiveMode , EditorVariablesManager.OutlineActiveMode.LabelName, UIUtils.MenuItemToggleStyle, GUILayout.ExpandWidth( true ) );
- EditorGUI.BeginChangeCheck();
- m_enabled = owner.EditorGUILayoutToggle( string.Empty, m_enabled, UIUtils.MenuItemEnableStyle, GUILayout.Width( 16 ) );
- if( EditorGUI.EndChangeCheck() )
- {
- if( m_enabled )
- UpdateToMaterial( mat );
- UIUtils.RequestSave();
- }
- EditorGUILayout.EndHorizontal();
- if( owner.ContainerGraph.ParentWindow.InnerWindowVariables.OutlineActiveMode )
- {
- 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;
- EditorGUILayout.Separator();
- EditorGUI.BeginDisabledGroup( !m_enabled );
- EditorGUI.indentLevel += 1;
- {
- m_mode = (OutlineMode)owner.EditorGUILayoutEnumPopup( ModePropertyStr, m_mode );
- EditorGUI.BeginChangeCheck();
- m_outlineColor = owner.EditorGUILayoutColorField( OutlineColorLabel, m_outlineColor );
- if( EditorGUI.EndChangeCheck() && mat != null )
- {
- if( mat.HasProperty( ColorPropertyName ) )
- {
- mat.SetColor( ColorPropertyName, m_outlineColor );
- }
- }
- EditorGUI.BeginChangeCheck();
- m_outlineWidth = owner.EditorGUILayoutFloatField( OutlineWidthLabel, m_outlineWidth );
- if( EditorGUI.EndChangeCheck() && mat != null )
- {
- if( mat.HasProperty( WidthPropertyName ) )
- {
- mat.SetFloat( WidthPropertyName, m_outlineWidth );
- }
- }
- m_noFog = owner.EditorGUILayoutToggle( NoFogStr, m_noFog );
- }
- EditorGUI.indentLevel -= 1;
- EditorGUI.EndDisabledGroup();
- EditorGUILayout.Separator();
- EditorGUILayout.EndVertical();
- }
- }
- public void UpdateToMaterial( Material mat )
- {
- if( mat == null )
- return;
- if( mat.HasProperty( ColorPropertyName ) )
- {
- mat.SetColor( ColorPropertyName, m_outlineColor );
- }
- if( mat.HasProperty( WidthPropertyName ) )
- {
- mat.SetFloat( WidthPropertyName, m_outlineWidth );
- }
- }
- public void ReadFromString( ref uint index, ref string[] nodeParams )
- {
- m_enabled = Convert.ToBoolean( nodeParams[ index++ ] );
- m_outlineWidth = Convert.ToSingle( nodeParams[ index++ ] );
- m_outlineColor = IOUtils.StringToColor( nodeParams[ index++ ] );
- if( UIUtils.CurrentShaderVersion() > 5004 )
- {
- m_mode = (OutlineMode)Enum.Parse( typeof( OutlineMode ), nodeParams[ index++ ] );
- }
- if( UIUtils.CurrentShaderVersion() > 13902 )
- {
- m_noFog = Convert.ToBoolean( nodeParams[ index++ ] );
- }
- }
- public void WriteToString( ref string nodeInfo )
- {
- IOUtils.AddFieldValueToString( ref nodeInfo, m_enabled );
- IOUtils.AddFieldValueToString( ref nodeInfo, m_outlineWidth );
- IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.ColorToString( m_outlineColor ) );
- IOUtils.AddFieldValueToString( ref nodeInfo, m_mode );
- IOUtils.AddFieldValueToString( ref nodeInfo, m_noFog );
- }
- public void AddToDataCollector( ref MasterNodeDataCollector dataCollector )
- {
- if( !dataCollector.UsingCustomOutlineColor )
- dataCollector.AddToProperties( -1, string.Format( ColorPropertyDec, IOUtils.ColorToString( m_outlineColor ) ), -1 );
- if( !dataCollector.UsingCustomOutlineWidth )
- dataCollector.AddToProperties( -1, string.Format( OutlinePropertyDec, m_outlineWidth ), -1 );
- }
- public void UpdateFromMaterial( Material mat )
- {
- if( mat.HasProperty( ColorPropertyName ) )
- {
- m_outlineColor = mat.GetColor( ColorPropertyName );
- }
- if( mat.HasProperty( WidthPropertyName ) )
- {
- m_outlineWidth = mat.GetFloat( WidthPropertyName );
- }
- }
- void AddMultibodyString( string body , List<string> list )
- {
- body = body.Replace( "\t\t", string.Empty );
- string[] strArr = body.Split( '\n' );
- for( int i = 0; i < strArr.Length; i++ )
- {
- list.Add( strArr[ i ] );
- }
- }
- public string[] OutlineFunctionBody( ref MasterNodeDataCollector dataCollector, bool instanced, bool isShadowCaster, string shaderName, string[] billboardInfo, ref TessellationOpHelper tessOpHelper, string target, PrecisionType precision )
- {
- List<string> body = new List<string>();
- body.Add( ModeTags[ dataCollector.CustomOutlineSelectedAlpha ] );
- if( !string.IsNullOrEmpty( m_grabPasses ))
- body.Add( m_grabPasses.Replace( "\t\t",string.Empty ));
- if( m_zWriteMode != 0 )
- body.Add( "ZWrite " + ZBufferOpHelper.ZWriteModeValues[ m_zWriteMode ] );
- if( m_zTestMode != 0 )
- body.Add( "ZTest " + ZBufferOpHelper.ZTestModeValues[ m_zTestMode ] );
- body.Add( "Cull " + m_cullMode );
-
- //Color Mask
- {
- int count = 0;
- string colorMask = string.Empty;
- for( int i = 0 ; i < m_colorMask.Length ; i++ )
- {
- if( m_colorMask[ i ] )
- {
- count++;
- colorMask += m_colorMaskChar[ i ];
- }
- }
- if( count != m_colorMask.Length )
- {
- body.Add( "ColorMask " + ( ( count == 0 ) ? "0" : colorMask ) );
- }
- }
- body.Add( "CGPROGRAM" );
- if( tessOpHelper.EnableTesselation )
- {
- body.Add( "#include \"" + TessellationOpHelper.TessInclude + "\"" );
- body.Add( "#pragma target " + target );
- }
- else
- {
- body.Add( "#pragma target 3.0" );
- }
- bool customOutline = dataCollector.UsingCustomOutlineColor || dataCollector.UsingCustomOutlineWidth || dataCollector.UsingCustomOutlineAlpha;
- int outlineMode = customOutline ? m_offsetMode : ( m_mode == OutlineMode.VertexOffset ? 0 : 1 );
- string extraOptions = ( customOutline ? m_customNoFog : m_noFog ) ? "nofog " : string.Empty;
- if( dataCollector.CustomOutlineSelectedAlpha > 0 )
- {
- extraOptions += ModePragma[ dataCollector.CustomOutlineSelectedAlpha ];
- }
- string surfConfig = string.Format( OutlineSurfaceConfig, extraOptions );
- if( tessOpHelper.EnableTesselation )
- tessOpHelper.WriteToOptionalParams( ref surfConfig );
- body.Add( surfConfig );
- if( !isShadowCaster )
- {
- AddMultibodyString( m_defines, body );
- AddMultibodyString( m_includes, body );
- AddMultibodyString( m_pragmas, body );
- }
- AddMultibodyString( m_standardAdditionalDirectives, body );
- //if( instanced )
- //{
- // body.Add( OutlineInstancedHeader );
- //}
- if( customOutline )
- {
- if( isShadowCaster )
- {
- for( int i = 0; i < InputList.Count; i++ )
- {
- dataCollector.AddToInput( InputList[ i ].NodeId, InputList[ i ].PropertyName, !InputList[ i ].IsDirective );
- }
- }
- else
- {
- if( !string.IsNullOrEmpty( m_inputs ) )
- body.Add( m_inputs.Trim( '\t', '\n' ) );
- }
- if( !DirtyInput && !isShadowCaster )
- body.Add( OutlineBodyStructDefault );
- if( !isShadowCaster )
- body.Add( OutlineBodyStructEnd );
- }
- else if( !isShadowCaster )
- {
- body.Add( OutlineBodyStructBegin );
- body.Add( OutlineBodyStructDefault );
- body.Add( OutlineBodyStructEnd );
- }
- if( instanced )
- {
- //for( int i = 0; i < OutlineBodyInstancedBegin.Length; i++ )
- //{
- // body.Add( ( i == 0 ) ? string.Format( OutlineBodyInstancedBegin[ i ], shaderName ) : OutlineBodyInstancedBegin[ i ] );
- //}
- //if( (object)billboardInfo != null )
- //{
- // for( int j = 0; j < billboardInfo.Length; j++ )
- // {
- // body.Add( string.Format( BillboardInstructionFormat, billboardInfo[ j ] ) );
- // }
- //}
- //switch( outlineMode )
- //{
- // case 0: body.Add( string.Format( OutlineVertexOffsetMode, WidthVariableAccessInstanced ) ); break;
- // case 1: body.Add( string.Format( OutlineVertexScaleMode, WidthVariableAccessInstanced ) ); break;
- // case 2: body.Add( string.Format( OutlineVertexCustomMode, WidthVariableAccessInstanced ) ); break;
- //}
- //for( int i = 0; i < OutlineBodyInstancedEnd.Length; i++ )
- //{
- // body.Add( OutlineBodyInstancedEnd[ i ] );
- //}
-
- //Instanced block name must differ from used on main shader so it won't throw a duplicate name error
- shaderName = shaderName+ "Outline";
- bool openCBuffer = true;
- if( customOutline )
- {
- if( isShadowCaster )
- {
- for( int i = 0; i < UniformList.Count; i++ )
- {
- dataCollector.AddToUniforms( UniformList[ i ].NodeId, UniformList[ i ].PropertyName );
- }
- foreach( KeyValuePair<string, string> kvp in m_localFunctions )
- {
- dataCollector.AddFunction( kvp.Key, kvp.Value );
- }
- }
- else
- {
- if( !string.IsNullOrEmpty( Uniforms ) )
- body.Add( Uniforms.Trim( '\t', '\n' ) );
- openCBuffer = false;
- body.Add( string.Format( IOUtils.InstancedPropertiesBegin, shaderName ));
- if( !string.IsNullOrEmpty( InstancedProperties ) )
- body.Add( InstancedProperties.Trim( '\t', '\n' ) );
- }
- }
- if( openCBuffer)
- body.Add( string.Format( IOUtils.InstancedPropertiesBegin, shaderName ) );
- if( !dataCollector.UsingCustomOutlineColor )
- body.Add( precision == PrecisionType.Float ? OutlineDefaultUniformColorInstanced.Replace( "half", "float" ) : OutlineDefaultUniformColorInstanced );
- if( !dataCollector.UsingCustomOutlineWidth )
- body.Add( precision == PrecisionType.Float ? OutlineDefaultUniformWidthInstanced.Replace( "half", "float" ) : OutlineDefaultUniformWidthInstanced );
- body.Add( IOUtils.InstancedPropertiesEnd );
- //Functions
- if( customOutline && !isShadowCaster )
- body.Add( Functions );
- if( tessOpHelper.EnableTesselation && !isShadowCaster )
- {
- body.Add( tessOpHelper.Uniforms().TrimStart( '\t' ) );
- body.Add( tessOpHelper.GetCurrentTessellationFunction( ref dataCollector ).Trim( '\t', '\n' ) + "\n" );
- }
- if( tessOpHelper.EnableTesselation )
- {
- body.Add( OutlineTessVertexHeader );
- }
- else
- {
- body.Add( OutlineDefaultVertexHeader );
- body.Add( OutlineDefaultVertexOutputDeclaration );
- }
- if( customOutline )
- {
- if( !string.IsNullOrEmpty( VertexData ) )
- body.Add( "\t" + VertexData.Trim( '\t', '\n' ) );
- }
- if( (object)billboardInfo != null )
- {
- for( int j = 0; j < billboardInfo.Length; j++ )
- {
- body.Add( string.Format( BillboardInstructionFormat, billboardInfo[ j ] ) );
- }
- }
- switch( outlineMode )
- {
- case 0: body.Add( string.Format( OutlineVertexOffsetMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyNameInstanced ) ); break;
- case 1: body.Add( string.Format( OutlineVertexScaleMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyNameInstanced ) ); break;
- case 2: body.Add( string.Format( OutlineVertexCustomMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyNameInstanced ) ); break;
- }
- for( int i = 0; i < OutlineBodyDefaultSurfBegin.Length; i++ )
- {
- body.Add( OutlineBodyDefaultSurfBegin[ i ] );
- }
- if( dataCollector.UsingCustomOutlineColor || dataCollector.CustomOutlineSelectedAlpha > 0 )
- {
- body.Add( "\t" + Instructions.Trim( '\t', '\n' ) );
- }
- else
- {
- for( int i = 0; i < OutlineSurfBodyInstanced.Length; i++ )
- {
- body.Add( OutlineSurfBodyInstanced[ i ] );
- }
- }
- for( int i = 0; i < OutlineBodyDefaultSurfEnd.Length; i++ )
- {
- body.Add( OutlineBodyDefaultSurfEnd[ i ] );
- }
- }
- else
- {
- if( customOutline )
- {
- if( isShadowCaster )
- {
- for( int i = 0; i < UniformList.Count; i++ )
- {
- dataCollector.AddToUniforms( UniformList[ i ].NodeId, UniformList[ i ].PropertyName );
- }
- foreach( KeyValuePair<string, string> kvp in m_localFunctions )
- {
- dataCollector.AddFunction( kvp.Key, kvp.Value );
- }
- }
- else
- {
- if( !string.IsNullOrEmpty( Uniforms ) )
- body.Add( Uniforms.Trim( '\t', '\n' ) );
- }
- }
- if( !dataCollector.UsingCustomOutlineColor )
- body.Add( precision == PrecisionType.Float ? OutlineDefaultUniformColor.Replace( "half", "float" ) : OutlineDefaultUniformColor );
- if( !dataCollector.UsingCustomOutlineWidth )
- body.Add( precision == PrecisionType.Float ? OutlineDefaultUniformWidth.Replace( "half", "float" ) : OutlineDefaultUniformWidth );
- //Functions
- if( customOutline && !isShadowCaster )
- body.Add( Functions );
- if( tessOpHelper.EnableTesselation && !isShadowCaster )
- {
- body.Add( tessOpHelper.Uniforms().TrimStart( '\t' ) );
- body.Add( tessOpHelper.GetCurrentTessellationFunction( ref dataCollector ).Trim( '\t', '\n' ) + "\n" );
- }
- if( tessOpHelper.EnableTesselation )
- {
- body.Add( OutlineTessVertexHeader );
- }
- else
- {
- body.Add( OutlineDefaultVertexHeader );
- body.Add( OutlineDefaultVertexOutputDeclaration );
- }
- if( customOutline )
- {
- if( !string.IsNullOrEmpty( VertexData ) )
- body.Add( "\t" + VertexData.Trim( '\t', '\n' ) );
- }
- if( (object)billboardInfo != null )
- {
- for( int j = 0; j < billboardInfo.Length; j++ )
- {
- body.Add( string.Format( BillboardInstructionFormat, billboardInfo[ j ] ) );
- }
- }
- switch( outlineMode )
- {
- case 0: body.Add( string.Format( OutlineVertexOffsetMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyName ) ); break;
- case 1: body.Add( string.Format( OutlineVertexScaleMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyName ) ); break;
- case 2: body.Add( string.Format( OutlineVertexCustomMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyName ) ); break;
- }
- for( int i = 0; i < OutlineBodyDefaultSurfBegin.Length; i++ )
- {
- body.Add( OutlineBodyDefaultSurfBegin[ i ] );
- }
- if( dataCollector.UsingCustomOutlineColor || dataCollector.CustomOutlineSelectedAlpha > 0 )
- {
- body.Add( "\t" + Instructions.Trim( '\t', '\n' ) );
- }
- else
- {
- for( int i = 0; i < OutlineSurfBody.Length; i++ )
- {
- body.Add( OutlineSurfBody[ i ] );
- }
- }
- for( int i = 0; i < OutlineBodyDefaultSurfEnd.Length; i++ )
- {
- body.Add( OutlineBodyDefaultSurfEnd[ i ] );
- }
- }
- string[] bodyArr = body.ToArray();
- body.Clear();
- body = null;
- return bodyArr;
- }
- public void Destroy()
- {
- m_inputList = null;
- m_uniformList = null;
- m_instancedPropertiesList = null;
- m_localFunctions = null;
- }
- public bool EnableOutline { get { return m_enabled; } }
- public bool UsingCullMode { get { return m_cullMode != CullMode.Front; } }
- public bool UsingZWrite { get { return m_zWriteMode != 0; } }
- public bool UsingZTest { get { return m_zTestMode != 0; } }
- public int ZWriteMode { get { return m_zWriteMode; } set { m_zWriteMode = value; } }
- public int ZTestMode { get { return m_zTestMode; } set { m_zTestMode = value; } }
- public CullMode OutlineCullMode { get { return m_cullMode; } set { m_cullMode = value; } }
- public bool[] ColorMask
- {
- get { return m_colorMask; }
- set
- {
- if( value.Length == m_colorMask.Length )
- {
- for( int i = 0 ; i < m_colorMask.Length ; i++ )
- {
- m_colorMask[i] = value[i];
- }
- }
- }
- }
- public bool ActiveColorMask
- {
- get
- {
- for( int i = 0 ; i < m_colorMask.Length ; i++ )
- {
- if( !m_colorMask[ i ] )
- return true;
- }
- return false;
- }
- }
- public string Inputs { get { return m_inputs; } set { m_inputs = value; } }
- public string Uniforms { get { return m_uniforms; } set { m_uniforms = value; } }
- public string InstancedProperties { get { return m_instancedProperties; } set { m_instancedProperties = value; } }
- public string Instructions { get { return m_instructions; } set { m_instructions = value; } }
- public string Functions { get { return m_functions; } set { m_functions = value; } }
- public string Includes { get { return m_includes; } set { m_includes = value; } }
- public string Pragmas { get { return m_pragmas; } set { m_pragmas = value; } }
- public string Defines { get { return m_defines; } set { m_defines = value; } }
- public string StandardAdditionalDirectives { get { return m_standardAdditionalDirectives; } set { m_standardAdditionalDirectives = value; } }
- public string VertexData { get { return m_vertexData; } set { m_vertexData = value; } }
- public string GrabPasses { get { return m_grabPasses; } set { m_grabPasses = value; } }
- public List<PropertyDataCollector> InputList { get { return m_inputList; } set { m_inputList = value; } }
- public List<PropertyDataCollector> UniformList { get { return m_uniformList; } set { m_uniformList = value; } }
- public List<PropertyDataCollector> InstancedPropertiesList { get { return m_instancedPropertiesList; } set { m_instancedPropertiesList = value; } }
- public Dictionary<string, string> LocalFunctions { get { return m_localFunctions; } set { m_localFunctions = value; } }
- public bool DirtyInput { get { return m_dirtyInput; } set { m_dirtyInput = value; } }
- //public OutlineMode CustomMode { get { return m_customMode; } set { m_customMode = value; } }
- public int OffsetMode { get { return m_offsetMode; } set { m_offsetMode = value; } }
- public bool CustomNoFog { get { return m_customNoFog; } set { m_customNoFog = value; } }
- }
- }
|