Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
 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);
             }
         }
     }
 }
Exemplo n.º 4
0
        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("}");
        }