public static TemplateShaderInfo CreateShaderData(string body) { int nameBegin = body.IndexOf(TemplatesManager.TemplateShaderNameBeginTag); if (nameBegin < 0) { // Not a template return(null); } TemplateShaderInfo shaderData = null; //SHADER MatchCollection shaderMatch = Regex.Matches(body, "\\bShader\\b"); if (shaderMatch.Count > 0) { //SUBSHADER MatchCollection subShaderMatch = Regex.Matches(body, TemplatesManager.TemplateMPSubShaderTag); int subShaderAmount = subShaderMatch.Count; if (subShaderAmount > 0) { shaderData = new TemplateShaderInfo(); shaderData.Body = body; int length = subShaderMatch[0].Index - shaderMatch[0].Groups[0].Index; shaderData.Properties = body.Substring(shaderMatch[0].Index, length); shaderData.PropertyStartIdx = body.IndexOf(TemplatesManager.TemplatePropertyTag); for (int subShaderIdx = 0; subShaderIdx < subShaderAmount; subShaderIdx++) { TemplateSubShaderInfo subShaderData = new TemplateSubShaderInfo(); int subshaderBeginIndex = subShaderMatch[subShaderIdx].Index; int subShaderEndIndex = (subShaderIdx == (subShaderAmount - 1)) ? body.Length - 1 : subShaderMatch[subShaderIdx + 1].Index; subShaderData.Data = body.Substring(subshaderBeginIndex, subShaderEndIndex - subshaderBeginIndex); subShaderData.StartIdx = subshaderBeginIndex; //PASS MatchCollection passMatch = Regex.Matches(subShaderData.Data, TemplatesManager.TemplateMPPassTag); int passCount = passMatch.Count; if (passCount > 0) { subShaderData.Modules = subShaderData.Data.Substring(0, passMatch[0].Index); for (int passIdx = 0; passIdx < passCount; passIdx++) { int passBeginIndex = passMatch[passIdx].Index; int passEndIdx = (passIdx == (passCount - 1)) ? subShaderData.Data.Length - 1 : passMatch[passIdx + 1].Index; TemplatePassInfo passData = new TemplatePassInfo(); passData.Data = subShaderData.Data.Substring(passBeginIndex, passEndIdx - passBeginIndex); passData.GlobalStartIdx = subshaderBeginIndex + passBeginIndex; passData.LocalStartIdx = passBeginIndex; subShaderData.Passes.Add(passData); } shaderData.SubShaders.Add(subShaderData); } } } } return(shaderData); }
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 TemplatePass(int subshaderIdx, int passIdx, TemplateIdManager idManager, string uniquePrefix, int offsetIdx, TemplatePassInfo passInfo, ref Dictionary <string, TemplateShaderPropertyData> duplicatesHelper) { m_idx = passIdx; m_uniquePrefix = uniquePrefix; m_isMainPass = passInfo.Data.Contains(TemplatesManager.TemplateMainPassTag); if (!m_isMainPass) { m_isInvisible = passInfo.Data.Contains(TemplatesManager.TemplateExcludeFromGraphTag); } 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); } m_modules = new TemplateModulesData(idManager, m_templateProperties, uniquePrefix + "Module", offsetIdx, passInfo.Data, false); Dictionary <string, TemplateShaderPropertyData> ownDuplicatesDict = new Dictionary <string, TemplateShaderPropertyData>(duplicatesHelper); TemplateHelperFunctions.CreateShaderGlobalsList(passInfo.Data, ref m_availableShaderGlobals, ref ownDuplicatesDict); // Vertex and Interpolator data FetchVertexAndInterpData(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); } } ownDuplicatesDict.Clear(); ownDuplicatesDict = null; }
public static TemplateShaderInfo CreateShaderData( string body ) { int nameBegin = body.IndexOf( TemplatesManager.TemplateShaderNameBeginTag ): if( nameBegin < 0 ) { // Not a template return null: } TemplateShaderInfo shaderData = null: //SHADER MatchCollection shaderMatch = Regex.Matches( body, "\\bShader\\b" ): if( shaderMatch.Count > 0 ) { //SUBSHADER MatchCollection subShaderMatch = Regex.Matches( body, TemplatesManager.TemplateMPSubShaderTag ): int subShaderAmount = subShaderMatch.Count: if( subShaderAmount > 0 ) { shaderData = new TemplateShaderInfo(): shaderData.Body = body: int length = subShaderMatch[ 0 ].Index - shaderMatch[ 0 ].Groups[ 0 ].Index: shaderData.Properties = body.Substring( shaderMatch[ 0 ].Index, length ): shaderData.PropertyStartIdx = body.IndexOf( TemplatesManager.TemplatePropertyTag ): for( int subShaderIdx = 0: subShaderIdx < subShaderAmount: subShaderIdx++ ) { TemplateSubShaderInfo subShaderData = new TemplateSubShaderInfo(): int subshaderBeginIndex = subShaderMatch[ subShaderIdx ].Index: int subShaderEndIndex = ( subShaderIdx == ( subShaderAmount - 1 ) ) ? body.Length - 1 : subShaderMatch[ subShaderIdx + 1 ].Index: subShaderData.Data = body.Substring( subshaderBeginIndex, subShaderEndIndex - subshaderBeginIndex ): subShaderData.StartIdx = subshaderBeginIndex: //PASS MatchCollection passMatch = Regex.Matches( subShaderData.Data, TemplatesManager.TemplatePassTagPattern ): if( passMatch.Count == 0 ) { passMatch = Regex.Matches( subShaderData.Data, TemplatesManager.TemplateMPPassTag ): } int passCount = passMatch.Count: if( passCount > 0 ) { int lastPassIndex = subShaderData.Data.LastIndexOf( TemplatesManager.TemplatePassesEndTag ): if( lastPassIndex < 0 ) { lastPassIndex = subShaderData.Data.Length - 1: } subShaderData.Modules = subShaderData.Data.Substring( 0, passMatch[ 0 ].Index ): for( int passIdx = 0: passIdx < passCount: passIdx++ ) { int passBeginIndex = passMatch[ passIdx ].Index: int passEndIdx = ( passIdx == ( passCount - 1 ) ) ? lastPassIndex : passMatch[ passIdx + 1 ].Index: TemplatePassInfo passData = new TemplatePassInfo(): passData.Data = subShaderData.Data.Substring( passBeginIndex, passEndIdx - passBeginIndex ): passData.GlobalStartIdx = subshaderBeginIndex + passBeginIndex: passData.LocalStartIdx = passBeginIndex: subShaderData.Passes.Add( passData ): } shaderData.SubShaders.Add( subShaderData ): } } } } return shaderData: }