@@ -4,53 +4,114 @@ use bevy::{
4
4
color:: palettes,
5
5
pbr:: DirectionalLightShadowMap ,
6
6
prelude:: * ,
7
+ render:: camera:: Viewport ,
7
8
render:: view:: { CameraView , PropagateRenderGroups , RenderGroups } ,
9
+ window:: PrimaryWindow ,
8
10
} ;
9
11
10
12
fn main ( ) {
11
13
App :: new ( )
12
14
. insert_resource ( DirectionalLightShadowMap { size : 4096 } )
13
15
. add_plugins ( DefaultPlugins )
14
16
. add_systems ( Startup , setup)
15
- . add_systems ( Update , toggle_layers )
17
+ . add_systems ( Update , ( toggle_layers_camera1 , toggle_layers_camera2 ) )
16
18
. run ( ) ;
17
19
}
18
20
19
21
#[ derive( Component ) ]
20
- struct MovedScene ;
22
+ struct Camera1 ;
23
+
24
+ #[ derive( Component ) ]
25
+ struct Camera2 ;
21
26
22
27
fn setup (
23
28
mut commands : Commands ,
24
29
asset_server : Res < AssetServer > ,
25
30
mut meshes : ResMut < Assets < Mesh > > ,
26
31
mut materials : ResMut < Assets < StandardMaterial > > ,
32
+ window : Query < & Window , With < PrimaryWindow > > ,
27
33
) {
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
29
101
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 ) ) ,
33
105
..default ( )
34
106
} ,
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 ) ,
41
108
) ) ;
42
109
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)
51
111
commands. spawn ( (
52
112
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 \
54
115
Press '4..6' to toggle directional light render layers",
55
116
TextStyle {
56
117
font_size : 20. ,
@@ -63,7 +124,27 @@ fn setup(
63
124
left : Val :: Px ( 12.0 ) ,
64
125
..default ( )
65
126
} ) ,
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) ,
67
148
) ) ;
68
149
69
150
// Spawn three copies of the scene, each with a different render group.
@@ -102,7 +183,10 @@ fn setup(
102
183
}
103
184
}
104
185
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
+ ) {
106
190
let Ok ( mut camera_view) = query_camera. get_single_mut ( ) else {
107
191
return ;
108
192
} ;
@@ -127,6 +211,34 @@ fn toggle_layers(mut query_camera: Query<&mut CameraView>, keyboard: Res<ButtonI
127
211
}
128
212
}
129
213
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
+
130
242
fn toggle_camera_layer ( camera_view : & mut CameraView , layer : usize ) {
131
243
if camera_view. contains_layer ( layer) {
132
244
camera_view. remove ( layer) ;
0 commit comments