use crate::buffer;
use crate::gl;
pub struct Cube {
vao: buffer::VertexArray,
_vbo: buffer::ArrayBuffer,
}
impl Cube {
pub fn new(gl: &gl::Gl) -> Cube {
let vertices: Vec<f32> = vec![
-0.5, 0.5, 0.5, 1.0, 0.0, 0.0, 0.5, 0.5, 0.5, 0.0, 1.0, 0.0, 0.5, 0.5, -0.5, 0.0, 0.0, 1.0, -0.5, 0.5, -0.5, 0.0, 1.0, 1.0, -0.5, -0.5, 0.5, 1.0, 0.0, 1.0, 0.5, -0.5, 0.5, 1.0, 1.0, 0.0, 0.5, -0.5, -0.5, 0.1, 0.1, 0.1, -0.5, -0.5, -0.5, 1.0, 1.0, 1.0, ];
let _vertices: Vec<f32> = vec![
-0.5, -0.5, 0.5, 1.0, 0.0, 0.0, 0.5, -0.5, 0.5, 0.0, 1.0, 0.0, 0.5, -0.5, -0.5, 0.0, 0.0, 1.0, -0.5, -0.5, -0.5, 0.0, 1.0, 1.0, -0.5, 0.5, 0.5, 1.0, 0.0, 1.0, 0.5, 0.5, 0.5, 1.0, 1.0, 0.0, 0.5, 0.5, -0.5, 0.1, 0.1, 0.1, -0.5, 0.5, -0.5, 1.0, 1.0, 1.0, ];
let indices: Vec<u32> = vec![
3,2,6, 6,7,3,
0,3,2, 2,1,0,
1,5,6, 6,2,1,
5,4,7, 7,6,5,
4,7,3, 3,0,4,
4,5,1, 1,0,4,
];
let vbo = buffer::ArrayBuffer::new(gl);
let ebo = buffer::ElementArrayBuffer::new(gl);
let vao = buffer::VertexArray::new(gl);
let stride = 6;
unsafe {
vao.bind();
vbo.bind();
vbo.static_draw_data(&vertices);
ebo.bind();
gl.BufferData(
gl::ELEMENT_ARRAY_BUFFER,
(indices.len() * std::mem::size_of::<u32>()) as gl::types::GLsizeiptr,
indices.as_ptr() as *const gl::types::GLvoid,
gl::STATIC_DRAW);
gl.VertexAttribPointer(
0,
3,
gl::FLOAT,
gl::FALSE,
(stride * std::mem::size_of::<f32>()) as gl::types::GLint,
0 as *const gl::types::GLvoid,
);
gl.EnableVertexAttribArray(0);
gl.VertexAttribPointer(
1,
3,
gl::FLOAT,
gl::FALSE,
(stride * std::mem::size_of::<f32>()) as gl::types::GLint,
(3 * std::mem::size_of::<f32>()) as *const gl::types::GLvoid,
);
gl.EnableVertexAttribArray(1);
}
vbo.unbind();
vao.unbind();
Cube {
vao,
_vbo: vbo,
}
}
pub fn render(&self, gl: &gl::Gl) {
self.vao.bind();
unsafe {
gl.DrawElements(
gl::TRIANGLES,
36,
gl::UNSIGNED_INT,
0 as *const gl::types::GLvoid
);
}
}
}