// Generated by TinyPG v1.3 available at www.codeproject.com using System; using System.Collections.Generic; using System.Text; using System.Xml.Serialization; using Microsoft.Xna.Framework.Graphics; namespace TwoMGFX.TPGParser { #region ParseTree [Serializable] public class ParseErrors : List { } [Serializable] public class ParseError { private string file; private string message; private int code; private int line; private int col; private int pos; private int length; public string File { get { return file; } } public int Code { get { return code; } } public int Line { get { return line; } } public int Column { get { return col; } } public int Position { get { return pos; } } public int Length { get { return length; } } public string Message { get { return message; } } // just for the sake of serialization public ParseError() { } public ParseError(string message, int code, ParseNode node) : this(message, code, node.Token) { } public ParseError(string message, int code, Token token) : this(message, code, token.File, token.Line, token.Column, token.StartPos, token.Length) { } public ParseError(string message, int code) : this(message, code, string.Empty, 0, 0, 0, 0) { } public ParseError(string message, int code, string file, int line, int col, int pos, int length) { this.file = file; this.message = message; this.code = code; this.line = line; this.col = col; this.pos = pos; this.length = length; } } // rootlevel of the node tree [Serializable] public partial class ParseTree : ParseNode { public ParseErrors Errors; public List Skipped; public ParseTree() : base(new Token(), "ParseTree") { Token.Type = TokenType.Start; Token.Text = "Root"; Errors = new ParseErrors(); } public string PrintTree() { StringBuilder sb = new StringBuilder(); int indent = 0; PrintNode(sb, this, indent); return sb.ToString(); } private void PrintNode(StringBuilder sb, ParseNode node, int indent) { string space = "".PadLeft(indent, ' '); sb.Append(space); sb.AppendLine(node.Text); foreach (ParseNode n in node.Nodes) PrintNode(sb, n, indent + 2); } /// /// this is the entry point for executing and evaluating the parse tree. /// /// additional optional input parameters /// the output of the evaluation function public object Eval(params object[] paramlist) { return Nodes[0].Eval(this, paramlist); } } [Serializable] [XmlInclude(typeof(ParseTree))] public partial class ParseNode { protected string text; protected List nodes; public List Nodes { get {return nodes;} } [XmlIgnore] // avoid circular references when serializing public ParseNode Parent; public Token Token; // the token/rule [XmlIgnore] // skip redundant text (is part of Token) public string Text { // text to display in parse tree get { return text;} set { text = value; } } public virtual ParseNode CreateNode(Token token, string text) { ParseNode node = new ParseNode(token, text); node.Parent = this; return node; } protected ParseNode(Token token, string text) { this.Token = token; this.text = text; this.nodes = new List(); } protected object GetValue(ParseTree tree, TokenType type, int index) { return GetValue(tree, type, ref index); } protected object GetValue(ParseTree tree, TokenType type, ref int index) { object o = null; if (index < 0) return o; // left to right foreach (ParseNode node in nodes) { if (node.Token.Type == type) { index--; if (index < 0) { o = node.Eval(tree); break; } } } return o; } /// /// this implements the evaluation functionality, cannot be used directly /// /// the parsetree itself /// optional input parameters /// a partial result of the evaluation internal object Eval(ParseTree tree, params object[] paramlist) { object Value = null; switch (Token.Type) { case TokenType.Start: Value = EvalStart(tree, paramlist); break; case TokenType.Technique_Declaration: Value = EvalTechnique_Declaration(tree, paramlist); break; case TokenType.FillMode_Solid: Value = EvalFillMode_Solid(tree, paramlist); break; case TokenType.FillMode_WireFrame: Value = EvalFillMode_WireFrame(tree, paramlist); break; case TokenType.FillModes: Value = EvalFillModes(tree, paramlist); break; case TokenType.CullMode_None: Value = EvalCullMode_None(tree, paramlist); break; case TokenType.CullMode_Cw: Value = EvalCullMode_Cw(tree, paramlist); break; case TokenType.CullMode_Ccw: Value = EvalCullMode_Ccw(tree, paramlist); break; case TokenType.CullModes: Value = EvalCullModes(tree, paramlist); break; case TokenType.Colors_None: Value = EvalColors_None(tree, paramlist); break; case TokenType.Colors_Red: Value = EvalColors_Red(tree, paramlist); break; case TokenType.Colors_Green: Value = EvalColors_Green(tree, paramlist); break; case TokenType.Colors_Blue: Value = EvalColors_Blue(tree, paramlist); break; case TokenType.Colors_Alpha: Value = EvalColors_Alpha(tree, paramlist); break; case TokenType.Colors_All: Value = EvalColors_All(tree, paramlist); break; case TokenType.Colors_Boolean: Value = EvalColors_Boolean(tree, paramlist); break; case TokenType.Colors: Value = EvalColors(tree, paramlist); break; case TokenType.ColorsMasks: Value = EvalColorsMasks(tree, paramlist); break; case TokenType.Blend_Zero: Value = EvalBlend_Zero(tree, paramlist); break; case TokenType.Blend_One: Value = EvalBlend_One(tree, paramlist); break; case TokenType.Blend_SrcColor: Value = EvalBlend_SrcColor(tree, paramlist); break; case TokenType.Blend_InvSrcColor: Value = EvalBlend_InvSrcColor(tree, paramlist); break; case TokenType.Blend_SrcAlpha: Value = EvalBlend_SrcAlpha(tree, paramlist); break; case TokenType.Blend_InvSrcAlpha: Value = EvalBlend_InvSrcAlpha(tree, paramlist); break; case TokenType.Blend_DestAlpha: Value = EvalBlend_DestAlpha(tree, paramlist); break; case TokenType.Blend_InvDestAlpha: Value = EvalBlend_InvDestAlpha(tree, paramlist); break; case TokenType.Blend_DestColor: Value = EvalBlend_DestColor(tree, paramlist); break; case TokenType.Blend_InvDestColor: Value = EvalBlend_InvDestColor(tree, paramlist); break; case TokenType.Blend_SrcAlphaSat: Value = EvalBlend_SrcAlphaSat(tree, paramlist); break; case TokenType.Blend_BlendFactor: Value = EvalBlend_BlendFactor(tree, paramlist); break; case TokenType.Blend_InvBlendFactor: Value = EvalBlend_InvBlendFactor(tree, paramlist); break; case TokenType.Blends: Value = EvalBlends(tree, paramlist); break; case TokenType.BlendOp_Add: Value = EvalBlendOp_Add(tree, paramlist); break; case TokenType.BlendOp_Subtract: Value = EvalBlendOp_Subtract(tree, paramlist); break; case TokenType.BlendOp_RevSubtract: Value = EvalBlendOp_RevSubtract(tree, paramlist); break; case TokenType.BlendOp_Min: Value = EvalBlendOp_Min(tree, paramlist); break; case TokenType.BlendOp_Max: Value = EvalBlendOp_Max(tree, paramlist); break; case TokenType.BlendOps: Value = EvalBlendOps(tree, paramlist); break; case TokenType.CmpFunc_Never: Value = EvalCmpFunc_Never(tree, paramlist); break; case TokenType.CmpFunc_Less: Value = EvalCmpFunc_Less(tree, paramlist); break; case TokenType.CmpFunc_Equal: Value = EvalCmpFunc_Equal(tree, paramlist); break; case TokenType.CmpFunc_LessEqual: Value = EvalCmpFunc_LessEqual(tree, paramlist); break; case TokenType.CmpFunc_Greater: Value = EvalCmpFunc_Greater(tree, paramlist); break; case TokenType.CmpFunc_NotEqual: Value = EvalCmpFunc_NotEqual(tree, paramlist); break; case TokenType.CmpFunc_GreaterEqual: Value = EvalCmpFunc_GreaterEqual(tree, paramlist); break; case TokenType.CmpFunc_Always: Value = EvalCmpFunc_Always(tree, paramlist); break; case TokenType.CmpFunc: Value = EvalCmpFunc(tree, paramlist); break; case TokenType.StencilOp_Keep: Value = EvalStencilOp_Keep(tree, paramlist); break; case TokenType.StencilOp_Zero: Value = EvalStencilOp_Zero(tree, paramlist); break; case TokenType.StencilOp_Replace: Value = EvalStencilOp_Replace(tree, paramlist); break; case TokenType.StencilOp_IncrSat: Value = EvalStencilOp_IncrSat(tree, paramlist); break; case TokenType.StencilOp_DecrSat: Value = EvalStencilOp_DecrSat(tree, paramlist); break; case TokenType.StencilOp_Invert: Value = EvalStencilOp_Invert(tree, paramlist); break; case TokenType.StencilOp_Incr: Value = EvalStencilOp_Incr(tree, paramlist); break; case TokenType.StencilOp_Decr: Value = EvalStencilOp_Decr(tree, paramlist); break; case TokenType.StencilOp: Value = EvalStencilOp(tree, paramlist); break; case TokenType.Render_State_CullMode: Value = EvalRender_State_CullMode(tree, paramlist); break; case TokenType.Render_State_FillMode: Value = EvalRender_State_FillMode(tree, paramlist); break; case TokenType.Render_State_AlphaBlendEnable: Value = EvalRender_State_AlphaBlendEnable(tree, paramlist); break; case TokenType.Render_State_SrcBlend: Value = EvalRender_State_SrcBlend(tree, paramlist); break; case TokenType.Render_State_DestBlend: Value = EvalRender_State_DestBlend(tree, paramlist); break; case TokenType.Render_State_BlendOp: Value = EvalRender_State_BlendOp(tree, paramlist); break; case TokenType.Render_State_ColorWriteEnable: Value = EvalRender_State_ColorWriteEnable(tree, paramlist); break; case TokenType.Render_State_DepthBias: Value = EvalRender_State_DepthBias(tree, paramlist); break; case TokenType.Render_State_SlopeScaleDepthBias: Value = EvalRender_State_SlopeScaleDepthBias(tree, paramlist); break; case TokenType.Render_State_ZEnable: Value = EvalRender_State_ZEnable(tree, paramlist); break; case TokenType.Render_State_ZWriteEnable: Value = EvalRender_State_ZWriteEnable(tree, paramlist); break; case TokenType.Render_State_ZFunc: Value = EvalRender_State_ZFunc(tree, paramlist); break; case TokenType.Render_State_MultiSampleAntiAlias: Value = EvalRender_State_MultiSampleAntiAlias(tree, paramlist); break; case TokenType.Render_State_ScissorTestEnable: Value = EvalRender_State_ScissorTestEnable(tree, paramlist); break; case TokenType.Render_State_StencilEnable: Value = EvalRender_State_StencilEnable(tree, paramlist); break; case TokenType.Render_State_StencilFail: Value = EvalRender_State_StencilFail(tree, paramlist); break; case TokenType.Render_State_StencilFunc: Value = EvalRender_State_StencilFunc(tree, paramlist); break; case TokenType.Render_State_StencilMask: Value = EvalRender_State_StencilMask(tree, paramlist); break; case TokenType.Render_State_StencilPass: Value = EvalRender_State_StencilPass(tree, paramlist); break; case TokenType.Render_State_StencilRef: Value = EvalRender_State_StencilRef(tree, paramlist); break; case TokenType.Render_State_StencilWriteMask: Value = EvalRender_State_StencilWriteMask(tree, paramlist); break; case TokenType.Render_State_StencilZFail: Value = EvalRender_State_StencilZFail(tree, paramlist); break; case TokenType.Render_State_Expression: Value = EvalRender_State_Expression(tree, paramlist); break; case TokenType.Pass_Declaration: Value = EvalPass_Declaration(tree, paramlist); break; case TokenType.VertexShader_Pass_Expression: Value = EvalVertexShader_Pass_Expression(tree, paramlist); break; case TokenType.PixelShader_Pass_Expression: Value = EvalPixelShader_Pass_Expression(tree, paramlist); break; case TokenType.AddressMode_Clamp: Value = EvalAddressMode_Clamp(tree, paramlist); break; case TokenType.AddressMode_Wrap: Value = EvalAddressMode_Wrap(tree, paramlist); break; case TokenType.AddressMode_Mirror: Value = EvalAddressMode_Mirror(tree, paramlist); break; case TokenType.AddressMode_Border: Value = EvalAddressMode_Border(tree, paramlist); break; case TokenType.AddressMode: Value = EvalAddressMode(tree, paramlist); break; case TokenType.TextureFilter_None: Value = EvalTextureFilter_None(tree, paramlist); break; case TokenType.TextureFilter_Linear: Value = EvalTextureFilter_Linear(tree, paramlist); break; case TokenType.TextureFilter_Point: Value = EvalTextureFilter_Point(tree, paramlist); break; case TokenType.TextureFilter_Anisotropic: Value = EvalTextureFilter_Anisotropic(tree, paramlist); break; case TokenType.TextureFilter: Value = EvalTextureFilter(tree, paramlist); break; case TokenType.Sampler_State_Texture: Value = EvalSampler_State_Texture(tree, paramlist); break; case TokenType.Sampler_State_MinFilter: Value = EvalSampler_State_MinFilter(tree, paramlist); break; case TokenType.Sampler_State_MagFilter: Value = EvalSampler_State_MagFilter(tree, paramlist); break; case TokenType.Sampler_State_MipFilter: Value = EvalSampler_State_MipFilter(tree, paramlist); break; case TokenType.Sampler_State_Filter: Value = EvalSampler_State_Filter(tree, paramlist); break; case TokenType.Sampler_State_AddressU: Value = EvalSampler_State_AddressU(tree, paramlist); break; case TokenType.Sampler_State_AddressV: Value = EvalSampler_State_AddressV(tree, paramlist); break; case TokenType.Sampler_State_AddressW: Value = EvalSampler_State_AddressW(tree, paramlist); break; case TokenType.Sampler_State_BorderColor: Value = EvalSampler_State_BorderColor(tree, paramlist); break; case TokenType.Sampler_State_MaxMipLevel: Value = EvalSampler_State_MaxMipLevel(tree, paramlist); break; case TokenType.Sampler_State_MaxAnisotropy: Value = EvalSampler_State_MaxAnisotropy(tree, paramlist); break; case TokenType.Sampler_State_MipLodBias: Value = EvalSampler_State_MipLodBias(tree, paramlist); break; case TokenType.Sampler_State_Expression: Value = EvalSampler_State_Expression(tree, paramlist); break; case TokenType.Sampler_Register_Expression: Value = EvalSampler_Register_Expression(tree, paramlist); break; case TokenType.Sampler_Declaration_States: Value = EvalSampler_Declaration_States(tree, paramlist); break; case TokenType.Sampler_Declaration: Value = EvalSampler_Declaration(tree, paramlist); break; default: Value = Token.Text; break; } return Value; } protected virtual object EvalStart(ParseTree tree, params object[] paramlist) { var shader = new ShaderInfo(); foreach (var node in Nodes) node.Eval(tree, shader); return shader; } protected virtual object EvalTechnique_Declaration(ParseTree tree, params object[] paramlist) { var technique = new TechniqueInfo(); technique.name = this.GetValue(tree, TokenType.Identifier, 0) as string ?? string.Empty; technique.startPos = Token.StartPos; technique.length = Token.Length; foreach (var node in Nodes) node.Eval(tree, technique); // Make sure we have at least one pass. if (technique.Passes.Count > 0) { var shaderInfo = paramlist[0] as ShaderInfo; shaderInfo.Techniques.Add(technique); } return null; } protected virtual object EvalFillMode_Solid(ParseTree tree, params object[] paramlist) { return FillMode.Solid; } protected virtual object EvalFillMode_WireFrame(ParseTree tree, params object[] paramlist) { return FillMode.WireFrame; } protected virtual object EvalFillModes(ParseTree tree, params object[] paramlist) { return this.GetValue(tree, TokenType.FillMode_Solid, 0) ?? this.GetValue(tree, TokenType.FillMode_WireFrame, 0); } protected virtual object EvalCullMode_None(ParseTree tree, params object[] paramlist) { return CullMode.None; } protected virtual object EvalCullMode_Cw(ParseTree tree, params object[] paramlist) { return CullMode.CullClockwiseFace; } protected virtual object EvalCullMode_Ccw(ParseTree tree, params object[] paramlist) { return CullMode.CullCounterClockwiseFace; } protected virtual object EvalCullModes(ParseTree tree, params object[] paramlist) { return this.GetValue(tree, TokenType.CullMode_None, 0) ?? this.GetValue(tree, TokenType.CullMode_Cw, 0) ?? this.GetValue(tree, TokenType.CullMode_Ccw, 0); } protected virtual object EvalColors_None(ParseTree tree, params object[] paramlist) { return ColorWriteChannels.None; } protected virtual object EvalColors_Red(ParseTree tree, params object[] paramlist) { return ColorWriteChannels.Red; } protected virtual object EvalColors_Green(ParseTree tree, params object[] paramlist) { return ColorWriteChannels.Green; } protected virtual object EvalColors_Blue(ParseTree tree, params object[] paramlist) { return ColorWriteChannels.Blue; } protected virtual object EvalColors_Alpha(ParseTree tree, params object[] paramlist) { return ColorWriteChannels.Alpha; } protected virtual object EvalColors_All(ParseTree tree, params object[] paramlist) { return ColorWriteChannels.All; } protected virtual object EvalColors_Boolean(ParseTree tree, params object[] paramlist) { return ParseTreeTools.ParseBool((string)this.GetValue(tree, TokenType.Boolean, 0)) ? ColorWriteChannels.All : ColorWriteChannels.None; } protected virtual object EvalColors(ParseTree tree, params object[] paramlist) { return this.GetValue(tree, TokenType.Colors_Red, 0) ?? this.GetValue(tree, TokenType.Colors_Green, 0) ?? this.GetValue(tree, TokenType.Colors_Blue, 0) ?? this.GetValue(tree, TokenType.Colors_Alpha, 0) ?? this.GetValue(tree, TokenType.Colors_None, 0) ?? this.GetValue(tree, TokenType.Colors_All, 0) ?? this.GetValue(tree, TokenType.Colors_Boolean, 0); } protected virtual object EvalColorsMasks(ParseTree tree, params object[] paramlist) { return (ColorWriteChannels)(this.GetValue(tree, TokenType.Colors, 0) ?? 0) | (ColorWriteChannels)(this.GetValue(tree, TokenType.Colors, 1) ?? 0) | (ColorWriteChannels)(this.GetValue(tree, TokenType.Colors, 2) ?? 0) | (ColorWriteChannels)(this.GetValue(tree, TokenType.Colors, 3) ?? 0); } protected virtual object EvalBlend_Zero(ParseTree tree, params object[] paramlist) { return Blend.Zero; } protected virtual object EvalBlend_One(ParseTree tree, params object[] paramlist) { return Blend.One; } protected virtual object EvalBlend_SrcColor(ParseTree tree, params object[] paramlist) { return Blend.SourceColor; } protected virtual object EvalBlend_InvSrcColor(ParseTree tree, params object[] paramlist) { return Blend.InverseSourceColor; } protected virtual object EvalBlend_SrcAlpha(ParseTree tree, params object[] paramlist) { return Blend.SourceAlpha; } protected virtual object EvalBlend_InvSrcAlpha(ParseTree tree, params object[] paramlist) { return Blend.InverseSourceAlpha; } protected virtual object EvalBlend_DestAlpha(ParseTree tree, params object[] paramlist) { return Blend.DestinationAlpha; } protected virtual object EvalBlend_InvDestAlpha(ParseTree tree, params object[] paramlist) { return Blend.InverseDestinationAlpha; } protected virtual object EvalBlend_DestColor(ParseTree tree, params object[] paramlist) { return Blend.DestinationColor; } protected virtual object EvalBlend_InvDestColor(ParseTree tree, params object[] paramlist) { return Blend.InverseDestinationColor; } protected virtual object EvalBlend_SrcAlphaSat(ParseTree tree, params object[] paramlist) { return Blend.SourceAlphaSaturation; } protected virtual object EvalBlend_BlendFactor(ParseTree tree, params object[] paramlist) { return Blend.BlendFactor; } protected virtual object EvalBlend_InvBlendFactor(ParseTree tree, params object[] paramlist) { return Blend.InverseBlendFactor; } protected virtual object EvalBlends(ParseTree tree, params object[] paramlist) { return this.GetValue(tree, TokenType.Blend_Zero, 0) ?? this.GetValue(tree, TokenType.Blend_One, 0) ?? this.GetValue(tree, TokenType.Blend_SrcColor, 0) ?? this.GetValue(tree, TokenType.Blend_InvSrcColor, 0) ?? this.GetValue(tree, TokenType.Blend_SrcAlpha, 0) ?? this.GetValue(tree, TokenType.Blend_InvSrcAlpha, 0) ?? this.GetValue(tree, TokenType.Blend_DestAlpha, 0) ?? this.GetValue(tree, TokenType.Blend_InvDestAlpha, 0) ?? this.GetValue(tree, TokenType.Blend_DestColor, 0) ?? this.GetValue(tree, TokenType.Blend_InvDestColor, 0) ?? this.GetValue(tree, TokenType.Blend_SrcAlphaSat, 0) ?? this.GetValue(tree, TokenType.Blend_BlendFactor, 0) ?? this.GetValue(tree, TokenType.Blend_InvBlendFactor, 0); } protected virtual object EvalBlendOp_Add(ParseTree tree, params object[] paramlist) { return BlendFunction.Add; } protected virtual object EvalBlendOp_Subtract(ParseTree tree, params object[] paramlist) { return BlendFunction.Subtract; } protected virtual object EvalBlendOp_RevSubtract(ParseTree tree, params object[] paramlist) { return BlendFunction.ReverseSubtract; } protected virtual object EvalBlendOp_Min(ParseTree tree, params object[] paramlist) { return BlendFunction.Min; } protected virtual object EvalBlendOp_Max(ParseTree tree, params object[] paramlist) { return BlendFunction.Max; } protected virtual object EvalBlendOps(ParseTree tree, params object[] paramlist) { return this.GetValue(tree, TokenType.BlendOp_Add, 0) ?? this.GetValue(tree, TokenType.BlendOp_Subtract, 0) ?? this.GetValue(tree, TokenType.BlendOp_RevSubtract, 0) ?? this.GetValue(tree, TokenType.BlendOp_Min, 0) ?? this.GetValue(tree, TokenType.BlendOp_Max, 0); } protected virtual object EvalCmpFunc_Never(ParseTree tree, params object[] paramlist) { return CompareFunction.Never; } protected virtual object EvalCmpFunc_Less(ParseTree tree, params object[] paramlist) { return CompareFunction.Less; } protected virtual object EvalCmpFunc_Equal(ParseTree tree, params object[] paramlist) { return CompareFunction.Equal; } protected virtual object EvalCmpFunc_LessEqual(ParseTree tree, params object[] paramlist) { return CompareFunction.LessEqual; } protected virtual object EvalCmpFunc_Greater(ParseTree tree, params object[] paramlist) { return CompareFunction.Greater; } protected virtual object EvalCmpFunc_NotEqual(ParseTree tree, params object[] paramlist) { return CompareFunction.NotEqual; } protected virtual object EvalCmpFunc_GreaterEqual(ParseTree tree, params object[] paramlist) { return CompareFunction.GreaterEqual; } protected virtual object EvalCmpFunc_Always(ParseTree tree, params object[] paramlist) { return CompareFunction.Always; } protected virtual object EvalCmpFunc(ParseTree tree, params object[] paramlist) { return this.GetValue(tree, TokenType.CmpFunc_Never, 0) ?? this.GetValue(tree, TokenType.CmpFunc_Less, 0) ?? this.GetValue(tree, TokenType.CmpFunc_Equal, 0) ?? this.GetValue(tree, TokenType.CmpFunc_LessEqual, 0) ?? this.GetValue(tree, TokenType.CmpFunc_Greater, 0) ?? this.GetValue(tree, TokenType.CmpFunc_NotEqual, 0) ?? this.GetValue(tree, TokenType.CmpFunc_GreaterEqual, 0) ?? this.GetValue(tree, TokenType.CmpFunc_Always, 0); } protected virtual object EvalStencilOp_Keep(ParseTree tree, params object[] paramlist) { return StencilOperation.Keep; } protected virtual object EvalStencilOp_Zero(ParseTree tree, params object[] paramlist) { return StencilOperation.Zero; } protected virtual object EvalStencilOp_Replace(ParseTree tree, params object[] paramlist) { return StencilOperation.Replace; } protected virtual object EvalStencilOp_IncrSat(ParseTree tree, params object[] paramlist) { return StencilOperation.IncrementSaturation; } protected virtual object EvalStencilOp_DecrSat(ParseTree tree, params object[] paramlist) { return StencilOperation.DecrementSaturation; } protected virtual object EvalStencilOp_Invert(ParseTree tree, params object[] paramlist) { return StencilOperation.Invert; } protected virtual object EvalStencilOp_Incr(ParseTree tree, params object[] paramlist) { return StencilOperation.Increment; } protected virtual object EvalStencilOp_Decr(ParseTree tree, params object[] paramlist) { return StencilOperation.Decrement; } protected virtual object EvalStencilOp(ParseTree tree, params object[] paramlist) { return this.GetValue(tree, TokenType.StencilOp_Keep, 0) ?? this.GetValue(tree, TokenType.StencilOp_Zero, 0) ?? this.GetValue(tree, TokenType.StencilOp_Replace, 0) ?? this.GetValue(tree, TokenType.StencilOp_IncrSat, 0) ?? this.GetValue(tree, TokenType.StencilOp_DecrSat, 0) ?? this.GetValue(tree, TokenType.StencilOp_Invert, 0) ?? this.GetValue(tree, TokenType.StencilOp_Incr, 0) ?? this.GetValue(tree, TokenType.StencilOp_Decr, 0); } protected virtual object EvalRender_State_CullMode(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).CullMode = (CullMode)this.GetValue(tree, TokenType.CullModes, 0); return null; } protected virtual object EvalRender_State_FillMode(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).FillMode = (FillMode)this.GetValue(tree, TokenType.FillModes, 0); return null; } protected virtual object EvalRender_State_AlphaBlendEnable(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).AlphaBlendEnable = ParseTreeTools.ParseBool((string)this.GetValue(tree, TokenType.Boolean, 0)); return null; } protected virtual object EvalRender_State_SrcBlend(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).SrcBlend = (Blend)this.GetValue(tree, TokenType.Blends, 0); return null; } protected virtual object EvalRender_State_DestBlend(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).DestBlend = (Blend)this.GetValue(tree, TokenType.Blends, 0); return null; } protected virtual object EvalRender_State_BlendOp(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).BlendOp = (BlendFunction)this.GetValue(tree, TokenType.BlendOps, 0); return null; } protected virtual object EvalRender_State_ColorWriteEnable(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).ColorWriteEnable = (ColorWriteChannels)this.GetValue(tree, TokenType.ColorsMasks, 0); return null; } protected virtual object EvalRender_State_DepthBias(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).DepthBias = ParseTreeTools.ParseFloat((string)this.GetValue(tree, TokenType.Number, 0)); return null; } protected virtual object EvalRender_State_SlopeScaleDepthBias(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).SlopeScaleDepthBias = ParseTreeTools.ParseFloat((string)this.GetValue(tree, TokenType.Number, 0)); return null; } protected virtual object EvalRender_State_ZEnable(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).ZEnable = ParseTreeTools.ParseBool((string)this.GetValue(tree, TokenType.Boolean, 0)); return null; } protected virtual object EvalRender_State_ZWriteEnable(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).ZWriteEnable = ParseTreeTools.ParseBool((string)this.GetValue(tree, TokenType.Boolean, 0)); return null; } protected virtual object EvalRender_State_ZFunc(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).DepthBufferFunction = (CompareFunction)this.GetValue(tree, TokenType.CmpFunc, 0); return null; } protected virtual object EvalRender_State_MultiSampleAntiAlias(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).MultiSampleAntiAlias = ParseTreeTools.ParseBool((string)this.GetValue(tree, TokenType.Boolean, 0)); return null; } protected virtual object EvalRender_State_ScissorTestEnable(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).ScissorTestEnable = ParseTreeTools.ParseBool((string)this.GetValue(tree, TokenType.Boolean, 0)); return null; } protected virtual object EvalRender_State_StencilEnable(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).StencilEnable = ParseTreeTools.ParseBool((string)this.GetValue(tree, TokenType.Boolean, 0)); return null; } protected virtual object EvalRender_State_StencilFail(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).StencilFail = (StencilOperation)this.GetValue(tree, TokenType.StencilOp, 0); return null; } protected virtual object EvalRender_State_StencilFunc(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).StencilFunc = (CompareFunction)this.GetValue(tree, TokenType.CmpFunc, 0); return null; } protected virtual object EvalRender_State_StencilMask(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).StencilMask = ParseTreeTools.ParseInt((string)this.GetValue(tree, TokenType.Number, 0)); return null; } protected virtual object EvalRender_State_StencilPass(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).StencilPass = (StencilOperation)this.GetValue(tree, TokenType.StencilOp, 0); return null; } protected virtual object EvalRender_State_StencilRef(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).StencilRef = ParseTreeTools.ParseInt((string)this.GetValue(tree, TokenType.Number, 0)); return null; } protected virtual object EvalRender_State_StencilWriteMask(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).StencilWriteMask = ParseTreeTools.ParseInt((string)this.GetValue(tree, TokenType.Number, 0)); return null; } protected virtual object EvalRender_State_StencilZFail(ParseTree tree, params object[] paramlist) { (paramlist[0] as PassInfo).StencilZFail = (StencilOperation)this.GetValue(tree, TokenType.StencilOp, 0); return null; } protected virtual object EvalRender_State_Expression(ParseTree tree, params object[] paramlist) { foreach (var node in Nodes) node.Eval(tree, paramlist); return null; } protected virtual object EvalPass_Declaration(ParseTree tree, params object[] paramlist) { var pass = new PassInfo(); pass.name = this.GetValue(tree, TokenType.Identifier, 0) as string ?? string.Empty; foreach (var node in Nodes) node.Eval(tree, pass); // We need to have a pixel or vertex shader to keep this pass. if (!string.IsNullOrEmpty(pass.psFunction) || !string.IsNullOrEmpty(pass.vsFunction)) { var technique = paramlist[0] as TechniqueInfo; technique.Passes.Add(pass); } return null; } protected virtual object EvalVertexShader_Pass_Expression(ParseTree tree, params object[] paramlist) { var pass = paramlist[0] as PassInfo; pass.vsModel = this.GetValue(tree, TokenType.ShaderModel, 0) as string; pass.vsFunction = this.GetValue(tree, TokenType.Identifier, 0) as string; return null; } protected virtual object EvalPixelShader_Pass_Expression(ParseTree tree, params object[] paramlist) { var pass = paramlist[0] as PassInfo; pass.psModel = this.GetValue(tree, TokenType.ShaderModel, 0) as string; pass.psFunction = this.GetValue(tree, TokenType.Identifier, 0) as string; return null; } protected virtual object EvalAddressMode_Clamp(ParseTree tree, params object[] paramlist) { return TextureAddressMode.Clamp; } protected virtual object EvalAddressMode_Wrap(ParseTree tree, params object[] paramlist) { return TextureAddressMode.Wrap; } protected virtual object EvalAddressMode_Mirror(ParseTree tree, params object[] paramlist) { return TextureAddressMode.Mirror; } protected virtual object EvalAddressMode_Border(ParseTree tree, params object[] paramlist) { return TextureAddressMode.Border; } protected virtual object EvalAddressMode(ParseTree tree, params object[] paramlist) { return this.GetValue(tree, TokenType.AddressMode_Clamp, 0) ?? this.GetValue(tree, TokenType.AddressMode_Wrap, 0) ?? this.GetValue(tree, TokenType.AddressMode_Mirror, 0) ?? this.GetValue(tree, TokenType.AddressMode_Border, 0); } protected virtual object EvalTextureFilter_None(ParseTree tree, params object[] paramlist) { return TextureFilterType.None; } protected virtual object EvalTextureFilter_Linear(ParseTree tree, params object[] paramlist) { return TextureFilterType.Linear; } protected virtual object EvalTextureFilter_Point(ParseTree tree, params object[] paramlist) { return TextureFilterType.Point; } protected virtual object EvalTextureFilter_Anisotropic(ParseTree tree, params object[] paramlist) { return TextureFilterType.Anisotropic; } protected virtual object EvalTextureFilter(ParseTree tree, params object[] paramlist) { return this.GetValue(tree, TokenType.TextureFilter_None, 0) ?? this.GetValue(tree, TokenType.TextureFilter_Linear, 0) ?? this.GetValue(tree, TokenType.TextureFilter_Point, 0) ?? this.GetValue(tree, TokenType.TextureFilter_Anisotropic, 0); } protected virtual object EvalSampler_State_Texture(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).TextureName = (string)this.GetValue(tree, TokenType.Identifier, 0); return null; } protected virtual object EvalSampler_State_MinFilter(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).MinFilter = (TextureFilterType)this.GetValue(tree, TokenType.TextureFilter, 0); return null; } protected virtual object EvalSampler_State_MagFilter(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).MagFilter = (TextureFilterType)this.GetValue(tree, TokenType.TextureFilter, 0); return null; } protected virtual object EvalSampler_State_MipFilter(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).MipFilter = (TextureFilterType)this.GetValue(tree, TokenType.TextureFilter, 0); return null; } protected virtual object EvalSampler_State_Filter(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).Filter = (TextureFilterType)this.GetValue(tree, TokenType.TextureFilter, 0); return null; } protected virtual object EvalSampler_State_AddressU(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).AddressU = (TextureAddressMode)this.GetValue(tree, TokenType.AddressMode, 0); return null; } protected virtual object EvalSampler_State_AddressV(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).AddressV = (TextureAddressMode)this.GetValue(tree, TokenType.AddressMode, 0); return null; } protected virtual object EvalSampler_State_AddressW(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).AddressW = (TextureAddressMode)this.GetValue(tree, TokenType.AddressMode, 0); return null; } protected virtual object EvalSampler_State_BorderColor(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).BorderColor = ParseTreeTools.ParseColor((string)this.GetValue(tree, TokenType.HexColor, 0)); return null; } protected virtual object EvalSampler_State_MaxMipLevel(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).MaxMipLevel = ParseTreeTools.ParseInt((string)this.GetValue(tree, TokenType.Number, 0)); return null; } protected virtual object EvalSampler_State_MaxAnisotropy(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).MaxAnisotropy = ParseTreeTools.ParseInt((string)this.GetValue(tree, TokenType.Number, 0)); return null; } protected virtual object EvalSampler_State_MipLodBias(ParseTree tree, params object[] paramlist) { (paramlist[0] as SamplerStateInfo).MipMapLevelOfDetailBias = ParseTreeTools.ParseFloat((string)this.GetValue(tree, TokenType.Number, 0)); return null; } protected virtual object EvalSampler_State_Expression(ParseTree tree, params object[] paramlist) { foreach (var node in Nodes) node.Eval(tree, paramlist); return null; } protected virtual object EvalSampler_Register_Expression(ParseTree tree, params object[] paramlist) { return null; } protected virtual object EvalSampler_Declaration_States(ParseTree tree, params object[] paramlist) { foreach (var node in Nodes) node.Eval(tree, paramlist); return null; } protected virtual object EvalSampler_Declaration(ParseTree tree, params object[] paramlist) { // if there is a comma or closing paren at the end this is a sampler as a parameter of a function if (this.GetValue(tree, TokenType.Semicolon, 0) == null) return null; var sampler = new SamplerStateInfo(); sampler.Name = this.GetValue(tree, TokenType.Identifier, 0) as string; foreach (ParseNode node in Nodes) node.Eval(tree, sampler); var shaderInfo = paramlist[0] as ShaderInfo; shaderInfo.SamplerStates.Add(sampler.Name, sampler); return null; } } #endregion ParseTree }