public void CopyPortOptionsFrom(TemplateOptionsContainer container, string passName) { if (container == null || container.Options == null) { return; } List <TemplateOptionsItem> newItems = new List <TemplateOptionsItem>(); for (int i = 0; i < container.Options.Length; i++) { if (container.Options[i].Type == AseOptionsType.Port && container.Options[i].Id.Equals(passName)) { newItems.Add(container.Options[i]); } } if (newItems.Count > 0) { Enabled = true; if (Options == null) { Options = newItems.ToArray(); } else { Array.Resize <TemplateOptionsItem>(ref Options, Options.Length + newItems.Count); Array.Copy(newItems.ToArray(), Options, newItems.Count); } } newItems.Clear(); newItems = null; }
public void Destroy() { m_passNameContainer = null: #if CUSTOM_OPTIONS_AVAILABLE m_customOptionsContainer = null: #endif if( m_templateProperties != null ) m_templateProperties.Destroy(): m_templateProperties = null: if( m_modules != null ) m_modules.Destroy(): m_modules = null: if( m_inputDataList != null ) m_inputDataList.Clear(): m_inputDataList = null: if( m_inputDataDict != null ) m_inputDataDict.Clear(): m_inputDataDict = null: m_vertexFunctionData = null: m_fragmentFunctionData = null: if( m_vertexDataContainer != null ) m_vertexDataContainer.Destroy(): m_vertexDataContainer = null: if( m_interpolatorDataContainer != null ) m_interpolatorDataContainer.Destroy(): if( m_localVarsList != null ) { m_localVarsList.Clear(): m_localVarsList = null: } m_interpolatorDataContainer = null: if( m_availableShaderGlobals != null ) m_availableShaderGlobals.Clear(): m_availableShaderGlobals = null: }
public void Destroy() { m_LODContainer = null; m_customOptionsContainer = null; m_templateProperties.Destroy(); m_templateProperties = null; m_passes.Clear(); m_passes = null; m_modules.Destroy(); m_modules = null; m_availableShaderGlobals.Clear(); m_availableShaderGlobals = null; }
public TemplatePass(TemplateSubShader subShader, int subshaderIdx, int passIdx, TemplateIdManager idManager, string uniquePrefix, int offsetIdx, TemplatePassInfo passInfo, ref Dictionary <string, TemplateShaderPropertyData> duplicatesHelper) { m_idx = passIdx; m_uniquePrefix = uniquePrefix; idManager.RegisterPassId(passInfo.Data); m_isMainPass = passInfo.Data.Contains(TemplatesManager.TemplateMainPassTag); if (!m_isMainPass) { string id = string.Empty; int idIndex = 0; m_isInvisible = TemplateHelperFunctions.FetchInvisibleInfo(passInfo.Data, ref m_invisibleOptions, ref id, ref idIndex); if (m_isInvisible) { idManager.RegisterId(idIndex, uniquePrefix + id, id, true); } } FetchPassName(offsetIdx, passInfo.Data); if (m_passNameContainer.Index > -1) { idManager.RegisterId(m_passNameContainer.Index, uniquePrefix + m_passNameContainer.Id, m_passNameContainer.Id); } else { m_passNameContainer.Data = string.Format(DefaultPassNameStr, subshaderIdx, passIdx); } #if CUSTOM_OPTIONS_AVAILABLE m_customOptionsContainer = TemplateOptionsToolsHelper.GenerateOptionsContainer(false, passInfo.Data); if (m_customOptionsContainer.Enabled) { idManager.RegisterId(m_customOptionsContainer.Index, uniquePrefix + m_customOptionsContainer.Body, m_customOptionsContainer.Body, true); } //m_customOptionsContainer.CopyPortOptionsFrom( subShader.CustomOptionsContainer, m_passNameContainer.Data ); #endif m_modules = new TemplateModulesData(m_customOptionsContainer, idManager, m_templateProperties, uniquePrefix + "Module", offsetIdx, passInfo.Data, false); if (!m_modules.PassTag.IsValid) { m_modules.PassTag.StartIdx = passInfo.GlobalStartIdx; m_templateProperties.AddId(passInfo.Data, m_modules.PassTag.Id, passInfo.LocalStartIdx, false); //m_modules.PassTag.StartIdx -= m_templateProperties.PropertyDict[ m_modules.PassTag.Id ].Indentation.Length; //m_templateProperties.PropertyDict[ m_modules.PassTag.Id ].UseIndentationAtStart = false; idManager.RegisterId(m_modules.PassTag.StartIdx, m_modules.UniquePrefix + m_modules.PassTag.Id, string.Empty); } m_modules.SetPassUniqueNameIfUndefined(m_passNameContainer.Data); m_modules.SRPType = subShader.Modules.SRPType; if (m_modules.SRPType == TemplateSRPType.HD) { m_modules.SRPIsPBR = passInfo.Data.Contains(TemplateHelperFunctions.HDPBRTag); } Dictionary <string, TemplateShaderPropertyData> ownDuplicatesDict = new Dictionary <string, TemplateShaderPropertyData>(duplicatesHelper); TemplateHelperFunctions.CreateShaderGlobalsList(passInfo.Data, ref m_availableShaderGlobals, ref ownDuplicatesDict); // Vertex and Interpolator data FetchVertexAndInterpData(subShader.Modules, offsetIdx, passInfo.Data); if (m_vertexDataContainer != null) { idManager.RegisterId(m_vertexDataContainer.VertexDataStartIdx, uniquePrefix + m_vertexDataContainer.VertexDataId, m_vertexDataContainer.VertexDataId); } if (m_interpolatorDataContainer != null) { idManager.RegisterId(m_interpolatorDataContainer.InterpDataStartIdx, uniquePrefix + m_interpolatorDataContainer.InterpDataId, m_interpolatorDataContainer.InterpDataId); } //Fetch function code areas FetchCodeAreas(offsetIdx, TemplatesManager.TemplateVertexCodeBeginArea, MasterNodePortCategory.Vertex, passInfo.Data); if (m_vertexFunctionData != null) { idManager.RegisterId(m_vertexFunctionData.Position, uniquePrefix + m_vertexFunctionData.Id, m_vertexFunctionData.Id); } FetchCodeAreas(offsetIdx, TemplatesManager.TemplateFragmentCodeBeginArea, MasterNodePortCategory.Fragment, passInfo.Data); if (m_fragmentFunctionData != null) { idManager.RegisterId(m_fragmentFunctionData.Position, uniquePrefix + m_fragmentFunctionData.Id, m_fragmentFunctionData.Id); } //Fetching inputs, must be do if (m_fragmentFunctionData != null) { FetchInputs(offsetIdx, MasterNodePortCategory.Fragment, passInfo.Data); } if (m_vertexFunctionData != null) { FetchInputs(offsetIdx, MasterNodePortCategory.Vertex, passInfo.Data); } //Fetch local variables must be done after fetching code areas as it needs them to see is variable is on vertex or fragment TemplateHelperFunctions.FetchLocalVars(passInfo.Data, ref m_localVarsList, m_vertexFunctionData, m_fragmentFunctionData); int localVarCount = m_localVarsList.Count; if (localVarCount > 0) { idManager.RegisterTag(TemplatesManager.TemplateLocalVarTag); for (int i = 0; i < localVarCount; i++) { if (m_localVarsList[i].IsSpecialVar) { idManager.RegisterTag(m_localVarsList[i].Id); } } } int inputsCount = m_inputDataList.Count; for (int i = 0; i < inputsCount; i++) { if (m_inputDataList[i] != null) { idManager.RegisterId(m_inputDataList[i].TagGlobalStartIdx, uniquePrefix + m_inputDataList[i].TagId, m_inputDataList[i].TagId); } } //int passEndIndex = passInfo.Data.LastIndexOf( "}" ); //if( passEndIndex > 0 ) //{ // int identationIndex = -1; // for( int i = passEndIndex; i >= 0; i-- ) // { // if( passInfo.Data[ i ] == TemplatesManager.TemplateNewLine ) // { // identationIndex = i + 1; // break; // } // if( i == 0 ) // { // identationIndex = 0; // } // } // if( identationIndex > -1 ) // { // int length = passEndIndex - identationIndex; // string indentation = ( length > 0 ) ? passInfo.Data.Substring( identationIndex, length ) : string.Empty; // TemplateProperty templateProperty = new TemplateProperty( TemplatesManager.TemplateEndPassTag, indentation, false ); // m_templateProperties.AddId( templateProperty ); // idManager.RegisterId( offsetIdx + passEndIndex, uniquePrefix + TemplatesManager.TemplateEndPassTag, string.Empty ); // } //} ownDuplicatesDict.Clear(); ownDuplicatesDict = null; }
public TemplateSubShader( int subShaderIx, TemplateIdManager idManager, string uniquePrefix, TemplateSubShaderInfo subShaderInfo, ref Dictionary<string, TemplateShaderPropertyData> duplicatesHelper ) { m_idx = subShaderIx: m_uniquePrefix = uniquePrefix: FetchLOD( subShaderInfo.StartIdx, subShaderInfo.Modules ): if( m_LODContainer.Index > -1 ) { idManager.RegisterId( m_LODContainer.Index, uniquePrefix + "Module" + m_LODContainer.Id, m_LODContainer.Id ): } m_customOptionsContainer = TemplateOptionsToolsHelper.GenerateOptionsContainer( true, subShaderInfo.Data ): if( m_customOptionsContainer.Enabled ) { idManager.RegisterId( m_customOptionsContainer.Index, uniquePrefix + m_customOptionsContainer.Body, m_customOptionsContainer.Body, true ): } m_modules = new TemplateModulesData( m_customOptionsContainer, idManager, m_templateProperties, uniquePrefix + "Module", subShaderInfo.StartIdx, subShaderInfo.Modules, true ): if( m_modules.SRPType == TemplateSRPType.HD ) { m_modules.SRPIsPBR = subShaderInfo.Data.Contains( TemplateHelperFunctions.HDPBRTag ): } Dictionary<string, TemplateShaderPropertyData> ownDuplicatesDict = new Dictionary<string, TemplateShaderPropertyData>( duplicatesHelper ): TemplateHelperFunctions.CreateShaderGlobalsList( subShaderInfo.Modules, ref m_availableShaderGlobals, ref ownDuplicatesDict ): m_passAmount = subShaderInfo.Passes.Count: //if( !m_modules.PassTag.IsValid ) //{ // m_modules.PassTag.StartIdx = subShaderData.Passes[ 0 ].GlobalStartIdx: // m_templateProperties.AddId( subShaderData.Data, m_modules.PassTag.Id, subShaderData.Passes[ 0 ].LocalStartIdx, m_modules.PassTag.SearchIndentation ): // m_modules.PassTag.StartIdx -= m_templateProperties.PropertyDict[ m_modules.PassTag.Id ].Indentation.Length: // m_templateProperties.PropertyDict[ m_modules.PassTag.Id ].UseIndentationAtStart = true: // idManager.RegisterId( m_modules.PassTag.StartIdx, m_modules.UniquePrefix + m_modules.PassTag.Id, string.Empty ): //} int firstVisible = -1: int currAddedPassIdx = 0: for( int passIdx = 0: passIdx < m_passAmount: passIdx++ ) { TemplatePass newPass = new TemplatePass( this,subShaderIx, passIdx, idManager, uniquePrefix + "Pass" + passIdx, subShaderInfo.Passes[ passIdx ].GlobalStartIdx, subShaderInfo.Passes[ passIdx ], ref ownDuplicatesDict ): if( newPass.AddToList ) { if( newPass.IsMainPass && m_mainPass < 0 ) { m_mainPass = currAddedPassIdx: m_foundMainPassTag = true: } else if(!newPass.IsInvisible && firstVisible < 0 ) { firstVisible = currAddedPassIdx: } m_passes.Add( newPass ): currAddedPassIdx++: } else { newPass.Destroy(): newPass = null: } } if( m_mainPass < 0 ) { // If no main pass was set then choose the first visible one m_mainPass = ( firstVisible < 0 ) ? 0 : firstVisible: m_passes[ m_mainPass ].IsMainPass = true: } ownDuplicatesDict.Clear(): ownDuplicatesDict = null: }
public static TemplateOptionsContainer GenerateOptionsContainer(bool isSubShader, string data) { TemplateOptionsContainer optionsContainer = new TemplateOptionsContainer(); Match match = Regex.Match(data, isSubShader ? SubShaderOptionsMainPattern : PassOptionsMainPattern); optionsContainer.Enabled = match.Success; if (match.Success) { try { optionsContainer.Body = match.Value; optionsContainer.Index = match.Index; List <TemplateOptionsItem> optionItemsList = new List <TemplateOptionsItem>(); List <List <TemplateActionItem> > actionItemsList = new List <List <TemplateActionItem> >(); Dictionary <string, int> optionItemToIndex = new Dictionary <string, int>(); TemplateOptionsItem currentOption = null; //OPTIONS OVERALL SETUP string[] setupLines = match.Groups[1].Value.Split(':'); for (int i = 0; i < setupLines.Length; i++) { if (AseOptionsSetupDict.ContainsKey(setupLines[i])) { AseOptionsSetup setup = AseOptionsSetupDict[setupLines[i]]; switch (setup) { case AseOptionsSetup.CopyOptionsFromMainPass: optionsContainer.CopyOptionsFromMainPass = true; break; } } else { string[] args = setupLines[i].Split('='); if (args.Length > 1 && AseOptionsSetupDict.ContainsKey(args[0])) { AseOptionsSetup setup = AseOptionsSetupDict[args[0]]; switch (setup) { case AseOptionsSetup.Id: if (!int.TryParse(args[1], out optionsContainer.Id)) { optionsContainer.Id = -1; } break; case AseOptionsSetup.Name: optionsContainer.Name = args[1]; break; } } } } //AVAILABLE OPTIONS string body = match.Groups[2].Value.Replace("\t", string.Empty); string[] optionLines = body.Split('\n'); for (int oL = 0; oL < optionLines.Length; oL++) { string[] optionItems = optionLines[oL].Split(':'); if (optionItems.Length > 0) { string[] itemIds = optionItems[0].Split(OptionsDataSeparator); switch (itemIds[0]) { case "Option": { //Fills previous option with its actions //actionItemsList is cleared over here FillOptionAction(currentOption, ref actionItemsList); optionItemToIndex.Clear(); currentOption = new TemplateOptionsItem(); currentOption.Type = AseOptionsType.Option; string[] optionItemSetup = optionItems[1].Split(OptionsDataSeparator); currentOption.Name = optionItemSetup[0]; if (optionItemSetup.Length > 1) { if (AseOptionItemSetupDict.ContainsKey(optionItemSetup[1])) { currentOption.Setup = AseOptionItemSetupDict[optionItemSetup[1]]; } } currentOption.Id = itemIds.Length > 1 ? itemIds[1] : optionItems[1]; currentOption.DisplayOptions = optionItems[2].Split(OptionsDataSeparator); currentOption.DisableIdx = currentOption.DisplayOptions.Length; optionItems[2] += ",disable"; currentOption.Options = optionItems[2].Split(OptionsDataSeparator); currentOption.Count = currentOption.Options.Length; for (int opIdx = 0; opIdx < currentOption.Options.Length; opIdx++) { optionItemToIndex.Add(currentOption.Options[opIdx], opIdx); actionItemsList.Add(new List <TemplateActionItem>()); } if (optionItems.Length > 3) { currentOption.DefaultOption = optionItems[3]; } else { currentOption.DefaultOption = currentOption.Options[0]; } if (currentOption.Options.Length == 2 || (currentOption.Options.Length == 3 && currentOption.Options[2].Equals("disable"))) { if ((currentOption.Options[0].Equals("true") && currentOption.Options[1].Equals("false")) || (currentOption.Options[0].Equals("false") && currentOption.Options[1].Equals("true"))) { // Toggle 0 is false and 1 is true currentOption.Options[0] = "false"; currentOption.Options[1] = "true"; currentOption.UIWidget = AseOptionsUIWidget.Toggle; } } else if (currentOption.Options.Length > 2) { currentOption.UIWidget = AseOptionsUIWidget.Dropdown; } else { Debug.LogWarning("Detected an option with less than two items:" + optionItems[1]); } optionItemsList.Add(currentOption); } break; case "Port": { //Fills previous option with its actions //actionItemsList is cleared over here FillOptionAction(currentOption, ref actionItemsList); optionItemToIndex.Clear(); currentOption = new TemplateOptionsItem(); currentOption.Type = AseOptionsType.Port; if (isSubShader && optionItems.Length > 2) { currentOption.Id = optionItems[1]; currentOption.Name = optionItems[2]; } else { currentOption.Name = optionItems[1]; } currentOption.Options = new string[] { "On", "Off" }; optionItemToIndex.Add(currentOption.Options[0], 0); optionItemToIndex.Add(currentOption.Options[1], 1); actionItemsList.Add(new List <TemplateActionItem>()); actionItemsList.Add(new List <TemplateActionItem>()); optionItemsList.Add(currentOption); } break; default: { if (optionItemToIndex.ContainsKey(optionItems[0])) { int idx = 0; if (currentOption != null && currentOption.UIWidget == AseOptionsUIWidget.Toggle) { idx = (optionItems[0].Equals("true")) ? 1 : 0; if (optionItems[0].Equals("disable")) { idx = 2; } } else { idx = optionItemToIndex[optionItems[0]]; } actionItemsList[idx].Add(CreateActionItem(isSubShader, optionItems)); } else { //string[] ids = optionItems[ 0 ].Split( ',' ); if (itemIds.Length > 1) { for (int i = 0; i < itemIds.Length; i++) { if (optionItemToIndex.ContainsKey(itemIds[i])) { int idx = optionItemToIndex[itemIds[i]]; actionItemsList[idx].Add(CreateActionItem(isSubShader, optionItems)); } } } } } break; } } } //Fills last option with its actions FillOptionAction(currentOption, ref actionItemsList); actionItemsList.Clear(); actionItemsList = null; optionsContainer.Options = optionItemsList.ToArray(); optionItemsList.Clear(); optionItemsList = null; optionItemToIndex.Clear(); optionItemToIndex = null; } catch (Exception e) { Debug.LogException(e); } } return(optionsContainer); }
public void SetupCustomOptionsFromTemplate(TemplateMultiPassMasterNode owner, bool newTemplate) { TemplateOptionsContainer customOptionsContainer = m_isSubShader ? owner.SubShader.CustomOptionsContainer : owner.Pass.CustomOptionsContainer; if (!newTemplate && customOptionsContainer.Body.Length == m_passCustomOptionsSizeCheck) { for (int i = 0; i < m_passCustomOptionsUI.Count; i++) { if (m_passCustomOptionsUI[i].EmptyEvent) { if (m_isSubShader) { m_passCustomOptionsUI[i].OnActionPerformedEvt += owner.OnCustomSubShaderOptionSelected; } else { m_passCustomOptionsUI[i].OnActionPerformedEvt += owner.OnCustomPassOptionSelected; } } } return; } m_passCustomOptionsLabel = string.IsNullOrEmpty(customOptionsContainer.Name) ? CustomOptionsLabel : " " + customOptionsContainer.Name; for (int i = 0; i < m_passCustomOptionsUI.Count; i++) { m_passCustomOptionsUI[i].Destroy(); } m_passCustomOptionsUI.Clear(); m_passCustomOptionsUIDict.Clear(); m_passCustomOptionsPorts.Clear(); if (customOptionsContainer.Enabled) { m_passCustomOptionsSizeCheck = customOptionsContainer.Body.Length; for (int i = 0; i < customOptionsContainer.Options.Length; i++) { switch (customOptionsContainer.Options[i].Type) { case AseOptionsType.Option: { TemplateOptionUIItem item = new TemplateOptionUIItem(customOptionsContainer.Options[i]); if (m_isSubShader) { item.OnActionPerformedEvt += owner.OnCustomSubShaderOptionSelected; } else { item.OnActionPerformedEvt += owner.OnCustomPassOptionSelected; } m_passCustomOptionsUI.Add(item); m_passCustomOptionsUIDict.Add(customOptionsContainer.Options[i].Id, item); } break; case AseOptionsType.Port: { TemplateOptionPortItem item = new TemplateOptionPortItem(owner, customOptionsContainer.Options[i]); m_passCustomOptionsPorts.Add(item); //if( m_isSubShader ) //{ // if( string.IsNullOrEmpty( customOptionsContainer.Options[ i ].Id ) ) // { // //No pass name selected. inject on all passes // TemplateOptionPortItem item = new TemplateOptionPortItem( owner, customOptionsContainer.Options[ i ] ); // m_passCustomOptionsPorts.Add( item ); // } // else if( customOptionsContainer.Options[ i ].Id.Equals( owner.PassName ) ) // { // TemplateOptionPortItem item = new TemplateOptionPortItem( owner, customOptionsContainer.Options[ i ] ); // m_passCustomOptionsPorts.Add( item ); // } //} //else //{ // TemplateOptionPortItem item = new TemplateOptionPortItem( owner, customOptionsContainer.Options[ i ] ); // m_passCustomOptionsPorts.Add( item ); //} } break; } } } else { m_passCustomOptionsSizeCheck = 0; } }
public TemplateModulesData(TemplateOptionsContainer optionsContainer, TemplateIdManager idManager, TemplatePropertyContainer propertyContainer, string uniquePrefix, int offsetIdx, string subBody, bool isSubShader) { if (string.IsNullOrEmpty(subBody)) { return; } m_uniquePrefix = uniquePrefix; //PRAGMAS AND INCLUDES TemplateHelperFunctions.CreatePragmaIncludeList(subBody, m_includePragmaContainer); //COMMON TAGS ConfigureCommonTag(m_globalsTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody); ConfigureCommonTag(m_srpBatcherTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody); ConfigureCommonTag(m_functionsTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody); ConfigureCommonTag(m_pragmaTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody); ConfigureCommonTag(m_pragmaBeforeTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody); if (!TemplateHelperFunctions.GetPassUniqueId(m_passTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody, ref m_passUniqueName)) { ConfigureCommonTag(m_passTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody); } ConfigureCommonTag(m_inputsVertTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody); ConfigureCommonTag(m_inputsFragTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody); // If Options are enabled then remove them so they won't influence Regex matches if (optionsContainer.Enabled && optionsContainer.EndIndex > 0) { offsetIdx += optionsContainer.EndIndex; subBody = subBody.Substring(optionsContainer.EndIndex); } //BlEND MODE { Match blendModeMatch = Regex.Match(subBody, TemplateHelperFunctions.BlendModePattern1); if (blendModeMatch.Success) { int blendModeIdx = blendModeMatch.Index; int end = blendModeMatch.Length + blendModeIdx; string blendParams = subBody.Substring(blendModeIdx, end - blendModeIdx); m_blendData1.BlendModeId = blendParams; m_blendData1.BlendModeStartIndex = offsetIdx + blendModeIdx; idManager.RegisterId(m_blendData1.BlendModeStartIndex, uniquePrefix + m_blendData1.BlendModeId, m_blendData1.BlendModeId); TemplateHelperFunctions.CreateBlendMode(blendParams, ref m_blendData1, TemplateHelperFunctions.BlendModePattern1); if (m_blendData1.ValidBlendMode) { propertyContainer.AddId(subBody, blendParams, false); } } } { Match blendModeMatch = Regex.Match(subBody, TemplateHelperFunctions.BlendModePattern2); if (blendModeMatch.Success) { int blendModeIdx = blendModeMatch.Index; int end = blendModeMatch.Length + blendModeIdx; string blendParams = subBody.Substring(blendModeIdx, end - blendModeIdx); m_blendData2.BlendModeId = blendParams; m_blendData2.BlendModeStartIndex = offsetIdx + blendModeIdx; idManager.RegisterId(m_blendData2.BlendModeStartIndex, uniquePrefix + m_blendData2.BlendModeId, m_blendData2.BlendModeId); TemplateHelperFunctions.CreateBlendMode(blendParams, ref m_blendData2, TemplateHelperFunctions.BlendModePattern2); if (m_blendData2.ValidBlendMode) { propertyContainer.AddId(subBody, blendParams, false); } } } { Match blendModeMatch = Regex.Match(subBody, TemplateHelperFunctions.BlendModePattern3); if (blendModeMatch.Success) { int blendModeIdx = blendModeMatch.Index; int end = blendModeMatch.Length + blendModeIdx; string blendParams = subBody.Substring(blendModeIdx, end - blendModeIdx); m_blendData3.BlendModeId = blendParams; m_blendData3.BlendModeStartIndex = offsetIdx + blendModeIdx; idManager.RegisterId(m_blendData3.BlendModeStartIndex, uniquePrefix + m_blendData3.BlendModeId, m_blendData3.BlendModeId); TemplateHelperFunctions.CreateBlendMode(blendParams, ref m_blendData3, TemplateHelperFunctions.BlendModePattern3); if (m_blendData3.ValidBlendMode) { propertyContainer.AddId(subBody, blendParams, false); } } } { string pattern = TemplateHelperFunctions.BlendModePattern; Match blendModeMatch = Regex.Match(subBody, pattern); if (!blendModeMatch.Success && !m_blendData1.ValidBlendMode && !m_blendData2.ValidBlendMode && !m_blendData3.ValidBlendMode) { pattern = TemplateHelperFunctions.BlendModePatternFirst; blendModeMatch = Regex.Match(subBody, pattern); } if (blendModeMatch.Success) { int blendModeIdx = blendModeMatch.Index; int end = blendModeMatch.Length + blendModeIdx; string blendParams = subBody.Substring(blendModeIdx, end - blendModeIdx); m_blendData.BlendModeId = blendParams; m_blendData.BlendModeStartIndex = offsetIdx + blendModeIdx; idManager.RegisterId(m_blendData.BlendModeStartIndex, uniquePrefix + m_blendData.BlendModeId, m_blendData.BlendModeId); TemplateHelperFunctions.CreateBlendMode(blendParams, ref m_blendData, pattern); if (m_blendData.ValidBlendMode) { propertyContainer.AddId(subBody, blendParams, false); } } } //BLEND OP { Match blendOpMatch = Regex.Match(subBody, TemplateHelperFunctions.BlendOpPattern1); if (blendOpMatch.Success) { int blendOpIdx = blendOpMatch.Index; int end = blendOpMatch.Length + blendOpIdx; string blendOpParams = subBody.Substring(blendOpIdx, end - blendOpIdx); m_blendData1.BlendOpId = blendOpParams; m_blendData1.BlendOpStartIndex = offsetIdx + blendOpIdx; idManager.RegisterId(m_blendData1.BlendOpStartIndex, uniquePrefix + m_blendData1.BlendOpId, m_blendData1.BlendOpId); TemplateHelperFunctions.CreateBlendOp(blendOpParams, ref m_blendData1, TemplateHelperFunctions.BlendOpPattern1); if (m_blendData1.ValidBlendOp) { propertyContainer.AddId(subBody, blendOpParams, false); } } m_blendData1.DataCheck = (m_blendData1.ValidBlendMode || m_blendData1.ValidBlendOp) ? TemplateDataCheck.Valid : TemplateDataCheck.Invalid; } { Match blendOpMatch = Regex.Match(subBody, TemplateHelperFunctions.BlendOpPattern2); if (blendOpMatch.Success) { int blendOpIdx = blendOpMatch.Index; int end = blendOpMatch.Length + blendOpIdx; string blendOpParams = subBody.Substring(blendOpIdx, end - blendOpIdx); m_blendData2.BlendOpId = blendOpParams; m_blendData2.BlendOpStartIndex = offsetIdx + blendOpIdx; idManager.RegisterId(m_blendData2.BlendOpStartIndex, uniquePrefix + m_blendData2.BlendOpId, m_blendData2.BlendOpId); TemplateHelperFunctions.CreateBlendOp(blendOpParams, ref m_blendData2, TemplateHelperFunctions.BlendOpPattern2); if (m_blendData2.ValidBlendOp) { propertyContainer.AddId(subBody, blendOpParams, false); } } m_blendData2.DataCheck = (m_blendData2.ValidBlendMode || m_blendData2.ValidBlendOp) ? TemplateDataCheck.Valid : TemplateDataCheck.Invalid; } { Match blendOpMatch = Regex.Match(subBody, TemplateHelperFunctions.BlendOpPattern3); if (blendOpMatch.Success) { int blendOpIdx = blendOpMatch.Index; int end = blendOpMatch.Length + blendOpIdx; string blendOpParams = subBody.Substring(blendOpIdx, end - blendOpIdx); m_blendData3.BlendOpId = blendOpParams; m_blendData3.BlendOpStartIndex = offsetIdx + blendOpIdx; idManager.RegisterId(m_blendData3.BlendOpStartIndex, uniquePrefix + m_blendData3.BlendOpId, m_blendData3.BlendOpId); TemplateHelperFunctions.CreateBlendOp(blendOpParams, ref m_blendData3, TemplateHelperFunctions.BlendOpPattern3); if (m_blendData3.ValidBlendOp) { propertyContainer.AddId(subBody, blendOpParams, false); } } m_blendData3.DataCheck = (m_blendData3.ValidBlendMode || m_blendData3.ValidBlendOp) ? TemplateDataCheck.Valid : TemplateDataCheck.Invalid; } { string pattern = TemplateHelperFunctions.BlendOpPattern; Match blendOpMatch = Regex.Match(subBody, pattern); if (!blendOpMatch.Success && !m_blendData1.ValidBlendOp && !m_blendData2.ValidBlendOp && !m_blendData3.ValidBlendOp) { pattern = TemplateHelperFunctions.BlendOpPatternFirst; blendOpMatch = Regex.Match(subBody, pattern); } if (blendOpMatch.Success) { int blendOpIdx = blendOpMatch.Index; int end = blendOpMatch.Length + blendOpIdx; string blendOpParams = subBody.Substring(blendOpIdx, end - blendOpIdx); m_blendData.BlendOpId = blendOpParams; m_blendData.BlendOpStartIndex = offsetIdx + blendOpIdx; idManager.RegisterId(m_blendData.BlendOpStartIndex, uniquePrefix + m_blendData.BlendOpId, m_blendData.BlendOpId); TemplateHelperFunctions.CreateBlendOp(blendOpParams, ref m_blendData, pattern); if (m_blendData.ValidBlendOp) { propertyContainer.AddId(subBody, blendOpParams, false); } } m_blendData.DataCheck = (m_blendData.ValidBlendMode || m_blendData.ValidBlendOp) ? TemplateDataCheck.Valid : TemplateDataCheck.Invalid; } //ALPHA TO MASK { Match alphaToMaskMatch = Regex.Match(subBody, TemplateHelperFunctions.AlphaToMaskPattern); if (alphaToMaskMatch.Success) { int alphaIdx = alphaToMaskMatch.Index; int end = subBody.IndexOf(TemplatesManager.TemplateNewLine, alphaIdx); string alphaParams = subBody.Substring(alphaIdx, end - alphaIdx); m_alphaToMaskData.AlphaToMaskId = alphaParams; m_alphaToMaskData.StartIdx = offsetIdx + alphaIdx; idManager.RegisterId(m_alphaToMaskData.StartIdx, uniquePrefix + m_alphaToMaskData.AlphaToMaskId, m_alphaToMaskData.AlphaToMaskId); TemplateHelperFunctions.CreateAlphaToMask(alphaParams, ref m_alphaToMaskData); if (m_alphaToMaskData.DataCheck == TemplateDataCheck.Valid) { propertyContainer.AddId(subBody, alphaParams, false, string.Empty); } } } //CULL MODE { Match cullMatch = Regex.Match(subBody, TemplateHelperFunctions.CullWholeWordPattern); if (cullMatch.Success) { int cullIdx = cullMatch.Index; int end = subBody.IndexOf(TemplatesManager.TemplateNewLine, cullIdx); string cullParams = subBody.Substring(cullIdx, end - cullIdx); m_cullModeData.CullModeId = cullParams; m_cullModeData.StartIdx = offsetIdx + cullIdx; idManager.RegisterId(m_cullModeData.StartIdx, uniquePrefix + m_cullModeData.CullModeId, m_cullModeData.CullModeId); TemplateHelperFunctions.CreateCullMode(cullParams, ref m_cullModeData); if (m_cullModeData.DataCheck == TemplateDataCheck.Valid) { propertyContainer.AddId(subBody, cullParams, false, string.Empty); } } } //COLOR MASK { Match colorMaskMatch = Regex.Match(subBody, TemplateHelperFunctions.ColorMask1Pattern); if (colorMaskMatch.Success) { int colorMaskIdx = colorMaskMatch.Index; int end = colorMaskMatch.Length + colorMaskIdx; // subBody.IndexOf( TemplatesManager.TemplateNewLine, colorMaskIdx ); string colorMaskParams = subBody.Substring(colorMaskIdx, end - colorMaskIdx); m_colorMaskData1.ColorMaskId = colorMaskParams; m_colorMaskData1.StartIdx = offsetIdx + colorMaskIdx; idManager.RegisterId(m_colorMaskData1.StartIdx, uniquePrefix + m_colorMaskData1.ColorMaskId, m_colorMaskData1.ColorMaskId); TemplateHelperFunctions.CreateColorMask(colorMaskParams, ref m_colorMaskData1, TemplateHelperFunctions.ColorMask1Pattern); if (m_colorMaskData1.DataCheck == TemplateDataCheck.Valid) { propertyContainer.AddId(subBody, colorMaskParams, false); } } } { Match colorMaskMatch = Regex.Match(subBody, TemplateHelperFunctions.ColorMask2Pattern); if (colorMaskMatch.Success) { int colorMaskIdx = colorMaskMatch.Index; int end = colorMaskMatch.Length + colorMaskIdx; // subBody.IndexOf( TemplatesManager.TemplateNewLine, colorMaskIdx ); string colorMaskParams = subBody.Substring(colorMaskIdx, end - colorMaskIdx); m_colorMaskData2.ColorMaskId = colorMaskParams; m_colorMaskData2.StartIdx = offsetIdx + colorMaskIdx; idManager.RegisterId(m_colorMaskData2.StartIdx, uniquePrefix + m_colorMaskData2.ColorMaskId, m_colorMaskData2.ColorMaskId); TemplateHelperFunctions.CreateColorMask(colorMaskParams, ref m_colorMaskData2, TemplateHelperFunctions.ColorMask2Pattern); if (m_colorMaskData2.DataCheck == TemplateDataCheck.Valid) { propertyContainer.AddId(subBody, colorMaskParams, false); } } } { Match colorMaskMatch = Regex.Match(subBody, TemplateHelperFunctions.ColorMask3Pattern); if (colorMaskMatch.Success) { int colorMaskIdx = colorMaskMatch.Index; int end = colorMaskMatch.Length + colorMaskIdx; // subBody.IndexOf( TemplatesManager.TemplateNewLine, colorMaskIdx ); string colorMaskParams = subBody.Substring(colorMaskIdx, end - colorMaskIdx); m_colorMaskData3.ColorMaskId = colorMaskParams; m_colorMaskData3.StartIdx = offsetIdx + colorMaskIdx; idManager.RegisterId(m_colorMaskData3.StartIdx, uniquePrefix + m_colorMaskData3.ColorMaskId, m_colorMaskData3.ColorMaskId); TemplateHelperFunctions.CreateColorMask(colorMaskParams, ref m_colorMaskData3, TemplateHelperFunctions.ColorMask3Pattern); if (m_colorMaskData3.DataCheck == TemplateDataCheck.Valid) { propertyContainer.AddId(subBody, colorMaskParams, false); } } } { string pattern = TemplateHelperFunctions.ColorMaskPattern; Match colorMaskMatch = Regex.Match(subBody, pattern); if (!colorMaskMatch.Success && m_colorMaskData1.DataCheck == TemplateDataCheck.Invalid && m_colorMaskData2.DataCheck == TemplateDataCheck.Invalid && m_colorMaskData3.DataCheck == TemplateDataCheck.Invalid) { pattern = TemplateHelperFunctions.ColorMaskPatternFirst; colorMaskMatch = Regex.Match(subBody, pattern); } if (colorMaskMatch.Success) { int colorMaskIdx = colorMaskMatch.Index; int end = colorMaskMatch.Length + colorMaskIdx; //subBody.IndexOf( TemplatesManager.TemplateNewLine, colorMaskIdx ); string colorMaskParams = subBody.Substring(colorMaskIdx, end - colorMaskIdx); m_colorMaskData.ColorMaskId = colorMaskParams; m_colorMaskData.StartIdx = offsetIdx + colorMaskIdx; idManager.RegisterId(m_colorMaskData.StartIdx, uniquePrefix + m_colorMaskData.ColorMaskId, m_colorMaskData.ColorMaskId); TemplateHelperFunctions.CreateColorMask(colorMaskParams, ref m_colorMaskData, pattern); if (m_colorMaskData.DataCheck == TemplateDataCheck.Valid) { propertyContainer.AddId(subBody, colorMaskParams, false); } } } //STENCIL { Match stencilMatch = Regex.Match(subBody, TemplateHelperFunctions.StencilWholeWordPattern); if (stencilMatch.Success) { int stencilIdx = stencilMatch.Index; int stencilEndIdx = subBody.IndexOf("}", stencilIdx); if (stencilEndIdx > 0) { string stencilParams = subBody.Substring(stencilIdx, stencilEndIdx + 1 - stencilIdx); m_stencilData.StencilBufferId = stencilParams; m_stencilData.StartIdx = offsetIdx + stencilIdx; idManager.RegisterId(m_stencilData.StartIdx, uniquePrefix + m_stencilData.StencilBufferId, m_stencilData.StencilBufferId); TemplateHelperFunctions.CreateStencilOps(stencilParams, ref m_stencilData); if (m_stencilData.DataCheck == TemplateDataCheck.Valid) { propertyContainer.AddId(subBody, stencilParams, true); } } } else { int stencilTagIdx = subBody.IndexOf(TemplatesManager.TemplateStencilTag); if (stencilTagIdx > -1) { m_stencilData.SetIndependentDefault(); m_stencilData.StencilBufferId = TemplatesManager.TemplateStencilTag; m_stencilData.StartIdx = offsetIdx + stencilTagIdx; idManager.RegisterId(m_stencilData.StartIdx, uniquePrefix + m_stencilData.StencilBufferId, m_stencilData.StencilBufferId); propertyContainer.AddId(subBody, m_stencilData.StencilBufferId, true); } } } //ZWRITE { Match zWriteMatch = Regex.Match(subBody, TemplateHelperFunctions.ZWriteWholeWordPattern); if (zWriteMatch.Success) { int zWriteOpIdx = zWriteMatch.Index; int zWriteEndIdx = subBody.IndexOf(TemplatesManager.TemplateNewLine, zWriteOpIdx); if (zWriteEndIdx > 0) { m_depthData.ZWriteModeId = subBody.Substring(zWriteOpIdx, zWriteEndIdx + 1 - zWriteOpIdx); m_depthData.ZWriteStartIndex = offsetIdx + zWriteOpIdx; idManager.RegisterId(m_depthData.ZWriteStartIndex, uniquePrefix + m_depthData.ZWriteModeId, m_depthData.ZWriteModeId); TemplateHelperFunctions.CreateZWriteMode(m_depthData.ZWriteModeId, ref m_depthData); if (m_depthData.DataCheck == TemplateDataCheck.Valid) { propertyContainer.AddId(subBody, m_depthData.ZWriteModeId, true); } } } } //ZTEST { Match zTestMatch = Regex.Match(subBody, TemplateHelperFunctions.ZTestWholeWordPattern); if (zTestMatch.Success) { int zTestOpIdx = zTestMatch.Index; int zTestEndIdx = subBody.IndexOf(TemplatesManager.TemplateNewLine, zTestOpIdx); if (zTestEndIdx > 0) { m_depthData.ZTestModeId = subBody.Substring(zTestOpIdx, zTestEndIdx + 1 - zTestOpIdx); m_depthData.ZTestStartIndex = offsetIdx + zTestOpIdx; idManager.RegisterId(m_depthData.ZTestStartIndex, uniquePrefix + m_depthData.ZTestModeId, m_depthData.ZTestModeId); TemplateHelperFunctions.CreateZTestMode(m_depthData.ZTestModeId, ref m_depthData); if (m_depthData.DataCheck == TemplateDataCheck.Valid) { propertyContainer.AddId(subBody, m_depthData.ZTestModeId, true); } } } } //ZOFFSET { Match zOffsetMatch = Regex.Match(subBody, TemplateHelperFunctions.ZOffsetWholeWordPattern); if (zOffsetMatch.Success) { int zOffsetIdx = zOffsetMatch.Index; int zOffsetEndIdx = subBody.IndexOf(TemplatesManager.TemplateNewLine, zOffsetIdx); if (zOffsetEndIdx > 0) { m_depthData.OffsetId = subBody.Substring(zOffsetIdx, zOffsetEndIdx + 1 - zOffsetIdx); m_depthData.OffsetStartIndex = offsetIdx + zOffsetIdx; idManager.RegisterId(m_depthData.OffsetStartIndex, uniquePrefix + m_depthData.OffsetId, m_depthData.OffsetId); TemplateHelperFunctions.CreateZOffsetMode(m_depthData.OffsetId, ref m_depthData); if (m_depthData.DataCheck == TemplateDataCheck.Valid) { propertyContainer.AddId(subBody, m_depthData.OffsetId, true); } } } m_depthData.SetDataCheck(); } //TAGS { Match tagsMatch = Regex.Match(subBody, TemplateHelperFunctions.TagsWholeWordPattern); if (tagsMatch.Success) { int tagsIdx = tagsMatch.Index; int tagsEndIdx = subBody.IndexOf("}", tagsIdx); if (tagsEndIdx > -1) { m_tagData.Reset(); m_tagData.TagsId = subBody.Substring(tagsIdx, tagsEndIdx + 1 - tagsIdx); m_tagData.StartIdx = offsetIdx + tagsIdx; idManager.RegisterId(m_tagData.StartIdx, uniquePrefix + m_tagData.TagsId, m_tagData.TagsId); m_srpType = TemplateHelperFunctions.CreateTags(ref m_tagData, isSubShader); propertyContainer.AddId(subBody, m_tagData.TagsId, false); m_tagData.DataCheck = TemplateDataCheck.Valid; } else { m_tagData.DataCheck = TemplateDataCheck.Invalid; } } else { m_tagData.DataCheck = TemplateDataCheck.Invalid; } } //SHADER MODEL { Match match = Regex.Match(subBody, TemplateHelperFunctions.ShaderModelPattern); if (match != null && match.Groups.Count > 1) { if (TemplateHelperFunctions.AvailableInterpolators.ContainsKey(match.Groups[1].Value)) { m_shaderModel.Id = match.Groups[0].Value; m_shaderModel.StartIdx = offsetIdx + match.Index; m_shaderModel.Value = match.Groups[1].Value; m_shaderModel.InterpolatorAmount = TemplateHelperFunctions.AvailableInterpolators[match.Groups[1].Value]; m_shaderModel.DataCheck = TemplateDataCheck.Valid; idManager.RegisterId(m_shaderModel.StartIdx, uniquePrefix + m_shaderModel.Id, m_shaderModel.Id); } else { m_shaderModel.DataCheck = TemplateDataCheck.Invalid; } } } // ALL MODULES int allModulesIndex = subBody.IndexOf(TemplatesManager.TemplateAllModulesTag); if (allModulesIndex > 0) { //ONLY REGISTER MISSING TAGS ConfigureCommonTag(m_allModulesTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody); m_allModulesMode = true; m_blendData.SetAllModulesDefault(); if (!m_alphaToMaskData.IsValid) { m_alphaToMaskData.SetAllModulesDefault(); } if (!m_cullModeData.IsValid) { m_cullModeData.SetAllModulesDefault(); } if (!m_colorMaskData.IsValid) { m_colorMaskData.SetAllModulesDefault(); } if (!m_stencilData.IsValid) { m_stencilData.SetAllModulesDefault(); } if (!m_depthData.IsValid) { m_depthData.SetAllModulesDefault(); } if (!m_shaderModel.IsValid) { m_shaderModel.SetAllModulesDefault(); } } }