@@ -9,7 +9,6 @@ use bevy_core_pipeline::{core_2d::Camera2d, core_3d::Camera3d};
9
9
use bevy_hierarchy:: Parent ;
10
10
use bevy_render:: { render_phase:: PhaseItem , view:: ViewVisibility , ExtractSchedule , Render } ;
11
11
use bevy_sprite:: { SpriteAssetEvents , TextureAtlas } ;
12
- use bevy_window:: { PrimaryWindow , Window } ;
13
12
pub use pipeline:: * ;
14
13
pub use render_pass:: * ;
15
14
pub use ui_material_pipeline:: * ;
@@ -181,7 +180,7 @@ pub struct ExtractedUiNodes {
181
180
182
181
pub fn extract_uinode_background_colors (
183
182
mut extracted_uinodes : ResMut < ExtractedUiNodes > ,
184
- windows : Extract < Query < & Window , With < PrimaryWindow > > > ,
183
+ camera_query : Extract < Query < ( Entity , & Camera ) > > ,
185
184
default_ui_camera : Extract < DefaultUiCamera > ,
186
185
ui_scale : Extract < Res < UiScale > > ,
187
186
uinode_query : Extract <
@@ -197,12 +196,6 @@ pub fn extract_uinode_background_colors(
197
196
) > ,
198
197
> ,
199
198
) {
200
- let viewport_size = windows
201
- . get_single ( )
202
- . map ( |window| window. resolution . size ( ) )
203
- . unwrap_or ( Vec2 :: ZERO )
204
- * ui_scale. 0 ;
205
-
206
199
for (
207
200
entity,
208
201
uinode,
@@ -224,8 +217,22 @@ pub fn extract_uinode_background_colors(
224
217
continue ;
225
218
}
226
219
220
+ let ui_logical_viewport_size = camera_query
221
+ . get ( camera_entity)
222
+ . ok ( )
223
+ . and_then ( |( _, c) | c. logical_viewport_size ( ) )
224
+ . unwrap_or ( Vec2 :: ZERO )
225
+ // The logical window resolution returned by `Window` only takes into account the window scale factor and not `UiScale`,
226
+ // so we have to divide by `UiScale` to get the size of the UI viewport.
227
+ / ui_scale. 0 ;
228
+
227
229
let border_radius = if let Some ( border_radius) = border_radius {
228
- resolve_border_radius ( border_radius, uinode. size ( ) , viewport_size, ui_scale. 0 )
230
+ resolve_border_radius (
231
+ border_radius,
232
+ uinode. size ( ) ,
233
+ ui_logical_viewport_size,
234
+ ui_scale. 0 ,
235
+ )
229
236
} else {
230
237
[ 0. ; 4 ]
231
238
} ;
@@ -257,7 +264,7 @@ pub fn extract_uinode_background_colors(
257
264
pub fn extract_uinode_images (
258
265
mut commands : Commands ,
259
266
mut extracted_uinodes : ResMut < ExtractedUiNodes > ,
260
- windows : Extract < Query < & Window , With < PrimaryWindow > > > ,
267
+ camera_query : Extract < Query < ( Entity , & Camera ) > > ,
261
268
texture_atlases : Extract < Res < Assets < TextureAtlasLayout > > > ,
262
269
ui_scale : Extract < Res < UiScale > > ,
263
270
default_ui_camera : Extract < DefaultUiCamera > ,
@@ -275,12 +282,6 @@ pub fn extract_uinode_images(
275
282
) > ,
276
283
> ,
277
284
) {
278
- let viewport_size = windows
279
- . get_single ( )
280
- . map ( |window| window. resolution . size ( ) )
281
- . unwrap_or ( Vec2 :: ZERO )
282
- * ui_scale. 0 ;
283
-
284
285
for ( uinode, transform, view_visibility, clip, camera, image, atlas, slices, border_radius) in
285
286
& uinode_query
286
287
{
@@ -326,8 +327,22 @@ pub fn extract_uinode_images(
326
327
) ,
327
328
} ;
328
329
330
+ let ui_logical_viewport_size = camera_query
331
+ . get ( camera_entity)
332
+ . ok ( )
333
+ . and_then ( |( _, c) | c. logical_viewport_size ( ) )
334
+ . unwrap_or ( Vec2 :: ZERO )
335
+ // The logical window resolution returned by `Window` only takes into account the window scale factor and not `UiScale`,
336
+ // so we have to divide by `UiScale` to get the size of the UI viewport.
337
+ / ui_scale. 0 ;
338
+
329
339
let border_radius = if let Some ( border_radius) = border_radius {
330
- resolve_border_radius ( border_radius, uinode. size ( ) , viewport_size, ui_scale. 0 )
340
+ resolve_border_radius (
341
+ border_radius,
342
+ uinode. size ( ) ,
343
+ ui_logical_viewport_size,
344
+ ui_scale. 0 ,
345
+ )
331
346
} else {
332
347
[ 0. ; 4 ]
333
348
} ;
0 commit comments