using OpenTK.Graphics.OpenGL; using Serilog; namespace Engine.Renderer.Buffer; public class IndexBuffer : OpenGlObject { internal int Count { get; } public IndexBuffer(int count, BufferStorageFlags flags) { Count = count; GL.CreateBuffers(1, out int handle); Handle = handle; GL.NamedBufferStorage(Handle, Count * sizeof(uint), IntPtr.Zero, flags); Log.Debug("Index buffer {Handle} created with {Count} elements", Handle, Count); } public void UploadData(uint[] data) { UploadData(0, data); } public void UploadData(int offset, uint[] data) { if (offset < 0) throw new ArgumentException("Offset must be greater than 0"); if (data.Length + offset > Count) throw new ArgumentException("Data array is too large"); GL.NamedBufferSubData(Handle, offset, data.Length * sizeof(uint), data); } internal override void Bind() { GL.BindBuffer(BufferTarget.ElementArrayBuffer, Handle); } internal override void Unbind() { GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); } protected override void Destroy() { GL.DeleteBuffer(Handle); } }