[Libreoffice-commits] core.git: 6 commits - slideshow/Library_OGLTrans.mk slideshow/opengl slideshow/source

Emmanuel Gil Peyrot emmanuel.peyrot at collabora.com
Mon Nov 23 14:07:20 PST 2015


 slideshow/Library_OGLTrans.mk                                        |    3 
 slideshow/opengl/basicFragmentShader.glsl                            |    8 
 slideshow/opengl/basicVertexShader.glsl                              |    2 
 slideshow/opengl/reflectionFragmentShader.glsl                       |    6 
 slideshow/opengl/reflectionVertexShader.glsl                         |    4 
 slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.cxx      |  221 +++++
 slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.hxx      |  272 ++++++
 slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx |  420 ++--------
 slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx |  261 ------
 9 files changed, 625 insertions(+), 572 deletions(-)

New commits:
commit 68ab250d73cc981fe3760f4e8671d3df3971ca05
Author: Emmanuel Gil Peyrot <emmanuel.peyrot at collabora.com>
Date:   Mon Nov 23 21:53:23 2015 +0000

    slideshow: Fix rotations when the slide and the screen have a different ratio
    
    Change-Id: Ia6dcc352531a6bf067f3e87086cb275b00f81c97

diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.cxx
index 7199a7e..3709f3a 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.cxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.cxx
@@ -49,20 +49,22 @@ SScale::SScale(const glm::vec3& Scale, const glm::vec3& Origin,
 }
 
 RotateAndScaleDepthByWidth::RotateAndScaleDepthByWidth(const glm::vec3& Axis,
-        const glm::vec3& Origin, double Angle, bool bInter, double T0, double T1):
+        const glm::vec3& Origin, double Angle, bool bScale, bool bInter, double T0, double T1):
     Operation(bInter, T0, T1),
     axis(Axis),
     origin(Origin),
-    angle(Angle)
+    angle(Angle),
+    scale(bScale)
 {
 }
 
 RotateAndScaleDepthByHeight::RotateAndScaleDepthByHeight(const glm::vec3& Axis,
-        const glm::vec3& Origin, double Angle, bool bInter, double T0, double T1):
+        const glm::vec3& Origin, double Angle, bool bScale, bool bInter, double T0, double T1):
     Operation(bInter, T0, T1),
     axis(Axis),
     origin(Origin),
-    angle(Angle)
+    angle(Angle),
+    scale(bScale)
 {
 }
 
@@ -98,15 +100,15 @@ makeSEllipseTranslate(double dWidth, double dHeight, double dStartPosition, doub
 }
 
 std::shared_ptr<RotateAndScaleDepthByWidth>
-makeRotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1)
+makeRotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle, bool bScale, bool bInter, double T0, double T1)
 {
-    return std::make_shared<RotateAndScaleDepthByWidth>(Axis, Origin, Angle, bInter, T0, T1);
+    return std::make_shared<RotateAndScaleDepthByWidth>(Axis, Origin, Angle, bScale, bInter, T0, T1);
 }
 
 std::shared_ptr<RotateAndScaleDepthByHeight>
-makeRotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1)
+makeRotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bScale, bool bInter, double T0, double T1)
 {
-    return std::make_shared<RotateAndScaleDepthByHeight>(Axis, Origin, Angle, bInter, T0, T1);
+    return std::make_shared<RotateAndScaleDepthByHeight>(Axis, Origin, Angle, bScale, bInter, T0, T1);
 }
 
 inline double intervalInter(double t, double T0, double T1)
@@ -132,7 +134,7 @@ void SRotate::interpolate(glm::mat4& matrix, double t, double SlideWidthScale, d
         t = mnT1;
     t = intervalInter(t,mnT0,mnT1);
     glm::vec3 translation_vector(SlideWidthScale*origin.x, SlideHeightScale*origin.y, origin.z);
-    glm::vec3 scale_vector(SlideWidthScale, SlideHeightScale, 1);
+    glm::vec3 scale_vector(SlideWidthScale * SlideWidthScale, SlideHeightScale * SlideHeightScale, 1);
     matrix = glm::translate(matrix, translation_vector);
     matrix = glm::scale(matrix, scale_vector);
     matrix = glm::rotate(matrix, static_cast<float>(t*angle), axis);
@@ -161,8 +163,13 @@ void RotateAndScaleDepthByWidth::interpolate(glm::mat4& matrix, double t, double
         t = mnT1;
     t = intervalInter(t,mnT0,mnT1);
     glm::vec3 translation_vector(SlideWidthScale*origin.x, SlideHeightScale*origin.y, SlideWidthScale*origin.z);
+    glm::vec3 scale_vector(SlideWidthScale * SlideWidthScale, SlideHeightScale * SlideHeightScale, 1);
     matrix = glm::translate(matrix, translation_vector);
+    if (scale)
+        matrix = glm::scale(matrix, scale_vector);
     matrix = glm::rotate(matrix, static_cast<float>(t*angle), axis);
+    if (scale)
+        matrix = glm::scale(matrix, 1.f / scale_vector);
     matrix = glm::translate(matrix, -translation_vector);
 }
 
@@ -174,8 +181,13 @@ void RotateAndScaleDepthByHeight::interpolate(glm::mat4& matrix, double t, doubl
         t = mnT1;
     t = intervalInter(t,mnT0,mnT1);
     glm::vec3 translation_vector(SlideWidthScale*origin.x, SlideHeightScale*origin.y, SlideHeightScale*origin.z);
+    glm::vec3 scale_vector(SlideWidthScale * SlideWidthScale, SlideHeightScale * SlideHeightScale, 1);
     matrix = glm::translate(matrix, translation_vector);
+    if (scale)
+        matrix = glm::scale(matrix, scale_vector);
     matrix = glm::rotate(matrix, static_cast<float>(t*angle), axis);
+    if (scale)
+        matrix = glm::scale(matrix, 1.f / scale_vector);
     matrix = glm::translate(matrix, -translation_vector);
 }
 
diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.hxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.hxx
index bf657d0..df058c2 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.hxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.hxx
@@ -236,16 +236,17 @@ class RotateAndScaleDepthByWidth: public Operation
 public:
     virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
 
-    RotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
+    RotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle, bool bScale, bool bInter, double T0, double T1);
     virtual ~RotateAndScaleDepthByWidth(){}
 private:
     glm::vec3 axis;
     glm::vec3 origin;
     double angle;
+    bool scale;
 };
 
 std::shared_ptr<RotateAndScaleDepthByWidth>
-makeRotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
+makeRotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle, bool bScale, bool bInter, double T0, double T1);
 
 /** Same as SRotate, except the depth is scaled by the width of the slide divided by the height of the window.
 */
@@ -254,16 +255,17 @@ class RotateAndScaleDepthByHeight: public Operation
 public:
     virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
 
-    RotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
+    RotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle, bool bScale, bool bInter, double T0, double T1);
     virtual ~RotateAndScaleDepthByHeight(){}
 private:
     glm::vec3 axis;
     glm::vec3 origin;
     double angle;
+    bool scale;
 };
 
 std::shared_ptr<RotateAndScaleDepthByHeight>
-makeRotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
+makeRotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle, bool bScale, bool bInter, double T0, double T1);
 
 #endif // INCLUDED_SLIDESHOW_OPERATIONS_HXX_
 
diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
index a9991f1..ab44f3d 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
@@ -535,13 +535,13 @@ std::shared_ptr<OGLTransitionImpl> makeOutsideCubeFaceToLeft()
     Primitives_t aLeavingPrimitives;
     aLeavingPrimitives.push_back(Slide);
 
-    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,-1),90,false,0.0,1.0));
+    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,-1),90,false,false,0.0,1.0));
 
     Primitives_t aEnteringPrimitives;
     aEnteringPrimitives.push_back(Slide);
 
     Operations_t aOperations;
-    aOperations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,-1),-90,true,0.0,1.0));
+    aOperations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,-1),-90,false,true,0.0,1.0));
 
     return makeSimpleTransition(aLeavingPrimitives, aEnteringPrimitives, aOperations);
 }
@@ -556,13 +556,13 @@ std::shared_ptr<OGLTransitionImpl> makeInsideCubeFaceToLeft()
     Primitives_t aLeavingPrimitives;
     aLeavingPrimitives.push_back(Slide);
 
-    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,1),-90,false,0.0,1.0));
+    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,1),-90,false,false,0.0,1.0));
 
     Primitives_t aEnteringPrimitives;
     aEnteringPrimitives.push_back(Slide);
 
     Operations_t aOperations;
-    aOperations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,1),90,true,0.0,1.0));
+    aOperations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,1),90,false,true,0.0,1.0));
 
     return makeSimpleTransition(aLeavingPrimitives, aEnteringPrimitives, aOperations);
 }
@@ -577,7 +577,7 @@ std::shared_ptr<OGLTransitionImpl> makeFallLeaving()
     Primitives_t aEnteringPrimitives;
     aEnteringPrimitives.push_back(Slide);
 
-    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(1,0,0),glm::vec3(0,-1,0), 90,true,0.0,1.0));
+    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(1,0,0),glm::vec3(0,-1,0), 90,true,true,0.0,1.0));
     Primitives_t aLeavingPrimitives;
     aLeavingPrimitives.push_back(Slide);
 
@@ -602,7 +602,7 @@ std::shared_ptr<OGLTransitionImpl> makeTurnAround()
     aLeavingPrimitives.push_back(Slide);
 
     Slide.Operations.clear();
-    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0),-180,false,0.0,1.0));
+    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0),-180,true,false,0.0,1.0));
     Primitives_t aEnteringPrimitives;
     aEnteringPrimitives.push_back(Slide);
 
@@ -612,7 +612,7 @@ std::shared_ptr<OGLTransitionImpl> makeTurnAround()
     Operations_t aOperations;
     aOperations.push_back(makeSTranslate(glm::vec3(0, 0, -1.5),true, 0, 0.5));
     aOperations.push_back(makeSTranslate(glm::vec3(0, 0, 1.5), true, 0.5, 1));
-    aOperations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0, 1, 0),glm::vec3(0, 0, 0), -180, true, 0.0, 1.0));
+    aOperations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0, 1, 0),glm::vec3(0, 0, 0), -180, true, true, 0.0, 1.0));
 
     return makeReflectionTransition(aLeavingPrimitives, aEnteringPrimitives, aOperations, aSettings);
 }
@@ -767,7 +767,7 @@ std::shared_ptr<OGLTransitionImpl> makeRochade()
     Slide.pushTriangle(glm::vec2(1,0),glm::vec2(0,1),glm::vec2(1,1));
 
     Slide.Operations.push_back(makeSEllipseTranslate(w, h, 0.25, -0.25, true, 0, 1));
-    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0), -45, true, 0, 1));
+    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0), -45, true, true, 0, 1));
     Primitives_t aLeavingSlide;
     aLeavingSlide.push_back(Slide);
 
@@ -777,8 +777,8 @@ std::shared_ptr<OGLTransitionImpl> makeRochade()
     Slide.Operations.clear();
     Slide.Operations.push_back(makeSEllipseTranslate(w, h, 0.75, 0.25, true, 0, 1));
     Slide.Operations.push_back(makeSTranslate(glm::vec3(0, 0, -h), false, -1, 0));
-    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0), -45, true, 0, 1));
-    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0), 45, false, -1, 0));
+    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0), -45, true, true, 0, 1));
+    Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0), 45, true, false, -1, 0));
     Primitives_t aEnteringSlide;
     aEnteringSlide.push_back(Slide);
 
@@ -1129,11 +1129,11 @@ std::shared_ptr<OGLTransitionImpl> makeVenetianBlinds( bool vertical, int parts
         if( vertical ) {
             Slide.pushTriangle (glm::vec2 (ln,0), glm::vec2 (n,0), glm::vec2 (ln,1));
             Slide.pushTriangle (glm::vec2 (n,0), glm::vec2 (ln,1), glm::vec2 (n,1));
-            Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0, 1, 0), glm::vec3(n + ln - 1, 0, -t30*p), -120, true, 0.0, 1.0));
+            Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(glm::vec3(0, 1, 0), glm::vec3(n + ln - 1, 0, -t30*p), -120, true, true, 0.0, 1.0));
         } else {
             Slide.pushTriangle (glm::vec2 (0,ln), glm::vec2 (1,ln), glm::vec2 (0,n));
             Slide.pushTriangle (glm::vec2 (1,ln), glm::vec2 (0,n), glm::vec2 (1,n));
-            Slide.Operations.push_back(makeRotateAndScaleDepthByHeight(glm::vec3(1, 0, 0), glm::vec3(0, 1 - n - ln, -t30*p), -120, true, 0.0, 1.0));
+            Slide.Operations.push_back(makeRotateAndScaleDepthByHeight(glm::vec3(1, 0, 0), glm::vec3(0, 1 - n - ln, -t30*p), -120, true, true, 0.0, 1.0));
         }
         aLeavingSlide.push_back (Slide);
 
commit 6bc132f8bf85516b4a89386c371fdd3e9937b4bf
Author: Emmanuel Gil Peyrot <emmanuel.peyrot at collabora.com>
Date:   Mon Nov 23 21:53:22 2015 +0000

    slideshow: Add back lighting in the SimpleTransition shaders
    
    Change-Id: Iec854a8369a7a9f845f261233e46aea8097db109

diff --git a/slideshow/opengl/basicFragmentShader.glsl b/slideshow/opengl/basicFragmentShader.glsl
index 7744432..01d72a2 100644
--- a/slideshow/opengl/basicFragmentShader.glsl
+++ b/slideshow/opengl/basicFragmentShader.glsl
@@ -30,10 +30,14 @@
 
 uniform sampler2D slideTexture;
 varying vec2 v_texturePosition;
+varying vec3 v_normal;
 
 void main() {
-     // TODO: handle lighting.
-     gl_FragColor = texture2D(slideTexture, v_texturePosition);
+    vec3 lightVector = vec3(0.0, 0.0, 1.0);
+    float light = max(dot(lightVector, v_normal), 0.0);
+    vec4 fragment = texture2D(slideTexture, v_texturePosition);
+    vec4 black = vec4(0.0, 0.0, 0.0, fragment.a);
+    gl_FragColor = mix(black, fragment, light);
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/opengl/basicVertexShader.glsl b/slideshow/opengl/basicVertexShader.glsl
index bd26c1b..020616f 100644
--- a/slideshow/opengl/basicVertexShader.glsl
+++ b/slideshow/opengl/basicVertexShader.glsl
@@ -29,11 +29,13 @@
 #version 120
 
 varying vec2 v_texturePosition;
+varying vec3 v_normal;
 
 void main( void )
 {
     gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
     v_texturePosition = gl_MultiTexCoord0.xy;
+    v_normal = normalize(gl_NormalMatrix * gl_Normal);
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/opengl/reflectionFragmentShader.glsl b/slideshow/opengl/reflectionFragmentShader.glsl
index 9bf8ecb..b415279 100644
--- a/slideshow/opengl/reflectionFragmentShader.glsl
+++ b/slideshow/opengl/reflectionFragmentShader.glsl
@@ -31,9 +31,15 @@
 uniform sampler2D slideTexture;
 varying float v_isShadow;
 varying vec2 v_texturePosition;
+varying vec3 v_normal;
 
 void main() {
+    vec3 lightVector = vec3(0.0, 0.0, 1.0);
+    float light = max(dot(lightVector, v_normal), 0.0);
     vec4 fragment = texture2D(slideTexture, v_texturePosition);
+    vec4 black = vec4(0.0, 0.0, 0.0, fragment.a);
+    fragment = mix(black, fragment, light);
+
     if (v_isShadow > 0.5) {
         if (v_texturePosition.y > 1.0 - 0.3)
             gl_FragColor = mix(fragment, vec4(0.0, 0.0, 0.0, 0.0), (1.0 - v_texturePosition.y) / 0.3);
diff --git a/slideshow/opengl/reflectionVertexShader.glsl b/slideshow/opengl/reflectionVertexShader.glsl
index b08d0cc..5087b98 100644
--- a/slideshow/opengl/reflectionVertexShader.glsl
+++ b/slideshow/opengl/reflectionVertexShader.glsl
@@ -28,13 +28,15 @@
 
 #version 130
 
-varying float v_isShadow;
 varying vec2 v_texturePosition;
+varying vec3 v_normal;
+varying float v_isShadow;
 
 void main( void )
 {
     gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
     v_texturePosition = gl_MultiTexCoord0.xy;
+    v_normal = normalize(gl_NormalMatrix * gl_Normal);
     v_isShadow = float(gl_VertexID >= 6);
 }
 
commit b8eff3afb4a4b313c9be668951ae2cb458cd6a4a
Author: Emmanuel Gil Peyrot <emmanuel.peyrot at collabora.com>
Date:   Mon Nov 23 21:53:21 2015 +0000

    slideshow: Fix the baseline version, we now require OpenGL 2.1
    
    With ReflectionTransition requiring 3.0 instead.
    
    Change-Id: I9497dab91017d1d81a6a5a369524849ce5774694

diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
index 3f4f1f6..a9991f1 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
@@ -591,6 +591,7 @@ std::shared_ptr<OGLTransitionImpl> makeTurnAround()
 {
     Primitive Slide;
     TransitionSettings aSettings;
+    aSettings.mnRequiredGLVersion = 3.0;
 
     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));
@@ -755,6 +756,7 @@ std::shared_ptr<OGLTransitionImpl> makeRochade()
 {
     Primitive Slide;
     TransitionSettings aSettings;
+    aSettings.mnRequiredGLVersion = 3.0;
 
     double w, h;
 
@@ -1407,7 +1409,6 @@ std::shared_ptr<OGLTransitionImpl> makeStatic()
 
     TransitionSettings aSettings;
     aSettings.mbUseMipMapLeaving = aSettings.mbUseMipMapEntering = false;
-    aSettings.mnRequiredGLVersion = 2.0;
 
     return makeStaticNoiseTransition(aLeavingSlide, aEnteringSlide, aSettings);
 }
@@ -1458,7 +1459,6 @@ std::shared_ptr<OGLTransitionImpl> makeDissolve()
 
     TransitionSettings aSettings;
     aSettings.mbUseMipMapLeaving = aSettings.mbUseMipMapEntering = false;
-    aSettings.mnRequiredGLVersion = 2.0;
 
     return makeDissolveTransition(aLeavingSlide, aEnteringSlide, aSettings);
 }
@@ -1607,7 +1607,6 @@ std::shared_ptr<OGLTransitionImpl> makeVortex()
 
     TransitionSettings aSettings;
     aSettings.mbUseMipMapLeaving = aSettings.mbUseMipMapEntering = false;
-    aSettings.mnRequiredGLVersion = 2.0;
 
     return makeVortexTransition(aLeavingSlide, aEnteringSlide, aSettings, NX, NY);
 }
@@ -1679,7 +1678,6 @@ std::shared_ptr<OGLTransitionImpl> makeRipple()
 
     TransitionSettings aSettings;
     aSettings.mbUseMipMapLeaving = aSettings.mbUseMipMapEntering = false;
-    aSettings.mnRequiredGLVersion = 2.0;
 
     return makeRippleTransition(aLeavingSlide, aEnteringSlide, aSettings);
 }
diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
index 1d58348..f1a595ef 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
@@ -48,7 +48,7 @@ struct TransitionSettings
     TransitionSettings() :
         mbUseMipMapLeaving( true ),
         mbUseMipMapEntering( true ),
-        mnRequiredGLVersion( 1.0 )
+        mnRequiredGLVersion( 2.1 )
     {
     }
 
commit 2a81e30c596a0cd253093d338368b3aad11eb166
Author: Emmanuel Gil Peyrot <emmanuel.peyrot at collabora.com>
Date:   Mon Nov 23 21:53:20 2015 +0000

    slideshow: Make the Iris class private to the TransitionImpl translation unit
    
    Change-Id: I9bf701a7f19d0f778b8fec7a39b762cc89b061b7

diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
index 0b342cd..3f4f1f6 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
@@ -327,11 +327,21 @@ SceneObject::~SceneObject()
 {
 }
 
-Iris::Iris()
-    : SceneObject()
-    , maTexture(0)
+namespace
 {
-}
+
+class Iris : public SceneObject
+{
+public:
+    Iris() = default;
+
+    virtual void prepare() override;
+    virtual void display(double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight) const override;
+    virtual void finish() override;
+
+private:
+    GLuint maTexture = 0;
+};
 
 void Iris::display(double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) const
 {
@@ -362,6 +372,8 @@ void Iris::finish()
     CHECK_GL_ERROR();
 }
 
+}
+
 namespace
 {
 
diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
index c941ba2..1d58348 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
@@ -263,19 +263,6 @@ protected:
     Primitives_t maPrimitives;
 };
 
-class Iris : public SceneObject
-{
-public:
-    Iris ();
-
-    virtual void prepare() override;
-    virtual void display(double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight) const override;
-    virtual void finish() override;
-
-private:
-    GLuint maTexture;
-};
-
 struct Vertex
 {
     glm::vec3 position;
commit 4c749b121c8b415ef2b7b0445ede1dc4ccc0e6d0
Author: Emmanuel Gil Peyrot <emmanuel.peyrot at collabora.com>
Date:   Mon Nov 23 21:53:19 2015 +0000

    slideshow: Merge ShaderTransition into OGLTransitionImpl
    
    Change-Id: Ia585a5064362c261c137d8c4abefcfda7cb7bdd7

diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
index 8d3735b..0b342cd 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
@@ -81,6 +81,27 @@ void OGLTransitionImpl::prepare( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteri
         rSceneObjects[i]->prepare();
     }
 
+    m_nProgramObject = makeShader();
+
+    CHECK_GL_ERROR();
+    if( m_nProgramObject ) {
+        glUseProgram( m_nProgramObject );
+        CHECK_GL_ERROR();
+
+        GLint location = glGetUniformLocation( m_nProgramObject, "leavingSlideTexture" );
+        if( location != -1 ) {
+            glUniform1i( location, 0 );  // texture unit 0
+            CHECK_GL_ERROR();
+        }
+
+        location = glGetUniformLocation( m_nProgramObject, "enteringSlideTexture" );
+        if( location != -1 ) {
+            glUniform1i( location, 2 );  // texture unit 2
+            CHECK_GL_ERROR();
+        }
+    }
+    CHECK_GL_ERROR();
+
     prepareTransition( glLeavingSlideTex, glEnteringSlideTex );
 }
 
@@ -92,6 +113,13 @@ void OGLTransitionImpl::finish()
     }
 
     finishTransition();
+
+    CHECK_GL_ERROR();
+    if( m_nProgramObject ) {
+        glDeleteProgram( m_nProgramObject );
+        m_nProgramObject = 0;
+    }
+    CHECK_GL_ERROR();
 }
 
 void OGLTransitionImpl::prepare( double, double, double, double, double )
@@ -115,9 +143,20 @@ void OGLTransitionImpl::displaySlides_( double nTime, sal_Int32 glLeavingSlideTe
     CHECK_GL_ERROR();
     applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
 
+    if( m_nProgramObject ) {
+        GLint location = glGetUniformLocation( m_nProgramObject, "time" );
+        if( location != -1 ) {
+            glUniform1f( location, nTime );
+        }
+    }
+
     glEnable(GL_TEXTURE_2D);
-    displaySlide( nTime, glLeavingSlideTex, maScene.getLeavingSlide(), SlideWidthScale, SlideHeightScale );
-    displaySlide( nTime, glEnteringSlideTex, maScene.getEnteringSlide(), SlideWidthScale, SlideHeightScale );
+    glActiveTexture( GL_TEXTURE2 );
+    glBindTexture( GL_TEXTURE_2D, glEnteringSlideTex );
+    glActiveTexture( GL_TEXTURE0 );
+
+    displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale );
+    CHECK_GL_ERROR();
 }
 
 void OGLTransitionImpl::display( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
@@ -326,118 +365,22 @@ void Iris::finish()
 namespace
 {
 
-class ShaderTransition : public OGLTransitionImpl
-{
-protected:
-    ShaderTransition(const TransitionScene& rScene, const TransitionSettings& rSettings)
-        : OGLTransitionImpl(rScene, rSettings)
-    {}
-
-private:
-    virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
-    virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
-    virtual void finishTransition() override;
-    virtual GLuint makeShader() const;
-
-    void impl_setTextureUniforms();
-    virtual void impl_prepareTransition() = 0;
-    virtual void impl_finishTransition() = 0;
-
-protected:
-    /** GLSL program object
-     */
-    GLuint m_nProgramObject = 0;
-};
-
-void ShaderTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
-                                              double SlideWidthScale, double SlideHeightScale )
-{
-    CHECK_GL_ERROR();
-    applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
-
-    if( m_nProgramObject ) {
-        GLint location = glGetUniformLocation( m_nProgramObject, "time" );
-        if( location != -1 ) {
-            glUniform1f( location, nTime );
-        }
-    }
-
-    glActiveTexture( GL_TEXTURE2 );
-    glBindTexture( GL_TEXTURE_2D, glEnteringSlideTex );
-    glActiveTexture( GL_TEXTURE0 );
-
-    displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale );
-    CHECK_GL_ERROR();
-}
-
-GLuint ShaderTransition::makeShader() const
-{
-    return OpenGLHelper::LoadShaders( "basicVertexShader", "basicFragmentShader" );
-}
-
-void ShaderTransition::prepareTransition( sal_Int32 /* glLeavingSlideTex */, sal_Int32 /* glEnteringSlideTex */ )
-{
-    m_nProgramObject = makeShader();
-
-    impl_setTextureUniforms();
-    impl_prepareTransition();
-}
-
-void ShaderTransition::finishTransition()
-{
-    CHECK_GL_ERROR();
-    impl_finishTransition();
-    CHECK_GL_ERROR();
-    if( m_nProgramObject ) {
-        glDeleteProgram( m_nProgramObject );
-        m_nProgramObject = 0;
-    }
-    CHECK_GL_ERROR();
-}
-
-void ShaderTransition::impl_setTextureUniforms()
-{
-    CHECK_GL_ERROR();
-    if( m_nProgramObject ) {
-        glUseProgram( m_nProgramObject );
-        CHECK_GL_ERROR();
-
-        GLint location = glGetUniformLocation( m_nProgramObject, "leavingSlideTexture" );
-        if( location != -1 ) {
-            glUniform1i( location, 0 );  // texture unit 0
-            CHECK_GL_ERROR();
-        }
-
-        location = glGetUniformLocation( m_nProgramObject, "enteringSlideTexture" );
-        if( location != -1 ) {
-            glUniform1i( location, 2 );  // texture unit 2
-            CHECK_GL_ERROR();
-        }
-    }
-    CHECK_GL_ERROR();
-}
-
-}
-
-namespace
-{
-
-class ReflectionTransition : public ShaderTransition
+class ReflectionTransition : public OGLTransitionImpl
 {
 public:
     ReflectionTransition(const TransitionScene& rScene, const TransitionSettings& rSettings)
-        : ShaderTransition(rScene, rSettings)
+        : OGLTransitionImpl(rScene, rSettings)
     {}
 
 private:
     virtual GLuint makeShader() const override;
     virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
 
-    virtual void impl_prepareTransition() override {
+    virtual void prepareTransition( sal_Int32, sal_Int32 ) override {
         glDisable(GL_CULL_FACE);
     }
 
-    virtual void impl_finishTransition() override {
+    virtual void finishTransition() override {
         glEnable(GL_CULL_FACE);
     }
 };
@@ -485,21 +428,25 @@ makeReflectionTransition(
 namespace
 {
 
-class SimpleTransition : public ShaderTransition
+class SimpleTransition : public OGLTransitionImpl
 {
 public:
     SimpleTransition(const TransitionScene& rScene, const TransitionSettings& rSettings)
-        : ShaderTransition(rScene, rSettings)
+        : OGLTransitionImpl(rScene, rSettings)
     {
     }
 
 private:
-    virtual void impl_finishTransition() override {}
-    virtual void impl_prepareTransition() override {}
+    virtual GLuint makeShader() const override;
 
     virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) override;
 };
 
+GLuint SimpleTransition::makeShader() const
+{
+    return OpenGLHelper::LoadShaders( "basicVertexShader", "basicFragmentShader" );
+}
+
 void SimpleTransition::displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
                                               double SlideWidthScale, double SlideHeightScale )
 {
@@ -1193,17 +1140,15 @@ std::shared_ptr<OGLTransitionImpl> makeVenetianBlinds( bool vertical, int parts
 namespace
 {
 
-class FadeSmoothlyTransition : public ShaderTransition
+class FadeSmoothlyTransition : public OGLTransitionImpl
 {
 public:
     FadeSmoothlyTransition(const TransitionScene& rScene, const TransitionSettings& rSettings)
-        : ShaderTransition(rScene, rSettings)
+        : OGLTransitionImpl(rScene, rSettings)
     {}
 
 private:
     virtual GLuint makeShader() const override;
-    virtual void impl_prepareTransition() override {}
-    virtual void impl_finishTransition() override {}
 };
 
 GLuint FadeSmoothlyTransition::makeShader() const
@@ -1245,17 +1190,15 @@ std::shared_ptr<OGLTransitionImpl> makeFadeSmoothly()
 namespace
 {
 
-class FadeThroughBlackTransition : public ShaderTransition
+class FadeThroughBlackTransition : public OGLTransitionImpl
 {
 public:
     FadeThroughBlackTransition(const TransitionScene& rScene, const TransitionSettings& rSettings)
-        : ShaderTransition(rScene, rSettings)
+        : OGLTransitionImpl(rScene, rSettings)
     {}
 
 private:
     virtual GLuint makeShader() const override;
-    virtual void impl_prepareTransition() override {}
-    virtual void impl_finishTransition() override {}
 };
 
 GLuint FadeThroughBlackTransition::makeShader() const
@@ -1297,23 +1240,23 @@ std::shared_ptr<OGLTransitionImpl> makeFadeThroughBlack()
 namespace
 {
 
-class PermTextureTransition : public ShaderTransition
+class PermTextureTransition : public OGLTransitionImpl
 {
 protected:
     PermTextureTransition(const TransitionScene& rScene, const TransitionSettings& rSettings)
-        : ShaderTransition(rScene, rSettings)
+        : OGLTransitionImpl(rScene, rSettings)
         , m_nHelperTexture(0)
     {}
 
-    virtual void impl_finishTransition() override;
-    virtual void impl_prepareTransition() override;
+    virtual void finishTransition() override;
+    virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
 
 private:
     /** various data */
     GLuint m_nHelperTexture;
 };
 
-void PermTextureTransition::impl_finishTransition()
+void PermTextureTransition::finishTransition()
 {
     CHECK_GL_ERROR();
     if ( m_nHelperTexture )
@@ -1383,7 +1326,7 @@ static void initPermTexture(GLuint *texID)
     CHECK_GL_ERROR();
 }
 
-void PermTextureTransition::impl_prepareTransition()
+void PermTextureTransition::prepareTransition( sal_Int32, sal_Int32 )
 {
     CHECK_GL_ERROR();
     if( m_nProgramObject ) {
@@ -1530,7 +1473,7 @@ private:
 
     virtual GLuint makeShader() const override;
 
-    virtual void impl_prepareTransition() override;
+    virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
 
     GLint mnTileInfoLocation;
     GLuint mnTileInfoBuffer;
@@ -1565,10 +1508,10 @@ GLuint VortexTransition::makeShader() const
     return OpenGLHelper::LoadShaders( "vortexVertexShader", "vortexFragmentShader" );
 }
 
-void VortexTransition::impl_prepareTransition()
+void VortexTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex )
 {
     CHECK_GL_ERROR();
-    PermTextureTransition::impl_prepareTransition();
+    PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex );
     CHECK_GL_ERROR();
 
     if (m_nProgramObject)
@@ -1660,19 +1603,18 @@ std::shared_ptr<OGLTransitionImpl> makeVortex()
 namespace
 {
 
-class RippleTransition : public ShaderTransition
+class RippleTransition : public OGLTransitionImpl
 {
 public:
     RippleTransition(const TransitionScene& rScene, const TransitionSettings& rSettings, const glm::vec2& rCenter)
-        : ShaderTransition(rScene, rSettings),
+        : OGLTransitionImpl(rScene, rSettings),
           maCenter(rCenter)
     {
     }
 
 private:
     virtual GLuint makeShader() const override;
-    virtual void impl_prepareTransition() override;
-    virtual void impl_finishTransition() override {}
+    virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex ) override;
 
     glm::vec2 maCenter;
 };
@@ -1682,7 +1624,7 @@ GLuint RippleTransition::makeShader() const
     return OpenGLHelper::LoadShaders( "basicVertexShader", "rippleFragmentShader" );
 }
 
-void RippleTransition::impl_prepareTransition()
+void RippleTransition::prepareTransition( sal_Int32, sal_Int32 )
 {
     if (m_nProgramObject)
     {
diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
index aaccd12..c941ba2 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
@@ -202,9 +202,20 @@ private:
       */
     virtual void displaySlides_( double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale );
 
+    /** This function is called in prepare method to create the GL program.
+      *
+      * It is a pure virtual to make sure no class will use a default one.
+      */
+    virtual GLuint makeShader() const = 0;
+
 private:
     TransitionScene maScene;
     const TransitionSettings maSettings;
+
+protected:
+    /** GLSL program object
+     */
+    GLuint m_nProgramObject = 0;
 };
 
 
commit fb3661a43f7de2ec7eb5ac876ec8192994f80871
Author: Emmanuel Gil Peyrot <emmanuel.peyrot at collabora.com>
Date:   Mon Nov 23 21:53:18 2015 +0000

    slideshow: Move Operation to its own translation unit
    
    Change-Id: Ie0be68055152347e82da66cb48cf76c54b7966c0

diff --git a/slideshow/Library_OGLTrans.mk b/slideshow/Library_OGLTrans.mk
index e1754f1..db1c788 100644
--- a/slideshow/Library_OGLTrans.mk
+++ b/slideshow/Library_OGLTrans.mk
@@ -41,6 +41,7 @@ ifeq ($(strip $(OS)),MACOSX)
 $(eval $(call gb_Library_add_exception_objects,OGLTrans,\
     slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl \
     slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl \
+    slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation \
 ))
 
 $(eval $(call gb_Library_use_system_darwin_frameworks,OGLTrans,\
@@ -59,12 +60,14 @@ $(eval $(call gb_Library_use_system_win32_libs,OGLTrans,\
 $(eval $(call gb_Library_add_exception_objects,OGLTrans,\
     slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl \
     slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl \
+    slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation \
 ))
 
 else
 $(eval $(call gb_Library_add_exception_objects,OGLTrans,\
     slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionerImpl \
     slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl \
+    slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation \
 ))
 
 $(eval $(call gb_Library_add_libs,OGLTrans,\
diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.cxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.cxx
new file mode 100644
index 0000000..7199a7e
--- /dev/null
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.cxx
@@ -0,0 +1,209 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2015 by Collabora, Ltd.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <glm/gtc/matrix_transform.hpp>
+#include <glm/gtc/type_ptr.hpp>
+
+#include "OGLTrans_Operation.hxx"
+
+SRotate::SRotate(const glm::vec3& Axis, const glm::vec3& Origin,
+        double Angle, bool bInter, double T0, double T1):
+    Operation(bInter, T0, T1),
+    axis(Axis),
+    origin(Origin),
+    angle(Angle)
+{
+}
+
+SScale::SScale(const glm::vec3& Scale, const glm::vec3& Origin,
+        bool bInter, double T0, double T1):
+    Operation(bInter, T0, T1),
+    scale(Scale),
+    origin(Origin)
+{
+}
+
+RotateAndScaleDepthByWidth::RotateAndScaleDepthByWidth(const glm::vec3& Axis,
+        const glm::vec3& Origin, double Angle, bool bInter, double T0, double T1):
+    Operation(bInter, T0, T1),
+    axis(Axis),
+    origin(Origin),
+    angle(Angle)
+{
+}
+
+RotateAndScaleDepthByHeight::RotateAndScaleDepthByHeight(const glm::vec3& Axis,
+        const glm::vec3& Origin, double Angle, bool bInter, double T0, double T1):
+    Operation(bInter, T0, T1),
+    axis(Axis),
+    origin(Origin),
+    angle(Angle)
+{
+}
+
+
+STranslate::STranslate(const glm::vec3& Vector, bool bInter, double T0, double T1):
+    Operation(bInter, T0, T1),
+    vector(Vector)
+{
+}
+
+std::shared_ptr<SRotate>
+makeSRotate(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1)
+{
+    return std::make_shared<SRotate>(Axis, Origin, Angle, bInter, T0, T1);
+}
+
+std::shared_ptr<SScale>
+makeSScale(const glm::vec3& Scale, const glm::vec3& Origin,bool bInter, double T0, double T1)
+{
+    return std::make_shared<SScale>(Scale, Origin, bInter, T0, T1);
+}
+
+std::shared_ptr<STranslate>
+makeSTranslate(const glm::vec3& Vector,bool bInter, double T0, double T1)
+{
+    return std::make_shared<STranslate>(Vector, bInter, T0, T1);
+}
+
+std::shared_ptr<SEllipseTranslate>
+makeSEllipseTranslate(double dWidth, double dHeight, double dStartPosition, double dEndPosition, bool bInter, double T0, double T1)
+{
+    return std::make_shared<SEllipseTranslate>(dWidth, dHeight, dStartPosition, dEndPosition, bInter, T0, T1);
+}
+
+std::shared_ptr<RotateAndScaleDepthByWidth>
+makeRotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1)
+{
+    return std::make_shared<RotateAndScaleDepthByWidth>(Axis, Origin, Angle, bInter, T0, T1);
+}
+
+std::shared_ptr<RotateAndScaleDepthByHeight>
+makeRotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1)
+{
+    return std::make_shared<RotateAndScaleDepthByHeight>(Axis, Origin, Angle, bInter, T0, T1);
+}
+
+inline double intervalInter(double t, double T0, double T1)
+{
+    return ( t - T0 ) / ( T1 - T0 );
+}
+
+void STranslate::interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const
+{
+    if(t <= mnT0)
+        return;
+    if(!mbInterpolate || t > mnT1)
+        t = mnT1;
+    t = intervalInter(t,mnT0,mnT1);
+    matrix = glm::translate(matrix, glm::vec3(SlideWidthScale*t*vector.x, SlideHeightScale*t*vector.y, t*vector.z));
+}
+
+void SRotate::interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const
+{
+    if(t <= mnT0)
+        return;
+    if(!mbInterpolate || t > mnT1)
+        t = mnT1;
+    t = intervalInter(t,mnT0,mnT1);
+    glm::vec3 translation_vector(SlideWidthScale*origin.x, SlideHeightScale*origin.y, origin.z);
+    glm::vec3 scale_vector(SlideWidthScale, SlideHeightScale, 1);
+    matrix = glm::translate(matrix, translation_vector);
+    matrix = glm::scale(matrix, scale_vector);
+    matrix = glm::rotate(matrix, static_cast<float>(t*angle), axis);
+    matrix = glm::scale(matrix, 1.f / scale_vector);
+    matrix = glm::translate(matrix, -translation_vector);
+}
+
+void SScale::interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const
+{
+    if(t <= mnT0)
+        return;
+    if(!mbInterpolate || t > mnT1)
+        t = mnT1;
+    t = intervalInter(t,mnT0,mnT1);
+    glm::vec3 translation_vector(SlideWidthScale*origin.x, SlideHeightScale*origin.y, origin.z);
+    matrix = glm::translate(matrix, translation_vector);
+    matrix = glm::scale(matrix, static_cast<float>(1 - t) + static_cast<float>(t) * scale);
+    matrix = glm::translate(matrix, -translation_vector);
+}
+
+void RotateAndScaleDepthByWidth::interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const
+{
+    if(t <= mnT0)
+        return;
+    if(!mbInterpolate || t > mnT1)
+        t = mnT1;
+    t = intervalInter(t,mnT0,mnT1);
+    glm::vec3 translation_vector(SlideWidthScale*origin.x, SlideHeightScale*origin.y, SlideWidthScale*origin.z);
+    matrix = glm::translate(matrix, translation_vector);
+    matrix = glm::rotate(matrix, static_cast<float>(t*angle), axis);
+    matrix = glm::translate(matrix, -translation_vector);
+}
+
+void RotateAndScaleDepthByHeight::interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const
+{
+    if(t <= mnT0)
+        return;
+    if(!mbInterpolate || t > mnT1)
+        t = mnT1;
+    t = intervalInter(t,mnT0,mnT1);
+    glm::vec3 translation_vector(SlideWidthScale*origin.x, SlideHeightScale*origin.y, SlideHeightScale*origin.z);
+    matrix = glm::translate(matrix, translation_vector);
+    matrix = glm::rotate(matrix, static_cast<float>(t*angle), axis);
+    matrix = glm::translate(matrix, -translation_vector);
+}
+
+SEllipseTranslate::SEllipseTranslate(double dWidth, double dHeight, double dStartPosition,
+        double dEndPosition, bool bInter, double T0, double T1):
+    Operation(bInter, T0, T1)
+{
+    width = dWidth;
+    height = dHeight;
+    startPosition = dStartPosition;
+    endPosition = dEndPosition;
+}
+
+void SEllipseTranslate::interpolate(glm::mat4& matrix, double t, double /* SlideWidthScale */, double /* SlideHeightScale */) const
+{
+    if(t <= mnT0)
+        return;
+    if(!mbInterpolate || t > mnT1)
+        t = mnT1;
+    t = intervalInter(t,mnT0,mnT1);
+
+    double a1, a2, x, y;
+    a1 = startPosition*2*M_PI;
+    a2 = (startPosition + t*(endPosition - startPosition))*2*M_PI;
+    x = width*(cos (a2) - cos (a1))/2;
+    y = height*(sin (a2) - sin (a1))/2;
+
+    matrix = glm::translate(matrix, glm::vec3(x, 0, y));
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.hxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.hxx
new file mode 100644
index 0000000..bf657d0
--- /dev/null
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_Operation.hxx
@@ -0,0 +1,270 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2015 by Collabora, Ltd.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef INCLUDED_OGLTRANS_OPERATIONS_HXX_
+#define INCLUDED_OGLTRANS_OPERATIONS_HXX_
+
+#include <config_lgpl.h>
+#include <glm/gtc/type_ptr.hpp>
+
+#include <boost/noncopyable.hpp>
+
+#include <memory>
+
+/** This class is to be derived to make any operation (transform) you may need in order to construct your transitions
+*/
+class Operation : private boost::noncopyable
+{
+public:
+    virtual ~Operation(){}
+
+protected:
+    /** Should this operation be interpolated . If TRUE, the transform will smoothly move from making no difference from t = 0.0 to mnT0 to being completely transformed from t = mnT1 to 1. If FALSE, the transform will be inneffectual from t = 0 to mnT0, and completely transformed from t = mnT0 to 1.
+    */
+    bool mbInterpolate;
+
+    /** time to begin the transformation
+    */
+    double mnT0;
+
+    /** time to finish the transformation
+    */
+    double mnT1;
+public:
+    /** this is the function that is called to give the Operation to OpenGL.
+
+        @param t
+        time from t = 0 to t = 1
+
+        @param SlideWidthScale
+        width of slide divided by width of window
+
+        @param SlideHeightScale
+        height of slide divided by height of window
+
+    */
+    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const = 0;
+
+protected:
+    Operation(bool bInterpolate, double nT0, double nT1):
+        mbInterpolate(bInterpolate), mnT0(nT0), mnT1(nT1){}
+};
+
+/** this class is a generic CounterClockWise(CCW) rotation with an axis angle
+*/
+class SRotate: public Operation
+{
+public:
+    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
+
+    /** Constructor
+
+        @param Axis
+        axis to rotate about
+
+        @param Origin
+        position that rotation axis runs through
+
+        @param Angle
+        angle in radians of CCW rotation
+
+        @param bInter
+        see Operation
+
+        @param T0
+        transformation starting time
+
+        @param T1
+        transformation ending time
+
+    */
+    SRotate(const glm::vec3& Axis, const glm::vec3& Origin, double Angle,
+            bool bInter, double T0, double T1);
+    virtual ~SRotate(){}
+private:
+    /** axis to rotate CCW about
+    */
+    glm::vec3 axis;
+
+    /** position that rotation axis runs through
+    */
+    glm::vec3 origin;
+
+    /** angle in radians of CCW rotation
+    */
+    double angle;
+};
+
+std::shared_ptr<SRotate>
+makeSRotate(const glm::vec3& Axis, const glm::vec3& Origin, double Angle,
+        bool bInter, double T0, double T1);
+
+/** scaling transformation
+*/
+class SScale: public Operation
+{
+public:
+    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
+
+    /** Constructor
+
+        @param Scale
+        amount to scale by
+
+        @param Origin
+        position that rotation axis runs through
+
+        @param bInter
+        see Operation
+
+        @param T0
+        transformation starting time
+
+        @param T1
+        transformation ending time
+
+    */
+    SScale(const glm::vec3& Scale, const glm::vec3& Origin,bool bInter, double T0, double T1);
+    virtual ~SScale(){}
+private:
+    glm::vec3 scale;
+    glm::vec3 origin;
+};
+
+std::shared_ptr<SScale>
+makeSScale(const glm::vec3& Scale, const glm::vec3& Origin,bool bInter, double T0, double T1);
+
+/** translation transformation
+*/
+class STranslate: public Operation
+{
+public:
+    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
+
+    /** Constructor
+
+        @param Vector
+        vector to translate
+
+        @param bInter
+        see Operation
+
+        @param T0
+        transformation starting time
+
+        @param T1
+        transformation ending time
+
+    */
+    STranslate(const glm::vec3& Vector,bool bInter, double T0, double T1);
+    virtual ~STranslate(){}
+private:
+    /** vector to translate by
+    */
+    glm::vec3 vector;
+};
+
+std::shared_ptr<STranslate>
+makeSTranslate(const glm::vec3& Vector,bool bInter, double T0, double T1);
+
+/** translation transformation
+*/
+class SEllipseTranslate: public Operation
+{
+public:
+    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
+
+    /** Constructor
+
+        @param Vector
+        vector to translate
+
+        @param bInter
+        see Operation
+
+        @param T0
+        transformation starting time
+
+        @param T1
+        transformation ending time
+
+    */
+    SEllipseTranslate(double dWidth, double dHeight, double dStartPosition, double dEndPosition, bool bInter, double T0, double T1);
+    virtual ~SEllipseTranslate(){}
+private:
+    /** width and length of the ellipse
+     */
+    double width, height;
+
+    /** start and end position on the ellipse <0,1>
+     */
+    double startPosition;
+    double endPosition;
+};
+
+std::shared_ptr<SEllipseTranslate>
+makeSEllipseTranslate(double dWidth, double dHeight, double dStartPosition, double dEndPosition, bool bInter, double T0, double T1);
+
+/** Same as SRotate, except the depth is scaled by the width of the slide divided by the width of the window.
+*/
+class RotateAndScaleDepthByWidth: public Operation
+{
+public:
+    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
+
+    RotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
+    virtual ~RotateAndScaleDepthByWidth(){}
+private:
+    glm::vec3 axis;
+    glm::vec3 origin;
+    double angle;
+};
+
+std::shared_ptr<RotateAndScaleDepthByWidth>
+makeRotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
+
+/** Same as SRotate, except the depth is scaled by the width of the slide divided by the height of the window.
+*/
+class RotateAndScaleDepthByHeight: public Operation
+{
+public:
+    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
+
+    RotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
+    virtual ~RotateAndScaleDepthByHeight(){}
+private:
+    glm::vec3 axis;
+    glm::vec3 origin;
+    double angle;
+};
+
+std::shared_ptr<RotateAndScaleDepthByHeight>
+makeRotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
+
+#endif // INCLUDED_SLIDESHOW_OPERATIONS_HXX_
+
+/* 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 dd791ae..8d3735b 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.cxx
@@ -37,6 +37,7 @@
 #include <comphelper/random.hxx>
 
 #include "OGLTrans_TransitionImpl.hxx"
+#include "OGLTrans_Operation.hxx"
 #include <math.h>
 
 TransitionScene::TransitionScene(TransitionScene const& rOther)
@@ -1031,181 +1032,6 @@ std::shared_ptr<OGLTransitionImpl> makeNByMTileFlip( sal_uInt16 n, sal_uInt16 m
     return makeSimpleTransition(aLeavingSlide, aEnteringSlide);
 }
 
-SRotate::SRotate(const glm::vec3& Axis, const glm::vec3& Origin,
-        double Angle, bool bInter, double T0, double T1):
-    Operation(bInter, T0, T1),
-    axis(Axis),
-    origin(Origin),
-    angle(Angle)
-{
-}
-
-SScale::SScale(const glm::vec3& Scale, const glm::vec3& Origin,
-        bool bInter, double T0, double T1):
-    Operation(bInter, T0, T1),
-    scale(Scale),
-    origin(Origin)
-{
-}
-
-RotateAndScaleDepthByWidth::RotateAndScaleDepthByWidth(const glm::vec3& Axis,
-        const glm::vec3& Origin, double Angle, bool bInter, double T0, double T1):
-    Operation(bInter, T0, T1),
-    axis(Axis),
-    origin(Origin),
-    angle(Angle)
-{
-}
-
-RotateAndScaleDepthByHeight::RotateAndScaleDepthByHeight(const glm::vec3& Axis,
-        const glm::vec3& Origin, double Angle, bool bInter, double T0, double T1):
-    Operation(bInter, T0, T1),
-    axis(Axis),
-    origin(Origin),
-    angle(Angle)
-{
-}
-
-
-STranslate::STranslate(const glm::vec3& Vector, bool bInter, double T0, double T1):
-    Operation(bInter, T0, T1),
-    vector(Vector)
-{
-}
-
-std::shared_ptr<SRotate>
-makeSRotate(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1)
-{
-    return std::make_shared<SRotate>(Axis, Origin, Angle, bInter, T0, T1);
-}
-
-std::shared_ptr<SScale>
-makeSScale(const glm::vec3& Scale, const glm::vec3& Origin,bool bInter, double T0, double T1)
-{
-    return std::make_shared<SScale>(Scale, Origin, bInter, T0, T1);
-}
-
-std::shared_ptr<STranslate>
-makeSTranslate(const glm::vec3& Vector,bool bInter, double T0, double T1)
-{
-    return std::make_shared<STranslate>(Vector, bInter, T0, T1);
-}
-
-std::shared_ptr<SEllipseTranslate>
-makeSEllipseTranslate(double dWidth, double dHeight, double dStartPosition, double dEndPosition, bool bInter, double T0, double T1)
-{
-    return std::make_shared<SEllipseTranslate>(dWidth, dHeight, dStartPosition, dEndPosition, bInter, T0, T1);
-}
-
-std::shared_ptr<RotateAndScaleDepthByWidth>
-makeRotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1)
-{
-    return std::make_shared<RotateAndScaleDepthByWidth>(Axis, Origin, Angle, bInter, T0, T1);
-}
-
-std::shared_ptr<RotateAndScaleDepthByHeight>
-makeRotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1)
-{
-    return std::make_shared<RotateAndScaleDepthByHeight>(Axis, Origin, Angle, bInter, T0, T1);
-}
-
-inline double intervalInter(double t, double T0, double T1)
-{
-    return ( t - T0 ) / ( T1 - T0 );
-}
-
-void STranslate::interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const
-{
-    if(t <= mnT0)
-        return;
-    if(!mbInterpolate || t > mnT1)
-        t = mnT1;
-    t = intervalInter(t,mnT0,mnT1);
-    matrix = glm::translate(matrix, glm::vec3(SlideWidthScale*t*vector.x, SlideHeightScale*t*vector.y, t*vector.z));
-}
-
-void SRotate::interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const
-{
-    if(t <= mnT0)
-        return;
-    if(!mbInterpolate || t > mnT1)
-        t = mnT1;
-    t = intervalInter(t,mnT0,mnT1);
-    glm::vec3 translation_vector(SlideWidthScale*origin.x, SlideHeightScale*origin.y, origin.z);
-    glm::vec3 scale_vector(SlideWidthScale, SlideHeightScale, 1);
-    matrix = glm::translate(matrix, translation_vector);
-    matrix = glm::scale(matrix, scale_vector);
-    matrix = glm::rotate(matrix, static_cast<float>(t*angle), axis);
-    matrix = glm::scale(matrix, 1.f / scale_vector);
-    matrix = glm::translate(matrix, -translation_vector);
-}
-
-void SScale::interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const
-{
-    if(t <= mnT0)
-        return;
-    if(!mbInterpolate || t > mnT1)
-        t = mnT1;
-    t = intervalInter(t,mnT0,mnT1);
-    glm::vec3 translation_vector(SlideWidthScale*origin.x, SlideHeightScale*origin.y, origin.z);
-    matrix = glm::translate(matrix, translation_vector);
-    matrix = glm::scale(matrix, static_cast<float>(1 - t) + static_cast<float>(t) * scale);
-    matrix = glm::translate(matrix, -translation_vector);
-}
-
-void RotateAndScaleDepthByWidth::interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const
-{
-    if(t <= mnT0)
-        return;
-    if(!mbInterpolate || t > mnT1)
-        t = mnT1;
-    t = intervalInter(t,mnT0,mnT1);
-    glm::vec3 translation_vector(SlideWidthScale*origin.x, SlideHeightScale*origin.y, SlideWidthScale*origin.z);
-    matrix = glm::translate(matrix, translation_vector);
-    matrix = glm::rotate(matrix, static_cast<float>(t*angle), axis);
-    matrix = glm::translate(matrix, -translation_vector);
-}
-
-void RotateAndScaleDepthByHeight::interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const
-{
-    if(t <= mnT0)
-        return;
-    if(!mbInterpolate || t > mnT1)
-        t = mnT1;
-    t = intervalInter(t,mnT0,mnT1);
-    glm::vec3 translation_vector(SlideWidthScale*origin.x, SlideHeightScale*origin.y, SlideHeightScale*origin.z);
-    matrix = glm::translate(matrix, translation_vector);
-    matrix = glm::rotate(matrix, static_cast<float>(t*angle), axis);
-    matrix = glm::translate(matrix, -translation_vector);
-}
-
-SEllipseTranslate::SEllipseTranslate(double dWidth, double dHeight, double dStartPosition,
-        double dEndPosition, bool bInter, double T0, double T1):
-    Operation(bInter, T0, T1)
-{
-    width = dWidth;
-    height = dHeight;
-    startPosition = dStartPosition;
-    endPosition = dEndPosition;
-}
-
-void SEllipseTranslate::interpolate(glm::mat4& matrix, double t, double /* SlideWidthScale */, double /* SlideHeightScale */) const
-{
-    if(t <= mnT0)
-        return;
-    if(!mbInterpolate || t > mnT1)
-        t = mnT1;
-    t = intervalInter(t,mnT0,mnT1);
-
-    double a1, a2, x, y;
-    a1 = startPosition*2*M_PI;
-    a2 = (startPosition + t*(endPosition - startPosition))*2*M_PI;
-    x = width*(cos (a2) - cos (a1))/2;
-    y = height*(sin (a2) - sin (a1))/2;
-
-    matrix = glm::translate(matrix, glm::vec3(x, 0, y));
-}
-
 Primitive& Primitive::operator=(const Primitive& rvalue)
 {
     Primitive aTmp(rvalue);
diff --git a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
index 0a12c25..aaccd12 100644
--- a/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
+++ b/slideshow/source/engine/OGLTrans/generic/OGLTrans_TransitionImpl.hxx
@@ -29,15 +29,12 @@
 #define INCLUDED_OGLTRANS_TRANSITIONIMPL_HXX_
 
 #include <config_lgpl.h>
-#include <glm/glm.hpp>
+#include <glm/gtc/type_ptr.hpp>
 
 #include <boost/noncopyable.hpp>
 
 #include <GL/glew.h>
 
-#include <basegfx/vector/b2dvector.hxx>
-#include <basegfx/vector/b3dvector.hxx>
-
 #include <memory>
 #include <vector>
 
@@ -343,236 +340,6 @@ private:
     std::vector<Vertex> Vertices;
 };
 
-/** This class is to be derived to make any operation (transform) you may need in order to construct your transitions
-*/
-class Operation : private boost::noncopyable
-{
-public:
-    virtual ~Operation(){}
-
-protected:
-    /** Should this operation be interpolated . If TRUE, the transform will smoothly move from making no difference from t = 0.0 to mnT0 to being completely transformed from t = mnT1 to 1. If FALSE, the transform will be inneffectual from t = 0 to mnT0, and completely transformed from t = mnT0 to 1.
-    */
-    bool mbInterpolate;
-
-    /** time to begin the transformation
-    */
-    double mnT0;
-
-    /** time to finish the transformation
-    */
-    double mnT1;
-public:
-    /** this is the function that is called to give the Operation to OpenGL.
-
-        @param t
-        time from t = 0 to t = 1
-
-        @param SlideWidthScale
-        width of slide divided by width of window
-
-        @param SlideHeightScale
-        height of slide divided by height of window
-
-    */
-    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const = 0;
-
-protected:
-    Operation(bool bInterpolate, double nT0, double nT1):
-        mbInterpolate(bInterpolate), mnT0(nT0), mnT1(nT1){}
-};
-
-/** this class is a generic CounterClockWise(CCW) rotation with an axis angle
-*/
-class SRotate: public Operation
-{
-public:
-    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
-
-    /** Constructor
-
-        @param Axis
-        axis to rotate about
-
-        @param Origin
-        position that rotation axis runs through
-
-        @param Angle
-        angle in radians of CCW rotation
-
-        @param bInter
-        see Operation
-
-        @param T0
-        transformation starting time
-
-        @param T1
-        transformation ending time
-
-    */
-    SRotate(const glm::vec3& Axis, const glm::vec3& Origin, double Angle,
-            bool bInter, double T0, double T1);
-    virtual ~SRotate(){}
-private:
-    /** axis to rotate CCW about
-    */
-    glm::vec3 axis;
-
-    /** position that rotation axis runs through
-    */
-    glm::vec3 origin;
-
-    /** angle in radians of CCW rotation
-    */
-    double angle;
-};
-
-std::shared_ptr<SRotate>
-makeSRotate(const glm::vec3& Axis, const glm::vec3& Origin, double Angle,
-        bool bInter, double T0, double T1);
-
-/** scaling transformation
-*/
-class SScale: public Operation
-{
-public:
-    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
-
-    /** Constructor
-
-        @param Scale
-        amount to scale by
-
-        @param Origin
-        position that rotation axis runs through
-
-        @param bInter
-        see Operation
-
-        @param T0
-        transformation starting time
-
-        @param T1
-        transformation ending time
-
-    */
-    SScale(const glm::vec3& Scale, const glm::vec3& Origin,bool bInter, double T0, double T1);
-    virtual ~SScale(){}
-private:
-    glm::vec3 scale;
-    glm::vec3 origin;
-};
-
-std::shared_ptr<SScale>
-makeSScale(const glm::vec3& Scale, const glm::vec3& Origin,bool bInter, double T0, double T1);
-
-/** translation transformation
-*/
-class STranslate: public Operation
-{
-public:
-    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
-
-    /** Constructor
-
-        @param Vector
-        vector to translate
-
-        @param bInter
-        see Operation
-
-        @param T0
-        transformation starting time
-
-        @param T1
-        transformation ending time
-
-    */
-    STranslate(const glm::vec3& Vector,bool bInter, double T0, double T1);
-    virtual ~STranslate(){}
-private:
-    /** vector to translate by
-    */
-    glm::vec3 vector;
-};
-
-std::shared_ptr<STranslate>
-makeSTranslate(const glm::vec3& Vector,bool bInter, double T0, double T1);
-
-/** translation transformation
-*/
-class SEllipseTranslate: public Operation
-{
-public:
-    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
-
-    /** Constructor
-
-        @param Vector
-        vector to translate
-
-        @param bInter
-        see Operation
-
-        @param T0
-        transformation starting time
-
-        @param T1
-        transformation ending time
-
-    */
-    SEllipseTranslate(double dWidth, double dHeight, double dStartPosition, double dEndPosition, bool bInter, double T0, double T1);
-    virtual ~SEllipseTranslate(){}
-private:
-    /** width and length of the ellipse
-     */
-    double width, height;
-
-    /** start and end position on the ellipse <0,1>
-     */
-    double startPosition;
-    double endPosition;
-};
-
-std::shared_ptr<SEllipseTranslate>
-makeSEllipseTranslate(double dWidth, double dHeight, double dStartPosition, double dEndPosition, bool bInter, double T0, double T1);
-
-/** Same as SRotate, except the depth is scaled by the width of the slide divided by the width of the window.
-*/
-class RotateAndScaleDepthByWidth: public Operation
-{
-public:
-    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
-
-    RotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
-    virtual ~RotateAndScaleDepthByWidth(){}
-private:
-    glm::vec3 axis;
-    glm::vec3 origin;
-    double angle;
-};
-
-std::shared_ptr<RotateAndScaleDepthByWidth>
-makeRotateAndScaleDepthByWidth(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
-
-/** Same as SRotate, except the depth is scaled by the width of the slide divided by the height of the window.
-*/
-class RotateAndScaleDepthByHeight: public Operation
-{
-public:
-    virtual void interpolate(glm::mat4& matrix, double t, double SlideWidthScale, double SlideHeightScale) const override;
-
-    RotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
-    virtual ~RotateAndScaleDepthByHeight(){}
-private:
-    glm::vec3 axis;
-    glm::vec3 origin;
-    double angle;
-};
-
-std::shared_ptr<RotateAndScaleDepthByHeight>
-makeRotateAndScaleDepthByHeight(const glm::vec3& Axis,const glm::vec3& Origin,double Angle,bool bInter, double T0, double T1);
-
 #endif // INCLUDED_SLIDESHOW_TRANSITION_HXX_
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list