summaryrefslogtreecommitdiff
path: root/engine/src/renderer
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2023-10-12 21:29:36 +0200
committerHampusM <hampus@hampusmat.com>2023-10-12 21:29:36 +0200
commit341826e9a2b89713fc47ffbc914d18e23c7d9287 (patch)
treeb92b85bd85690d3e6475eac7e8c254700865bded /engine/src/renderer
parenta4d66f8272c08c722a0a3fa6843ccf61e05d2928 (diff)
feat(engine): add vertex coloring
Diffstat (limited to 'engine/src/renderer')
-rw-r--r--engine/src/renderer/mod.rs35
-rw-r--r--engine/src/renderer/vertex_array.rs51
-rw-r--r--engine/src/renderer/vertex_buffers.rs4
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<()>
{