123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- using UnityEngine;
- using UnityEditor;
- using UnityEditorInternal;
- using System;
- using System.Collections.Generic;
- using System.Text.RegularExpressions;
- namespace AmplifyShaderEditor
- {
- public enum ASESaveBundleAssetAction
- {
- Update,
- Export,
- UpdateAndExport
- }
- [CustomEditor( typeof( ASESaveBundleAsset ) )]
- public class ASESaveBundleAssetEditor : Editor
- {
- public ASESaveBundleAsset Instance;
- private DragAndDropTool m_dragAndDropTool;
- private SerializedObject m_so;
- private SerializedProperty m_packageContentsOrigin;
- private GUIContent m_packageContentsOriginLabel = new GUIContent("Main Content");
- private SerializedProperty m_allExtras;
- private SerializedProperty m_packageTargetPath;
- private GUIContent m_packageTargetPathLabel = new GUIContent( "Target Path" );
- private SerializedProperty m_packageTargetName;
- private GUIContent m_packageTargetNameLabel = new GUIContent( "Target Name" );
- private SerializedProperty m_allShaders;
- [SerializeField]
- private ReorderableList m_listShaders = null;
- [SerializeField]
- private ReorderableList m_listExtras = null;
- public void OnEnable()
- {
- Instance = (ASESaveBundleAsset)target;
- m_so = serializedObject;
- m_packageContentsOrigin = m_so.FindProperty( "m_packageContentsOrigin" );
- m_packageTargetPath = m_so.FindProperty( "m_packageTargetPath" );
- m_packageTargetName = m_so.FindProperty( "m_packageTargetName" );
- m_allShaders = m_so.FindProperty( "m_allShaders" );
- if( m_listShaders == null )
- {
- m_listShaders = new ReorderableList( m_so , m_allShaders , true , true , true , true );
- m_listShaders.elementHeight = 16;
- m_listShaders.drawElementCallback = ( Rect rect , int index , bool isActive , bool isFocused ) =>
- {
- m_allShaders.GetArrayElementAtIndex( index ).objectReferenceValue = (Shader)EditorGUI.ObjectField( rect , "Shader " + index , m_allShaders.GetArrayElementAtIndex( index ).objectReferenceValue , typeof( Shader ) , false );
- };
- m_listShaders.drawHeaderCallback = ( Rect rect ) =>
- {
- EditorGUI.LabelField( rect , "Shader List" );
- };
- m_listShaders.onAddCallback = ( list ) =>
- {
- m_allShaders.InsertArrayElementAtIndex( m_allShaders.arraySize );
- m_allShaders.GetArrayElementAtIndex( m_allShaders.arraySize - 1 ).objectReferenceValue = null;
- };
- m_listShaders.onRemoveCallback = ( list ) =>
- {
- m_allShaders.GetArrayElementAtIndex( list.index ).objectReferenceValue = null;
- m_allShaders.DeleteArrayElementAtIndex( list.index );
- };
- }
- m_allExtras = m_so.FindProperty( "m_allExtras" );
- if( m_listExtras == null )
- {
- m_listExtras = new ReorderableList( m_so , m_allExtras , true , true , true , true );
- m_listExtras.elementHeight = 18;
- m_listExtras.drawElementCallback = ( Rect rect , int index , bool isActive , bool isFocused ) =>
- {
- rect.width -= 55;
- m_allExtras.GetArrayElementAtIndex( index ).stringValue = (string)EditorGUI.TextField( rect , "Path " + index , m_allExtras.GetArrayElementAtIndex( index ).stringValue );
- rect.x += rect.width;
- rect.width = 55;
- if( GUI.Button( rect, "Browse" ) )
- m_allExtras.GetArrayElementAtIndex( index ).stringValue = ASESaveBundleTool.FetchPath( "Folder Path" , m_allExtras.GetArrayElementAtIndex( index ).stringValue );
- };
- m_listExtras.drawHeaderCallback = ( Rect rect ) =>
- {
- EditorGUI.LabelField( rect , "Extra Paths" );
- };
- m_listExtras.onAddCallback = ( list ) =>
- {
- m_allExtras.InsertArrayElementAtIndex( m_allExtras.arraySize );
- m_allExtras.GetArrayElementAtIndex( m_allExtras.arraySize - 1 ).stringValue = string.Empty;
- };
- m_listExtras.onRemoveCallback = ( list ) =>
- {
- m_allExtras.GetArrayElementAtIndex( list.index ).stringValue = string.Empty;
- m_allExtras.DeleteArrayElementAtIndex( list.index );
- };
- }
- m_dragAndDropTool = new DragAndDropTool();
- m_dragAndDropTool.OnValidDropObjectEvt += OnValidObjectsDropped;
- }
- void FetchValidShadersFromPath( string path , bool updateProperty )
- {
- if( !path.StartsWith( "Assets" ) )
- {
- int idx = path.IndexOf( "Assets" );
- if( idx >= 0 )
- {
- path = path.Substring( idx );
- }
- }
- if( AssetDatabase.IsValidFolder( path ) )
- {
- if( updateProperty )
- m_packageContentsOrigin.stringValue = path;
- string[] pathArr = { path };
- string[] shaderInDir = AssetDatabase.FindAssets( "t:Shader" , pathArr );
- for( int shaderIdx = 0 ; shaderIdx < shaderInDir.Length ; shaderIdx++ )
- {
- Shader internalShader = AssetDatabase.LoadAssetAtPath<Shader>( AssetDatabase.GUIDToAssetPath( shaderInDir[ shaderIdx ] ) );
- if( internalShader != null && IOUtils.IsASEShader( internalShader ) )
- {
- m_allShaders.InsertArrayElementAtIndex( m_allShaders.arraySize );
- m_allShaders.GetArrayElementAtIndex( m_allShaders.arraySize - 1 ).objectReferenceValue = internalShader;
- m_so.ApplyModifiedProperties();
- }
- }
- }
- }
- public void OnValidObjectsDropped( UnityEngine.Object[] droppedObjs )
- {
- for( int objIdx = 0 ; objIdx < droppedObjs.Length ; objIdx++ )
- {
- Shader shader = droppedObjs[ objIdx ] as Shader;
- if( shader != null )
- {
- if( IOUtils.IsASEShader( shader ) )
- {
- m_allShaders.InsertArrayElementAtIndex( m_allShaders.arraySize );
- m_allShaders.GetArrayElementAtIndex( m_allShaders.arraySize - 1 ).objectReferenceValue = shader;
- m_so.ApplyModifiedProperties();
- }
- }
- else
- {
- DefaultAsset asset = droppedObjs[ objIdx ] as DefaultAsset;
- if( asset != null )
- {
- string path = AssetDatabase.GetAssetPath( asset );
- FetchValidShadersFromPath( path,true );
- }
- }
- }
- Instance.AllShaders.Sort( ( x , y ) => string.Compare( x.name , y.name ) );
- m_so.Update();
- }
- private void OnDestroy()
- {
- m_dragAndDropTool.Destroy();
- m_dragAndDropTool = null;
- }
- public override void OnInspectorGUI()
- {
- m_so.Update();
- EditorGUILayout.Separator();
- EditorGUILayout.BeginHorizontal();
- {
- EditorGUILayout.PropertyField( m_packageContentsOrigin, m_packageContentsOriginLabel );
- if( GUILayout.Button( "Browse", GUILayout.MaxWidth( 55 ) ) )
- {
- m_packageContentsOrigin.stringValue = ASESaveBundleTool.FetchPath( "Folder Path" , m_packageContentsOrigin.stringValue );
- }
- if( GUILayout.Button( "Fetch" , GUILayout.MaxWidth( 45 ) ) )
- {
- FetchValidShadersFromPath( m_packageContentsOrigin.stringValue, false );
- }
- }
- EditorGUILayout.EndHorizontal();
- if( m_listExtras != null )
- m_listExtras.DoLayoutList();
- EditorGUILayout.Separator();
- EditorGUILayout.BeginHorizontal();
- {
- EditorGUILayout.PropertyField( m_packageTargetPath , m_packageTargetPathLabel );
- if( GUILayout.Button( "Browse",GUILayout.MaxWidth(55) ))
- m_packageTargetPath.stringValue = EditorUtility.OpenFolderPanel( "Folder Path" , m_packageTargetPath.stringValue , "" );
- }
- EditorGUILayout.EndHorizontal();
- EditorGUILayout.PropertyField( m_packageTargetName, m_packageTargetNameLabel );
- EditorGUILayout.Separator();
- if( GUILayout.Button( "Clear" ) )
- {
- m_allShaders.ClearArray();
- }
- if( m_listShaders != null )
- m_listShaders.DoLayoutList();
- EditorGUILayout.Separator();
- m_dragAndDropTool.TestDragAndDrop( new Rect( 0 , 0 , Screen.width , Screen.height ) );
- m_so.ApplyModifiedProperties();
- }
- }
- public class ASESaveBundleTool : EditorWindow
- {
- private const string UpdateAllStr = "Update All";
- private const string UpdateAllStyle = "prebutton";
- [SerializeField]
- private ASESaveBundleAsset m_asset;
- [SerializeField]
- private ASESaveBundleAsset m_dummyAsset;
- private GUIStyle m_contentStyle = null;
- private Vector2 m_scrollPos;
- private GUIContent m_ViewToolIcon;
- ASESaveBundleAssetEditor m_editor;
- private const string Title = "Batch Save and Pack";
- [NonSerialized]
- private GUIStyle m_titleStyle;
- [MenuItem( "Window/Amplify Shader Editor/"+ Title , false , 1001 )]
- static void ShowWindow()
- {
- ASESaveBundleTool window = EditorWindow.GetWindow<ASESaveBundleTool>();
- window.titleContent.text = "Batch Save...";
- window.titleContent.tooltip = Title;
- window.minSize = new Vector2( 302 , 350 );
- window.Show();
- }
- private void OnEnable()
- {
- if( m_contentStyle == null )
- {
- m_contentStyle = new GUIStyle( GUIStyle.none );
- m_contentStyle.margin = new RectOffset( 6 , 4 , 5 , 5 );
- }
- if( m_ViewToolIcon == null )
- {
- m_ViewToolIcon = EditorGUIUtility.IconContent( "icons/d_ViewToolZoom.png" );
- }
- }
- private void OnDestroy()
- {
- DestroyImmediate( m_editor );
- if( m_dummyAsset != null && m_dummyAsset != m_asset )
- DestroyImmediate( m_dummyAsset );
- }
-
- public static string FetchPath( string title, string folderpath )
- {
- folderpath = EditorUtility.OpenFolderPanel( title , folderpath , "" );
- folderpath = FileUtil.GetProjectRelativePath( folderpath );
- if( string.IsNullOrEmpty( folderpath ) )
- folderpath = "Assets";
- return folderpath;
- }
- private bool m_updatingShaders = false;
- private void ExportCurrent( ASESaveBundleAsset currentAsset )
- {
- List<string> pathsList = new List<string>();
- pathsList.Add( currentAsset.PackageContentsOrigin );
- for( int i = 0 ; i < currentAsset.AllExtras.Count ; i++ )
- {
- if( currentAsset.AllExtras[ i ].StartsWith( "Assets" ) )
- {
- pathsList.Add( currentAsset.AllExtras[ i ] );
- }
- else
- {
- int idx = currentAsset.AllExtras[ i ].IndexOf( "Assets" );
- if( idx >= 0 )
- {
- pathsList.Add( currentAsset.AllExtras[ i ].Substring( idx ) );
- }
- }
-
- }
- AssetDatabase.ExportPackage( pathsList.ToArray() , currentAsset.PackageTargetPath + "/" + currentAsset.PackageTargetName + ".unitypackage" , ExportPackageOptions.Recurse | ExportPackageOptions.Interactive );
- }
- private void OnGUI()
- {
- if( m_updatingShaders )
- {
- m_updatingShaders = EditorPrefs.HasKey( AmplifyShaderEditorWindow.ASEFileList );
- }
- if( m_titleStyle == null )
- {
- m_titleStyle = new GUIStyle( "BoldLabel" );
- m_titleStyle.fontSize = 13;
- m_titleStyle.alignment = TextAnchor.MiddleCenter;
- }
- EditorGUILayout.LabelField( Title , m_titleStyle );
- EditorGUI.BeginDisabledGroup( m_updatingShaders );
- {
- ASESaveBundleAsset currentAsset = null;
- if( m_asset != null )
- {
- currentAsset = m_asset;
- }
- else
- {
- if( m_dummyAsset == null )
- {
- m_dummyAsset = ScriptableObject.CreateInstance<ASESaveBundleAsset>();
- m_dummyAsset.name = "Dummy";
- }
- currentAsset = m_dummyAsset;
- }
- m_scrollPos = EditorGUILayout.BeginScrollView( m_scrollPos , GUILayout.Height( position.height ) );
- {
- float cachedWidth = EditorGUIUtility.labelWidth;
- EditorGUIUtility.labelWidth = 100;
- EditorGUILayout.BeginVertical( m_contentStyle );
- {
- EditorGUI.BeginDisabledGroup( currentAsset.AllShaders.Count <= 0 );
- {
- // Update all shaders
- if( GUILayout.Button( UpdateAllStr/* , UpdateAllStyle , GUILayout.Height( 20 )*/ ) )
- {
- m_updatingShaders = true;
- string[] assetPaths = new string[ currentAsset.AllShaders.Count ];
- for( int i = 0 ; i < assetPaths.Length ; i++ )
- {
- assetPaths[ i ] = AssetDatabase.GetAssetPath( currentAsset.AllShaders[ i ] );
- }
- AmplifyShaderEditorWindow.LoadAndSaveList( assetPaths );
- }
- if( GUILayout.Button( "Remove Custom Inspector" ) )
- {
- int count = currentAsset.AllShaders.Count;
- for( int i = 0 ; i < count ; i++ )
- {
- EditorUtility.DisplayProgressBar( "Removing custom inspector", currentAsset.AllShaders[i].name , i / ( count - 1 ) );
- string path = AssetDatabase.GetAssetPath( currentAsset.AllShaders[ i ] );
- string shaderBody = IOUtils.LoadTextFileFromDisk( path );
- shaderBody = Regex.Replace( shaderBody , TemplateHelperFunctions.CustomInspectorPattern , string.Empty ,RegexOptions.Multiline );
- shaderBody = UIUtils.ForceLFLineEnding( shaderBody );
- IOUtils.SaveTextfileToDisk( shaderBody , path , false );
- }
- AssetDatabase.Refresh();
- EditorUtility.ClearProgressBar();
- }
- }
- EditorGUI.EndDisabledGroup();
- EditorGUI.BeginDisabledGroup( string.IsNullOrEmpty( currentAsset.PackageTargetName ) || string.IsNullOrEmpty( currentAsset.PackageTargetPath ) );
- {
- if( GUILayout.Button( "Export Unity Package" ) )
- {
- ExportCurrent( currentAsset );
- }
- }
- EditorGUI.EndDisabledGroup();
- EditorGUILayout.Separator();
- // Asset creation/load
- EditorGUILayout.BeginHorizontal();
- m_asset = EditorGUILayout.ObjectField( "Asset Preset" , m_asset , typeof( ASESaveBundleAsset ) , false ) as ASESaveBundleAsset;
- if( GUILayout.Button( m_asset != null ? "Save" : "Create" , "minibutton" , GUILayout.Width( 50 ) ) )
- {
- string defaultName = "ShaderBundlePreset";
- string assetPath = string.Empty;
- if( m_asset != null )
- {
- defaultName = m_asset.name;
- assetPath = Application.dataPath.Substring(0, Application.dataPath.Length - 6 )+ AssetDatabase.GetAssetPath( m_asset );
- }
- string path = EditorUtility.SaveFilePanelInProject( "Save as" , defaultName , "asset" , string.Empty , assetPath );
- if( !string.IsNullOrEmpty( path ) )
- {
- ASESaveBundleAsset outfile = AssetDatabase.LoadMainAssetAtPath( path ) as ASESaveBundleAsset;
- if( outfile != null )
- {
- EditorUtility.CopySerialized( currentAsset , outfile );
- AssetDatabase.SaveAssets();
- Selection.activeObject = outfile;
- EditorGUIUtility.PingObject( outfile );
- }
- else
- {
- if( m_asset != null )
- {
- currentAsset = ScriptableObject.CreateInstance<ASESaveBundleAsset>();
- EditorUtility.CopySerialized( m_asset , currentAsset );
- }
- AssetDatabase.CreateAsset( currentAsset , path );
- Selection.activeObject = currentAsset;
- EditorGUIUtility.PingObject( currentAsset );
- m_asset = currentAsset;
- }
- }
- }
- EditorGUILayout.EndHorizontal();
- if( Event.current.type == EventType.Layout )
- {
- if( m_editor == null )
- {
- m_editor = Editor.CreateEditor( currentAsset , typeof( ASESaveBundleAssetEditor ) ) as ASESaveBundleAssetEditor;
- }
- else
- {
- if( m_editor.Instance != currentAsset )
- {
- DestroyImmediate( m_editor );
- m_editor = Editor.CreateEditor( currentAsset , typeof( ASESaveBundleAssetEditor ) ) as ASESaveBundleAssetEditor;
- }
- }
- }
- if( m_editor != null )
- m_editor.OnInspectorGUI();
- }
- EditorGUILayout.EndVertical();
- }
- EditorGUILayout.EndScrollView();
- }
- EditorGUI.EndDisabledGroup();
- }
- }
- }
|