|
|
- using System;
- using UnityEngine;
- using UnityEditor;
- using System.Collections.Generic;
-
- namespace AmplifyShaderEditor
- {
- [Serializable]
- public class CustomTagData
- {
- private const string TagFormat = "\"{0}\"=\"{1}\"";
- public string TagName;
- public string TagValue;
- public int TagId = -1;
- public bool TagFoldout = true;
-
- [SerializeField]
- private TemplateSpecialTags m_specialTag = TemplateSpecialTags.None;
- [SerializeField]
- private RenderType m_renderType = RenderType.Opaque;
- [SerializeField]
- private RenderQueue m_renderQueue = RenderQueue.Geometry;
- [SerializeField]
- private int m_renderQueueOffset = 0;
-
- public CustomTagData()
- {
- TagName = string.Empty;
- TagValue = string.Empty;
- m_specialTag = TemplateSpecialTags.None;
- m_renderType = RenderType.Opaque;
- m_renderQueue = RenderQueue.Geometry;
- m_renderQueueOffset = 0;
- }
-
- public CustomTagData( CustomTagData other )
- {
- TagName = other.TagName;
- TagValue = other.TagValue;
- TagId = other.TagId;
- TagFoldout = other.TagFoldout;
-
- m_specialTag = other.m_specialTag;
- m_renderType = other.m_renderType;
- m_renderQueue = other.m_renderQueue;
- m_renderQueueOffset = other.m_renderQueueOffset;
- }
-
- public void SetTagValue( params string[] value )
- {
- TagValue = value[ 0 ];
- switch( m_specialTag )
- {
- case TemplateSpecialTags.RenderType:
- m_renderType = TemplateHelperFunctions.StringToRenderType[ value[ 0 ] ];
- break;
- case TemplateSpecialTags.Queue:
- {
- if( value.Length == 2 )
- {
- m_renderQueue = TemplateHelperFunctions.StringToRenderQueue[ value[ 0 ] ];
- int.TryParse( value[ 1 ], out m_renderQueueOffset );
- }
- else
- {
- int indexPlus = value[ 0 ].IndexOf( '+' );
- if( indexPlus > 0 )
- {
- string[] args = value[ 0 ].Split( '+' );
- m_renderQueue = TemplateHelperFunctions.StringToRenderQueue[ args[ 0 ] ];
- int.TryParse( args[ 1 ], out m_renderQueueOffset );
- }
- else
- {
- int indexMinus = value[ 0 ].IndexOf( '-' );
- if( indexMinus > 0 )
- {
- string[] args = value[ 0 ].Split( '-' );
- m_renderQueue = TemplateHelperFunctions.StringToRenderQueue[ args[ 0 ] ];
- int.TryParse( args[ 1 ], out m_renderQueueOffset );
- m_renderQueueOffset *= -1;
- }
- else
- {
- m_renderQueue = TemplateHelperFunctions.StringToRenderQueue[ value[ 0 ] ];
- m_renderQueueOffset = 0;
- }
- }
- }
- BuildQueueTagValue();
- }
- break;
-
- }
- }
-
-
- void CheckSpecialTag()
- {
- if( TagName.Equals( Constants.RenderTypeHelperStr ) )
- {
- m_specialTag = TemplateSpecialTags.RenderType;
- m_renderType = TemplateHelperFunctions.StringToRenderType[ TagValue ];
- }
- else if( TagName.Equals( Constants.RenderQueueHelperStr ) )
- {
- m_specialTag = TemplateSpecialTags.Queue;
- SetTagValue( TagValue );
- }
- else
- {
- m_specialTag = TemplateSpecialTags.None;
- }
- }
-
- public CustomTagData( string name, string value, int id )
- {
- TagName = name;
- TagValue = value;
- TagId = id;
- CheckSpecialTag();
- }
-
- //Used on Template based shaders loading
- public CustomTagData( string data, int id )
- {
- TagId = id;
- string[] arr = data.Split( IOUtils.VALUE_SEPARATOR );
- if( arr.Length > 1 )
- {
- TagName = arr[ 0 ];
- TagValue = arr[ 1 ];
- }
-
- if( arr.Length > 2 )
- {
- m_specialTag = (TemplateSpecialTags)Enum.Parse( typeof( TemplateSpecialTags ), arr[ 2 ] );
- switch( m_specialTag )
- {
- case TemplateSpecialTags.RenderType:
- {
- m_renderType = (RenderType)Enum.Parse( typeof( RenderType ), TagValue );
- }
- break;
- case TemplateSpecialTags.Queue:
- {
- if( arr.Length == 4 )
- {
- m_renderQueue = (RenderQueue)Enum.Parse( typeof( RenderQueue ), TagValue );
- int.TryParse( arr[ 3 ], out m_renderQueueOffset );
- }
- BuildQueueTagValue();
- }
- break;
- }
- }
- else if( UIUtils.CurrentShaderVersion() < 15600 )
- {
- CheckSpecialTag();
- }
- }
-
- //Used on Standard Surface shaders loading
- public CustomTagData( string data )
- {
- string[] arr = data.Split( IOUtils.VALUE_SEPARATOR );
- if( arr.Length > 1 )
- {
- TagName = arr[ 0 ];
- TagValue = arr[ 1 ];
- }
- }
-
- public override string ToString()
- {
- switch( m_specialTag )
- {
- case TemplateSpecialTags.RenderType:
- return TagName + IOUtils.VALUE_SEPARATOR +
- TagValue + IOUtils.VALUE_SEPARATOR +
- m_specialTag;
- case TemplateSpecialTags.Queue:
- return TagName + IOUtils.VALUE_SEPARATOR +
- m_renderQueue.ToString() + IOUtils.VALUE_SEPARATOR +
- m_specialTag + IOUtils.VALUE_SEPARATOR +
- m_renderQueueOffset;
- }
-
- return TagName + IOUtils.VALUE_SEPARATOR + TagValue;
- }
-
- public string GenerateTag()
- {
- return string.Format( TagFormat, TagName, TagValue );
- }
-
- public void BuildQueueTagValue()
- {
- TagValue = m_renderQueue.ToString();
- if( m_renderQueueOffset > 0 )
- {
- TagValue += "+" + m_renderQueueOffset;
- }
- else if( m_renderQueueOffset < 0 )
- {
- TagValue += m_renderQueueOffset;
- }
- }
-
- public TemplateSpecialTags SpecialTag
- {
- get { return m_specialTag; }
- set
- {
- m_specialTag = value;
- switch( value )
- {
- case TemplateSpecialTags.RenderType:
- {
- TagValue = m_renderType.ToString();
- }
- break;
- case TemplateSpecialTags.Queue:
- {
- BuildQueueTagValue();
- }
- break;
- }
- }
- }
-
- public RenderType RenderType
- {
- get { return m_renderType; }
- set
- {
- m_renderType = value;
- TagValue = value.ToString();
- }
- }
-
- public RenderQueue RenderQueue
- {
- get { return m_renderQueue; }
- set { m_renderQueue = value; }
- }
- public int RenderQueueOffset
- {
- get { return m_renderQueueOffset; }
- set { m_renderQueueOffset = value; }
- }
-
- public bool IsValid { get { return ( !string.IsNullOrEmpty( TagValue ) && !string.IsNullOrEmpty( TagName ) ); } }
- }
-
- [Serializable]
- public class CustomTagsHelper
- {
- private const string CustomTagsStr = " Custom SubShader Tags";
- private const string TagNameStr = "Name";
- private const string TagValueStr = "Value";
-
- private const float ShaderKeywordButtonLayoutWidth = 15;
- private ParentNode m_currentOwner;
-
- [SerializeField]
- private List<CustomTagData> m_availableTags = new List<CustomTagData>();
-
- public void Draw( ParentNode owner )
- {
- m_currentOwner = owner;
- bool value = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedCustomTags;
- NodeUtils.DrawPropertyGroup( ref value, CustomTagsStr, DrawMainBody, DrawButtons );
- owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedCustomTags = value;
- }
-
- void DrawButtons()
- {
- EditorGUILayout.Separator();
-
- // Add tag
- if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) )
- {
- m_availableTags.Add( new CustomTagData() );
- EditorGUI.FocusTextInControl( null );
- }
-
- //Remove tag
- if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) )
- {
- if( m_availableTags.Count > 0 )
- {
- m_availableTags.RemoveAt( m_availableTags.Count - 1 );
- EditorGUI.FocusTextInControl( null );
- }
- }
- }
-
- void DrawMainBody()
- {
- EditorGUILayout.Separator();
- int itemCount = m_availableTags.Count;
-
- if( itemCount == 0 )
- {
- EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add one.", MessageType.Info );
- }
-
- int markedToDelete = -1;
- float originalLabelWidth = EditorGUIUtility.labelWidth;
- for( int i = 0; i < itemCount; i++ )
- {
- m_availableTags[ i ].TagFoldout = m_currentOwner.EditorGUILayoutFoldout( m_availableTags[ i ].TagFoldout, string.Format( "[{0}] - {1}", i, m_availableTags[ i ].TagName ) );
- if( m_availableTags[ i ].TagFoldout )
- {
- EditorGUI.indentLevel += 1;
- EditorGUIUtility.labelWidth = 70;
- //Tag Name
- EditorGUI.BeginChangeCheck();
- m_availableTags[ i ].TagName = EditorGUILayout.TextField( TagNameStr, m_availableTags[ i ].TagName );
- if( EditorGUI.EndChangeCheck() )
- {
- m_availableTags[ i ].TagName = UIUtils.RemoveShaderInvalidCharacters( m_availableTags[ i ].TagName );
- }
-
- //Tag Value
- EditorGUI.BeginChangeCheck();
- m_availableTags[ i ].TagValue = EditorGUILayout.TextField( TagValueStr, m_availableTags[ i ].TagValue );
- if( EditorGUI.EndChangeCheck() )
- {
- m_availableTags[ i ].TagValue = UIUtils.RemoveShaderInvalidCharacters( m_availableTags[ i ].TagValue );
- }
-
- EditorGUIUtility.labelWidth = originalLabelWidth;
-
- EditorGUILayout.BeginHorizontal();
- {
- GUILayout.Label( " " );
- // Add new port
- if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) )
- {
- m_availableTags.Insert( i + 1, new CustomTagData() );
- EditorGUI.FocusTextInControl( null );
- }
-
- //Remove port
- if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) )
- {
- markedToDelete = i;
- }
- }
- EditorGUILayout.EndHorizontal();
-
- EditorGUI.indentLevel -= 1;
- }
-
- }
- if( markedToDelete > -1 )
- {
- if( m_availableTags.Count > markedToDelete )
- {
- m_availableTags.RemoveAt( markedToDelete );
- EditorGUI.FocusTextInControl( null );
- }
- }
- EditorGUILayout.Separator();
- }
-
-
- public void ReadFromString( ref uint index, ref string[] nodeParams )
- {
- int count = Convert.ToInt32( nodeParams[ index++ ] );
- for( int i = 0; i < count; i++ )
- {
- m_availableTags.Add( new CustomTagData( nodeParams[ index++ ] ) );
- }
- }
-
- public void WriteToString( ref string nodeInfo )
- {
- int tagsCount = m_availableTags.Count;
- IOUtils.AddFieldValueToString( ref nodeInfo, tagsCount );
- for( int i = 0; i < tagsCount; i++ )
- {
- IOUtils.AddFieldValueToString( ref nodeInfo, m_availableTags[ i ].ToString() );
- }
- }
-
- public string GenerateCustomTags()
- {
- int tagsCount = m_availableTags.Count;
- string result = tagsCount == 0 ? string.Empty : " ";
-
- for( int i = 0; i < tagsCount; i++ )
- {
- if( m_availableTags[ i ].IsValid )
- {
- result += m_availableTags[ i ].GenerateTag();
- if( i < tagsCount - 1 )
- {
- result += " ";
- }
- }
- }
- return result;
- }
-
- public void Destroy()
- {
- m_availableTags.Clear();
- m_availableTags = null;
- m_currentOwner = null;
- }
- }
- }
|