summaryrefslogtreecommitdiff
path: root/slideshow/source/engine/OGLTrans/win/OGLTrans_TransitionImpl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'slideshow/source/engine/OGLTrans/win/OGLTrans_TransitionImpl.cxx')
-rw-r--r--slideshow/source/engine/OGLTrans/win/OGLTrans_TransitionImpl.cxx1315
1 files changed, 0 insertions, 1315 deletions
diff --git a/slideshow/source/engine/OGLTrans/win/OGLTrans_TransitionImpl.cxx b/slideshow/source/engine/OGLTrans/win/OGLTrans_TransitionImpl.cxx
deleted file mode 100644
index d658d54b7..000000000
--- a/slideshow/source/engine/OGLTrans/win/OGLTrans_TransitionImpl.cxx
+++ /dev/null
@@ -1,1315 +0,0 @@
-/* -*- 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 2008 by Sun Microsystems, Inc.
- *
- * 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 "OGLTrans_TransitionImpl.hxx"
-#include "OGLTrans_Shaders.hxx"
-#ifdef QUARTZ
-#include <OpenGL/gl.h>
-#else
-#include <GL/gl.h>
-#include <math.h>
-#endif
-
-void OGLTransitionImpl::clear()
-{
- 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;
-
-#ifdef GL_VERSION_2_0
- if( mProgramObject ) {
- OGLShaders::glDeleteProgram( mProgramObject );
- mProgramObject = 0;
- }
-
- if( mVertexObject ) {
- OGLShaders::glDeleteShader( mVertexObject );
- mVertexObject = 0;
- }
-
- if( mFragmentObject ) {
- OGLShaders::glDeleteShader( mFragmentObject );
- mFragmentObject = 0;
- }
-#endif
-
- if( maHelperTexture ) {
- glDeleteTextures( 1, &maHelperTexture );
- maHelperTexture = 0;
- }
-
- if( mmClearTransition )
- (this->*mmClearTransition)();
-}
-
-OGLTransitionImpl::~OGLTransitionImpl()
-{
- clear();
-}
-
-void OGLTransitionImpl::prepare( ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex )
-{
- for(unsigned int i(0); i < maSceneObjects.size(); ++i) {
- maSceneObjects[i]->prepare();
- }
-
- if( mmPrepareTransition )
- (this->*mmPrepareTransition)( glLeavingSlideTex, glEnteringSlideTex );
-}
-
-void OGLTransitionImpl::finish()
-{
- for(unsigned int i(0); i < maSceneObjects.size(); ++i) {
- maSceneObjects[i]->finish();
- }
-}
-
-static void blendSlide( double depth )
-{
- double showHeight = -1 + depth*2;
- GLfloat reflectionColor[] = {0, 0, 0, 0.25};
-
- glDisable( GL_DEPTH_TEST );
- glBegin( GL_QUADS );
- glColor4fv( reflectionColor );
- glVertex3f( -1, -1, 0 );
- glColor4f( 0, 0, 0, 1 );
- glVertex3f(-1, showHeight, 0 );
- glVertex3f( 1, showHeight, 0 );
- glColor4fv( reflectionColor );
- glVertex3f( 1, -1, 0 );
- glEnd();
-
- glBegin( GL_QUADS );
- glColor4f( 0, 0, 0, 1 );
- glVertex3f( -1, showHeight, 0 );
- glVertex3f( -1, 1, 0 );
- glVertex3f( 1, 1, 0 );
- glVertex3f( 1, showHeight, 0 );
- glEnd();
- glEnable( GL_DEPTH_TEST );
-}
-
-static void slideShadow( double nTime, Primitive& primitive, double sw, double sh )
-{
- double reflectionDepth = 0.3;
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glDisable(GL_LIGHTING);
-
- glPushMatrix();
- primitive.applyOperations( nTime, sw, sh );
- blendSlide( reflectionDepth );
- glPopMatrix();
-
- glDisable(GL_BLEND);
- glEnable(GL_LIGHTING);
-}
-
-void OGLTransitionImpl::display( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex,
- double SlideWidth, double SlideHeight, double DispWidth, double DispHeight )
-{
- double SlideWidthScale, SlideHeightScale;
-
- SlideWidthScale = SlideWidth/DispWidth;
- SlideHeightScale = SlideHeight/DispHeight;
-
- if( mmPrepare ) {
- clear();
- (this->*mmPrepare)( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight );
- }
-
- glPushMatrix();
- 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);
-}
-
-void OGLTransitionImpl::displaySlide( double nTime, ::sal_Int32 glSlideTex, std::vector<Primitive>& primitives,
- double SlideWidthScale, double SlideHeightScale )
-{
- //TODO change to foreach
- glBindTexture(GL_TEXTURE_2D, glSlideTex);
-
- // 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 ) {
- double surfaceLevel = -0.04;
-
- /* reflected slides */
- glPushMatrix();
-
- glScaled( 1, -1, 1 );
- glTranslated( 0, 2 - surfaceLevel, 0 );
-
- glCullFace(GL_FRONT);
- for(unsigned int i(0); i < primitives.size(); ++i)
- primitives[i].display(nTime, SlideWidthScale, SlideHeightScale);
- glCullFace(GL_BACK);
-
- slideShadow( nTime, primitives[0], SlideWidthScale, SlideHeightScale );
-
- glPopMatrix();
- }
-
- for(unsigned int i(0); i < primitives.size(); ++i)
- 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 )
-{
- glEnable(GL_TEXTURE_2D);
- for(unsigned int i(0); i < maSceneObjects.size(); ++i)
- maSceneObjects[i]->display(nTime, SlideWidth, SlideHeight, DispWidth, DispHeight);
-}
-
-void Primitive::display(double nTime, double WidthScale, double HeightScale)
-{
- glPushMatrix();
-
- applyOperations( nTime, WidthScale, HeightScale );
-
- glEnableClientState( GL_VERTEX_ARRAY );
- if(!Normals.empty())
- {
- glNormalPointer( GL_DOUBLE , 0 , &Normals[0] );
- glEnableClientState( GL_NORMAL_ARRAY );
- }
- glEnableClientState( GL_TEXTURE_COORD_ARRAY );
- glTexCoordPointer( 2, GL_DOUBLE, 0, &TexCoords[0] );
- glVertexPointer( 3, GL_DOUBLE, 0, &Vertices[0] );
- glDrawArrays( GL_TRIANGLES, 0, Vertices.size() );
- glPopMatrix();
-}
-
-void Primitive::applyOperations(double nTime, double WidthScale, double HeightScale)
-{
- 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 )
-{
- for(unsigned int i(0); i < maPrimitives.size(); ++i) {
- // fixme: allow various model spaces, now we make it so that
- // it is regular -1,-1 to 1,1, where the whole display fits in
- glPushMatrix();
- if (DispHeight > DispWidth)
- glScaled(DispHeight/DispWidth, 1, 1);
- else
- glScaled(1, DispWidth/DispHeight, 1);
- maPrimitives[i].display(nTime, 1, 1);
- glPopMatrix();
- }
-}
-
-void SceneObject::pushPrimitive(const Primitive &p)
-{
- maPrimitives.push_back(p);
-}
-
-SceneObject::SceneObject()
- : maPrimitives()
-{
-}
-
-Iris::Iris()
- : SceneObject ()
-{
-}
-
-void Iris::display(double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight )
-{
- glBindTexture(GL_TEXTURE_2D, maTexture);
- SceneObject::display(nTime, SlideWidth, SlideHeight, DispWidth, DispHeight);
-}
-
-void Iris::prepare()
-{
- static GLubyte img[3] = { 80, 80, 80 };
-
- glGenTextures(1, &maTexture);
- glBindTexture(GL_TEXTURE_2D, maTexture);
- glTexImage2D(GL_TEXTURE_2D, 0, 3, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, img);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
-}
-
-void Iris::finish()
-{
- glDeleteTextures(1, &maTexture);
-}
-
-void 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);
-
- Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,-1),90,false,0.0,1.0));
-
- maEnteringSlidePrimitives.push_back(Slide);
-
- OverallOperations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,-1),-90,true,0.0,1.0));
-}
-
-void 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);
-
- Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,1),-90,false,0.0,1.0));
-
- maEnteringSlidePrimitives.push_back(Slide);
-
- OverallOperations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,1),90,true,0.0,1.0));
-}
-
-void 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);
-
- mbUseMipMapEntering = false;
-}
-
-void OGLTransitionImpl::makeTurnAround()
-{
- clear();
- Primitive Slide;
-
- 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);
-
- 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);
-
- 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));
-}
-
-void 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);
-
- 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);
-
- mbUseMipMapLeaving = false;
-}
-
-void 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);
-
- 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);
-
-
- Primitive irisPart, part;
- int i, nSteps = 24, nParts = 7;
- double t = 1.0/nSteps, cx, cy, lcx, lcy, lx = 1, ly = 0, x, y, cxo, cyo, lcxo, lcyo, of=2.2, f=1.42;
-
- for (i=1; i<=nSteps; i++) {
- x = cos ((3*2*M_PI*t)/nParts);
- y = -sin ((3*2*M_PI*t)/nParts);
- cx = (f*x + 1)/2;
- cy = (f*y + 1)/2;
- lcx = (f*lx + 1)/2;
- lcy = (f*ly + 1)/2;
- cxo = (of*x + 1)/2;
- cyo = (of*y + 1)/2;
- lcxo = (of*lx + 1)/2;
- lcyo = (of*ly + 1)/2;
- irisPart.pushTriangle (basegfx::B2DVector (lcx, lcy),
- basegfx::B2DVector (lcxo, lcyo),
- basegfx::B2DVector (cx, cy));
- irisPart.pushTriangle (basegfx::B2DVector (cx, cy),
- basegfx::B2DVector (lcxo, lcyo),
- basegfx::B2DVector (cxo, cyo));
- lx = x;
- ly = y;
- t += 1.0/nSteps;
- }
-
- Iris* pIris = new Iris();
- double angle = 87;
-
- for (i = 0; i < nParts; i++) {
- irisPart.Operations.clear ();
- double rx, ry;
-
- 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));
- 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(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));
- pIris->pushPrimitive (irisPart);
- }
-
- maSceneObjects.push_back (pIris);
-
- mbUseMipMapLeaving = mbUseMipMapEntering = false;
-}
-
-void OGLTransitionImpl::displaySlidesRochade( 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 );
- } else {
- displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale );
- displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale );
- }
-}
-
-void OGLTransitionImpl::makeRochade()
-{
- clear();
- Primitive Slide;
-
- mbReflectSlides = true;
- mmDisplaySlides = &OGLTransitionImpl::displaySlidesRochade;
-
- double w, h;
-
- w = 2.2;
- h = 10;
-
- 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.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);
-
-}
-
-// TODO(Q3): extract to basegfx
-inline basegfx::B2DVector clamp(const basegfx::B2DVector& v)
-{
- return basegfx::B2DVector(min(max(v.getX(),-1.0),1.0),
- min(max(v.getY(),-1.0),1.0));
-}
-
-// TODO(Q3): extract to basegfx
-inline basegfx::B3DVector clamp(const basegfx::B3DVector& v)
-{
- return basegfx::B3DVector(min(max(v.getX(),-1.0),1.0),
- min(max(v.getY(),-1.0),1.0),
- min(max(v.getZ(),-1.0),1.0));
-}
-
-inline double randFromNeg1to1()
-{
- return ( ( static_cast<double>( rand() ) / static_cast<double>( RAND_MAX ) ) * 2.0 ) - 1.0;
-}
-
-// TODO(Q3): extract to basegfx
-inline basegfx::B3DVector randNormVectorInXYPlane()
-{
- basegfx::B3DVector toReturn(randFromNeg1to1(),randFromNeg1to1(),0.0);
- return toReturn/toReturn.getLength();
-}
-
-void 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;
- }
- double Radius(1.0/static_cast<double>( nCircles ));
- double dRadius(Radius);
- double LastRadius(0.0);
- double NextRadius(2*Radius);
-
- /// now we know there is at least two circles
- /// the first will always be a full circle
- /// the last will always be the outer shell of the slide with a circle hole
-
- //add the full circle
- vector<basegfx::B2DVector> unScaledTexCoords;
- double TempAngle(0.0);
- for(unsigned int Point(0); Point < nPointsOnCircles; ++Point)
- {
- unScaledTexCoords.push_back( basegfx::B2DVector( cos(TempAngle - 3.1415926/2.0) , sin(TempAngle- 3.1415926/2.0) ) );
-
- TempAngle += dAngle;
- }
-
- {
- Primitive EnteringSlide;
- Primitive LeavingSlide;
- for(int Point(0); Point + 1 < nPointsOnCircles; ++Point)
- {
- EnteringSlide.pushTriangle( basegfx::B2DVector( 0.5 , 0.5 ) , Radius * unScaledTexCoords[ Point + 1 ] / 2.0 + basegfx::B2DVector( 0.5 , 0.5 ) , Radius * unScaledTexCoords[ Point ] / 2.0 + basegfx::B2DVector( 0.5 , 0.5 ) );
- LeavingSlide.pushTriangle( basegfx::B2DVector( 0.5 , 0.5 ) , Radius * unScaledTexCoords[ Point + 1 ] / 2.0 + basegfx::B2DVector( 0.5 , 0.5 ) , Radius * unScaledTexCoords[ Point ] / 2.0 + basegfx::B2DVector( 0.5, 0.5) );
- }
- EnteringSlide.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 ) );
- 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) );
-
- maEnteringSlidePrimitives.push_back(EnteringSlide);
- maLeavingSlidePrimitives.push_back(LeavingSlide);
- LastRadius = Radius;
- Radius = NextRadius;
- NextRadius += dRadius;
- }
-
- for(int i(1); i < nCircles - 1; ++i)
- {
- Primitive LeavingSlide;
- Primitive EnteringSlide;
- for(int Side(0); Side < nPointsOnCircles - 1; ++Side)
- {
- EnteringSlide.pushTriangle(Radius*unScaledTexCoords[Side]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0 + basegfx::B2DVector(0.5,0.5) );
- EnteringSlide.pushTriangle(Radius*unScaledTexCoords[Side]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0 + basegfx::B2DVector(0.5,0.5) , Radius*unScaledTexCoords[Side + 1]/2.0 + basegfx::B2DVector(0.5,0.5) );
-
- LeavingSlide.pushTriangle(Radius*unScaledTexCoords[Side]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0 + basegfx::B2DVector(0.5,0.5) );
- LeavingSlide.pushTriangle(Radius*unScaledTexCoords[Side]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0 + basegfx::B2DVector(0.5,0.5) , Radius*unScaledTexCoords[Side + 1]/2.0 + basegfx::B2DVector(0.5,0.5) );
- }
-
- EnteringSlide.pushTriangle(Radius*unScaledTexCoords[nPointsOnCircles - 1]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[nPointsOnCircles - 1]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0 + basegfx::B2DVector(0.5,0.5) );
- EnteringSlide.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) );
-
- LeavingSlide.pushTriangle(Radius*unScaledTexCoords[nPointsOnCircles - 1]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[nPointsOnCircles - 1]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0 + basegfx::B2DVector(0.5,0.5) );
- 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) );
-
- maEnteringSlidePrimitives.push_back(EnteringSlide);
- maLeavingSlidePrimitives.push_back(LeavingSlide);
-
- LastRadius = Radius;
- Radius = NextRadius;
- NextRadius += dRadius;
- }
- {
- Radius = sqrt(2.0);
- Primitive LeavingSlide;
- Primitive EnteringSlide;
- for(int Side(0); Side < nPointsOnCircles - 1; ++Side)
- {
-
- EnteringSlide.pushTriangle(clamp(Radius*unScaledTexCoords[Side])/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0 + basegfx::B2DVector(0.5,0.5) );
- EnteringSlide.pushTriangle(clamp(Radius*unScaledTexCoords[Side])/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0 + basegfx::B2DVector(0.5,0.5) , clamp(Radius*unScaledTexCoords[Side + 1])/2.0 + basegfx::B2DVector(0.5,0.5) );
-
- LeavingSlide.pushTriangle(clamp(Radius*unScaledTexCoords[Side])/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0 + basegfx::B2DVector(0.5,0.5) );
- LeavingSlide.pushTriangle(clamp(Radius*unScaledTexCoords[Side])/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0 + basegfx::B2DVector(0.5,0.5) , clamp(Radius*unScaledTexCoords[Side + 1])/2.0 + basegfx::B2DVector(0.5,0.5) );
- }
-
- EnteringSlide.pushTriangle(clamp(Radius*unScaledTexCoords[nPointsOnCircles - 1])/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[nPointsOnCircles - 1]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0 + basegfx::B2DVector(0.5,0.5) );
- EnteringSlide.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) );
-
- LeavingSlide.pushTriangle(clamp(Radius*unScaledTexCoords[nPointsOnCircles - 1])/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[nPointsOnCircles - 1]/2.0 + basegfx::B2DVector(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0 + basegfx::B2DVector(0.5,0.5) );
- 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) );
-
- maEnteringSlidePrimitives.push_back(EnteringSlide);
- maLeavingSlidePrimitives.push_back(LeavingSlide);
- }
-}
-
-void OGLTransitionImpl::makeHelix( ::sal_uInt16 nRows )
-{
- clear();
- double invN(1.0/static_cast<double>(nRows));
- double iDn = 0.0;
- double iPDn = invN;
- for(unsigned int i(0); i < nRows; ++i)
- {
- Primitive Tile;
-
- Tile.pushTriangle(basegfx::B2DVector( 1.0 , iDn ) , basegfx::B2DVector( 0.0 , iDn ) , basegfx::B2DVector( 0.0 , iPDn ));
-
- 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 ,
- 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);
-
- 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) );
-
- maEnteringSlidePrimitives.push_back(Tile);
-
- iDn += invN;
- iPDn += invN;
- }
-}
-
-void 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;
- for(unsigned int i(0); i < n; ++i)
- {
- double jDm = 0.0;
- double jPDm = invM;
- for(unsigned int j(0); j < m; ++j)
- {
- Primitive Tile;
-
- Tile.pushTriangle(basegfx::B2DVector( iPDn , jDm ) , basegfx::B2DVector( iDn , jDm ) , basegfx::B2DVector( iDn , jPDm ));
-
- 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 ) );
-
- maEnteringSlidePrimitives.push_back(Tile);
-
- jDm += invM;
- jPDm += invM;
- }
- iDn += invN;
- iPDn += invN;
- }
-}
-
-SRotate::SRotate(const basegfx::B3DVector& Axis,const basegfx::B3DVector& Origin,double Angle, bool bInter, double T0, double T1):axis(Axis),origin(Origin),angle(Angle)
-{
- nT0 = T0;
- nT1 = T1;
- bInterpolate = bInter;
-}
-
-SScale::SScale(const basegfx::B3DVector& Scale,const basegfx::B3DVector& Origin, bool bInter, double T0, double T1):scale(Scale),origin(Origin)
-{
- nT0 = T0;
- nT1 = T1;
- bInterpolate = bInter;
-}
-
-RotateAndScaleDepthByWidth::RotateAndScaleDepthByWidth(const basegfx::B3DVector& Axis,const basegfx::B3DVector& Origin,double Angle, bool bInter, double T0, double T1):axis(Axis),origin(Origin),angle(Angle)
-{
- nT0 = T0;
- nT1 = T1;
- bInterpolate = bInter;
-}
-
-RotateAndScaleDepthByHeight::RotateAndScaleDepthByHeight(const basegfx::B3DVector& Axis,const basegfx::B3DVector& Origin,double Angle, bool bInter, double T0, double T1):axis(Axis),origin(Origin),angle(Angle)
-{
- nT0 = T0;
- nT1 = T1;
- bInterpolate = bInter;
-}
-
-
-STranslate::STranslate(const basegfx::B3DVector& Vector, bool bInter, double T0, double T1):vector(Vector)
-{
- nT0 = T0;
- nT1 = T1;
- bInterpolate = bInter;
-}
-
-inline double intervalInter(double t, double T0, double T1)
-{
- return ( t - T0 ) / ( T1 - T0 );
-}
-
-void STranslate::interpolate(double t,double SlideWidthScale,double SlideHeightScale)
-{
- if(t <= nT0)
- return;
- if(!bInterpolate || t > nT1)
- t = nT1;
- t = intervalInter(t,nT0,nT1);
- glTranslated(SlideWidthScale*t*vector.getX(),SlideHeightScale*t*vector.getY(),t*vector.getZ());
-}
-
-void SRotate::interpolate(double t,double SlideWidthScale,double SlideHeightScale)
-{
- if(t <= nT0)
- return;
- if(!bInterpolate || t > nT1)
- t = nT1;
- t = intervalInter(t,nT0,nT1);
- glTranslated(SlideWidthScale*origin.getX(),SlideHeightScale*origin.getY(),origin.getZ());
- glScaled(SlideWidthScale,SlideHeightScale,1);
- glRotated(t*angle,axis.getX(),axis.getY(),axis.getZ());
- glScaled(1/SlideWidthScale,1/SlideHeightScale,1);
- glTranslated(-SlideWidthScale*origin.getX(),-SlideHeightScale*origin.getY(),-origin.getZ());
-}
-
-void SScale::interpolate(double t,double SlideWidthScale,double SlideHeightScale)
-{
- if(t <= nT0)
- return;
- if(!bInterpolate || t > nT1)
- t = nT1;
- t = intervalInter(t,nT0,nT1);
- glTranslated(SlideWidthScale*origin.getX(),SlideHeightScale*origin.getY(),origin.getZ());
- glScaled((1-t) + t*scale.getX(),(1-t) + t*scale.getY(),(1-t) + t*scale.getZ());
- glTranslated(-SlideWidthScale*origin.getX(),-SlideHeightScale*origin.getY(),-origin.getZ());
-}
-
-void RotateAndScaleDepthByWidth::interpolate(double t,double SlideWidthScale,double SlideHeightScale)
-{
- if(t <= nT0)
- return;
- if(!bInterpolate || t > nT1)
- t = nT1;
- t = intervalInter(t,nT0,nT1);
- glTranslated(SlideWidthScale*origin.getX(),SlideHeightScale*origin.getY(),SlideWidthScale*origin.getZ());
- glRotated(t*angle,axis.getX(),axis.getY(),axis.getZ());
- glTranslated(-SlideWidthScale*origin.getX(),-SlideHeightScale*origin.getY(),-SlideWidthScale*origin.getZ());
-}
-
-void RotateAndScaleDepthByHeight::interpolate(double t,double SlideWidthScale,double SlideHeightScale)
-{
- if(t <= nT0)
- return;
- if(!bInterpolate || t > nT1)
- t = nT1;
- t = intervalInter(t,nT0,nT1);
- glTranslated(SlideWidthScale*origin.getX(),SlideHeightScale*origin.getY(),SlideHeightScale*origin.getZ());
- glRotated(t*angle,axis.getX(),axis.getY(),axis.getZ());
- glTranslated(-SlideWidthScale*origin.getX(),-SlideHeightScale*origin.getY(),-SlideHeightScale*origin.getZ());
-}
-
-SEllipseTranslate::SEllipseTranslate(double dWidth, double dHeight, double dStartPosition, double dEndPosition, bool bInter, double T0, double T1)
-{
- nT0 = T0;
- nT1 = T1;
- bInterpolate = bInter;
- width = dWidth;
- height = dHeight;
- startPosition = dStartPosition;
- endPosition = dEndPosition;
-}
-
-void SEllipseTranslate::interpolate(double t,double /* SlideWidthScale */,double /* SlideHeightScale */)
-{
- if(t <= nT0)
- return;
- if(!bInterpolate || t > nT1)
- t = nT1;
- t = intervalInter(t,nT0,nT1);
-
- 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;
-
- 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()
-{
- return new RotateAndScaleDepthByWidth(*this);
-}
-
-RotateAndScaleDepthByHeight* RotateAndScaleDepthByHeight::clone()
-{
- return new RotateAndScaleDepthByHeight(*this);
-}
-
-const Primitive& Primitive::operator=(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]);
- return *this;
-}
-
-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]);
-}
-
-void Primitive::pushTriangle(const basegfx::B2DVector& SlideLocation0,const basegfx::B2DVector& SlideLocation1,const basegfx::B2DVector& SlideLocation2)
-{
- vector<basegfx::B3DVector> Verts;
- vector<basegfx::B2DVector> Texs;
- Verts.reserve(3);
- Texs.reserve(3);
-
- Verts.push_back(basegfx::B3DVector( 2*SlideLocation0.getX() - 1, -2*SlideLocation0.getY() + 1 , 0.0 ));
- Verts.push_back(basegfx::B3DVector( 2*SlideLocation1.getX() - 1, -2*SlideLocation1.getY() + 1 , 0.0 ));
- Verts.push_back(basegfx::B3DVector( 2*SlideLocation2.getX() - 1, -2*SlideLocation2.getY() + 1 , 0.0 ));
-
- //figure out if they're facing the correct way, and make them face the correct way.
- basegfx::B3DVector Normal( basegfx::cross( Verts[0] - Verts[1] , Verts[1] - Verts[2] ) );
- if(Normal.getZ() >= 0.0)//if the normal is facing us
- {
- Texs.push_back(SlideLocation0);
- Texs.push_back(SlideLocation1);
- Texs.push_back(SlideLocation2);
- }
- else // if the normal is facing away from us, make it face us
- {
- Texs.push_back(SlideLocation0);
- Texs.push_back(SlideLocation2);
- Texs.push_back(SlideLocation1);
- Verts.clear();
- Verts.push_back(basegfx::B3DVector( 2*SlideLocation0.getX() - 1, -2*SlideLocation0.getY() + 1 , 0.0 ));
- Verts.push_back(basegfx::B3DVector( 2*SlideLocation2.getX() - 1, -2*SlideLocation2.getY() + 1 , 0.0 ));
- Verts.push_back(basegfx::B3DVector( 2*SlideLocation1.getX() - 1, -2*SlideLocation1.getY() + 1 , 0.0 ));
- }
-
- Vertices.push_back(Verts[0]);
- Vertices.push_back(Verts[1]);
- Vertices.push_back(Verts[2]);
-
- TexCoords.push_back(Texs[0]);
- TexCoords.push_back(Texs[1]);
- TexCoords.push_back(Texs[2]);
-
- Normals.push_back(basegfx::B3DVector(0,0,1));//all normals always face the screen when untransformed.
- Normals.push_back(basegfx::B3DVector(0,0,1));//all normals always face the screen when untransformed.
- Normals.push_back(basegfx::B3DVector(0,0,1));//all normals always face the screen when untransformed.
-}
-
-void OGLTransitionImpl::makeDiamond()
-{
- mmPrepare = &OGLTransitionImpl::prepareDiamond;
- mbUseMipMapLeaving = mbUseMipMapEntering = false;
-}
-
-void OGLTransitionImpl::prepareDiamond( 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);
-
-
- if( nTime >= 0.5 ) {
- double m = 1 - nTime;
-
- Slide2.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (m,0), basegfx::B2DVector (0,m));
- Slide2.pushTriangle (basegfx::B2DVector (nTime,0), basegfx::B2DVector (1,0), basegfx::B2DVector (1,m));
- Slide2.pushTriangle (basegfx::B2DVector (1,nTime), basegfx::B2DVector (1,1), basegfx::B2DVector (nTime,1));
- Slide2.pushTriangle (basegfx::B2DVector (0,nTime), basegfx::B2DVector (m,1), basegfx::B2DVector (0,1));
- } else {
- double l = 0.5 - nTime;
- double h = 0.5 + nTime;
-
- Slide2.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0.5,l));
- Slide2.pushTriangle (basegfx::B2DVector (0.5,l), basegfx::B2DVector (1,0), basegfx::B2DVector (h,0.5));
- Slide2.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (1,1), basegfx::B2DVector (h,0.5));
- Slide2.pushTriangle (basegfx::B2DVector (h,0.5), basegfx::B2DVector (1,1), basegfx::B2DVector (0.5,h));
- Slide2.pushTriangle (basegfx::B2DVector (0.5,h), basegfx::B2DVector (1,1), basegfx::B2DVector (0,1));
- Slide2.pushTriangle (basegfx::B2DVector (l,0.5), basegfx::B2DVector (0.5,h), basegfx::B2DVector (0,1));
- 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);
-}
-
-void OGLTransitionImpl::makeVenetianBlinds( bool vertical, int parts )
-{
- static double t30 = tan( M_PI/6.0 );
- double n, ln = 0;
- double p = 1.0/parts;
-
- 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));
- } 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));
- }
- maLeavingSlidePrimitives.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));
- } 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));
- }
- maEnteringSlidePrimitives.push_back (Slide);
- ln = n;
- }
-}
-
-void OGLTransitionImpl::displaySlidesFadeSmoothly( 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 );
-
- 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 );
- glDisable(GL_BLEND);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- glEnable(GL_LIGHTING);
-
- glEnable(GL_DEPTH_TEST);
-}
-
-void 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);
-
- mmDisplaySlides = &OGLTransitionImpl::displaySlidesFadeSmoothly;
- mbUseMipMapLeaving = mbUseMipMapEntering = false;
-}
-
-void OGLTransitionImpl::displaySlidesFadeThroughBlack( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale )
-{
- applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
-
- glDisable(GL_DEPTH_TEST);
-
- 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);
- if( nTime < 0.5 ) {
- glColor4f( 1, 1, 1, 1 - nTime*2 );
- displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale );
- } else {
- glColor4f( 1, 1, 1, (nTime - 0.5)*2 );
- displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale );
- }
- glDisable(GL_BLEND);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- glEnable(GL_LIGHTING);
-
- glEnable(GL_DEPTH_TEST);
-}
-
-void 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);
-
- mmDisplaySlides = &OGLTransitionImpl::displaySlidesFadeThroughBlack;
- mbUseMipMapLeaving = mbUseMipMapEntering = false;
-}
-
-static const char* basicVertexShader = "\n\
-varying vec2 v_texturePosition;\n\
-\n\
-void main( void )\n\
-{\n\
- gl_Position = ftransform();\n\
- v_texturePosition = gl_MultiTexCoord0.xy;\n\
-}\n\
-";
-
-static const char* staticFragmentShader = "\n\
-uniform sampler2D leavingSlideTexture;\n\
-uniform sampler2D enteringSlideTexture;\n\
-uniform sampler2D permTexture;\n\
-uniform float time;\n\
-varying vec2 v_texturePosition;\n\
-\n\
-float snoise(vec2 P) {\n\
-\n\
- return texture2D(permTexture, P).r;\n\
-}\n\
-\n\
-\n\
-#define PART 0.5\n\
-#define START 0.4\n\
-#define END 0.9\n\
-\n\
-void main() {\n\
- float sn = snoise(10.0*v_texturePosition+time*0.07);\n\
- if( time < PART ) {\n\
- float sn1 = snoise(vec2(time*15.0, 20.0*v_texturePosition.y));\n\
- float sn2 = snoise(v_texturePosition);\n\
- if (sn1 > 1.0 - time*time && sn2 < 2.0*time+0.1)\n\
- gl_FragColor = vec4(sn, sn, sn, 1.0);\n\
- else if (time > START )\n\
- gl_FragColor = ((time-START)/(PART - START))*vec4(sn, sn, sn, 1.0) + (1.0 - (time - START)/(PART - START))*texture2D(leavingSlideTexture, v_texturePosition);\n\
- else\n\
- gl_FragColor = texture2D(leavingSlideTexture, v_texturePosition);\n\
- } else if ( time < PART ) {\n\
- gl_FragColor = texture2D(leavingSlideTexture, v_texturePosition);\n\
- } else if ( time > END ) {\n\
- gl_FragColor = ((1.0 - time)/(1.0 - END))*vec4(sn, sn, sn, 1.0) + ((time - END)/(1.0 - END))*texture2D(enteringSlideTexture, v_texturePosition);\n\
- } else \n\
- gl_FragColor = vec4(sn, sn, sn, 1.0);\n\
-}\n\
-";
-
-static const char* dissolveFragmentShader = "\n\
-uniform sampler2D leavingSlideTexture;\n\
-uniform sampler2D enteringSlideTexture;\n\
-uniform sampler2D permTexture;\n\
-uniform float time;\n\
-varying vec2 v_texturePosition;\n\
-\n\
-float snoise(vec2 P) {\n\
-\n\
- return texture2D(permTexture, P).r;\n\
-}\n\
-\n\
-void main() {\n\
- float sn = snoise(10.0*v_texturePosition);\n\
- if( sn < time)\n\
- gl_FragColor = texture2D(enteringSlideTexture, v_texturePosition);\n\
- else\n\
- gl_FragColor = texture2D(leavingSlideTexture, v_texturePosition);\n\
-}\n\
-";
-
-int permutation256 [256]= {
-215, 100, 200, 204, 233, 50, 85, 196,
- 71, 141, 122, 160, 93, 131, 243, 234,
-162, 183, 36, 155, 4, 62, 35, 205,
- 40, 102, 33, 27, 255, 55, 214, 156,
- 75, 163, 134, 126, 249, 74, 197, 228,
- 72, 90, 206, 235, 17, 22, 49, 169,
-227, 89, 16, 5, 117, 60, 248, 230,
-217, 68, 138, 96, 194, 170, 136, 10,
-112, 238, 184, 189, 176, 42, 225, 212,
- 84, 58, 175, 244, 150, 168, 219, 236,
-101, 208, 123, 37, 164, 110, 158, 201,
- 78, 114, 57, 48, 70, 142, 106, 43,
-232, 26, 32, 252, 239, 98, 191, 94,
- 59, 149, 39, 187, 203, 190, 19, 13,
-133, 45, 61, 247, 23, 34, 20, 52,
-118, 209, 146, 193, 222, 18, 1, 152,
- 46, 41, 91, 148, 115, 25, 135, 77,
-254, 147, 224, 161, 9, 213, 223, 250,
-231, 251, 127, 166, 63, 179, 81, 130,
-139, 28, 120, 151, 241, 86, 111, 0,
- 88, 153, 172, 182, 159, 105, 178, 47,
- 51, 167, 65, 66, 92, 73, 198, 211,
-245, 195, 31, 220, 140, 76, 221, 186,
-154, 185, 56, 83, 38, 165, 109, 67,
-124, 226, 132, 53, 229, 29, 12, 181,
-121, 24, 207, 199, 177, 113, 30, 80,
- 3, 97, 188, 79, 216, 173, 8, 145,
- 87, 128, 180, 237, 240, 137, 125, 104,
- 15, 242, 119, 246, 103, 143, 95, 144,
- 2, 44, 69, 157, 192, 174, 14, 54,
-218, 82, 64, 210, 11, 6, 129, 21,
-116, 171, 99, 202, 7, 107, 253, 108
-};
-
-void initPermTexture(GLuint *texID)
-{
- glGenTextures(1, texID);
- glBindTexture(GL_TEXTURE_2D, *texID);
-
- static bool initialized = false;
- static unsigned char permutation2D[256*256*4];
- if( !initialized ) {
- int x, y;
-
- for( y=0; y < 256; y++ )
- for( x=0; x < 256; x++ )
- permutation2D[x*4 + y*1024] = permutation256[(y + permutation256[x]) & 0xff];
-
- initialized = true;
- }
-
- glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, permutation2D );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
-}
-
-void OGLTransitionImpl::preparePermShader()
-{
-#ifdef GL_VERSION_2_0
- if( mProgramObject ) {
- OGLShaders::glUseProgram( mProgramObject );
-
- GLint location = OGLShaders::glGetUniformLocation( mProgramObject, "leavingSlideTexture" );
- if( location != -1 ) {
- OGLShaders::glUniform1i( location, 0 ); // texture unit 0
- }
-
- glActiveTexture(GL_TEXTURE1);
- if( !maHelperTexture )
- initPermTexture( &maHelperTexture );
- glActiveTexture(GL_TEXTURE0);
-
- location = OGLShaders::glGetUniformLocation( mProgramObject, "permTexture" );
- if( location != -1 ) {
- OGLShaders::glUniform1i( location, 1 ); // texture unit 1
- }
-
- location = OGLShaders::glGetUniformLocation( mProgramObject, "enteringSlideTexture" );
- if( location != -1 ) {
- OGLShaders::glUniform1i( location, 2 ); // texture unit 2
- }
- }
-#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 )
-{
- applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
-
-#ifdef GL_VERSION_2_0
- if( mProgramObject ) {
- GLint location = OGLShaders::glGetUniformLocation( mProgramObject, "time" );
- if( location != -1 ) {
- OGLShaders::glUniform1f( location, nTime );
- }
- }
-
- glActiveTexture( GL_TEXTURE2 );
- glBindTexture( GL_TEXTURE_2D, glEnteringSlideTex );
- glActiveTexture( GL_TEXTURE0 );
-#endif
-
- displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale );
-}
-
-void 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);
-
- mmDisplaySlides = &OGLTransitionImpl::displaySlidesShaders;
- mmPrepareTransition = &OGLTransitionImpl::prepareStatic;
- mbUseMipMapLeaving = mbUseMipMapEntering = false;
-
- mnRequiredGLVersion = 2.0;
-}
-
-void OGLTransitionImpl::prepareDissolve( ::sal_Int32 /* glLeavingSlideTex */, ::sal_Int32 /* glEnteringSlideTex */ )
-{
- mProgramObject = OGLShaders::LinkProgram( basicVertexShader, dissolveFragmentShader );
-
- preparePermShader();
-}
-
-void 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);
-
- mmDisplaySlides = &OGLTransitionImpl::displaySlidesShaders;
- mmPrepareTransition = &OGLTransitionImpl::prepareDissolve;
- mbUseMipMapLeaving = mbUseMipMapEntering = false;
-
- mnRequiredGLVersion = 2.0;
-}
-
-void 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.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));
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */