diff options
| author | HampusM <hampus@hampusmat.com> | 2026-04-18 21:23:15 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-04-18 21:24:45 +0200 |
| commit | 6171fb6c9157593906bbc0fe5145405f10131123 (patch) | |
| tree | 5d0b13c9ec6d1f5f0a110794a30d855c9508b33f | |
| parent | 450670dbfb153f00adf431ad77379042a9114ab0 (diff) | |
feat(engine): add offset options to renderer::Command::DrawMesh
| -rw-r--r-- | engine/src/renderer.rs | 39 | ||||
| -rw-r--r-- | engine/src/renderer/opengl.rs | 18 |
2 files changed, 46 insertions, 11 deletions
diff --git a/engine/src/renderer.rs b/engine/src/renderer.rs index 52764db..b52e6b9 100644 --- a/engine/src/renderer.rs +++ b/engine/src/renderer.rs @@ -191,10 +191,40 @@ pub enum Command mesh: Mesh, usage: MeshUsage, }, - DrawMesh(ObjectId), + DrawMesh(ObjectId, DrawMeshOptions), UpdateDrawProperties(DrawProperties, DrawPropertiesUpdateFlags), } +builder! { + #[builder(name = DrawMeshOptionsBuilder, derives = (Debug, Default, Clone))] + #[derive(Debug, Default, Clone)] + #[non_exhaustive] + pub struct DrawMeshOptions { + pub element_offset: u32, + pub vertex_offset: u32, + + #[builder(skip_generate_fn)] + pub element_cnt: Option<u32>, + } +} + +impl DrawMeshOptions +{ + pub fn builder() -> DrawMeshOptionsBuilder + { + DrawMeshOptionsBuilder::default() + } +} + +impl DrawMeshOptionsBuilder +{ + pub fn element_cnt(mut self, element_cnt: u32) -> Self + { + self.element_cnt = Some(element_cnt); + self + } +} + bitflags! { #[derive(Debug)] pub struct BufferClearMask: u8 { @@ -531,9 +561,10 @@ pub fn add_main_render_passes( }); } - render_pass - .commands - .push(Command::DrawMesh(ObjectId::Asset(mesh_asset.id()))); + render_pass.commands.push(Command::DrawMesh( + ObjectId::Asset(mesh_asset.id()), + DrawMeshOptions::default(), + )); if let Some(draw_flags) = draw_flags.as_deref() && draw_flags.polygon_mode_config != PolygonModeConfig::default() diff --git a/engine/src/renderer/opengl.rs b/engine/src/renderer/opengl.rs index b434cd8..81cbdc2 100644 --- a/engine/src/renderer/opengl.rs +++ b/engine/src/renderer/opengl.rs @@ -93,6 +93,7 @@ use crate::renderer::{ Command as RendererCommand, CommandQueue as RendererCommandQueue, CtxUsedByWindow as RendererCtxUsedByWindow, + DrawMeshOptions, DrawPropertiesUpdateFlags, GraphicsProperties, PRE_RENDER_PHASE, @@ -1089,7 +1090,7 @@ fn handle_commands( tracing::error!("Failed to update mesh: {err}"); } } - RendererCommand::DrawMesh(mesh_object_id) => { + RendererCommand::DrawMesh(mesh_object_id, draw_mesh_opts) => { let Some(curr_gl_ctx) = &opt_curr_gl_ctx else { tracing::error!("No GL context is current"); continue; @@ -1145,7 +1146,9 @@ fn handle_commands( continue; } - if let Err(err) = draw_mesh(&curr_gl_ctx, graphics_mesh) { + if let Err(err) = + draw_mesh(&curr_gl_ctx, graphics_mesh, &draw_mesh_opts) + { tracing::error!("Failed to draw mesh: {err}"); }; } @@ -1330,6 +1333,7 @@ fn set_viewport( fn draw_mesh( current_context: &CurrentContextWithFns<'_>, graphics_mesh: &GraphicsMesh, + opts: &DrawMeshOptions, ) -> Result<(), GlDrawError> { graphics_mesh.vertex_arr.bind(current_context); @@ -1339,17 +1343,17 @@ fn draw_mesh( current_context, opengl_bindings::vertex_array::DrawElementsOptions { primitive_kind: PrimitiveKind::Triangles, - element_offset: 0, - element_cnt: graphics_mesh.element_cnt, - vertex_offset: 0, + element_offset: opts.element_offset, + element_cnt: opts.element_cnt.unwrap_or(graphics_mesh.element_cnt), + vertex_offset: opts.vertex_offset, }, )?; } else { VertexArray::draw_arrays( current_context, PrimitiveKind::Triangles, - 0, - graphics_mesh.element_cnt, + opts.vertex_offset, + opts.element_cnt.unwrap_or(graphics_mesh.element_cnt), )?; } |
