static void StatementBlockProcessor(StringBuilder stringBuilder, StatementBlockExpression expression, ShaderMetadata metadata, int depth = 0) { foreach (var element in expression.ConstituentSymbols) { stringBuilder.Append(Environment.NewLine); stringBuilder.AppendTab(depth); if (element is StatementExpression || element is ClipStatementExpression || element is ReturnStatementExpression || element is BreakStatementExpression || element is ContinueStatementExpression || element is DiscardStatementExpression) { CommonProcessor(stringBuilder, element.ConstituentSymbols, metadata); } else if (element is IfStatementExpression) { IfStatementProcessor(stringBuilder, element as IfStatementExpression, metadata, depth); } else if (element is ForStatementExpression) { ForStatementProcessor(stringBuilder, element as ForStatementExpression, metadata, depth); } } }
static void GetExtendedFunctionsFrom(FunctionExpression function, List <FunctionExpression> functionCollection, ref List <FunctionExpression> extendedFunctions, ref List <string> usageProcedures) { StatementBlockExpression result = function.ConstituentSymbols.Find(s => s is StatementBlockExpression) as StatementBlockExpression; if (result != null) { GetExtendedFunctionsFrom(result, functionCollection, ref extendedFunctions, ref usageProcedures); } }
static void GetExtendedFunctionsFrom(StatementBlockExpression statementBlock, List <FunctionExpression> functionCollection, ref List <FunctionExpression> extendedFunctions, ref List <string> usageProcedures) { foreach (var element in statementBlock.ConstituentSymbols) { if (element is StatementExpression) { GetExtendedFunctionsFrom(element as Symbol, functionCollection, ref extendedFunctions, ref usageProcedures); } else if (element is StatementBlockExpression) { GetExtendedFunctionsFrom(element as StatementBlockExpression, functionCollection, ref extendedFunctions, ref usageProcedures); } else if (element is IfStatementExpression || element is ForStatementExpression) { var statementBlocks = element.ConstituentSymbols.FindAll(e => e is StatementBlockExpression); foreach (var s in statementBlocks) { GetExtendedFunctionsFrom(s as StatementBlockExpression, functionCollection, ref extendedFunctions, ref usageProcedures); } } } }
static void FunctionProcessor(StringBuilder stringBuilder, FunctionExpression expression, ShaderMetadata metadata) { // Write type stringBuilder.Append(expression.ConstituentSymbols[0].ToString()); // Write name stringBuilder.Append(" "); stringBuilder.Append(expression.ConstituentSymbols[1].ToString()); // Begin arguments stringBuilder.Append("("); // Write arguments ArgumentExpression argumentExpression = expression.ConstituentSymbols[3] as ArgumentExpression; if (argumentExpression != null && argumentExpression.ConstituentSymbols.Count > 0) { for (int i = 0; i < argumentExpression.ConstituentSymbols.Count; i += 3) { // Write type stringBuilder.Append(argumentExpression.ConstituentSymbols[i].ToString()); // Write name stringBuilder.Append(" "); stringBuilder.Append(argumentExpression.ConstituentSymbols[i + 1].ToString()); if (i + 3 < argumentExpression.ConstituentSymbols.Count) { stringBuilder.Append(", "); } } } // End arguments stringBuilder.Append(")"); // Checking has return semantic for entry point function only Colon doubleDotExpression = expression.ConstituentSymbols[5] as Colon; if (doubleDotExpression != null && metadata.EntryPoint == expression) { stringBuilder.Append(" : "); string returnSemantic = expression.ConstituentSymbols[6].ToString(); if (returnSemantic.StartsWith("POSITION", StringComparison.InvariantCulture)) { stringBuilder.Append(returnSemantic.Replace("POSITION", "SV_POSITION")); } if (returnSemantic.StartsWith("COLOR", StringComparison.InvariantCulture)) { stringBuilder.Append(returnSemantic.Replace("COLOR", "SV_TARGET")); } } // Begin statement block stringBuilder.Append(Environment.NewLine); stringBuilder.Append("{"); // Write statement block StatementBlockExpression statementBlockExpression = doubleDotExpression == null ? expression.ConstituentSymbols[6] as StatementBlockExpression : expression.ConstituentSymbols[8] as StatementBlockExpression; StatementBlockProcessor(stringBuilder, statementBlockExpression, metadata, 1); // End statement block stringBuilder.Append(Environment.NewLine); stringBuilder.Append("}"); }