diff options
| author | HampusM <hampus@hampusmat.com> | 2026-04-18 15:50:04 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-04-18 15:50:04 +0200 |
| commit | 7d578207c76a9fd51c370cd06839410675f28e03 (patch) | |
| tree | 62a692f7ad5c1d9e168011cadb88b7f8c70c0244 /engine/src/renderer.rs | |
| parent | 75558d144ca8c91ed5e87358d935b2c36eb29d7b (diff) | |
feat(engine): add renderer draw properties
Diffstat (limited to 'engine/src/renderer.rs')
| -rw-r--r-- | engine/src/renderer.rs | 81 |
1 files changed, 74 insertions, 7 deletions
diff --git a/engine/src/renderer.rs b/engine/src/renderer.rs index bf1cb51..066f3fc 100644 --- a/engine/src/renderer.rs +++ b/engine/src/renderer.rs @@ -156,6 +156,7 @@ pub struct RenderPass pub renderer_ctx_ent_id: Uid, pub surface_id: SurfaceId, pub commands: Vec<Command>, + pub draw_properties: DrawProperties, } #[derive(Debug)] @@ -187,7 +188,7 @@ pub enum Command usage: MeshUsage, }, DrawMesh(ObjectId), - SetPolygonModeConfig(PolygonModeConfig), + UpdateDrawProperties(DrawProperties, DrawPropertiesUpdateFlags), } bitflags! { @@ -212,6 +213,27 @@ pub enum MeshUsage Dynamic, } +#[derive(Debug, Default, Clone, PartialEq, Eq)] +#[non_exhaustive] +pub struct DrawProperties +{ + pub polygon_mode_config: PolygonModeConfig, +} + +bitflags! { + #[derive(Debug, Clone, Copy)] + pub struct DrawPropertiesUpdateFlags: usize + { + const POLYGON_MODE_CONFIG = 1 << 0; + } +} + +#[derive(Debug, Default, Clone, Component)] +pub struct ActiveDrawProperties +{ + pub draw_properties: DrawProperties, +} + /// Renderer command FIFO queue. /// /// This component is present in renderer context entities. @@ -318,6 +340,9 @@ pub fn add_main_render_passes( renderer_ctx_ent_id, surface_id: surface_spec.id, commands: Vec::with_capacity(30), + draw_properties: DrawProperties { + polygon_mode_config: PolygonModeConfig::default(), + }, }); let render_pass = render_passes.passes.front_mut().expect("Not possible"); @@ -440,8 +465,11 @@ pub fn add_main_render_passes( if let Some(draw_flags) = draw_flags.as_deref() && draw_flags.polygon_mode_config != PolygonModeConfig::default() { - render_pass.commands.push(Command::SetPolygonModeConfig( - draw_flags.polygon_mode_config.clone(), + render_pass.commands.push(Command::UpdateDrawProperties( + DrawProperties { + polygon_mode_config: draw_flags.polygon_mode_config.clone(), + }, + DrawPropertiesUpdateFlags::POLYGON_MODE_CONFIG, )); } @@ -460,8 +488,11 @@ pub fn add_main_render_passes( if let Some(draw_flags) = draw_flags.as_deref() && draw_flags.polygon_mode_config != PolygonModeConfig::default() { - render_pass.commands.push(Command::SetPolygonModeConfig( - PolygonModeConfig::default(), + render_pass.commands.push(Command::UpdateDrawProperties( + DrawProperties { + polygon_mode_config: PolygonModeConfig::default(), + }, + DrawPropertiesUpdateFlags::POLYGON_MODE_CONFIG, )); } } @@ -471,11 +502,21 @@ pub fn add_main_render_passes( #[tracing::instrument(skip_all)] pub fn enqueue_commands_from_render_passes( - renderer_ctx_query: Query<(&mut CommandQueue, &[Pair<CtxUsedByWindow, Wildcard>])>, + renderer_ctx_query: Query<( + &mut CommandQueue, + &[Pair<CtxUsedByWindow, Wildcard>], + &mut ActiveDrawProperties, + )>, mut render_passes: Single<RenderPasses>, entity_obtainer: EntityObtainer, ) { + let Some((_, _, mut active_draw_props)) = renderer_ctx_query.iter().next() else { + return; + }; + + let mut last_render_pass_draw_props = active_draw_props.draw_properties.clone(); + for render_pass in render_passes.passes.drain(..) { let Some(renderer_ctx_ent) = entity_obtainer.get_entity(render_pass.renderer_ctx_ent_id) @@ -498,12 +539,38 @@ pub fn enqueue_commands_from_render_passes( continue; }; + if render_pass.draw_properties != last_render_pass_draw_props { + renderer_ctx_command_queue.push(Command::UpdateDrawProperties( + render_pass.draw_properties.clone(), + DrawPropertiesUpdateFlags::all(), + )); + + last_render_pass_draw_props = render_pass.draw_properties; + } + + let last_updated_draw_props = render_pass + .commands + .iter() + .filter_map(|command| match command { + Command::UpdateDrawProperties(draw_props, _) => Some(draw_props.clone()), + _ => None, + }) + .last(); + renderer_ctx_command_queue .queue .extend(render_pass.commands); + + if let Some(last_updated_draw_props) = last_updated_draw_props { + last_render_pass_draw_props = last_updated_draw_props; + } } - for (mut command_queue, used_by_windows) in &renderer_ctx_query { + active_draw_props.draw_properties = last_render_pass_draw_props; + + drop(active_draw_props); + + for (mut command_queue, used_by_windows, _) in &renderer_ctx_query { for ctx_used_by_window in used_by_windows { let window_ent_id = ctx_used_by_window.id().target_entity(); |
