diff options
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPass.cs')
-rw-r--r-- | Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPass.cs | 1248 |
1 files changed, 1248 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPass.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPass.cs new file mode 100644 index 00000000..5086b55f --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPass.cs @@ -0,0 +1,1248 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> +using System; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateUniquePassData + { + public int SubShaderIdx; + public int PassIdx; + } + + [Serializable] + public sealed class TemplateMultiPass : TemplateDataParent + { + [SerializeField] + private List<TemplateShaderPropertyData> m_availableShaderProperties = new List<TemplateShaderPropertyData>(); + + [SerializeField] + private List<TemplateSubShader> m_subShaders = new List<TemplateSubShader>(); + + [SerializeField] + private TemplateTagData m_propertyTag; + + [SerializeField] + private TemplateIdManager m_templateIdManager; + + [SerializeField] + private string m_shaderNameId = string.Empty; + + [SerializeField] + private string m_shaderBody; + + [SerializeField] + private TemplatePropertyContainer m_templateProperties = new TemplatePropertyContainer(); + + [SerializeField] + private TemplateShaderInfo m_shaderData; + + [SerializeField] + private bool m_isSinglePass = false; + + [SerializeField] + private int m_masterNodesRequired = 0; + + [SerializeField] + TemplateInfoContainer m_customInspectorContainer = new TemplateInfoContainer(); + + [SerializeField] + TemplateInfoContainer m_dependenciesContainer = new TemplateInfoContainer(); + + [SerializeField] + TemplateInfoContainer m_fallbackContainer = new TemplateInfoContainer(); + + [SerializeField] + TemplateInfoContainer m_beforePragmaContainer = new TemplateInfoContainer(); + + [SerializeField] + private CustomTemplatePropertyUIEnum m_customTemplatePropertyUI = CustomTemplatePropertyUIEnum.None; + + [SerializeField] + private int m_lodInjectorId = -1; + + [SerializeField] + TemplateShaderModelData m_globalShaderModel = new TemplateShaderModelData(); + + private Dictionary<string, TemplateUniquePassData> m_passUniqueIdData = new Dictionary<string, TemplateUniquePassData>(); + + + public TemplateMultiPass() + { + m_templateType = TemplateDataType.MultiPass; + } + + public TemplateMultiPass( string name, string guid, bool isCommunity ) + { + m_templateType = TemplateDataType.MultiPass; + Init( name, guid, isCommunity ); + } + + public override void Init( string name, string guid, bool isCommunity ) + { + base.Init( name, guid, isCommunity ); + TemplatesManager.CurrTemplateGUIDLoaded = guid; + LoadTemplateBody( guid ); + Name = string.IsNullOrEmpty( name ) ? m_defaultShaderName : name; + } + + void LoadTemplateBody( string guid ) + { + m_passUniqueIdData.Clear(); + m_guid = guid; + string datapath = AssetDatabase.GUIDToAssetPath( guid ); + string shaderBody = string.Empty; + shaderBody = IOUtils.LoadTextFileFromDisk( datapath ); + shaderBody = shaderBody.Replace( "\r\n", "\n" ); + + // Insert Before Tag + MatchCollection col = Regex.Matches( shaderBody, TemplateHelperFunctions.BeforePragmaPattern, RegexOptions.Singleline ); + for( int i = col.Count - 1; i >= 0; i-- ) + { + if( col[ i ].Groups.Count == 3 ) + { + shaderBody = shaderBody.Insert( col[ i ].Groups[ 2 ].Index, TemplatesManager.TemplatePragmaBeforeTag + "\n" + col[ i ].Groups[ 1 ].Value ); + } + } + //Detect SRP Batcher + MatchCollection srpMatch = Regex.Matches( shaderBody, TemplateHelperFunctions.SRPBatcherFindTag ); + for( int i = srpMatch.Count - 1; i >= 0; i-- ) + { + if( srpMatch[ i ].Groups.Count == 2 ) + { + shaderBody = shaderBody.Insert( srpMatch[ i ].Groups[ 0 ].Index + srpMatch[ i ].Groups[ 0 ].Length, TemplatesManager.TemplateSRPBatcherTag + srpMatch[ i ].Groups[ 1 ].Value ); + } + } + + + // Detect if template has LOD tag, if not, insert one + // It will be read and processed over the TemplateSubShader constructor + { + Match match = Regex.Match( shaderBody, TemplateHelperFunctions.SubShaderLODPattern ); + if( match == null || ( match != null && !match.Success ) ) + { + MatchCollection subShaderMatch = Regex.Matches( shaderBody, TemplatesManager.TemplateMPSubShaderTag ); + + int subShaderAmount = subShaderMatch.Count; + + for( int i = subShaderAmount - 1; i > -1; i-- ) + { + if( subShaderMatch[ i ].Success ) + { + shaderBody = shaderBody.Insert( subShaderMatch[ i ].Index + subShaderMatch[ i ].Length, "\n\t\t\tLOD 0\n" ); + } + } + } + } + m_shaderData = TemplateShaderInfoUtil.CreateShaderData( shaderBody ); + if( m_shaderData == null ) + { + m_isValid = false; + return; + } + + m_templateIdManager = new TemplateIdManager( shaderBody ); + + try + { + int nameBegin = shaderBody.IndexOf( TemplatesManager.TemplateShaderNameBeginTag ); + if( nameBegin < 0 ) + { + // Not a template + return; + } + + int nameEnd = shaderBody.IndexOf( TemplatesManager.TemplateFullEndTag, nameBegin ); + if( nameEnd < 0 ) + return; + + + m_shaderBody = shaderBody; + int defaultBegin = nameBegin + TemplatesManager.TemplateShaderNameBeginTag.Length; + int defaultLength = nameEnd - defaultBegin; + m_defaultShaderName = shaderBody.Substring( defaultBegin, defaultLength ); + int[] nameIdx = m_defaultShaderName.AllIndexesOf( "\"" ); + nameIdx[ 0 ] += 1; // Ignore the " character from the string + m_defaultShaderName = m_defaultShaderName.Substring( nameIdx[ 0 ], nameIdx[ 1 ] - nameIdx[ 0 ] ); + m_shaderNameId = shaderBody.Substring( nameBegin, nameEnd + TemplatesManager.TemplateFullEndTag.Length - nameBegin ); + m_templateProperties.AddId( shaderBody, m_shaderNameId, false ); + m_templateIdManager.RegisterId( nameBegin, m_shaderNameId, m_shaderNameId ); + shaderBody = shaderBody.Substring( nameEnd + TemplatesManager.TemplateFullEndTag.Length ); + } + catch( Exception e ) + { + Debug.LogException( e ); + m_isValid = false; + } + + m_customTemplatePropertyUI = TemplateHelperFunctions.FetchCustomUI( shaderBody ); + TemplateHelperFunctions.FetchDependencies( m_dependenciesContainer, ref m_shaderBody ); + if( m_dependenciesContainer.IsValid ) + { + int index = m_dependenciesContainer.Id.IndexOf( TemplatesManager.TemplateDependenciesListTag ); + m_templateProperties.AddId( new TemplateProperty( m_dependenciesContainer.Id, m_dependenciesContainer.Id.Substring( 0, index ), true ) ); + m_templateIdManager.RegisterId( m_dependenciesContainer.Index, m_dependenciesContainer.Id, m_dependenciesContainer.Id ); + } + + TemplateHelperFunctions.FetchCustomInspector( m_customInspectorContainer, ref m_shaderBody ); + if( m_customInspectorContainer.IsValid ) + { + int index = m_customInspectorContainer.Id.IndexOf( "CustomEditor" ); + m_templateProperties.AddId( new TemplateProperty( m_customInspectorContainer.Id, m_customInspectorContainer.Id.Substring( 0, index ), true ) ); + m_templateIdManager.RegisterId( m_customInspectorContainer.Index, m_customInspectorContainer.Id, m_customInspectorContainer.Id ); + } + + TemplateHelperFunctions.FetchFallback( m_fallbackContainer, ref m_shaderBody ); + if( m_fallbackContainer.IsValid ) + { + int index = m_fallbackContainer.Id.IndexOf( "Fallback", StringComparison.InvariantCultureIgnoreCase ); + m_templateProperties.AddId( new TemplateProperty( m_fallbackContainer.Id, m_fallbackContainer.Id.Substring( 0, index ), true ) ); + m_templateIdManager.RegisterId( m_fallbackContainer.Index, m_fallbackContainer.Id, m_fallbackContainer.Id ); + } + + m_lodInjectorId = m_shaderBody.IndexOf( TemplatesManager.TemplateLODsTag ); + + // Shader body may have been changed to inject inexisting tags like fallback + m_templateIdManager.ShaderBody = m_shaderBody; + + m_propertyTag = new TemplateTagData( m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, true ); + m_templateIdManager.RegisterId( m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, TemplatesManager.TemplatePropertyTag ); + m_templateProperties.AddId( shaderBody, TemplatesManager.TemplatePropertyTag, true ); + Dictionary<string, TemplateShaderPropertyData> duplicatesHelper = new Dictionary<string, TemplateShaderPropertyData>(); + TemplateHelperFunctions.CreateShaderPropertiesList( m_shaderData.Properties, ref m_availableShaderProperties, ref duplicatesHelper ); + for( int i = 0; i < m_availableShaderProperties.Count; i++ ) + { + m_templateIdManager.RegisterId( m_availableShaderProperties[ i ].Index, m_availableShaderProperties[ i ].FullValue, m_availableShaderProperties[ i ].FullValue ); + } + + int subShaderCount = m_shaderData.SubShaders.Count; + + int mainSubShaderIdx = -1; + int mainPassIdx = -1; + + int firstVisibleSubShaderId = -1; + int firstVisiblePassId = -1; + bool foundMainPass = false; + bool foundFirstVisible = false; + + m_templateIdManager.RegisterTag( TemplatesManager.TemplatePassesEndTag ); + m_templateIdManager.RegisterTag( TemplatesManager.TemplateMainPassTag ); + + //SHADER MODEL + { + Match shaderModelMatch = Regex.Match( m_shaderData.Properties, TemplateHelperFunctions.ShaderModelPattern ); + if( shaderModelMatch != null && shaderModelMatch.Success ) + { + if( TemplateHelperFunctions.AvailableInterpolators.ContainsKey( shaderModelMatch.Groups[ 1 ].Value ) ) + { + m_globalShaderModel.Id = shaderModelMatch.Groups[ 0 ].Value; + m_globalShaderModel.StartIdx = shaderModelMatch.Index; + m_globalShaderModel.Value = shaderModelMatch.Groups[ 1 ].Value; + m_globalShaderModel.InterpolatorAmount = TemplateHelperFunctions.AvailableInterpolators[ shaderModelMatch.Groups[ 1 ].Value ]; + m_globalShaderModel.DataCheck = TemplateDataCheck.Valid; + } + else + { + m_globalShaderModel.DataCheck = TemplateDataCheck.Invalid; + } + } + } + // + + + for( int i = 0; i < subShaderCount; i++ ) + { + TemplateSubShader subShader = new TemplateSubShader(this, i, m_templateIdManager, "SubShader" + i, m_shaderData.SubShaders[ i ], ref duplicatesHelper ); + + if( subShader.FoundMainPass ) + { + if( !foundMainPass ) + { + foundMainPass = true; + mainSubShaderIdx = i; + mainPassIdx = subShader.MainPass; + } + } + else if( subShader.MainPass > -1 ) + { + if( !foundFirstVisible ) + { + foundFirstVisible = true; + firstVisibleSubShaderId = i; + firstVisiblePassId = subShader.MainPass; + } + } + + m_subShaders.Add( subShader ); + m_masterNodesRequired += subShader.Passes.Count; + } + + + if( !foundMainPass && foundFirstVisible ) + { + mainSubShaderIdx = firstVisibleSubShaderId; + mainPassIdx = firstVisiblePassId; + } + + for( int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++ ) + { + m_subShaders[ subShaderIdx ].Modules.RegisterInternalUnityInlines( ref m_availableShaderProperties , ref duplicatesHelper ); + int passCount = m_subShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + m_subShaders[ subShaderIdx ].Passes[ passIdx ].Modules.RegisterInternalUnityInlines( ref m_availableShaderProperties, ref duplicatesHelper ); + m_subShaders[ subShaderIdx ].Passes[ passIdx ].IsMainPass = ( mainSubShaderIdx == subShaderIdx && mainPassIdx == passIdx ); + } + } + + duplicatesHelper.Clear(); + duplicatesHelper = null; + m_isSinglePass = ( m_subShaders.Count == 1 && m_subShaders[ 0 ].PassAmount == 1 ); + + } + + public void ResetState() + { + m_templateIdManager.ResetRegistersState(); + int subshaderCount = m_subShaders.Count; + for( int subShaderIdx = 0; subShaderIdx < subshaderCount; subShaderIdx++ ) + { + m_subShaders[ subShaderIdx ].TemplateProperties.ResetTemplateUsageData(); + int passCount = m_subShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + m_subShaders[ subShaderIdx ].Passes[ passIdx ].TemplateProperties.ResetTemplateUsageData(); + } + } + } + + public override void Destroy() + { + m_templateProperties.Destroy(); + m_templateProperties = null; + + m_availableShaderProperties.Clear(); + m_availableShaderProperties = null; + + int subShaderCount = m_subShaders.Count; + for( int i = 0; i < subShaderCount; i++ ) + { + m_subShaders[ i ].Destroy(); + } + + m_subShaders.Clear(); + m_subShaders = null; + + m_templateIdManager.Destroy(); + m_templateIdManager = null; + } + + public void SetSubShaderData( TemplateModuleDataType type, int subShaderId, string[] list ) + { + string id = GetSubShaderDataId( type, subShaderId, false ); + string body = string.Empty; + FillTemplateBody( subShaderId, -1, id, ref body, list ); + SetSubShaderData( type, subShaderId, body ); + } + + public void SetSubShaderData( TemplateModuleDataType type, int subShaderId, List<PropertyDataCollector> list ) + { + string id = GetSubShaderDataId( type, subShaderId, false ); + string body = string.Empty; + FillTemplateBody( subShaderId, -1, id, ref body, list ); + SetSubShaderData( type, subShaderId, body ); + } + + public void SetSubShaderData( TemplateModuleDataType type, int subShaderId, string text ) + { + if( subShaderId >= m_subShaders.Count ) + return; + + string prefix = m_subShaders[ subShaderId ].Modules.UniquePrefix; + switch( type ) + { + case TemplateModuleDataType.AllModules: + { + m_templateIdManager.SetReplacementText( prefix + TemplatesManager.TemplateAllModulesTag, text ); + } + break; + case TemplateModuleDataType.ModuleShaderModel: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.ShaderModel.Id, text ); + } + break; + case TemplateModuleDataType.ModuleBlendMode: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendModeId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendOp: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendOpId, text ); + } + break; + case TemplateModuleDataType.ModuleAlphaToMask: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData.AlphaToMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleCullMode: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.CullModeData.CullModeId, text ); + } + break; + case TemplateModuleDataType.ModuleColorMask: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData.ColorMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleStencil: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.StencilData.StencilBufferId, text ); + } + break; + case TemplateModuleDataType.ModuleZwrite: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZWriteModeId, text ); + } + break; + case TemplateModuleDataType.ModuleZTest: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZTestModeId, text ); + } + break; + case TemplateModuleDataType.ModuleZOffset: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.DepthData.OffsetId, text ); + } + break; + case TemplateModuleDataType.ModuleTag: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.TagData.TagsId, text ); + } + break; + case TemplateModuleDataType.ModuleGlobals: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.GlobalsTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleSRPBatcher: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.SRPBatcherTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleFunctions: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.FunctionsTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePragma: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.PragmaTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePragmaBefore: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.PragmaBeforeTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePass: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.PassTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleInputVert: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.InputsVertTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleInputFrag: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.InputsFragTag.Id, text ); + } + break; + } + } + + public void SetPropertyData( string[] properties ) + { + string body = string.Empty; + FillTemplateBody( -1, -1, TemplatesManager.TemplatePropertyTag, ref body, properties ); + SetPropertyData( body ); + } + + + public void SetPropertyData( string text ) + { + m_templateIdManager.SetReplacementText( m_propertyTag.Id, text ); + } + + public string GetSubShaderDataId( TemplateModuleDataType type, int subShaderId, bool addPrefix ) + { + if( subShaderId >= m_subShaders.Count ) + return string.Empty; + + string prefix = string.Empty; + switch( type ) + { + case TemplateModuleDataType.AllModules: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + TemplatesManager.TemplateAllModulesTag; + } + case TemplateModuleDataType.ModuleBlendMode: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendModeId; + } + case TemplateModuleDataType.ModuleBlendOp: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendOpId; + } + case TemplateModuleDataType.ModuleAlphaToMask: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.BlendData.AlphaToMaskId; + } + case TemplateModuleDataType.ModuleCullMode: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.CullModeData.CullModeId; + } + case TemplateModuleDataType.ModuleColorMask: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData.ColorMaskId; + } + case TemplateModuleDataType.ModuleStencil: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.StencilData.StencilBufferId; + } + case TemplateModuleDataType.ModuleZwrite: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZWriteModeId; + } + case TemplateModuleDataType.ModuleZTest: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZTestModeId; + } + case TemplateModuleDataType.ModuleZOffset: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.DepthData.OffsetId; + } + case TemplateModuleDataType.ModuleTag: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.TagData.TagsId; + } + case TemplateModuleDataType.ModuleGlobals: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.GlobalsTag.Id; + } + case TemplateModuleDataType.ModuleSRPBatcher: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.SRPBatcherTag.Id; + } + case TemplateModuleDataType.ModuleFunctions: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.FunctionsTag.Id; + } + case TemplateModuleDataType.ModulePragma: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.PragmaTag.Id; + } + case TemplateModuleDataType.ModulePragmaBefore: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.PragmaBeforeTag.Id; + } + case TemplateModuleDataType.ModulePass: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.PassTag.Id; + } + case TemplateModuleDataType.ModuleInputVert: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.InputsVertTag.Id; + } + case TemplateModuleDataType.ModuleInputFrag: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.InputsFragTag.Id; + } + } + return string.Empty; + + } + public string GetPassDataId( TemplateModuleDataType type, int subShaderId, int passId, bool addPrefix ) + { + if( subShaderId >= m_subShaders.Count || passId >= m_subShaders[ subShaderId ].Passes.Count ) + return string.Empty; + + string prefix = string.Empty; + switch( type ) + { + case TemplateModuleDataType.AllModules: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + TemplatesManager.TemplateAllModulesTag; + } + case TemplateModuleDataType.ModuleBlendMode: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendModeId; + } + case TemplateModuleDataType.ModuleBlendOp: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendOpId; + } + case TemplateModuleDataType.ModuleAlphaToMask: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.AlphaToMaskId; + } + case TemplateModuleDataType.ModuleCullMode: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.CullModeData.CullModeId; + } + case TemplateModuleDataType.ModuleColorMask: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData.ColorMaskId; + } + case TemplateModuleDataType.ModuleStencil: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.StencilData.StencilBufferId; + } + case TemplateModuleDataType.ModuleZwrite: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZWriteModeId; + } + case TemplateModuleDataType.ModuleZTest: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZTestModeId; + } + case TemplateModuleDataType.ModuleZOffset: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.OffsetId; + } + case TemplateModuleDataType.ModuleTag: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.TagData.TagsId; + } + case TemplateModuleDataType.ModuleGlobals: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.GlobalsTag.Id; + } + case TemplateModuleDataType.ModuleSRPBatcher: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.SRPBatcherTag.Id; + } + case TemplateModuleDataType.ModuleFunctions: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.FunctionsTag.Id; + } + case TemplateModuleDataType.ModulePragma: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PragmaTag.Id; + } + case TemplateModuleDataType.ModulePragmaBefore: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PragmaBeforeTag.Id; + } + case TemplateModuleDataType.ModulePass: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PassTag.Id; + } + case TemplateModuleDataType.ModuleInputVert: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsVertTag.Id; + } + case TemplateModuleDataType.ModuleInputFrag: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsFragTag.Id; + } + case TemplateModuleDataType.PassVertexFunction: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexFunctionData.Id; + } + case TemplateModuleDataType.PassFragmentFunction: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData.Id; + } + case TemplateModuleDataType.PassVertexData: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexDataContainer.VertexDataId; + } + case TemplateModuleDataType.PassInterpolatorData: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].InterpolatorDataContainer.InterpDataId; + } + case TemplateModuleDataType.VControl: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessVControlTag.Id; + } + case TemplateModuleDataType.ControlData: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessControlData.Id; + } + case TemplateModuleDataType.DomainData: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessDomainData.Id; + } + } + return string.Empty; + } + + public void SetPassData( TemplateModuleDataType type, int subShaderId, int passId, string[] list ) + { + //if( list == null || list.Length == 0 ) + // return; + + string id = GetPassDataId( type, subShaderId, passId, false ); + string body = string.Empty; + FillTemplateBody( subShaderId, passId, id, ref body, list ); + SetPassData( type, subShaderId, passId, body ); + } + + public void SetPassData( TemplateModuleDataType type, int subShaderId, int passId, List<PropertyDataCollector> list ) + { + //if( list == null || list.Count == 0 ) + // return; + + string id = GetPassDataId( type, subShaderId, passId, false ); + string body = string.Empty; + FillTemplateBody( subShaderId, passId, id, ref body, list ); + SetPassData( type, subShaderId, passId, body ); + } + + public void SetPassData( TemplateModuleDataType type, int subShaderId, int passId, string text ) + { + if( subShaderId >= m_subShaders.Count || passId >= m_subShaders[ subShaderId ].Passes.Count ) + return; + + string prefix = string.Empty; + switch( type ) + { + //case TemplateModuleDataType.EndPass: + //{ + // prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + // m_templateIdManager.SetReplacementText( prefix + TemplatesManager.TemplateEndPassTag, text ); + //} + //break; + case TemplateModuleDataType.AllModules: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + TemplatesManager.TemplateAllModulesTag, text ); + } + break; + case TemplateModuleDataType.ModuleShaderModel: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ShaderModel.Id, text ); + } + break; + case TemplateModuleDataType.ModuleBlendMode: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendModeId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendOp: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendOpId, text ); + } + break; + case TemplateModuleDataType.ModuleAlphaToMask: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.AlphaToMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleCullMode: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.CullModeData.CullModeId, text ); + } + break; + case TemplateModuleDataType.ModuleColorMask: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData.ColorMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleStencil: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.StencilData.StencilBufferId, text ); + } + break; + case TemplateModuleDataType.ModuleZwrite: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZWriteModeId, text ); + } + break; + case TemplateModuleDataType.ModuleZTest: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZTestModeId, text ); + } + break; + case TemplateModuleDataType.ModuleZOffset: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.OffsetId, text ); + } + break; + case TemplateModuleDataType.ModuleTag: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.TagData.TagsId, text ); + } + break; + case TemplateModuleDataType.ModuleGlobals: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.GlobalsTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleSRPBatcher: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.SRPBatcherTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleFunctions: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.FunctionsTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePragma: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PragmaTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePragmaBefore: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PragmaBeforeTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePass: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PassTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleInputVert: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsVertTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleInputFrag: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsFragTag.Id, text ); + } + break; + case TemplateModuleDataType.PassVertexFunction: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexFunctionData.Id, text ); + } + break; + case TemplateModuleDataType.PassFragmentFunction: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData.Id, text ); + } + break; + case TemplateModuleDataType.PassVertexData: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexDataContainer.VertexDataId, text ); + } + break; + case TemplateModuleDataType.PassInterpolatorData: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].InterpolatorDataContainer.InterpDataId, text ); + } + break; + case TemplateModuleDataType.PassNameData: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].PassNameContainer.Id, text ); + } + break; + case TemplateModuleDataType.VControl: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessVControlTag.Id, text ); + } + break; + case TemplateModuleDataType.ControlData: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessControlData.Id, text ); + } + break; + case TemplateModuleDataType.DomainData: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessDomainData.Id, text ); + } + break; + } + } + + public void SetPassInputData( int subShaderId, int passId, int inputId, string text ) + { + if( subShaderId >= m_subShaders.Count || + passId >= m_subShaders[ subShaderId ].Passes.Count ) + return; + + string prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + TemplateInputData inputData = m_subShaders[ subShaderId ].Passes[ passId ].InputDataFromId( inputId ); + if( inputData != null ) + { + m_templateIdManager.SetReplacementText( prefix + inputData.TagId, text ); + } + else + { + Debug.LogErrorFormat( "Unable to find input data for port with id {0} on subshader {1} pass {2}", inputId, subShaderId, passId ); + } + } + + public void SetPassInputDataByArrayIdx( int subShaderId, int passId, int inputId, string text ) + { + if( subShaderId >= m_subShaders.Count || + passId >= m_subShaders[ subShaderId ].Passes.Count || + inputId >= m_subShaders[ subShaderId ].Passes[ passId ].InputDataList.Count ) + return; + + string prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].InputDataList[ inputId ].TagId, text ); + } + + public TemplateData CreateTemplateData( string name, string guid, int subShaderId, int passId ) + { + if( subShaderId >= m_subShaders.Count || + passId >= m_subShaders[ subShaderId ].Passes.Count ) + return null; + + if( string.IsNullOrEmpty( name ) ) + name = m_defaultShaderName; + + TemplateData templateData = ScriptableObject.CreateInstance<TemplateData>(); + templateData.Name = name; + templateData.GUID = guid; + templateData.TemplateBody = m_shaderBody; + templateData.DefaultShaderName = m_defaultShaderName; + templateData.ShaderNameId = m_shaderNameId; + templateData.OrderId = m_orderId; + + templateData.InputDataList = SubShaders[ subShaderId ].Passes[ passId ].InputDataList; + templateData.VertexDataContainer = SubShaders[ subShaderId ].Passes[ passId ].VertexDataContainer; + templateData.InterpolatorDataContainer = SubShaders[ subShaderId ].Passes[ passId ].InterpolatorDataContainer; + templateData.AvailableShaderProperties = m_availableShaderProperties; + templateData.VertexFunctionData = SubShaders[ subShaderId ].Passes[ passId ].VertexFunctionData; + templateData.FragmentFunctionData = SubShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData; + templateData.BlendData = SubShaders[ subShaderId ].Passes[ passId ].Modules.BlendData; + templateData.CullModeData = SubShaders[ subShaderId ].Passes[ passId ].Modules.CullModeData; + templateData.ColorMaskData = SubShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData; + templateData.StencilData = SubShaders[ subShaderId ].Passes[ passId ].Modules.StencilData; + templateData.DepthData = SubShaders[ subShaderId ].Passes[ passId ].Modules.DepthData; + templateData.TagData = SubShaders[ subShaderId ].Passes[ passId ].Modules.TagData; + + //templateData.PropertyList = m_pr; + //private Dictionary<string, TemplateProperty> m_propertyDict = new Dictionary<string, TemplateProperty>(); + + return templateData; + } + + public bool FillTemplateBody( int subShaderId, int passId, string id, ref string body, List<PropertyDataCollector> values ) + { + if( values.Count == 0 ) + { + return true; + } + + string[] array = new string[ values.Count ]; + for( int i = 0; i < values.Count; i++ ) + { + array[ i ] = values[ i ].PropertyName; + } + return FillTemplateBody( subShaderId, passId, id, ref body, array ); + } + + public bool FillTemplateBody( int subShaderId, int passId, string id, ref string body, params string[] values ) + { + if( values.Length == 0 ) + { + if( id[ id.Length - 1 ] == '\n' ) + body = "\n"; + + return true; + } + + TemplatePropertyContainer propertyContainer = null; + if( subShaderId >= 0 ) + { + if( passId >= 0 ) + { + propertyContainer = SubShaders[ subShaderId ].Passes[ passId ].TemplateProperties; + } + else + { + propertyContainer = SubShaders[ subShaderId ].TemplateProperties; + } + } + else + { + propertyContainer = m_templateProperties; + } + + propertyContainer.BuildInfo(); + + if( propertyContainer.PropertyDict.ContainsKey( id ) ) + { + string finalValue = propertyContainer.PropertyDict[ id ].UseIndentationAtStart ? propertyContainer.PropertyDict[ id ].Indentation : string.Empty; + for( int i = 0; i < values.Length; i++ ) + { + + if( propertyContainer.PropertyDict[ id ].AutoLineFeed ) + { + string[] valuesArr = values[ i ].Split( '\n' ); + for( int j = 0; j < valuesArr.Length; j++ ) + { + //first value will be automatically indented by the string replace + finalValue += ( ( i == 0 && j == 0 ) ? string.Empty : propertyContainer.PropertyDict[ id ].Indentation ) + valuesArr[ j ]; + finalValue += TemplatesManager.TemplateNewLine; + } + } + else + { + //first value will be automatically indented by the string replace + finalValue += ( i == 0 ? string.Empty : propertyContainer.PropertyDict[ id ].Indentation ) + values[ i ]; + } + } + + body = finalValue; + propertyContainer.PropertyDict[ id ].Used = true; + return true; + } + + if( values.Length > 1 || !string.IsNullOrEmpty( values[ 0 ] ) ) + { + UIUtils.ShowMessage( string.Format( "Attempting to write data into inexistant tag {0}. Please review the template {1} body and consider adding the missing tag.", id, m_defaultShaderName ), MessageSeverity.Error ); + return false; + } + return true; + } + + public bool FillVertexInstructions( int subShaderId, int passId, params string[] values ) + { + TemplateFunctionData vertexFunctionData = SubShaders[ subShaderId ].Passes[ passId ].VertexFunctionData; + if( vertexFunctionData != null && !string.IsNullOrEmpty( vertexFunctionData.Id ) ) + { + string body = string.Empty; + bool isValid = FillTemplateBody( subShaderId, passId, vertexFunctionData.Id, ref body, values ); + SetPassData( TemplateModuleDataType.PassVertexFunction, subShaderId, passId, body ); + return isValid; + } + + if( values.Length > 0 ) + { + UIUtils.ShowMessage( "Attemping to add vertex instructions on a template with no assigned vertex code area", MessageSeverity.Error ); + return false; + } + return true; + } + + public bool FillFragmentInstructions( int subShaderId, int passId, params string[] values ) + { + TemplateFunctionData fragmentFunctionData = SubShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData; + if( fragmentFunctionData != null && !string.IsNullOrEmpty( fragmentFunctionData.Id ) ) + { + string body = string.Empty; + bool isValid = FillTemplateBody( subShaderId, passId, fragmentFunctionData.Id, ref body, values ); + SetPassData( TemplateModuleDataType.PassFragmentFunction, subShaderId, passId, body ); + return isValid; + } + + if( values.Length > 0 ) + { + UIUtils.ShowMessage( "Attemping to add fragment instructions on a template with no assigned vertex code area", MessageSeverity.Error ); + return false; + } + return true; + } + + public void SetShaderName( string name ) + { + m_templateIdManager.SetReplacementText( m_shaderNameId, name ); + } + + public void SetCustomInspector( string customInspector ) + { + if( m_customInspectorContainer.Index > -1 ) + { + m_templateIdManager.SetReplacementText( m_customInspectorContainer.Id, m_templateProperties.PropertyDict[ m_customInspectorContainer.Id ].Indentation + customInspector ); + } + } + + public void SetFallback( string fallback ) + { + if( m_fallbackContainer.Index > -1 ) + { + m_templateIdManager.SetReplacementText( m_fallbackContainer.Id, m_templateProperties.PropertyDict[ m_fallbackContainer.Id ].Indentation + fallback ); + } + } + + public void SetDependencies( string dependencies ) + { + if( m_dependenciesContainer.Index > -1 ) + { + m_templateIdManager.SetReplacementText( m_dependenciesContainer.Id, dependencies ); + } + } + + private void OnEnable() + { + hideFlags = HideFlags.HideAndDontSave; + } + + public override bool Reload() + { + m_propertyTag = null; + m_shaderNameId = string.Empty; + m_shaderBody = string.Empty; + m_isSinglePass = false; + m_masterNodesRequired = 0; + m_beforePragmaContainer.Reset(); + m_customInspectorContainer.Reset(); + m_fallbackContainer.Reset(); + m_dependenciesContainer.Reset(); + m_availableShaderProperties.Clear(); + int count = m_subShaders.Count; + for( int i = 0; i < count; i++ ) + { + m_subShaders[ i ].Destroy(); + } + m_subShaders.Clear(); + + m_templateIdManager.Reset(); + if( m_shaderData != null ) + m_shaderData.Destroy(); + + m_templateProperties.Reset(); + + string oldName = m_defaultShaderName; + LoadTemplateBody( m_guid ); + + if( m_communityTemplate ) + Name = m_defaultShaderName; + + return !oldName.Equals( m_defaultShaderName ); + } + + public bool GetSubShaderandPassFor( string passUniqueId, ref int subShaderId, ref int passId ) + { + if( string.IsNullOrEmpty( passUniqueId ) ) + return false; + + if( m_passUniqueIdData.Count == 0 ) + { + for( int subShaderIdx = 0; subShaderIdx < m_subShaders.Count; subShaderIdx++ ) + { + for( int passIdx = 0; passIdx < m_subShaders[ subShaderIdx ].Passes.Count; passIdx++ ) + { + if( m_subShaders[ subShaderIdx ].Passes[ passIdx ].Modules.HasPassUniqueName ) + { + if( m_passUniqueIdData.ContainsKey( m_subShaders[ subShaderIdx ].Passes[ passIdx ].Modules.PassUniqueName ) ) + { + Debug.LogErrorFormat( "Found duplicate pass name '{0}' over template. Please fix template as it will result in multiple errors.", m_subShaders[ subShaderIdx ].Passes[ passIdx ].Modules.PassUniqueName ); + return false; + } + m_passUniqueIdData.Add( m_subShaders[ subShaderIdx ].Passes[ passIdx ].Modules.PassUniqueName, new TemplateUniquePassData() { PassIdx = passIdx, SubShaderIdx = subShaderIdx } ); + } + } + } + } + + if( m_passUniqueIdData.ContainsKey( passUniqueId ) ) + { + subShaderId = m_passUniqueIdData[ passUniqueId ].SubShaderIdx; + passId = m_passUniqueIdData[ passUniqueId ].PassIdx; + return true; + } + subShaderId = -1; + passId = -1; + return false; + } + + public TemplateShaderPropertyData GetShaderPropertyData( string propertyName ) + { + return m_availableShaderProperties.Find( ( x ) => ( x.PropertyName.Equals( propertyName ) ) ); + } + + public TemplateSRPType SRPtype { get { return m_subShaders[ 0 ].Modules.SRPType; } } + //public bool SRPIsPBRHD { get { return m_subShaders[0].Modules.SRPIsPBRHD ; } } + public List<TemplateSubShader> SubShaders { get { return m_subShaders; } } + public List<TemplateShaderPropertyData> AvailableShaderProperties { get { return m_availableShaderProperties; } } + public TemplateTagData PropertyTag { get { return m_propertyTag; } } + public TemplateIdManager IdManager { get { return m_templateIdManager; } } + public TemplatePropertyContainer TemplateProperties { get { return m_templateProperties; } } + public TemplateInfoContainer CustomInspectorContainer { get { return m_customInspectorContainer; } } + public TemplateInfoContainer FallbackContainer { get { return m_fallbackContainer; } } + public TemplateInfoContainer BeforePragmaContainer { get { return m_beforePragmaContainer; } } + public bool IsSinglePass { get { return m_isSinglePass; } } + public int MasterNodesRequired { get { return m_masterNodesRequired; } } + public CustomTemplatePropertyUIEnum CustomTemplatePropertyUI { get { return m_customTemplatePropertyUI; } } + public bool CanAddLODs { get { return m_lodInjectorId > -1; } } + public TemplateShaderModelData GlobalShaderModel { get { return m_globalShaderModel; } } + } +} |