use crate::graphics::{
core::GLError,
core::buffer::{
BufferTarget,
BufferUsage,
},
level0::Buffer,
};
pub struct VertexBuffer<V:Sized>{
buffer:Buffer<V>
}
impl<V:Sized> VertexBuffer<V>{
#[inline(always)]
pub fn generate()->VertexBuffer<V>{
Self{
buffer:Buffer::generate(),
}
}
#[inline(always)]
pub unsafe fn raw(buffer:Buffer<V>)->VertexBuffer<V>{
Self{
buffer,
}
}
pub fn new(vertices:&[V],usage:BufferUsage)->Result<VertexBuffer<V>,GLError>{
let buffer=VertexBuffer::generate();
let result=buffer.rewrite(vertices,usage);
if result.is_error(){
Err(result)
}
else{
Ok(buffer)
}
}
pub fn empty(size:isize,usage:BufferUsage)->Result<VertexBuffer<V>,GLError>{
let buffer=VertexBuffer::generate();
let result=buffer.rewrite_empty(size,usage);
if result.is_error(){
Err(result)
}
else{
Ok(buffer)
}
}
#[inline(always)]
pub fn as_raw(&self)->&Buffer<V>{
&self.buffer
}
#[inline(always)]
pub fn into_raw(self)->Buffer<V>{
self.buffer
}
#[inline(always)]
pub fn bind(&self)->GLError{
self.buffer.bind(BufferTarget::ArrayBuffer)
}
pub fn write(&self,offset:isize,vertices:&[V])->GLError{
let result=self.bind();
if result.is_error(){
result
}
else{
Buffer::write(BufferTarget::ArrayBuffer,offset,vertices)
}
}
pub fn rewrite(&self,vertices:&[V],usage:BufferUsage)->GLError{
let result=self.bind();
if result.is_error(){
result
}
else{
Buffer::rewrite(BufferTarget::ArrayBuffer,vertices,usage)
}
}
pub fn rewrite_empty(&self,size:isize,usage:BufferUsage)->GLError{
let result=self.bind();
if result.is_error(){
result
}
else{
Buffer::<V>::rewrite_empty(BufferTarget::ArrayBuffer,size,usage)
}
}
}