bowtie/gl_utils/
vertex_array_buffer.rs1use 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 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}