SamplerStateAutoGenerator.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Amplify Shader Editor - Visual Shader Editing Tool
  2. // Copyright (c) Amplify Creations, Lda <info@amplify.pt>
  3. using System;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. using UnityEditor;
  7. namespace AmplifyShaderEditor
  8. {
  9. public enum InlineSamplerFilteringMode
  10. {
  11. Point,
  12. Linear,
  13. Trilinear
  14. };
  15. public enum InlineSamplerWrapMode
  16. {
  17. Clamp,
  18. Repeat,
  19. Mirror,
  20. MirrorOnce
  21. };
  22. public enum InlineSamplerWrapCoordinates
  23. {
  24. All,
  25. U,
  26. V,
  27. W
  28. };
  29. [Serializable]
  30. public class InlineSamplerWrapOptions
  31. {
  32. public InlineSamplerWrapMode WrapMode = InlineSamplerWrapMode.Clamp;
  33. public InlineSamplerWrapCoordinates Coordinates = InlineSamplerWrapCoordinates.All;
  34. public string InlineValue
  35. {
  36. get
  37. {
  38. string name = "_"+WrapMode.ToString();
  39. if( Coordinates != InlineSamplerWrapCoordinates.All )
  40. name += Coordinates.ToString();
  41. name += "_";
  42. return name;
  43. }
  44. }
  45. }
  46. [Serializable]
  47. public class SamplerStateAutoGenerator
  48. {
  49. private const int MaxCount = 3;
  50. private const float ButtonLayoutWidth = 15;
  51. private const string AdditionalWrapsStr = "Additional Wraps";
  52. private const string InlineSamplerStateStr = "Inline Sampler State";
  53. [SerializeField]
  54. private InlineSamplerFilteringMode m_filterMode = InlineSamplerFilteringMode.Point;
  55. [SerializeField]
  56. private InlineSamplerWrapOptions m_mainWrapMode = new InlineSamplerWrapOptions();
  57. [SerializeField]
  58. private List<InlineSamplerWrapOptions> m_additionalWrapOptions = new List<InlineSamplerWrapOptions>();
  59. [SerializeField]
  60. private bool m_visibleWrapsFoldout = false;
  61. [SerializeField]
  62. private bool m_visibleMainFoldout = false;
  63. [NonSerialized]
  64. private UndoParentNode m_owner;
  65. public void Destroy()
  66. {
  67. m_mainWrapMode = null;
  68. m_additionalWrapOptions.Clear();
  69. m_additionalWrapOptions = null;
  70. }
  71. public string AddToDataCollector( ref MasterNodeDataCollector dataCollector )
  72. {
  73. string inlineSampler = "sampler_";
  74. inlineSampler += m_filterMode.ToString();
  75. inlineSampler += m_mainWrapMode.InlineValue;
  76. int count = m_additionalWrapOptions.Count;
  77. for( int i = 0; i < count; i++ )
  78. {
  79. inlineSampler += m_additionalWrapOptions[ i ].InlineValue;
  80. }
  81. return inlineSampler;
  82. }
  83. void DrawAddRemoveButtons()
  84. {
  85. int count = m_additionalWrapOptions.Count;
  86. if( count < MaxCount && m_owner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ButtonLayoutWidth ) ) )
  87. {
  88. m_additionalWrapOptions.Add( new InlineSamplerWrapOptions() );
  89. EditorGUI.FocusTextInControl( null );
  90. }
  91. if( count > 0 && m_owner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ButtonLayoutWidth ) ) )
  92. {
  93. m_additionalWrapOptions.RemoveAt( count - 1 );
  94. EditorGUI.FocusTextInControl( null );
  95. }
  96. }
  97. public void Draw( UndoParentNode owner )
  98. {
  99. m_owner = owner;
  100. NodeUtils.DrawNestedPropertyGroup( ref m_visibleMainFoldout, InlineSamplerStateStr, DrawMain );
  101. }
  102. void DrawMain()
  103. {
  104. m_filterMode = (InlineSamplerFilteringMode)m_owner.EditorGUILayoutEnumPopup( m_filterMode );
  105. EditorGUILayout.BeginHorizontal();
  106. m_mainWrapMode.WrapMode = (InlineSamplerWrapMode)m_owner.EditorGUILayoutEnumPopup( m_mainWrapMode.WrapMode );
  107. m_mainWrapMode.Coordinates = (InlineSamplerWrapCoordinates)m_owner.EditorGUILayoutEnumPopup( m_mainWrapMode.Coordinates );
  108. EditorGUILayout.EndHorizontal();
  109. NodeUtils.DrawNestedPropertyGroup( ref m_visibleWrapsFoldout, AdditionalWrapsStr, DrawAdditionalWrapModes, DrawAddRemoveButtons );
  110. }
  111. void DrawAdditionalWrapModes()
  112. {
  113. EditorGUILayout.Space();
  114. int count = m_additionalWrapOptions.Count;
  115. for( int i = 0; i < count; i++ )
  116. {
  117. float maxWidth = 90;
  118. EditorGUILayout.BeginHorizontal();
  119. m_additionalWrapOptions[ i ].WrapMode = (InlineSamplerWrapMode)m_owner.EditorGUILayoutEnumPopup( m_additionalWrapOptions[ i ].WrapMode ,GUILayout.MaxWidth( maxWidth ) );
  120. m_additionalWrapOptions[ i ].Coordinates = (InlineSamplerWrapCoordinates)m_owner.EditorGUILayoutEnumPopup( m_additionalWrapOptions[ i ].Coordinates, GUILayout.MaxWidth( maxWidth ) );
  121. EditorGUILayout.EndHorizontal();
  122. }
  123. }
  124. public void ReadFromString( ref uint index, ref string[] nodeParams )
  125. {
  126. Enum.TryParse<InlineSamplerFilteringMode>( nodeParams[ index++ ], out m_filterMode );
  127. Enum.TryParse<InlineSamplerWrapCoordinates>( nodeParams[ index++ ], out m_mainWrapMode.Coordinates );
  128. int count = 0;
  129. int.TryParse( nodeParams[ index++ ], out count );
  130. for( int i = 0; i < count; i++ )
  131. {
  132. InlineSamplerWrapOptions option = new InlineSamplerWrapOptions();
  133. Enum.TryParse<InlineSamplerWrapMode>( nodeParams[ index++ ], out option.WrapMode );
  134. Enum.TryParse<InlineSamplerWrapCoordinates>( nodeParams[ index++ ], out option.Coordinates );
  135. m_additionalWrapOptions.Add( option );
  136. }
  137. }
  138. public void WriteToString( ref string nodeInfo )
  139. {
  140. IOUtils.AddFieldValueToString( ref nodeInfo, m_filterMode );
  141. IOUtils.AddFieldValueToString( ref nodeInfo, m_mainWrapMode.WrapMode );
  142. IOUtils.AddFieldValueToString( ref nodeInfo, m_mainWrapMode.Coordinates );
  143. int count = m_additionalWrapOptions.Count;
  144. IOUtils.AddFieldValueToString( ref nodeInfo, count );
  145. if( count > 0 )
  146. {
  147. for( int i = 0; i < count; i++ )
  148. {
  149. IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalWrapOptions[i].WrapMode );
  150. IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalWrapOptions[i].Coordinates );
  151. }
  152. }
  153. }
  154. }
  155. }