git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit62eeba5f61ac26aada4a5246184f2858b02e4684
parent99ca80a2eb
authorLucas Galante <[email protected]>
date2026-07-01 20:41
Implement dynamic relative fade scaling and add gaussian fade mode with gamma correction in quad_round shader

 scenefx/render/fx_renderer/shaders/quad_round.frag |  8 +++++++-
 src/server/output.rs                               | 11 +++++++++--
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/scenefx/render/fx_renderer/shaders/quad_round.frag b/scenefx/render/fx_renderer/shaders/quad_round.frag
index e1091bf..8a2a0e4 100644
--- a/scenefx/render/fx_renderer/shaders/quad_round.frag
+++ b/scenefx/render/fx_renderer/shaders/quad_round.frag
@@ -83,9 +83,15 @@ void main() {
 		} else if (fade_mode == 3) {
 			factor_x = 0.5 - 0.5 * cos(factor_x * 3.14159265);
 			factor_y = 0.5 - 0.5 * cos(factor_y * 3.14159265);
+		} else if (fade_mode == 4) {
+			float x = 1.0 - factor_x;
+			factor_x = clamp((exp(-3.0 * x * x) - 0.049) / 0.951, 0.0, 1.0);
+			float y = 1.0 - factor_y;
+			factor_y = clamp((exp(-3.0 * y * y) - 0.049) / 0.951, 0.0, 1.0);
 		}
 
-		final_color *= factor_x * factor_y;
+		float combined_factor = factor_x * factor_y;
+		final_color *= pow(combined_factor, 2.2);
 	}
 
 	gl_FragColor = final_color * quad_corner_alpha * clip_corner_alpha;
diff --git a/src/server/output.rs b/src/server/output.rs
index d850522..dc135f1 100644
--- a/src/server/output.rs
+++ b/src/server/output.rs
@@ -709,10 +709,17 @@ impl Output {
                     "smoothstep" => 1,
                     "quadratic" => 2,
                     "cosine" => 3,
+                    "gaussian" => 4,
                     _ => 0, // "linear"
                 };
-                let inset_scaled = if cell_fade_inset > 0 {
-                    ((cell_fade_inset as f64 * zoom * 100.0).round() as i32) * 10 + fade_mode
+                
+                // Cap the active fade inset at 45% of the cell size to prevent cells from completely blurring out at high zoom out levels
+                let max_inset = (rw as f64 * 0.45).floor() as i32;
+                let inset_pixels = (cell_fade_inset as f64 * zoom).round() as i32;
+                let active_inset = inset_pixels.min(max_inset).max(0);
+
+                let inset_scaled = if active_inset > 0 {
+                    (active_inset * 1000) + fade_mode
                 } else {
                     0
                 };