FModel/FModel/Views/Snooper/Buffers/BufferObject.cs
2023-02-08 22:18:19 +01:00

56 lines
1.5 KiB
C#

using System;
using OpenTK.Graphics.OpenGL4;
namespace FModel.Views.Snooper.Buffers;
public class BufferObject<TDataType> : IDisposable where TDataType : unmanaged
{
private readonly int _handle;
private readonly BufferTarget _bufferTarget;
private BufferObject(BufferTarget bufferTarget)
{
_bufferTarget = bufferTarget;
_handle = GL.GenBuffer();
Bind();
}
public unsafe BufferObject(TDataType[] data, BufferTarget bufferTarget) : this(bufferTarget)
{
GL.BufferData(bufferTarget, data.Length * sizeof(TDataType), data, BufferUsageHint.StaticDraw);
}
public unsafe void Update(int offset, TDataType data)
{
GL.BufferSubData(_bufferTarget, (IntPtr) (offset * sizeof(TDataType)), sizeof(TDataType), ref data);
}
public unsafe void Update(TDataType[] data)
{
GL.BufferSubData(_bufferTarget, IntPtr.Zero, data.Length * sizeof(TDataType), data);
}
public void Bind()
{
GL.BindBuffer(_bufferTarget, _handle);
}
public void BindBufferBase(int index)
{
if (_bufferTarget != BufferTarget.ShaderStorageBuffer)
throw new ArgumentException("BindBufferBase is not allowed for anything but Shader Storage Buffers");
GL.BindBufferBase(BufferRangeTarget.ShaderStorageBuffer, index, _handle);
}
public void Unbind()
{
GL.BindBuffer(_bufferTarget, 0);
}
public void Dispose()
{
GL.DeleteBuffer(_handle);
}
}