82 lines
1.9 KiB
C#
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
|
|
}
|
|
}
|