diff options
Diffstat (limited to 'engine/src/renderer')
-rw-r--r-- | engine/src/renderer/mod.rs | 35 | ||||
-rw-r--r-- | engine/src/renderer/vertex_array.rs | 51 | ||||
-rw-r--r-- | engine/src/renderer/vertex_buffers.rs | 4 |
3 files changed, 58 insertions, 32 deletions
diff --git a/engine/src/renderer/mod.rs b/engine/src/renderer/mod.rs index 13091fd..bbcb5e9 100644 --- a/engine/src/renderer/mod.rs +++ b/engine/src/renderer/mod.rs @@ -1,13 +1,12 @@ -use std::ffi::{c_float, c_void, CString}; -use std::mem::size_of; +use std::ffi::{c_void, CString}; use std::process::abort; -use std::ptr::null; use glfw::WindowSize; use crate::renderer::vertex_array::{PrimitiveKind, VertexArray}; use crate::renderer::vertex_buffers::{BufferUsage, VertexBuffers}; use crate::vector::Vec2; +use crate::vertex::Vertex; mod vertex_array; mod vertex_buffers; @@ -62,7 +61,7 @@ pub struct Renderable impl Renderable { - pub fn new(shader_program: crate::shader::Program, vertices: &[f32]) -> Self + pub fn new(shader_program: crate::shader::Program, vertices: &[Vertex]) -> Self { let vertex_arr = VertexArray::new(); @@ -74,8 +73,7 @@ impl Renderable .store(0, vertices, BufferUsage::Static) .unwrap(); - vertex_attrib_ptr(0); - enable_vertex_attrib_array(0); + VertexArray::configure_attrs(); Self { shader_program, @@ -105,28 +103,3 @@ pub enum Error #[error("Failed to get window size")] GetWindowSizeFailed(#[source] glfw::Error), } - -fn vertex_attrib_ptr(index: usize) -{ - let stride = 3 * size_of::<c_float>(); - - unsafe { - #[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)] - gl::VertexAttribPointer( - index as gl::types::GLuint, - 3, - gl::FLOAT, - gl::FALSE, - stride as gl::types::GLsizei, - null(), - ); - } -} - -fn enable_vertex_attrib_array(index: usize) -{ - unsafe { - #[allow(clippy::cast_possible_truncation)] - gl::EnableVertexAttribArray(index as gl::types::GLuint); - } -} diff --git a/engine/src/renderer/vertex_array.rs b/engine/src/renderer/vertex_array.rs index 5862c7b..b0aac81 100644 --- a/engine/src/renderer/vertex_array.rs +++ b/engine/src/renderer/vertex_array.rs @@ -1,3 +1,9 @@ +use std::mem::size_of; + +use crate::vertex::{Attribute, AttributeComponentType, Vertex}; + +const VERTEX_STRIDE: usize = size_of::<Vertex>(); + #[derive(Debug)] pub struct VertexArray { @@ -31,10 +37,55 @@ impl VertexArray } } + pub fn configure_attrs() + { + let mut offset = 0; + + for attr in Vertex::attrs() { + Self::vertex_attrib_ptr(attr, offset); + + Self::enable_vertex_attrib_array(attr.index); + + offset += attr.component_size * attr.component_cnt as usize; + } + } + pub fn bind(&self) { unsafe { gl::BindVertexArray(self.array) } } + + fn vertex_attrib_ptr(vertex_attr: &Attribute, offset: usize) + { + unsafe { + #[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)] + gl::VertexAttribPointer( + vertex_attr.index as gl::types::GLuint, + vertex_attr.component_cnt as i32, + Self::vertex_attr_type_to_gl(&vertex_attr.component_type), + gl::FALSE, + VERTEX_STRIDE as gl::types::GLsizei, + offset as *const _, + ); + } + } + + fn enable_vertex_attrib_array(index: usize) + { + unsafe { + #[allow(clippy::cast_possible_truncation)] + gl::EnableVertexAttribArray(index as gl::types::GLuint); + } + } + + fn vertex_attr_type_to_gl( + vertex_attr_type: &AttributeComponentType, + ) -> gl::types::GLenum + { + match vertex_attr_type { + AttributeComponentType::Float => gl::FLOAT, + } + } } impl Drop for VertexArray diff --git a/engine/src/renderer/vertex_buffers.rs b/engine/src/renderer/vertex_buffers.rs index bb988d9..e7cba91 100644 --- a/engine/src/renderer/vertex_buffers.rs +++ b/engine/src/renderer/vertex_buffers.rs @@ -1,5 +1,7 @@ use std::mem::size_of_val; +use crate::vertex::Vertex; + #[derive(Debug)] pub struct VertexBuffers<const CNT: usize> { @@ -23,7 +25,7 @@ impl<const CNT: usize> VertexBuffers<CNT> pub fn store( &self, buffer_index: usize, - vertices: &[f32], + vertices: &[Vertex], usage: BufferUsage, ) -> Option<()> { |