diff --git a/effects/CMakeLists.txt b/effects/CMakeLists.txt index 1fc50ff282..a0e3ba88f9 100644 --- a/effects/CMakeLists.txt +++ b/effects/CMakeLists.txt @@ -90,6 +90,7 @@ endif( NOT KWIN_HAVE_OPENGLES_COMPOSITING ) # OpenGL-specific effects if( KWIN_HAVE_OPENGL_COMPOSITING ) include( coverswitch/CMakeLists.txt ) + include( cube/CMakeLists.txt ) include( flipswitch/CMakeLists.txt ) include( glide/CMakeLists.txt ) include( mousemark/CMakeLists.txt ) @@ -100,7 +101,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( cube/CMakeLists.txt ) include( explosion/CMakeLists.txt ) include( invert/CMakeLists.txt ) include( lookingglass/CMakeLists.txt ) diff --git a/effects/configs_builtins.cpp b/effects/configs_builtins.cpp index 548654b483..f5aa69f3a3 100644 --- a/effects/configs_builtins.cpp +++ b/effects/configs_builtins.cpp @@ -39,11 +39,11 @@ along with this program. If not, see . #endif #ifdef KWIN_HAVE_OPENGL_COMPOSITING +#include "cube/cube_config.h" +#include "cube/cubeslide_config.h" #ifndef KWIN_HAVE_OPENGLES #include "blur/blur_config.h" #include "coverswitch/coverswitch_config.h" -#include "cube/cube_config.h" -#include "cube/cubeslide_config.h" #include "flipswitch/flipswitch_config.h" #include "glide/glide_config.h" #include "invert/invert_config.h" @@ -81,11 +81,11 @@ KWIN_EFFECT_CONFIG_MULTIPLE( builtins, #endif #ifdef KWIN_HAVE_OPENGL_COMPOSITING + KWIN_EFFECT_CONFIG_SINGLE( cube, CubeEffectConfig ) + KWIN_EFFECT_CONFIG_SINGLE( cubeslide, CubeSlideEffectConfig ) #ifndef KWIN_HAVE_OPENGLES KWIN_EFFECT_CONFIG_SINGLE( blur, BlurEffectConfig ) KWIN_EFFECT_CONFIG_SINGLE( coverswitch, CoverSwitchEffectConfig ) - KWIN_EFFECT_CONFIG_SINGLE( cube, CubeEffectConfig ) - KWIN_EFFECT_CONFIG_SINGLE( cubeslide, CubeSlideEffectConfig ) KWIN_EFFECT_CONFIG_SINGLE( flipswitch, FlipSwitchEffectConfig ) KWIN_EFFECT_CONFIG_SINGLE( glide, GlideEffectConfig ) KWIN_EFFECT_CONFIG_SINGLE( invert, InvertEffectConfig ) diff --git a/effects/cube/cube.cpp b/effects/cube/cube.cpp index f4a00bc60c..6bf27edc94 100644 --- a/effects/cube/cube.cpp +++ b/effects/cube/cube.cpp @@ -37,7 +37,7 @@ along with this program. If not, see . #include -#include +#include namespace KWin { @@ -195,7 +195,9 @@ void CubeEffect::loadConfig( QString config ) { capTexture = new GLTexture( img ); capTexture->setFilter( GL_LINEAR ); +#ifndef KWIN_HAVE_OPENGLES capTexture->setWrapMode( GL_CLAMP_TO_BORDER ); +#endif } } @@ -325,21 +327,27 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) if( recompileList ) { recompileList = false; +#ifdef KWIN_HAVE_OPENGLES + rotateCube(); +#else glPushMatrix(); glNewList( glList, GL_COMPILE ); rotateCube(); glEndList(); glPopMatrix(); +#endif } // compile List for cube if( useList ) { +#ifndef KWIN_HAVE_OPENGLES glNewList( glList + 1, GL_COMPILE ); glPushMatrix(); paintCube( mask, region, data ); glPopMatrix(); glEndList(); +#endif } QRect rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop() ); @@ -359,7 +367,9 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) wallpaper->unbind(); } +#ifndef KWIN_HAVE_OPENGLES glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT ); +#endif glEnable( GL_BLEND ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); @@ -376,28 +386,48 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) { // restrict painting the reflections to the current screen PaintClipper::push( QRegion( rect )); +#ifndef KWIN_HAVE_OPENGLES glPushMatrix(); +#endif // we can use a huge scale factor (needed to calculate the rearground vertices) // as we restrict with a PaintClipper painting on the current screen float scaleFactor = 1000000 * tan( 60.0 * M_PI / 360.0f )/rect.height(); + m_reflectionMatrix.setToIdentity(); + m_reflectionMatrix.scale(1.0, -1.0, 1.0); +#ifndef KWIN_HAVE_OPENGLES glScalef( 1.0, -1.0, 1.0 ); +#endif // TODO reflection is not correct when mixing manual (mouse) rotating with rotation by cursor keys // there's also a small bug when zooming float addedHeight1 = -sin( asin( float( rect.height() ) / mAddedHeightCoeff1 ) + fabs( manualVerticalAngle ) * M_PI / 180.0f ) * mAddedHeightCoeff1; float addedHeight2 = -sin( asin( float( rect.height() ) / mAddedHeightCoeff2 ) + fabs( manualVerticalAngle ) * M_PI / 180.0f ) * mAddedHeightCoeff2 - addedHeight1; if( manualVerticalAngle > 0.0f && effects->numberOfDesktops() & 1 ) + { + m_reflectionMatrix.translate(0.0, cos( fabs( manualAngle ) * M_PI / 360.0f * float( effects->numberOfDesktops() ) ) * addedHeight2 + addedHeight1 - float( rect.height() ), 0.0); +#ifndef KWIN_HAVE_OPENGLES glTranslatef( 0.0, cos( fabs( manualAngle ) * M_PI / 360.0f * float( effects->numberOfDesktops() ) ) * addedHeight2 + addedHeight1 - float( rect.height() ), 0.0 ); +#endif + } else + { + m_reflectionMatrix.translate(0.0, sin( fabs( manualAngle ) * M_PI / 360.0f * float( effects->numberOfDesktops() ) ) * addedHeight2 + addedHeight1 - float( rect.height() ), 0.0); +#ifndef KWIN_HAVE_OPENGLES glTranslatef( 0.0, sin( fabs( manualAngle ) * M_PI / 360.0f * float( effects->numberOfDesktops() ) ) * addedHeight2 + addedHeight1 - float( rect.height() ), 0.0 ); +#endif + } +#ifndef KWIN_HAVE_OPENGLES + // TODO: find a solution for GLES glEnable( GL_CLIP_PLANE0 ); +#endif reflectionPainting = true; glEnable( GL_CULL_FACE ); // caps if( paintCaps && ( effects->numberOfDesktops() >= 2 ) ) { +#ifndef KWIN_HAVE_OPENGLES glPushMatrix(); glCallList( glList ); glTranslatef( rect.width()/2, 0.0, -point-zTranslate ); @@ -423,16 +453,20 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) glCullFace( GL_BACK ); glCallList( glList + 2 ); glPopMatrix(); +#endif } // cube - glCullFace( GL_FRONT ); + glCullFace( GL_BACK ); if( mode == Cylinder ) { cylinderShader->bind(); cylinderShader->setUniform( "front", 1.0f ); cylinderShader->unbind(); } +#ifdef KWIN_HAVE_OPENGLES + paintCube( mask, region, data ); +#else glPushMatrix(); glCallList( glList ); if( useList ) @@ -444,25 +478,31 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) glPopMatrix(); } glPopMatrix(); +#endif // call the inside cube effects foreach( CubeInsideEffect* inside, m_cubeInsideEffects ) { +#ifndef KWIN_HAVE_OPENGLES glPushMatrix(); glCallList( glList ); glTranslatef( rect.width()/2, rect.height()/2, -point-zTranslate ); glRotatef( (1-frontDesktop)*360.0f / effects->numberOfDesktops(), 0.0, 1.0, 0.0 ); inside->paint(); glPopMatrix(); +#endif } - glCullFace( GL_BACK ); + glCullFace( GL_FRONT ); if( mode == Cylinder ) { cylinderShader->bind(); cylinderShader->setUniform( "front", -1.0f ); cylinderShader->unbind(); } +#ifdef KWIN_HAVE_OPENGLES + paintCube( mask, region, data ); +#else glPushMatrix(); glCallList( glList ); if( useList ) @@ -474,10 +514,12 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) glPopMatrix(); } glPopMatrix(); +#endif // cap if( paintCaps && ( effects->numberOfDesktops() >= 2 ) ) { +#ifndef KWIN_HAVE_OPENGLES glPushMatrix(); glCallList( glList ); glTranslatef( rect.width()/2, 0.0, -point-zTranslate ); @@ -502,11 +544,16 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) glCullFace( GL_FRONT ); glCallList( glList + 2 ); glPopMatrix(); +#endif } glDisable( GL_CULL_FACE ); reflectionPainting = false; +#ifndef KWIN_HAVE_OPENGLES + // TODO: find a solution for GLES glDisable( GL_CLIP_PLANE0 ); +#endif +#ifndef KWIN_HAVE_OPENGLES glPopMatrix(); glPushMatrix(); glTranslatef( rect.x() + rect.width()*0.5f, 0.0, 0.0 ); @@ -532,12 +579,14 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) glVertex3f( vertices[9], vertices[10], vertices[11] ); glEnd(); glPopMatrix(); +#endif PaintClipper::pop( QRegion( rect )); } glEnable( GL_CULL_FACE ); // caps if( paintCaps && ( effects->numberOfDesktops() >= 2 )) { +#ifndef KWIN_HAVE_OPENGLES glPushMatrix(); glCallList( glList ); glTranslatef( rect.width()/2, 0.0, -point-zTranslate ); @@ -569,10 +618,11 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) glCullFace( GL_FRONT ); glCallList( glList + 2 ); glPopMatrix(); +#endif } // cube - glCullFace( GL_BACK ); + glCullFace( GL_FRONT ); if( mode == Cylinder ) { cylinderShader->bind(); @@ -585,6 +635,9 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) sphereShader->setUniform( "front", -1.0f ); sphereShader->unbind(); } +#ifdef KWIN_HAVE_OPENGLES + paintCube( mask, region, data ); +#else glPushMatrix(); glCallList( glList ); if( useList ) @@ -596,20 +649,23 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) glPopMatrix(); } glPopMatrix(); +#endif // call the inside cube effects foreach( CubeInsideEffect* inside, m_cubeInsideEffects ) { +#ifndef KWIN_HAVE_OPENGLES glPushMatrix(); glCallList( glList ); glTranslatef( rect.width()/2, rect.height()/2, -point-zTranslate ); glRotatef( (1-frontDesktop)*360.0f / effects->numberOfDesktops(), 0.0, 1.0, 0.0 ); inside->paint(); glPopMatrix(); +#endif } - glCullFace( GL_FRONT ); + glCullFace( GL_BACK ); if( mode == Cylinder ) { cylinderShader->bind(); @@ -622,6 +678,9 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) sphereShader->setUniform( "front", 1.0f ); sphereShader->unbind(); } +#ifdef KWIN_HAVE_OPENGLES + paintCube( mask, region, data ); +#else glPushMatrix(); glCallList( glList ); if( useList ) @@ -635,10 +694,12 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) glPopMatrix(); // we painted once without glList, now it's safe to paint using lists useList = true; +#endif // cap if( paintCaps && ( effects->numberOfDesktops() >= 2 )) { +#ifndef KWIN_HAVE_OPENGLES glPushMatrix(); glCallList( glList ); glTranslatef( rect.width()/2, 0.0, -point-zTranslate ); @@ -671,11 +732,14 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data ) glCullFace( GL_BACK ); glCallList( glList + 2 ); glPopMatrix(); +#endif } glDisable( GL_CULL_FACE ); glDisable( GL_BLEND ); +#ifndef KWIN_HAVE_OPENGLES glPopAttrib(); +#endif // desktop name box - inspired from coverswitch if( displayDesktopName ) @@ -703,6 +767,7 @@ void CubeEffect::rotateCube() { QRect rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop() ); + m_rotationMatrix.setToIdentity(); float internalCubeAngle = 360.0f / effects->numberOfDesktops(); float zTranslate = zPosition + zoom; if( start ) @@ -769,9 +834,14 @@ void CubeEffect::rotateCube() } if( stop ) angle *= (1.0 - timeLine.value()); + m_rotationMatrix.translate(rect.width()/2, rect.height()/2, -point-zTranslate); + m_rotationMatrix.rotate(angle, 1.0, 0.0, 0.0); + m_rotationMatrix.translate(-rect.width()/2, -rect.height()/2, point+zTranslate); +#ifndef KWIN_HAVE_OPENGLES glTranslatef( rect.width()/2, rect.height()/2, -point-zTranslate ); glRotatef( angle, 1.0, 0.0, 0.0 ); glTranslatef( -rect.width()/2, -rect.height()/2, point+zTranslate ); +#endif } if( rotating || (manualAngle != 0.0) ) { @@ -822,9 +892,14 @@ void CubeEffect::rotateCube() rotationAngle = manualAngle * (1.0 - timeLine.value()); else rotationAngle += manualAngle * (1.0 - timeLine.value()); + m_rotationMatrix.translate(rect.width()/2, rect.height()/2, -point-zTranslate); + m_rotationMatrix.rotate(rotationAngle, 0.0, 1.0, 0.0); + m_rotationMatrix.translate(-rect.width()/2, -rect.height()/2, point+zTranslate); +#ifndef KWIN_HAVE_OPENGLES glTranslatef( rect.width()/2, rect.height()/2, -point-zTranslate ); glRotatef( rotationAngle, 0.0, 1.0, 0.0 ); glTranslatef( -rect.width()/2, -rect.height()/2, point+zTranslate ); +#endif } } @@ -867,6 +942,7 @@ void CubeEffect::paintCube( int mask, QRegion region, ScreenPaintData& data ) void CubeEffect::paintCap() { +#ifndef KWIN_HAVE_OPENGLES if( ( !paintCaps ) || effects->numberOfDesktops() <= 2 ) return; @@ -927,10 +1003,12 @@ void CubeEffect::paintCap() } glEndList(); } +#endif } void CubeEffect::paintCubeCap() { +#ifndef KWIN_HAVE_OPENGLES QRect rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop() ); float cubeAngle = (float)((float)(effects->numberOfDesktops() - 2 )/(float)effects->numberOfDesktops() * 180.0f); float z = rect.width()/2*tan(cubeAngle*0.5f*M_PI/180.0f); @@ -1035,10 +1113,12 @@ void CubeEffect::paintCubeCap() } glEnd(); } +#endif } void CubeEffect::paintCylinderCap() { +#ifndef KWIN_HAVE_OPENGLES QRect rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop() ); float cubeAngle = (float)((float)(effects->numberOfDesktops() - 2 )/(float)effects->numberOfDesktops() * 180.0f); @@ -1067,10 +1147,12 @@ void CubeEffect::paintCylinderCap() } glEnd(); } +#endif } void CubeEffect::paintSphereCap() { +#ifndef KWIN_HAVE_OPENGLES QRect rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop() ); float cubeAngle = (float)((float)(effects->numberOfDesktops() - 2 )/(float)effects->numberOfDesktops() * 180.0f); float zTexture = rect.width()/2*tan(45.0f*M_PI/180.0f); @@ -1115,6 +1197,7 @@ void CubeEffect::paintSphereCap() } glEnd(); glPopMatrix(); +#endif } void CubeEffect::postPaintScreen() @@ -1178,8 +1261,10 @@ void CubeEffect::postPaintScreen() effects->setActiveFullScreenEffect( 0 ); +#ifndef KWIN_HAVE_OPENGLES // delete the GL lists glDeleteLists( glList, 3 ); +#endif desktopNameFrame->free(); } effects->addRepaintFull(); @@ -1320,7 +1405,7 @@ void CubeEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int int prev_desktop = painting_desktop -1; if( prev_desktop == 0 ) prev_desktop = effects->numberOfDesktops(); - if( w->isOnDesktop( prev_desktop ) && mode == Cube ) + if( w->isOnDesktop( prev_desktop ) && mode == Cube && !useZOrdering ) { QRect rect = effects->clientArea( FullArea, activeScreen, prev_desktop); if( w->x()+w->width() > rect.x() + rect.width() ) @@ -1344,7 +1429,7 @@ void CubeEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int int next_desktop = painting_desktop +1; if( next_desktop > effects->numberOfDesktops() ) next_desktop = 1; - if( w->isOnDesktop( next_desktop ) && mode == Cube ) + if( w->isOnDesktop( next_desktop ) && mode == Cube && !useZOrdering ) { QRect rect = effects->clientArea( FullArea, activeScreen, next_desktop); if( w->x() < rect.x() ) @@ -1373,6 +1458,8 @@ void CubeEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int void CubeEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data ) { + GLShader *shader = ShaderManager::instance()->pushShader(ShaderManager::GenericShader); + QMatrix4x4 origMatrix; if( activated && cube_painting ) { if( mode == Cylinder ) @@ -1454,7 +1541,9 @@ void CubeEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowP int next_desktop = painting_desktop +1; if( next_desktop > effects->numberOfDesktops() ) next_desktop = 1; +#ifndef KWIN_HAVE_OPENGLES glPushMatrix(); +#endif if( w->isOnDesktop( prev_desktop ) && ( mask & PAINT_WINDOW_TRANSFORMED ) ) { QRect rect = effects->clientArea( FullArea, activeScreen, prev_desktop); @@ -1467,6 +1556,9 @@ void CubeEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowP } } data.quads = new_quads; +#ifdef KWIN_HAVE_OPENGLES + data.xTranslate = -rect.width(); +#else RotationData rot = RotationData(); rot.axis = RotationData::YAxis; rot.xRotationPoint = rect.width() - w->x(); @@ -1477,6 +1569,7 @@ void CubeEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowP glTranslatef( rect.width()/2, 0.0, -point ); glRotatef( -360.0f / effects->numberOfDesktops(), 0.0, 1.0, 0.0 ); glTranslatef( -rect.width()/2, 0.0, point ); +#endif } if( w->isOnDesktop( next_desktop ) && ( mask & PAINT_WINDOW_TRANSFORMED ) ) { @@ -1490,6 +1583,9 @@ void CubeEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowP } } data.quads = new_quads; +#ifdef KWIN_HAVE_OPENGLES + data.xTranslate = rect.width(); +#else RotationData rot = RotationData(); rot.axis = RotationData::YAxis; rot.xRotationPoint = -w->x(); @@ -1500,6 +1596,7 @@ void CubeEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowP glTranslatef( rect.width()/2, 0.0, -point ); glRotatef( 360.0f / effects->numberOfDesktops(), 0.0, 1.0, 0.0 ); glTranslatef( -rect.width()/2, 0.0, point ); +#endif } QRect rect = effects->clientArea( FullArea, activeScreen, painting_desktop ); @@ -1577,10 +1674,22 @@ void CubeEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowP } data.quads = new_quads; } + if (shader) { + origMatrix = shader->getUniformMatrix4x4("screenTransformation"); + if (reflectionPainting) { + shader->setUniform("screenTransformation", m_rotationMatrix*m_reflectionMatrix*origMatrix); + } else { + shader->setUniform("screenTransformation", m_rotationMatrix*origMatrix); + } + } } effects->paintWindow( w, mask, region, data ); if( activated && cube_painting ) { + if (shader) { + shader->setUniform("screenTransformation", origMatrix); + ShaderManager::instance()->popShader(); + } if( w->isDesktop() && effects->numScreens() > 1 && paintCaps ) { QRect rect = effects->clientArea( FullArea, activeScreen, painting_desktop ); @@ -1593,6 +1702,7 @@ void CubeEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowP } paint = paint.subtracted( QRegion( w->geometry())); // in case of free area in multiscreen setup fill it with cap color +#ifndef KWIN_HAVE_OPENGLES if( !paint.isEmpty() ) { if( mode == Cylinder ) @@ -1644,8 +1754,11 @@ void CubeEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowP glDisable( GL_BLEND ); glPopAttrib(); } +#endif } +#ifndef KWIN_HAVE_OPENGLES glPopMatrix(); +#endif if( mode == Cylinder ) cylinderShader->unbind(); if( mode == Sphere ) @@ -2044,19 +2157,23 @@ void CubeEffect::setActive( bool active ) manualVerticalAngle = 0.0; if( reflection ) { + QRect rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop()); +#ifndef KWIN_HAVE_OPENGLES // clip parts above the reflection area double eqn[4] = {0.0, 1.0, 0.0, 0.0}; glPushMatrix(); - QRect rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop()); glTranslatef( 0.0, rect.height(), 0.0 ); glClipPlane( GL_CLIP_PLANE0, eqn ); glPopMatrix(); +#endif float temporaryCoeff = float( rect.width() ) / tan( M_PI / float( effects->numberOfDesktops() ) ); mAddedHeightCoeff1 = sqrt( float( rect.height() ) * float( rect.height() ) + temporaryCoeff * temporaryCoeff ); mAddedHeightCoeff2 = sqrt( float( rect.height() ) * float( rect.height() ) + float( rect.width() ) * float( rect.width() ) + temporaryCoeff * temporaryCoeff ); } +#ifndef KWIN_HAVE_OPENGLES // create the needed GL lists glList = glGenLists(3); +#endif capListCreated = false; recompileList = true; useList = false; diff --git a/effects/cube/cube.h b/effects/cube/cube.h index f31085970e..a9d97e0039 100644 --- a/effects/cube/cube.h +++ b/effects/cube/cube.h @@ -26,6 +26,7 @@ along with this program. If not, see . #include #include #include +#include #include "cube_inside.h" #include "cube_proxy.h" @@ -167,6 +168,8 @@ class CubeEffect bool capListCreated; bool recompileList; GLuint glList; + QMatrix4x4 m_rotationMatrix; + QMatrix4x4 m_reflectionMatrix; // Shortcuts - needed to toggle the effect KShortcut cubeShortcut; diff --git a/effects/cube/cubeslide.cpp b/effects/cube/cubeslide.cpp index 44da3759b3..ba1603cddb 100644 --- a/effects/cube/cubeslide.cpp +++ b/effects/cube/cubeslide.cpp @@ -25,7 +25,7 @@ along with this program. If not, see . #include -#include +#include namespace KWin { @@ -81,18 +81,27 @@ void CubeSlideEffect::paintScreen( int mask, QRegion region, ScreenPaintData& da { if( !slideRotations.empty() ) { +#ifdef KWIN_HAVE_OPENGLES + glEnable( GL_CULL_FACE ); + glCullFace( GL_FRONT ); + paintSlideCube( mask, region, data ); + glCullFace( GL_BACK ); + paintSlideCube( mask, region, data ); + glDisable( GL_CULL_FACE ); +#else glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT ); glEnable( GL_CULL_FACE ); - glCullFace( GL_BACK ); + glCullFace( GL_FRONT ); glPushMatrix(); paintSlideCube( mask, region, data ); glPopMatrix(); - glCullFace( GL_FRONT ); + glCullFace( GL_BACK ); glPushMatrix(); paintSlideCube( mask, region, data ); glPopMatrix(); glDisable( GL_CULL_FACE ); glPopAttrib(); +#endif if( dontSlidePanels ) { foreach( EffectWindow* w, panels )