From 6b2feeab0b845d05cdf76328d44b7b70a5e50c18 Mon Sep 17 00:00:00 2001 From: HampusM Date: Sat, 10 May 2025 13:10:46 +0200 Subject: refactor(engine): make GL renderer have it's own Vertex struct --- engine/src/data_types/vector.rs | 1 + engine/src/file_format/wavefront/obj.rs | 5 +-- engine/src/lib.rs | 1 - engine/src/mesh.rs | 25 +++++++++++- engine/src/mesh/cube.rs | 5 +-- engine/src/opengl/buffer.rs | 32 +++++++++++++++ engine/src/opengl/vertex_array.rs | 10 ++--- engine/src/renderer/opengl.rs | 12 +++++- engine/src/renderer/opengl/vertex.rs | 64 ++++++++++++++++++++++++++++++ engine/src/vertex.rs | 69 --------------------------------- 10 files changed, 137 insertions(+), 87 deletions(-) create mode 100644 engine/src/renderer/opengl/vertex.rs delete mode 100644 engine/src/vertex.rs (limited to 'engine/src') diff --git a/engine/src/data_types/vector.rs b/engine/src/data_types/vector.rs index 802a4a7..100c709 100644 --- a/engine/src/data_types/vector.rs +++ b/engine/src/data_types/vector.rs @@ -3,6 +3,7 @@ use std::ops::{Add, AddAssign, Div, Mul, Neg, Sub, SubAssign}; use crate::color::Color; #[derive(Debug, Default, Clone, Copy, PartialEq)] +#[repr(C)] pub struct Vec2 { pub x: Value, diff --git a/engine/src/file_format/wavefront/obj.rs b/engine/src/file_format/wavefront/obj.rs index 6ca11c2..88d566c 100644 --- a/engine/src/file_format/wavefront/obj.rs +++ b/engine/src/file_format/wavefront/obj.rs @@ -13,10 +13,9 @@ use crate::file_format::wavefront::common::{ Statement, Triplet, }; -use crate::mesh::Mesh; +use crate::mesh::{Mesh, Vertex}; use crate::util::try_option; use crate::vector::{Vec2, Vec3}; -use crate::vertex::{Builder as VertexBuilder, Vertex}; /// Parses the content of a Wavefront `.obj`. /// @@ -168,7 +167,7 @@ impl FaceVertex /// - The face's vertex normal cannot be found in the given [`Obj`] pub fn to_vertex(&self, obj: &Obj) -> Result { - let mut vertex_builder = VertexBuilder::default(); + let mut vertex_builder = Vertex::builder(); let vertex_pos = *obj.vertex_positions.get(self.position as usize - 1).ok_or( Error::FaceVertexPositionNotFound { vertex_pos_index: self.position }, diff --git a/engine/src/lib.rs b/engine/src/lib.rs index 7bf0368..c537e06 100644 --- a/engine/src/lib.rs +++ b/engine/src/lib.rs @@ -30,7 +30,6 @@ pub mod projection; pub mod renderer; pub mod texture; pub mod transform; -pub mod vertex; pub mod window; pub extern crate ecs; diff --git a/engine/src/mesh.rs b/engine/src/mesh.rs index 917e7f7..91d199e 100644 --- a/engine/src/mesh.rs +++ b/engine/src/mesh.rs @@ -1,7 +1,7 @@ use ecs::Component; -use crate::vector::Vec3; -use crate::vertex::Vertex; +use crate::util::builder; +use crate::vector::{Vec2, Vec3}; pub mod cube; @@ -77,6 +77,27 @@ impl Mesh } } +builder! { +#[builder(name = VertexBuilder, derives = (Debug, Default, Clone))] +#[derive(Debug, Clone, Default, PartialEq)] +#[non_exhaustive] +pub struct Vertex +{ + pub pos: Vec3, + pub texture_coords: Vec2, + pub normal: Vec3, +} +} + +impl Vertex +{ + #[must_use] + pub fn builder() -> VertexBuilder + { + VertexBuilder::default() + } +} + #[derive(Debug, Clone)] pub struct DirectionPositions<'mesh> { diff --git a/engine/src/mesh/cube.rs b/engine/src/mesh/cube.rs index c29ce0b..6c9d381 100644 --- a/engine/src/mesh/cube.rs +++ b/engine/src/mesh/cube.rs @@ -1,8 +1,7 @@ use crate::math::calc_triangle_surface_normal; -use crate::mesh::Mesh; +use crate::mesh::{Mesh, Vertex}; use crate::util::builder; use crate::vector::{Vec2, Vec3}; -use crate::vertex::{Builder as VertexBuilder, Vertex}; builder! { /// Cube mesh creation specification. @@ -192,7 +191,7 @@ impl FaceVertices .expect("Vertex normal index is out of bounds") .clone(); - VertexBuilder::default() + Vertex::builder() .pos(vertex_pos) .normal(vertex_normal) .build() diff --git a/engine/src/opengl/buffer.rs b/engine/src/opengl/buffer.rs index 2fabe4d..eded553 100644 --- a/engine/src/opengl/buffer.rs +++ b/engine/src/opengl/buffer.rs @@ -1,5 +1,6 @@ use std::marker::PhantomData; use std::mem::size_of_val; +use std::ptr::null; #[derive(Debug)] pub struct Buffer @@ -35,6 +36,37 @@ impl Buffer } } + pub fn store_mapped( + &mut self, + values: &[Value], + usage: Usage, + mut map_func: impl FnMut(&Value) -> Item, + ) + { + unsafe { + #[allow(clippy::cast_possible_wrap)] + gl::NamedBufferData( + self.buf, + (size_of::() * values.len()) as gl::types::GLsizeiptr, + null(), + usage.into_gl(), + ); + } + + for (index, value) in values.iter().enumerate() { + let item = map_func(value); + + unsafe { + gl::NamedBufferSubData( + self.buf, + (index * size_of::()) as gl::types::GLintptr, + size_of::() as gl::types::GLsizeiptr, + (&raw const item).cast(), + ); + } + } + } + pub fn object(&self) -> gl::types::GLuint { self.buf diff --git a/engine/src/opengl/vertex_array.rs b/engine/src/opengl/vertex_array.rs index f0d04ae..1f8a870 100644 --- a/engine/src/opengl/vertex_array.rs +++ b/engine/src/opengl/vertex_array.rs @@ -1,10 +1,6 @@ use std::mem::size_of; use crate::opengl::buffer::Buffer; -use crate::vertex::Vertex; - -#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)] -const VERTEX_STRIDE: i32 = size_of::() as i32; #[derive(Debug)] pub struct VertexArray @@ -59,10 +55,10 @@ impl VertexArray } } - pub fn bind_vertex_buffer( + pub fn bind_vertex_buffer( &mut self, binding_index: u32, - vertex_buffer: &Buffer, + vertex_buffer: &Buffer, offset: isize, ) { @@ -72,7 +68,7 @@ impl VertexArray binding_index, vertex_buffer.object(), offset, - VERTEX_STRIDE, + size_of::() as i32, ); } } diff --git a/engine/src/renderer/opengl.rs b/engine/src/renderer/opengl.rs index 5666061..43ec16c 100644 --- a/engine/src/renderer/opengl.rs +++ b/engine/src/renderer/opengl.rs @@ -62,14 +62,16 @@ use crate::opengl::{ ContextFlags, }; use crate::projection::{ClipVolume, Projection}; +use crate::renderer::opengl::vertex::{AttributeComponentType, Vertex}; use crate::renderer::RENDER_PHASE; use crate::texture::{Id as TextureId, Texture}; use crate::transform::{Position, Scale}; use crate::util::{defer, Defer, RefOrValue}; use crate::vector::{Vec2, Vec3}; -use crate::vertex::{AttributeComponentType, Vertex}; use crate::window::Window; +mod vertex; + type RenderableEntity<'a> = ( &'a Mesh, &'a Material, @@ -381,7 +383,13 @@ impl GlObjects let mut vertex_arr = VertexArray::new(); let mut vertex_buffer = Buffer::new(); - vertex_buffer.store(mesh.vertices(), BufferUsage::Static); + vertex_buffer.store_mapped(mesh.vertices(), BufferUsage::Static, |vertex| { + Vertex { + pos: vertex.pos, + texture_coords: vertex.texture_coords, + normal: vertex.normal, + } + }); vertex_arr.bind_vertex_buffer(0, &vertex_buffer, 0); diff --git a/engine/src/renderer/opengl/vertex.rs b/engine/src/renderer/opengl/vertex.rs new file mode 100644 index 0000000..499b94b --- /dev/null +++ b/engine/src/renderer/opengl/vertex.rs @@ -0,0 +1,64 @@ +use crate::vector::{Vec2, Vec3}; + +#[derive(Debug, Clone)] +#[repr(C)] +pub struct Vertex +{ + pub pos: Vec3, + pub texture_coords: Vec2, + pub normal: Vec3, +} + +impl Vertex +{ + pub fn attrs() -> &'static [Attribute] + { + #[allow(clippy::cast_possible_truncation)] + &[ + Attribute { + index: 0, + component_type: AttributeComponentType::Float, + component_cnt: AttributeComponentCnt::Three, + component_size: size_of::() as u32, + }, + Attribute { + index: 1, + component_type: AttributeComponentType::Float, + component_cnt: AttributeComponentCnt::Two, + component_size: size_of::() as u32, + }, + Attribute { + index: 2, + component_type: AttributeComponentType::Float, + component_cnt: AttributeComponentCnt::Three, + component_size: size_of::() as u32, + }, + ] + } +} + +#[derive(Debug)] +pub struct Attribute +{ + pub index: u32, + pub component_type: AttributeComponentType, + pub component_cnt: AttributeComponentCnt, + pub component_size: u32, +} + +#[derive(Debug)] +pub enum AttributeComponentType +{ + Float, +} + +#[derive(Debug, Clone, Copy)] +#[repr(u32)] +#[allow(dead_code)] +pub enum AttributeComponentCnt +{ + One = 1, + Two = 2, + Three = 3, + Four = 4, +} diff --git a/engine/src/vertex.rs b/engine/src/vertex.rs deleted file mode 100644 index 30640c4..0000000 --- a/engine/src/vertex.rs +++ /dev/null @@ -1,69 +0,0 @@ -use std::mem::size_of; - -use crate::util::builder; -use crate::vector::{Vec2, Vec3}; - -builder! { -#[builder(name = Builder, derives = (Debug, Default))] -#[derive(Debug, Clone, Default, PartialEq)] -#[repr(C)] -#[non_exhaustive] -pub struct Vertex -{ - pub pos: Vec3, - pub texture_coords: Vec2, - pub normal: Vec3, -} -} - -impl Vertex -{ - pub(crate) fn attrs() -> &'static [Attribute] - { - #[allow(clippy::cast_possible_truncation)] - &[ - Attribute { - index: 0, - component_type: AttributeComponentType::Float, - component_cnt: AttributeComponentCnt::Three, - component_size: size_of::() as u32, - }, - Attribute { - index: 1, - component_type: AttributeComponentType::Float, - component_cnt: AttributeComponentCnt::Two, - component_size: size_of::() as u32, - }, - Attribute { - index: 2, - component_type: AttributeComponentType::Float, - component_cnt: AttributeComponentCnt::Three, - component_size: size_of::() as u32, - }, - ] - } -} - -pub(crate) struct Attribute -{ - pub(crate) index: u32, - pub(crate) component_type: AttributeComponentType, - pub(crate) component_cnt: AttributeComponentCnt, - pub(crate) component_size: u32, -} - -pub(crate) enum AttributeComponentType -{ - Float, -} - -#[derive(Debug, Clone, Copy)] -#[repr(u32)] -#[allow(dead_code)] -pub(crate) enum AttributeComponentCnt -{ - One = 1, - Two = 2, - Three = 3, - Four = 4, -} -- cgit v1.2.3-18-g5258