FallbackPickerHelper.cs 2.9 KB

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