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 )