From 2d749718b430d19b5dfd535d8c042fb97e7636a8 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 30 May 2022 15:14:12 +0000 Subject: [PATCH] OrthographicProjection: place origin at integer pixel with WindowSize scaling mode (#4085) # Objective One way to avoid texture atlas bleeding is to ensure that every vertex is placed at an integer pixel coordinate. This is a particularly appealing solution for regular structures like tile maps. Doing so is currently harder than necessary when the WindowSize scaling mode and Center origin are used: For odd window width or height, the origin of the coordinate system is placed in the middle of a pixel at some .5 offset. ## Solution Avoid this issue by rounding the half width and height values. --- crates/bevy_render/src/camera/projection.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/crates/bevy_render/src/camera/projection.rs b/crates/bevy_render/src/camera/projection.rs index 3f983fa8b33302..3c2a7d745da217 100644 --- a/crates/bevy_render/src/camera/projection.rs +++ b/crates/bevy_render/src/camera/projection.rs @@ -104,12 +104,14 @@ impl CameraProjection for OrthographicProjection { fn update(&mut self, width: f32, height: f32) { match (&self.scaling_mode, &self.window_origin) { (ScalingMode::WindowSize, WindowOrigin::Center) => { - let half_width = width / 2.0; - let half_height = height / 2.0; - self.left = -half_width; + let half_width = (width / 2.0).round(); + let half_height = (height / 2.0).round(); + // Assign left and bottom such that (right-left)==width and (top-bottom)==height + // still hold with with rounded half_width and half_height + self.left = half_width - width; self.right = half_width; self.top = half_height; - self.bottom = -half_height; + self.bottom = half_height - height; } (ScalingMode::WindowSize, WindowOrigin::BottomLeft) => { self.left = 0.0;