Add support for signed and unsigned integer vertex attributes.
This commit is contained in:
@@ -45,9 +45,9 @@ namespace OpenRA.Graphics
|
||||
|
||||
public override ShaderVertexAttribute[] Attributes { get; } = new[]
|
||||
{
|
||||
new ShaderVertexAttribute("aVertexPosition", 3, 0),
|
||||
new ShaderVertexAttribute("aVertexTexCoord", 4, 12),
|
||||
new ShaderVertexAttribute("aVertexTexMetadata", 2, 28),
|
||||
new ShaderVertexAttribute("aVertexPosition", ShaderVertexAttributeType.Float, 3, 0),
|
||||
new ShaderVertexAttribute("aVertexTexCoord", ShaderVertexAttributeType.Float, 4, 12),
|
||||
new ShaderVertexAttribute("aVertexTexMetadata", ShaderVertexAttributeType.Float, 2, 28),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace OpenRA.Graphics
|
||||
|
||||
public override ShaderVertexAttribute[] Attributes { get; } = new[]
|
||||
{
|
||||
new ShaderVertexAttribute("aVertexPosition", 2, 0)
|
||||
new ShaderVertexAttribute("aVertexPosition", ShaderVertexAttributeType.Float, 2, 0)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,15 +14,26 @@ using System.Linq;
|
||||
|
||||
namespace OpenRA.Graphics
|
||||
{
|
||||
public enum ShaderVertexAttributeType
|
||||
{
|
||||
// Assign the underlying OpenGL type values
|
||||
// to simplify enum use in the shader
|
||||
Float = 0x1406, // GL_FLOAT
|
||||
Int = 0x1404, // GL_INT
|
||||
UInt = 0x1405 // GL_UNSIGNED_INT
|
||||
}
|
||||
|
||||
public readonly struct ShaderVertexAttribute
|
||||
{
|
||||
public readonly string Name;
|
||||
public readonly ShaderVertexAttributeType Type;
|
||||
public readonly int Components;
|
||||
public readonly int Offset;
|
||||
|
||||
public ShaderVertexAttribute(string name, int components, int offset)
|
||||
public ShaderVertexAttribute(string name, ShaderVertexAttributeType type, int components, int offset)
|
||||
{
|
||||
Name = name;
|
||||
Type = type;
|
||||
Components = components;
|
||||
Offset = offset;
|
||||
}
|
||||
|
||||
@@ -55,10 +55,10 @@ namespace OpenRA.Graphics
|
||||
|
||||
public override ShaderVertexAttribute[] Attributes { get; } = new[]
|
||||
{
|
||||
new ShaderVertexAttribute("aVertexPosition", 3, 0),
|
||||
new ShaderVertexAttribute("aVertexTexCoord", 4, 12),
|
||||
new ShaderVertexAttribute("aVertexTexMetadata", 2, 28),
|
||||
new ShaderVertexAttribute("aVertexTint", 4, 36)
|
||||
new ShaderVertexAttribute("aVertexPosition", ShaderVertexAttributeType.Float, 3, 0),
|
||||
new ShaderVertexAttribute("aVertexTexCoord", ShaderVertexAttributeType.Float, 4, 12),
|
||||
new ShaderVertexAttribute("aVertexTexMetadata", ShaderVertexAttributeType.Float, 2, 28),
|
||||
new ShaderVertexAttribute("aVertexTint", ShaderVertexAttributeType.Float, 4, 36)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -386,6 +386,10 @@ namespace OpenRA.Platforms.Default
|
||||
int stride, IntPtr pointer);
|
||||
public static VertexAttribPointer glVertexAttribPointer { get; private set; }
|
||||
|
||||
public delegate void VertexAttribIPointer(int index, int size, int type,
|
||||
int stride, IntPtr pointer);
|
||||
public static VertexAttribIPointer glVertexAttribIPointer { get; private set; }
|
||||
|
||||
public delegate void EnableVertexAttribArray(int index);
|
||||
public static EnableVertexAttribArray glEnableVertexAttribArray { get; private set; }
|
||||
|
||||
@@ -595,6 +599,7 @@ namespace OpenRA.Platforms.Default
|
||||
glDeleteBuffers = Bind<DeleteBuffers>("glDeleteBuffers");
|
||||
glBindAttribLocation = Bind<BindAttribLocation>("glBindAttribLocation");
|
||||
glVertexAttribPointer = Bind<VertexAttribPointer>("glVertexAttribPointer");
|
||||
glVertexAttribIPointer = Bind<VertexAttribIPointer>("glVertexAttribIPointer");
|
||||
glEnableVertexAttribArray = Bind<EnableVertexAttribArray>("glEnableVertexAttribArray");
|
||||
glDisableVertexAttribArray = Bind<DisableVertexAttribArray>("glDisableVertexAttribArray");
|
||||
glDrawArrays = Bind<DrawArrays>("glDrawArrays");
|
||||
|
||||
@@ -13,6 +13,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using OpenRA.Graphics;
|
||||
|
||||
namespace OpenRA.Platforms.Default
|
||||
{
|
||||
@@ -135,7 +136,10 @@ namespace OpenRA.Platforms.Default
|
||||
for (ushort i = 0; i < bindings.Attributes.Length; i++)
|
||||
{
|
||||
var attribute = bindings.Attributes[i];
|
||||
OpenGL.glVertexAttribPointer(i, attribute.Components, OpenGL.GL_FLOAT, false, bindings.Stride, new IntPtr(attribute.Offset));
|
||||
if (attribute.Type == ShaderVertexAttributeType.Float)
|
||||
OpenGL.glVertexAttribPointer(i, attribute.Components, OpenGL.GL_FLOAT, false, bindings.Stride, new IntPtr(attribute.Offset));
|
||||
else
|
||||
OpenGL.glVertexAttribIPointer(i, attribute.Components, (int)attribute.Type, bindings.Stride, new IntPtr(attribute.Offset));
|
||||
OpenGL.CheckGLError();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user