diff options
author | Emmanuel Gil Peyrot <emmanuel.peyrot@collabora.com> | 2015-11-23 21:53:18 +0000 |
---|---|---|
committer | Tomaž Vajngerl <tomaz.vajngerl@collabora.com> | 2015-11-23 23:06:38 +0100 |
commit | fb3661a43f7de2ec7eb5ac876ec8192994f80871 (patch) | |
tree | d5b4a69ff8909b1b563030a2c9ef9e6ceda2c6e8 | |
parent | 67a6bfb1f1cc255a1850795469f7f2aa0cfdb6d0 (diff) |
slideshow: Move Operation to its own translation unit
Change-Id: Ie0be68055152347e82da66cb48cf76c54b7966c0
5 files changed, 484 insertions, 409 deletions
diff --git a/slideshow/Library_OGLTrans.mk b/slideshow/Library_OGLTrans.mk index e1754f1c8189..db1c7881095c 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 000000000000..7199a7e4d9d8 --- /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 000000000000..bf657d00d3ee --- /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 dd791aed6017..8d3735b675f0 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 0a12c255ca5e..aaccd129496e 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: */ |