コード例 #1
0
        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;
        }
コード例 #2
0
		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:
		}
コード例 #3
0
ファイル: TemplateSubShader.cs プロジェクト: EGSP/Flappy-Bird
        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;
        }
コード例 #4
0
ファイル: TemplatePass.cs プロジェクト: EGSP/Flappy-Bird
        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;
        }
コード例 #5
0
		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:
		}
コード例 #6
0
        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);
        }
コード例 #7
0
        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;
            }
        }
コード例 #8
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();
                }
            }
        }