From 812d11b1e3f1f185b7d350a9ba57fbc2824faa82 Mon Sep 17 00:00:00 2001 From: IceSentry Date: Mon, 31 Jul 2023 14:57:59 -0400 Subject: [PATCH] Fix gizmo line width issue when using perspective (#9067) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - In bevy_polyline, we discovered an issue that happens when line width is smaller than 1.0 and using perspective. It would sometimes end up negative or NaN. I'm not entirely sure _why_ it happens. - Make sure the width doesn't go below 0 before multiplying it with the alpha Here's a link to the bevy_polyline issue https://github.com/ForesightMiningSoftwareCorporation/bevy_polyline/issues/46 I'm not sure if the solution is correct but it solved the issue in my testing. Co-authored-by: François --- crates/bevy_gizmos/src/lines.wgsl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/bevy_gizmos/src/lines.wgsl b/crates/bevy_gizmos/src/lines.wgsl index 037a9fbcae..6696f51e62 100644 --- a/crates/bevy_gizmos/src/lines.wgsl +++ b/crates/bevy_gizmos/src/lines.wgsl @@ -64,7 +64,7 @@ fn vertex(vertex: VertexInput) -> VertexOutput { #endif // Line thinness fade from https://acegikmo.com/shapes/docs/#anti-aliasing - if line_width < 1. { + if line_width > 0.0 && line_width < 1. { color.a *= line_width; line_width = 1.; } @@ -79,11 +79,11 @@ fn vertex(vertex: VertexInput) -> VertexOutput { let epsilon = 4.88e-04; // depth * (clip.w / depth)^-depth_bias. So that when -depth_bias is 1.0, this is equal to clip.w // and when equal to 0.0, it is exactly equal to depth. - // the epsilon is here to prevent the depth from exceeding clip.w when -depth_bias = 1.0 - // clip.w represents the near plane in homogenous clip space in bevy, having a depth + // the epsilon is here to prevent the depth from exceeding clip.w when -depth_bias = 1.0 + // clip.w represents the near plane in homogeneous clip space in bevy, having a depth // of this value means nothing can be in front of this - // The reason this uses an exponential function is that it makes it much easier for the - // user to chose a value that is convinient for them + // The reason this uses an exponential function is that it makes it much easier for the + // user to chose a value that is convenient for them depth = clip.z * exp2(-line_gizmo.depth_bias * log2(clip.w / clip.z - epsilon)); }