From b258dc53b3c7e9adc29e9439a3e0c89a988ed4f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Tue, 1 Dec 2015 12:11:02 +0100 Subject: [PATCH] [effects] Change sphere to use shader traits variant --- effects/cube/cube.cpp | 34 ++++++------------------------ effects/cube/cube.h | 1 - effects/cube/data/1.10/sphere.vert | 19 +++++++---------- effects/cube/data/1.40/sphere.vert | 19 +++++++---------- 4 files changed, 23 insertions(+), 50 deletions(-) diff --git a/effects/cube/cube.cpp b/effects/cube/cube.cpp index 40f6767f54..bd9409f055 100644 --- a/effects/cube/cube.cpp +++ b/effects/cube/cube.cpp @@ -120,7 +120,6 @@ CubeEffect::CubeEffect() connect(effects, SIGNAL(tabBoxAdded(int)), this, SLOT(slotTabBoxAdded(int))); connect(effects, SIGNAL(tabBoxClosed()), this, SLOT(slotTabBoxClosed())); connect(effects, SIGNAL(tabBoxUpdated()), this, SLOT(slotTabBoxUpdated())); - connect(effects, SIGNAL(screenGeometryChanged(const QSize&)), this, SLOT(slotResetShaders())); reconfigure(ReconfigureAll); } @@ -296,11 +295,6 @@ void CubeEffect::slotWallPaperLoaded() watcher->deleteLater(); } -void CubeEffect::slotResetShaders() -{ - ShaderManager::instance()->resetShader(sphereShader, ShaderManager::GenericShader); -} - bool CubeEffect::loadShader() { effects->makeOpenGLContextCurrent(); @@ -330,33 +324,19 @@ bool CubeEffect::loadShader() QRect rect = effects->clientArea(FullArea, activeScreen, effects->currentDesktop()); cylinderShader->setUniform("width", (float)rect.width() * 0.5f); } - sphereShader = ShaderManager::instance()->loadVertexShader(ShaderManager::GenericShader, sphereVertexshader); + + QFile svf(sphereVertexshader); + if (!svf.open(QIODevice::ReadOnly)) { + qCCritical(KWINEFFECTS) << "The sphere shader couldn't be opened!"; + return false; + } + sphereShader = ShaderManager::instance()->generateCustomShader(ShaderTrait::MapTexture | ShaderTrait::AdjustSaturation | ShaderTrait::Modulate, svf.readAll(), QByteArray()); if (!sphereShader->isValid()) { qCCritical(KWINEFFECTS) << "The sphere shader failed to load!"; return false; } else { ShaderBinder binder(sphereShader); sphereShader->setUniform("sampler", 0); - QMatrix4x4 projection; - float fovy = 60.0f; - float aspect = 1.0f; - float zNear = 0.1f; - float zFar = 100.0f; - float ymax = zNear * tan(fovy * M_PI / 360.0f); - float ymin = -ymax; - float xmin = ymin * aspect; - float xmax = ymax * aspect; - projection.frustum(xmin, xmax, ymin, ymax, zNear, zFar); - sphereShader->setUniform(GLShader::ProjectionMatrix, projection); - QMatrix4x4 modelview; - float scaleFactor = 1.1 * tan(fovy * M_PI / 360.0f) / ymax; - modelview.translate(xmin * scaleFactor, ymax * scaleFactor, -1.1); - const QSize screenSize = effects->virtualScreenSize(); - modelview.scale((xmax - xmin)*scaleFactor / screenSize.width(), -(ymax - ymin)*scaleFactor / screenSize.height(), 0.001); - sphereShader->setUniform(GLShader::ModelViewMatrix, modelview); - const QMatrix4x4 identity; - sphereShader->setUniform(GLShader::ScreenTransformation, identity); - sphereShader->setUniform(GLShader::WindowTransformation, identity); QRect rect = effects->clientArea(FullArea, activeScreen, effects->currentDesktop()); sphereShader->setUniform("width", (float)rect.width() * 0.5f); sphereShader->setUniform("height", (float)rect.height() * 0.5f); diff --git a/effects/cube/cube.h b/effects/cube/cube.h index 272e3ce3d6..3a01cbfc86 100644 --- a/effects/cube/cube.h +++ b/effects/cube/cube.h @@ -140,7 +140,6 @@ private Q_SLOTS: void slotTabBoxClosed(); void slotCubeCapLoaded(); void slotWallPaperLoaded(); - void slotResetShaders(); private: enum RotationDirection { Left, diff --git a/effects/cube/data/1.10/sphere.vert b/effects/cube/data/1.10/sphere.vert index 8cf3a07b03..35f65499ea 100644 --- a/effects/cube/data/1.10/sphere.vert +++ b/effects/cube/data/1.10/sphere.vert @@ -17,25 +17,22 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ -uniform mat4 projection; -uniform mat4 modelview; -uniform mat4 screenTransformation; -uniform mat4 windowTransformation; +uniform mat4 modelViewProjectionMatrix; uniform float width; uniform float height; uniform float cubeAngle; uniform vec2 u_offset; uniform float timeLine; -attribute vec4 vertex; -attribute vec2 texCoord; +attribute vec4 position; +attribute vec4 texcoord; -varying vec2 varyingTexCoords; +varying vec2 texcoord0; void main() { - varyingTexCoords = texCoord; - vec4 transformedVertex = vertex; + texcoord0 = texcoord.st; + vec4 transformedVertex = position; transformedVertex.x = transformedVertex.x - width; transformedVertex.y = transformedVertex.y - height; transformedVertex.xy = transformedVertex.xy + u_offset; @@ -48,8 +45,8 @@ void main() transformedVertex.xy += vec2( width - u_offset.x, height - u_offset.y ); - vec3 diff = (vertex.xyz - transformedVertex.xyz)*timeLine; + vec3 diff = (position.xyz - transformedVertex.xyz)*timeLine; transformedVertex.xyz += diff; - gl_Position = projection*(modelview*screenTransformation*windowTransformation)*transformedVertex; + gl_Position = modelViewProjectionMatrix*transformedVertex; } diff --git a/effects/cube/data/1.40/sphere.vert b/effects/cube/data/1.40/sphere.vert index f74a9b8a5e..28975ed862 100644 --- a/effects/cube/data/1.40/sphere.vert +++ b/effects/cube/data/1.40/sphere.vert @@ -18,25 +18,22 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ #version 140 -uniform mat4 projection; -uniform mat4 modelview; -uniform mat4 screenTransformation; -uniform mat4 windowTransformation; +uniform mat4 modelViewProjectionMatrix; uniform float width; uniform float height; uniform float cubeAngle; uniform vec2 u_offset; uniform float timeLine; -in vec4 vertex; -in vec2 texCoord; +in vec4 position; +in vec4 texcoord; -out vec2 varyingTexCoords; +out vec2 texcoord0; void main() { - varyingTexCoords = texCoord; - vec4 transformedVertex = vertex; + texcoord0 = texcoord.st; + vec4 transformedVertex = position; transformedVertex.x = transformedVertex.x - width; transformedVertex.y = transformedVertex.y - height; transformedVertex.xy = transformedVertex.xy + u_offset; @@ -49,8 +46,8 @@ void main() transformedVertex.xy += vec2( width - u_offset.x, height - u_offset.y ); - vec3 diff = (vertex.xyz - transformedVertex.xyz)*timeLine; + vec3 diff = (position.xyz - transformedVertex.xyz)*timeLine; transformedVertex.xyz += diff; - gl_Position = projection*(modelview*screenTransformation*windowTransformation)*transformedVertex; + gl_Position = modelViewProjectionMatrix*transformedVertex; }