diff --git a/crates/bevy_pbr/src/wireframe.rs b/crates/bevy_pbr/src/wireframe.rs index 0319d3144b64a1..42374a26b3a231 100644 --- a/crates/bevy_pbr/src/wireframe.rs +++ b/crates/bevy_pbr/src/wireframe.rs @@ -36,7 +36,7 @@ impl Plugin for WireframePlugin { Shader::from_wgsl ); - app.register_type::() + app.register_type::() .register_type::() .init_resource::() .add_plugin(ExtractResourcePlugin::::default()); @@ -52,24 +52,33 @@ impl Plugin for WireframePlugin { } } -fn extract_wireframes(mut commands: Commands, query: Extract>) { +fn extract_wireframes(mut commands: Commands, query: Extract>) { for (entity, wireframe) in &query { commands.get_or_spawn(entity).insert(wireframe.clone()); } } /// Overrides the global [`WireframeConfig`] for a single mesh. -#[derive(Component, Debug, Clone, Default, Reflect, Eq, PartialEq)] +#[derive(Component, Debug, Clone, Copy, Reflect, Eq, PartialEq)] #[reflect(Component, Default)] -pub struct Wireframe { - pub enable: bool, +pub enum WireframeOverride { + /// Always render the wireframe for this entity, regardless of global config. + AlwaysRender, + /// Never render the wireframe for this entity, regardless of global config. + NeverRender, +} + +impl Default for WireframeOverride { + fn default() -> Self { + Self::AlwaysRender + } } #[derive(Resource, Debug, Clone, Default, ExtractResource, Reflect)] #[reflect(Resource)] pub struct WireframeConfig { /// Whether to show wireframes for all meshes. - /// Can be overridden for individual meshes by adding a [`Wireframe`] component. + /// Can be overridden for individual meshes by adding a [`WireframeOverride`] component. pub global: bool, } @@ -113,7 +122,12 @@ fn queue_wireframes( mut pipelines: ResMut>, pipeline_cache: Res, msaa: Res, - material_meshes: Query<(Entity, &Handle, &MeshUniform, Option<&Wireframe>)>, + material_meshes: Query<( + Entity, + &Handle, + &MeshUniform, + Option<&WireframeOverride>, + )>, mut views: Query<(&ExtractedView, &VisibleEntities, &mut RenderPhase)>, ) { let draw_custom = opaque_3d_draw_functions.read().id::(); @@ -155,8 +169,9 @@ fn queue_wireframes( .filter_map(|visible_entity| material_meshes.get(*visible_entity).ok()) .filter(|mesh| { let wireframe_override = mesh.3; - (wireframe_config.global || wireframe_override == Some(&Wireframe { enable: true })) - && wireframe_override != Some(&Wireframe { enable: false }) + (wireframe_config.global + || wireframe_override == Some(&WireframeOverride::AlwaysRender)) + && wireframe_override != Some(&WireframeOverride::NeverRender) }) .for_each(add_render_phase); } diff --git a/examples/3d/wireframe.rs b/examples/3d/wireframe.rs index 1caedb2dcd3ae9..a64d64b73ee670 100644 --- a/examples/3d/wireframe.rs +++ b/examples/3d/wireframe.rs @@ -1,7 +1,7 @@ //! Showcases wireframe rendering. use bevy::{ - pbr::wireframe::{Wireframe, WireframeConfig, WireframePlugin}, + pbr::wireframe::{WireframeConfig, WireframeOverride, WireframePlugin}, prelude::*, render::{render_resource::WgpuFeatures, settings::WgpuSettings, RenderPlugin}, }; @@ -26,9 +26,10 @@ fn setup( mut meshes: ResMut>, mut materials: ResMut>, ) { - // This enables drawing of wireframes on every mesh. - // To instead enable it on individual meshes, make this `false`, and add a `Wireframe` component - // with `enable: true` to the meshes that should have wireframe enabled. + // This enables drawing of wireframes on every mesh, except those with + // `WireframeOverride::NeverRender`. + // To instead enable it on individual meshes, make this `false`, and add a + // `WireframeOverride::AlwaysRender` component for the meshes that should have wireframes. wireframe_config.global = true; // plane commands.spawn(( @@ -38,7 +39,7 @@ fn setup( ..default() }, // This disables wireframe rendering for this entity. - Wireframe { enable: false }, + WireframeOverride::NeverRender, )); // cube commands.spawn(PbrBundle {