diff options
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/UsePassHelper.cs')
-rw-r--r-- | Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/UsePassHelper.cs | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/UsePassHelper.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/UsePassHelper.cs new file mode 100644 index 00000000..d6e34adf --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/UsePassHelper.cs @@ -0,0 +1,360 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; + +namespace AmplifyShaderEditor +{ + public enum UsePassLocation + { + Above, + Below + } + + [Serializable] + public class UsePassItem : ScriptableObject + { + public UsePassLocation Location; + public string Value; + public UsePassItem() + { + Location = UsePassLocation.Above; + Value = string.Empty; + } + + public UsePassItem( UsePassLocation location, string name ) + { + Location = location; + Value = name; + } + + } + + [Serializable] + public class UsePassHelper : ScriptableObject + { + private const string UseGrabFormatNewLine = "UsePass \"{0}\"\n"; + private const string UseGrabFormat = "UsePass \"{0}\""; + private const float ShaderKeywordButtonLayoutWidth = 15; + private const string ShaderPoputContext = "CONTEXT/ShaderPopup"; + + [SerializeField] + private List<UsePassItem> m_items = new List<UsePassItem>(); + + [SerializeField] + private UndoParentNode m_owner = null; + + [SerializeField] + protected bool m_isDirty = false; + + [SerializeField] + protected string m_moduleName = string.Empty; + + private ReorderableList m_reordableList = null; + private ReordableAction m_actionType = ReordableAction.None; + private int m_actionIndex = 0; + private GUIStyle m_propertyAdjustment; + + private Material m_dummyMaterial; + private MenuCommand m_dummyCommand; + private int m_currentUsePassIdx = 0; + + public void Init( string moduleName ) + { + hideFlags = HideFlags.HideAndDontSave; + m_moduleName = moduleName; + } + + void DrawButtons() + { + EditorGUILayout.Separator(); + + // Add keyword + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + UsePassItem newItem = ScriptableObject.CreateInstance<UsePassItem>(); + newItem.hideFlags = HideFlags.HideAndDontSave; + m_items.Add( newItem ); + EditorGUI.FocusTextInControl( null ); + m_isDirty = true; + } + + //Remove keyword + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + if( m_items.Count > 0 ) + { + UsePassItem itemToDelete = m_items[ m_items.Count - 1 ]; + m_items.RemoveAt( m_items.Count - 1 ); + ScriptableObject.DestroyImmediate( itemToDelete ); + EditorGUI.FocusTextInControl( null ); + } + m_isDirty = true; + } + } + + public void Draw( UndoParentNode owner, bool style = true ) + { + if( m_owner == null ) + m_owner = owner; + + if( m_reordableList == null ) + { + m_reordableList = new ReorderableList( m_items, typeof( UsePassItem ), true, false, false, false ) + { + headerHeight = 0, + footerHeight = 0, + showDefaultBackground = false, + drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + if( m_items[ index ] != null ) + { + float labelWidthMultiplier; + float popUpWidth; + float shaderSelectorMultiplier; + float buttonPlusPosMultiplier; + if( style ) + { + rect.x -= 10; + labelWidthMultiplier = 0.9f; + popUpWidth = 0.31f; + shaderSelectorMultiplier = 1.01f; + buttonPlusPosMultiplier = 0.78f; + } + else + { + rect.x -= 1; + labelWidthMultiplier = 1.01f; + popUpWidth = 0.25f; + shaderSelectorMultiplier = 1.0f; + buttonPlusPosMultiplier = 0.55f; + } + + Rect popupPos = new Rect( rect.x, rect.y + 2, popUpWidth * rect.width, rect.height ); + Rect labelPos = new Rect( rect.x + popupPos.width * labelWidthMultiplier, rect.y, 0.59f * rect.width, rect.height ); + + Rect shaderSelectorPos = new Rect( labelPos.x + labelPos.width* shaderSelectorMultiplier, rect.y, 15, rect.height ); + + Rect buttonPlusPos = new Rect( shaderSelectorPos.x + shaderSelectorPos.width * buttonPlusPosMultiplier, rect.y, ShaderKeywordButtonLayoutWidth, rect.height ); + Rect buttonMinusPos = new Rect( buttonPlusPos.x + buttonPlusPos.width, rect.y, ShaderKeywordButtonLayoutWidth, rect.height ); + + EditorGUI.BeginChangeCheck(); + m_items[ index ].Location = (UsePassLocation)owner.EditorGUIEnumPopup( popupPos, m_items[ index ].Location ); + + if( EditorGUI.EndChangeCheck() && m_items[ index ].Location == UsePassLocation.Below && m_owner != null && m_owner.ContainerGraph.CurrentCanvasMode == NodeAvailability.TemplateShader ) + { + m_items[ index ].Location = UsePassLocation.Above; + UIUtils.ShowMessage( "Below option still not available on templates" ); + } + m_items[ index ].Value = owner.EditorGUITextField( labelPos, string.Empty, m_items[ index ].Value ); + + if( GUI.Button( shaderSelectorPos, string.Empty, UIUtils.InspectorPopdropdownFallback ) ) + { + EditorGUI.FocusTextInControl( null ); + GUI.FocusControl( null ); + m_currentUsePassIdx = index; + DisplayShaderContext( owner, GUILayoutUtility.GetRect( GUIContent.none, EditorStyles.popup ) ); + } + + if( GUI.Button( buttonPlusPos, string.Empty, UIUtils.PlusStyle ) ) + { + m_actionType = ReordableAction.Add; + m_actionIndex = index; + } + + if( GUI.Button( buttonMinusPos, string.Empty, UIUtils.MinusStyle ) ) + { + m_actionType = ReordableAction.Remove; + m_actionIndex = index; + } + } + } + }; + } + + if( m_actionType != ReordableAction.None ) + { + switch( m_actionType ) + { + case ReordableAction.Add: + UsePassItem newItem = ScriptableObject.CreateInstance<UsePassItem>(); + newItem.hideFlags = HideFlags.HideAndDontSave; + m_items.Insert( m_actionIndex + 1, newItem ); + break; + case ReordableAction.Remove: + UsePassItem itemToDelete = m_items[ m_actionIndex ]; + m_items.RemoveAt( m_actionIndex ); + ScriptableObject.DestroyImmediate( itemToDelete ); + break; + } + m_isDirty = true; + m_actionType = ReordableAction.None; + EditorGUI.FocusTextInControl( null ); + } + bool foldoutValue = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedUsePass; + if( style ) + { + NodeUtils.DrawPropertyGroup( ref foldoutValue, m_moduleName, DrawReordableList, DrawButtons ); + } + else + { + NodeUtils.DrawNestedPropertyGroup( ref foldoutValue, m_moduleName, DrawReordableList, DrawButtons ); + } + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedUsePass = foldoutValue; + } + + private void DisplayShaderContext( UndoParentNode node, Rect r ) + { + if( m_dummyCommand == null ) + m_dummyCommand = new MenuCommand( this, 0 ); + + if( m_dummyMaterial == null ) + m_dummyMaterial = new Material( Shader.Find( "Hidden/ASESShaderSelectorUnlit" ) ); + +#pragma warning disable 0618 + UnityEditorInternal.InternalEditorUtility.SetupShaderMenu( m_dummyMaterial ); +#pragma warning restore 0618 + EditorUtility.DisplayPopupMenu( r, ShaderPoputContext, m_dummyCommand ); + } + + private void OnSelectedShaderPopup( string command, Shader shader ) + { + if( shader != null ) + { + UIUtils.MarkUndoAction(); + Undo.RecordObject( m_owner, "Selected Use Pass shader" ); + m_items[ m_currentUsePassIdx ].Value = shader.name; + } + } + + void DrawReordableList() + { + if( m_reordableList != null ) + { + if( m_propertyAdjustment == null ) + { + m_propertyAdjustment = new GUIStyle(); + m_propertyAdjustment.padding.left = 17; + } + EditorGUILayout.Space(); + + if( m_items.Count == 0 ) + { + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add one.", MessageType.Info ); + } + else + { + m_reordableList.DoLayoutList(); + } + EditorGUILayout.Space(); + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + try + { + int count = Convert.ToInt32( nodeParams[ index++ ] ); + for( int i = 0; i < count; i++ ) + { + string locationValue = nodeParams[ index++ ]; + // REMOVE THIS TEST AFTER A COUPLE OF VERSIONS (curr v1.5.6 r02) + if( locationValue.Equals( "Bellow" ) ) locationValue = "Below"; + + UsePassLocation location = (UsePassLocation)Enum.Parse( typeof( UsePassLocation ), locationValue ); + string name = nodeParams[ index++ ]; + UsePassItem newItem = ScriptableObject.CreateInstance<UsePassItem>(); + newItem.hideFlags = HideFlags.HideAndDontSave; + newItem.Location = location; + newItem.Value = name; + m_items.Add( newItem ); + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_items.Count ); + for( int i = 0; i < m_items.Count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_items[ i ].Location ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_items[ i ].Value ); + } + } + + public void BuildUsePassInfo( MasterNodeDataCollector dataCollector, ref string aboveItems, ref string bellowItems, string tabs) + { + int count = 0; + count = dataCollector.AboveUsePassesList.Count; + for( int i = 0; i < count; i++ ) + { + aboveItems += tabs + string.Format( UseGrabFormatNewLine, dataCollector.AboveUsePassesList[ i ].PropertyName ); + } + + count = dataCollector.BelowUsePassesList.Count; + for( int i = 0; i < count; i++ ) + { + bellowItems += tabs + string.Format( UseGrabFormatNewLine, dataCollector.BelowUsePassesList[ i ].PropertyName ); + } + + count = m_items.Count; + for( int i = 0; i < count; i++ ) + { + if( m_items[ i ].Location == UsePassLocation.Above ) + { + aboveItems += tabs + string.Format( UseGrabFormatNewLine, m_items[ i ].Value ); + } + else + { + bellowItems += tabs + string.Format( UseGrabFormatNewLine, m_items[ i ].Value ); + } + } + } + + public void BuildUsePassInfo( MasterNodeDataCollector dataCollector, ref List<PropertyDataCollector> aboveItems, ref List<PropertyDataCollector> bellowItems ) + { + int count = 0; + count = dataCollector.AboveUsePassesList.Count; + for( int i = 0; i < count; i++ ) + { + aboveItems.Add( new PropertyDataCollector( -1, string.Format( UseGrabFormat, dataCollector.AboveUsePassesList[ i ].PropertyName ) ) ); + } + + count = dataCollector.BelowUsePassesList.Count; + for( int i = 0; i < count; i++ ) + { + bellowItems.Add( new PropertyDataCollector( -1, string.Format( UseGrabFormat, dataCollector.BelowUsePassesList[ i ].PropertyName ) ) ); + } + + + count = m_items.Count; + for( int i = 0; i < count; i++ ) + { + if( m_items[ i ].Location == UsePassLocation.Above ) + { + aboveItems.Add( new PropertyDataCollector(-1,string.Format( UseGrabFormat, m_items[ i ].Value ))); + } + else + { + bellowItems.Add( new PropertyDataCollector( -1, string.Format( UseGrabFormat, m_items[ i ].Value ) ) ); + } + } + } + + //public string ModuleName { set { m_moduleName = value; } } + public void Destroy() + { + m_owner = null; + m_items.Clear(); + m_items = null; + m_reordableList = null; + m_dummyMaterial = null; + m_dummyCommand = null; + } + } +} |