diff options
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/SamplerStateAutoGenerator.cs')
-rw-r--r-- | Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/SamplerStateAutoGenerator.cs | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/SamplerStateAutoGenerator.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/SamplerStateAutoGenerator.cs new file mode 100644 index 00000000..8be253c4 --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Utils/SamplerStateAutoGenerator.cs @@ -0,0 +1,203 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum InlineSamplerFilteringMode + { + Point, + Linear, + Trilinear + }; + + public enum InlineSamplerWrapMode + { + Clamp, + Repeat, + Mirror, + MirrorOnce + }; + + public enum InlineSamplerWrapCoordinates + { + All, + U, + V, + W + }; + + [Serializable] + public class InlineSamplerWrapOptions + { + public InlineSamplerWrapMode WrapMode = InlineSamplerWrapMode.Clamp; + public InlineSamplerWrapCoordinates Coordinates = InlineSamplerWrapCoordinates.All; + public string InlineValue + { + get + { + string name = "_"+WrapMode.ToString(); + if( Coordinates != InlineSamplerWrapCoordinates.All ) + name += Coordinates.ToString(); + name += "_"; + return name; + } + } + } + + [Serializable] + public class SamplerStateAutoGenerator + { + private const int MaxCount = 3; + private const float ButtonLayoutWidth = 15; + private const string AdditionalWrapsStr = "Additional Wraps"; + private const string InlineSamplerStateStr = "Inline Sampler State"; + + [SerializeField] + private InlineSamplerFilteringMode m_filterMode = InlineSamplerFilteringMode.Point; + + [SerializeField] + private InlineSamplerWrapOptions m_mainWrapMode = new InlineSamplerWrapOptions(); + + [SerializeField] + private List<InlineSamplerWrapOptions> m_additionalWrapOptions = new List<InlineSamplerWrapOptions>(); + + [SerializeField] + private bool m_visibleWrapsFoldout = false; + + [SerializeField] + private bool m_visibleMainFoldout = false; + + [NonSerialized] + private UndoParentNode m_owner; + + public void Destroy() + { + m_mainWrapMode = null; + m_additionalWrapOptions.Clear(); + m_additionalWrapOptions = null; + } + + public string AddToDataCollector( ref MasterNodeDataCollector dataCollector ) + { + string inlineSampler = "sampler_"; + + inlineSampler += m_filterMode.ToString(); + inlineSampler += m_mainWrapMode.InlineValue; + + int count = m_additionalWrapOptions.Count; + for( int i = 0; i < count; i++ ) + { + inlineSampler += m_additionalWrapOptions[ i ].InlineValue; + } + return inlineSampler; + } + + void DrawAddRemoveButtons() + { + int count = m_additionalWrapOptions.Count; + if( count < MaxCount && m_owner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + m_additionalWrapOptions.Add( new InlineSamplerWrapOptions() ); + EditorGUI.FocusTextInControl( null ); + } + + if( count > 0 && m_owner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + m_additionalWrapOptions.RemoveAt( count - 1 ); + EditorGUI.FocusTextInControl( null ); + } + } + + public void Draw( UndoParentNode owner ) + { + m_owner = owner; + NodeUtils.DrawNestedPropertyGroup( ref m_visibleMainFoldout, InlineSamplerStateStr, DrawMain ); + } + + void DrawMain() + { + m_filterMode = (InlineSamplerFilteringMode)m_owner.EditorGUILayoutEnumPopup( m_filterMode ); + + EditorGUILayout.BeginHorizontal(); + m_mainWrapMode.WrapMode = (InlineSamplerWrapMode)m_owner.EditorGUILayoutEnumPopup( m_mainWrapMode.WrapMode ); + m_mainWrapMode.Coordinates = (InlineSamplerWrapCoordinates)m_owner.EditorGUILayoutEnumPopup( m_mainWrapMode.Coordinates ); + EditorGUILayout.EndHorizontal(); + NodeUtils.DrawNestedPropertyGroup( ref m_visibleWrapsFoldout, AdditionalWrapsStr, DrawAdditionalWrapModes, DrawAddRemoveButtons ); + } + + void DrawAdditionalWrapModes() + { + EditorGUILayout.Space(); + int count = m_additionalWrapOptions.Count; + for( int i = 0; i < count; i++ ) + { + float maxWidth = 90; + EditorGUILayout.BeginHorizontal(); + m_additionalWrapOptions[ i ].WrapMode = (InlineSamplerWrapMode)m_owner.EditorGUILayoutEnumPopup( m_additionalWrapOptions[ i ].WrapMode ,GUILayout.MaxWidth( maxWidth ) ); + m_additionalWrapOptions[ i ].Coordinates = (InlineSamplerWrapCoordinates)m_owner.EditorGUILayoutEnumPopup( m_additionalWrapOptions[ i ].Coordinates, GUILayout.MaxWidth( maxWidth ) ); + EditorGUILayout.EndHorizontal(); + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { +#if UNITY_2019_3_OR_NEWER + Enum.TryParse<InlineSamplerFilteringMode>( nodeParams[ index++ ], out m_filterMode ); + Enum.TryParse<InlineSamplerWrapCoordinates>( nodeParams[ index++ ], out m_mainWrapMode.Coordinates ); + + int count = 0; + int.TryParse( nodeParams[ index++ ], out count ); + for( int i = 0; i < count; i++ ) + { + InlineSamplerWrapOptions option = new InlineSamplerWrapOptions(); + + Enum.TryParse<InlineSamplerWrapMode>( nodeParams[ index++ ], out option.WrapMode ); + Enum.TryParse<InlineSamplerWrapCoordinates>( nodeParams[ index++ ], out option.Coordinates ); + + m_additionalWrapOptions.Add( option ); + } +#else + m_filterMode =(InlineSamplerFilteringMode) Enum.Parse( typeof( InlineSamplerFilteringMode ), nodeParams[ index++ ] ); + m_mainWrapMode.Coordinates = (InlineSamplerWrapCoordinates)Enum.Parse( typeof( InlineSamplerWrapCoordinates ),nodeParams[ index++ ] ); + + int count = 0; + int.TryParse( nodeParams[ index++ ], out count ); + for( int i = 0; i < count; i++ ) + { + InlineSamplerWrapOptions option = new InlineSamplerWrapOptions(); + + option.WrapMode = ( InlineSamplerWrapMode)Enum.Parse(typeof( InlineSamplerWrapMode ), nodeParams[ index++ ] ); + option.Coordinates = ( InlineSamplerWrapCoordinates)Enum.Parse(typeof( InlineSamplerWrapCoordinates ), nodeParams[ index++ ] ); + + m_additionalWrapOptions.Add( option ); + } +#endif + + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_filterMode ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_mainWrapMode.WrapMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_mainWrapMode.Coordinates ); + + int count = m_additionalWrapOptions.Count; + IOUtils.AddFieldValueToString( ref nodeInfo, count ); + if( count > 0 ) + { + for( int i = 0; i < count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalWrapOptions[i].WrapMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalWrapOptions[i].Coordinates ); + } + } + + } + } +} |