152 lines
4.8 KiB
C#

#region Using Statements
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ANX.Framework.Graphics;
using System.Text.RegularExpressions;
#endregion
// 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.Graphics
{
public static class VertexChannelNames
{
public static string Binormal(int usageIndex)
{
return EncodeName("BINORMAL", usageIndex);
}
public static string Color(int usageIndex)
{
return EncodeName("COLOR", usageIndex);
}
public static string DecodeBaseName(string encodedName)
{
return encodedName.TrimEnd('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
}
public static string DecodeUsageIndex(string encodedName)
{
string baseName = DecodeBaseName(encodedName);
return encodedName.Replace(baseName, "").Trim();
}
public static string EncodeName(string baseName, int usageIndex)
{
return String.Format("{0}{1}", baseName.ToUpperInvariant(), usageIndex);
}
public static string EncodeName(VertexElementUsage vertexElementUsage, int usageIndex)
{
string baseName = String.Empty;
switch (vertexElementUsage)
{
case VertexElementUsage.Binormal:
case VertexElementUsage.BlendIndices:
case VertexElementUsage.BlendWeight:
case VertexElementUsage.Color:
case VertexElementUsage.Normal:
case VertexElementUsage.Position:
case VertexElementUsage.Tangent:
baseName = vertexElementUsage.ToString().ToUpperInvariant();
break;
case VertexElementUsage.PointSize:
baseName = "PSIZE";
break;
case VertexElementUsage.TessellateFactor:
baseName = "TESSFACTOR";
break;
case VertexElementUsage.TextureCoordinate:
baseName = "TEXCOORD";
break;
}
if (!String.IsNullOrEmpty(baseName))
{
return EncodeName(baseName, usageIndex);
}
return baseName;
}
public static string Normal()
{
return Normal(0);
}
public static string Normal(int usageIndex)
{
return EncodeName("NORMAL", usageIndex);
}
public static string Tangent(int usageIndex)
{
return EncodeName("TANGENT", usageIndex);
}
public static string TextureCoordinate(int usageIndex)
{
return EncodeName("TEXCOORD", usageIndex);
}
public static bool TryDecodeUsage(string encodedName, out VertexElementUsage usage)
{
string baseName = DecodeBaseName(encodedName);
switch (baseName)
{
case "BINORMAL":
usage = VertexElementUsage.Binormal;
return true;
case "BLENDINDICES":
usage = VertexElementUsage.BlendIndices;
return true;
case "BLENDWEIGHT":
usage = VertexElementUsage.BlendWeight;
return true;
case "COLOR":
usage = VertexElementUsage.Color;
return true;
case "NORMAL":
usage = VertexElementUsage.Normal;
return true;
case "POSITION":
usage = VertexElementUsage.Position;
return true;
case "PSIZE":
usage = VertexElementUsage.PointSize;
return true;
case "TANGENT":
usage = VertexElementUsage.Tangent;
return true;
case "TEXCOORD":
usage = VertexElementUsage.TextureCoordinate;
return true;
case "TESSFACTOR":
usage = VertexElementUsage.TessellateFactor;
return true;
default:
usage = 0;
return false;
}
}
public static string Weights()
{
return Weights(0);
}
public static string Weights(int usageIndex)
{
return EncodeName("BLENDWEIGHT", usageIndex);
}
}
}