59 lines
2.1 KiB
GLSL
59 lines
2.1 KiB
GLSL
// We simply inverse the progress for opening windows.
|
|
float progress = uForOpening ? 1.0 - uProgress : uProgress;
|
|
|
|
// Add some smooth noise to the progress so that not every tile behaves the
|
|
// same.
|
|
float noise = simplex2D(cogl_tex_coord_in[0].st + uSeed);
|
|
progress = clamp(mix(noise - 1.0, noise + 1.0, progress), 0.0, 1.0);
|
|
|
|
// glowProgress fades in in the first half of the animation, tileProgress fades
|
|
// in in the second half.
|
|
float glowProgress = smoothstep(0, 1, clamp(progress / 0.5, 0, 1));
|
|
float tileProgress = smoothstep(0, 1, clamp((progress - 0.5) / 0.5, 0, 1));
|
|
|
|
vec2 texScale = 0.1 * uSize / uScale;
|
|
vec4 hex = getHexagons(cogl_tex_coord_in[0].st * texScale);
|
|
|
|
if (tileProgress > hex.z) {
|
|
|
|
// Crop outer parts of the shrinking tiles.
|
|
cogl_color_out.a = 0.0;
|
|
|
|
} else {
|
|
|
|
// Make the tiles shrink by offsetting the texture lookup towards the edge
|
|
// of the cell.
|
|
vec2 lookupOffset = tileProgress * hex.xy / texScale / (1.0 - tileProgress);
|
|
cogl_color_out = texture2D(uTexture, cogl_tex_coord_in[0].st + lookupOffset);
|
|
|
|
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
|
if (cogl_color_out.a > 0) {
|
|
cogl_color_out.rgb /= cogl_color_out.a;
|
|
}
|
|
|
|
vec4 glow = uGlowColor;
|
|
vec4 line = uLineColor;
|
|
|
|
// For the glow, we accumulate a few exponentially scaled versions of hex.w.
|
|
glow.a *= pow(hex.w, 20.0) * 10.0 + pow(hex.w, 10.0) * 5.0 + pow(hex.w, 2.0) * 0.5;
|
|
|
|
// Using step(uLineWidth, hex.z) would be simpler, but the below creates some
|
|
// fake antialiasing.
|
|
line.a *= 1.0 - smoothstep(uLineWidth * 0.02 * 0.5, uLineWidth * 0.02, hex.z);
|
|
|
|
// Fade in the glowing lines.
|
|
glow.a *= glowProgress;
|
|
line.a *= glowProgress;
|
|
|
|
// Do not add the hexagon lines onto transparent parts of the window.
|
|
glow *= cogl_color_out.a;
|
|
line *= cogl_color_out.a;
|
|
|
|
if (uAdditiveBlending) {
|
|
cogl_color_out.rgb += glow.rgb * glow.a;
|
|
cogl_color_out.rgb += line.rgb * line.a;
|
|
} else {
|
|
cogl_color_out.rgb = mix(cogl_color_out.rgb, glow.rgb, glow.a);
|
|
cogl_color_out.rgb = mix(cogl_color_out.rgb, line.rgb, line.a);
|
|
}
|
|
} |