use gl;
use gl::types::*;
use std::mem;
use std::ptr;
use super::enums;
#[derive(Clone, Copy)]
pub struct VAO(GLuint);
#[derive(Clone, Copy)]
pub struct VBO(GLuint);
pub fn gen_vertex_arrays(count: GLsizei, arrays: *mut VAO) {
unsafe {
gl::GenVertexArrays(count, &mut (*arrays).0);
}
}
pub fn gen_vertex_array() -> VAO {
let mut vao = VAO(0);
gen_vertex_arrays(1, &mut vao);
vao
}
pub fn gen_buffers(count: GLsizei, buffers: *mut VBO) {
unsafe {
gl::GenBuffers(count, &mut (*buffers).0);
}
}
pub fn gen_buffer() -> VBO {
let mut vbo = VBO(0);
gen_buffers(1, &mut vbo);
vbo
}
pub fn bind_vertex_array(array: VAO) {
unsafe {
gl::BindVertexArray(array.0);
}
}
pub fn bind_buffer(target: enums::Target, buffer: VBO) {
unsafe {
gl::BindBuffer(target as u32, buffer.0);
}
}
pub fn enable_vertex_attrib_array(index: GLuint) {
unsafe {
gl::EnableVertexAttribArray(index);
}
}
pub fn vertex_attrib_pointer(
index: GLuint,
size: GLint,
type_: enums::Type,
normalised: bool,
stride: GLsizei,
) {
unsafe {
gl::VertexAttribPointer(
index,
size,
type_ as GLenum,
normalised as GLboolean,
stride,
ptr::null(),
);
}
}
pub fn buffer_data<T>(target: enums::Target, data: &[T], usage: enums::Usage) {
unsafe {
gl::BufferData(
target as GLenum,
(data.len() * mem::size_of::<T>()) as GLsizeiptr,
mem::transmute(&data[0]),
usage as GLenum,
);
}
}
pub fn delete_buffers(count: GLsizei, buffers: *mut VBO) {
unsafe {
gl::DeleteBuffers(count, &mut (*buffers).0);
}
}
pub fn delete_vertex_arrays(count: GLsizei, arrays: *mut VAO) {
unsafe {
gl::DeleteVertexArrays(count, &mut (*arrays).0);
}
}