using System; using OpenTK.Graphics.OpenGL; using RecrownedGTK.Graphics.Render.Shader; namespace RecrownedGTK.Graphics { public class VertexAttributesHandle : IDisposable { private bool disposed; private int handle; private bool begun; public VertexAttributesHandle() { handle = GL.GenVertexArray(); } public void Begin() { if (begun) throw new InvalidOperationException("The VertexArrayHandle has already been started."); GL.BindVertexArray(handle); begun = true; } public void End() { if (!begun) throw new InvalidOperationException("The VertexArrayHandle has never been started."); GL.BindVertexArray(0); begun = false; } /// /// Creates a basic vertex attributes object handle that takes in vertices, texture coordinates, and a color. /// /// The shader program used. Default is the one created from . /// The name of the attribute for the vertex's position in the shader. Default is "aPosition". /// The name of the attribute for the texture's coordinate. Default is "aTexture". /// The name of the attribute for color mixture. Default is "aColor". /// The built . public static VertexAttributesHandle CreateBasicVA(Shader shader = null, string positionAttribName = "aPosition", string textureAttribName = "aTexture", string colorAttribName = "aColor") { if (shader == null) shader = Shader.CreateBasicShader(); VertexAttributesHandle vertexAttribs = new VertexAttributesHandle(); 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)); vertexAttribs.End(); return vertexAttribs; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposed) return; if (disposing) { } GL.BindVertexArray(0); GL.DeleteVertexArray(handle); disposed = true; } ~VertexAttributesHandle() { Dispose(false); } } }