TemplatePostProcessor.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // Amplify Shader Editor - Visual Shader Editing Tool
  2. // Copyright (c) Amplify Creations, Lda <info@amplify.pt>
  3. using UnityEditor;
  4. using UnityEngine;
  5. using System.IO;
  6. using System.Security.AccessControl;
  7. using System.Security.Principal;
  8. using System.Text.RegularExpressions;
  9. using Debug = UnityEngine.Debug;
  10. namespace AmplifyShaderEditor
  11. {
  12. public sealed class TemplatePostProcessor : AssetPostprocessor
  13. {
  14. public static TemplatesManager DummyManager;
  15. public static void Destroy()
  16. {
  17. if( DummyManager != null )
  18. {
  19. DummyManager.Destroy();
  20. ScriptableObject.DestroyImmediate( DummyManager );
  21. DummyManager = null;
  22. }
  23. }
  24. static void OnPostprocessAllAssets( string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths )
  25. {
  26. ASEPackageManagerHelper.RequestInfo();
  27. ASEPackageManagerHelper.Update();
  28. bool containsShaders = false;
  29. for( int i = 0; i < importedAssets.Length; i++ )
  30. {
  31. if( importedAssets[ i ].EndsWith( ".shader" ) )
  32. {
  33. containsShaders = true;
  34. break;
  35. }
  36. }
  37. // leave early if there's no shaders among the imports
  38. if( !containsShaders )
  39. return;
  40. TemplatesManager templatesManager;
  41. bool firstTimeDummyFlag = false;
  42. if( UIUtils.CurrentWindow == null )
  43. {
  44. if( DummyManager == null )
  45. {
  46. DummyManager = ScriptableObject.CreateInstance<TemplatesManager>();
  47. DummyManager.hideFlags = HideFlags.HideAndDontSave;
  48. firstTimeDummyFlag = true;
  49. }
  50. templatesManager = DummyManager;
  51. }
  52. else
  53. {
  54. Destroy();
  55. templatesManager = UIUtils.CurrentWindow.TemplatesManagerInstance;
  56. }
  57. if( templatesManager == null )
  58. {
  59. return;
  60. }
  61. if( !templatesManager.Initialized )
  62. {
  63. templatesManager.Init();
  64. }
  65. bool refreshMenuItems = false;
  66. for( int i = 0; i < importedAssets.Length; i++ )
  67. {
  68. if( TemplateHelperFunctions.CheckIfTemplate( importedAssets[ i ] ) )
  69. {
  70. string guid = AssetDatabase.AssetPathToGUID( importedAssets[ i ] );
  71. TemplateDataParent templateData = templatesManager.GetTemplate( guid );
  72. if( templateData != null )
  73. {
  74. refreshMenuItems = templateData.Reload() || refreshMenuItems || firstTimeDummyFlag;
  75. int windowCount = IOUtils.AllOpenedWindows.Count;
  76. AmplifyShaderEditorWindow currWindow = UIUtils.CurrentWindow;
  77. for( int windowIdx = 0; windowIdx < windowCount; windowIdx++ )
  78. {
  79. if( IOUtils.AllOpenedWindows[ windowIdx ].OutsideGraph.CurrentCanvasMode == NodeAvailability.TemplateShader )
  80. {
  81. if( IOUtils.AllOpenedWindows[ windowIdx ].OutsideGraph.MultiPassMasterNodes.NodesList[ 0 ].CurrentTemplate == templateData )
  82. {
  83. UIUtils.CurrentWindow = IOUtils.AllOpenedWindows[ windowIdx ];
  84. IOUtils.AllOpenedWindows[ windowIdx ].OutsideGraph.ForceMultiPassMasterNodesRefresh();
  85. }
  86. }
  87. }
  88. UIUtils.CurrentWindow = currWindow;
  89. }
  90. else
  91. {
  92. refreshMenuItems = true;
  93. string name = TemplatesManager.OfficialTemplates.ContainsKey( guid ) ? TemplatesManager.OfficialTemplates[ guid ] : string.Empty;
  94. TemplateMultiPass mp = TemplateMultiPass.CreateInstance<TemplateMultiPass>();
  95. mp.Init( name, guid, AssetDatabase.GUIDToAssetPath( guid ), true );
  96. templatesManager.AddTemplate( mp );
  97. }
  98. }
  99. }
  100. if( deletedAssets.Length > 0 )
  101. {
  102. if( deletedAssets[ 0 ].IndexOf( Constants.InvalidPostProcessDatapath ) < 0 )
  103. {
  104. for( int i = 0; i < deletedAssets.Length; i++ )
  105. {
  106. string guid = AssetDatabase.AssetPathToGUID( deletedAssets[ i ] );
  107. TemplateDataParent templateData = templatesManager.GetTemplate( guid );
  108. if( templateData != null )
  109. {
  110. // Close any window using that template
  111. int windowCount = IOUtils.AllOpenedWindows.Count;
  112. for( int windowIdx = 0; windowIdx < windowCount; windowIdx++ )
  113. {
  114. TemplateMasterNode masterNode = IOUtils.AllOpenedWindows[ windowIdx ].CurrentGraph.CurrentMasterNode as TemplateMasterNode;
  115. if( masterNode != null && masterNode.CurrentTemplate.GUID.Equals( templateData.GUID ) )
  116. {
  117. IOUtils.AllOpenedWindows[ windowIdx ].Close();
  118. }
  119. }
  120. templatesManager.RemoveTemplate( templateData );
  121. refreshMenuItems = true;
  122. }
  123. }
  124. }
  125. }
  126. //for ( int i = 0; i < movedAssets.Length; i++ )
  127. //{
  128. // if ( TemplateHelperFunctions.CheckIfTemplate( movedAssets[ i ] ) )
  129. // {
  130. // refreshMenuItems = true;
  131. // break;
  132. // }
  133. //}
  134. //for ( int i = 0; i < movedFromAssetPaths.Length; i++ )
  135. //{
  136. // if ( TemplateHelperFunctions.CheckIfTemplate( movedFromAssetPaths[ i ] ) )
  137. // {
  138. // refreshMenuItems = true;
  139. // break;
  140. // }
  141. //}
  142. if( refreshMenuItems )
  143. {
  144. //UnityEngine.Debug.Log( "Refresh Menu Items" );
  145. refreshMenuItems = false;
  146. templatesManager.CreateTemplateMenuItems();
  147. AmplifyShaderEditorWindow currWindow = UIUtils.CurrentWindow;
  148. int windowCount = IOUtils.AllOpenedWindows.Count;
  149. for( int windowIdx = 0; windowIdx < windowCount; windowIdx++ )
  150. {
  151. UIUtils.CurrentWindow = IOUtils.AllOpenedWindows[ windowIdx ];
  152. IOUtils.AllOpenedWindows[ windowIdx ].CurrentGraph.ForceCategoryRefresh();
  153. }
  154. UIUtils.CurrentWindow = currWindow;
  155. }
  156. // reimport menu items at the end of everything, hopefully preventing import loops
  157. templatesManager.ReimportMenuItems();
  158. // destroying the DummyManager, not doing so will create leaks over time
  159. Destroy();
  160. }
  161. }
  162. }