use gl::types::*;
#[repr(u32)]
#[derive(Clone, Copy)]
pub enum BufferTarget {
ArrayBuffer = 0x8892, CopyReadBuffer = 0x8F36, CopyWriteBuffer = 0x8F37, ElementArrayBuffer = 0x8893, PixelPackBuffer = 0x88EB, PixelUnpackBuffer = 0x88EC, TextureBuffer = 0x8C2A, TransformFeedbackBuffer = 0x8C8E, UniformBuffer = 0x8A11, }
#[repr(u32)]
#[derive(Clone, Copy)]
pub enum BufferUsage {
StreamDraw = 0x88E0, StreamRead = 0x88E1, StreamCopy = 0x88E2, StaticDraw = 0x88E4, StaticRead = 0x88E5, StaticCopy = 0x88E6, DynamicDraw = 0x88E8, DynamicRead = 0x88E9, DynamicCopy = 0x88EA, }
pub struct BufferObject {
target: BufferTarget,
usage: BufferUsage,
id: u32,
}
impl BufferObject {
pub fn new(target: BufferTarget, usage: BufferUsage) -> BufferObject {
let mut id = 0;
unsafe { gl::GenBuffers(1, &mut id) };
BufferObject { id, target, usage }
}
pub fn bind(&self) {
unsafe { gl::BindBuffer(self.target as u32, self.id) }
}
pub fn unbind(&self) {
unsafe { gl::BindBuffer(self.target as u32, 0) }
}
pub fn data<T>(&self, data: &[T]) {
unsafe {
gl::BufferData(
self.target as GLenum, std::mem::size_of_val(data) as GLsizeiptr, data.as_ptr() as *const GLvoid, self.usage as GLenum, );
}
}
}
impl Drop for BufferObject {
fn drop(&mut self) {
unsafe { gl::DeleteBuffers(1, &self.id) }
}
}