You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.7 KiB
53 lines
1.7 KiB
uniform sampler2D sampler; |
|
uniform sampler2D startOffsetTexture; |
|
uniform sampler2D endOffsetTexture; |
|
uniform float factor; |
|
uniform float scale; |
|
uniform vec2 windowSize; |
|
|
|
const float regionTexSize = 512.0; |
|
|
|
varying vec2 varyingTexCoords; |
|
|
|
vec2 getOffset(sampler2D texture, vec2 pos) |
|
{ |
|
return (texture2D(texture, pos / regionTexSize).xy - 0.5) / (5.0 / 256.0); |
|
} |
|
|
|
vec2 pix2tex( vec2 pix ) |
|
{ |
|
return pix/windowSize; |
|
} |
|
|
|
void main() |
|
{ |
|
// Original (unscaled) position in pixels |
|
// ### FIXME: Use a custom vertex shader that outputs the untransformed texcoords |
|
vec2 origpos = varyingTexCoords * windowSize; |
|
// 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 0 |
|
// crashes kwin on nouveau |
|
if(any(greaterThan(dist, rend-rstart))) |
|
discard;//alpha = 0.0; |
|
#endif |
|
|
|
vec2 transformedtexcoord = pix2tex(rstart + dist); |
|
vec3 tex = texture2D(sampler, transformedtexcoord).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 |
|
} |
|
|
|
|