diff --git a/crates/bevy_render/src/view/window.rs b/crates/bevy_render/src/view/window.rs index 4699cef202006..a4c31cc1484cb 100644 --- a/crates/bevy_render/src/view/window.rs +++ b/crates/bevy_render/src/view/window.rs @@ -46,6 +46,7 @@ pub struct ExtractedWindow { pub present_mode: PresentMode, pub swap_chain_texture: Option, pub size_changed: bool, + pub scale_factor: f64, } #[derive(Default)] @@ -89,6 +90,7 @@ fn extract_windows( present_mode: window.present_mode(), swap_chain_texture: None, size_changed: false, + scale_factor: window.scale_factor(), }); // NOTE: Drop the swap chain frame here diff --git a/crates/bevy_ui/src/render/mod.rs b/crates/bevy_ui/src/render/mod.rs index e19d7b1731667..ee64016fdd844 100644 --- a/crates/bevy_ui/src/render/mod.rs +++ b/crates/bevy_ui/src/render/mod.rs @@ -20,8 +20,8 @@ use bevy_render::{ render_resource::*, renderer::{RenderDevice, RenderQueue}, texture::Image, - view::{ComputedVisibility, ExtractedView, ViewUniforms}, - Extract, RenderApp, RenderStage, + view::{ComputedVisibility, ExtractedView, ExtractedWindows, ViewUniforms}, + Extract, RenderApp, RenderStage }; use bevy_sprite::{Rect, SpriteAssetEvents, TextureAtlas}; use bevy_text::{DefaultTextPipeline, Text}; @@ -377,9 +377,16 @@ pub fn prepare_uinodes( render_queue: Res, mut ui_meta: ResMut, mut extracted_uinodes: ResMut, + extracted_windows: Res, ) { ui_meta.vertices.clear(); + let scale_factor = if let Some(extracted_window) = extracted_windows.get(&WindowId::primary()) { + extracted_window.scale_factor as f32 + } else { + 1. + }; + // sort by increasing z for correct transparency extracted_uinodes .uinodes @@ -460,22 +467,27 @@ pub fn prepare_uinodes( // Clip UVs (Note: y is reversed in UV space) let atlas_extent = extracted_uinode.atlas_size.unwrap_or(uinode_rect.max); + let uv_scale = if extracted_uinode.atlas_size.is_some() { + scale_factor + } else { + 1.0 + }; let uvs = [ Vec2::new( - uinode_rect.min.x + positions_diff[0].x, - uinode_rect.max.y - positions_diff[0].y, + uinode_rect.min.x + positions_diff[0].x * uv_scale, + uinode_rect.max.y - positions_diff[0].y * uv_scale, ), Vec2::new( - uinode_rect.max.x + positions_diff[1].x, - uinode_rect.max.y - positions_diff[1].y, + uinode_rect.max.x + positions_diff[1].x * uv_scale, + uinode_rect.max.y - positions_diff[1].y * uv_scale, ), Vec2::new( - uinode_rect.max.x + positions_diff[2].x, - uinode_rect.min.y - positions_diff[2].y, + uinode_rect.max.x + positions_diff[2].x * uv_scale, + uinode_rect.min.y - positions_diff[2].y * uv_scale, ), Vec2::new( - uinode_rect.min.x + positions_diff[3].x, - uinode_rect.min.y - positions_diff[3].y, + uinode_rect.min.x + positions_diff[3].x * uv_scale, + uinode_rect.min.y - positions_diff[3].y * uv_scale, ), ] .map(|pos| pos / atlas_extent);