Skip to content

Commit 56cb515

Browse files
committed
Allow overriding global wireframe setting by adding a Wireframe component. (#7309)
1 parent 7a176ae commit 56cb515

File tree

2 files changed

+37
-40
lines changed

2 files changed

+37
-40
lines changed

crates/bevy_pbr/src/wireframe.rs

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -52,21 +52,24 @@ impl Plugin for WireframePlugin {
5252
}
5353
}
5454

55-
fn extract_wireframes(mut commands: Commands, query: Extract<Query<Entity, With<Wireframe>>>) {
56-
for entity in &query {
57-
commands.get_or_spawn(entity).insert(Wireframe);
55+
fn extract_wireframes(mut commands: Commands, query: Extract<Query<(Entity, &Wireframe)>>) {
56+
for (entity, wireframe) in &query {
57+
commands.get_or_spawn(entity).insert(wireframe.clone());
5858
}
5959
}
6060

61-
/// Controls whether an entity should rendered in wireframe-mode if the [`WireframePlugin`] is enabled
62-
#[derive(Component, Debug, Clone, Default, Reflect)]
61+
/// Overrides the global [`WireframeConfig`] for a single mesh.
62+
#[derive(Component, Debug, Clone, Default, Reflect, Eq, PartialEq)]
6363
#[reflect(Component, Default)]
64-
pub struct Wireframe;
64+
pub struct Wireframe {
65+
pub enable: bool,
66+
}
6567

6668
#[derive(Resource, Debug, Clone, Default, ExtractResource, Reflect)]
6769
#[reflect(Resource)]
6870
pub struct WireframeConfig {
69-
/// Whether to show wireframes for all meshes. If `false`, only meshes with a [Wireframe] component will be rendered.
71+
/// Whether to show wireframes for all meshes.
72+
/// Can be overridden for individual meshes by adding a [`Wireframe`] component.
7073
pub global: bool,
7174
}
7275

@@ -110,10 +113,7 @@ fn queue_wireframes(
110113
mut pipelines: ResMut<SpecializedMeshPipelines<WireframePipeline>>,
111114
pipeline_cache: Res<PipelineCache>,
112115
msaa: Res<Msaa>,
113-
mut material_meshes: ParamSet<(
114-
Query<(Entity, &Handle<Mesh>, &MeshUniform)>,
115-
Query<(Entity, &Handle<Mesh>, &MeshUniform), With<Wireframe>>,
116-
)>,
116+
material_meshes: Query<(Entity, &Handle<Mesh>, &MeshUniform, Option<&Wireframe>)>,
117117
mut views: Query<(&ExtractedView, &VisibleEntities, &mut RenderPhase<Opaque3d>)>,
118118
) {
119119
let draw_custom = opaque_3d_draw_functions.read().id::<DrawWireframes>();
@@ -123,7 +123,7 @@ fn queue_wireframes(
123123

124124
let view_key = msaa_key | MeshPipelineKey::from_hdr(view.hdr);
125125
let add_render_phase =
126-
|(entity, mesh_handle, mesh_uniform): (Entity, &Handle<Mesh>, &MeshUniform)| {
126+
|(entity, mesh_handle, mesh_uniform, _): (Entity, &Handle<Mesh>, &MeshUniform, _)| {
127127
if let Some(mesh) = render_meshes.get(mesh_handle) {
128128
let key = view_key
129129
| MeshPipelineKey::from_primitive_topology(mesh.primitive_topology);
@@ -149,21 +149,16 @@ fn queue_wireframes(
149149
}
150150
};
151151

152-
if wireframe_config.global {
153-
let query = material_meshes.p0();
154-
visible_entities
155-
.entities
156-
.iter()
157-
.filter_map(|visible_entity| query.get(*visible_entity).ok())
158-
.for_each(add_render_phase);
159-
} else {
160-
let query = material_meshes.p1();
161-
visible_entities
162-
.entities
163-
.iter()
164-
.filter_map(|visible_entity| query.get(*visible_entity).ok())
165-
.for_each(add_render_phase);
166-
}
152+
visible_entities
153+
.entities
154+
.iter()
155+
.filter_map(|visible_entity| material_meshes.get(*visible_entity).ok())
156+
.filter(|mesh| {
157+
let wireframe_override = mesh.3;
158+
(wireframe_config.global || wireframe_override == Some(&Wireframe { enable: true }))
159+
&& wireframe_override != Some(&Wireframe { enable: false })
160+
})
161+
.for_each(add_render_phase);
167162
}
168163
}
169164

examples/3d/wireframe.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,27 @@ fn setup(
2626
mut meshes: ResMut<Assets<Mesh>>,
2727
mut materials: ResMut<Assets<StandardMaterial>>,
2828
) {
29-
// To draw the wireframe on all entities, set this to 'true'
30-
wireframe_config.global = false;
29+
// This enables drawing of wireframes on every mesh.
30+
// To instead enable it on individual meshes, make this `false`, and add a `Wireframe` component
31+
// with `enable: true` to the meshes that should have wireframe enabled.
32+
wireframe_config.global = true;
3133
// plane
32-
commands.spawn(PbrBundle {
33-
mesh: meshes.add(Mesh::from(shape::Plane { size: 5.0 })),
34-
material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()),
35-
..default()
36-
});
37-
// cube
3834
commands.spawn((
3935
PbrBundle {
40-
mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })),
41-
material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()),
42-
transform: Transform::from_xyz(0.0, 0.5, 0.0),
36+
mesh: meshes.add(Mesh::from(shape::Plane { size: 5.0 })),
37+
material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()),
4338
..default()
4439
},
45-
// This enables wireframe drawing on this entity
46-
Wireframe,
40+
// This disables wireframe rendering for this entity.
41+
Wireframe { enable: false },
4742
));
43+
// cube
44+
commands.spawn(PbrBundle {
45+
mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })),
46+
material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()),
47+
transform: Transform::from_xyz(0.0, 0.5, 0.0),
48+
..default()
49+
});
4850
// light
4951
commands.spawn(PointLightBundle {
5052
transform: Transform::from_xyz(4.0, 8.0, 4.0),

0 commit comments

Comments
 (0)