55 lines
2.9 KiB
C#
55 lines
2.9 KiB
C#
using System;
|
|
using OpenTK.Graphics.OpenGL;
|
|
using OpenTK;
|
|
using RecrownedGTK.Graphics.Render.Shader;
|
|
namespace RecrownedGTK.Graphics {
|
|
public class VertexAttributesArrayHandle : IDisposable {
|
|
private bool disposed;
|
|
private int handle;
|
|
public VertexAttributesArrayHandle() {
|
|
handle = GL.GenVertexArray();
|
|
}
|
|
|
|
public void Bind() {
|
|
GL.BindVertexArray(handle);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a basic vertex attributes object handle that takes in vertices, texture coordinates, and a color.
|
|
/// First 3 values are normalized vertex position (x, y, z), second two are texture coordinates, and last 4 are color values.
|
|
/// </summary>
|
|
/// <param name="shader">The shader program used. Default is the one created from <see cref="RecrownedGTK.Graphics.Render.Shader.Shader.CreateBasicShader"/>.</param>
|
|
/// <param name="positionAttribName">The name of the attribute for the vertex's position in the shader. Default is "aPosition".</param>
|
|
/// <param name="textureAttribName">The name of the attribute for the texture's coordinate. Default is "aTexture".</param>
|
|
/// <param name="colorAttribName">The name of the attribute for color mixture. Default is "aColor".</param>
|
|
/// <returns>The built <see cref="RecrownedGTK.Graphics.VertexAttributesArrayHandle"/>.</returns>
|
|
public static VertexAttributesArrayHandle CreateBasicVA(Shader shader = null, string positionAttribName = "aPosition", string textureAttribName = "aTexture", string colorAttribName = "aColor", string transformUnifName = "transform", Matrix4 transformMat = default(Matrix4)) {
|
|
if (shader == null) shader = Shader.CreateBasicShader();
|
|
VertexAttributesArrayHandle vertexAttribs = new VertexAttributesArrayHandle();
|
|
vertexAttribs.Bind();
|
|
if (transformMat == default(Matrix4)) transformMat = Matrix4.Identity;
|
|
GL.UniformMatrix4(shader.GetAttribLocation(transformUnifName), true, ref transformMat);
|
|
GL.VertexAttribPointer(shader.GetAttribLocation(positionAttribName), 3, VertexAttribPointerType.Float, false, 9 * sizeof(float), 0);
|
|
GL.VertexAttribPointer(shader.GetAttribLocation(textureAttribName), 2, VertexAttribPointerType.Float, false, 9 * sizeof(float), 3 * sizeof(float));
|
|
GL.VertexAttribPointer(shader.GetAttribLocation(colorAttribName), 4, VertexAttribPointerType.Float, false, 9 * sizeof(float), 5 * sizeof(float));
|
|
return vertexAttribs;
|
|
}
|
|
|
|
public void Dispose() {
|
|
Dispose(true);
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
|
|
protected virtual void Dispose(bool disposing) {
|
|
if (disposed) return;
|
|
if (disposing) {
|
|
|
|
}
|
|
GL.DeleteVertexArray(handle);
|
|
disposed = true;
|
|
}
|
|
~VertexAttributesArrayHandle() {
|
|
Dispose(false);
|
|
}
|
|
}
|
|
} |