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.

119 lines
2.8 KiB

  1. using System;
  2. using UnityEngine;
  3. using UnityEditor;
  4. namespace AmplifyShaderEditor
  5. {
  6. [Serializable]
  7. public class FallbackPickerHelper : ScriptableObject
  8. {
  9. private const string FallbackFormat = "Fallback \"{0}\"";
  10. private const string FallbackShaderStr = "Fallback";
  11. private const string ShaderPoputContext = "CONTEXT/ShaderPopup";
  12. private Material m_dummyMaterial;
  13. private MenuCommand m_dummyCommand;
  14. [SerializeField]
  15. private string m_fallbackShader = string.Empty;
  16. public void Init()
  17. {
  18. hideFlags = HideFlags.HideAndDontSave;
  19. m_dummyMaterial = null;
  20. m_dummyCommand = null;
  21. }
  22. public void Draw( ParentNode owner )
  23. {
  24. EditorGUILayout.BeginHorizontal();
  25. m_fallbackShader = owner.EditorGUILayoutTextField( FallbackShaderStr, m_fallbackShader );
  26. if ( GUILayout.Button( string.Empty, UIUtils.InspectorPopdropdownFallback, GUILayout.Width( 17 ), GUILayout.Height( 19 ) ) )
  27. {
  28. EditorGUI.FocusTextInControl( null );
  29. GUI.FocusControl( null );
  30. DisplayShaderContext( owner, GUILayoutUtility.GetRect( GUIContent.none, EditorStyles.popup ) );
  31. }
  32. EditorGUILayout.EndHorizontal();
  33. }
  34. private void DisplayShaderContext( ParentNode node, Rect r )
  35. {
  36. if ( m_dummyCommand == null )
  37. m_dummyCommand = new MenuCommand( this, 0 );
  38. if ( m_dummyMaterial == null )
  39. m_dummyMaterial = new Material( Shader.Find( "Hidden/ASESShaderSelectorUnlit" ) );
  40. #pragma warning disable 0618
  41. UnityEditorInternal.InternalEditorUtility.SetupShaderMenu( m_dummyMaterial );
  42. #pragma warning restore 0618
  43. EditorUtility.DisplayPopupMenu( r, ShaderPoputContext, m_dummyCommand );
  44. }
  45. private void OnSelectedShaderPopup( string command, Shader shader )
  46. {
  47. if ( shader != null )
  48. {
  49. UIUtils.MarkUndoAction();
  50. Undo.RecordObject( this, "Selected fallback shader" );
  51. m_fallbackShader = shader.name;
  52. }
  53. }
  54. public void ReadFromString( ref uint index, ref string[] nodeParams )
  55. {
  56. m_fallbackShader = nodeParams[ index++ ];
  57. }
  58. public void WriteToString( ref string nodeInfo )
  59. {
  60. IOUtils.AddFieldValueToString( ref nodeInfo, m_fallbackShader );
  61. }
  62. public void Destroy()
  63. {
  64. GameObject.DestroyImmediate( m_dummyMaterial );
  65. m_dummyMaterial = null;
  66. m_dummyCommand = null;
  67. }
  68. public string TabbedFallbackShader
  69. {
  70. get
  71. {
  72. if( string.IsNullOrEmpty( m_fallbackShader ) )
  73. return string.Empty;
  74. return "\t" + string.Format( FallbackFormat, m_fallbackShader ) + "\n";
  75. }
  76. }
  77. public string FallbackShader
  78. {
  79. get
  80. {
  81. if( string.IsNullOrEmpty( m_fallbackShader ) )
  82. return string.Empty;
  83. return string.Format( FallbackFormat, m_fallbackShader );
  84. }
  85. }
  86. public string RawFallbackShader
  87. {
  88. get
  89. {
  90. return m_fallbackShader;
  91. }
  92. set
  93. {
  94. m_fallbackShader = value;
  95. }
  96. }
  97. public bool Active { get { return !string.IsNullOrEmpty( m_fallbackShader ); } }
  98. }
  99. }