From 6fa4d1adba7510f076e9f75e9ed0856c8919aa9c Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 3 Mar 2022 00:17:19 +0100 Subject: [PATCH] OrthographicProjection: place origin at integer pixel with WindowSize scaling mode 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. 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 b0ea170c75f6e..fce72aa8460e1 100644 --- a/crates/bevy_render/src/camera/projection.rs +++ b/crates/bevy_render/src/camera/projection.rs @@ -103,12 +103,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;