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; }
/// <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; }