// Amplify Shader Editor - Visual Shader Editing Tool // Copyright (c) Amplify Creations, Lda using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace AmplifyShaderEditor { [Serializable] public class TemplateAdditionalParentHelper : TemplateModuleParent { private string NativeFoldoutStr = "Native"; protected string m_helpBoxMessage = string.Empty; private const float ShaderKeywordButtonLayoutWidth = 15; private ParentNode m_currentOwner; [SerializeField] protected List m_nativeItems = new List(); [SerializeField] protected bool m_nativeItemsFoldout = false; [SerializeField] protected List m_additionalItems = new List(); [SerializeField] protected List m_outsideItems = new List(); public TemplateAdditionalParentHelper( string moduleName ) : base( moduleName ) { } public bool IsValid { set{ m_validData = value; } get{ return m_validData; } } public void FillNativeItems( List nativeItems ) { m_nativeItems.Clear(); m_nativeItems.AddRange( nativeItems ); } public void Draw( ParentNode owner ) { m_currentOwner = owner; bool foldout = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDefines; NodeUtils.DrawNestedPropertyGroup( ref foldout, m_moduleName, DrawMainBody, DrawButtons ); owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDefines = foldout; } public void CopyFrom( TemplateAdditionalParentHelper other ) { m_additionalItems.Clear(); m_outsideItems.Clear(); int otherAdditionalItemsCount = other.ItemsList.Count; for( int i = 0; i < otherAdditionalItemsCount; i++ ) { m_additionalItems.Add( other.ItemsList[ i ] ); } int otherOusideItemsCount = other.OutsideList.Count; for( int i = 0; i < otherOusideItemsCount; i++ ) { m_outsideItems.Add( other.OutsideList[ i ] ); } } void DrawButtons() { EditorGUILayout.Separator(); // Add keyword if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) { m_additionalItems.Add( string.Empty ); EditorGUI.FocusTextInControl( null ); m_isDirty = true; } //Remove keyword if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) { if( m_additionalItems.Count > 0 ) { m_additionalItems.RemoveAt( m_additionalItems.Count - 1 ); EditorGUI.FocusTextInControl( null ); } m_isDirty = true; } } void DrawNativeItems() { EditorGUILayout.Separator(); EditorGUI.indentLevel++; int count = m_nativeItems.Count; for ( int i = 0; i < count; i++ ) { EditorGUILayout.LabelField( m_nativeItems[i] ); } EditorGUI.indentLevel--; EditorGUILayout.Separator(); } void DrawMainBody() { EditorGUILayout.Separator(); if( m_nativeItems.Count > 0 ) { NodeUtils.DrawNestedPropertyGroup( ref m_nativeItemsFoldout, NativeFoldoutStr, DrawNativeItems ,4); } int itemCount = m_additionalItems.Count; int markedToDelete = -1; for( int i = 0; i < itemCount; i++ ) { EditorGUILayout.BeginHorizontal(); { EditorGUI.BeginChangeCheck(); m_additionalItems[ i ] = EditorGUILayout.TextField( m_additionalItems[ i ] ); if( EditorGUI.EndChangeCheck() ) { m_additionalItems[ i ] = UIUtils.RemoveShaderInvalidCharacters( m_additionalItems[ i ] ); m_isDirty = true; } // Add new port if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) { m_additionalItems.Insert( i + 1, string.Empty ); EditorGUI.FocusTextInControl( null ); m_isDirty = true; } //Remove port if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) { markedToDelete = i; m_isDirty = true; } } EditorGUILayout.EndHorizontal(); } if( markedToDelete > -1 ) { if( m_additionalItems.Count > markedToDelete ) { m_additionalItems.RemoveAt( markedToDelete ); EditorGUI.FocusTextInControl( null ); } } EditorGUILayout.Separator(); EditorGUILayout.HelpBox( m_helpBoxMessage, MessageType.Info ); } public override void ReadFromString( ref uint index, ref string[] nodeParams ) { try { int count = Convert.ToInt32( nodeParams[ index++ ] ); for( int i = 0; i < count; i++ ) { m_additionalItems.Add( nodeParams[ index++ ] ); } } catch( Exception e ) { Debug.LogException( e ); } } public override void WriteToString( ref string nodeInfo ) { IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalItems.Count ); for( int i = 0; i < m_additionalItems.Count; i++ ) { IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalItems[ i ] ); } } public virtual void AddToDataCollector( ref MasterNodeDataCollector dataCollector , TemplateIncludePragmaContainter nativesContainer ) { } public override void Destroy() { m_additionalItems.Clear(); m_additionalItems = null; m_currentOwner = null; m_nativeItems.Clear(); m_nativeItems = null; } public List ItemsList { get { return m_additionalItems; } set { m_additionalItems = value; } } public List OutsideList { get { return m_outsideItems; } set { m_outsideItems = value; } } } }