1
1
use bevy:: {
2
- math:: clamp,
2
+ math:: { clamp, Rect } ,
3
3
prelude:: * ,
4
4
render:: {
5
5
camera:: { ActiveCameras , Camera } ,
@@ -26,22 +26,22 @@ fn setup(
26
26
asset_server : Res < AssetServer > ,
27
27
) {
28
28
// add new camera nodes for the secondary viewports
29
- render_graph. add_system_node ( "top_right_camera " , CameraNode :: new ( "TopRight " ) ) ;
30
- render_graph. add_system_node ( "bottom_right_camera " , CameraNode :: new ( "BottomRight " ) ) ;
31
- active_cameras. add ( "TopRight " ) ;
32
- active_cameras. add ( "BottomRight " ) ;
29
+ render_graph. add_system_node ( "front_view_camera " , CameraNode :: new ( "FrontView " ) ) ;
30
+ render_graph. add_system_node ( "side_view_camera " , CameraNode :: new ( "SideView " ) ) ;
31
+ active_cameras. add ( "FrontView " ) ;
32
+ active_cameras. add ( "SideView " ) ;
33
33
34
34
// add the cameras to the main pass
35
35
{
36
36
let main_pass: & mut PassNode < & MainPass > = render_graph. get_node_mut ( "main_pass" ) . unwrap ( ) ;
37
- main_pass. add_camera ( "TopRight " ) ;
38
- main_pass. add_camera ( "BottomRight " ) ;
37
+ main_pass. add_camera ( "FrontView " ) ;
38
+ main_pass. add_camera ( "SideView " ) ;
39
39
}
40
40
render_graph
41
- . add_node_edge ( "top_right_camera " , "main_pass" )
41
+ . add_node_edge ( "front_view_camera " , "main_pass" )
42
42
. unwrap ( ) ;
43
43
render_graph
44
- . add_node_edge ( "bottom_right_camera " , "main_pass" )
44
+ . add_node_edge ( "side_view_camera " , "main_pass" )
45
45
. unwrap ( ) ;
46
46
47
47
// SETUP SCENE
@@ -78,7 +78,7 @@ fn setup(
78
78
// top right camera
79
79
. spawn ( PerspectiveCameraBundle {
80
80
camera : Camera {
81
- name : Some ( "TopRight " . to_string ( ) ) ,
81
+ name : Some ( "FrontView " . to_string ( ) ) ,
82
82
..Default :: default ( )
83
83
} ,
84
84
transform : Transform :: from_xyz ( 0.0 , 0.3 , 1.3 )
@@ -88,7 +88,7 @@ fn setup(
88
88
// bottom right camera
89
89
. spawn ( PerspectiveCameraBundle {
90
90
camera : Camera {
91
- name : Some ( "BottomRight " . to_string ( ) ) ,
91
+ name : Some ( "SideView " . to_string ( ) ) ,
92
92
..Default :: default ( )
93
93
} ,
94
94
transform : Transform :: from_xyz ( -1.3 , 0.3 , 0.0 )
@@ -97,7 +97,8 @@ fn setup(
97
97
} ) ;
98
98
99
99
// ui
100
- let instructions_text = "use the arrow keys to resize the viewports" ;
100
+ let instructions_text =
101
+ "Use the arrow keys to resize the viewports\n Press Enter to swap the rightmost viewports" ;
101
102
commands
102
103
. spawn ( UiCameraBundle {
103
104
// viewports occupy the entire surface by default, and can overlap each other
@@ -124,13 +125,44 @@ fn setup(
124
125
struct ViewportLayout {
125
126
divide_x : f32 ,
126
127
divide_y : f32 ,
128
+ invert : bool ,
129
+ }
130
+
131
+ impl ViewportLayout {
132
+ pub fn main_view ( & self ) -> Rect < SideLocation > {
133
+ Rect {
134
+ left : SideLocation :: Relative ( 0.0 ) ,
135
+ right : SideLocation :: Relative ( self . divide_x ) ,
136
+ top : SideLocation :: Relative ( 0.0 ) ,
137
+ bottom : SideLocation :: Relative ( 1.0 ) ,
138
+ }
139
+ }
140
+
141
+ pub fn front_view_view ( & self ) -> Rect < SideLocation > {
142
+ Rect {
143
+ left : SideLocation :: Relative ( self . divide_x ) ,
144
+ right : SideLocation :: Relative ( 1.0 ) ,
145
+ top : SideLocation :: Relative ( 0.0 ) ,
146
+ bottom : SideLocation :: Relative ( self . divide_y ) ,
147
+ }
148
+ }
149
+
150
+ pub fn side_view_view ( & self ) -> Rect < SideLocation > {
151
+ Rect {
152
+ left : SideLocation :: Relative ( self . divide_x ) ,
153
+ right : SideLocation :: Relative ( 1.0 ) ,
154
+ top : SideLocation :: Relative ( self . divide_y ) ,
155
+ bottom : SideLocation :: Relative ( 1.0 ) ,
156
+ }
157
+ }
127
158
}
128
159
129
160
impl Default for ViewportLayout {
130
161
fn default ( ) -> Self {
131
162
Self {
132
163
divide_x : 0.5 ,
133
164
divide_y : 0.5 ,
165
+ invert : false ,
134
166
}
135
167
}
136
168
}
@@ -153,6 +185,9 @@ fn viewport_layout_system(
153
185
if keyboard_input. just_pressed ( KeyCode :: Down ) {
154
186
layout. divide_y += 0.05 ;
155
187
}
188
+ if keyboard_input. just_pressed ( KeyCode :: Return ) {
189
+ layout. invert = !layout. invert ;
190
+ }
156
191
layout. divide_x = clamp ( layout. divide_x , 0.0 , 1.0 ) ;
157
192
layout. divide_y = clamp ( layout. divide_y , 0.0 , 1.0 ) ;
158
193
@@ -161,15 +196,21 @@ fn viewport_layout_system(
161
196
match camera. name . as_deref ( ) {
162
197
// default camera
163
198
Some ( "Camera3d" ) => {
164
- viewport. sides . right = SideLocation :: Relative ( layout. divide_x ) ;
199
+ viewport. sides = layout. main_view ( ) ;
165
200
}
166
- Some ( "TopRight" ) => {
167
- viewport. sides . left = SideLocation :: Relative ( layout. divide_x ) ;
168
- viewport. sides . bottom = SideLocation :: Relative ( layout. divide_y ) ;
201
+ Some ( "FrontView" ) => {
202
+ if layout. invert {
203
+ viewport. sides = layout. front_view_view ( ) ;
204
+ } else {
205
+ viewport. sides = layout. side_view_view ( ) ;
206
+ }
169
207
}
170
- Some ( "BottomRight" ) => {
171
- viewport. sides . left = SideLocation :: Relative ( layout. divide_x ) ;
172
- viewport. sides . top = SideLocation :: Relative ( layout. divide_y ) ;
208
+ Some ( "SideView" ) => {
209
+ if layout. invert {
210
+ viewport. sides = layout. side_view_view ( ) ;
211
+ } else {
212
+ viewport. sides = layout. front_view_view ( ) ;
213
+ }
173
214
}
174
215
_ => { }
175
216
}
0 commit comments