1use crate::prelude::*;
2use crate::data::Buffer;
3use crate::{Context, GLContext};
4
5type VertexArrayObjectResource = <glow::Context as HasContext>::VertexArray;
6
7pub struct VertexArrayObject {
9 gl : GLContext,
10 resource : VertexArrayObjectResource,
11 vertices : u32
12}
13
14impl VertexArrayObject {
15 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 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 pub fn set_vertices(&mut self, vertices : u32) {
48 self.vertices = vertices;
49 }
50
51 pub fn get_vertices(&self) -> u32 {
53 self.vertices
54 }
55
56 }
65
66impl Drop for VertexArrayObject {
67 fn drop(&mut self) {
68 unsafe {
69 self.gl.delete_vertex_array(self.resource());
70 }
71 }
72}