123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- // Amplify Shader Editor - Visual Shader Editing Tool
- // Copyright (c) Amplify Creations, Lda <info@amplify.pt>
- using UnityEditor;
- using UnityEngine;
- using System.IO;
- using System.Security.AccessControl;
- using System.Security.Principal;
- using System.Text.RegularExpressions;
- using Debug = UnityEngine.Debug;
- namespace AmplifyShaderEditor
- {
- public sealed class TemplatePostProcessor : AssetPostprocessor
- {
- public static TemplatesManager DummyManager;
- public static void Destroy()
- {
- if( DummyManager != null )
- {
- DummyManager.Destroy();
- ScriptableObject.DestroyImmediate( DummyManager );
- DummyManager = null;
- }
- }
- static void OnPostprocessAllAssets( string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths )
- {
- ASEPackageManagerHelper.RequestInfo();
- ASEPackageManagerHelper.Update();
- bool containsShaders = false;
- for( int i = 0; i < importedAssets.Length; i++ )
- {
- if( importedAssets[ i ].EndsWith( ".shader" ) )
- {
- containsShaders = true;
- break;
- }
- }
- // leave early if there's no shaders among the imports
- if( !containsShaders )
- return;
- TemplatesManager templatesManager;
- bool firstTimeDummyFlag = false;
- if( UIUtils.CurrentWindow == null )
- {
- if( DummyManager == null )
- {
- DummyManager = ScriptableObject.CreateInstance<TemplatesManager>();
- DummyManager.hideFlags = HideFlags.HideAndDontSave;
- firstTimeDummyFlag = true;
- }
- templatesManager = DummyManager;
- }
- else
- {
- Destroy();
- templatesManager = UIUtils.CurrentWindow.TemplatesManagerInstance;
- }
- if( templatesManager == null )
- {
- return;
- }
- if( !templatesManager.Initialized )
- {
- templatesManager.Init();
- }
- bool refreshMenuItems = false;
- for( int i = 0; i < importedAssets.Length; i++ )
- {
- if( TemplateHelperFunctions.CheckIfTemplate( importedAssets[ i ] ) )
- {
- string guid = AssetDatabase.AssetPathToGUID( importedAssets[ i ] );
- TemplateDataParent templateData = templatesManager.GetTemplate( guid );
- if( templateData != null )
- {
- refreshMenuItems = templateData.Reload() || refreshMenuItems || firstTimeDummyFlag;
- int windowCount = IOUtils.AllOpenedWindows.Count;
- AmplifyShaderEditorWindow currWindow = UIUtils.CurrentWindow;
- for( int windowIdx = 0; windowIdx < windowCount; windowIdx++ )
- {
- if( IOUtils.AllOpenedWindows[ windowIdx ].OutsideGraph.CurrentCanvasMode == NodeAvailability.TemplateShader )
- {
- if( IOUtils.AllOpenedWindows[ windowIdx ].OutsideGraph.MultiPassMasterNodes.NodesList[ 0 ].CurrentTemplate == templateData )
- {
- UIUtils.CurrentWindow = IOUtils.AllOpenedWindows[ windowIdx ];
- IOUtils.AllOpenedWindows[ windowIdx ].OutsideGraph.ForceMultiPassMasterNodesRefresh();
- }
- }
- }
- UIUtils.CurrentWindow = currWindow;
- }
- else
- {
- refreshMenuItems = true;
- string name = TemplatesManager.OfficialTemplates.ContainsKey( guid ) ? TemplatesManager.OfficialTemplates[ guid ] : string.Empty;
- TemplateMultiPass mp = TemplateMultiPass.CreateInstance<TemplateMultiPass>();
- mp.Init( name, guid, AssetDatabase.GUIDToAssetPath( guid ), true );
- templatesManager.AddTemplate( mp );
- }
- }
- }
- if( deletedAssets.Length > 0 )
- {
- if( deletedAssets[ 0 ].IndexOf( Constants.InvalidPostProcessDatapath ) < 0 )
- {
- for( int i = 0; i < deletedAssets.Length; i++ )
- {
- string guid = AssetDatabase.AssetPathToGUID( deletedAssets[ i ] );
- TemplateDataParent templateData = templatesManager.GetTemplate( guid );
- if( templateData != null )
- {
- // Close any window using that template
- int windowCount = IOUtils.AllOpenedWindows.Count;
- for( int windowIdx = 0; windowIdx < windowCount; windowIdx++ )
- {
- TemplateMasterNode masterNode = IOUtils.AllOpenedWindows[ windowIdx ].CurrentGraph.CurrentMasterNode as TemplateMasterNode;
- if( masterNode != null && masterNode.CurrentTemplate.GUID.Equals( templateData.GUID ) )
- {
- IOUtils.AllOpenedWindows[ windowIdx ].Close();
- }
- }
- templatesManager.RemoveTemplate( templateData );
- refreshMenuItems = true;
- }
- }
- }
- }
- //for ( int i = 0; i < movedAssets.Length; i++ )
- //{
- // if ( TemplateHelperFunctions.CheckIfTemplate( movedAssets[ i ] ) )
- // {
- // refreshMenuItems = true;
- // break;
- // }
- //}
- //for ( int i = 0; i < movedFromAssetPaths.Length; i++ )
- //{
- // if ( TemplateHelperFunctions.CheckIfTemplate( movedFromAssetPaths[ i ] ) )
- // {
- // refreshMenuItems = true;
- // break;
- // }
- //}
- if( refreshMenuItems )
- {
- //UnityEngine.Debug.Log( "Refresh Menu Items" );
- refreshMenuItems = false;
- templatesManager.CreateTemplateMenuItems();
- AmplifyShaderEditorWindow currWindow = UIUtils.CurrentWindow;
- int windowCount = IOUtils.AllOpenedWindows.Count;
- for( int windowIdx = 0; windowIdx < windowCount; windowIdx++ )
- {
- UIUtils.CurrentWindow = IOUtils.AllOpenedWindows[ windowIdx ];
- IOUtils.AllOpenedWindows[ windowIdx ].CurrentGraph.ForceCategoryRefresh();
- }
- UIUtils.CurrentWindow = currWindow;
- }
- // reimport menu items at the end of everything, hopefully preventing import loops
- templatesManager.ReimportMenuItems();
- // destroying the DummyManager, not doing so will create leaks over time
- Destroy();
- }
- }
- }
|