1
- use crate :: MeshPipeline ;
2
1
use crate :: {
3
- DrawMesh , MeshPipelineKey , RenderMeshInstance , RenderMeshInstances , SetMeshBindGroup ,
4
- SetMeshViewBindGroup ,
2
+ DrawMesh , MeshPipeline , MeshPipelineKey , RenderMeshInstance , RenderMeshInstances ,
3
+ SetMeshBindGroup , SetMeshViewBindGroup ,
5
4
} ;
6
5
use bevy_app:: Plugin ;
7
6
use bevy_asset:: { load_internal_asset, Handle } ;
8
7
use bevy_core_pipeline:: core_3d:: Opaque3d ;
9
8
use bevy_derive:: { Deref , DerefMut } ;
10
9
use 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 } ;
13
11
use bevy_render:: {
14
12
extract_resource:: { ExtractResource , ExtractResourcePlugin } ,
15
13
mesh:: { Mesh , MeshVertexBufferLayout } ,
@@ -23,8 +21,7 @@ use bevy_render::{
23
21
RenderApp , RenderSet ,
24
22
} ;
25
23
use bevy_render:: { Extract , ExtractSchedule , Render } ;
26
- use bevy_utils:: tracing:: error;
27
- use bevy_utils:: EntityHashMap ;
24
+ use bevy_utils:: { tracing:: error, EntityHashSet } ;
28
25
29
26
pub const WIREFRAME_SHADER_HANDLE : Handle < Shader > = Handle :: weak_from_u128 ( 192598014480025766 ) ;
30
27
@@ -41,6 +38,7 @@ impl Plugin for WireframePlugin {
41
38
) ;
42
39
43
40
app. register_type :: < Wireframe > ( )
41
+ . register_type :: < NoWireframe > ( )
44
42
. register_type :: < WireframeConfig > ( )
45
43
. init_resource :: < WireframeConfig > ( )
46
44
. add_plugins ( ( ExtractResourcePlugin :: < WireframeConfig > :: default ( ) , ) ) ;
@@ -50,6 +48,7 @@ impl Plugin for WireframePlugin {
50
48
. add_render_command :: < Opaque3d , DrawWireframes > ( )
51
49
. init_resource :: < SpecializedMeshPipelines < WireframePipeline > > ( )
52
50
. init_resource :: < Wireframes > ( )
51
+ . init_resource :: < NoWireframes > ( )
53
52
. add_systems ( ExtractSchedule , extract_wireframes)
54
53
. add_systems ( Render , queue_wireframes. in_set ( RenderSet :: QueueMeshes ) ) ;
55
54
}
@@ -62,38 +61,46 @@ impl Plugin for WireframePlugin {
62
61
}
63
62
}
64
63
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.
66
68
#[ derive( Component , Debug , Clone , Default , Reflect , Eq , PartialEq ) ]
67
69
#[ 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 ;
75
79
76
80
#[ derive( Resource , Debug , Clone , Default , ExtractResource , Reflect ) ]
77
81
#[ reflect( Resource ) ]
78
82
pub struct WireframeConfig {
79
83
/// 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.
81
85
pub global : bool ,
82
86
}
83
87
84
88
#[ 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 > ) ;
86
93
87
94
fn extract_wireframes (
88
95
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 > > > ,
90
99
) {
91
100
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 ( ) ) ;
97
104
}
98
105
99
106
#[ derive( Resource , Clone ) ]
@@ -137,6 +144,7 @@ fn queue_wireframes(
137
144
render_meshes : Res < RenderAssets < Mesh > > ,
138
145
render_mesh_instances : Res < RenderMeshInstances > ,
139
146
wireframes : Res < Wireframes > ,
147
+ no_wireframes : Res < NoWireframes > ,
140
148
wireframe_config : Res < WireframeConfig > ,
141
149
wireframe_pipeline : Res < WireframePipeline > ,
142
150
mut pipelines : ResMut < SpecializedMeshPipelines < WireframePipeline > > ,
@@ -185,11 +193,11 @@ fn queue_wireframes(
185
193
. entities
186
194
. iter ( )
187
195
. 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
+ }
189
199
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 ( ) {
193
201
render_mesh_instances
194
202
. get ( visible_entity)
195
203
. map ( |mesh_instance| ( * visible_entity, mesh_instance) )
0 commit comments