Merge in the first changes from cube git branch (http://github.com/mgraesslin/kwin/tree/cube):

* Code restructuring and clean-up
 * Use of glLists to store the rotation and painting of the cube. That way things are only calculated when something changed. Painting the cube is still required in each frame as it would break all other effects.
 * Use face culling to paint the cube in the correct sequence.
 * Move loading of all settings to cube effect. In preparation of getting rid of cylinder and sphere classes

Known regression: cylinder and sphere caps are partly broken.

BUG: 171235

svn path=/trunk/KDE/kdebase/workspace/; revision=922023
This commit is contained in:
Martin Gräßlin 2009-02-06 09:16:30 +00:00
parent 846496d2c1
commit a16aba4b05
5 changed files with 190 additions and 175 deletions

View file

@ -81,7 +81,8 @@ CubeEffect::CubeEffect()
, useForTabBox( false )
, tabBoxMode( false )
, capListCreated( false )
, capList( 0 )
, recompileList( true )
, glList( 0 )
{
reconfigure( ReconfigureAll );
@ -116,12 +117,29 @@ void CubeEffect::loadConfig( QString config )
backgroundColor = conf.readEntry( "BackgroundColor", QColor( Qt::black ) );
animateDesktopChange = conf.readEntry( "AnimateDesktopChange", false );
bigCube = conf.readEntry( "BigCube", false );
// different settings for cylinder and sphere
if( config == "Cylinder" )
{
animateDesktopChange = false;
bigCube = true;
}
if( config == "Sphere" )
{
animateDesktopChange = false;
bigCube = true;
reflection = false;
}
capColor = conf.readEntry( "CapColor", KColorScheme( QPalette::Active, KColorScheme::Window ).background().color() );
paintCaps = conf.readEntry( "Caps", true );
closeOnMouseRelease = conf.readEntry( "CloseOnMouseRelease", false );
zPosition = conf.readEntry( "ZPosition", 100.0 );
float defaultZPosition = 100.0f;
if( config == "Sphere" )
defaultZPosition = 450.0f;
zPosition = conf.readEntry( "ZPosition", defaultZPosition );
useForTabBox = conf.readEntry( "TabBox", false );
QString file = conf.readEntry( "Wallpaper", QString("") );
if( wallpaper )
wallpaper->discard();
delete wallpaper;
wallpaper = NULL;
if( !file.isEmpty() )
@ -196,10 +214,12 @@ void CubeEffect::prePaintScreen( ScreenPrePaintData& data, int time )
if( rotating || start || stop )
{
timeLine.addTime( time );
recompileList = true;
}
if( verticalRotating )
{
verticalTimeLine.addTime( time );
recompileList = true;
}
}
effects->prePaintScreen( data, time );
@ -209,6 +229,23 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data )
{
if( activated )
{
if( recompileList )
{
recompileList = false;
glPushMatrix();
glNewList( glList, GL_COMPILE );
rotateCube();
glEndList();
glPopMatrix();
}
// compile List for cube
glNewList( glList + 1, GL_COMPILE );
glPushMatrix();
paintCube( mask, region, data );
glPopMatrix();
glEndList();
QRect rect = effects->clientArea( FullScreenArea, activeScreen, effects->currentDesktop());
if( effects->numScreens() > 1 && (slide || bigCube ) )
rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop() );
@ -288,6 +325,16 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data )
glTranslatef( xTranslate, yTranslate, 0.0 );
}
// some veriables needed for painting the caps
float cubeAngle = (float)((float)(effects->numberOfDesktops() - 2 )/(float)effects->numberOfDesktops() * 180.0f);
float point = rect.width()/2*tan(cubeAngle*0.5f*M_PI/180.0f);
float zTranslate = zPosition + zoom;
if( start )
zTranslate *= timeLine.value();
if( stop )
zTranslate *= ( 1.0 - timeLine.value() );
if( slide )
zTranslate = 0.0;
// reflection
if( reflection && (!slide) )
{
@ -302,7 +349,51 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data )
glEnable( GL_CLIP_PLANE0 );
reflectionPainting = true;
paintScene( mask, region, data );
glEnable( GL_CULL_FACE );
// caps
if( paintCaps && ( effects->numberOfDesktops() >= 2 ) )
{
glPushMatrix();
glCallList( glList );
glTranslatef( rect.width()/2, 0.0, -point-zTranslate );
glRotatef( (1-frontDesktop)*360.0f / effects->numberOfDesktops(), 0.0, 1.0, 0.0 );
glTranslatef( 0.0, rect.height(), 0.0 );
glCullFace( GL_FRONT );
glCallList( glList + 2 );
glTranslatef( 0.0, -rect.height(), 0.0 );
glCullFace( GL_BACK );
glCallList( glList + 2 );
glPopMatrix();
}
// cube
glCullFace( GL_FRONT );
glPushMatrix();
glCallList( glList );
glCallList( glList + 1 );
glPopMatrix();
glCullFace( GL_BACK );
glPushMatrix();
glCallList( glList );
glCallList( glList + 1 );
glPopMatrix();
// cap
if( paintCaps && ( effects->numberOfDesktops() >= 2 ) )
{
glPushMatrix();
glCallList( glList );
glTranslatef( rect.width()/2, 0.0, -point-zTranslate );
glRotatef( (1-frontDesktop)*360.0f / effects->numberOfDesktops(), 0.0, 1.0, 0.0 );
glTranslatef( 0.0, rect.height(), 0.0 );
glCullFace( GL_BACK );
glCallList( glList + 2 );
glTranslatef( 0.0, -rect.height(), 0.0 );
glCullFace( GL_FRONT );
glCallList( glList + 2 );
glPopMatrix();
}
glDisable( GL_CULL_FACE );
reflectionPainting = false;
glDisable( GL_CLIP_PLANE0 );
@ -338,9 +429,51 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data )
glPopMatrix();
PaintClipper::pop( QRegion( rect ));
}
glEnable( GL_CULL_FACE );
// caps
if( paintCaps && ( effects->numberOfDesktops() >= 2 ) && !slide )
{
glPushMatrix();
glCallList( glList );
glTranslatef( rect.width()/2, 0.0, -point-zTranslate );
glRotatef( (1-frontDesktop)*360.0f / effects->numberOfDesktops(), 0.0, 1.0, 0.0 );
glTranslatef( 0.0, rect.height(), 0.0 );
glCullFace( GL_BACK );
glCallList( glList + 2 );
glTranslatef( 0.0, -rect.height(), 0.0 );
glCullFace( GL_FRONT );
glCallList( glList + 2 );
glPopMatrix();
}
// cube
glCullFace( GL_BACK );
glPushMatrix();
paintScene( mask, region, data );
glCallList( glList );
glCallList( glList + 1 );
glPopMatrix();
glCullFace( GL_FRONT );
glPushMatrix();
glCallList( glList );
glCallList( glList + 1 );
glPopMatrix();
// cap
if( paintCaps && ( effects->numberOfDesktops() >= 2 ) && !slide )
{
glPushMatrix();
glCallList( glList );
glTranslatef( rect.width()/2, 0.0, -point-zTranslate );
glRotatef( (1-frontDesktop)*360.0f / effects->numberOfDesktops(), 0.0, 1.0, 0.0 );
glTranslatef( 0.0, rect.height(), 0.0 );
glCullFace( GL_FRONT );
glCallList( glList + 2 );
glTranslatef( 0.0, -rect.height(), 0.0 );
glCullFace( GL_BACK );
glCallList( glList + 2 );
glPopMatrix();
}
glDisable( GL_CULL_FACE );
if( effects->numScreens() > 1 && !slide && !bigCube )
{
@ -408,7 +541,7 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data )
}
}
void CubeEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
void CubeEffect::rotateCube()
{
QRect rect = effects->clientArea( FullScreenArea, activeScreen, effects->currentDesktop());
if( effects->numScreens() > 1 && (slide || bigCube ) )
@ -441,13 +574,8 @@ void CubeEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
glScalef( xScale, yScale, 1.0 );
rect = fullRect;
}
int rightSteps = effects->numberOfDesktops()/2;
int leftSteps = rightSteps+1;
int rightSideCounter = 0;
int leftSideCounter = 0;
float internalCubeAngle = 360.0f / effects->numberOfDesktops();
cube_painting = true;
int desktopIndex = 0;
float zTranslate = zPosition + zoom;
if( start )
zTranslate *= timeLine.value();
@ -455,14 +583,9 @@ void CubeEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
zTranslate *= ( 1.0 - timeLine.value() );
if( slide )
zTranslate = 0.0;
bool topCapAfter = false;
bool topCapBefore = false;
// Rotation of the cube
float cubeAngle = (float)((float)(effects->numberOfDesktops() - 2 )/(float)effects->numberOfDesktops() * 180.0f);
float point = rect.width()/2*tan(cubeAngle*0.5f*M_PI/180.0f);
float zTexture = rect.width()/2*tan(45.0f*M_PI/180.0f);
if( verticalRotating || verticalPosition != Normal || manualVerticalAngle != 0.0 )
{
// change the verticalPosition if manualVerticalAngle > 90 or < -90 degrees
@ -523,71 +646,6 @@ void CubeEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
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 );
// calculate if the caps have to be painted before/after or during desktop painting
if( paintCaps )
{
float M[16];
float P[16];
float V[4];
glGetFloatv( GL_PROJECTION_MATRIX, P );
glGetFloatv( GL_MODELVIEW_MATRIX, M );
glGetFloatv( GL_VIEWPORT, V );
// calculate y coordinate of the top of front desktop
float X = M[0]*0.0 + M[4]*0.0 + M[8]*(-zTranslate) + M[12]*1;
float Y = M[1]*0.0 + M[5]*0.0 + M[9]*(-zTranslate) + M[13]*1;
float Z = M[2]*0.0 + M[6]*0.0 + M[10]*(-zTranslate) + M[14]*1;
float W = M[3]*0.0 + M[7]*0.0 + M[11]*(-zTranslate) + M[15]*1;
float clipY = P[1]*X + P[5]*Y + P[9]*Z + P[13]*W;
float clipW = P[3]*X + P[7]*Y + P[11]*Z + P[15]*W;
float normY = clipY/clipW;
float yFront = (V[3]/2)*normY+(V[3]-V[1])/2;
// calculate y coordinate of the bottom of front desktop
X = M[0]*0.0 + M[4]*rect.height() + M[8]*(-zTranslate) + M[12]*1;
Y = M[1]*0.0 + M[5]*rect.height() + M[9]*(-zTranslate) + M[13]*1;
Z = M[2]*0.0 + M[6]*rect.height() + M[10]*(-zTranslate) + M[14]*1;
W = M[3]*0.0 + M[7]*rect.height() + M[11]*(-zTranslate) + M[15]*1;
clipY = P[1]*X + P[5]*Y + P[9]*Z + P[13]*W;
clipW = P[3]*X + P[7]*Y + P[11]*Z + P[15]*W;
normY = clipY/clipW;
float yFrontBottom = (V[3]/2)*normY+(V[3]-V[1])/2;
// change matrix to a rear position
glPushMatrix();
glTranslatef( 0.0, 0.0, -point-zTranslate );
float desktops = (effects->numberOfDesktops()/2.0);
glRotatef( desktops*internalCubeAngle, 1.0, 0.0, 0.0 );
glTranslatef( 0.0, 0.0, point );
glGetFloatv(GL_MODELVIEW_MATRIX, M);
// calculate y coordinate of the top of rear desktop
X = M[0]*0.0 + M[4]*0.0 + M[8]*0.0 + M[12]*1;
Y = M[1]*0.0 + M[5]*0.0 + M[9]*0.0 + M[13]*1;
Z = M[2]*0.0 + M[6]*0.0 + M[10]*0.0 + M[14]*1;
W = M[3]*0.0 + M[7]*0.0 + M[11]*0.0 + M[15]*1;
clipY = P[1]*X + P[5]*Y + P[9]*Z + P[13]*W;
clipW = P[3]*X + P[7]*Y + P[11]*Z + P[15]*W;
normY = clipY/clipW;
float yBack = (V[3]/2)*normY+(V[3]-V[1])/2;
// calculate y coordniate of the bottom of rear desktop
glTranslatef( 0.0, -rect.height(), 0.0 );
glGetFloatv(GL_MODELVIEW_MATRIX, M);
X = M[0]*0.0 + M[4]*0.0 + M[8]*0.0 + M[12]*1;
Y = M[1]*0.0 + M[5]*0.0 + M[9]*0.0 + M[13]*1;
Z = M[2]*0.0 + M[6]*0.0 + M[10]*0.0 + M[14]*1;
W = M[3]*0.0 + M[7]*0.0 + M[11]*0.0 + M[15]*1;
clipY = P[1]*X + P[5]*Y + P[9]*Z + P[13]*W;
clipW = P[3]*X + P[7]*Y + P[11]*Z + P[15]*W;
normY = clipY/clipW;
float yBackBottom = (V[3]/2)*normY+(V[3]-V[1])/2;
glPopMatrix();
if( yBack >= yFront )
topCapAfter = true;
if( yBackBottom <= yFrontBottom )
topCapBefore = true;
}
}
if( rotating || (manualAngle != 0.0) )
{
@ -642,53 +700,31 @@ void CubeEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
glRotatef( rotationAngle, 0.0, 1.0, 0.0 );
glTranslatef( -rect.width()/2, -rect.height()/2, point+zTranslate );
}
}
if( topCapBefore || topCapAfter )
{
if( (topCapAfter && !reflectionPainting) || (topCapBefore && reflectionPainting) )
{
// paint the bottom cap
bottomCap = true;
glTranslatef( 0.0, rect.height(), 0.0 );
paintCap( point, zTexture );
glTranslatef( 0.0, -rect.height(), 0.0 );
bottomCap = false;
}
if( (topCapBefore && !reflectionPainting) || (topCapAfter && reflectionPainting) )
{
// paint the top cap
paintCap( point, zTexture );
}
}
void CubeEffect::paintCube( int mask, QRegion region, ScreenPaintData& data )
{
QRect rect = effects->clientArea( FullScreenArea, activeScreen, effects->currentDesktop());
if( effects->numScreens() > 1 && (slide || bigCube ) )
rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop() );
float internalCubeAngle = 360.0f / effects->numberOfDesktops();
cube_painting = true;
float zTranslate = zPosition + zoom;
if( start )
zTranslate *= timeLine.value();
if( stop )
zTranslate *= ( 1.0 - timeLine.value() );
if( slide )
zTranslate = 0.0;
// Rotation of the cube
float cubeAngle = (float)((float)(effects->numberOfDesktops() - 2 )/(float)effects->numberOfDesktops() * 180.0f);
float point = rect.width()/2*tan(cubeAngle*0.5f*M_PI/180.0f);
for( int i=0; i<effects->numberOfDesktops(); i++ )
{
if( !topCapAfter && !topCapBefore && i == effects->numberOfDesktops()/2 -1 && !slide )
{
// paint the bottom cap
bottomCap = true;
glTranslatef( 0.0, rect.height(), 0.0 );
paintCap( point, zTexture );
glTranslatef( 0.0, -rect.height(), 0.0 );
bottomCap = false;
// paint the top cap
paintCap( point, zTexture );
}
if( i%2 == 0 && i != effects->numberOfDesktops() -1)
{
// desktops on the right (including back)
desktopIndex = rightSteps - rightSideCounter;
rightSideCounter++;
}
else
{
// desktops on the left (including front)
desktopIndex = leftSteps + leftSideCounter;
leftSideCounter++;
}
// start painting the cube
painting_desktop = (desktopIndex + frontDesktop )%effects->numberOfDesktops();
painting_desktop = (i + frontDesktop )%effects->numberOfDesktops();
if( painting_desktop == 0 )
{
painting_desktop = effects->numberOfDesktops();
@ -725,30 +761,13 @@ void CubeEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
ScreenPaintData newData = data;
RotationData rot = RotationData();
rot.axis = RotationData::YAxis;
rot.angle = internalCubeAngle * desktopIndex;
rot.angle = internalCubeAngle * i;
rot.xRotationPoint = rect.width()/2;
rot.zRotationPoint = -point;
newData.rotation = &rot;
newData.zTranslate = -zTranslate;
effects->paintScreen( mask, region, newData );
}
if( topCapBefore || topCapAfter )
{
if( (topCapAfter && !reflectionPainting) || (topCapBefore && reflectionPainting) )
{
// paint the top cap
paintCap( point, zTexture );
}
if( (topCapBefore && !reflectionPainting) || (topCapAfter && reflectionPainting) )
{
// paint the bottom cap
bottomCap = true;
glTranslatef( 0.0, rect.height(), 0.0 );
paintCap( point, zTexture );
glTranslatef( 0.0, -rect.height(), 0.0 );
bottomCap = false;
}
}
cube_painting = false;
painting_desktop = effects->currentDesktop();
}
@ -777,11 +796,9 @@ void CubeEffect::paintCap( float z, float zTexture )
if( !capListCreated )
{
capListCreated = true;
glNewList( capList, GL_COMPILE_AND_EXECUTE );
bool texture = false;
glNewList( glList + 2, GL_COMPILE );
if( texturedCaps && effects->numberOfDesktops() > 3 && capTexture )
{
texture = true;
paintCapStep( z, zTexture, true );
}
else
@ -789,7 +806,7 @@ void CubeEffect::paintCap( float z, float zTexture )
glEndList();
}
else
glCallList( capList );
glCallList( glList + 2 );
glPopMatrix();
}
@ -965,7 +982,7 @@ void CubeEffect::postPaintScreen()
effects->setActiveFullScreenEffect( 0 );
// delete the GL lists
glDeleteLists( capList, 1 );
glDeleteLists( glList, 3 );
}
effects->addRepaintFull();
}
@ -1328,7 +1345,7 @@ bool CubeEffect::borderActivated( ElectricBorder border )
void CubeEffect::toggle()
{
if( effects->activeFullScreenEffect() && effects->activeFullScreenEffect() != this ||
if( ( effects->activeFullScreenEffect() && effects->activeFullScreenEffect() != this ) ||
effects->numberOfDesktops() < 2 )
return;
if( !activated )
@ -1568,8 +1585,20 @@ void CubeEffect::setActive( bool active )
glPopMatrix();
}
// create the needed GL lists
capList = glGenLists(1);
glList = glGenLists(3);
capListCreated = false;
recompileList = true;
// create the capList
if( paintCaps )
{
QRect rect = effects->clientArea( FullScreenArea, activeScreen, effects->currentDesktop());
if( effects->numScreens() > 1 && (slide || bigCube ) )
rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop() );
float cubeAngle = (float)((float)(effects->numberOfDesktops() - 2 )/(float)effects->numberOfDesktops() * 180.0f);
float point = rect.width()/2*tan(cubeAngle*0.5f*M_PI/180.0f);
float zTexture = rect.width()/2*tan(45.0f*M_PI/180.0f);
paintCap( point, zTexture );
}
effects->addRepaintFull();
}
@ -1583,7 +1612,7 @@ void CubeEffect::setActive( bool active )
}
void CubeEffect::mouseChanged( const QPoint& pos, const QPoint& oldpos, Qt::MouseButtons buttons,
Qt::MouseButtons oldbuttons, Qt::KeyboardModifiers modifiers, Qt::KeyboardModifiers oldmodifiers )
Qt::MouseButtons oldbuttons, Qt::KeyboardModifiers, Qt::KeyboardModifiers )
{
if( !activated )
return;
@ -1618,7 +1647,10 @@ void CubeEffect::mouseChanged( const QPoint& pos, const QPoint& oldpos, Qt::Mous
repaint = true;
}
if( repaint )
{
recompileList = true;
effects->addRepaintFull();
}
}
if( !oldbuttons.testFlag( Qt::LeftButton ) && buttons.testFlag( Qt::LeftButton ) )
{

View file

@ -68,10 +68,11 @@ class CubeEffect
Normal,
Down
};
virtual void paintScene( int mask, QRegion region, ScreenPaintData& data );
virtual void paintCube( int mask, QRegion region, ScreenPaintData& data );
virtual void paintCap( float z, float zTexture );
virtual void paintCapStep( float z, float zTexture, bool texture );
void loadConfig( QString config );
void rotateCube();
void rotateToDesktop( int desktop );
void setActive( bool active );
bool activated;
@ -123,7 +124,8 @@ class CubeEffect
// GL lists
bool capListCreated;
GLuint capList;
bool recompileList;
GLuint glList;
};
} // namespace

View file

@ -39,8 +39,6 @@ CylinderEffect::CylinderEffect()
, mValid( true )
, mShader( 0 )
{
if( wallpaper )
wallpaper->discard();
reconfigure( ReconfigureAll );
}
@ -52,8 +50,6 @@ CylinderEffect::~CylinderEffect()
void CylinderEffect::reconfigure( ReconfigureFlags )
{
loadConfig( "Cylinder" );
animateDesktopChange = false;
bigCube = true;
}
bool CylinderEffect::supported()
@ -93,7 +89,7 @@ bool CylinderEffect::loadData()
return true;
}
void CylinderEffect::paintScene( int mask, QRegion region, ScreenPaintData& data )
void CylinderEffect::paintCube( int mask, QRegion region, ScreenPaintData& data )
{
glPushMatrix();
QRect rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop());
@ -105,7 +101,7 @@ void CylinderEffect::paintScene( int mask, QRegion region, ScreenPaintData& data
// radius of the circle
float radius = (rect.width()*0.5)/cos(radian);
glTranslatef( 0.0, 0.0, midpoint - radius );
CubeEffect::paintScene( mask, region, data );
CubeEffect::paintCube( mask, region, data );
glPopMatrix();
}
@ -158,17 +154,12 @@ void CylinderEffect::paintWindow( EffectWindow* w, int mask, QRegion region, Win
effects->paintWindow( w, mask, region, data );
}
void CylinderEffect::desktopChanged( int old )
{
// cylinder effect is not useful to slide
}
void CylinderEffect::paintCap( float z, float zTexture )
{
if( ( !paintCaps ) || effects->numberOfDesktops() <= 2 )
return;
CubeEffect::paintCap( z, zTexture );
QRect rect = effects->clientArea( FullArea, activeScreen, painting_desktop );
QRect rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop() );
float cubeAngle = (effects->numberOfDesktops() - 2 )/(float)effects->numberOfDesktops() * 180.0f;
float radian = (cubeAngle*0.5)*M_PI/180;

View file

@ -36,11 +36,10 @@ class CylinderEffect
virtual void reconfigure( ReconfigureFlags );
virtual void prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time );
virtual void paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data );
virtual void desktopChanged( int old );
static bool supported();
protected:
virtual void paintScene( int mask, QRegion region, ScreenPaintData& data );
virtual void paintCube( int mask, QRegion region, ScreenPaintData& data );
virtual void paintCap( float z, float zTexture );
private:
bool loadData();

View file

@ -22,7 +22,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <kdebug.h>
#include <KStandardDirs>
#include <kconfiggroup.h>
#include <math.h>
@ -40,8 +39,6 @@ SphereEffect::SphereEffect()
, mValid( true )
, mShader( 0 )
{
if( wallpaper )
wallpaper->discard();
reconfigure( ReconfigureAll );
}
@ -53,12 +50,6 @@ SphereEffect::~SphereEffect()
void SphereEffect::reconfigure( ReconfigureFlags )
{
loadConfig( "Sphere" );
reflection = false;
animateDesktopChange = false;
KConfigGroup conf = effects->effectConfig( "Sphere" );
zPosition = conf.readEntry( "ZPosition", 450.0 );
capDeformationFactor = conf.readEntry( "CapDeformation", 0 )/100.0f;
bigCube = true;
}
bool SphereEffect::supported()
@ -163,7 +154,7 @@ void SphereEffect::paintCap( float z, float zTexture )
void SphereEffect::paintCapStep( float z, float zTexture, bool texture )
{
QRect rect = effects->clientArea( FullArea, activeScreen, painting_desktop );
QRect rect = effects->clientArea( FullArea, activeScreen, effects->currentDesktop() );
float cubeAngle = (effects->numberOfDesktops() - 2 )/(float)effects->numberOfDesktops() * 180.0f;
float radius = (rect.width()*0.5)/cos(cubeAngle*0.5*M_PI/180.0);
float angle = acos( (rect.height()*0.5)/radius )*180.0/M_PI;