diff options
author | Tor Lillqvist <tml@collabora.com> | 2015-11-05 23:31:35 +0200 |
---|---|---|
committer | Tor Lillqvist <tml@collabora.com> | 2015-11-06 01:01:44 +0200 |
commit | 75465aadff0272fd49d302ed8f77da7e709bd90d (patch) | |
tree | 4ff34f8b04f4726e24cdb093414149d70a610ab1 /slideshow | |
parent | fca4e6f2ceeee1e0a63dbed367d8c34855e24521 (diff) |
Add a 'Ripple' transition
Change-Id: I18efe35c299bc3a4a2a5e449021323fc1f53f378
Diffstat (limited to 'slideshow')
5 files changed, 109 insertions, 0 deletions
diff --git a/slideshow/Package_opengl.mk b/slideshow/Package_opengl.mk index 440c03d0ac1a..a31262237f37 100644 --- a/slideshow/Package_opengl.mk +++ b/slideshow/Package_opengl.mk @@ -15,6 +15,7 @@ $(eval $(call gb_Package_add_files,slideshow_opengl_shader,$(LIBO_ETC_FOLDER)/op staticFragmentShader.glsl \ vortexFragmentShader.glsl \ vortexVertexShader.glsl \ + rippleFragmentShader.glsl \ )) # vim: set noet sw=4 ts=4: diff --git a/slideshow/opengl/rippleFragmentShader.glsl b/slideshow/opengl/rippleFragmentShader.glsl new file mode 100644 index 000000000000..83677e4d6390 --- /dev/null +++ b/slideshow/opengl/rippleFragmentShader.glsl @@ -0,0 +1,33 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#define M_PI 3.1415926535897932384626433832795 + +uniform sampler2D leavingSlideTexture; +uniform sampler2D enteringSlideTexture; +uniform float time; +uniform vec2 center; +varying vec2 v_texturePosition; + +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); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx index 963397c1f80f..a3183c6b6fe8 100644 --- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx +++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx @@ -27,6 +27,7 @@ ************************************************************************/ #include <GL/glew.h> +#include <glm/gtc/type_ptr.hpp> #include <vcl/opengl/OpenGLHelper.hxx> #include <algorithm> @@ -1845,6 +1846,75 @@ std::shared_ptr<OGLTransitionImpl> makeVortex() return makeVortexTransition(aLeavingSlide, aEnteringSlide, aSettings, NX, NY); } +namespace +{ + +class RippleTransition : public ShaderTransition +{ +public: + RippleTransition(const TransitionScene& rScene, const TransitionSettings& rSettings, const glm::vec2& rCenter) + : ShaderTransition(rScene, rSettings), + maCenter(rCenter) + { + } + +private: + virtual GLuint makeShader() override; + + glm::vec2 maCenter; +}; + +GLuint RippleTransition::makeShader() +{ + GLuint nProgram = OpenGLHelper::LoadShaders( "basicVertexShader", "rippleFragmentShader" ); + + if (nProgram) + { + glUseProgram(nProgram); + + GLint nCenterLocation = glGetUniformLocation(nProgram, "center"); + CHECK_GL_ERROR(); + + glUniform2fv(nCenterLocation, 1, glm::value_ptr(maCenter)); + CHECK_GL_ERROR(); + } + + return nProgram; +} + +std::shared_ptr<OGLTransitionImpl> +makeRippleTransition(const Primitives_t& rLeavingSlidePrimitives, + const Primitives_t& rEnteringSlidePrimitives, + const TransitionSettings& rSettings) +{ + // The center point should be adjustable by the user, but we have no way to do that in the UI + return std::make_shared<RippleTransition>(TransitionScene(rLeavingSlidePrimitives, rEnteringSlidePrimitives), + rSettings, + glm::vec2(0.5, 0.5)); +} + +} + +std::shared_ptr<OGLTransitionImpl> makeRipple() +{ + Primitive Slide; + + Slide.pushTriangle (glm::vec2 (0,0), glm::vec2 (1,0), glm::vec2 (0,1)); + Slide.pushTriangle (glm::vec2 (1,0), glm::vec2 (0,1), glm::vec2 (1,1)); + + Primitives_t aLeavingSlide; + aLeavingSlide.push_back (Slide); + + Primitives_t aEnteringSlide; + aEnteringSlide.push_back (Slide); + + TransitionSettings aSettings; + aSettings.mbUseMipMapLeaving = aSettings.mbUseMipMapEntering = false; + aSettings.mnRequiredGLVersion = 2.0; + + return makeRippleTransition(aLeavingSlide, aEnteringSlide, aSettings); +} + std::shared_ptr<OGLTransitionImpl> makeNewsflash() { Primitive Slide; diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx index a9e4791f439c..7193b6d98a93 100644 --- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx +++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx @@ -235,6 +235,7 @@ std::shared_ptr<OGLTransitionImpl> makeVenetianBlinds( bool vertical, int parts std::shared_ptr<OGLTransitionImpl> makeStatic(); std::shared_ptr<OGLTransitionImpl> makeDissolve(); std::shared_ptr<OGLTransitionImpl> makeVortex(); +std::shared_ptr<OGLTransitionImpl> makeRipple(); std::shared_ptr<OGLTransitionImpl> makeNewsflash(); /** 2D replacements diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx index 4dec125f4430..3c970e961bfe 100644 --- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx +++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx @@ -1431,6 +1431,7 @@ public: case animations::TransitionSubType::CORNERSIN: // 11 case animations::TransitionSubType::CORNERSOUT: // 12 case animations::TransitionSubType::VERTICAL: // 13 + case animations::TransitionSubType::HORIZONTAL: // 14 case animations::TransitionSubType::CIRCLE: // 27 case animations::TransitionSubType::FANOUTHORIZONTAL: // 55 case animations::TransitionSubType::ACROSS: // 108 @@ -1507,6 +1508,9 @@ public: case animations::TransitionSubType::VERTICAL: pTransition = makeVortex(); break; + case animations::TransitionSubType::HORIZONTAL: + pTransition = makeRipple(); + break; case animations::TransitionSubType::CIRCLE: pTransition = makeRevolvingCircles(8,128); break; |