You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
4.6 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. namespace AmplifyShaderEditor
  6. {
  7. [Serializable]
  8. public class AdditionalIncludesHelper
  9. {
  10. private const string AdditionalIncludesStr = " Additional Includes";
  11. private const float ShaderKeywordButtonLayoutWidth = 15;
  12. private ParentNode m_currentOwner;
  13. [SerializeField]
  14. private List<string> m_additionalIncludes = new List<string>();
  15. public List<string> IncludeList { get { return m_additionalIncludes; } set { m_additionalIncludes = value; } }
  16. [SerializeField]
  17. private List<string> m_outsideIncludes = new List<string>();
  18. public List<string> OutsideList { get { return m_outsideIncludes; } set { m_outsideIncludes = value; } }
  19. public void Draw( ParentNode owner )
  20. {
  21. m_currentOwner = owner;
  22. bool value = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalIncludes;
  23. NodeUtils.DrawPropertyGroup( ref value, AdditionalIncludesStr, DrawMainBody, DrawButtons );
  24. owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalIncludes = value;
  25. }
  26. void DrawButtons()
  27. {
  28. EditorGUILayout.Separator();
  29. // Add keyword
  30. if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) )
  31. {
  32. m_additionalIncludes.Add( string.Empty );
  33. EditorGUI.FocusTextInControl( null );
  34. }
  35. //Remove keyword
  36. if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) )
  37. {
  38. if( m_additionalIncludes.Count > 0 )
  39. {
  40. m_additionalIncludes.RemoveAt( m_additionalIncludes.Count - 1 );
  41. EditorGUI.FocusTextInControl( null );
  42. }
  43. }
  44. }
  45. void DrawMainBody()
  46. {
  47. EditorGUILayout.Separator();
  48. //if( OutsideList != null && OutsideList.Count > 0 )
  49. //{
  50. // m_drawElements.Clear();
  51. // EditorGUI.BeginDisabledGroup( true );
  52. // int outsideCount = OutsideList.Count;
  53. // for( int i = 0; i < outsideCount; i++ )
  54. // {
  55. // if( !m_drawElements.Contains( OutsideList[ i ] ) )
  56. // {
  57. // m_drawElements.Add( OutsideList[ i ] );
  58. // EditorGUILayout.TextField( OutsideList[ i ] );
  59. // }
  60. // }
  61. // EditorGUI.EndDisabledGroup();
  62. // EditorGUILayout.Separator();
  63. //}
  64. int itemCount = m_additionalIncludes.Count;
  65. int markedToDelete = -1;
  66. for( int i = 0; i < itemCount; i++ )
  67. {
  68. EditorGUILayout.BeginHorizontal();
  69. {
  70. EditorGUI.BeginChangeCheck();
  71. m_additionalIncludes[ i ] = EditorGUILayout.TextField( m_additionalIncludes[ i ] );
  72. if( EditorGUI.EndChangeCheck() )
  73. {
  74. m_additionalIncludes[ i ] = UIUtils.RemoveShaderInvalidCharacters( m_additionalIncludes[ i ] );
  75. }
  76. // Add new port
  77. if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) )
  78. {
  79. m_additionalIncludes.Insert( i + 1, string.Empty );
  80. EditorGUI.FocusTextInControl( null );
  81. }
  82. //Remove port
  83. if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) )
  84. {
  85. markedToDelete = i;
  86. }
  87. }
  88. EditorGUILayout.EndHorizontal();
  89. }
  90. if( markedToDelete > -1 )
  91. {
  92. if( m_additionalIncludes.Count > markedToDelete )
  93. {
  94. m_additionalIncludes.RemoveAt( markedToDelete );
  95. EditorGUI.FocusTextInControl( null );
  96. }
  97. }
  98. EditorGUILayout.Separator();
  99. EditorGUILayout.HelpBox( "Please add your includes without the #include \"\" keywords", MessageType.Info );
  100. }
  101. public void ReadFromString( ref uint index, ref string[] nodeParams )
  102. {
  103. int count = Convert.ToInt32( nodeParams[ index++ ] );
  104. for( int i = 0; i < count; i++ )
  105. {
  106. m_additionalIncludes.Add( nodeParams[ index++ ] );
  107. }
  108. }
  109. public void WriteToString( ref string nodeInfo )
  110. {
  111. IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalIncludes.Count );
  112. for( int i = 0; i < m_additionalIncludes.Count; i++ )
  113. {
  114. IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalIncludes[ i ] );
  115. }
  116. }
  117. public void AddToDataCollector( ref MasterNodeDataCollector dataCollector )
  118. {
  119. for( int i = 0; i < m_additionalIncludes.Count; i++ )
  120. {
  121. if( !string.IsNullOrEmpty( m_additionalIncludes[ i ] ) )
  122. dataCollector.AddToIncludes( -1, m_additionalIncludes[ i ] );
  123. }
  124. for( int i = 0; i < m_outsideIncludes.Count; i++ )
  125. {
  126. if( !string.IsNullOrEmpty( m_outsideIncludes[ i ] ) )
  127. dataCollector.AddToIncludes( -1, m_outsideIncludes[ i ] );
  128. }
  129. }
  130. public void Destroy()
  131. {
  132. m_additionalIncludes.Clear();
  133. m_additionalIncludes = null;
  134. m_currentOwner = null;
  135. }
  136. }
  137. }