summaryrefslogtreecommitdiff
path: root/engine/src/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/renderer')
-rw-r--r--engine/src/renderer/opengl.rs6
-rw-r--r--engine/src/renderer/opengl/graphics_mesh.rs95
2 files changed, 31 insertions, 70 deletions
diff --git a/engine/src/renderer/opengl.rs b/engine/src/renderer/opengl.rs
index ee440c8..1093292 100644
--- a/engine/src/renderer/opengl.rs
+++ b/engine/src/renderer/opengl.rs
@@ -949,10 +949,10 @@ fn handle_commands(
.get_program_metadata(curr_shader_program_asset_id)
.expect("Not possible");
- let Some(vertex_subset) = &curr_shader_program_metadata.vertex_subset
+ let Some(vertex_desc) = &curr_shader_program_metadata.vertex_desc
else {
tracing::error!(
- "Current shader program does not have a vertex subset"
+ "Current shader program does not have a vertex description"
);
continue;
};
@@ -960,7 +960,7 @@ fn handle_commands(
let key = *next_graphics_ctx_object_key;
let graphics_mesh =
- match GraphicsMesh::new(&curr_gl_ctx, &mesh, &vertex_subset) {
+ match GraphicsMesh::new(&curr_gl_ctx, &mesh, &vertex_desc) {
Ok(graphics_mesh) => graphics_mesh,
Err(err) => {
tracing::error!("Failed to create mesh: {err}");
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),