From 1d411cad5a7d78ead8cffb5da522f1e0fba31187 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Mon, 21 Dec 2015 21:25:33 +0000 Subject: slideshow: Improve the Ripple transition to match PowerPoint better Change-Id: I0b8a78fc6bce5cb737cc7070b1b69184c5f6991c --- slideshow/opengl/rippleFragmentShader.glsl | 44 ++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 11 deletions(-) (limited to 'slideshow/opengl') diff --git a/slideshow/opengl/rippleFragmentShader.glsl b/slideshow/opengl/rippleFragmentShader.glsl index ac6b8ac37099..ec641d67a571 100644 --- a/slideshow/opengl/rippleFragmentShader.glsl +++ b/slideshow/opengl/rippleFragmentShader.glsl @@ -15,21 +15,43 @@ uniform sampler2D leavingSlideTexture; uniform sampler2D enteringSlideTexture; uniform float time; uniform vec2 center; +uniform float slideRatio; + varying vec2 v_texturePosition; +// This function returns the distance between two points, taking into account the slide ratio. +float betterDistance(vec2 p1, vec2 p2) +{ + p1.x *= slideRatio; + p2.x *= slideRatio; + return distance(p1, p2); +} + void main() { - float d = length(v_texturePosition - center); - float w = 0; - w = max(w, length(center - vec2(0, 0))); - w = max(w, length(center - vec2(1, 0))); - w = max(w, length(center - vec2(1, 1))); - w = max(w, length(center - vec2(0, 1))); - float v = 0.2; - float smoothtime = smoothstep(0, 1, time); - float a = smoothstep(smoothtime*w-v, smoothtime*w+v, d); - a += (0.5 - abs(a-0.5))*sin(d*M_PI*30); - gl_FragColor = mix(texture2D(enteringSlideTexture, v_texturePosition), texture2D(leavingSlideTexture, v_texturePosition), a); + const float w = 0.5; + const float v = 0.1; + + // Distance from this fragment to the center, in slide coordinates. + float dist = betterDistance(center, v_texturePosition); + + // We want the ripple to span all of the slide at the end of the transition. + float t = time * (sqrt(2.0) * (slideRatio < 1.0 ? 1.0 / slideRatio : slideRatio)); + + // Interpolate the distance to the center in fonction of the time. + float mixed = smoothstep(t*w-v, t*w+v, dist); + + // Get the displacement offset from the current pixel, for fragments that have been touched by the ripple already. + vec2 offset = (v_texturePosition - center) * (sin(dist * 64.0 - time * 16.0) + 0.5) / 32.0; + vec2 wavyTexCoord = mix(v_texturePosition + offset, v_texturePosition, time); + + // Get the final position we will sample from. + vec2 pos = mix(wavyTexCoord, v_texturePosition, mixed); + + // Sample from the textures and mix that together. + vec4 leaving = texture2D(leavingSlideTexture, pos); + vec4 entering = texture2D(enteringSlideTexture, pos); + gl_FragColor = mix(entering, leaving, mixed); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3