コード例 #1
0
            public override void Visit(EffectBlock effectBlock)
            {
                HasMixin = true;

                // Create a context associated with ShaderBlock
                currentContext = new ShaderBlockContext();
                effectBlock.SetTag(BlockContextTag, currentContext);

                foreach (Statement statement in effectBlock.Body.Statements)
                {
                    VisitDynamic(statement);
                }
                currentContext = null;
            }
コード例 #2
0
        /// <summary>
        /// Visits the specified shader block.
        /// </summary>
        /// <param name="effectBlock">The shader block.</param>
        public override void Visit(EffectBlock effectBlock)
        {
            WriteLinkLine(effectBlock);
            currentBlock = effectBlock;

            VariableAsParameterKey = false;

            // Clear ParameterKey and Mixin references
            parameterKeysReferenced.Clear();
            mixinsReferenced.Clear();

            // Use a single internal class for all shader mixins
            Write("internal static partial class ShaderMixins");
            {
                OpenBrace();
                Write("internal partial class");
                Write(" ");
                Write(effectBlock.Name);
                WriteSpace();
                Write(" : IShaderMixinBuilder");
                {
                    OpenBrace();
                    // Generate the main generate method for each shader block
                    Write("public void Generate(ShaderMixinSource mixin, ShaderMixinContext context)");
                    {
                        OpenBrace();
                        // Create a context associated with ShaderBlock
                        foreach (Statement statement in effectBlock.Body.Statements)
                        {
                            VisitDynamic(statement);
                        }
                        CloseBrace();
                    }

                    WriteLine();
                    WriteLine("[ModuleInitializer]");
                    WriteLine("internal static void __Initialize__()");
                    {
                        OpenBrace();
                        Write("ShaderMixinManager.Register(\"").Write(effectBlock.Name).Write("\", new ").Write(effectBlock.Name).WriteLine("());");
                        CloseBrace();
                    }
                    CloseBrace();
                }
                CloseBrace();
            }
    
            VariableAsParameterKey = true;
            currentBlock = null;
        }