gpu/data/
vao.rs

1use crate::prelude::*;
2use crate::data::Buffer;
3use crate::{Context, GLContext};
4
5type VertexArrayObjectResource = <glow::Context as HasContext>::VertexArray;
6
7/// `VertexArrayObject` representation.
8pub struct VertexArrayObject {
9    gl       : GLContext,
10    resource : VertexArrayObjectResource,
11    vertices : u32
12}
13
14impl VertexArrayObject {
15    /// Creates a new `VertexArrayObject`.
16    pub fn new(context:&Context) -> Self {
17        let gl = context.gl_context();
18        let resource = unsafe {
19            gl.create_vertex_array().expect("Couldn't create VertexArrayObject")
20        };
21        let vertices = 0;
22        Self { gl, resource, vertices }
23    }
24
25    pub(crate) fn resource(&self) -> VertexArrayObjectResource {
26        self.resource
27    }
28
29    pub(crate) fn bind(&self) {
30        unsafe {
31            self.gl.bind_vertex_array(Some(self.resource()));
32        }
33    }
34
35    /// Sets a `Buffer` as a vertices sources, where each vertex has `n_elements`
36    pub fn set_vertex_buffer(&mut self, buffer : &Buffer, attribute_index: u32, n_elements: u32) {
37        let gl = &self.gl;
38        self.bind();
39        buffer.bind();
40        unsafe {
41            gl.enable_vertex_attrib_array(attribute_index);
42            gl.vertex_attrib_pointer_f32(attribute_index, n_elements as i32, glow::FLOAT, false, 0, 0);
43        }
44    }
45
46    /// Sets the number of vertices.
47    pub fn set_vertices(&mut self, vertices : u32) {
48        self.vertices = vertices;
49    }
50
51    /// Gets the number of vertices.
52    pub fn get_vertices(&self) -> u32 {
53        self.vertices
54    }
55
56    // TODO:
57    // pub fn set_index_buffer(&mut self, buffer : &Buffer, elements: u32) {
58    //     unsafe {
59    //         gl::BindVertexArray(self.id);
60    //         gl::BindBuffer(gl::ELEMENT_ARRAY_BUFFER, buffer.id);
61    //         gl::
62    //     }
63    // }
64}
65
66impl Drop for VertexArrayObject {
67    fn drop(&mut self) {
68        unsafe {
69            self.gl.delete_vertex_array(self.resource());
70        }
71    }
72}