summaryrefslogtreecommitdiff
path: root/engine/src/renderer/opengl/graphics_mesh.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/renderer/opengl/graphics_mesh.rs')
-rw-r--r--engine/src/renderer/opengl/graphics_mesh.rs95
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),