1- use crate :: MeshPipeline ;
21use crate :: {
3- DrawMesh , MeshPipelineKey , RenderMeshInstance , RenderMeshInstances , SetMeshBindGroup ,
4- SetMeshViewBindGroup ,
2+ DrawMesh , MeshPipeline , MeshPipelineKey , RenderMeshInstance , RenderMeshInstances ,
3+ SetMeshBindGroup , SetMeshViewBindGroup ,
54} ;
65use bevy_app:: Plugin ;
76use bevy_asset:: { load_internal_asset, Handle } ;
87use bevy_core_pipeline:: core_3d:: Opaque3d ;
98use bevy_derive:: { Deref , DerefMut } ;
109use bevy_ecs:: { prelude:: * , reflect:: ReflectComponent } ;
11- use bevy_reflect:: std_traits:: ReflectDefault ;
12- use bevy_reflect:: Reflect ;
10+ use bevy_reflect:: { std_traits:: ReflectDefault , Reflect } ;
1311use bevy_render:: {
1412 extract_resource:: { ExtractResource , ExtractResourcePlugin } ,
1513 mesh:: { Mesh , MeshVertexBufferLayout } ,
@@ -23,8 +21,7 @@ use bevy_render::{
2321 RenderApp , RenderSet ,
2422} ;
2523use bevy_render:: { Extract , ExtractSchedule , Render } ;
26- use bevy_utils:: tracing:: error;
27- use bevy_utils:: EntityHashMap ;
24+ use bevy_utils:: { tracing:: error, EntityHashSet } ;
2825
2926pub const WIREFRAME_SHADER_HANDLE : Handle < Shader > = Handle :: weak_from_u128 ( 192598014480025766 ) ;
3027
@@ -41,6 +38,7 @@ impl Plugin for WireframePlugin {
4138 ) ;
4239
4340 app. register_type :: < Wireframe > ( )
41+ . register_type :: < NoWireframe > ( )
4442 . register_type :: < WireframeConfig > ( )
4543 . init_resource :: < WireframeConfig > ( )
4644 . add_plugins ( ( ExtractResourcePlugin :: < WireframeConfig > :: default ( ) , ) ) ;
@@ -50,6 +48,7 @@ impl Plugin for WireframePlugin {
5048 . add_render_command :: < Opaque3d , DrawWireframes > ( )
5149 . init_resource :: < SpecializedMeshPipelines < WireframePipeline > > ( )
5250 . init_resource :: < Wireframes > ( )
51+ . init_resource :: < NoWireframes > ( )
5352 . add_systems ( ExtractSchedule , extract_wireframes)
5453 . add_systems ( Render , queue_wireframes. in_set ( RenderSet :: QueueMeshes ) ) ;
5554 }
@@ -62,38 +61,46 @@ impl Plugin for WireframePlugin {
6261 }
6362}
6463
65- /// Overrides the global [`WireframeConfig`] for a single mesh.
64+ /// Enables wireframe rendering for any entity it is attached to.
65+ /// It will ignore the [`WireframeConfig`] global setting.
66+ ///
67+ /// This requires the [`WireframePlugin`] to be enabled.
6668#[ derive( Component , Debug , Clone , Default , Reflect , Eq , PartialEq ) ]
6769#[ reflect( Component , Default ) ]
68- pub enum Wireframe {
69- /// Always render the wireframe for this entity, regardless of global config.
70- #[ default]
71- AlwaysRender ,
72- /// Never render the wireframe for this entity, regardless of global config.
73- NeverRender ,
74- }
70+ pub struct Wireframe ;
71+
72+ /// Disables wireframe rendering for any entity it is attached to.
73+ /// It will ignore the [`WireframeConfig`] global setting.
74+ ///
75+ /// This requires the [`WireframePlugin`] to be enabled.
76+ #[ derive( Component , Debug , Clone , Default , Reflect , Eq , PartialEq ) ]
77+ #[ reflect( Component , Default ) ]
78+ pub struct NoWireframe ;
7579
7680#[ derive( Resource , Debug , Clone , Default , ExtractResource , Reflect ) ]
7781#[ reflect( Resource ) ]
7882pub struct WireframeConfig {
7983 /// Whether to show wireframes for all meshes.
80- /// Can be overridden for individual meshes by adding a [`Wireframe`] component.
84+ /// Can be overridden for individual meshes by adding a [`Wireframe`] or [`NoWireframe`] component.
8185 pub global : bool ,
8286}
8387
8488#[ derive( Resource , Default , Deref , DerefMut ) ]
85- pub struct Wireframes ( EntityHashMap < Entity , Wireframe > ) ;
89+ pub struct Wireframes ( EntityHashSet < Entity > ) ;
90+
91+ #[ derive( Resource , Default , Deref , DerefMut ) ]
92+ pub struct NoWireframes ( EntityHashSet < Entity > ) ;
8693
8794fn extract_wireframes (
8895 mut wireframes : ResMut < Wireframes > ,
89- query : Extract < Query < ( Entity , & Wireframe ) > > ,
96+ mut no_wireframes : ResMut < NoWireframes > ,
97+ wireframe_query : Extract < Query < Entity , With < Wireframe > > > ,
98+ no_wireframe_query : Extract < Query < Entity , With < NoWireframe > > > ,
9099) {
91100 wireframes. clear ( ) ;
92- wireframes. extend (
93- query
94- . iter ( )
95- . map ( |( entity, wireframe) | ( entity, wireframe. clone ( ) ) ) ,
96- ) ;
101+ wireframes. extend ( wireframe_query. iter ( ) ) ;
102+ no_wireframes. clear ( ) ;
103+ no_wireframes. extend ( no_wireframe_query. iter ( ) ) ;
97104}
98105
99106#[ derive( Resource , Clone ) ]
@@ -137,6 +144,7 @@ fn queue_wireframes(
137144 render_meshes : Res < RenderAssets < Mesh > > ,
138145 render_mesh_instances : Res < RenderMeshInstances > ,
139146 wireframes : Res < Wireframes > ,
147+ no_wireframes : Res < NoWireframes > ,
140148 wireframe_config : Res < WireframeConfig > ,
141149 wireframe_pipeline : Res < WireframePipeline > ,
142150 mut pipelines : ResMut < SpecializedMeshPipelines < WireframePipeline > > ,
@@ -185,11 +193,11 @@ fn queue_wireframes(
185193 . entities
186194 . iter ( )
187195 . filter_map ( |visible_entity| {
188- let wireframe_override = wireframes. get ( visible_entity) ;
196+ if no_wireframes. get ( visible_entity) . is_some ( ) {
197+ return None ;
198+ }
189199
190- if ( wireframe_config. global || wireframe_override == Some ( & Wireframe :: AlwaysRender ) )
191- && wireframe_override != Some ( & Wireframe :: NeverRender )
192- {
200+ if wireframe_config. global || wireframes. get ( visible_entity) . is_some ( ) {
193201 render_mesh_instances
194202 . get ( visible_entity)
195203 . map ( |mesh_instance| ( * visible_entity, mesh_instance) )
0 commit comments