Files
LuaCsForBarotraumaEP/Libraries/MonoGame.Framework/Src/Tools/2MGFX/TPGParser/ParseTree.cs
T
2019-06-25 16:00:44 +03:00

1121 lines
46 KiB
C#

// 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<ParseError>
{
}
[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<Token> 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);
}
/// <summary>
/// this is the entry point for executing and evaluating the parse tree.
/// </summary>
/// <param name="paramlist">additional optional input parameters</param>
/// <returns>the output of the evaluation function</returns>
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<ParseNode> nodes;
public List<ParseNode> 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<ParseNode>();
}
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;
}
/// <summary>
/// this implements the evaluation functionality, cannot be used directly
/// </summary>
/// <param name="tree">the parsetree itself</param>
/// <param name="paramlist">optional input parameters</param>
/// <returns>a partial result of the evaluation</returns>
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
}