summaryrefslogtreecommitdiff
path: root/slideshow
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2015-11-05 23:31:35 +0200
committerTor Lillqvist <tml@collabora.com>2015-11-06 01:01:44 +0200
commit75465aadff0272fd49d302ed8f77da7e709bd90d (patch)
tree4ff34f8b04f4726e24cdb093414149d70a610ab1 /slideshow
parentfca4e6f2ceeee1e0a63dbed367d8c34855e24521 (diff)
Add a 'Ripple' transition
Change-Id: I18efe35c299bc3a4a2a5e449021323fc1f53f378
Diffstat (limited to 'slideshow')
-rw-r--r--slideshow/Package_opengl.mk1
-rw-r--r--slideshow/opengl/rippleFragmentShader.glsl33
-rw-r--r--slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx70
-rw-r--r--slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx1
-rw-r--r--slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl.cxx4
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;