52 lines
1.2 KiB
C#
52 lines
1.2 KiB
C#
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);
|
|
}
|
|
} |