| @@ -8,25 +8,20 @@ use crate::{ | |||||
| misc::{AsEnum, Bindable}, | misc::{AsEnum, Bindable}, | ||||
| }; | }; | ||||
| /* ArrayBuffer */ | |||||
| /* Buffer */ | |||||
| pub struct ArrayBuffer { | |||||
| pub struct Buffer { | |||||
| id: gl::GLuint, | id: gl::GLuint, | ||||
| target: Target, | |||||
| size: usize, | size: usize, | ||||
| } | } | ||||
| impl ArrayBuffer { | |||||
| pub fn new(target: Target) -> Result<Self, Error> { | |||||
| impl Buffer { | |||||
| pub fn new() -> Result<Self, Error> { | |||||
| let mut id = 0; | let mut id = 0; | ||||
| Error::checked(|| gl::create_buffers(1, &mut id))?; | Error::checked(|| gl::create_buffers(1, &mut id))?; | ||||
| Ok(Self { | |||||
| id, | |||||
| target, | |||||
| size: 0, | |||||
| }) | |||||
| Ok(Self { id, size: 0 }) | |||||
| } | } | ||||
| pub fn id(&self) -> gl::GLuint { | pub fn id(&self) -> gl::GLuint { | ||||
| @@ -107,12 +102,18 @@ impl ArrayBuffer { | |||||
| }) | }) | ||||
| } | } | ||||
| pub fn bind_buffer_base(&self, index: gl::GLuint) { | |||||
| gl::bind_buffer_base(self.target.as_enum(), index, self.id); | |||||
| pub fn bind_buffer_base(&self, target: Target, index: gl::GLuint) { | |||||
| gl::bind_buffer_base(target.as_enum(), index, self.id); | |||||
| } | } | ||||
| pub fn bind_buffer_range(&self, index: gl::GLuint, offset: gl::GLintptr, size: gl::GLsizeiptr) { | |||||
| gl::bind_buffer_range(self.target.as_enum(), index, self.id, offset, size); | |||||
| pub fn bind_buffer_range( | |||||
| &self, | |||||
| target: Target, | |||||
| index: gl::GLuint, | |||||
| offset: gl::GLintptr, | |||||
| size: gl::GLsizeiptr, | |||||
| ) { | |||||
| gl::bind_buffer_range(target.as_enum(), index, self.id, offset, size); | |||||
| } | } | ||||
| fn inner_map<T>(&self, access: gl::GLenum) -> Result<&mut [T], Error> { | fn inner_map<T>(&self, access: gl::GLenum) -> Result<&mut [T], Error> { | ||||
| @@ -150,26 +151,26 @@ impl ArrayBuffer { | |||||
| } | } | ||||
| } | } | ||||
| impl Drop for ArrayBuffer { | |||||
| impl Drop for Buffer { | |||||
| fn drop(&mut self) { | fn drop(&mut self) { | ||||
| gl::delete_buffers(1, &self.id); | gl::delete_buffers(1, &self.id); | ||||
| } | } | ||||
| } | } | ||||
| impl Bindable for ArrayBuffer { | |||||
| impl<'a> Bindable for (Target, &'a Buffer) { | |||||
| fn bind(&self) { | fn bind(&self) { | ||||
| gl::bind_buffer(self.target.as_enum(), self.id); | |||||
| gl::bind_buffer(self.0.as_enum(), self.1.id); | |||||
| } | } | ||||
| fn unbind(&self) { | fn unbind(&self) { | ||||
| gl::bind_buffer(self.target.as_enum(), 0); | |||||
| gl::bind_buffer(self.0.as_enum(), 0); | |||||
| } | } | ||||
| } | } | ||||
| /* Map */ | /* Map */ | ||||
| pub struct Map<'a, T> { | pub struct Map<'a, T> { | ||||
| buf: &'a ArrayBuffer, | |||||
| buf: &'a Buffer, | |||||
| data: &'a [T], | data: &'a [T], | ||||
| } | } | ||||
| @@ -190,7 +191,7 @@ impl<T> Deref for Map<'_, T> { | |||||
| /* MapMut */ | /* MapMut */ | ||||
| pub struct MapMut<'a, T> { | pub struct MapMut<'a, T> { | ||||
| buf: &'a ArrayBuffer, | |||||
| buf: &'a Buffer, | |||||
| data: &'a mut [T], | data: &'a mut [T], | ||||
| } | } | ||||
| @@ -1,6 +1,6 @@ | |||||
| pub mod angle; | pub mod angle; | ||||
| pub mod animation; | pub mod animation; | ||||
| pub mod array_buffer; | |||||
| pub mod buffer; | |||||
| pub mod error; | pub mod error; | ||||
| pub mod math; | pub mod math; | ||||
| pub mod matrix; | pub mod matrix; | ||||
| @@ -1,5 +1,5 @@ | |||||
| use crate::{ | use crate::{ | ||||
| array_buffer::ArrayBuffer, | |||||
| buffer::{Buffer, Target}, | |||||
| error::Error, | error::Error, | ||||
| misc::{AsEnum, BindGuard, Bindable}, | misc::{AsEnum, BindGuard, Bindable}, | ||||
| }; | }; | ||||
| @@ -8,7 +8,7 @@ use crate::{ | |||||
| pub struct VertexArray { | pub struct VertexArray { | ||||
| id: gl::GLuint, | id: gl::GLuint, | ||||
| buffers: Vec<ArrayBuffer>, | |||||
| buffers: Vec<Buffer>, | |||||
| } | } | ||||
| impl VertexArray { | impl VertexArray { | ||||
| @@ -16,11 +16,11 @@ impl VertexArray { | |||||
| Builder::default() | Builder::default() | ||||
| } | } | ||||
| pub fn buffers(&self) -> &Vec<ArrayBuffer> { | |||||
| pub fn buffers(&self) -> &Vec<Buffer> { | |||||
| &self.buffers | &self.buffers | ||||
| } | } | ||||
| pub fn buffers_mut(&mut self) -> &mut Vec<ArrayBuffer> { | |||||
| pub fn buffers_mut(&mut self) -> &mut Vec<Buffer> { | |||||
| &mut self.buffers | &mut self.buffers | ||||
| } | } | ||||
| } | } | ||||
| @@ -49,7 +49,7 @@ pub struct Builder { | |||||
| } | } | ||||
| impl Builder { | impl Builder { | ||||
| pub fn bind_buffer(mut self, buffer: ArrayBuffer) -> BindingBuilder { | |||||
| pub fn bind_buffer(mut self, buffer: Buffer) -> BindingBuilder { | |||||
| let binding = Binding { | let binding = Binding { | ||||
| buffer, | buffer, | ||||
| pointers: Vec::new(), | pointers: Vec::new(), | ||||
| @@ -74,7 +74,7 @@ impl Builder { | |||||
| let mut buffers = Vec::new(); | let mut buffers = Vec::new(); | ||||
| for binding in self.bindings { | for binding in self.bindings { | ||||
| let guard = BindGuard::new(&binding.buffer); | |||||
| let guard = BindGuard::new((Target::ArrayBuffer, &binding.buffer)); | |||||
| for pointer in binding.pointers { | for pointer in binding.pointers { | ||||
| Error::checked(|| gl::enable_vertex_attrib_array(pointer.index))?; | Error::checked(|| gl::enable_vertex_attrib_array(pointer.index))?; | ||||
| @@ -119,7 +119,7 @@ pub struct BindingBuilder { | |||||
| } | } | ||||
| impl BindingBuilder { | impl BindingBuilder { | ||||
| pub fn bind_buffer(self, buffer: ArrayBuffer) -> Self { | |||||
| pub fn bind_buffer(self, buffer: Buffer) -> Self { | |||||
| self.builder.bind_buffer(buffer) | self.builder.bind_buffer(buffer) | ||||
| } | } | ||||
| @@ -219,7 +219,7 @@ impl AsEnum for DataType { | |||||
| /* Binding */ | /* Binding */ | ||||
| struct Binding { | struct Binding { | ||||
| buffer: ArrayBuffer, | |||||
| buffer: Buffer, | |||||
| pointers: Vec<Pointer>, | pointers: Vec<Pointer>, | ||||
| } | } | ||||
| @@ -11,7 +11,7 @@ use std::ptr::null; | |||||
| use std::rc::{Rc, Weak}; | use std::rc::{Rc, Weak}; | ||||
| use glc::{ | use glc::{ | ||||
| array_buffer::{ArrayBuffer, Target, Usage}, | |||||
| buffer::{Buffer, Usage}, | |||||
| error::Error as GlcError, | error::Error as GlcError, | ||||
| misc::BindGuard, | misc::BindGuard, | ||||
| shader::{Program, Type, Uniform}, | shader::{Program, Type, Uniform}, | ||||
| @@ -592,7 +592,7 @@ impl Text { | |||||
| const OFFSET_TEX_MAX: gl::GLsizei = OFFSET_TEX_MIN + SIZE_VEC2; | const OFFSET_TEX_MAX: gl::GLsizei = OFFSET_TEX_MIN + SIZE_VEC2; | ||||
| const OFFSET_COLOR: gl::GLsizei = OFFSET_TEX_MAX + SIZE_VEC2; | const OFFSET_COLOR: gl::GLsizei = OFFSET_TEX_MAX + SIZE_VEC2; | ||||
| let buffer = ArrayBuffer::new(Target::ArrayBuffer)?; | |||||
| let buffer = Buffer::new()?; | |||||
| let array = VertexArray::builder() | let array = VertexArray::builder() | ||||
| .bind_buffer(buffer) | .bind_buffer(buffer) | ||||
| .vertex_attrib_pointer(0, 2, DataType::Float, false, STRIDE, OFFSET_POS_MIN)? | .vertex_attrib_pointer(0, 2, DataType::Float, false, STRIDE, OFFSET_POS_MIN)? | ||||
| @@ -1,14 +1,14 @@ | |||||
| #![allow(dead_code)] | #![allow(dead_code)] | ||||
| use glc::{ | use glc::{ | ||||
| array_buffer::{ArrayBuffer, Target, Usage}, | |||||
| buffer::{Buffer, Target, Usage}, | |||||
| error::Error, | error::Error, | ||||
| matrix::Matrix4f, | matrix::Matrix4f, | ||||
| vector::Vector2f, | vector::Vector2f, | ||||
| }; | }; | ||||
| pub struct Camera { | pub struct Camera { | ||||
| buffer: ArrayBuffer, | |||||
| buffer: Buffer, | |||||
| data: Data, | data: Data, | ||||
| view_invert: Matrix4f, | view_invert: Matrix4f, | ||||
| projection_invert: Matrix4f, | projection_invert: Matrix4f, | ||||
| @@ -30,7 +30,7 @@ impl Camera { | |||||
| view: Matrix4f::identity(), | view: Matrix4f::identity(), | ||||
| size: Vector2f::default(), | size: Vector2f::default(), | ||||
| }; | }; | ||||
| let mut buffer = ArrayBuffer::new(Target::UniformBuffer)?; | |||||
| let mut buffer = Buffer::new()?; | |||||
| buffer.buffer_data(Usage::StaticDraw, &[data.clone()])?; | buffer.buffer_data(Usage::StaticDraw, &[data.clone()])?; | ||||
| Ok(Self { | Ok(Self { | ||||
| @@ -100,7 +100,7 @@ impl Camera { | |||||
| } | } | ||||
| pub fn bind(&self, index: gl::GLuint) -> Result<(), Error> { | pub fn bind(&self, index: gl::GLuint) -> Result<(), Error> { | ||||
| Error::checked(|| self.buffer.bind_buffer_base(index)) | |||||
| Error::checked(|| self.buffer.bind_buffer_base(Target::UniformBuffer, index)) | |||||
| } | } | ||||
| pub fn world_to_view<T: Into<Vector2f>>(&self, pos: T) -> Vector2f { | pub fn world_to_view<T: Into<Vector2f>>(&self, pos: T) -> Vector2f { | ||||
| @@ -3,7 +3,7 @@ | |||||
| use std::mem::size_of; | use std::mem::size_of; | ||||
| use glc::{ | use glc::{ | ||||
| array_buffer::{ArrayBuffer, Target, Usage}, | |||||
| buffer::{Buffer, Usage}, | |||||
| misc::Bindable, | misc::Bindable, | ||||
| shader::{Program, Type, Uniform}, | shader::{Program, Type, Uniform}, | ||||
| vector::{Vector2f, Vector4f}, | vector::{Vector2f, Vector4f}, | ||||
| @@ -78,11 +78,11 @@ fn create_array_quad() -> Result<VertexArray, Error> { | |||||
| const STRIDE_POS: gl::GLsizei = size_of::<Vector2f>() as gl::GLsizei; | const STRIDE_POS: gl::GLsizei = size_of::<Vector2f>() as gl::GLsizei; | ||||
| const OFFSET_POS: gl::GLsizei = 0; | const OFFSET_POS: gl::GLsizei = 0; | ||||
| let mut array_buffer = ArrayBuffer::new(Target::ArrayBuffer)?; | |||||
| array_buffer.buffer_data(Usage::StaticDraw, vertices)?; | |||||
| let mut buffer = Buffer::new()?; | |||||
| buffer.buffer_data(Usage::StaticDraw, vertices)?; | |||||
| let vertex_array = VertexArray::builder() | let vertex_array = VertexArray::builder() | ||||
| .bind_buffer(array_buffer) | |||||
| .bind_buffer(buffer) | |||||
| .vertex_attrib_pointer(0, 2, DataType::Float, false, STRIDE_POS, OFFSET_POS)? | .vertex_attrib_pointer(0, 2, DataType::Float, false, STRIDE_POS, OFFSET_POS)? | ||||
| .build()?; | .build()?; | ||||
| @@ -93,10 +93,10 @@ fn create_array_line() -> Result<VertexArray, Error> { | |||||
| const STRIDE_POS: gl::GLsizei = size_of::<Vector2f>() as gl::GLsizei; | const STRIDE_POS: gl::GLsizei = size_of::<Vector2f>() as gl::GLsizei; | ||||
| const OFFSET_POS: gl::GLsizei = 0; | const OFFSET_POS: gl::GLsizei = 0; | ||||
| let array_buffer = ArrayBuffer::new(Target::ArrayBuffer)?; | |||||
| let buffer = Buffer::new()?; | |||||
| let vertex_array = VertexArray::builder() | let vertex_array = VertexArray::builder() | ||||
| .bind_buffer(array_buffer) | |||||
| .bind_buffer(buffer) | |||||
| .vertex_attrib_pointer(0, 2, DataType::Float, false, STRIDE_POS, OFFSET_POS)? | .vertex_attrib_pointer(0, 2, DataType::Float, false, STRIDE_POS, OFFSET_POS)? | ||||
| .build()?; | .build()?; | ||||
| @@ -1,12 +1,12 @@ | |||||
| use std::time::Instant; | use std::time::Instant; | ||||
| use glc::{ | use glc::{ | ||||
| array_buffer::{ArrayBuffer, Target, Usage}, | |||||
| buffer::{Buffer, Target, Usage}, | |||||
| error::Error, | error::Error, | ||||
| }; | }; | ||||
| pub struct Uniform { | pub struct Uniform { | ||||
| buffer: ArrayBuffer, | |||||
| buffer: Buffer, | |||||
| start_time: Instant, | start_time: Instant, | ||||
| } | } | ||||
| @@ -17,7 +17,7 @@ struct Data { | |||||
| impl Uniform { | impl Uniform { | ||||
| pub fn new() -> Result<Self, Error> { | pub fn new() -> Result<Self, Error> { | ||||
| let mut buffer = ArrayBuffer::new(Target::UniformBuffer)?; | |||||
| let mut buffer = Buffer::new()?; | |||||
| buffer.buffer_data(Usage::StaticDraw, &[Data { time: 0.0 }])?; | buffer.buffer_data(Usage::StaticDraw, &[Data { time: 0.0 }])?; | ||||
| Ok(Self { | Ok(Self { | ||||
| @@ -37,6 +37,6 @@ impl Uniform { | |||||
| } | } | ||||
| pub fn bind(&self, index: gl::GLuint) -> Result<(), Error> { | pub fn bind(&self, index: gl::GLuint) -> Result<(), Error> { | ||||
| Error::checked(|| self.buffer.bind_buffer_base(index)) | |||||
| Error::checked(|| self.buffer.bind_buffer_base(Target::UniformBuffer, index)) | |||||
| } | } | ||||
| } | } | ||||