summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-04-18 21:23:15 +0200
committerHampusM <hampus@hampusmat.com>2026-04-18 21:24:45 +0200
commit6171fb6c9157593906bbc0fe5145405f10131123 (patch)
tree5d0b13c9ec6d1f5f0a110794a30d855c9508b33f /engine
parent450670dbfb153f00adf431ad77379042a9114ab0 (diff)
feat(engine): add offset options to renderer::Command::DrawMesh
Diffstat (limited to 'engine')
-rw-r--r--engine/src/renderer.rs39
-rw-r--r--engine/src/renderer/opengl.rs18
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),
)?;
}