Skip to content

Commit 31bfea4

Browse files
committed
add second camera to render groups example
1 parent c566ecc commit 31bfea4

File tree

1 file changed

+135
-23
lines changed

1 file changed

+135
-23
lines changed

examples/3d/render_groups.rs

+135-23
Original file line numberDiff line numberDiff line change
@@ -4,53 +4,114 @@ use bevy::{
44
color::palettes,
55
pbr::DirectionalLightShadowMap,
66
prelude::*,
7+
render::camera::Viewport,
78
render::view::{CameraView, PropagateRenderGroups, RenderGroups},
9+
window::PrimaryWindow,
810
};
911

1012
fn main() {
1113
App::new()
1214
.insert_resource(DirectionalLightShadowMap { size: 4096 })
1315
.add_plugins(DefaultPlugins)
1416
.add_systems(Startup, setup)
15-
.add_systems(Update, toggle_layers)
17+
.add_systems(Update, (toggle_layers_camera1, toggle_layers_camera2))
1618
.run();
1719
}
1820

1921
#[derive(Component)]
20-
struct MovedScene;
22+
struct Camera1;
23+
24+
#[derive(Component)]
25+
struct Camera2;
2126

2227
fn setup(
2328
mut commands: Commands,
2429
asset_server: Res<AssetServer>,
2530
mut meshes: ResMut<Assets<Mesh>>,
2631
mut materials: ResMut<Assets<StandardMaterial>>,
32+
window: Query<&Window, With<PrimaryWindow>>,
2733
) {
28-
// Camera
34+
// Camera 1
35+
let window = window.single();
36+
let camera1 = commands
37+
.spawn((
38+
Camera3dBundle {
39+
camera: Camera {
40+
viewport: Some(Viewport {
41+
physical_position: UVec2 {
42+
x: window.physical_width() / 4,
43+
y: 0,
44+
},
45+
physical_size: UVec2 {
46+
x: window.physical_width() / 2,
47+
y: window.physical_height() / 2,
48+
},
49+
..Default::default()
50+
}),
51+
..Default::default()
52+
},
53+
transform: Transform::from_xyz(0., 1.4, 2.0)
54+
.looking_at(Vec3::new(0., 0.3, 0.0), Vec3::Y),
55+
..default()
56+
},
57+
EnvironmentMapLight {
58+
diffuse_map: asset_server.load("environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"),
59+
specular_map: asset_server.load("environment_maps/pisa_specular_rgb9e5_zstd.ktx2"),
60+
intensity: 1500.0,
61+
},
62+
CameraView::from_layers(&[0, 1, 2, 3, 4, 5, 6]),
63+
Camera1,
64+
))
65+
.id();
66+
67+
// Camera 2
68+
let camera2 = commands
69+
.spawn((
70+
Camera3dBundle {
71+
camera: Camera {
72+
order: 1,
73+
viewport: Some(Viewport {
74+
physical_position: UVec2 {
75+
x: window.physical_width() / 4,
76+
y: window.physical_height() / 2,
77+
},
78+
physical_size: UVec2 {
79+
x: window.physical_width() / 2,
80+
y: window.physical_height() / 2,
81+
},
82+
..Default::default()
83+
}),
84+
..Default::default()
85+
},
86+
transform: Transform::from_xyz(0., 1.4, 2.0)
87+
.looking_at(Vec3::new(0., 0.3, 0.0), Vec3::Y),
88+
..default()
89+
},
90+
EnvironmentMapLight {
91+
diffuse_map: asset_server.load("environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"),
92+
specular_map: asset_server.load("environment_maps/pisa_specular_rgb9e5_zstd.ktx2"),
93+
intensity: 1500.0,
94+
},
95+
CameraView::from_layers(&[0, 1, 2, 3, 4, 5, 6]),
96+
Camera2,
97+
))
98+
.id();
99+
100+
// Plane
29101
commands.spawn((
30-
Camera3dBundle {
31-
transform: Transform::from_xyz(0., 1.4, 2.0)
32-
.looking_at(Vec3::new(0., 0.3, 0.0), Vec3::Y),
102+
PbrBundle {
103+
mesh: meshes.add(Plane3d::default().mesh().size(5000.0, 5000.0)),
104+
material: materials.add(Color::srgb(0.3, 0.5, 0.3)),
33105
..default()
34106
},
35-
EnvironmentMapLight {
36-
diffuse_map: asset_server.load("environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"),
37-
specular_map: asset_server.load("environment_maps/pisa_specular_rgb9e5_zstd.ktx2"),
38-
intensity: 1500.0,
39-
},
40-
CameraView::from_layers(&[0, 1, 2, 3, 4, 5, 6]),
107+
RenderGroups::from_layer(0),
41108
));
42109

43-
// Plane
44-
commands.spawn(PbrBundle {
45-
mesh: meshes.add(Plane3d::default().mesh().size(5000.0, 5000.0)),
46-
material: materials.add(Color::srgb(0.3, 0.5, 0.3)),
47-
..default()
48-
});
49-
50-
// Text
110+
// Text (camera 1)
51111
commands.spawn((
52112
TextBundle::from_section(
53-
"Press '1..3' to toggle mesh render layers\n\
113+
"Camera 1:\n\
114+
Press '1..3' to toggle mesh render layers\n\
54115
Press '4..6' to toggle directional light render layers",
55116
TextStyle {
56117
font_size: 20.,
@@ -63,7 +124,27 @@ fn setup(
63124
left: Val::Px(12.0),
64125
..default()
65126
}),
66-
RenderGroups::from_layer(0),
127+
TargetCamera(camera1),
128+
));
129+
130+
// Text (camera 2)
131+
commands.spawn((
132+
TextBundle::from_section(
133+
"Camera 2:\n\
134+
Press 'Q/W/E' to toggle mesh render layers\n\
135+
Press 'R/T/Y' to toggle directional light render layers",
136+
TextStyle {
137+
font_size: 20.,
138+
..default()
139+
},
140+
)
141+
.with_style(Style {
142+
position_type: PositionType::Absolute,
143+
top: Val::Px(12.0),
144+
left: Val::Px(12.0),
145+
..default()
146+
}),
147+
TargetCamera(camera2),
67148
));
68149

69150
// Spawn three copies of the scene, each with a different render group.
@@ -102,7 +183,10 @@ fn setup(
102183
}
103184
}
104185

105-
fn toggle_layers(mut query_camera: Query<&mut CameraView>, keyboard: Res<ButtonInput<KeyCode>>) {
186+
fn toggle_layers_camera1(
187+
mut query_camera: Query<&mut CameraView, With<Camera1>>,
188+
keyboard: Res<ButtonInput<KeyCode>>,
189+
) {
106190
let Ok(mut camera_view) = query_camera.get_single_mut() else {
107191
return;
108192
};
@@ -127,6 +211,34 @@ fn toggle_layers(mut query_camera: Query<&mut CameraView>, keyboard: Res<ButtonI
127211
}
128212
}
129213

214+
fn toggle_layers_camera2(
215+
mut query_camera: Query<&mut CameraView, With<Camera2>>,
216+
keyboard: Res<ButtonInput<KeyCode>>,
217+
) {
218+
let Ok(mut camera_view) = query_camera.get_single_mut() else {
219+
return;
220+
};
221+
222+
if keyboard.just_pressed(KeyCode::KeyQ) {
223+
toggle_camera_layer(&mut camera_view, 1);
224+
}
225+
if keyboard.just_pressed(KeyCode::KeyW) {
226+
toggle_camera_layer(&mut camera_view, 2);
227+
}
228+
if keyboard.just_pressed(KeyCode::KeyE) {
229+
toggle_camera_layer(&mut camera_view, 3);
230+
}
231+
if keyboard.just_pressed(KeyCode::KeyR) {
232+
toggle_camera_layer(&mut camera_view, 4);
233+
}
234+
if keyboard.just_pressed(KeyCode::KeyT) {
235+
toggle_camera_layer(&mut camera_view, 5);
236+
}
237+
if keyboard.just_pressed(KeyCode::KeyY) {
238+
toggle_camera_layer(&mut camera_view, 6);
239+
}
240+
}
241+
130242
fn toggle_camera_layer(camera_view: &mut CameraView, layer: usize) {
131243
if camera_view.contains_layer(layer) {
132244
camera_view.remove(layer);

0 commit comments

Comments
 (0)