- Build system optimizations - Extended ProjectConverter: DX and SharpDX assemblies are now removed from linux projects to prevent errors - Fixed a bunch of compiler warnings - Removed DX11MetroShaderGenerator assembly. It is now included in ANX.Framework.Content.Pipeline - Removed HLSLParser assembly. It is now included in ANX.Framework.Content.Pipeline. - Removed shader parser from GL3-RenderSystem. It is now included in ANX.Framework.Content.Pipeline. - Removed RenderSystem dependencies from StockShaderCodeGenerator (sscg) tool
177 lines
4.6 KiB
C#
177 lines
4.6 KiB
C#
using System;
|
|
|
|
// This file is part of the ANX.Framework created by the
|
|
// "ANX.Framework developer group" and released under the Ms-PL license.
|
|
// For details see: http://anxframework.codeplex.com/license
|
|
|
|
namespace ANX.Framework.Content.Pipeline.Helpers.HLSLParser
|
|
{
|
|
public class Pass : IShaderElement
|
|
{
|
|
#region Private
|
|
private string vertexShaderProfile = "";
|
|
private string pixelShaderProfile = "";
|
|
#endregion
|
|
|
|
#region Public
|
|
public string Name
|
|
{
|
|
get;
|
|
private set;
|
|
}
|
|
|
|
public string VertexShader
|
|
{
|
|
get;
|
|
private set;
|
|
}
|
|
|
|
public string VertexShaderProfile
|
|
{
|
|
get
|
|
{
|
|
return vertexShaderProfile;
|
|
}
|
|
}
|
|
|
|
public string PixelShader
|
|
{
|
|
get;
|
|
private set;
|
|
}
|
|
|
|
public string PixelShaderProfile
|
|
{
|
|
get
|
|
{
|
|
return pixelShaderProfile;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region Constructor
|
|
public Pass(ParseTextWalker walker)
|
|
{
|
|
string text = walker.Text;
|
|
|
|
int indexOfNameStart = text.IndexOf(' ') + 1;
|
|
int indexOfNameEnd = text.IndexOf('{');
|
|
|
|
Name = text.Substring(indexOfNameStart, indexOfNameEnd - indexOfNameStart);
|
|
Name = Name.TrimEnd('\n', '\r', '\t', ' ');
|
|
|
|
string passContentText = text.Substring(indexOfNameEnd + 1);
|
|
if (text.Contains("SetVertexShader"))
|
|
{
|
|
passContentText = passContentText.Replace("\t", "").Replace(" ", "");
|
|
passContentText = passContentText.Replace(",", ", ");
|
|
ParseDx10Pass(passContentText);
|
|
}
|
|
else
|
|
{
|
|
ParseDx9Pass(passContentText);
|
|
}
|
|
|
|
walker.Seek(text.IndexOf('}') + 1);
|
|
}
|
|
#endregion
|
|
|
|
#region ParseDx10Pass
|
|
private void ParseDx10Pass(string text)
|
|
{
|
|
VertexShader = ParseDx10Shader(text, "SetVertexShader(", ref vertexShaderProfile);
|
|
PixelShader = ParseDx10Shader(text, "SetPixelShader(", ref pixelShaderProfile);
|
|
}
|
|
#endregion
|
|
|
|
#region ParseDx10Shader
|
|
private string ParseDx10Shader(string text, string key, ref string profile)
|
|
{
|
|
int indexOfshaderStart = text.IndexOf(key) + key.Length;
|
|
int indexOfPixelShaderEnd = text.IndexOf(");", indexOfshaderStart);
|
|
string shader = text.Substring(indexOfshaderStart,
|
|
indexOfPixelShaderEnd - indexOfshaderStart);
|
|
shader = shader.Replace(" ", "").Replace("\t", "");
|
|
shader = shader.Replace("\r", "").Replace("\n", "");
|
|
|
|
int subPartStartIndex = "CompileShader(".Length;
|
|
shader = shader.Substring(subPartStartIndex,
|
|
shader.Length - subPartStartIndex - 1);
|
|
|
|
int indexOfFirstComma = shader.IndexOf(',');
|
|
profile = shader.Substring(0, indexOfFirstComma);
|
|
shader = shader.Substring(indexOfFirstComma + 1);
|
|
shader = shader.Replace(",", ", ");
|
|
|
|
return shader;
|
|
}
|
|
#endregion
|
|
|
|
#region ParseDx9Pass
|
|
private void ParseDx9Pass(string text)
|
|
{
|
|
VertexShader = ParseDx9Shader(text, "VertexShader", ref vertexShaderProfile);
|
|
PixelShader = ParseDx9Shader(text, "PixelShader", ref pixelShaderProfile);
|
|
}
|
|
#endregion
|
|
|
|
#region ParseDx9Shader
|
|
private string ParseDx9Shader(string text, string key, ref string profile)
|
|
{
|
|
int indexOfShaderStart = text.IndexOf(key);
|
|
string shader = "";
|
|
indexOfShaderStart = text.IndexOf("compile ", indexOfShaderStart);
|
|
int indexOfShaderEnd = text.IndexOf(';', indexOfShaderStart);
|
|
shader = text.Substring(indexOfShaderStart,
|
|
indexOfShaderEnd - indexOfShaderStart);
|
|
shader = shader.Replace("compile", "");
|
|
shader = shader.Trim();
|
|
|
|
int indexOfSpaceAfterProfile = shader.IndexOf(' ');
|
|
profile = shader.Substring(0, indexOfSpaceAfterProfile);
|
|
|
|
shader = shader.Substring(indexOfSpaceAfterProfile).Trim();
|
|
shader = shader.Replace(" ", "").Replace(",", ", ");
|
|
return shader;
|
|
}
|
|
#endregion
|
|
|
|
#region TryParse
|
|
public static Pass TryParse(ParseTextWalker walker)
|
|
{
|
|
return walker.Text.StartsWith("pass ") ?
|
|
new Pass(walker) :
|
|
null;
|
|
}
|
|
#endregion
|
|
|
|
#region ToString
|
|
public override string ToString()
|
|
{
|
|
return ToStringIndented(0);
|
|
}
|
|
#endregion
|
|
|
|
#region ToStringIndented
|
|
public string ToStringIndented(int tabs)
|
|
{
|
|
string idention = "";
|
|
for (int tabIndex = 0; tabIndex < tabs; tabIndex++)
|
|
{
|
|
idention += "\t";
|
|
}
|
|
|
|
string text = idention + "pass " + Name + "\n" + idention + "{\n";
|
|
|
|
text += idention + "\tSetVertexShader(CompileShader(" +
|
|
VertexShaderProfile + ", " + VertexShader + "));\n";
|
|
text += idention + "\tSetGeometryShader(NULL);\n";
|
|
text += idention + "\tSetPixelShader(CompileShader(" +
|
|
PixelShaderProfile + ", " + PixelShader + "));\n";
|
|
|
|
return text + idention + "}";
|
|
}
|
|
#endregion
|
|
}
|
|
}
|