summaryrefslogtreecommitdiff
path: root/engine/src/renderer.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-04-18 15:50:04 +0200
committerHampusM <hampus@hampusmat.com>2026-04-18 15:50:04 +0200
commit7d578207c76a9fd51c370cd06839410675f28e03 (patch)
tree62a692f7ad5c1d9e168011cadb88b7f8c70c0244 /engine/src/renderer.rs
parent75558d144ca8c91ed5e87358d935b2c36eb29d7b (diff)
feat(engine): add renderer draw properties
Diffstat (limited to 'engine/src/renderer.rs')
-rw-r--r--engine/src/renderer.rs81
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();