bowtie/gl_utils/
vertex_array_buffer.rs

1use std::mem::size_of;
2
3use super::gl_translation::{DataType, DrawingMode, ToGl, UsageMode};
4
5pub struct VertexArrayBuffer<T> {
6  id: u32,
7  data_type: DataType,
8  vertices: Vec<T>,
9  usage_mode: UsageMode,
10}
11
12impl<T> VertexArrayBuffer<T> {
13  /**
14   * Generates a gl vertex array buffer, binds and loads data from elements.
15   * Then, a VertexArrayBuffer with the buffer id is returned.
16   */
17  pub fn new(
18    data_type: DataType,
19    usage_mode: UsageMode,
20  ) -> VertexArrayBuffer<T> {
21    let mut id: u32 = 0;
22    unsafe {
23      gl::GenBuffers(1, &mut id);
24    }
25
26    return VertexArrayBuffer {
27      id,
28      data_type,
29      vertices: vec![],
30      usage_mode,
31    };
32  }
33
34  pub fn get_vertices_len(&self) -> usize {
35    self.vertices.len()
36  }
37
38  pub fn update_data(&mut self, vertices: &Vec<T>) {
39    unsafe {
40      gl::BindBuffer(gl::ARRAY_BUFFER, self.id);
41      gl::BufferData(
42        gl::ARRAY_BUFFER,
43        (size_of::<T>() * vertices.len()) as isize,
44        vertices.as_ptr() as *const gl::types::GLvoid,
45        self.usage_mode.to_gl(),
46      )
47    }
48  }
49
50  pub fn draw(&self, drawing_mode: DrawingMode) {
51    unsafe {
52      gl::BindBuffer(gl::ARRAY_BUFFER, self.id);
53      gl::DrawArrays(drawing_mode.to_gl(), 0, self.vertices.len() as i32);
54    }
55  }
56}
57
58impl<T> Drop for VertexArrayBuffer<T> {
59  fn drop(&mut self) {
60    unsafe { gl::DeleteBuffers(1, &self.id) };
61  }
62}