Documentation
use core::mem;

use gl;
use gl::types::*;

use super::DataKind;


#[derive(Debug, Clone, Hash)]
pub struct GLVertex {
    location: usize,
    item_count: usize,
    kind: DataKind,
    stride: usize,
    offset: usize,
}

impl GLVertex {

    #[inline(always)]
    pub fn new(location: usize, item_count: usize, kind: DataKind, stride: usize, offset: usize) -> Self {
        GLVertex {
            location: location,
            item_count: item_count,
            kind: kind,
            stride: stride,
            offset: offset,
        }
    }

    #[inline(always)]
    pub fn location(&self) -> usize { self.location }
    #[inline(always)]
    pub fn item_count(&self) -> usize { self.item_count }
    #[inline(always)]
    pub fn kind(&self) -> DataKind { self.kind }
    #[inline(always)]
    pub fn stride(&self) -> usize { self.stride }
    #[inline(always)]
    pub fn offset(&self) -> usize { self.offset }


    #[inline(always)]
    pub fn enable(&self) -> &Self {
        unsafe {
            gl::EnableVertexAttribArray(self.location() as GLuint);
        }
        self
    }
    #[inline(always)]
    pub fn disable(&self) -> &Self {
        unsafe {
            gl::DisableVertexAttribArray(self.location() as GLuint);
        }
        self
    }

    #[inline]
    pub fn bind(&self) -> &Self {
        unsafe {
            gl::VertexAttribPointer(
                self.location as GLuint,
                self.item_count as GLint,
                self.kind.to_gl(),
                gl::FALSE,
                self.stride as GLsizei,
                mem::transmute(self.offset)
            );
        }
        self
    }
}