diff options
Diffstat (limited to 'slideshow/source/engine/OGLTrans/unx/OGLTrans_TransitionImpl.cxx')
-rw-r--r-- | slideshow/source/engine/OGLTrans/unx/OGLTrans_TransitionImpl.cxx | 1019 |
1 files changed, 698 insertions, 321 deletions
diff --git a/slideshow/source/engine/OGLTrans/unx/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/unx/OGLTrans_TransitionImpl.cxx index 5bbedb6a253d..14b999a2ba02 100644 --- a/slideshow/source/engine/OGLTrans/unx/OGLTrans_TransitionImpl.cxx +++ b/slideshow/source/engine/OGLTrans/unx/OGLTrans_TransitionImpl.cxx @@ -26,71 +26,87 @@ * ************************************************************************/ +#include <utility> + +#include <boost/make_shared.hpp> + #include "OGLTrans_TransitionImpl.hxx" #include "OGLTrans_Shaders.hxx" #include <GL/gl.h> #include <math.h> +using boost::make_shared; +using boost::shared_ptr; -void OGLTransitionImpl::clear() +using std::max; +using std::min; +using std::vector; + +TransitionScene::TransitionScene(TransitionScene const& rOther) + : maLeavingSlidePrimitives(rOther.maLeavingSlidePrimitives) + , maEnteringSlidePrimitives(rOther.maEnteringSlidePrimitives) + , maOverallOperations(rOther.maOverallOperations) + , maSceneObjects(rOther.maSceneObjects) { - for(unsigned int i( 0 ); i < OverallOperations.size(); ++i) - delete OverallOperations[i]; - OverallOperations.clear(); - maLeavingSlidePrimitives.clear(); - maEnteringSlidePrimitives.clear(); - for(unsigned int i(0); i < maSceneObjects.size(); ++i) - delete maSceneObjects[i]; - maSceneObjects.clear(); +} - mbReflectSlides = false; +TransitionScene& TransitionScene::operator=(const TransitionScene& rOther) +{ + TransitionScene aTmp(rOther); + swap(aTmp); + return *this; +} -#ifdef GL_VERSION_2_0 - if( mProgramObject ) { - OGLShaders::glDeleteProgram( mProgramObject ); - mProgramObject = 0; - } +void TransitionScene::swap(TransitionScene& rOther) +{ + using std::swap; - if( mVertexObject ) { - OGLShaders::glDeleteShader( mVertexObject ); - mVertexObject = 0; - } + swap(maLeavingSlidePrimitives, rOther.maLeavingSlidePrimitives); + swap(maEnteringSlidePrimitives, rOther.maEnteringSlidePrimitives); + swap(maOverallOperations, rOther.maOverallOperations); + swap(maSceneObjects, rOther.maSceneObjects); +} - if( mFragmentObject ) { - OGLShaders::glDeleteShader( mFragmentObject ); - mFragmentObject = 0; - } -#endif +void TransitionScene::clear() +{ + maLeavingSlidePrimitives.clear(); + maEnteringSlidePrimitives.clear(); + maOverallOperations.clear(); + maSceneObjects.clear(); +} - if( maHelperTexture ) { - glDeleteTextures( 1, &maHelperTexture ); - maHelperTexture = 0; - } +OGLTransitionImpl::~OGLTransitionImpl() +{ +} - if( mmClearTransition ) - (this->*mmClearTransition)(); +void OGLTransitionImpl::setScene(TransitionScene const& rScene) +{ + maScene = rScene; } -OGLTransitionImpl::~OGLTransitionImpl() +void OGLTransitionImpl::clearScene() { - clear(); + maScene.clear(); } void OGLTransitionImpl::prepare( ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex ) { - for(unsigned int i(0); i < maSceneObjects.size(); ++i) { - maSceneObjects[i]->prepare(); + const SceneObjects_t& rSceneObjects(maScene.getSceneObjects()); + for(unsigned int i(0); i != rSceneObjects.size(); ++i) { + rSceneObjects[i]->prepare(); } - if( mmPrepareTransition ) - (this->*mmPrepareTransition)( glLeavingSlideTex, glEnteringSlideTex ); + prepareTransition_( glLeavingSlideTex, glEnteringSlideTex ); } void OGLTransitionImpl::finish() { - for(unsigned int i(0); i < maSceneObjects.size(); ++i) { - maSceneObjects[i]->finish(); + const SceneObjects_t& rSceneObjects(maScene.getSceneObjects()); + for(unsigned int i(0); i != rSceneObjects.size(); ++i) { + rSceneObjects[i]->finish(); } + + finishTransition_(); } static void blendSlide( double depth ) @@ -119,7 +135,7 @@ static void blendSlide( double depth ) glEnable( GL_DEPTH_TEST ); } -static void slideShadow( double nTime, Primitive& primitive, double sw, double sh ) +static void slideShadow( double nTime, const Primitive& primitive, double sw, double sh ) { double reflectionDepth = 0.3; @@ -136,33 +152,53 @@ static void slideShadow( double nTime, Primitive& primitive, double sw, double s glEnable(GL_LIGHTING); } +void OGLTransitionImpl::prepare_( double, double, double, double, double ) +{ +} + +void OGLTransitionImpl::prepareTransition_( ::sal_Int32, ::sal_Int32 ) +{ +} + +void OGLTransitionImpl::finishTransition_() +{ +} + +void OGLTransitionImpl::displaySlides_( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) +{ + applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale ); + + glEnable(GL_TEXTURE_2D); + displaySlide( nTime, glLeavingSlideTex, maScene.getLeavingSlide(), SlideWidthScale, SlideHeightScale ); + displaySlide( nTime, glEnteringSlideTex, maScene.getEnteringSlide(), SlideWidthScale, SlideHeightScale ); +} + void OGLTransitionImpl::display( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) { - double SlideWidthScale, SlideHeightScale; + const double SlideWidthScale = SlideWidth/DispWidth; + const double SlideHeightScale = SlideHeight/DispHeight; - SlideWidthScale = SlideWidth/DispWidth; - SlideHeightScale = SlideHeight/DispHeight; - - if( mmPrepare ) { - clear(); - (this->*mmPrepare)( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight ); - } + prepare_( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight ); glPushMatrix(); - displaySlides( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale ); + displaySlides_( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale ); displayScene( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight ); glPopMatrix(); } void OGLTransitionImpl::applyOverallOperations( double nTime, double SlideWidthScale, double SlideHeightScale ) { - for(unsigned int i(0); i < OverallOperations.size(); ++i) - OverallOperations[i]->interpolate(nTime,SlideWidthScale,SlideHeightScale); + const Operations_t& rOverallOperations(maScene.getOperations()); + for(unsigned int i(0); i != rOverallOperations.size(); ++i) + rOverallOperations[i]->interpolate(nTime,SlideWidthScale,SlideHeightScale); } -void OGLTransitionImpl::displaySlide( double nTime, ::sal_Int32 glSlideTex, std::vector<Primitive>& primitives, - double SlideWidthScale, double SlideHeightScale ) +void +OGLTransitionImpl::displaySlide( + const double nTime, + const ::sal_Int32 glSlideTex, const Primitives_t& primitives, + double SlideWidthScale, double SlideHeightScale ) { //TODO change to foreach glBindTexture(GL_TEXTURE_2D, glSlideTex); @@ -170,7 +206,7 @@ void OGLTransitionImpl::displaySlide( double nTime, ::sal_Int32 glSlideTex, std: // display slide reflection // note that depth test is turned off while blending the shadow // so the slides has to be rendered in right order, see rochade as example - if( mbReflectSlides ) { + if( maSettings.mbReflectSlides ) { double surfaceLevel = -0.04; /* reflected slides */ @@ -193,28 +229,15 @@ void OGLTransitionImpl::displaySlide( double nTime, ::sal_Int32 glSlideTex, std: primitives[i].display(nTime, SlideWidthScale, SlideHeightScale); } -void OGLTransitionImpl::displaySlides( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, - double SlideWidthScale, double SlideHeightScale ) -{ - if( mmDisplaySlides ) - (this->*mmDisplaySlides)( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale ); - else { - applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale ); - - glEnable(GL_TEXTURE_2D); - displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale ); - displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale ); - } -} - void OGLTransitionImpl::displayScene( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) { + const SceneObjects_t& rSceneObjects(maScene.getSceneObjects()); glEnable(GL_TEXTURE_2D); - for(unsigned int i(0); i < maSceneObjects.size(); ++i) - maSceneObjects[i]->display(nTime, SlideWidth, SlideHeight, DispWidth, DispHeight); + for(unsigned int i(0); i != rSceneObjects.size(); ++i) + rSceneObjects[i]->display(nTime, SlideWidth, SlideHeight, DispWidth, DispHeight); } -void Primitive::display(double nTime, double WidthScale, double HeightScale) +void Primitive::display(double nTime, double WidthScale, double HeightScale) const { glPushMatrix(); @@ -233,21 +256,14 @@ void Primitive::display(double nTime, double WidthScale, double HeightScale) glPopMatrix(); } -void Primitive::applyOperations(double nTime, double WidthScale, double HeightScale) +void Primitive::applyOperations(double nTime, double WidthScale, double HeightScale) const { for(unsigned int i(0); i < Operations.size(); ++i) Operations[i]->interpolate( nTime ,WidthScale,HeightScale); glScaled(WidthScale,HeightScale,1); } -Primitive::~Primitive() -{ - for(unsigned int i( 0 ); i < Operations.size(); ++i) - delete Operations[i]; -} - - -void SceneObject::display(double nTime, double /* SlideWidth */, double /* SlideHeight */, double DispWidth, double DispHeight ) +void SceneObject::display(double nTime, double /* SlideWidth */, double /* SlideHeight */, double DispWidth, double DispHeight ) const { for(unsigned int i(0); i < maPrimitives.size(); ++i) { // fixme: allow various model spaces, now we make it so that @@ -281,7 +297,7 @@ Iris::Iris() { } -void Iris::display(double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) +void Iris::display(double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) const { glBindTexture(GL_TEXTURE_2D, maTexture); SceneObject::display(nTime, SlideWidth, SlideHeight, DispWidth, DispHeight); @@ -305,103 +321,194 @@ void Iris::finish() glDeleteTextures(1, &maTexture); } -void OGLTransitionImpl::makeOutsideCubeFaceToLeft() +namespace +{ + +class SimpleTransition : public OGLTransitionImpl +{ +public: + SimpleTransition() + : OGLTransitionImpl() + { + } + + SimpleTransition(const TransitionScene& rScene, const TransitionSettings& rSettings) + : OGLTransitionImpl(rScene, rSettings) + { + } +}; + +shared_ptr<OGLTransitionImpl> +makeSimpleTransition() +{ + return make_shared<SimpleTransition>(); +} + +shared_ptr<OGLTransitionImpl> +makeSimpleTransition( + const Primitives_t& rLeavingSlidePrimitives, + const Primitives_t& rEnteringSlidePrimitives, + const Operations_t& rOverallOperations, + const SceneObjects_t& rSceneObjects, + const TransitionSettings& rSettings = TransitionSettings()) +{ + return make_shared<SimpleTransition>( + TransitionScene(rLeavingSlidePrimitives, rEnteringSlidePrimitives, rOverallOperations, rSceneObjects), + rSettings) + ; +} + +shared_ptr<OGLTransitionImpl> +makeSimpleTransition( + const Primitives_t& rLeavingSlidePrimitives, + const Primitives_t& rEnteringSlidePrimitives, + const Operations_t& rOverallOperations, + const TransitionSettings& rSettings = TransitionSettings()) +{ + return makeSimpleTransition(rLeavingSlidePrimitives, rEnteringSlidePrimitives, rOverallOperations, SceneObjects_t(), rSettings); +} + +shared_ptr<OGLTransitionImpl> +makeSimpleTransition( + const Primitives_t& rLeavingSlidePrimitives, + const Primitives_t& rEnteringSlidePrimitives, + const SceneObjects_t& rSceneObjects, + const TransitionSettings& rSettings = TransitionSettings()) +{ + return makeSimpleTransition(rLeavingSlidePrimitives, rEnteringSlidePrimitives, Operations_t(), rSceneObjects, rSettings); +} + +shared_ptr<OGLTransitionImpl> +makeSimpleTransition( + const Primitives_t& rLeavingSlidePrimitives, + const Primitives_t& rEnteringSlidePrimitives, + const TransitionSettings& rSettings = TransitionSettings()) +{ + return makeSimpleTransition(rLeavingSlidePrimitives, rEnteringSlidePrimitives, Operations_t(), SceneObjects_t(), rSettings); +} + +} + +boost::shared_ptr<OGLTransitionImpl> makeOutsideCubeFaceToLeft() { - clear(); Primitive Slide; Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1)); Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1)); - maLeavingSlidePrimitives.push_back(Slide); + Primitives_t aLeavingPrimitives; + aLeavingPrimitives.push_back(Slide); - Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,-1),90,false,0.0,1.0)); + Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,-1),90,false,0.0,1.0)); - maEnteringSlidePrimitives.push_back(Slide); + Primitives_t aEnteringPrimitives; + aEnteringPrimitives.push_back(Slide); - OverallOperations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,-1),-90,true,0.0,1.0)); + Operations_t aOperations; + aOperations.push_back(makeRotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,-1),-90,true,0.0,1.0)); + + return makeSimpleTransition(aLeavingPrimitives, aEnteringPrimitives, aOperations); } -void OGLTransitionImpl::makeInsideCubeFaceToLeft() +boost::shared_ptr<OGLTransitionImpl> makeInsideCubeFaceToLeft() { - clear(); Primitive Slide; Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1)); Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1)); - maLeavingSlidePrimitives.push_back(Slide); + Primitives_t aLeavingPrimitives; + aLeavingPrimitives.push_back(Slide); + + Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,1),-90,false,0.0,1.0)); - Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,1),-90,false,0.0,1.0)); + Primitives_t aEnteringPrimitives; + aEnteringPrimitives.push_back(Slide); - maEnteringSlidePrimitives.push_back(Slide); + Operations_t aOperations; + aOperations.push_back(makeRotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,1),90,true,0.0,1.0)); - OverallOperations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,1),90,true,0.0,1.0)); + return makeSimpleTransition(aLeavingPrimitives, aEnteringPrimitives, aOperations); } -void OGLTransitionImpl::makeFallLeaving() +boost::shared_ptr<OGLTransitionImpl> makeFallLeaving() { - clear(); Primitive Slide; Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1)); Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1)); - maEnteringSlidePrimitives.push_back(Slide); - Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(1,0,0),basegfx::B3DVector(0,-1,0), 90,true,0.0,1.0)); - maLeavingSlidePrimitives.push_back(Slide); + Primitives_t aEnteringPrimitives; + aEnteringPrimitives.push_back(Slide); - mbUseMipMapEntering = false; + Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(basegfx::B3DVector(1,0,0),basegfx::B3DVector(0,-1,0), 90,true,0.0,1.0)); + Primitives_t aLeavingPrimitives; + aLeavingPrimitives.push_back(Slide); + + TransitionSettings aSettings; + aSettings.mbUseMipMapEntering = false; + + return makeSimpleTransition(aLeavingPrimitives, aEnteringPrimitives, aSettings); } -void OGLTransitionImpl::makeTurnAround() +boost::shared_ptr<OGLTransitionImpl> makeTurnAround() { - clear(); Primitive Slide; - mbReflectSlides = true; + TransitionSettings aSettings; + aSettings.mbReflectSlides = true; Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1)); Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1)); - maLeavingSlidePrimitives.push_back(Slide); + Primitives_t aLeavingPrimitives; + aLeavingPrimitives.push_back(Slide); - Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0),-180,false,0.0,1.0)); - maEnteringSlidePrimitives.push_back(Slide); + Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0),-180,false,0.0,1.0)); + Primitives_t aEnteringPrimitives; + aEnteringPrimitives.push_back(Slide); - OverallOperations.push_back(new STranslate(basegfx::B3DVector(0, 0, -1.5),true, 0, 0.5)); - OverallOperations.push_back(new STranslate(basegfx::B3DVector(0, 0, 1.5), true, 0.5, 1)); - OverallOperations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0, 1, 0),basegfx::B3DVector(0, 0, 0), -180, true, 0.0, 1.0)); + Operations_t aOperations; + aOperations.push_back(makeSTranslate(basegfx::B3DVector(0, 0, -1.5),true, 0, 0.5)); + aOperations.push_back(makeSTranslate(basegfx::B3DVector(0, 0, 1.5), true, 0.5, 1)); + aOperations.push_back(makeRotateAndScaleDepthByWidth(basegfx::B3DVector(0, 1, 0),basegfx::B3DVector(0, 0, 0), -180, true, 0.0, 1.0)); + + return makeSimpleTransition(aLeavingPrimitives, aEnteringPrimitives, aOperations, aSettings); } -void OGLTransitionImpl::makeTurnDown() +boost::shared_ptr<OGLTransitionImpl> makeTurnDown() { - clear(); Primitive Slide; Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1)); Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1)); - maLeavingSlidePrimitives.push_back(Slide); + Primitives_t aLeavingPrimitives; + aLeavingPrimitives.push_back(Slide); + + Slide.Operations.push_back(makeSTranslate(basegfx::B3DVector(0, 0, 0.0001), false, -1.0, 0.0)); + Slide.Operations.push_back(makeSRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(-1, 1, 0), -90, true, 0.0, 1.0)); + Slide.Operations.push_back(makeSRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(-1, 1, 0), 90, false, -1.0, 0.0)); + Primitives_t aEnteringPrimitives; + aEnteringPrimitives.push_back(Slide); - Slide.Operations.push_back(new STranslate(basegfx::B3DVector(0, 0, 0.0001), false, -1.0, 0.0)); - Slide.Operations.push_back(new SRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(-1, 1, 0), -90, true, 0.0, 1.0)); - Slide.Operations.push_back(new SRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(-1, 1, 0), 90, false, -1.0, 0.0)); - maEnteringSlidePrimitives.push_back(Slide); + TransitionSettings aSettings; + aSettings.mbUseMipMapLeaving = false; - mbUseMipMapLeaving = false; + return makeSimpleTransition(aLeavingPrimitives, aEnteringPrimitives, aSettings); } -void OGLTransitionImpl::makeIris() +boost::shared_ptr<OGLTransitionImpl> makeIris() { - clear(); Primitive Slide; Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1)); Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1)); - maEnteringSlidePrimitives.push_back (Slide); + Primitives_t aEnteringPrimitives; + aEnteringPrimitives.push_back (Slide); - Slide.Operations.push_back (new STranslate (basegfx::B3DVector (0, 0, 0.000001), false, -1, 0)); - Slide.Operations.push_back (new STranslate (basegfx::B3DVector (0, 0, -0.000002), false, 0.5, 1)); - maLeavingSlidePrimitives.push_back (Slide); + Slide.Operations.push_back (makeSTranslate (basegfx::B3DVector (0, 0, 0.000001), false, -1, 0)); + Slide.Operations.push_back (makeSTranslate (basegfx::B3DVector (0, 0, -0.000002), false, 0.5, 1)); + Primitives_t aLeavingPrimitives; + aLeavingPrimitives.push_back (Slide); Primitive irisPart, part; @@ -430,7 +537,7 @@ void OGLTransitionImpl::makeIris() t += 1.0/nSteps; } - Iris* pIris = new Iris(); + shared_ptr<Iris> pIris = make_shared<Iris>(); double angle = 87; for (i = 0; i < nParts; i++) { @@ -439,46 +546,76 @@ void OGLTransitionImpl::makeIris() rx = cos ((2*M_PI*i)/nParts); ry = sin ((2*M_PI*i)/nParts); - irisPart.Operations.push_back (new SRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(rx, ry, 0), angle, true, 0.0, 0.5)); - irisPart.Operations.push_back (new SRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(rx, ry, 0), -angle, true, 0.5, 1)); + irisPart.Operations.push_back (makeSRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(rx, ry, 0), angle, true, 0.0, 0.5)); + irisPart.Operations.push_back (makeSRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(rx, ry, 0), -angle, true, 0.5, 1)); if (i > 0) { - irisPart.Operations.push_back (new STranslate (basegfx::B3DVector(rx, ry, 0), false, -1, 0)); - irisPart.Operations.push_back (new SRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(0, 0, 0), i*360.0/nParts, false, -1, 0)); - irisPart.Operations.push_back (new STranslate (basegfx::B3DVector(-1, 0, 0), false, -1, 0)); + irisPart.Operations.push_back (makeSTranslate (basegfx::B3DVector(rx, ry, 0), false, -1, 0)); + irisPart.Operations.push_back (makeSRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(0, 0, 0), i*360.0/nParts, false, -1, 0)); + irisPart.Operations.push_back (makeSTranslate (basegfx::B3DVector(-1, 0, 0), false, -1, 0)); } - irisPart.Operations.push_back(new STranslate(basegfx::B3DVector(0, 0, 1), false, -2, 0.0)); - irisPart.Operations.push_back (new SRotate (basegfx::B3DVector(1, .5, 0), basegfx::B3DVector(1, 0, 0), -30, false, -1, 0)); + irisPart.Operations.push_back(makeSTranslate(basegfx::B3DVector(0, 0, 1), false, -2, 0.0)); + irisPart.Operations.push_back (makeSRotate (basegfx::B3DVector(1, .5, 0), basegfx::B3DVector(1, 0, 0), -30, false, -1, 0)); pIris->pushPrimitive (irisPart); } - maSceneObjects.push_back (pIris); + SceneObjects_t aSceneObjects; + aSceneObjects.push_back (pIris); - mbUseMipMapLeaving = mbUseMipMapEntering = false; + TransitionSettings aSettings; + aSettings.mbUseMipMapLeaving = aSettings.mbUseMipMapEntering = false; + + return makeSimpleTransition(aLeavingPrimitives, aEnteringPrimitives, aSceneObjects, aSettings); } -void OGLTransitionImpl::displaySlidesRochade( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, - double SlideWidthScale, double SlideHeightScale ) +namespace +{ + +class RochadeTransition : public OGLTransitionImpl +{ +public: + RochadeTransition(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 ); +}; + +void RochadeTransition::displaySlides_( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) { applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale ); glEnable(GL_TEXTURE_2D); if( nTime > .5) { - displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale ); - displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale ); + displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale ); + displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale ); } else { - displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale ); - displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale ); + displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale ); + displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale ); } } -void OGLTransitionImpl::makeRochade() +shared_ptr<OGLTransitionImpl> +makeRochadeTransition( + const Primitives_t& rLeavingSlidePrimitives, + const Primitives_t& rEnteringSlidePrimitives, + const TransitionSettings& rSettings) +{ + return make_shared<RochadeTransition>( + TransitionScene(rLeavingSlidePrimitives, rEnteringSlidePrimitives), + rSettings) + ; + +} +} + +boost::shared_ptr<OGLTransitionImpl> makeRochade() { - clear(); Primitive Slide; - mbReflectSlides = true; - mmDisplaySlides = &OGLTransitionImpl::displaySlidesRochade; + TransitionSettings aSettings; + aSettings.mbReflectSlides = true; double w, h; @@ -488,17 +625,20 @@ void OGLTransitionImpl::makeRochade() Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1)); Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1)); - Slide.Operations.push_back(new SEllipseTranslate(w, h, 0.25, -0.25, true, 0, 1)); - Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0), -45, true, 0, 1)); - maLeavingSlidePrimitives.push_back(Slide); + Slide.Operations.push_back(makeSEllipseTranslate(w, h, 0.25, -0.25, true, 0, 1)); + Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0), -45, true, 0, 1)); + Primitives_t aLeavingSlide; + aLeavingSlide.push_back(Slide); Slide.Operations.clear(); - Slide.Operations.push_back(new SEllipseTranslate(w, h, 0.75, 0.25, true, 0, 1)); - Slide.Operations.push_back(new STranslate(basegfx::B3DVector(0, 0, -h), false, -1, 0)); - Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0), -45, true, 0, 1)); - Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0), 45, false, -1, 0)); - maEnteringSlidePrimitives.push_back(Slide); + Slide.Operations.push_back(makeSEllipseTranslate(w, h, 0.75, 0.25, true, 0, 1)); + Slide.Operations.push_back(makeSTranslate(basegfx::B3DVector(0, 0, -h), false, -1, 0)); + Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0), -45, true, 0, 1)); + Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0), 45, false, -1, 0)); + Primitives_t aEnteringSlide; + aEnteringSlide.push_back(Slide); + return makeRochadeTransition(aLeavingSlide, aEnteringSlide, aSettings); } // TODO(Q3): extract to basegfx @@ -528,14 +668,13 @@ inline basegfx::B3DVector randNormVectorInXYPlane() return toReturn/toReturn.getLength(); } -void OGLTransitionImpl::makeRevolvingCircles( ::sal_uInt16 nCircles , ::sal_uInt16 nPointsOnCircles ) +boost::shared_ptr<OGLTransitionImpl> makeRevolvingCircles( ::sal_uInt16 nCircles , ::sal_uInt16 nPointsOnCircles ) { - clear(); double dAngle(2*3.1415926/static_cast<double>( nPointsOnCircles )); if(nCircles < 2 || nPointsOnCircles < 4) { makeNByMTileFlip(1,1); - return; + return makeSimpleTransition(); } double Radius(1.0/static_cast<double>( nCircles )); double dRadius(Radius); @@ -556,6 +695,8 @@ void OGLTransitionImpl::makeRevolvingCircles( ::sal_uInt16 nCircles , ::sal_uInt TempAngle += dAngle; } + Primitives_t aLeavingSlide; + Primitives_t aEnteringSlide; { Primitive EnteringSlide; Primitive LeavingSlide; @@ -568,12 +709,12 @@ void OGLTransitionImpl::makeRevolvingCircles( ::sal_uInt16 nCircles , ::sal_uInt LeavingSlide.pushTriangle( basegfx::B2DVector(0.5,0.5) , Radius*unScaledTexCoords[0]/2.0 + basegfx::B2DVector(0.5,0.5) , Radius*unScaledTexCoords[nPointsOnCircles - 1]/2.0 + basegfx::B2DVector(0.5,0.5) ); basegfx::B3DVector axis(randNormVectorInXYPlane()); - EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) ); - LeavingSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) ); - EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , -180, false,0.0,1.0) ); + EnteringSlide.Operations.push_back( makeSRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) ); + LeavingSlide.Operations.push_back( makeSRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) ); + EnteringSlide.Operations.push_back( makeSRotate( axis , basegfx::B3DVector(0,0,0) , -180, false,0.0,1.0) ); - maEnteringSlidePrimitives.push_back(EnteringSlide); - maLeavingSlidePrimitives.push_back(LeavingSlide); + aEnteringSlide.push_back(EnteringSlide); + aLeavingSlide.push_back(LeavingSlide); LastRadius = Radius; Radius = NextRadius; NextRadius += dRadius; @@ -599,12 +740,12 @@ void OGLTransitionImpl::makeRevolvingCircles( ::sal_uInt16 nCircles , ::sal_uInt LeavingSlide.pushTriangle(Radius*unScaledTexCoords[nPointsOnCircles - 1]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0 + basegfx::B2DVector(0.5,0.5) , Radius*unScaledTexCoords[0]/2.0 + basegfx::B2DVector(0.5,0.5) ); basegfx::B3DVector axis(randNormVectorInXYPlane()); - EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) ); - LeavingSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) ); - EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , -180, false,0.0,1.0) ); + EnteringSlide.Operations.push_back( makeSRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) ); + LeavingSlide.Operations.push_back( makeSRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) ); + EnteringSlide.Operations.push_back( makeSRotate( axis , basegfx::B3DVector(0,0,0) , -180, false,0.0,1.0) ); - maEnteringSlidePrimitives.push_back(EnteringSlide); - maLeavingSlidePrimitives.push_back(LeavingSlide); + aEnteringSlide.push_back(EnteringSlide); + aLeavingSlide.push_back(LeavingSlide); LastRadius = Radius; Radius = NextRadius; @@ -631,21 +772,24 @@ void OGLTransitionImpl::makeRevolvingCircles( ::sal_uInt16 nCircles , ::sal_uInt LeavingSlide.pushTriangle(clamp(Radius*unScaledTexCoords[nPointsOnCircles - 1])/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0 + basegfx::B2DVector(0.5,0.5) , clamp(Radius*unScaledTexCoords[0])/2.0 + basegfx::B2DVector(0.5,0.5) ); basegfx::B3DVector axis(randNormVectorInXYPlane()); - EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, (LastRadius + dRadius)/2.0 , 1.0 ) ); - LeavingSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, (LastRadius + dRadius)/2.0 , 1.0 ) ); - EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , -180, false,0.0,1.0) ); + EnteringSlide.Operations.push_back( makeSRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, (LastRadius + dRadius)/2.0 , 1.0 ) ); + LeavingSlide.Operations.push_back( makeSRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, (LastRadius + dRadius)/2.0 , 1.0 ) ); + EnteringSlide.Operations.push_back( makeSRotate( axis , basegfx::B3DVector(0,0,0) , -180, false,0.0,1.0) ); - maEnteringSlidePrimitives.push_back(EnteringSlide); - maLeavingSlidePrimitives.push_back(LeavingSlide); + aEnteringSlide.push_back(EnteringSlide); + aLeavingSlide.push_back(LeavingSlide); } + + return makeSimpleTransition(aLeavingSlide, aEnteringSlide); } -void OGLTransitionImpl::makeHelix( ::sal_uInt16 nRows ) +boost::shared_ptr<OGLTransitionImpl> makeHelix( ::sal_uInt16 nRows ) { - clear(); double invN(1.0/static_cast<double>(nRows)); double iDn = 0.0; double iPDn = invN; + Primitives_t aLeavingSlide; + Primitives_t aEnteringSlide; for(unsigned int i(0); i < nRows; ++i) { Primitive Tile; @@ -654,28 +798,31 @@ void OGLTransitionImpl::makeHelix( ::sal_uInt16 nRows ) Tile.pushTriangle(basegfx::B2DVector( 1.0 , iPDn ) , basegfx::B2DVector( 1.0 , iDn ) , basegfx::B2DVector( 0.0 , iPDn )); - Tile.Operations.push_back( new SRotate( basegfx::B3DVector( 0 , 1 , 0 ) , ( Tile.getVertices()[1] + Tile.getVertices()[3] )/2.0 , 180 , + Tile.Operations.push_back( makeSRotate( basegfx::B3DVector( 0 , 1 , 0 ) , ( Tile.getVertices()[1] + Tile.getVertices()[3] )/2.0 , 180 , true,min(max(static_cast<double>(i - nRows/2.0)*invN/2.0,0.0),1.0), min(max(static_cast<double>(i + nRows/2.0)*invN/2.0,0.0),1.0) ) ); - maLeavingSlidePrimitives.push_back(Tile); + aLeavingSlide.push_back(Tile); - Tile.Operations.push_back( new SRotate( basegfx::B3DVector( 0 , 1 , 0 ) , ( Tile.getVertices()[1] + Tile.getVertices()[3] )/2.0 , -180 , false,0.0,1.0) ); + Tile.Operations.push_back( makeSRotate( basegfx::B3DVector( 0 , 1 , 0 ) , ( Tile.getVertices()[1] + Tile.getVertices()[3] )/2.0 , -180 , false,0.0,1.0) ); - maEnteringSlidePrimitives.push_back(Tile); + aEnteringSlide.push_back(Tile); iDn += invN; iPDn += invN; } + + return makeSimpleTransition(aLeavingSlide, aEnteringSlide); } -void OGLTransitionImpl::makeNByMTileFlip( ::sal_uInt16 n, ::sal_uInt16 m ) +boost::shared_ptr<OGLTransitionImpl> makeNByMTileFlip( ::sal_uInt16 n, ::sal_uInt16 m ) { - clear(); double invN(1.0/static_cast<double>(n)); double invM(1.0/static_cast<double>(m)); double iDn = 0.0; double iPDn = invN; + Primitives_t aLeavingSlide; + Primitives_t aEnteringSlide; for(unsigned int i(0); i < n; ++i) { double jDm = 0.0; @@ -688,11 +835,11 @@ void OGLTransitionImpl::makeNByMTileFlip( ::sal_uInt16 n, ::sal_uInt16 m ) Tile.pushTriangle(basegfx::B2DVector( iPDn , jPDm ) , basegfx::B2DVector( iPDn , jDm ) , basegfx::B2DVector( iDn , jPDm ));//bottom left corner of tile - Tile.Operations.push_back( new SRotate( basegfx::B3DVector( 1 , 1 , 0 ) , ( Tile.getVertices()[1] + Tile.getVertices()[3] )/2.0 , 180 , true, iDn*jDm/2.0 , ((iPDn*jPDm)+1.0)/2.0 ) ); - maLeavingSlidePrimitives.push_back(Tile); - Tile.Operations.push_back( new SRotate( basegfx::B3DVector( 1 , 1 , 0 ) , ( Tile.getVertices()[1] + Tile.getVertices()[3] )/2.0 , -180, false, iDn*jDm/2.0 , ((iPDn*jPDm)+1.0)/2.0 ) ); + Tile.Operations.push_back( makeSRotate( basegfx::B3DVector( 1 , 1 , 0 ) , ( Tile.getVertices()[1] + Tile.getVertices()[3] )/2.0 , 180 , true, iDn*jDm/2.0 , ((iPDn*jPDm)+1.0)/2.0 ) ); + aLeavingSlide.push_back(Tile); + Tile.Operations.push_back( makeSRotate( basegfx::B3DVector( 1 , 1 , 0 ) , ( Tile.getVertices()[1] + Tile.getVertices()[3] )/2.0 , -180, false, iDn*jDm/2.0 , ((iPDn*jPDm)+1.0)/2.0 ) ); - maEnteringSlidePrimitives.push_back(Tile); + aEnteringSlide.push_back(Tile); jDm += invM; jPDm += invM; @@ -700,6 +847,8 @@ void OGLTransitionImpl::makeNByMTileFlip( ::sal_uInt16 n, ::sal_uInt16 m ) iDn += invN; iPDn += invN; } + + return makeSimpleTransition(aLeavingSlide, aEnteringSlide); } SRotate::SRotate(const basegfx::B3DVector& Axis,const basegfx::B3DVector& Origin,double Angle, bool bInter, double T0, double T1):axis(Axis),origin(Origin),angle(Angle) @@ -738,12 +887,48 @@ STranslate::STranslate(const basegfx::B3DVector& Vector, bool bInter, double T0, bInterpolate = bInter; } +boost::shared_ptr<SRotate> +makeSRotate(const basegfx::B3DVector& Axis,const basegfx::B3DVector& Origin,double Angle,bool bInter, double T0, double T1) +{ + return make_shared<SRotate>(Axis, Origin, Angle, bInter, T0, T1); +} + +boost::shared_ptr<SScale> +makeSScale(const basegfx::B3DVector& Scale, const basegfx::B3DVector& Origin,bool bInter, double T0, double T1) +{ + return make_shared<SScale>(Scale, Origin, bInter, T0, T1); +} + +boost::shared_ptr<STranslate> +makeSTranslate(const basegfx::B3DVector& Vector,bool bInter, double T0, double T1) +{ + return make_shared<STranslate>(Vector, bInter, T0, T1); +} + +boost::shared_ptr<SEllipseTranslate> +makeSEllipseTranslate(double dWidth, double dHeight, double dStartPosition, double dEndPosition, bool bInter, double T0, double T1) +{ + return make_shared<SEllipseTranslate>(dWidth, dHeight, dStartPosition, dEndPosition, bInter, T0, T1); +} + +boost::shared_ptr<RotateAndScaleDepthByWidth> +makeRotateAndScaleDepthByWidth(const basegfx::B3DVector& Axis,const basegfx::B3DVector& Origin,double Angle,bool bInter, double T0, double T1) +{ + return make_shared<RotateAndScaleDepthByWidth>(Axis, Origin, Angle, bInter, T0, T1); +} + +boost::shared_ptr<RotateAndScaleDepthByHeight> +makeRotateAndScaleDepthByHeight(const basegfx::B3DVector& Axis,const basegfx::B3DVector& Origin,double Angle,bool bInter, double T0, double T1) +{ + return 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(double t,double SlideWidthScale,double SlideHeightScale) +void STranslate::interpolate(double t,double SlideWidthScale,double SlideHeightScale) const { if(t <= nT0) return; @@ -753,7 +938,7 @@ void STranslate::interpolate(double t,double SlideWidthScale,double SlideHeightS glTranslated(SlideWidthScale*t*vector.getX(),SlideHeightScale*t*vector.getY(),t*vector.getZ()); } -void SRotate::interpolate(double t,double SlideWidthScale,double SlideHeightScale) +void SRotate::interpolate(double t,double SlideWidthScale,double SlideHeightScale) const { if(t <= nT0) return; @@ -767,7 +952,7 @@ void SRotate::interpolate(double t,double SlideWidthScale,double SlideHeightScal glTranslated(-SlideWidthScale*origin.getX(),-SlideHeightScale*origin.getY(),-origin.getZ()); } -void SScale::interpolate(double t,double SlideWidthScale,double SlideHeightScale) +void SScale::interpolate(double t,double SlideWidthScale,double SlideHeightScale) const { if(t <= nT0) return; @@ -779,7 +964,7 @@ void SScale::interpolate(double t,double SlideWidthScale,double SlideHeightScale glTranslated(-SlideWidthScale*origin.getX(),-SlideHeightScale*origin.getY(),-origin.getZ()); } -void RotateAndScaleDepthByWidth::interpolate(double t,double SlideWidthScale,double SlideHeightScale) +void RotateAndScaleDepthByWidth::interpolate(double t,double SlideWidthScale,double SlideHeightScale) const { if(t <= nT0) return; @@ -791,7 +976,7 @@ void RotateAndScaleDepthByWidth::interpolate(double t,double SlideWidthScale,dou glTranslated(-SlideWidthScale*origin.getX(),-SlideHeightScale*origin.getY(),-SlideWidthScale*origin.getZ()); } -void RotateAndScaleDepthByHeight::interpolate(double t,double SlideWidthScale,double SlideHeightScale) +void RotateAndScaleDepthByHeight::interpolate(double t,double SlideWidthScale,double SlideHeightScale) const { if(t <= nT0) return; @@ -814,7 +999,7 @@ SEllipseTranslate::SEllipseTranslate(double dWidth, double dHeight, double dStar endPosition = dEndPosition; } -void SEllipseTranslate::interpolate(double t,double /* SlideWidthScale */,double /* SlideHeightScale */) +void SEllipseTranslate::interpolate(double t,double /* SlideWidthScale */,double /* SlideHeightScale */) const { if(t <= nT0) return; @@ -831,58 +1016,29 @@ void SEllipseTranslate::interpolate(double t,double /* SlideWidthScale */,double glTranslated(x, 0, y); } -STranslate* STranslate::clone() -{ - return new STranslate(*this); -} -SRotate* SRotate::clone() -{ - return new SRotate(*this); -} - -SScale* SScale::clone() -{ - return new SScale(*this); -} - -SEllipseTranslate* SEllipseTranslate::clone() -{ - return new SEllipseTranslate(*this); -} - -RotateAndScaleDepthByWidth* RotateAndScaleDepthByWidth::clone() +const Primitive& Primitive::operator=(const Primitive& rvalue) { - return new RotateAndScaleDepthByWidth(*this); + Primitive aTmp(rvalue); + swap(aTmp); + return *this; } -RotateAndScaleDepthByHeight* RotateAndScaleDepthByHeight::clone() +Primitive::Primitive(const Primitive& rvalue) + : Operations(rvalue.Operations) + , Vertices(rvalue.Vertices) + , Normals(rvalue.Normals) + , TexCoords(rvalue.TexCoords) { - return new RotateAndScaleDepthByHeight(*this); } -const Primitive& Primitive::operator=(const Primitive& rvalue) +void Primitive::swap(Primitive& rOther) { - for(unsigned int i( 0 ); i < rvalue.Operations.size(); ++i) - Operations.push_back(rvalue.Operations[i]->clone()); - for(unsigned int i( 0 ); i < rvalue.Vertices.size(); ++i)//SPEED! use copy or something. this is slow. - Vertices.push_back(rvalue.Vertices[i]); - for(unsigned int i( 0 ); i < rvalue.TexCoords.size(); ++i)//SPEED! use copy or something. this is slow. - TexCoords.push_back(rvalue.TexCoords[i]); - for(unsigned int i( 0 ); i < rvalue.Normals.size(); ++i)//SPEED! use copy or something. this is slow. - Normals.push_back(rvalue.Normals[i]); - return *this; -} + using std::swap; -Primitive::Primitive(const Primitive& rvalue) -{ - for(unsigned int i( 0 ); i < rvalue.Operations.size(); ++i) - Operations.push_back(rvalue.Operations[i]->clone()); - for(unsigned int i( 0 ); i < rvalue.Vertices.size(); ++i)//SPEED! use copy or something. this is slow. - Vertices.push_back(rvalue.Vertices[i]); - for(unsigned int i( 0 ); i < rvalue.TexCoords.size(); ++i)//SPEED! use copy or something. this is slow. - TexCoords.push_back(rvalue.TexCoords[i]); - for(unsigned int i( 0 ); i < rvalue.Normals.size(); ++i)//SPEED! use copy or something. this is slow. - Normals.push_back(rvalue.Normals[i]); + swap(Operations, rOther.Operations); + swap(Vertices, rOther.Vertices); + swap(Normals, rOther.Normals); + swap(TexCoords, rOther.TexCoords); } void Primitive::pushTriangle(const basegfx::B2DVector& SlideLocation0,const basegfx::B2DVector& SlideLocation1,const basegfx::B2DVector& SlideLocation2) @@ -928,20 +1084,29 @@ void Primitive::pushTriangle(const basegfx::B2DVector& SlideLocation0,const base Normals.push_back(basegfx::B3DVector(0,0,1));//all normals always face the screen when untransformed. } -void OGLTransitionImpl::makeDiamond() +namespace { - mmPrepare = &OGLTransitionImpl::prepareDiamond; - mbUseMipMapLeaving = mbUseMipMapEntering = false; -} -void OGLTransitionImpl::prepareDiamond( double nTime, double /* SlideWidth */, double /* SlideHeight */, double /* DispWidth */, double /* DispHeight */ ) +class DiamondTransition : public OGLTransitionImpl +{ +public: + DiamondTransition(const TransitionScene& rScene, const TransitionSettings& rSettings) + : OGLTransitionImpl(rScene, rSettings) + {} + +private: + virtual void prepare_( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ); + // mmPrepare = &OGLTransitionImpl::prepareDiamond; +}; + +void DiamondTransition::prepare_( double nTime, double /* SlideWidth */, double /* SlideHeight */, double /* DispWidth */, double /* DispHeight */ ) { Primitive Slide1, Slide2; Slide1.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1)); Slide1.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1)); - maEnteringSlidePrimitives.push_back (Slide1); - + Primitives_t aEnteringSlidePrimitives; + aEnteringSlidePrimitives.push_back (Slide1); if( nTime >= 0.5 ) { double m = 1 - nTime; @@ -963,56 +1128,93 @@ void OGLTransitionImpl::prepareDiamond( double nTime, double /* SlideWidth */, d Slide2.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (l,0.5), basegfx::B2DVector (0,1)); Slide2.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (0.5,l), basegfx::B2DVector (l,0.5)); } - Slide2.Operations.push_back (new STranslate (basegfx::B3DVector (0, 0, 0.00000001), false, -1, 0)); - maLeavingSlidePrimitives.push_back (Slide2); + Slide2.Operations.push_back (makeSTranslate (basegfx::B3DVector (0, 0, 0.00000001), false, -1, 0)); + Primitives_t aLeavingSlidePrimitives; + aLeavingSlidePrimitives.push_back (Slide2); + + setScene(TransitionScene(aLeavingSlidePrimitives, aEnteringSlidePrimitives)); +} + +shared_ptr<OGLTransitionImpl> +makeDiamondTransition(const TransitionSettings& rSettings) +{ + return make_shared<DiamondTransition>(TransitionScene(), rSettings); +} + +} + +boost::shared_ptr<OGLTransitionImpl> makeDiamond() +{ + TransitionSettings aSettings; + aSettings.mbUseMipMapLeaving = aSettings.mbUseMipMapEntering = false; + + return makeDiamondTransition(aSettings); } -void OGLTransitionImpl::makeVenetianBlinds( bool vertical, int parts ) +boost::shared_ptr<OGLTransitionImpl> makeVenetianBlinds( bool vertical, int parts ) { static double t30 = tan( M_PI/6.0 ); double n, ln = 0; double p = 1.0/parts; + Primitives_t aLeavingSlide; + Primitives_t aEnteringSlide; for( int i=0; i<parts; i++ ) { Primitive Slide; n = (i + 1)/(double)parts; if( vertical ) { Slide.pushTriangle (basegfx::B2DVector (ln,0), basegfx::B2DVector (n,0), basegfx::B2DVector (ln,1)); Slide.pushTriangle (basegfx::B2DVector (n,0), basegfx::B2DVector (ln,1), basegfx::B2DVector (n,1)); - Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0, 1, 0), basegfx::B3DVector(n + ln - 1, 0, -t30*p), -120, true, 0.0, 1.0)); + Slide.Operations.push_back(makeRotateAndScaleDepthByWidth(basegfx::B3DVector(0, 1, 0), basegfx::B3DVector(n + ln - 1, 0, -t30*p), -120, true, 0.0, 1.0)); } else { Slide.pushTriangle (basegfx::B2DVector (0,ln), basegfx::B2DVector (1,ln), basegfx::B2DVector (0,n)); Slide.pushTriangle (basegfx::B2DVector (1,ln), basegfx::B2DVector (0,n), basegfx::B2DVector (1,n)); - Slide.Operations.push_back(new RotateAndScaleDepthByHeight(basegfx::B3DVector(1, 0, 0), basegfx::B3DVector(0, 1 - n - ln, -t30*p), -120, true, 0.0, 1.0)); + Slide.Operations.push_back(makeRotateAndScaleDepthByHeight(basegfx::B3DVector(1, 0, 0), basegfx::B3DVector(0, 1 - n - ln, -t30*p), -120, true, 0.0, 1.0)); } - maLeavingSlidePrimitives.push_back (Slide); + aLeavingSlide.push_back (Slide); if( vertical ) { - Slide.Operations.push_back(new SRotate(basegfx::B3DVector(0, 1, 0), basegfx::B3DVector(2*n - 1, 0, 0), -60, false, -1, 0)); - Slide.Operations.push_back(new SRotate(basegfx::B3DVector(0, 1, 0), basegfx::B3DVector(n + ln - 1, 0, 0), 180, false, -1, 0)); + Slide.Operations.push_back(makeSRotate(basegfx::B3DVector(0, 1, 0), basegfx::B3DVector(2*n - 1, 0, 0), -60, false, -1, 0)); + Slide.Operations.push_back(makeSRotate(basegfx::B3DVector(0, 1, 0), basegfx::B3DVector(n + ln - 1, 0, 0), 180, false, -1, 0)); } else { - Slide.Operations.push_back(new SRotate(basegfx::B3DVector(1, 0, 0), basegfx::B3DVector(0, 1 - 2*n, 0), -60, false, -1, 0)); - Slide.Operations.push_back(new SRotate(basegfx::B3DVector(1, 0, 0), basegfx::B3DVector(0, 1 - n - ln, 0), 180, false, -1, 0)); + Slide.Operations.push_back(makeSRotate(basegfx::B3DVector(1, 0, 0), basegfx::B3DVector(0, 1 - 2*n, 0), -60, false, -1, 0)); + Slide.Operations.push_back(makeSRotate(basegfx::B3DVector(1, 0, 0), basegfx::B3DVector(0, 1 - n - ln, 0), 180, false, -1, 0)); } - maEnteringSlidePrimitives.push_back (Slide); + aEnteringSlide.push_back (Slide); ln = n; } + + return makeSimpleTransition(aLeavingSlide, aEnteringSlide); } -void OGLTransitionImpl::displaySlidesFadeSmoothly( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) +namespace +{ + +class FadeSmoothlyTransition : public OGLTransitionImpl +{ +public: + FadeSmoothlyTransition(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 ); +}; + +void FadeSmoothlyTransition::displaySlides_( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) { applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale ); glDisable(GL_DEPTH_TEST); - displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale ); + displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale ); glDisable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glColor4f( 1, 1, 1, nTime ); - displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale ); + displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale ); glDisable(GL_BLEND); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glEnable(GL_LIGHTING); @@ -1020,20 +1222,52 @@ void OGLTransitionImpl::displaySlidesFadeSmoothly( double nTime, ::sal_Int32 glL glEnable(GL_DEPTH_TEST); } -void OGLTransitionImpl::makeFadeSmoothly() +shared_ptr<OGLTransitionImpl> +makeFadeSmoothlyTransition( + const Primitives_t& rLeavingSlidePrimitives, + const Primitives_t& rEnteringSlidePrimitives, + const TransitionSettings& rSettings) +{ + return make_shared<FadeSmoothlyTransition>( + TransitionScene(rLeavingSlidePrimitives, rEnteringSlidePrimitives), + rSettings) + ; +} + +} + +boost::shared_ptr<OGLTransitionImpl> makeFadeSmoothly() { Primitive Slide; Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1)); Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1)); - maLeavingSlidePrimitives.push_back (Slide); - maEnteringSlidePrimitives.push_back (Slide); + Primitives_t aLeavingSlide; + aLeavingSlide.push_back (Slide); + Primitives_t aEnteringSlide; + aEnteringSlide.push_back (Slide); + + TransitionSettings aSettings; + aSettings.mbUseMipMapLeaving = aSettings.mbUseMipMapEntering = false; - mmDisplaySlides = &OGLTransitionImpl::displaySlidesFadeSmoothly; - mbUseMipMapLeaving = mbUseMipMapEntering = false; + return makeFadeSmoothlyTransition(aLeavingSlide, aEnteringSlide, aSettings); } -void OGLTransitionImpl::displaySlidesFadeThroughBlack( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) +namespace +{ + +class FadeThroughBlackTransition : public OGLTransitionImpl +{ +public: + FadeThroughBlackTransition(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 ); +}; + +void FadeThroughBlackTransition::displaySlides_( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ) { applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale ); @@ -1045,10 +1279,10 @@ void OGLTransitionImpl::displaySlidesFadeThroughBlack( double nTime, ::sal_Int32 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); if( nTime < 0.5 ) { glColor4f( 1, 1, 1, 1 - nTime*2 ); - displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale ); + displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale ); } else { glColor4f( 1, 1, 1, (nTime - 0.5)*2 ); - displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale ); + displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale ); } glDisable(GL_BLEND); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); @@ -1057,17 +1291,35 @@ void OGLTransitionImpl::displaySlidesFadeThroughBlack( double nTime, ::sal_Int32 glEnable(GL_DEPTH_TEST); } -void OGLTransitionImpl::makeFadeThroughBlack() +shared_ptr<OGLTransitionImpl> +makeFadeThroughBlackTransition( + const Primitives_t& rLeavingSlidePrimitives, + const Primitives_t& rEnteringSlidePrimitives, + const TransitionSettings& rSettings) +{ + return make_shared<FadeThroughBlackTransition>( + TransitionScene(rLeavingSlidePrimitives, rEnteringSlidePrimitives), + rSettings) + ; +} + +} + +boost::shared_ptr<OGLTransitionImpl> makeFadeThroughBlack() { Primitive Slide; Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1)); Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1)); - maLeavingSlidePrimitives.push_back (Slide); - maEnteringSlidePrimitives.push_back (Slide); + Primitives_t aLeavingSlide; + aLeavingSlide.push_back (Slide); + Primitives_t aEnteringSlide; + aEnteringSlide.push_back (Slide); + + TransitionSettings aSettings; + aSettings.mbUseMipMapLeaving = aSettings.mbUseMipMapEntering = false; - mmDisplaySlides = &OGLTransitionImpl::displaySlidesFadeThroughBlack; - mbUseMipMapLeaving = mbUseMipMapEntering = false; + return makeFadeThroughBlackTransition(aLeavingSlide, aEnteringSlide, aSettings); } static const char* basicVertexShader = "\n\ @@ -1138,6 +1390,73 @@ void main() {\n\ }\n\ "; +namespace +{ + +class ShaderTransition : public OGLTransitionImpl +{ +protected: + ShaderTransition(const TransitionScene& rScene, const TransitionSettings& rSettings) + : OGLTransitionImpl(rScene, rSettings) + , m_nProgramObject(0) + , m_nHelperTexture(0) + {} + +private: + virtual void displaySlides_( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ); + virtual void prepareTransition_( ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex ); + virtual void finishTransition_(); + virtual GLuint makeShader_() = 0; + + void impl_preparePermShader(); + +private: + /** GLSL program object + */ + GLuint m_nProgramObject; + + /** various data */ + GLuint m_nHelperTexture; +}; + +void ShaderTransition::displaySlides_( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, + double SlideWidthScale, double SlideHeightScale ) +{ + applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale ); + +#ifdef GL_VERSION_2_0 + if( m_nProgramObject ) { + GLint location = OGLShaders::glGetUniformLocation( m_nProgramObject, "time" ); + if( location != -1 ) { + OGLShaders::glUniform1f( location, nTime ); + } + } + + glActiveTexture( GL_TEXTURE2 ); + glBindTexture( GL_TEXTURE_2D, glEnteringSlideTex ); + glActiveTexture( GL_TEXTURE0 ); +#endif + + displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale ); +} + +void ShaderTransition::prepareTransition_( ::sal_Int32 /* glLeavingSlideTex */, ::sal_Int32 /* glEnteringSlideTex */ ) +{ + m_nProgramObject = makeShader_(); + + impl_preparePermShader(); +} + +void ShaderTransition::finishTransition_() +{ +#ifdef GL_VERSION_2_0 + if( m_nProgramObject ) { + OGLShaders::glDeleteProgram( m_nProgramObject ); + m_nProgramObject = 0; + } +#endif +} + int permutation256 [256]= { 215, 100, 200, 204, 233, 50, 85, 196, 71, 141, 122, 160, 93, 131, 243, 234, @@ -1195,28 +1514,28 @@ void initPermTexture(GLuint *texID) glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); } -void OGLTransitionImpl::preparePermShader() +void ShaderTransition::impl_preparePermShader() { #ifdef GL_VERSION_2_0 - if( mProgramObject ) { - OGLShaders::glUseProgram( mProgramObject ); + if( m_nProgramObject ) { + OGLShaders::glUseProgram( m_nProgramObject ); - GLint location = OGLShaders::glGetUniformLocation( mProgramObject, "leavingSlideTexture" ); + GLint location = OGLShaders::glGetUniformLocation( m_nProgramObject, "leavingSlideTexture" ); if( location != -1 ) { OGLShaders::glUniform1i( location, 0 ); // texture unit 0 } glActiveTexture(GL_TEXTURE1); - if( !maHelperTexture ) - initPermTexture( &maHelperTexture ); + if( !m_nHelperTexture ) + initPermTexture( &m_nHelperTexture ); glActiveTexture(GL_TEXTURE0); - location = OGLShaders::glGetUniformLocation( mProgramObject, "permTexture" ); + location = OGLShaders::glGetUniformLocation( m_nProgramObject, "permTexture" ); if( location != -1 ) { OGLShaders::glUniform1i( location, 1 ); // texture unit 1 } - location = OGLShaders::glGetUniformLocation( mProgramObject, "enteringSlideTexture" ); + location = OGLShaders::glGetUniformLocation( m_nProgramObject, "enteringSlideTexture" ); if( location != -1 ) { OGLShaders::glUniform1i( location, 2 ); // texture unit 2 } @@ -1224,93 +1543,151 @@ void OGLTransitionImpl::preparePermShader() #endif } -void OGLTransitionImpl::prepareStatic( ::sal_Int32 /* glLeavingSlideTex */, ::sal_Int32 /* glEnteringSlideTex */ ) -{ - mProgramObject = OGLShaders::LinkProgram( basicVertexShader, staticFragmentShader ); - - preparePermShader(); } -void OGLTransitionImpl::displaySlidesShaders( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, - double SlideWidthScale, double SlideHeightScale ) +namespace { - applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale ); -#ifdef GL_VERSION_2_0 - if( mProgramObject ) { - GLint location = OGLShaders::glGetUniformLocation( mProgramObject, "time" ); - if( location != -1 ) { - OGLShaders::glUniform1f( location, nTime ); - } - } +class StaticNoiseTransition : public ShaderTransition +{ +public: + StaticNoiseTransition(const TransitionScene& rScene, const TransitionSettings& rSettings) + : ShaderTransition(rScene, rSettings) + {} - glActiveTexture( GL_TEXTURE2 ); - glBindTexture( GL_TEXTURE_2D, glEnteringSlideTex ); - glActiveTexture( GL_TEXTURE0 ); -#endif +private: + virtual GLuint makeShader_(); +}; + +GLuint StaticNoiseTransition::makeShader_() +{ + return OGLShaders::LinkProgram( basicVertexShader, staticFragmentShader ); +} + +shared_ptr<OGLTransitionImpl> +makeStaticNoiseTransition( + const Primitives_t& rLeavingSlidePrimitives, + const Primitives_t& rEnteringSlidePrimitives, + const TransitionSettings& rSettings) +{ + return make_shared<StaticNoiseTransition>( + TransitionScene(rLeavingSlidePrimitives, rEnteringSlidePrimitives), + rSettings) + ; +} - displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale ); } -void OGLTransitionImpl::makeStatic() +boost::shared_ptr<OGLTransitionImpl> makeStatic() { Primitive Slide; Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1)); Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1)); - maLeavingSlidePrimitives.push_back (Slide); - maEnteringSlidePrimitives.push_back (Slide); + Primitives_t aLeavingSlide; + aLeavingSlide.push_back (Slide); + Primitives_t aEnteringSlide; + aEnteringSlide.push_back (Slide); + + TransitionSettings aSettings; + aSettings.mbUseMipMapLeaving = aSettings.mbUseMipMapEntering = false; + aSettings.mnRequiredGLVersion = 2.0; - mmDisplaySlides = &OGLTransitionImpl::displaySlidesShaders; - mmPrepareTransition = &OGLTransitionImpl::prepareStatic; - mbUseMipMapLeaving = mbUseMipMapEntering = false; + return makeStaticNoiseTransition(aLeavingSlide, aEnteringSlide, aSettings); +} + +namespace +{ + +class DissolveTransition : public ShaderTransition +{ +public: + DissolveTransition(const TransitionScene& rScene, const TransitionSettings& rSettings) + : ShaderTransition(rScene, rSettings) + {} + +private: + virtual GLuint makeShader_(); +}; - mnRequiredGLVersion = 2.0; +GLuint DissolveTransition::makeShader_() +{ + return OGLShaders::LinkProgram( basicVertexShader, dissolveFragmentShader ); } -void OGLTransitionImpl::prepareDissolve( ::sal_Int32 /* glLeavingSlideTex */, ::sal_Int32 /* glEnteringSlideTex */ ) +shared_ptr<OGLTransitionImpl> +makeDissolveTransition( + const Primitives_t& rLeavingSlidePrimitives, + const Primitives_t& rEnteringSlidePrimitives, + const TransitionSettings& rSettings) { - mProgramObject = OGLShaders::LinkProgram( basicVertexShader, dissolveFragmentShader ); + return make_shared<DissolveTransition>( + TransitionScene(rLeavingSlidePrimitives, rEnteringSlidePrimitives), + rSettings) + ; +} - preparePermShader(); } -void OGLTransitionImpl::makeDissolve() +boost::shared_ptr<OGLTransitionImpl> makeDissolve() { Primitive Slide; Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1)); Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1)); - maLeavingSlidePrimitives.push_back (Slide); - maEnteringSlidePrimitives.push_back (Slide); + Primitives_t aLeavingSlide; + aLeavingSlide.push_back (Slide); + Primitives_t aEnteringSlide; + aEnteringSlide.push_back (Slide); - mmDisplaySlides = &OGLTransitionImpl::displaySlidesShaders; - mmPrepareTransition = &OGLTransitionImpl::prepareDissolve; - mbUseMipMapLeaving = mbUseMipMapEntering = false; + TransitionSettings aSettings; + aSettings.mbUseMipMapLeaving = aSettings.mbUseMipMapEntering = false; + aSettings.mnRequiredGLVersion = 2.0; - mnRequiredGLVersion = 2.0; + return makeDissolveTransition(aLeavingSlide, aEnteringSlide, aSettings); } -void OGLTransitionImpl::makeNewsflash() +boost::shared_ptr<OGLTransitionImpl> makeNewsflash() { Primitive Slide; Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1)); Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1)); - Slide.Operations.push_back(new SRotate(basegfx::B3DVector(0,0,1),basegfx::B3DVector(0,0,0),3000,true,0,0.5)); - Slide.Operations.push_back(new SScale(basegfx::B3DVector(0.01,0.01,0.01),basegfx::B3DVector(0,0,0),true,0,0.5)); - Slide.Operations.push_back(new STranslate(basegfx::B3DVector(-10000, 0, 0),false, 0.5, 2)); - maLeavingSlidePrimitives.push_back(Slide); + Slide.Operations.push_back(makeSRotate(basegfx::B3DVector(0,0,1),basegfx::B3DVector(0,0,0),3000,true,0,0.5)); + Slide.Operations.push_back(makeSScale(basegfx::B3DVector(0.01,0.01,0.01),basegfx::B3DVector(0,0,0),true,0,0.5)); + Slide.Operations.push_back(makeSTranslate(basegfx::B3DVector(-10000, 0, 0),false, 0.5, 2)); + Primitives_t aLeavingSlide; + aLeavingSlide.push_back(Slide); Slide.Operations.clear(); - Slide.Operations.push_back(new SRotate(basegfx::B3DVector(0,0,1),basegfx::B3DVector(0,0,0),-3000,true,0.5,1)); - Slide.Operations.push_back(new STranslate(basegfx::B3DVector(-100, 0, 0),false, -1, 1)); - Slide.Operations.push_back(new STranslate(basegfx::B3DVector(100, 0, 0),false, 0.5, 1)); - Slide.Operations.push_back(new SScale(basegfx::B3DVector(0.01,0.01,0.01),basegfx::B3DVector(0,0,0),false,-1,1)); - Slide.Operations.push_back(new SScale(basegfx::B3DVector(100,100,100),basegfx::B3DVector(0,0,0),true,0.5,1)); - maEnteringSlidePrimitives.push_back(Slide); - - OverallOperations.push_back(new SRotate(basegfx::B3DVector(0,0,1),basegfx::B3DVector(0.2,0.2,0),1080,true,0,1)); + Slide.Operations.push_back(makeSRotate(basegfx::B3DVector(0,0,1),basegfx::B3DVector(0,0,0),-3000,true,0.5,1)); + Slide.Operations.push_back(makeSTranslate(basegfx::B3DVector(-100, 0, 0),false, -1, 1)); + Slide.Operations.push_back(makeSTranslate(basegfx::B3DVector(100, 0, 0),false, 0.5, 1)); + Slide.Operations.push_back(makeSScale(basegfx::B3DVector(0.01,0.01,0.01),basegfx::B3DVector(0,0,0),false,-1,1)); + Slide.Operations.push_back(makeSScale(basegfx::B3DVector(100,100,100),basegfx::B3DVector(0,0,0),true,0.5,1)); + Primitives_t aEnteringSlide; + aEnteringSlide.push_back(Slide); + + Operations_t aOverallOperations; + aOverallOperations.push_back(makeSRotate(basegfx::B3DVector(0,0,1),basegfx::B3DVector(0.2,0.2,0),1080,true,0,1)); + + return makeSimpleTransition(aLeavingSlide, aEnteringSlide, aOverallOperations); +} + +namespace +{ + +/** various transitions helper methods + */ +void prepareDiamond( double nTime, double SlideWidth, double SlideHeight,double DispWidth, double DispHeight ); +void displaySlidesFadeSmoothly( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ); + void displaySlidesFadeThroughBlack( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ); + void displaySlidesRochade( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ); +void displaySlidesShaders( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale ); +void prepareStatic( ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex ); +void prepareDissolve( ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex ); +void preparePermShader(); + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |