82 lines
1.9 KiB
C#

using System;
using OpenTK.Graphics.OpenGL;
using ANX.Framework.Graphics;
namespace ANX.RenderSystem.GL3
{
public struct ShaderAttributeGL3
{
#region Public
public string Name;
public int Location;
public int Size;
public ActiveAttribType Type;
#endregion
#region Constructor
public ShaderAttributeGL3(int programHandle, int index)
{
Name = GL.GetActiveAttrib(programHandle, index, out Size, out Type);
Location = GL.GetAttribLocation(programHandle, Name);
}
#endregion
#region Bind
public void Bind(VertexElementUsage usage, int stride, int offset)
{
GL.EnableVertexAttribArray(Location);
ErrorHelper.Check("Failed to bind shader attribute " + Name);
int size = 0;
VertexAttribPointerType type = VertexAttribPointerType.Float;
bool normalized = false;
switch (usage)
{
case VertexElementUsage.Binormal:
case VertexElementUsage.Normal:
case VertexElementUsage.Tangent:
case VertexElementUsage.BlendIndices:
case VertexElementUsage.BlendWeight:
case VertexElementUsage.Position:
size = 3;
break;
case VertexElementUsage.Color:
size = 4;
type = VertexAttribPointerType.UnsignedByte;
normalized = true;
break;
case VertexElementUsage.TextureCoordinate:
size = 2;
break;
case VertexElementUsage.Fog:
case VertexElementUsage.PointSize:
case VertexElementUsage.TessellateFactor:
size = 1;
break;
// TODO
case VertexElementUsage.Depth:
case VertexElementUsage.Sample:
throw new NotImplementedException();
}
GL.VertexAttribPointer(Location, size, type, normalized, stride, (IntPtr)offset);
}
#endregion
#region ToString
public override string ToString()
{
return "ShaderAttribute{Name: " + Name +
", Location: " + Location +
", Size: " + Size +
", Type: " + Type + "}";
}
#endregion
}
}