kwin/effects/data/explosion.frag
Rivo Laks aae967c5f9 Make your windows explode!
Add ExplosionEffect which makes the windows blow up into small pieces when they're closed.
  In the future this could be used only when user kills (an unresponsive) window.

svn path=/branches/work/kwin_composite/; revision=643135
2007-03-16 13:02:47 +00:00

42 lines
1.4 KiB
GLSL

uniform sampler2D winTexture;
uniform sampler2D startOffsetTexture;
uniform sampler2D endOffsetTexture;
uniform float factor;
uniform float scale;
const float regionTexSize = 512.0;
vec2 getOffset(sampler2D texture, vec2 pos)
{
return (texture2D(texture, pos / regionTexSize).xy - 0.5) / (5.0 / 256.0);
}
void main()
{
// Original (unscaled) position in pixels
vec2 origpos = gl_TexCoord[0].xy;
// Position in pixels on the scaled window
vec2 pos = origpos * scale;
// Start/end position of current region
vec2 rstart = origpos + getOffset(startOffsetTexture, origpos);
vec2 rend = origpos + getOffset(endOffsetTexture, origpos);
float alpha = texture2D(startOffsetTexture, origpos / regionTexSize).b;
// Distance from the start of the region
vec2 dist = pos - rstart*scale;
if(any(greaterThan(dist, rend-rstart)))
discard;//alpha = 0.0;
vec4 transformedtexcoord = vec4(rstart + dist, vec2(1.0)) * gl_TextureMatrix[0];
vec3 tex = texture2D(winTexture, transformedtexcoord.xy).rgb;
#if 0
// ATM we ignore custom opacity values because Fade effect fades out the
// window which results in the explosion being way too quick. Once there's
// a way to suppress Fade effect when ExplosionEffect is active, we can
// use the custom opacity again
gl_FragColor = vec4(tex, (1.0 - factor*factor) * alpha * opacity);
#else
gl_FragColor = vec4(tex, (1.0 - factor*factor) * alpha);
#endif
}