use crate::gl;
pub struct ArrayBuffer {
vao: gl::types::GLuint,
vbo: gl::types::GLuint,
components: u32,
len: usize,
}
impl ArrayBuffer {
pub fn new(components: u32) -> Self {
let mut vao: gl::types::GLuint = 0;
unsafe {
gl::GenVertexArrays(1, &mut vao);
gl::BindVertexArray(vao);
}
let mut vbo: gl::types::GLuint = 0;
unsafe {
gl::GenBuffers(1, &mut vbo);
}
Self {
vao,
vbo,
components,
len: 0,
}
}
pub fn len(&self) -> usize {
self.len
}
pub fn set_data(&mut self, vertices: Vec<f32>) {
self.len = vertices.len() / self.components as usize;
unsafe {
gl::BindVertexArray(self.vao);
gl::BindBuffer(gl::ARRAY_BUFFER, self.vbo);
gl::BufferData(
gl::ARRAY_BUFFER, (vertices.len() * std::mem::size_of::<f32>()) as gl::types::GLsizeiptr, vertices.as_ptr() as *const gl::types::GLvoid, gl::STATIC_DRAW, );
}
}
pub fn bind(&self, attrib_location: i32, offs: usize, num: u32) {
unsafe {
gl::BindVertexArray(self.vao);
gl::EnableVertexAttribArray(attrib_location as u32); gl::BindBuffer(gl::ARRAY_BUFFER, self.vbo);
gl::VertexAttribPointer(
attrib_location as u32, num as i32, gl::FLOAT, gl::FALSE, ((self.components as usize) * std::mem::size_of::<f32>()) as gl::types::GLint, (offs * std::mem::size_of::<f32>()) as *const _, );
}
}
}