From 25b5ca97c5e5597570360c37d7452662e0118a00 Mon Sep 17 00:00:00 2001 From: HampusM Date: Fri, 13 Oct 2023 22:34:23 +0200 Subject: refactor(engine): make vertex buffer wrapper hold single buffer --- engine/src/renderer/mod.rs | 12 ++--- engine/src/renderer/vertex_buffer.rs | 77 +++++++++++++++++++++++++++++++ engine/src/renderer/vertex_buffers.rs | 87 ----------------------------------- 3 files changed, 82 insertions(+), 94 deletions(-) create mode 100644 engine/src/renderer/vertex_buffer.rs delete mode 100644 engine/src/renderer/vertex_buffers.rs (limited to 'engine') diff --git a/engine/src/renderer/mod.rs b/engine/src/renderer/mod.rs index bbcb5e9..364b7f4 100644 --- a/engine/src/renderer/mod.rs +++ b/engine/src/renderer/mod.rs @@ -4,12 +4,12 @@ use std::process::abort; use glfw::WindowSize; use crate::renderer::vertex_array::{PrimitiveKind, VertexArray}; -use crate::renderer::vertex_buffers::{BufferUsage, VertexBuffers}; +use crate::renderer::vertex_buffer::{BufferUsage, VertexBuffer}; use crate::vector::Vec2; use crate::vertex::Vertex; mod vertex_array; -mod vertex_buffers; +mod vertex_buffer; pub fn initialize(window: &glfw::Window) -> Result<(), Error> { @@ -56,7 +56,7 @@ pub struct Renderable vertex_arr: VertexArray, /// Vertex buffer has to live as long as the vertex array - _vertex_buffer: VertexBuffers<1>, + _vertex_buffer: VertexBuffer, } impl Renderable @@ -67,11 +67,9 @@ impl Renderable vertex_arr.bind(); - let vertex_buffer = VertexBuffers::<1>::new(); + let vertex_buffer = VertexBuffer::new(); - vertex_buffer - .store(0, vertices, BufferUsage::Static) - .unwrap(); + vertex_buffer.store(vertices, BufferUsage::Static); VertexArray::configure_attrs(); diff --git a/engine/src/renderer/vertex_buffer.rs b/engine/src/renderer/vertex_buffer.rs new file mode 100644 index 0000000..27ed705 --- /dev/null +++ b/engine/src/renderer/vertex_buffer.rs @@ -0,0 +1,77 @@ +use std::mem::size_of_val; + +use crate::vertex::Vertex; + +#[derive(Debug)] +pub struct VertexBuffer +{ + buffer: gl::types::GLuint, +} + +impl VertexBuffer +{ + pub fn new() -> Self + { + let mut buffer = gl::types::GLuint::default(); + + unsafe { + gl::GenBuffers(1, &mut buffer); + }; + + Self { buffer } + } + + pub fn store(&self, vertices: &[Vertex], usage: BufferUsage) + { + unsafe { + gl::BindBuffer(gl::ARRAY_BUFFER, self.buffer); + } + + unsafe { + #[allow(clippy::cast_possible_wrap)] + gl::BufferData( + gl::ARRAY_BUFFER, + size_of_val(vertices) as gl::types::GLsizeiptr, + vertices.as_ptr().cast(), + usage.into_gl(), + ); + } + } +} + +impl Drop for VertexBuffer +{ + fn drop(&mut self) + { + #[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)] + unsafe { + gl::DeleteBuffers(1, &self.buffer); + } + } +} + +#[derive(Debug)] +#[allow(dead_code)] +pub enum BufferUsage +{ + /// The buffer data is set only once and used by the GPU at most a few times. + Stream, + + /// The buffer data is set only once and used many times. + Static, + + /// The buffer data is changed a lot and used many times. + Dynamic, +} + +impl BufferUsage +{ + fn into_gl(self) -> gl::types::GLenum + { + match self { + Self::Stream => gl::STREAM_DRAW, + Self::Static => gl::STATIC_DRAW, + Self::Dynamic => gl::DYNAMIC_DRAW, + } + } +} diff --git a/engine/src/renderer/vertex_buffers.rs b/engine/src/renderer/vertex_buffers.rs deleted file mode 100644 index e7cba91..0000000 --- a/engine/src/renderer/vertex_buffers.rs +++ /dev/null @@ -1,87 +0,0 @@ -use std::mem::size_of_val; - -use crate::vertex::Vertex; - -#[derive(Debug)] -pub struct VertexBuffers -{ - buffers: [gl::types::GLuint; CNT], -} - -impl VertexBuffers -{ - pub fn new() -> Self - { - let mut buffers = [gl::types::GLuint::default(); CNT]; - - unsafe { - #[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)] - gl::GenBuffers(CNT as gl::types::GLsizei, buffers.as_mut_ptr()); - }; - - Self { buffers } - } - - pub fn store( - &self, - buffer_index: usize, - vertices: &[Vertex], - usage: BufferUsage, - ) -> Option<()> - { - let buffer = *self.buffers.get(buffer_index)?; - - unsafe { - gl::BindBuffer(gl::ARRAY_BUFFER, buffer); - } - - unsafe { - #[allow(clippy::cast_possible_wrap)] - gl::BufferData( - gl::ARRAY_BUFFER, - size_of_val(vertices) as gl::types::GLsizeiptr, - vertices.as_ptr().cast(), - usage.into_gl(), - ); - } - - Some(()) - } -} - -impl Drop for VertexBuffers -{ - fn drop(&mut self) - { - #[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)] - unsafe { - gl::DeleteBuffers(CNT as gl::types::GLsizei, self.buffers.as_ptr()); - } - } -} - -#[derive(Debug)] -#[allow(dead_code)] -pub enum BufferUsage -{ - /// The buffer data is set only once and used by the GPU at most a few times. - Stream, - - /// The buffer data is set only once and used many times. - Static, - - /// The buffer data is changed a lot and used many times. - Dynamic, -} - -impl BufferUsage -{ - fn into_gl(self) -> gl::types::GLenum - { - match self { - Self::Stream => gl::STREAM_DRAW, - Self::Static => gl::STATIC_DRAW, - Self::Dynamic => gl::DYNAMIC_DRAW, - } - } -} -- cgit v1.2.3-18-g5258