diff options
author | Emmanuel Gil Peyrot <emmanuel.peyrot@collabora.com> | 2015-12-21 21:25:33 +0000 |
---|---|---|
committer | Tomaž Vajngerl <tomaz.vajngerl@collabora.com> | 2016-01-05 15:05:48 +0100 |
commit | 1d411cad5a7d78ead8cffb5da522f1e0fba31187 (patch) | |
tree | c0f3134cef987e1e8940ea9db45266f651f683d5 /slideshow/opengl | |
parent | 22480b20130d10f4691cdf0a658040be7f36e47b (diff) |
slideshow: Improve the Ripple transition to match PowerPoint better
Change-Id: I0b8a78fc6bce5cb737cc7070b1b69184c5f6991c
Diffstat (limited to 'slideshow/opengl')
-rw-r--r-- | slideshow/opengl/rippleFragmentShader.glsl | 44 |
1 files changed, 33 insertions, 11 deletions
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: */ |