diff options
Diffstat (limited to 'engine/src/renderer/opengl')
| -rw-r--r-- | engine/src/renderer/opengl/graphics_mesh.rs | 95 |
1 files changed, 28 insertions, 67 deletions
diff --git a/engine/src/renderer/opengl/graphics_mesh.rs b/engine/src/renderer/opengl/graphics_mesh.rs index cdd0e8d..7c7412c 100644 --- a/engine/src/renderer/opengl/graphics_mesh.rs +++ b/engine/src/renderer/opengl/graphics_mesh.rs @@ -1,5 +1,3 @@ -use std::any::TypeId; - use opengl_bindings::CurrentContextWithFns as GlCurrentContextWithFns; use opengl_bindings::buffer::{Buffer as GlBuffer, Usage as GlBufferUsage}; use opengl_bindings::vertex_array::{ @@ -9,11 +7,9 @@ use opengl_bindings::vertex_array::{ VertexArray as GlVertexArray, VertexBufferSpec as GlVertexArrayVertexBufferSpec, }; -use zerocopy::IntoBytes; -use crate::mesh::Mesh; -use crate::reflection::Type; -use crate::shader::VertexSubset as ShaderVertexSubset; +use crate::mesh::{Mesh, VertexAttrType}; +use crate::shader::VertexDescription as ShaderVertexDescription; #[derive(Debug)] pub struct GraphicsMesh @@ -31,42 +27,19 @@ impl GraphicsMesh pub fn new( current_context: &GlCurrentContextWithFns<'_>, mesh: &Mesh, - vertex_subset: &ShaderVertexSubset, + vertex_desc: &ShaderVertexDescription, ) -> Result<Self, Error> { let vertex_arr = GlVertexArray::new(current_context); let vertex_buffer = GlBuffer::new(current_context); vertex_buffer - .init( + .store( current_context, - vertex_subset.layout.size() * mesh.vertices().len(), + mesh.vertex_buf().as_bytes(), GlBufferUsage::Static, ) - .map_err(Error::InitVertexBufferFailed)?; - - for (vertex_index, vertex) in mesh.vertices().iter().enumerate() { - let vertex_bytes = vertex.as_bytes(); - - for vertex_subset_field in vertex_subset.fields.iter().flatten() { - let vertex_buffer_offset = (vertex_subset.layout.size() * vertex_index) - + vertex_subset_field.offset; - - let vertex_field_start_offset = - vertex_subset_field.reflection.byte_offset; - - let vertex_field_size = vertex_subset_field.reflection.layout.size(); - - vertex_buffer - .store_at_byte_offset( - current_context, - vertex_buffer_offset, - &vertex_bytes[vertex_field_start_offset - ..vertex_field_start_offset + vertex_field_size], - ) - .map_err(Error::StoreVerticesFailed)?; - } - } + .map_err(Error::StoreVerticesFailed)?; let vertex_buf_binding_index = 0; @@ -76,7 +49,7 @@ impl GraphicsMesh &vertex_buffer, GlVertexArrayVertexBufferSpec { offset: 0, - vertex_size: vertex_subset.layout.size(), + vertex_size: mesh.vertex_buf().vertex_size(), }, ) { match err { @@ -96,47 +69,38 @@ impl GraphicsMesh } } - for vertex_subset_field in vertex_subset.fields.iter().flatten() { + for vertex_attr_props in mesh.vertex_buf().vertex_attr_props() { + let vertex_field_desc = vertex_desc + .fields + .iter() + .find(|vertex_field_desc| { + *vertex_field_desc.name == vertex_attr_props.name + }) + .unwrap(); + let attrib_index: u32 = - vertex_subset_field.varying_input_offset.try_into().unwrap(); + vertex_field_desc.varying_input_offset.try_into().unwrap(); vertex_arr.enable_attrib(current_context, attrib_index); vertex_arr.set_attrib_format( current_context, attrib_index, - match vertex_subset_field.reflection.type_reflection() { - Some(Type::Literal(_)) => { - if vertex_subset_field.reflection.type_id != TypeId::of::<f32>() { - panic!("Unsupported vertex field data type"); - } - + match &vertex_attr_props.ty { + VertexAttrType::Float32 => GlVertexArrayAttributeFormat { + data_type: GlVertexArrayDataType::Float, + count: 1, + normalized: false, + offset: vertex_attr_props.byte_offset.try_into().unwrap(), + }, + VertexAttrType::Float32Array { length } => { GlVertexArrayAttributeFormat { data_type: GlVertexArrayDataType::Float, - count: 1, + count: (*length).try_into().unwrap(), normalized: false, - offset: vertex_subset_field.offset.try_into().unwrap(), + offset: vertex_attr_props.byte_offset.try_into().unwrap(), } } - Some(Type::Array(array_vertex_field)) => { - let Type::Literal(array_vertex_field_item) = - array_vertex_field.item_reflection - else { - panic!("Unsupported array item type in vertex field"); - }; - - if array_vertex_field_item.type_id != TypeId::of::<f32>() { - panic!("Unsupported array item type in vertex field"); - } - - GlVertexArrayAttributeFormat { - data_type: GlVertexArrayDataType::Float, - count: array_vertex_field.length.try_into().unwrap(), - normalized: false, - offset: vertex_subset_field.offset.try_into().unwrap(), - } - } - _ => panic!("Unsupported vertex field data type"), }, ); @@ -171,7 +135,7 @@ impl GraphicsMesh vertex_buffer: vertex_buffer, index_buffer: None, element_cnt: mesh - .vertices() + .vertex_buf() .len() .try_into() .expect("Mesh vertex count does not fit into a 32-bit unsigned int"), @@ -193,9 +157,6 @@ impl GraphicsMesh #[derive(Debug, thiserror::Error)] pub enum Error { - #[error("Failed to initialize vertex buffer")] - InitVertexBufferFailed(#[source] opengl_bindings::buffer::Error), - #[error("Failed to store vertices in vertex buffer")] StoreVerticesFailed(#[source] opengl_bindings::buffer::Error), |
