Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
167 changes: 97 additions & 70 deletions animations/swipe-window.kdl
Original file line number Diff line number Diff line change
Expand Up @@ -4,94 +4,121 @@ animations {
workspace-switch {
spring damping-ratio=0.80 stiffness=523 epsilon=0.0001
}
window-open {
duration-ms 1400
curve "ease-out-expo"
custom-shader r"
float ease_curve(float x) {
return x < 0.5 ? 4.0*x*x*x : 1.0 - pow(-2.0*x + 2.0, 3.0)/2.0;
}

vec4 open_color(vec3 coords_geo, vec3 size_geo) {
float t = niri_clamped_progress;
float prog = ease_curve(t);

// bottom-right corner
vec2 start = vec2(1.0, 1.0);

// compute distance along diagonal from corner
vec2 p = coords_geo.xy;
vec2 dir = vec2(-1.0, -1.0); // vector toward top-left
float dist = dot(p - start, dir);

// normalize distance to max diagonal (from corner to opposite)
float max_diag = 2.0;
float norm_dist = dist / max_diag;

// pixels not yet reached by sweep are invisible
if (norm_dist > prog) {
return vec4(0.0);
}

// sample normally
vec3 coords_tex = niri_geo_to_tex * coords_geo;
vec4 col = texture2D(niri_tex, coords_tex.xy);
window-open {
duration-ms 1400
curve "ease-out-expo"
custom-shader r"
float ease_curve(float x) {
return x < 0.5 ? 4.0*x*x*x : 1.0 - pow(-2.0*x + 2.0, 3.0)/2.0;
}

return col;
}"
}
vec4 open_color(vec3 coords_geo, vec3 size_geo) {
float t = niri_clamped_progress;
float prog = ease_curve(t);

// choose corner: 0=top-left,1=top-right,2=bottom-left,3=bottom-right

int corner = 3;
vec2 start;
vec2 dir;
if (corner == 0) {
start = vec2(0.0,0.0);
dir = vec2(1.0,1.0);
} else if (corner == 1) {
start = vec2(1.0,0.0);
dir = vec2(-1.0,1.0);
} else if (corner == 2) {
start = vec2(0.0,1.0);
dir = vec2(1.0,-1.0);
} else {
start = vec2(1.0,1.0);
dir = vec2(-1.0,-1.0);
}

// compute distance along diagonal from corner
vec2 p = coords_geo.xy;
float dist = dot(p - start, dir);

// normalize distance to max diagonal (from corner to opposite)
float max_diag = 2.0;
float norm_dist = dist / max_diag;

// pixels not yet reached by sweep are invisible
if (norm_dist > prog) {
return vec4(0.0);
}

// sample normally
vec3 coords_tex = niri_geo_to_tex * coords_geo;
vec4 col = texture2D(niri_tex, coords_tex.xy);

return col;
}
"
}


window-close {
duration-ms 1400
curve "ease-out-expo"
custom-shader r"
// ease-in-out cubic curve helper
float ease_curve(float x) {
return x < 0.5 ? 4.0*x*x*x : 1.0 - pow(-2.0*x + 2.0, 3.0)/2.0;
}
duration-ms 1400
curve "ease-out-expo"
custom-shader r"
// ease-in-out cubic curve helper
float ease_curve(float x) {
return x < 0.5 ? 4.0*x*x*x : 1.0 - pow(-2.0*x + 2.0, 3.0)/2.0;
}

vec4 close_color(vec3 coords_geo, vec3 size_geo) {
float t = niri_clamped_progress;
vec4 close_color(vec3 coords_geo, vec3 size_geo) {
float t = niri_clamped_progress;


float prog = ease_curve(t);
float prog = ease_curve(t);

// choose corner: 0=top-left,1=top-right,2=bottom-left,3=bottom-right
// choose corner: 0=top-left,1=top-right,2=bottom-left,3=bottom-right

int corner = 0;
vec2 start;
if (corner == 0) start = vec2(0.0,0.0);
else if (corner == 1) start = vec2(1.0,0.0);
else if (corner == 2) start = vec2(0.0,1.0);
else start = vec2(1.0,1.0);
int corner = 0;
vec2 start;
vec2 dir;
if (corner == 0) {
start = vec2(0.0,0.0);
dir = vec2(1.0,1.0);
} else if (corner == 1) {
start = vec2(1.0,0.0);
dir = vec2(-1.0,1.0);
} else if (corner == 2) {
start = vec2(0.0,1.0);
dir = vec2(1.0,-1.0);
} else {
start = vec2(1.0,1.0);
dir = vec2(-1.0,-1.0);
}

float shadow_fix = 0.01; // otherwise the animation may stop before
// it hides the shadow, since it's outside the window bounds

// compute distance along diagonal from corner
// compute distance along diagonal from corner

vec2 p = coords_geo.xy;
float dist = dot(p - start, vec2(1.0,1.0));
vec2 p = coords_geo.xy;
float dist = dot(p - start, dir) - shadow_fix;

// normalize distance to max diagonal
float max_diag = 2.0; // max of vec2(1,1)
float norm_dist = dist / max_diag;
// normalize distance to max diagonal
float max_diag = 2.0; // max of vec2(1,1)
float norm_dist = dist / max_diag;


// If pixel is behind the sweeping line, make it invisible
// If pixel is behind the sweeping line, make it invisible

if (norm_dist <= prog) {
return vec4(0.0);
}
if (norm_dist <= prog) {
return vec4(0.0);
}

// sample normally
vec3 coords_tex = niri_geo_to_tex * coords_geo;
vec4 col = texture2D(niri_tex, coords_tex.xy);
// sample normally
vec3 coords_tex = niri_geo_to_tex * coords_geo;
vec4 col = texture2D(niri_tex, coords_tex.xy);

return col;
}"
}
return col;
}
"
}


horizontal-view-movement {
spring damping-ratio=0.85 stiffness=423 epsilon=0.0001
}
Expand Down