66 lines
2.2 KiB
GLSL
66 lines
2.2 KiB
GLSL
// Inject some common shader snippets. It is only possible to include glsl files from the
|
|
// "common" directory. Also, the files in the "common" directory are not allowed to
|
|
// include any further files.
|
|
#include "common/uniforms.glsl"
|
|
#include "common/noise.glsl"
|
|
#include "common/edgeMask.glsl"
|
|
|
|
uniform vec3 uColor;
|
|
uniform float uScale;
|
|
|
|
const float SHOWER_TIME = 0.3;
|
|
const float SHOWER_WIDTH = 0.3;
|
|
const float STREAK_TIME = 0.6;
|
|
const float EDGE_FADE = 50;
|
|
|
|
// This method returns four values:
|
|
// result.x: A mask for the particles which lead the shower.
|
|
// result.y: A mask for the streaks which follow the shower particles.
|
|
// result.z: A mask for the final "atom" particles.
|
|
// result.w: The opacity of the fading window.
|
|
vec4 getMasks() {
|
|
float showerProgress = uProgress / SHOWER_TIME;
|
|
float streakProgress = clamp((uProgress - SHOWER_TIME) / STREAK_TIME, 0, 1);
|
|
float fadeProgress = clamp((uProgress - SHOWER_TIME) / (1.0 - SHOWER_TIME), 0, 1);
|
|
|
|
// Gradient from top to bottom.
|
|
float t = cogl_tex_coord_in[0].t;
|
|
|
|
// A smooth gradient which moves to the bottom within the showerProgress.
|
|
float showerMask =
|
|
smoothstep(1, 0, abs(showerProgress - t - SHOWER_WIDTH) / SHOWER_WIDTH);
|
|
|
|
// This is 1 above the streak mask.
|
|
float streakMask = (showerProgress - t - SHOWER_WIDTH) > 0 ? 1 : 0;
|
|
|
|
// Compute mask for the "atom" particles.
|
|
float atomMask = getRelativeEdgeMask(0.2);
|
|
atomMask = max(0, atomMask - showerMask);
|
|
atomMask *= streakMask;
|
|
atomMask *= sqrt(1 - fadeProgress * fadeProgress);
|
|
|
|
// Make some particles visible in the streaks.
|
|
showerMask += 0.05 * streakMask;
|
|
|
|
// Add shower mask to streak mask.
|
|
streakMask = max(streakMask, showerMask);
|
|
|
|
// Fade-out the masks at the window edges.
|
|
float edgeFade = getAbsoluteEdgeMask(EDGE_FADE);
|
|
streakMask *= edgeFade;
|
|
showerMask *= edgeFade;
|
|
|
|
// Fade-out the masks from top to bottom.
|
|
float fade = smoothstep(0.0, 1.0, 1.0 + t - 2.0 * streakProgress);
|
|
streakMask *= fade;
|
|
showerMask *= fade;
|
|
|
|
// Compute fading window opacity.
|
|
float windowMask = pow(1.0 - fadeProgress, 2.0);
|
|
|
|
if (uForOpening) {
|
|
windowMask = 1.0 - windowMask;
|
|
}
|
|
|
|
return vec4(showerMask, streakMask, atomMask, windowMask);
|
|
} |