Skip to content

Commit

Permalink
add second camera to render groups example
Browse files Browse the repository at this point in the history
  • Loading branch information
UkoeHB committed Mar 23, 2024
1 parent 69b7666 commit efa8ae0
Showing 1 changed file with 135 additions and 23 deletions.
158 changes: 135 additions & 23 deletions examples/3d/render_groups.rs
Expand Up @@ -4,53 +4,114 @@ use bevy::{
color::palettes,
pbr::DirectionalLightShadowMap,
prelude::*,
render::camera::Viewport,
render::view::{CameraView, PropagateRenderGroups, RenderGroups},
window::PrimaryWindow,
};

fn main() {
App::new()
.insert_resource(DirectionalLightShadowMap { size: 4096 })
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.add_systems(Update, toggle_layers)
.add_systems(Update, (toggle_layers_camera1, toggle_layers_camera2))
.run();
}

#[derive(Component)]
struct MovedScene;
struct Camera1;

#[derive(Component)]
struct Camera2;

fn setup(
mut commands: Commands,
asset_server: Res<AssetServer>,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
window: Query<&Window, With<PrimaryWindow>>,
) {
// Camera
// Camera 1
let window = window.single();
let camera1 = commands
.spawn((
Camera3dBundle {
camera: Camera {
viewport: Some(Viewport {
physical_position: UVec2 {
x: window.physical_width() / 4,
y: 0,
},
physical_size: UVec2 {
x: window.physical_width() / 2,
y: window.physical_height() / 2,
},
..Default::default()
}),
..Default::default()
},
transform: Transform::from_xyz(0., 1.4, 2.0)
.looking_at(Vec3::new(0., 0.3, 0.0), Vec3::Y),
..default()
},
EnvironmentMapLight {
diffuse_map: asset_server.load("environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"),
specular_map: asset_server.load("environment_maps/pisa_specular_rgb9e5_zstd.ktx2"),
intensity: 1500.0,
},
CameraView::from_layers(&[0, 1, 2, 3, 4, 5, 6]),
Camera1,
))
.id();

// Camera 2
let camera2 = commands
.spawn((
Camera3dBundle {
camera: Camera {
order: 1,
viewport: Some(Viewport {
physical_position: UVec2 {
x: window.physical_width() / 4,
y: window.physical_height() / 2,
},
physical_size: UVec2 {
x: window.physical_width() / 2,
y: window.physical_height() / 2,
},
..Default::default()
}),
..Default::default()
},
transform: Transform::from_xyz(0., 1.4, 2.0)
.looking_at(Vec3::new(0., 0.3, 0.0), Vec3::Y),
..default()
},
EnvironmentMapLight {
diffuse_map: asset_server.load("environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"),
specular_map: asset_server.load("environment_maps/pisa_specular_rgb9e5_zstd.ktx2"),
intensity: 1500.0,
},
CameraView::from_layers(&[0, 1, 2, 3, 4, 5, 6]),
Camera2,
))
.id();

// Plane
commands.spawn((
Camera3dBundle {
transform: Transform::from_xyz(0., 1.4, 2.0)
.looking_at(Vec3::new(0., 0.3, 0.0), Vec3::Y),
PbrBundle {
mesh: meshes.add(Plane3d::default().mesh().size(5000.0, 5000.0)),
material: materials.add(Color::srgb(0.3, 0.5, 0.3)),
..default()
},
EnvironmentMapLight {
diffuse_map: asset_server.load("environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2"),
specular_map: asset_server.load("environment_maps/pisa_specular_rgb9e5_zstd.ktx2"),
intensity: 1500.0,
},
CameraView::from_layers(&[0, 1, 2, 3, 4, 5, 6]),
RenderGroups::from_layer(0),
));

// Plane
commands.spawn(PbrBundle {
mesh: meshes.add(Plane3d::default().mesh().size(5000.0, 5000.0)),
material: materials.add(Color::srgb(0.3, 0.5, 0.3)),
..default()
});

// Text
// Text (camera 1)
commands.spawn((
TextBundle::from_section(
"Press '1..3' to toggle mesh render layers\n\
"Camera 1:\n\
Press '1..3' to toggle mesh render layers\n\
Press '4..6' to toggle directional light render layers",
TextStyle {
font_size: 20.,
Expand All @@ -63,7 +124,27 @@ fn setup(
left: Val::Px(12.0),
..default()
}),
RenderGroups::from_layer(0),
TargetCamera(camera1),
));

// Text (camera 2)
commands.spawn((
TextBundle::from_section(
"Camera 2:\n\
Press 'Q/W/E' to toggle mesh render layers\n\
Press 'R/T/Y' to toggle directional light render layers",
TextStyle {
font_size: 20.,
..default()
},
)
.with_style(Style {
position_type: PositionType::Absolute,
top: Val::Px(12.0),
left: Val::Px(12.0),
..default()
}),
TargetCamera(camera2),
));

// Spawn three copies of the scene, each with a different render group.
Expand Down Expand Up @@ -102,7 +183,10 @@ fn setup(
}
}

fn toggle_layers(mut query_camera: Query<&mut CameraView>, keyboard: Res<ButtonInput<KeyCode>>) {
fn toggle_layers_camera1(
mut query_camera: Query<&mut CameraView, With<Camera1>>,
keyboard: Res<ButtonInput<KeyCode>>,
) {
let Ok(mut camera_view) = query_camera.get_single_mut() else {
return;
};
Expand All @@ -127,6 +211,34 @@ fn toggle_layers(mut query_camera: Query<&mut CameraView>, keyboard: Res<ButtonI
}
}

fn toggle_layers_camera2(
mut query_camera: Query<&mut CameraView, With<Camera2>>,
keyboard: Res<ButtonInput<KeyCode>>,
) {
let Ok(mut camera_view) = query_camera.get_single_mut() else {
return;
};

if keyboard.just_pressed(KeyCode::KeyQ) {
toggle_camera_layer(&mut camera_view, 1);
}
if keyboard.just_pressed(KeyCode::KeyW) {
toggle_camera_layer(&mut camera_view, 2);
}
if keyboard.just_pressed(KeyCode::KeyE) {
toggle_camera_layer(&mut camera_view, 3);
}
if keyboard.just_pressed(KeyCode::KeyR) {
toggle_camera_layer(&mut camera_view, 4);
}
if keyboard.just_pressed(KeyCode::KeyT) {
toggle_camera_layer(&mut camera_view, 5);
}
if keyboard.just_pressed(KeyCode::KeyY) {
toggle_camera_layer(&mut camera_view, 6);
}
}

fn toggle_camera_layer(camera_view: &mut CameraView, layer: usize) {
if camera_view.contains_layer(layer) {
camera_view.remove(layer);
Expand Down

0 comments on commit efa8ae0

Please sign in to comment.