diff --git a/effects/CMakeLists.txt b/effects/CMakeLists.txt index e316d621d2..7985c4adae 100644 --- a/effects/CMakeLists.txt +++ b/effects/CMakeLists.txt @@ -91,6 +91,7 @@ endif( NOT KWIN_HAVE_OPENGLES_COMPOSITING ) if( KWIN_HAVE_OPENGL_COMPOSITING ) include( coverswitch/CMakeLists.txt ) include( cube/CMakeLists.txt ) + include( explosion/CMakeLists.txt ) include( flipswitch/CMakeLists.txt ) include( glide/CMakeLists.txt ) include( invert/CMakeLists.txt ) @@ -106,7 +107,6 @@ if( KWIN_HAVE_OPENGL_COMPOSITING ) endif( KWIN_HAVE_OPENGL_COMPOSITING ) if( KWIN_HAVE_OPENGL_COMPOSITING AND NOT KWIN_HAVE_OPENGLES_COMPOSITING ) include( blur/CMakeLists.txt ) - include( explosion/CMakeLists.txt ) include( sharpen/CMakeLists.txt ) include( snow/CMakeLists.txt ) endif( KWIN_HAVE_OPENGL_COMPOSITING AND NOT KWIN_HAVE_OPENGLES_COMPOSITING ) diff --git a/effects/explosion/CMakeLists.txt b/effects/explosion/CMakeLists.txt index ba83e60d79..0dce41f899 100644 --- a/effects/explosion/CMakeLists.txt +++ b/effects/explosion/CMakeLists.txt @@ -16,5 +16,4 @@ install( FILES explosion/data/explosion-end.png explosion/data/explosion-start.png explosion/data/explosion.frag - explosion/data/explosion.vert DESTINATION ${DATA_INSTALL_DIR}/kwin ) diff --git a/effects/explosion/data/explosion.frag b/effects/explosion/data/explosion.frag index 9a669d168d..f58caefb8d 100644 --- a/effects/explosion/data/explosion.frag +++ b/effects/explosion/data/explosion.frag @@ -1,21 +1,29 @@ -uniform sampler2D winTexture; +uniform sampler2D sample; uniform sampler2D startOffsetTexture; uniform sampler2D endOffsetTexture; uniform float factor; uniform float scale; +uniform float textureWidth; +uniform float textureHeight; 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 vec2( pix.s / textureWidth, pix.t / textureHeight ); +} + void main() { // Original (unscaled) position in pixels - vec2 origpos = gl_TexCoord[0].xy; + vec2 origpos = varyingTexCoords; // Position in pixels on the scaled window vec2 pos = origpos * scale; // Start/end position of current region @@ -24,12 +32,14 @@ void main() 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 const_1 = vec2(1.0); // Needed to work around a bug in the GLSL compiler in mesa 7.9 - vec4 transformedtexcoord = vec4(rstart + dist, const_1) * gl_TextureMatrix[0]; - vec3 tex = texture2D(winTexture, transformedtexcoord.xy).rgb; + vec2 transformedtexcoord = pix2tex(rstart + dist); + vec3 tex = texture2D(sample, 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 diff --git a/effects/explosion/data/explosion.vert b/effects/explosion/data/explosion.vert deleted file mode 100644 index f1bef4e5ed..0000000000 --- a/effects/explosion/data/explosion.vert +++ /dev/null @@ -1,5 +0,0 @@ -void main() -{ - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = ftransform(); -} diff --git a/effects/explosion/explosion.cpp b/effects/explosion/explosion.cpp index 8206fd12c2..90cddb0a67 100644 --- a/effects/explosion/explosion.cpp +++ b/effects/explosion/explosion.cpp @@ -22,6 +22,7 @@ along with this program. If not, see . #include +#include #include #include @@ -63,22 +64,16 @@ bool ExplosionEffect::loadData() { mInited = true; QString shadername("explosion"); - QString fragmentshader = KGlobal::dirs()->findResource("data", "kwin/explosion.frag"); - QString vertexshader = KGlobal::dirs()->findResource("data", "kwin/explosion.vert"); + const QString fragmentshader = KGlobal::dirs()->findResource("data", "kwin/explosion.frag"); QString starttexture = KGlobal::dirs()->findResource("data", "kwin/explosion-start.png"); QString endtexture = KGlobal::dirs()->findResource("data", "kwin/explosion-end.png"); - if(fragmentshader.isEmpty() || vertexshader.isEmpty()) - { - kError(1212) << "Couldn't locate shader files" << endl; - return false; - } if(starttexture.isEmpty() || endtexture.isEmpty()) { kError(1212) << "Couldn't locate texture files" << endl; return false; } - mShader = new GLShader(vertexshader, fragmentshader); + mShader = ShaderManager::instance()->loadFragmentShader(ShaderManager::GenericShader, fragmentshader); if(!mShader->isValid()) { kError(1212) << "The shader failed to load!" << endl; @@ -86,11 +81,10 @@ bool ExplosionEffect::loadData() } else { - mShader->bind(); - mShader->setUniform("winTexture", 0); + ShaderManager::instance()->pushShader(mShader); mShader->setUniform("startOffsetTexture", 4); mShader->setUniform("endOffsetTexture", 5); - mShader->unbind(); + ShaderManager::instance()->popShader(); } mStartOffsetTex = new GLTexture(starttexture); @@ -160,7 +154,12 @@ void ExplosionEffect::paintWindow( EffectWindow* w, int mask, QRegion region, Wi data.xTranslate += int( w->width() / 2 * ( 1 - scale )); data.yTranslate += int( w->height() / 2 * ( 1 - scale )); data.opacity *= 0.99; // Force blending - mShader->bind(); + ShaderManager *manager = ShaderManager::instance(); + GLShader *shader = manager->pushShader(ShaderManager::GenericShader); + QMatrix4x4 screenTransformation = shader->getUniformMatrix4x4("screenTransformation"); + manager->popShader(); + ShaderManager::instance()->pushShader(mShader); + mShader->setUniform("screenTransformation", screenTransformation); mShader->setUniform("factor", (float)mWindows[w]); mShader->setUniform("scale", (float)scale); glActiveTexture(GL_TEXTURE4); @@ -176,7 +175,7 @@ void ExplosionEffect::paintWindow( EffectWindow* w, int mask, QRegion region, Wi if( useshader ) { - mShader->unbind(); + ShaderManager::instance()->popShader(); glActiveTexture(GL_TEXTURE4); mStartOffsetTex->unbind(); glActiveTexture(GL_TEXTURE5);