120 lines
2.8 KiB
C#
120 lines
2.8 KiB
C#
using System;
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
namespace AmplifyShaderEditor
|
|
{
|
|
[Serializable]
|
|
public class FallbackPickerHelper : ScriptableObject
|
|
{
|
|
private const string FallbackFormat = "Fallback \"{0}\"";
|
|
private const string FallbackShaderStr = "Fallback";
|
|
private const string ShaderPoputContext = "CONTEXT/ShaderPopup";
|
|
|
|
private Material m_dummyMaterial;
|
|
private MenuCommand m_dummyCommand;
|
|
|
|
[SerializeField]
|
|
private string m_fallbackShader = string.Empty;
|
|
|
|
public void Init()
|
|
{
|
|
hideFlags = HideFlags.HideAndDontSave;
|
|
m_dummyMaterial = null;
|
|
m_dummyCommand = null;
|
|
}
|
|
|
|
public void Draw( ParentNode owner )
|
|
{
|
|
EditorGUILayout.BeginHorizontal();
|
|
m_fallbackShader = owner.EditorGUILayoutTextField( FallbackShaderStr, m_fallbackShader );
|
|
if ( GUILayout.Button( string.Empty, UIUtils.InspectorPopdropdownFallback, GUILayout.Width( 17 ), GUILayout.Height( 19 ) ) )
|
|
{
|
|
EditorGUI.FocusTextInControl( null );
|
|
GUI.FocusControl( null );
|
|
DisplayShaderContext( owner, GUILayoutUtility.GetRect( GUIContent.none, EditorStyles.popup ) );
|
|
}
|
|
EditorGUILayout.EndHorizontal();
|
|
}
|
|
|
|
private void DisplayShaderContext( ParentNode node, Rect r )
|
|
{
|
|
if ( m_dummyCommand == null )
|
|
m_dummyCommand = new MenuCommand( this, 0 );
|
|
|
|
if ( m_dummyMaterial == null )
|
|
m_dummyMaterial = new Material( Shader.Find( "Hidden/ASESShaderSelectorUnlit" ) );
|
|
|
|
#pragma warning disable 0618
|
|
UnityEditorInternal.InternalEditorUtility.SetupShaderMenu( m_dummyMaterial );
|
|
#pragma warning restore 0618
|
|
EditorUtility.DisplayPopupMenu( r, ShaderPoputContext, m_dummyCommand );
|
|
}
|
|
|
|
private void OnSelectedShaderPopup( string command, Shader shader )
|
|
{
|
|
if ( shader != null )
|
|
{
|
|
UIUtils.MarkUndoAction();
|
|
Undo.RecordObject( this, "Selected fallback shader" );
|
|
m_fallbackShader = shader.name;
|
|
}
|
|
}
|
|
|
|
public void ReadFromString( ref uint index, ref string[] nodeParams )
|
|
{
|
|
m_fallbackShader = nodeParams[ index++ ];
|
|
}
|
|
|
|
public void WriteToString( ref string nodeInfo )
|
|
{
|
|
IOUtils.AddFieldValueToString( ref nodeInfo, m_fallbackShader );
|
|
}
|
|
|
|
public void Destroy()
|
|
{
|
|
GameObject.DestroyImmediate( m_dummyMaterial );
|
|
m_dummyMaterial = null;
|
|
m_dummyCommand = null;
|
|
}
|
|
|
|
public string TabbedFallbackShader
|
|
{
|
|
get
|
|
{
|
|
if( string.IsNullOrEmpty( m_fallbackShader ) )
|
|
return string.Empty;
|
|
|
|
return "\t" + string.Format( FallbackFormat, m_fallbackShader ) + "\n";
|
|
}
|
|
}
|
|
|
|
public string FallbackShader
|
|
{
|
|
get
|
|
{
|
|
if( string.IsNullOrEmpty( m_fallbackShader ) )
|
|
return string.Empty;
|
|
|
|
return string.Format( FallbackFormat, m_fallbackShader );
|
|
}
|
|
}
|
|
|
|
public string RawFallbackShader
|
|
{
|
|
get
|
|
{
|
|
return m_fallbackShader;
|
|
}
|
|
set
|
|
{
|
|
m_fallbackShader = value;
|
|
}
|
|
}
|
|
|
|
|
|
public bool Active { get { return !string.IsNullOrEmpty( m_fallbackShader ); } }
|
|
|
|
}
|
|
}
|