diff options
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesManager.cs')
-rw-r--r-- | Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesManager.cs | 904 |
1 files changed, 904 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesManager.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesManager.cs new file mode 100644 index 00000000..456cc4df --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesManager.cs @@ -0,0 +1,904 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using System; +using UnityEditor; +using System.Collections.Generic; +using UnityEngine; +using System.Text.RegularExpressions; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateInputData + { + public string PortName; + public WirePortDataType DataType; + public MasterNodePortCategory PortCategory; + public int PortUniqueId; + public int OrderId; + public int TagGlobalStartIdx; + public int TagLocalStartIdx; + public string TagId; + public string DefaultValue; + public string LinkId; + + public TemplateInputData( int tagLocalStartIdx, int tagGlobalStartIdx, string tagId, string portName, string defaultValue, WirePortDataType dataType, MasterNodePortCategory portCategory, int portUniqueId, int orderId, string linkId ) + { + DefaultValue = defaultValue; + PortName = portName; + DataType = dataType; + PortCategory = portCategory; + PortUniqueId = portUniqueId; + OrderId = orderId; + TagId = tagId; + TagGlobalStartIdx = tagGlobalStartIdx; + TagLocalStartIdx = tagLocalStartIdx; + LinkId = linkId; + } + + public TemplateInputData( TemplateInputData other ) + { + DefaultValue = other.DefaultValue; + PortName = other.PortName; + DataType = other.DataType; + PortCategory = other.PortCategory; + PortUniqueId = other.PortUniqueId; + OrderId = other.OrderId; + TagId = other.TagId; + TagGlobalStartIdx = other.TagGlobalStartIdx; + LinkId = other.LinkId; + } + } + + + + [Serializable] + public class TemplatePropertyContainer + { + [SerializeField] + private List<TemplateProperty> m_propertyList = new List<TemplateProperty>(); + private Dictionary<string, TemplateProperty> m_propertyDict = new Dictionary<string, TemplateProperty>(); + + + public void AddId( TemplateProperty templateProperty ) + { + BuildInfo(); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + + public void AddId( string body, string ID, bool searchIndentation = true ) + { + AddId( body, ID, searchIndentation, string.Empty ); + } + + public void AddId( string body, string ID, bool searchIndentation, string customIndentation ) + { + BuildInfo(); + + int propertyIndex = body.IndexOf( ID ); + if( propertyIndex > -1 ) + { + if( searchIndentation ) + { + int identationIndex = -1; + for( int i = propertyIndex; i >= 0; i-- ) + { + if( body[ i ] == TemplatesManager.TemplateNewLine ) + { + identationIndex = i + 1; + break; + } + + if( i == 0 ) + { + identationIndex = 0; + } + } + if( identationIndex > -1 ) + { + int length = propertyIndex - identationIndex; + string indentation = ( length > 0 ) ? body.Substring( identationIndex, length ) : string.Empty; + TemplateProperty templateProperty = new TemplateProperty( ID, indentation, false ); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + else + { + TemplateProperty templateProperty = new TemplateProperty( ID, string.Empty, false ); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + } + else + { + TemplateProperty templateProperty = new TemplateProperty( ID, customIndentation, true ); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + } + } + + + public void AddId( string body, string ID, int propertyIndex, bool searchIndentation ) + { + AddId( body, ID, propertyIndex, searchIndentation, string.Empty ); + } + + public void AddId( string body, string ID, int propertyIndex, bool searchIndentation, string customIndentation ) + { + if( body == null || string.IsNullOrEmpty( body ) ) + return; + + BuildInfo(); + if( searchIndentation && propertyIndex > -1 && propertyIndex < body.Length ) + { + int indentationIndex = -1; + for( int i = propertyIndex; i > 0; i-- ) + { + if( body[ i ] == TemplatesManager.TemplateNewLine ) + { + indentationIndex = i + 1; + break; + } + } + + if( indentationIndex > -1 ) + { + int length = propertyIndex - indentationIndex; + string indentation = ( length > 0 ) ? body.Substring( indentationIndex, length ) : string.Empty; + TemplateProperty templateProperty = new TemplateProperty( ID, indentation, false ); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + } + else + { + TemplateProperty templateProperty = new TemplateProperty( ID, customIndentation, true ); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + + } + public void BuildInfo() + { + if( m_propertyDict == null ) + { + m_propertyDict = new Dictionary<string, TemplateProperty>(); + } + + if( m_propertyList.Count != m_propertyDict.Count ) + { + m_propertyDict.Clear(); + for( int i = 0; i < m_propertyList.Count; i++ ) + { + m_propertyDict.Add( m_propertyList[ i ].Id, m_propertyList[ i ] ); + } + } + } + + public void ResetTemplateUsageData() + { + BuildInfo(); + for( int i = 0; i < m_propertyList.Count; i++ ) + { + m_propertyList[ i ].Used = false; + } + } + + public void Reset() + { + m_propertyList.Clear(); + m_propertyDict.Clear(); + } + + public void Destroy() + { + m_propertyList.Clear(); + m_propertyList = null; + m_propertyDict.Clear(); + m_propertyDict = null; + } + + + public Dictionary<string, TemplateProperty> PropertyDict + { + get + { + BuildInfo(); + return m_propertyDict; + } + } + public List<TemplateProperty> PropertyList { get { return m_propertyList; } } + } + + [Serializable] + public class TemplateProperty + { + public bool UseIndentationAtStart = false; + public string Indentation; + public bool UseCustomIndentation; + public string Id; + public bool AutoLineFeed; + public bool Used; + + public TemplateProperty( string id, string indentation, bool useCustomIndentation ) + { + Id = id; + Indentation = indentation; + UseCustomIndentation = useCustomIndentation; + AutoLineFeed = !string.IsNullOrEmpty( indentation ); + Used = false; + } + } + + [Serializable] + public class TemplateTessVControlTag + { + public string Id; + public int StartIdx; + + public TemplateTessVControlTag() + { + StartIdx = -1; + } + + public bool IsValid { get { return StartIdx >= 0; } } + } + + [Serializable] + public class TemplateTessControlData + { + public string Id; + public int StartIdx; + public string InVarType; + public string InVarName; + public string OutVarType; + public string OutVarName; + + public bool IsValid { get { return StartIdx >= 0; } } + + public TemplateTessControlData() + { + StartIdx = -1; + } + + public TemplateTessControlData( int startIdx, string id, string inVarInfo, string outVarInfo ) + { + StartIdx = startIdx; + Id = id; + string[] inVarInfoArr = inVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( inVarInfoArr.Length > 1 ) + { + InVarType = inVarInfoArr[ 1 ]; + InVarName = inVarInfoArr[ 0 ]; + } + + string[] outVarInfoArr = outVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( outVarInfoArr.Length > 1 ) + { + OutVarType = outVarInfoArr[ 1 ]; + OutVarName = outVarInfoArr[ 0 ]; + } + } + + public string[] GenerateControl( Dictionary<TemplateSemantics, TemplateVertexData> vertexData, List<string> inputList ) + { + List<string> value = new List<string>(); + if( vertexData != null && vertexData.Count > 0 ) + { + foreach( var item in vertexData ) + { + if( inputList.FindIndex( x => { return x.Contains( item.Value.VarName ); } ) > -1 ) + value.Add( string.Format( "{0}.{1} = {2}.{1};", OutVarName, item.Value.VarName, InVarName ) ); + } + } + return value.ToArray(); + } + } + + [Serializable] + public class TemplateTessDomainData + { + public string Id; + public int StartIdx; + public string InVarType; + public string InVarName; + public string OutVarType; + public string OutVarName; + public string BaryVarType; + public string BaryVarName; + + public bool IsValid { get { return StartIdx >= 0; } } + + public TemplateTessDomainData() + { + StartIdx = -1; + } + + public TemplateTessDomainData( int startIdx, string id, string inVarInfo, string outVarInfo, string baryVarInfo ) + { + StartIdx = startIdx; + Id = id; + string[] inVarInfoArr = inVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( inVarInfoArr.Length > 1 ) + { + InVarType = inVarInfoArr[ 1 ]; + InVarName = inVarInfoArr[ 0 ]; + } + + string[] outVarInfoArr = outVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( outVarInfoArr.Length > 1 ) + { + OutVarType = outVarInfoArr[ 1 ]; + OutVarName = outVarInfoArr[ 0 ]; + } + + string[] baryVarInfoArr = baryVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( baryVarInfoArr.Length > 1 ) + { + BaryVarType = baryVarInfoArr[ 1 ]; + BaryVarName = baryVarInfoArr[ 0 ]; + } + } + + public string[] GenerateDomain( Dictionary<TemplateSemantics, TemplateVertexData> vertexData, List<string> inputList ) + { + List<string> value = new List<string>(); + if( vertexData != null && vertexData.Count > 0 ) + { + foreach( var item in vertexData ) + { + //o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + if( inputList.FindIndex( x => { return x.Contains( item.Value.VarName ); } ) > -1 ) + value.Add( string.Format( "{0}.{1} = {2}[0].{1} * {3}.x + {2}[1].{1} * {3}.y + {2}[2].{1} * {3}.z;", OutVarName, item.Value.VarName, InVarName, BaryVarName ) ); + } + } + return value.ToArray(); + } + } + + [Serializable] + public class TemplateFunctionData + { + public int MainBodyLocalIdx; + public string MainBodyName; + + public string Id; + public int Position; + public string InVarType; + public string InVarName; + public string OutVarType; + public string OutVarName; + public MasterNodePortCategory Category; + public TemplateFunctionData( int mainBodyLocalIdx, string mainBodyName, string id, int position, string inVarInfo, string outVarInfo, MasterNodePortCategory category ) + { + MainBodyLocalIdx = mainBodyLocalIdx; + MainBodyName = mainBodyName; + Id = id; + Position = position; + { + string[] inVarInfoArr = inVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( inVarInfoArr.Length > 1 ) + { + InVarType = inVarInfoArr[ 1 ]; + InVarName = inVarInfoArr[ 0 ]; + } + } + { + string[] outVarInfoArr = outVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( outVarInfoArr.Length > 1 ) + { + OutVarType = outVarInfoArr[ 1 ]; + OutVarName = outVarInfoArr[ 0 ]; + } + } + Category = category; + } + } + + [Serializable] + public class TemplateTagData + { + public int StartIdx = -1; + public string Id; + public bool SearchIndentation; + public string CustomIndentation; + + + public TemplateTagData( int startIdx, string id, bool searchIndentation ) + { + StartIdx = startIdx; + Id = id; + SearchIndentation = searchIndentation; + CustomIndentation = string.Empty; + } + + public TemplateTagData( string id, bool searchIndentation ) + { + Id = id; + SearchIndentation = searchIndentation; + CustomIndentation = string.Empty; + } + + public TemplateTagData( string id, bool searchIndentation, string customIndentation ) + { + Id = id; + SearchIndentation = searchIndentation; + CustomIndentation = customIndentation; + } + + public bool IsValid { get { return StartIdx >= 0; } } + } + + public enum TemplatePortIds + { + Name = 0, + DataType, + UniqueId, + OrderId, + Link + } + + public enum TemplateCommonTagId + { + Property = 0, + Global = 1, + Function = 2, + Tag = 3, + Pragmas = 4, + Pass = 5, + Params_Vert = 6, + Params_Frag = 7 + //CullMode = 8, + //BlendMode = 9, + //BlendOp = 10, + //ColorMask = 11, + //StencilOp = 12 + } + + [Serializable] + public class TemplatesManager : ScriptableObject + { + public static int MPShaderVersion = 14503; + + public static readonly string TemplateShaderNameBeginTag = "/*ase_name*/"; + public static readonly string TemplateStencilTag = "/*ase_stencil*/\n"; + public static readonly string TemplateAllModulesTag = "/*ase_all_modules*/\n"; + public static readonly string TemplateMPSubShaderTag = "\\bSubShader\\b\\s*{"; + //public static readonly string TemplateMPPassTag = "^\\s*Pass\b\\s*{";//"\\bPass\\b\\s*{"; + public static readonly string TemplateMPPassTag = "\\bPass\\b\\s*{"; + public static readonly string TemplateLocalVarTag = "/*ase_local_var*/"; + public static readonly string TemplateDependenciesListTag = "/*ase_dependencies_list*/"; + public static readonly string TemplatePragmaBeforeTag = "/*ase_pragma_before*/"; + public static readonly string TemplatePragmaTag = "/*ase_pragma*/"; + public static readonly string TemplatePassTag = "/*ase_pass*/"; + public static readonly string TemplatePassesEndTag = "/*ase_pass_end*/"; + public static readonly string TemplateLODsTag = "/*ase_lod*/"; + //public static readonly string TemplatePassTagPattern = @"\s\/\*ase_pass\*\/"; + public static readonly string TemplatePassTagPattern = @"\s\/\*ase_pass[:\*]+"; + public static readonly string TemplatePropertyTag = "/*ase_props*/"; + public static readonly string TemplateGlobalsTag = "/*ase_globals*/"; + public static readonly string TemplateSRPBatcherTag = "/*ase_srp_batcher*/\n"; + public static readonly string TemplateInterpolatorBeginTag = "/*ase_interp("; + public static readonly string TemplateVertexDataTag = "/*ase_vdata:"; + + public static readonly string TemplateTessVControlTag = "/*ase_vcontrol*/"; + public static readonly string TemplateTessControlCodeArea = "/*ase_control_code:"; + public static readonly string TemplateTessDomainCodeArea = "/*ase_domain_code:"; + + //public static readonly string TemplateExcludeFromGraphTag = "/*ase_hide_pass*/"; + public static readonly string TemplateMainPassTag = "/*ase_main_pass*/"; + + public static readonly string TemplateFunctionsTag = "/*ase_funcs*/\n"; + //public static readonly string TemplateTagsTag = "/*ase_tags*/"; + + //public static readonly string TemplateCullModeTag = "/*ase_cull_mode*/"; + //public static readonly string TemplateBlendModeTag = "/*ase_blend_mode*/"; + //public static readonly string TemplateBlendOpTag = "/*ase_blend_op*/"; + //public static readonly string TemplateColorMaskTag = "/*ase_color_mask*/"; + //public static readonly string TemplateStencilOpTag = "/*ase_stencil*/"; + + public static readonly string TemplateCodeSnippetAttribBegin = "#CODE_SNIPPET_ATTRIBS_BEGIN#"; + public static readonly string TemplateCodeSnippetAttribEnd = "#CODE_SNIPPET_ATTRIBS_END#\n"; + public static readonly string TemplateCodeSnippetEnd = "#CODE_SNIPPET_END#\n"; + + public static readonly char TemplateNewLine = '\n'; + + // INPUTS AREA + public static readonly string TemplateInputsVertBeginTag = "/*ase_vert_out:"; + public static readonly string TemplateInputsFragBeginTag = "/*ase_frag_out:"; + public static readonly string TemplateInputsVertParamsTag = "/*ase_vert_input*/"; + public static readonly string TemplateInputsFragParamsTag = "/*ase_frag_input*/"; + + + // CODE AREA + public static readonly string TemplateVertexCodeBeginArea = "/*ase_vert_code:"; + public static readonly string TemplateFragmentCodeBeginArea = "/*ase_frag_code:"; + + + public static readonly string TemplateEndOfLine = "*/\n"; + public static readonly string TemplateEndSectionTag = "*/"; + public static readonly string TemplateFullEndTag = "/*end*/"; + + public static readonly string NameFormatter = "\"{0}\""; + + public static readonly TemplateTagData[] CommonTags = { new TemplateTagData( TemplatePropertyTag,true), + new TemplateTagData( TemplateGlobalsTag,true), + new TemplateTagData( TemplateSRPBatcherTag,true), + new TemplateTagData( TemplateFunctionsTag,true), + //new TemplateTagData( TemplateTagsTag,false," "), + new TemplateTagData( TemplatePragmaBeforeTag,true), + new TemplateTagData( TemplatePragmaTag,true), + new TemplateTagData( TemplatePassTag,true), + new TemplateTagData( TemplateInputsVertParamsTag,false), + new TemplateTagData( TemplateInputsFragParamsTag,false), + new TemplateTagData( TemplateLODsTag,true) + //new TemplateTagData( TemplateCullModeTag,false), + //new TemplateTagData( TemplateBlendModeTag,false), + //new TemplateTagData( TemplateBlendOpTag,false), + //new TemplateTagData( TemplateColorMaskTag,false), + //new TemplateTagData( TemplateStencilOpTag,true), + }; + public static string LightweigthPBRGUID = "1976390536c6c564abb90fe41f6ee334"; + public static string LightweigthUnlitGUID = "e2514bdcf5e5399499a9eb24d175b9db"; + public static string UniversalPBRGUID = "94348b07e5e8bab40bd6c8a1e3df54cd"; + public static string UniversalUnlitGUID = "2992e84f91cbeb14eab234972e07ea9d"; + + public static string HDNewLitGUID = "53b46d85872c5b24c8f4f0a1c3fe4c87"; + public static string HDNewPBRGUID = "41e04be03f2c20941bc749271be1c937"; + public static string HDNewUnlitGUID = "7f5cb9c3ea6481f469fdd856555439ef"; + public static string HDLitGUID = "091c43ba8bd92c9459798d59b089ce4e"; + public static string HDPBRGUID = "bb308bce79762c34e823049efce65141"; + public static string HDUnlitGUID = "dfe2f27ac20b08c469b2f95c236be0c3"; + + public static Dictionary<string, string> OfficialTemplates = new Dictionary<string, string>() + { + { "0770190933193b94aaa3065e307002fa","Legacy/Unlit"}, + { "32139be9c1eb75640a847f011acf3bcf","Legacy/Post-Processing Stack"}, + { "6ce779933eb99f049b78d6163735e06f","Legacy/Custom RT Init"}, + { "32120270d1b3a8746af2aca8bc749736","Legacy/Custom RT Update"}, + { LightweigthPBRGUID,"LW/PBR"}, + { LightweigthUnlitGUID,"LW/Unlit"}, + { UniversalPBRGUID,"Universal/PBR"}, + { UniversalUnlitGUID,"Universal/Unlit"}, + { "53b46d85872c5b24c8f4f0a1c3fe4c87","HD/Lit"}, + { HDLitGUID,"Deprecated/HD/Lit"}, + { HDPBRGUID,"Deprecated/HD/PBR"}, + { HDUnlitGUID,"Deprecated/HD/Unlit"}, + { "c71b220b631b6344493ea3cf87110c93","Legacy/Post Process" }, + { "6e114a916ca3e4b4bb51972669d463bf","Deprecated/Legacy/Default Unlit" }, + { "5056123faa0c79b47ab6ad7e8bf059a4","Legacy/Default UI" }, + { "899e609c083c74c4ca567477c39edef0","Legacy/Unlit Lightmap" }, + { "0f8ba0101102bb14ebf021ddadce9b49","Legacy/Default Sprites" }, + { "0b6a9f8b4f707c74ca64c0be8e590de0","Legacy/Particles Alpha Blended" }, + { "e1de45c0d41f68c41b2cc20c8b9c05ef","Legacy/Multi Pass Unlit" } + }; + + public static readonly string TemplateMenuItemsFileGUID = "da0b931bd234a1e43b65f684d4b59bfb"; + + private Dictionary<string, TemplateDataParent> m_availableTemplates = new Dictionary<string, TemplateDataParent>(); + + [SerializeField] + private List<TemplateDataParent> m_sortedTemplates = new List<TemplateDataParent>(); + + [SerializeField] + public string[] AvailableTemplateNames; + + [SerializeField] + public bool Initialized = false; + + private Dictionary<string, bool> m_optionsInitialSetup = new Dictionary<string, bool>(); + + public static string CurrTemplateGUIDLoaded = string.Empty; + + public static bool IsTestTemplate { get { return CurrTemplateGUIDLoaded.Equals( "a95a019bbc760714bb8228af04c291d1" ); } } + public static bool ShowDebugMessages = false; + public void RefreshAvailableTemplates() + { + if( m_availableTemplates.Count != m_sortedTemplates.Count ) + { + m_availableTemplates.Clear(); + int count = m_sortedTemplates.Count; + for( int i = 0; i < count; i++ ) + { + m_availableTemplates.Add( m_sortedTemplates[ i ].GUID, m_sortedTemplates[ i ] ); + } + } + } + + public void Init() + { + if( !Initialized ) + { + if( ShowDebugMessages ) + Debug.Log( "Initialize" ); + + string templateMenuItems = IOUtils.LoadTextFileFromDisk( AssetDatabase.GUIDToAssetPath( TemplateMenuItemsFileGUID ) ); + bool refreshTemplateMenuItems = false; + + foreach( KeyValuePair<string, string> kvp in OfficialTemplates ) + { + if( !string.IsNullOrEmpty( AssetDatabase.GUIDToAssetPath( kvp.Key ) ) ) + { + TemplateMultiPass template = ScriptableObject.CreateInstance<TemplateMultiPass>(); + template.Init( kvp.Value, kvp.Key, false ); + AddTemplate( template ); + if( !refreshTemplateMenuItems && templateMenuItems.IndexOf( kvp.Value ) < 0 ) + refreshTemplateMenuItems = true; + } + } + + // Search for other possible templates on the project + string[] allShaders = AssetDatabase.FindAssets( "t:shader" ); + for( int i = 0; i < allShaders.Length; i++ ) + { + if( !m_availableTemplates.ContainsKey( allShaders[ i ] ) ) + { + CheckAndLoadTemplate( allShaders[ i ] ); + } + } + + // TODO: Sort list alphabeticaly + AvailableTemplateNames = new string[ m_sortedTemplates.Count + 1 ]; + AvailableTemplateNames[ 0 ] = "Custom"; + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + m_sortedTemplates[ i ].OrderId = i; + AvailableTemplateNames[ i + 1 ] = m_sortedTemplates[ i ].Name; + } + + if( refreshTemplateMenuItems ) + CreateTemplateMenuItems(); + + Initialized = true; + } + } + + //[MenuItem( "Window/Amplify Shader Editor/Create Menu Items", false, 1000 )] + //public static void ForceCreateTemplateMenuItems() + //{ + // UIUtils.CurrentWindow.TemplatesManagerInstance.CreateTemplateMenuItems(); + //} + + public void CreateTemplateMenuItems() + { + if( m_sortedTemplates == null || m_sortedTemplates.Count == 0 ) + return; + + // change names for duplicates + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + for( int j = 0; j < i; j++ ) + { + if( m_sortedTemplates[ i ].Name == m_sortedTemplates[ j ].Name ) + { + var match = Regex.Match( m_sortedTemplates[ i ].Name, @".+(\d+)" ); + if( match.Success ) + { + string strNumber = match.Groups[ 1 ].Value; + int number = int.Parse( strNumber ) + 1; + string firstPart = m_sortedTemplates[ i ].Name.Substring( 0, match.Groups[ 1 ].Index ); + string secondPart = m_sortedTemplates[ i ].Name.Substring( match.Groups[ 1 ].Index + strNumber.Length ); + m_sortedTemplates[ i ].Name = firstPart + number + secondPart; + } + else + { + m_sortedTemplates[ i ].Name += " 1"; + } + } + } + } + + System.Text.StringBuilder fileContents = new System.Text.StringBuilder(); + fileContents.Append( "// Amplify Shader Editor - Visual Shader Editing Tool\n" ); + fileContents.Append( "// Copyright (c) Amplify Creations, Lda <info@amplify.pt>\n" ); + fileContents.Append( "using UnityEditor;\n" ); + fileContents.Append( "\n" ); + fileContents.Append( "namespace AmplifyShaderEditor\n" ); + fileContents.Append( "{\n" ); + fileContents.Append( "\tpublic class TemplateMenuItems\n" ); + fileContents.Append( "\t{\n" ); + int fixedPriority = 85; + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + fileContents.AppendFormat( "\t\t[MenuItem( \"Assets/Create/Amplify Shader/{0}\", false, {1} )]\n", m_sortedTemplates[ i ].Name, fixedPriority ); + string itemName = UIUtils.RemoveInvalidCharacters( m_sortedTemplates[ i ].Name ); + fileContents.AppendFormat( "\t\tpublic static void ApplyTemplate{0}()\n", itemName/*i*/ ); + fileContents.Append( "\t\t{\n" ); + //fileContents.AppendFormat( "\t\t\tAmplifyShaderEditorWindow.CreateNewTemplateShader( \"{0}\" );\n", m_sortedTemplates[ i ].GUID ); + fileContents.AppendFormat( "\t\t\tAmplifyShaderEditorWindow.CreateConfirmationTemplateShader( \"{0}\" );\n", m_sortedTemplates[ i ].GUID ); + fileContents.Append( "\t\t}\n" ); + } + fileContents.Append( "\t}\n" ); + fileContents.Append( "}\n" ); + string filePath = AssetDatabase.GUIDToAssetPath( TemplateMenuItemsFileGUID ); + IOUtils.SaveTextfileToDisk( fileContents.ToString(), filePath, false ); + AssetDatabase.ImportAsset( filePath ); + } + + public int GetIdForTemplate( TemplateData templateData ) + { + if( templateData == null ) + return -1; + + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + if( m_sortedTemplates[ i ].GUID.Equals( templateData.GUID ) ) + return m_sortedTemplates[ i ].OrderId; + } + return -1; + } + + + + public void AddTemplate( TemplateDataParent templateData ) + { + if( templateData == null || !templateData.IsValid ) + return; + RefreshAvailableTemplates(); + if( !m_availableTemplates.ContainsKey( templateData.GUID ) ) + { + m_sortedTemplates.Add( templateData ); + m_availableTemplates.Add( templateData.GUID, templateData ); + } + } + + public void RemoveTemplate( string guid ) + { + TemplateDataParent templateData = GetTemplate( guid ); + if( templateData != null ) + { + RemoveTemplate( templateData ); + } + } + + public void RemoveTemplate( TemplateDataParent templateData ) + { + RefreshAvailableTemplates(); + + if( m_availableTemplates != null ) + m_availableTemplates.Remove( templateData.GUID ); + + m_sortedTemplates.Remove( templateData ); + templateData.Destroy(); + } + + public void Destroy() + { + if( TemplatesManager.ShowDebugMessages ) + Debug.Log( "Destroy Manager" ); + if( m_availableTemplates != null ) + { + foreach( KeyValuePair<string, TemplateDataParent> kvp in m_availableTemplates ) + { + kvp.Value.Destroy(); + } + m_availableTemplates.Clear(); + m_availableTemplates = null; + } + int count = m_sortedTemplates.Count; + + for( int i = 0; i < count; i++ ) + { + ScriptableObject.DestroyImmediate( m_sortedTemplates[ i ] ); + } + + m_sortedTemplates.Clear(); + m_sortedTemplates = null; + + AvailableTemplateNames = null; + Initialized = false; + } + + public TemplateDataParent GetTemplate( int id ) + { + if( id < m_sortedTemplates.Count ) + return m_sortedTemplates[ id ]; + + return null; + } + + public TemplateDataParent GetTemplate( string guid ) + { + RefreshAvailableTemplates(); + if( m_availableTemplates == null && m_sortedTemplates != null ) + { + m_availableTemplates = new Dictionary<string, TemplateDataParent>(); + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + m_availableTemplates.Add( m_sortedTemplates[ i ].GUID, m_sortedTemplates[ i ] ); + } + } + + if( m_availableTemplates.ContainsKey( guid ) ) + return m_availableTemplates[ guid ]; + + return null; + } + + + public TemplateDataParent GetTemplateByName( string name ) + { + RefreshAvailableTemplates(); + if( m_availableTemplates == null && m_sortedTemplates != null ) + { + m_availableTemplates = new Dictionary<string, TemplateDataParent>(); + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + m_availableTemplates.Add( m_sortedTemplates[ i ].GUID, m_sortedTemplates[ i ] ); + } + } + + foreach( KeyValuePair<string, TemplateDataParent> kvp in m_availableTemplates ) + { + if( kvp.Value.DefaultShaderName.Equals( name ) ) + { + return kvp.Value; + } + } + return null; + } + + public TemplateDataParent CheckAndLoadTemplate( string guid ) + { + TemplateDataParent templateData = GetTemplate( guid ); + if( templateData == null ) + { + string datapath = AssetDatabase.GUIDToAssetPath( guid ); + string body = IOUtils.LoadTextFileFromDisk( datapath ); + + if( body.IndexOf( TemplatesManager.TemplateShaderNameBeginTag ) > -1 ) + { + templateData = ScriptableObject.CreateInstance<TemplateMultiPass>(); + templateData.Init( string.Empty, guid, true ); + if( templateData.IsValid ) + { + AddTemplate( templateData ); + return templateData; + } + } + } + + return null; + } + + private void OnEnable() + { + if( !Initialized ) + { + Init(); + } + else + { + RefreshAvailableTemplates(); + } + hideFlags = HideFlags.HideAndDontSave; + if( ShowDebugMessages ) + Debug.Log( "On Enable Manager: " + this.GetInstanceID() ); + } + + public void ResetOptionsSetupData() + { + if( ShowDebugMessages ) + Debug.Log( "Reseting options setup data" ); + m_optionsInitialSetup.Clear(); + } + + public bool SetOptionsValue( string optionId, bool value ) + { + if( m_optionsInitialSetup.ContainsKey( optionId ) ) + { + m_optionsInitialSetup[ optionId ] = m_optionsInitialSetup[ optionId ] || value; + } + else + { + m_optionsInitialSetup.Add( optionId, value ); + } + return m_optionsInitialSetup[ optionId ]; + } + + public int TemplateCount { get { return m_sortedTemplates.Count; } } + } +} |