Reflection plane in cube effect and GLSL
This commit is contained in:
parent
ad070909a3
commit
e5b6baeda9
4 changed files with 65 additions and 15 deletions
|
@ -16,6 +16,7 @@ install( FILES
|
||||||
|
|
||||||
# Data files
|
# Data files
|
||||||
install( FILES
|
install( FILES
|
||||||
|
cube/data/cube-reflection.glsl
|
||||||
cube/data/cubecap.png
|
cube/data/cubecap.png
|
||||||
cube/data/cylinder.frag
|
cube/data/cylinder.frag
|
||||||
cube/data/cylinder.vert
|
cube/data/cylinder.vert
|
||||||
|
|
|
@ -97,6 +97,9 @@ CubeEffect::CubeEffect()
|
||||||
desktopNameFont.setPointSize( 14 );
|
desktopNameFont.setPointSize( 14 );
|
||||||
desktopNameFrame->setFont( desktopNameFont );
|
desktopNameFrame->setFont( desktopNameFont );
|
||||||
|
|
||||||
|
const QString fragmentshader = KGlobal::dirs()->findResource("data", "kwin/cube-reflection.glsl");
|
||||||
|
m_reflectionShader = ShaderManager::instance()->loadFragmentShader(ShaderManager::GenericShader, fragmentshader);
|
||||||
|
|
||||||
reconfigure( ReconfigureAll );
|
reconfigure( ReconfigureAll );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,6 +255,7 @@ CubeEffect::~CubeEffect()
|
||||||
delete cylinderShader;
|
delete cylinderShader;
|
||||||
delete sphereShader;
|
delete sphereShader;
|
||||||
delete desktopNameFrame;
|
delete desktopNameFrame;
|
||||||
|
delete m_reflectionShader;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CubeEffect::loadShader()
|
bool CubeEffect::loadShader()
|
||||||
|
@ -551,12 +555,9 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data )
|
||||||
#ifndef KWIN_HAVE_OPENGLES
|
#ifndef KWIN_HAVE_OPENGLES
|
||||||
// TODO: find a solution for GLES
|
// TODO: find a solution for GLES
|
||||||
glDisable( GL_CLIP_PLANE0 );
|
glDisable( GL_CLIP_PLANE0 );
|
||||||
|
glPopMatrix();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef KWIN_HAVE_OPENGLES
|
|
||||||
glPopMatrix();
|
|
||||||
glPushMatrix();
|
|
||||||
glTranslatef( rect.x() + rect.width()*0.5f, 0.0, 0.0 );
|
|
||||||
float vertices[] = {
|
float vertices[] = {
|
||||||
-rect.width()*0.5f, rect.height(), 0.0,
|
-rect.width()*0.5f, rect.height(), 0.0,
|
||||||
rect.width()*0.5f, rect.height(), 0.0,
|
rect.width()*0.5f, rect.height(), 0.0,
|
||||||
|
@ -568,7 +569,45 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data )
|
||||||
alpha = 0.3 + 0.4 * timeLine.value();
|
alpha = 0.3 + 0.4 * timeLine.value();
|
||||||
if( stop )
|
if( stop )
|
||||||
alpha = 0.3 + 0.4 * ( 1.0 - timeLine.value() );
|
alpha = 0.3 + 0.4 * ( 1.0 - timeLine.value() );
|
||||||
|
ShaderManager *shaderManager = ShaderManager::instance();
|
||||||
|
if (shaderManager->isValid() && m_reflectionShader->isValid()) {
|
||||||
|
// ensure blending is enabled - no attribute stack
|
||||||
|
glEnable( GL_BLEND );
|
||||||
|
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
||||||
|
shaderManager->pushShader(m_reflectionShader);
|
||||||
|
QMatrix4x4 windowTransformation;
|
||||||
|
windowTransformation.translate(rect.x() + rect.width()*0.5f, 0.0, 0.0);
|
||||||
|
m_reflectionShader->setUniform("windowTransformation", windowTransformation);
|
||||||
|
m_reflectionShader->setUniform("u_alpha", alpha);
|
||||||
|
QVector<float> verts;
|
||||||
|
QVector<float> texcoords;
|
||||||
|
verts.reserve(18);
|
||||||
|
texcoords.reserve(12);
|
||||||
|
texcoords << 0.0 << 0.0;
|
||||||
|
verts << vertices[6] << vertices[7] << vertices[8];
|
||||||
|
texcoords << 0.0 << 0.0;
|
||||||
|
verts << vertices[9] << vertices[10] << vertices[11];
|
||||||
|
texcoords << 1.0 << 0.0;
|
||||||
|
verts << vertices[0] << vertices[1] << vertices[2];
|
||||||
|
texcoords << 1.0 << 0.0;
|
||||||
|
verts << vertices[0] << vertices[1] << vertices[2];
|
||||||
|
texcoords << 1.0 << 0.0;
|
||||||
|
verts << vertices[3] << vertices[4] << vertices[5];
|
||||||
|
texcoords << 0.0 << 0.0;
|
||||||
|
verts << vertices[6] << vertices[7] << vertices[8];
|
||||||
|
GLVertexBuffer *vbo = GLVertexBuffer::streamingBuffer();
|
||||||
|
vbo->reset();
|
||||||
|
vbo->setUseShader(true);
|
||||||
|
vbo->setData(6, 3, verts.data(), texcoords.data());
|
||||||
|
vbo->render(GL_TRIANGLES);
|
||||||
|
|
||||||
|
shaderManager->popShader();
|
||||||
|
glDisable( GL_BLEND );
|
||||||
|
} else {
|
||||||
|
#ifndef KWIN_HAVE_OPENGLES
|
||||||
glColor4f( 0.0, 0.0, 0.0, alpha );
|
glColor4f( 0.0, 0.0, 0.0, alpha );
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef( rect.x() + rect.width()*0.5f, 0.0, 0.0 );
|
||||||
glBegin( GL_POLYGON );
|
glBegin( GL_POLYGON );
|
||||||
glVertex3f( vertices[0], vertices[1], vertices[2] );
|
glVertex3f( vertices[0], vertices[1], vertices[2] );
|
||||||
glVertex3f( vertices[3], vertices[4], vertices[5] );
|
glVertex3f( vertices[3], vertices[4], vertices[5] );
|
||||||
|
@ -580,6 +619,7 @@ void CubeEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data )
|
||||||
glEnd();
|
glEnd();
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
PaintClipper::pop( QRegion( rect ));
|
PaintClipper::pop( QRegion( rect ));
|
||||||
}
|
}
|
||||||
glEnable( GL_CULL_FACE );
|
glEnable( GL_CULL_FACE );
|
||||||
|
|
|
@ -156,6 +156,7 @@ class CubeEffect
|
||||||
bool useShaders;
|
bool useShaders;
|
||||||
GLShader* cylinderShader;
|
GLShader* cylinderShader;
|
||||||
GLShader* sphereShader;
|
GLShader* sphereShader;
|
||||||
|
GLShader* m_reflectionShader;
|
||||||
float capDeformationFactor;
|
float capDeformationFactor;
|
||||||
bool useZOrdering;
|
bool useZOrdering;
|
||||||
float zOrderingFactor;
|
float zOrderingFactor;
|
||||||
|
|
8
effects/cube/data/cube-reflection.glsl
Normal file
8
effects/cube/data/cube-reflection.glsl
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
uniform float u_alpha;
|
||||||
|
|
||||||
|
varying vec2 varyingTexCoords;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_FragColor = vec4(0.0, 0.0, 0.0, u_alpha*varyingTexCoords.s);
|
||||||
|
}
|
Loading…
Reference in a new issue