xref: /AOO41X/main/slideshow/source/engine/OGLTrans/OGLTrans_TransitionImpl.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir #include "OGLTrans_TransitionImpl.hxx"
29*cdf0e10cSrcweir #include "OGLTrans_Shaders.hxx"
30*cdf0e10cSrcweir #include <GL/gl.h>
31*cdf0e10cSrcweir #include <math.h>
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir void OGLTransitionImpl::clear()
35*cdf0e10cSrcweir {
36*cdf0e10cSrcweir     for(unsigned int i( 0 ); i < OverallOperations.size(); ++i)
37*cdf0e10cSrcweir         delete OverallOperations[i];
38*cdf0e10cSrcweir     OverallOperations.clear();
39*cdf0e10cSrcweir     maLeavingSlidePrimitives.clear();
40*cdf0e10cSrcweir     maEnteringSlidePrimitives.clear();
41*cdf0e10cSrcweir     for(unsigned int i(0); i < maSceneObjects.size(); ++i)
42*cdf0e10cSrcweir         delete maSceneObjects[i];
43*cdf0e10cSrcweir     maSceneObjects.clear();
44*cdf0e10cSrcweir 
45*cdf0e10cSrcweir     mbReflectSlides = false;
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir #ifdef GL_VERSION_2_0
48*cdf0e10cSrcweir     if( mProgramObject ) {
49*cdf0e10cSrcweir         OGLShaders::glDeleteProgram( mProgramObject );
50*cdf0e10cSrcweir         mProgramObject = 0;
51*cdf0e10cSrcweir     }
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir     if( mVertexObject ) {
54*cdf0e10cSrcweir         OGLShaders::glDeleteShader( mVertexObject );
55*cdf0e10cSrcweir         mVertexObject = 0;
56*cdf0e10cSrcweir     }
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir     if( mFragmentObject ) {
59*cdf0e10cSrcweir         OGLShaders::glDeleteShader( mFragmentObject );
60*cdf0e10cSrcweir         mFragmentObject = 0;
61*cdf0e10cSrcweir     }
62*cdf0e10cSrcweir #endif
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir     if( maHelperTexture ) {
65*cdf0e10cSrcweir         glDeleteTextures( 1, &maHelperTexture );
66*cdf0e10cSrcweir         maHelperTexture = 0;
67*cdf0e10cSrcweir     }
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir     if( mmClearTransition )
70*cdf0e10cSrcweir         (this->*mmClearTransition)();
71*cdf0e10cSrcweir }
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir OGLTransitionImpl::~OGLTransitionImpl()
74*cdf0e10cSrcweir {
75*cdf0e10cSrcweir     clear();
76*cdf0e10cSrcweir }
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir void OGLTransitionImpl::prepare( ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex )
79*cdf0e10cSrcweir {
80*cdf0e10cSrcweir     for(unsigned int i(0); i < maSceneObjects.size(); ++i) {
81*cdf0e10cSrcweir         maSceneObjects[i]->prepare();
82*cdf0e10cSrcweir     }
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir     if( mmPrepareTransition )
85*cdf0e10cSrcweir         (this->*mmPrepareTransition)( glLeavingSlideTex, glEnteringSlideTex );
86*cdf0e10cSrcweir }
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir void OGLTransitionImpl::finish()
89*cdf0e10cSrcweir {
90*cdf0e10cSrcweir     for(unsigned int i(0); i < maSceneObjects.size(); ++i) {
91*cdf0e10cSrcweir         maSceneObjects[i]->finish();
92*cdf0e10cSrcweir     }
93*cdf0e10cSrcweir }
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir static void blendSlide( double depth )
96*cdf0e10cSrcweir {
97*cdf0e10cSrcweir     double showHeight = -1 + depth*2;
98*cdf0e10cSrcweir     GLfloat reflectionColor[] = {0, 0, 0, 0.25};
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir     glDisable( GL_DEPTH_TEST );
101*cdf0e10cSrcweir     glBegin( GL_QUADS );
102*cdf0e10cSrcweir     glColor4fv( reflectionColor );
103*cdf0e10cSrcweir     glVertex3f( -1, -1, 0 );
104*cdf0e10cSrcweir     glColor4f( 0, 0, 0, 1 );
105*cdf0e10cSrcweir     glVertex3f(-1,  showHeight, 0 );
106*cdf0e10cSrcweir     glVertex3f( 1,  showHeight, 0 );
107*cdf0e10cSrcweir     glColor4fv( reflectionColor );
108*cdf0e10cSrcweir     glVertex3f( 1, -1, 0 );
109*cdf0e10cSrcweir     glEnd();
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir     glBegin( GL_QUADS );
112*cdf0e10cSrcweir     glColor4f( 0, 0, 0, 1 );
113*cdf0e10cSrcweir     glVertex3f( -1, showHeight, 0 );
114*cdf0e10cSrcweir     glVertex3f( -1,  1, 0 );
115*cdf0e10cSrcweir     glVertex3f(  1,  1, 0 );
116*cdf0e10cSrcweir     glVertex3f(  1, showHeight, 0 );
117*cdf0e10cSrcweir     glEnd();
118*cdf0e10cSrcweir     glEnable( GL_DEPTH_TEST );
119*cdf0e10cSrcweir }
120*cdf0e10cSrcweir 
121*cdf0e10cSrcweir static void slideShadow( double nTime, Primitive& primitive, double sw, double sh )
122*cdf0e10cSrcweir {
123*cdf0e10cSrcweir     double reflectionDepth = 0.3;
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir     glEnable(GL_BLEND);
126*cdf0e10cSrcweir     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
127*cdf0e10cSrcweir     glDisable(GL_LIGHTING);
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir     glPushMatrix();
130*cdf0e10cSrcweir     primitive.applyOperations( nTime, sw, sh );
131*cdf0e10cSrcweir     blendSlide( reflectionDepth );
132*cdf0e10cSrcweir     glPopMatrix();
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir     glDisable(GL_BLEND);
135*cdf0e10cSrcweir     glEnable(GL_LIGHTING);
136*cdf0e10cSrcweir }
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir void OGLTransitionImpl::display( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex,
139*cdf0e10cSrcweir                                  double SlideWidth, double SlideHeight, double DispWidth, double DispHeight )
140*cdf0e10cSrcweir {
141*cdf0e10cSrcweir     double SlideWidthScale, SlideHeightScale;
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir     SlideWidthScale = SlideWidth/DispWidth;
144*cdf0e10cSrcweir     SlideHeightScale = SlideHeight/DispHeight;
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir     if( mmPrepare ) {
147*cdf0e10cSrcweir         clear();
148*cdf0e10cSrcweir         (this->*mmPrepare)( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight );
149*cdf0e10cSrcweir     }
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir     glPushMatrix();
152*cdf0e10cSrcweir     displaySlides( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale );
153*cdf0e10cSrcweir     displayScene( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight );
154*cdf0e10cSrcweir     glPopMatrix();
155*cdf0e10cSrcweir }
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir void OGLTransitionImpl::applyOverallOperations( double nTime, double SlideWidthScale, double SlideHeightScale )
158*cdf0e10cSrcweir {
159*cdf0e10cSrcweir     for(unsigned int i(0); i < OverallOperations.size(); ++i)
160*cdf0e10cSrcweir         OverallOperations[i]->interpolate(nTime,SlideWidthScale,SlideHeightScale);
161*cdf0e10cSrcweir }
162*cdf0e10cSrcweir 
163*cdf0e10cSrcweir void OGLTransitionImpl::displaySlide( double nTime, ::sal_Int32 glSlideTex, std::vector<Primitive>& primitives,
164*cdf0e10cSrcweir                                       double SlideWidthScale, double SlideHeightScale )
165*cdf0e10cSrcweir {
166*cdf0e10cSrcweir    //TODO change to foreach
167*cdf0e10cSrcweir     glBindTexture(GL_TEXTURE_2D, glSlideTex);
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir     // display slide reflection
170*cdf0e10cSrcweir     // note that depth test is turned off while blending the shadow
171*cdf0e10cSrcweir     // so the slides has to be rendered in right order, see rochade as example
172*cdf0e10cSrcweir     if( mbReflectSlides ) {
173*cdf0e10cSrcweir         double surfaceLevel = -0.04;
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir         /* reflected slides */
176*cdf0e10cSrcweir         glPushMatrix();
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir         glScaled( 1, -1, 1 );
179*cdf0e10cSrcweir         glTranslated( 0, 2 - surfaceLevel, 0 );
180*cdf0e10cSrcweir 
181*cdf0e10cSrcweir         glCullFace(GL_FRONT);
182*cdf0e10cSrcweir 	for(unsigned int i(0); i < primitives.size(); ++i)
183*cdf0e10cSrcweir 	    primitives[i].display(nTime, SlideWidthScale, SlideHeightScale);
184*cdf0e10cSrcweir         glCullFace(GL_BACK);
185*cdf0e10cSrcweir 
186*cdf0e10cSrcweir 	slideShadow( nTime, primitives[0], SlideWidthScale, SlideHeightScale );
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir         glPopMatrix();
189*cdf0e10cSrcweir     }
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir     for(unsigned int i(0); i < primitives.size(); ++i)
192*cdf0e10cSrcweir         primitives[i].display(nTime, SlideWidthScale, SlideHeightScale);
193*cdf0e10cSrcweir }
194*cdf0e10cSrcweir 
195*cdf0e10cSrcweir void OGLTransitionImpl::displaySlides( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex,
196*cdf0e10cSrcweir                                        double SlideWidthScale, double SlideHeightScale )
197*cdf0e10cSrcweir {
198*cdf0e10cSrcweir     if( mmDisplaySlides )
199*cdf0e10cSrcweir         (this->*mmDisplaySlides)( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale );
200*cdf0e10cSrcweir     else {
201*cdf0e10cSrcweir         applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir         glEnable(GL_TEXTURE_2D);
204*cdf0e10cSrcweir         displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale );
205*cdf0e10cSrcweir         displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale );
206*cdf0e10cSrcweir     }
207*cdf0e10cSrcweir }
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir void OGLTransitionImpl::displayScene( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight )
210*cdf0e10cSrcweir {
211*cdf0e10cSrcweir     glEnable(GL_TEXTURE_2D);
212*cdf0e10cSrcweir     for(unsigned int i(0); i < maSceneObjects.size(); ++i)
213*cdf0e10cSrcweir         maSceneObjects[i]->display(nTime, SlideWidth, SlideHeight, DispWidth, DispHeight);
214*cdf0e10cSrcweir }
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir void Primitive::display(double nTime, double WidthScale, double HeightScale)
217*cdf0e10cSrcweir {
218*cdf0e10cSrcweir     glPushMatrix();
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir     applyOperations( nTime, WidthScale, HeightScale );
221*cdf0e10cSrcweir 
222*cdf0e10cSrcweir     glEnableClientState( GL_VERTEX_ARRAY );
223*cdf0e10cSrcweir     if(!Normals.empty())
224*cdf0e10cSrcweir     {
225*cdf0e10cSrcweir         glNormalPointer( GL_DOUBLE , 0 , &Normals[0] );
226*cdf0e10cSrcweir         glEnableClientState( GL_NORMAL_ARRAY );
227*cdf0e10cSrcweir     }
228*cdf0e10cSrcweir     glEnableClientState( GL_TEXTURE_COORD_ARRAY );
229*cdf0e10cSrcweir     glTexCoordPointer( 2, GL_DOUBLE, 0, &TexCoords[0] );
230*cdf0e10cSrcweir     glVertexPointer( 3, GL_DOUBLE, 0, &Vertices[0] );
231*cdf0e10cSrcweir     glDrawArrays( GL_TRIANGLES, 0, Vertices.size() );
232*cdf0e10cSrcweir     glPopMatrix();
233*cdf0e10cSrcweir }
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir void Primitive::applyOperations(double nTime, double WidthScale, double HeightScale)
236*cdf0e10cSrcweir {
237*cdf0e10cSrcweir     for(unsigned int i(0); i < Operations.size(); ++i)
238*cdf0e10cSrcweir         Operations[i]->interpolate( nTime ,WidthScale,HeightScale);
239*cdf0e10cSrcweir     glScaled(WidthScale,HeightScale,1);
240*cdf0e10cSrcweir }
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir Primitive::~Primitive()
243*cdf0e10cSrcweir {
244*cdf0e10cSrcweir     for(unsigned int i( 0 ); i < Operations.size(); ++i)
245*cdf0e10cSrcweir         delete Operations[i];
246*cdf0e10cSrcweir }
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir 
249*cdf0e10cSrcweir void SceneObject::display(double nTime, double /* SlideWidth */, double /* SlideHeight */, double DispWidth, double DispHeight )
250*cdf0e10cSrcweir {
251*cdf0e10cSrcweir     for(unsigned int i(0); i < maPrimitives.size(); ++i) {
252*cdf0e10cSrcweir         // fixme: allow various model spaces, now we make it so that
253*cdf0e10cSrcweir         // it is regular -1,-1 to 1,1, where the whole display fits in
254*cdf0e10cSrcweir         glPushMatrix();
255*cdf0e10cSrcweir         if (DispHeight > DispWidth)
256*cdf0e10cSrcweir             glScaled(DispHeight/DispWidth, 1, 1);
257*cdf0e10cSrcweir         else
258*cdf0e10cSrcweir             glScaled(1, DispWidth/DispHeight, 1);
259*cdf0e10cSrcweir         maPrimitives[i].display(nTime, 1, 1);
260*cdf0e10cSrcweir         glPopMatrix();
261*cdf0e10cSrcweir     }
262*cdf0e10cSrcweir }
263*cdf0e10cSrcweir 
264*cdf0e10cSrcweir void SceneObject::pushPrimitive(const Primitive &p)
265*cdf0e10cSrcweir {
266*cdf0e10cSrcweir     maPrimitives.push_back(p);
267*cdf0e10cSrcweir }
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir SceneObject::SceneObject()
270*cdf0e10cSrcweir     : maPrimitives()
271*cdf0e10cSrcweir {
272*cdf0e10cSrcweir }
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir Iris::Iris()
275*cdf0e10cSrcweir     : SceneObject ()
276*cdf0e10cSrcweir {
277*cdf0e10cSrcweir }
278*cdf0e10cSrcweir 
279*cdf0e10cSrcweir void Iris::display(double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight )
280*cdf0e10cSrcweir {
281*cdf0e10cSrcweir     glBindTexture(GL_TEXTURE_2D, maTexture);
282*cdf0e10cSrcweir     SceneObject::display(nTime, SlideWidth, SlideHeight, DispWidth, DispHeight);
283*cdf0e10cSrcweir }
284*cdf0e10cSrcweir 
285*cdf0e10cSrcweir void Iris::prepare()
286*cdf0e10cSrcweir {
287*cdf0e10cSrcweir     static GLubyte img[3] = { 80, 80, 80 };
288*cdf0e10cSrcweir 
289*cdf0e10cSrcweir     glGenTextures(1, &maTexture);
290*cdf0e10cSrcweir     glBindTexture(GL_TEXTURE_2D, maTexture);
291*cdf0e10cSrcweir     glTexImage2D(GL_TEXTURE_2D, 0, 3, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, img);
292*cdf0e10cSrcweir     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
293*cdf0e10cSrcweir     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
294*cdf0e10cSrcweir     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
295*cdf0e10cSrcweir     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
296*cdf0e10cSrcweir }
297*cdf0e10cSrcweir 
298*cdf0e10cSrcweir void Iris::finish()
299*cdf0e10cSrcweir {
300*cdf0e10cSrcweir     glDeleteTextures(1, &maTexture);
301*cdf0e10cSrcweir }
302*cdf0e10cSrcweir 
303*cdf0e10cSrcweir void OGLTransitionImpl::makeOutsideCubeFaceToLeft()
304*cdf0e10cSrcweir {
305*cdf0e10cSrcweir     clear();
306*cdf0e10cSrcweir     Primitive Slide;
307*cdf0e10cSrcweir 
308*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1));
309*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1));
310*cdf0e10cSrcweir 
311*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back(Slide);
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir     Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,-1),90,false,0.0,1.0));
314*cdf0e10cSrcweir 
315*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back(Slide);
316*cdf0e10cSrcweir 
317*cdf0e10cSrcweir     OverallOperations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,-1),-90,true,0.0,1.0));
318*cdf0e10cSrcweir }
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir void OGLTransitionImpl::makeInsideCubeFaceToLeft()
321*cdf0e10cSrcweir {
322*cdf0e10cSrcweir     clear();
323*cdf0e10cSrcweir     Primitive Slide;
324*cdf0e10cSrcweir 
325*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1));
326*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1));
327*cdf0e10cSrcweir 
328*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back(Slide);
329*cdf0e10cSrcweir 
330*cdf0e10cSrcweir     Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,1),-90,false,0.0,1.0));
331*cdf0e10cSrcweir 
332*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back(Slide);
333*cdf0e10cSrcweir 
334*cdf0e10cSrcweir     OverallOperations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,1),90,true,0.0,1.0));
335*cdf0e10cSrcweir }
336*cdf0e10cSrcweir 
337*cdf0e10cSrcweir void OGLTransitionImpl::makeFallLeaving()
338*cdf0e10cSrcweir {
339*cdf0e10cSrcweir     clear();
340*cdf0e10cSrcweir     Primitive Slide;
341*cdf0e10cSrcweir 
342*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1));
343*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1));
344*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back(Slide);
345*cdf0e10cSrcweir 
346*cdf0e10cSrcweir     Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(1,0,0),basegfx::B3DVector(0,-1,0), 90,true,0.0,1.0));
347*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back(Slide);
348*cdf0e10cSrcweir 
349*cdf0e10cSrcweir     mbUseMipMapEntering = false;
350*cdf0e10cSrcweir }
351*cdf0e10cSrcweir 
352*cdf0e10cSrcweir void OGLTransitionImpl::makeTurnAround()
353*cdf0e10cSrcweir {
354*cdf0e10cSrcweir     clear();
355*cdf0e10cSrcweir     Primitive Slide;
356*cdf0e10cSrcweir 
357*cdf0e10cSrcweir     mbReflectSlides = true;
358*cdf0e10cSrcweir 
359*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1));
360*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1));
361*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back(Slide);
362*cdf0e10cSrcweir 
363*cdf0e10cSrcweir     Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0),-180,false,0.0,1.0));
364*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back(Slide);
365*cdf0e10cSrcweir 
366*cdf0e10cSrcweir     OverallOperations.push_back(new STranslate(basegfx::B3DVector(0, 0, -1.5),true, 0, 0.5));
367*cdf0e10cSrcweir     OverallOperations.push_back(new STranslate(basegfx::B3DVector(0, 0, 1.5), true, 0.5, 1));
368*cdf0e10cSrcweir     OverallOperations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0, 1, 0),basegfx::B3DVector(0, 0, 0), -180, true, 0.0, 1.0));
369*cdf0e10cSrcweir }
370*cdf0e10cSrcweir 
371*cdf0e10cSrcweir void OGLTransitionImpl::makeTurnDown()
372*cdf0e10cSrcweir {
373*cdf0e10cSrcweir     clear();
374*cdf0e10cSrcweir     Primitive Slide;
375*cdf0e10cSrcweir 
376*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1));
377*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1));
378*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back(Slide);
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir     Slide.Operations.push_back(new STranslate(basegfx::B3DVector(0, 0, 0.0001), false, -1.0, 0.0));
381*cdf0e10cSrcweir     Slide.Operations.push_back(new SRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(-1, 1, 0), -90, true, 0.0, 1.0));
382*cdf0e10cSrcweir     Slide.Operations.push_back(new SRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(-1, 1, 0), 90, false, -1.0, 0.0));
383*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back(Slide);
384*cdf0e10cSrcweir 
385*cdf0e10cSrcweir     mbUseMipMapLeaving = false;
386*cdf0e10cSrcweir }
387*cdf0e10cSrcweir 
388*cdf0e10cSrcweir void OGLTransitionImpl::makeIris()
389*cdf0e10cSrcweir {
390*cdf0e10cSrcweir     clear();
391*cdf0e10cSrcweir     Primitive Slide;
392*cdf0e10cSrcweir 
393*cdf0e10cSrcweir     Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1));
394*cdf0e10cSrcweir     Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1));
395*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back (Slide);
396*cdf0e10cSrcweir 
397*cdf0e10cSrcweir     Slide.Operations.push_back (new STranslate (basegfx::B3DVector (0, 0,  0.000001), false, -1, 0));
398*cdf0e10cSrcweir     Slide.Operations.push_back (new STranslate (basegfx::B3DVector (0, 0, -0.000002), false, 0.5, 1));
399*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back (Slide);
400*cdf0e10cSrcweir 
401*cdf0e10cSrcweir 
402*cdf0e10cSrcweir     Primitive irisPart, part;
403*cdf0e10cSrcweir     int i, nSteps = 24, nParts = 7;
404*cdf0e10cSrcweir     double lt = 0, t = 1.0/nSteps, cx, cy, lcx, lcy, lx = 1, ly = 0, x, y, cxo, cyo, lcxo, lcyo, of=2.2, f=1.42;
405*cdf0e10cSrcweir 
406*cdf0e10cSrcweir     for (i=1; i<=nSteps; i++) {
407*cdf0e10cSrcweir         x = cos ((3*2*M_PI*t)/nParts);
408*cdf0e10cSrcweir         y = -sin ((3*2*M_PI*t)/nParts);
409*cdf0e10cSrcweir         cx = (f*x + 1)/2;
410*cdf0e10cSrcweir         cy = (f*y + 1)/2;
411*cdf0e10cSrcweir         lcx = (f*lx + 1)/2;
412*cdf0e10cSrcweir         lcy = (f*ly + 1)/2;
413*cdf0e10cSrcweir         cxo = (of*x + 1)/2;
414*cdf0e10cSrcweir         cyo = (of*y + 1)/2;
415*cdf0e10cSrcweir         lcxo = (of*lx + 1)/2;
416*cdf0e10cSrcweir         lcyo = (of*ly + 1)/2;
417*cdf0e10cSrcweir         irisPart.pushTriangle (basegfx::B2DVector (lcx, lcy),
418*cdf0e10cSrcweir                                basegfx::B2DVector (lcxo, lcyo),
419*cdf0e10cSrcweir                                basegfx::B2DVector (cx, cy));
420*cdf0e10cSrcweir         irisPart.pushTriangle (basegfx::B2DVector (cx, cy),
421*cdf0e10cSrcweir                                basegfx::B2DVector (lcxo, lcyo),
422*cdf0e10cSrcweir                                basegfx::B2DVector (cxo, cyo));
423*cdf0e10cSrcweir         lx = x;
424*cdf0e10cSrcweir         ly = y;
425*cdf0e10cSrcweir         lt = t;
426*cdf0e10cSrcweir         t += 1.0/nSteps;
427*cdf0e10cSrcweir     }
428*cdf0e10cSrcweir 
429*cdf0e10cSrcweir     Iris* pIris = new Iris();
430*cdf0e10cSrcweir     double angle = 87;
431*cdf0e10cSrcweir 
432*cdf0e10cSrcweir     for (i = 0; i < nParts; i++) {
433*cdf0e10cSrcweir         irisPart.Operations.clear ();
434*cdf0e10cSrcweir         double rx, ry;
435*cdf0e10cSrcweir 
436*cdf0e10cSrcweir         rx = cos ((2*M_PI*i)/nParts);
437*cdf0e10cSrcweir         ry = sin ((2*M_PI*i)/nParts);
438*cdf0e10cSrcweir         irisPart.Operations.push_back (new SRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(rx, ry, 0),  angle, true, 0.0, 0.5));
439*cdf0e10cSrcweir         irisPart.Operations.push_back (new SRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(rx, ry, 0), -angle, true, 0.5, 1));
440*cdf0e10cSrcweir         if (i > 0) {
441*cdf0e10cSrcweir             irisPart.Operations.push_back (new STranslate (basegfx::B3DVector(rx, ry, 0),  false, -1, 0));
442*cdf0e10cSrcweir             irisPart.Operations.push_back (new SRotate (basegfx::B3DVector(0, 0, 1), basegfx::B3DVector(0, 0, 0), i*360.0/nParts, false, -1, 0));
443*cdf0e10cSrcweir             irisPart.Operations.push_back (new STranslate (basegfx::B3DVector(-1, 0, 0),  false, -1, 0));
444*cdf0e10cSrcweir         }
445*cdf0e10cSrcweir         irisPart.Operations.push_back(new STranslate(basegfx::B3DVector(0, 0, 1), false, -2, 0.0));
446*cdf0e10cSrcweir         irisPart.Operations.push_back (new SRotate (basegfx::B3DVector(1, .5, 0), basegfx::B3DVector(1, 0, 0), -30, false, -1, 0));
447*cdf0e10cSrcweir         pIris->pushPrimitive (irisPart);
448*cdf0e10cSrcweir     }
449*cdf0e10cSrcweir 
450*cdf0e10cSrcweir     maSceneObjects.push_back (pIris);
451*cdf0e10cSrcweir 
452*cdf0e10cSrcweir     mbUseMipMapLeaving = mbUseMipMapEntering = false;
453*cdf0e10cSrcweir }
454*cdf0e10cSrcweir 
455*cdf0e10cSrcweir void OGLTransitionImpl::displaySlidesRochade( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex,
456*cdf0e10cSrcweir 					      double SlideWidthScale, double SlideHeightScale )
457*cdf0e10cSrcweir {
458*cdf0e10cSrcweir     applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
459*cdf0e10cSrcweir 
460*cdf0e10cSrcweir     glEnable(GL_TEXTURE_2D);
461*cdf0e10cSrcweir 
462*cdf0e10cSrcweir     if( nTime > .5) {
463*cdf0e10cSrcweir 	displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale );
464*cdf0e10cSrcweir 	displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale );
465*cdf0e10cSrcweir     } else {
466*cdf0e10cSrcweir 	displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale );
467*cdf0e10cSrcweir 	displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale );
468*cdf0e10cSrcweir     }
469*cdf0e10cSrcweir }
470*cdf0e10cSrcweir 
471*cdf0e10cSrcweir void OGLTransitionImpl::makeRochade()
472*cdf0e10cSrcweir {
473*cdf0e10cSrcweir     clear();
474*cdf0e10cSrcweir     Primitive Slide;
475*cdf0e10cSrcweir 
476*cdf0e10cSrcweir     mbReflectSlides = true;
477*cdf0e10cSrcweir     mmDisplaySlides = &OGLTransitionImpl::displaySlidesRochade;
478*cdf0e10cSrcweir 
479*cdf0e10cSrcweir     double w, h;
480*cdf0e10cSrcweir 
481*cdf0e10cSrcweir     w = 2.2;
482*cdf0e10cSrcweir     h = 10;
483*cdf0e10cSrcweir 
484*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1));
485*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1));
486*cdf0e10cSrcweir 
487*cdf0e10cSrcweir     Slide.Operations.push_back(new SEllipseTranslate(w, h, 0.25, -0.25, true, 0, 1));
488*cdf0e10cSrcweir     Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0), -45, true, 0, 1));
489*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back(Slide);
490*cdf0e10cSrcweir 
491*cdf0e10cSrcweir     Slide.Operations.clear();
492*cdf0e10cSrcweir     Slide.Operations.push_back(new SEllipseTranslate(w, h, 0.75, 0.25, true, 0, 1));
493*cdf0e10cSrcweir     Slide.Operations.push_back(new STranslate(basegfx::B3DVector(0, 0, -h), false, -1, 0));
494*cdf0e10cSrcweir     Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0), -45, true, 0, 1));
495*cdf0e10cSrcweir     Slide.Operations.push_back(new RotateAndScaleDepthByWidth(basegfx::B3DVector(0,1,0),basegfx::B3DVector(0,0,0), 45, false, -1, 0));
496*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back(Slide);
497*cdf0e10cSrcweir 
498*cdf0e10cSrcweir     //     OverallOperations.push_back(new SEllipseTranslate(0.5, 2, 0, 1, true, 0, 1));
499*cdf0e10cSrcweir //      push_back(new STranslate(basegfx::B3DVector(0, 0, -2), true, 0, 0.5));
500*cdf0e10cSrcweir //      OverallOperations.push_back(new STranslate(basegfx::B3DVector(0, 0, 2), true, 0.5, 1));
501*cdf0e10cSrcweir }
502*cdf0e10cSrcweir 
503*cdf0e10cSrcweir // TODO(Q3): extract to basegfx
504*cdf0e10cSrcweir inline basegfx::B2DVector clamp(const basegfx::B2DVector& v)
505*cdf0e10cSrcweir {
506*cdf0e10cSrcweir     return basegfx::B2DVector(min(max(v.getX(),-1.0),1.0),
507*cdf0e10cSrcweir                               min(max(v.getY(),-1.0),1.0));
508*cdf0e10cSrcweir }
509*cdf0e10cSrcweir 
510*cdf0e10cSrcweir // TODO(Q3): extract to basegfx
511*cdf0e10cSrcweir inline basegfx::B3DVector clamp(const basegfx::B3DVector& v)
512*cdf0e10cSrcweir {
513*cdf0e10cSrcweir     return basegfx::B3DVector(min(max(v.getX(),-1.0),1.0),
514*cdf0e10cSrcweir                               min(max(v.getY(),-1.0),1.0),
515*cdf0e10cSrcweir                               min(max(v.getZ(),-1.0),1.0));
516*cdf0e10cSrcweir }
517*cdf0e10cSrcweir 
518*cdf0e10cSrcweir inline double randFromNeg1to1()
519*cdf0e10cSrcweir {
520*cdf0e10cSrcweir     return ( ( static_cast<double>( rand() ) / static_cast<double>( RAND_MAX ) ) * 2.0 ) - 1.0;
521*cdf0e10cSrcweir }
522*cdf0e10cSrcweir 
523*cdf0e10cSrcweir // TODO(Q3): extract to basegfx
524*cdf0e10cSrcweir inline basegfx::B3DVector randNormVectorInXYPlane()
525*cdf0e10cSrcweir {
526*cdf0e10cSrcweir     basegfx::B3DVector toReturn(randFromNeg1to1(),randFromNeg1to1(),0.0);
527*cdf0e10cSrcweir     return toReturn/toReturn.getLength();
528*cdf0e10cSrcweir }
529*cdf0e10cSrcweir 
530*cdf0e10cSrcweir void OGLTransitionImpl::makeRevolvingCircles( ::sal_uInt16 nCircles , ::sal_uInt16 nPointsOnCircles )
531*cdf0e10cSrcweir {
532*cdf0e10cSrcweir     clear();
533*cdf0e10cSrcweir     double dAngle(2*3.1415926/static_cast<double>( nPointsOnCircles ));
534*cdf0e10cSrcweir     if(nCircles < 2 || nPointsOnCircles < 4)
535*cdf0e10cSrcweir     {
536*cdf0e10cSrcweir         makeNByMTileFlip(1,1);
537*cdf0e10cSrcweir         return;
538*cdf0e10cSrcweir     }
539*cdf0e10cSrcweir     double Radius(1.0/static_cast<double>( nCircles ));
540*cdf0e10cSrcweir     double dRadius(Radius);
541*cdf0e10cSrcweir     double LastRadius(0.0);
542*cdf0e10cSrcweir     double NextRadius(2*Radius);
543*cdf0e10cSrcweir 
544*cdf0e10cSrcweir     /// now we know there is at least two circles
545*cdf0e10cSrcweir     /// the first will always be a full circle
546*cdf0e10cSrcweir     /// the last will always be the outer shell of the slide with a circle hole
547*cdf0e10cSrcweir 
548*cdf0e10cSrcweir     //add the full circle
549*cdf0e10cSrcweir     vector<basegfx::B2DVector> unScaledTexCoords;
550*cdf0e10cSrcweir     double TempAngle(0.0);
551*cdf0e10cSrcweir     for(unsigned int Point(0); Point < nPointsOnCircles; ++Point)
552*cdf0e10cSrcweir     {
553*cdf0e10cSrcweir         unScaledTexCoords.push_back( basegfx::B2DVector( cos(TempAngle - 3.1415926/2.0) , sin(TempAngle- 3.1415926/2.0) ) );
554*cdf0e10cSrcweir 
555*cdf0e10cSrcweir         TempAngle += dAngle;
556*cdf0e10cSrcweir     }
557*cdf0e10cSrcweir 
558*cdf0e10cSrcweir     {
559*cdf0e10cSrcweir         //double angle(0.0);
560*cdf0e10cSrcweir         Primitive EnteringSlide;
561*cdf0e10cSrcweir         Primitive LeavingSlide;
562*cdf0e10cSrcweir         for(int Point(0); Point + 1 < nPointsOnCircles; ++Point)
563*cdf0e10cSrcweir         {
564*cdf0e10cSrcweir             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 ) );
565*cdf0e10cSrcweir             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) );
566*cdf0e10cSrcweir         }
567*cdf0e10cSrcweir         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 ) );
568*cdf0e10cSrcweir         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) );
569*cdf0e10cSrcweir 
570*cdf0e10cSrcweir         basegfx::B3DVector axis(randNormVectorInXYPlane());
571*cdf0e10cSrcweir         EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) );
572*cdf0e10cSrcweir         LeavingSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) );
573*cdf0e10cSrcweir         EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , -180, false,0.0,1.0) );
574*cdf0e10cSrcweir 
575*cdf0e10cSrcweir         maEnteringSlidePrimitives.push_back(EnteringSlide);
576*cdf0e10cSrcweir         maLeavingSlidePrimitives.push_back(LeavingSlide);
577*cdf0e10cSrcweir         LastRadius = Radius;
578*cdf0e10cSrcweir         Radius = NextRadius;
579*cdf0e10cSrcweir         NextRadius += dRadius;
580*cdf0e10cSrcweir     }
581*cdf0e10cSrcweir 
582*cdf0e10cSrcweir     for(int i(1); i < nCircles - 1; ++i)
583*cdf0e10cSrcweir     {
584*cdf0e10cSrcweir         Primitive LeavingSlide;
585*cdf0e10cSrcweir         Primitive EnteringSlide;
586*cdf0e10cSrcweir         for(int Side(0); Side < nPointsOnCircles - 1; ++Side)
587*cdf0e10cSrcweir         {
588*cdf0e10cSrcweir             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) );
589*cdf0e10cSrcweir             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) );
590*cdf0e10cSrcweir 
591*cdf0e10cSrcweir             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) );
592*cdf0e10cSrcweir             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) );
593*cdf0e10cSrcweir         }
594*cdf0e10cSrcweir 
595*cdf0e10cSrcweir         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) );
596*cdf0e10cSrcweir         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) );
597*cdf0e10cSrcweir 
598*cdf0e10cSrcweir         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) );
599*cdf0e10cSrcweir         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) );
600*cdf0e10cSrcweir 
601*cdf0e10cSrcweir         basegfx::B3DVector axis(randNormVectorInXYPlane());
602*cdf0e10cSrcweir         EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) );
603*cdf0e10cSrcweir         LeavingSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, Radius/2.0 , (NextRadius + 1)/2.0 ) );
604*cdf0e10cSrcweir         EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , -180, false,0.0,1.0) );
605*cdf0e10cSrcweir 
606*cdf0e10cSrcweir         maEnteringSlidePrimitives.push_back(EnteringSlide);
607*cdf0e10cSrcweir         maLeavingSlidePrimitives.push_back(LeavingSlide);
608*cdf0e10cSrcweir 
609*cdf0e10cSrcweir         LastRadius = Radius;
610*cdf0e10cSrcweir         Radius = NextRadius;
611*cdf0e10cSrcweir         NextRadius += dRadius;
612*cdf0e10cSrcweir     }
613*cdf0e10cSrcweir     {
614*cdf0e10cSrcweir         Radius = sqrt(2.0);
615*cdf0e10cSrcweir         Primitive LeavingSlide;
616*cdf0e10cSrcweir         Primitive EnteringSlide;
617*cdf0e10cSrcweir         for(int Side(0); Side < nPointsOnCircles - 1; ++Side)
618*cdf0e10cSrcweir         {
619*cdf0e10cSrcweir 
620*cdf0e10cSrcweir             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) );
621*cdf0e10cSrcweir             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) );
622*cdf0e10cSrcweir 
623*cdf0e10cSrcweir             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) );
624*cdf0e10cSrcweir             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) );
625*cdf0e10cSrcweir         }
626*cdf0e10cSrcweir 
627*cdf0e10cSrcweir         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) );
628*cdf0e10cSrcweir         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) );
629*cdf0e10cSrcweir 
630*cdf0e10cSrcweir         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) );
631*cdf0e10cSrcweir         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) );
632*cdf0e10cSrcweir 
633*cdf0e10cSrcweir         basegfx::B3DVector axis(randNormVectorInXYPlane());
634*cdf0e10cSrcweir         EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, (LastRadius + dRadius)/2.0 , 1.0 ) );
635*cdf0e10cSrcweir         LeavingSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , 180, true, (LastRadius + dRadius)/2.0 , 1.0 ) );
636*cdf0e10cSrcweir         EnteringSlide.Operations.push_back( new SRotate( axis , basegfx::B3DVector(0,0,0) , -180, false,0.0,1.0) );
637*cdf0e10cSrcweir 
638*cdf0e10cSrcweir         maEnteringSlidePrimitives.push_back(EnteringSlide);
639*cdf0e10cSrcweir         maLeavingSlidePrimitives.push_back(LeavingSlide);
640*cdf0e10cSrcweir     }
641*cdf0e10cSrcweir }
642*cdf0e10cSrcweir 
643*cdf0e10cSrcweir void OGLTransitionImpl::makeHelix( ::sal_uInt16 nRows )
644*cdf0e10cSrcweir {
645*cdf0e10cSrcweir     clear();
646*cdf0e10cSrcweir     double invN(1.0/static_cast<double>(nRows));
647*cdf0e10cSrcweir     double iDn = 0.0;
648*cdf0e10cSrcweir     double iPDn = invN;
649*cdf0e10cSrcweir     for(unsigned int i(0); i < nRows; ++i)
650*cdf0e10cSrcweir     {
651*cdf0e10cSrcweir         Primitive Tile;
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir         Tile.pushTriangle(basegfx::B2DVector( 1.0 , iDn ) , basegfx::B2DVector( 0.0 , iDn ) , basegfx::B2DVector( 0.0 , iPDn ));
654*cdf0e10cSrcweir 
655*cdf0e10cSrcweir         Tile.pushTriangle(basegfx::B2DVector( 1.0 , iPDn ) , basegfx::B2DVector( 1.0 , iDn ) , basegfx::B2DVector( 0.0 , iPDn ));
656*cdf0e10cSrcweir 
657*cdf0e10cSrcweir         Tile.Operations.push_back( new SRotate( basegfx::B3DVector( 0 , 1 , 0 ) , ( Tile.getVertices()[1] + Tile.getVertices()[3] )/2.0 , 180 ,
658*cdf0e10cSrcweir                                                 true,min(max(static_cast<double>(i - nRows/2.0)*invN/2.0,0.0),1.0),
659*cdf0e10cSrcweir                                                 min(max(static_cast<double>(i + nRows/2.0)*invN/2.0,0.0),1.0) ) );
660*cdf0e10cSrcweir 
661*cdf0e10cSrcweir         maLeavingSlidePrimitives.push_back(Tile);
662*cdf0e10cSrcweir 
663*cdf0e10cSrcweir         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) );
664*cdf0e10cSrcweir 
665*cdf0e10cSrcweir         maEnteringSlidePrimitives.push_back(Tile);
666*cdf0e10cSrcweir 
667*cdf0e10cSrcweir         iDn += invN;
668*cdf0e10cSrcweir         iPDn += invN;
669*cdf0e10cSrcweir     }
670*cdf0e10cSrcweir }
671*cdf0e10cSrcweir 
672*cdf0e10cSrcweir void OGLTransitionImpl::makeNByMTileFlip( ::sal_uInt16 n, ::sal_uInt16 m )
673*cdf0e10cSrcweir {
674*cdf0e10cSrcweir     clear();
675*cdf0e10cSrcweir     double invN(1.0/static_cast<double>(n));
676*cdf0e10cSrcweir     double invM(1.0/static_cast<double>(m));
677*cdf0e10cSrcweir     double iDn = 0.0;
678*cdf0e10cSrcweir     double iPDn = invN;
679*cdf0e10cSrcweir     for(unsigned int i(0); i < n; ++i)
680*cdf0e10cSrcweir     {
681*cdf0e10cSrcweir         double jDm = 0.0;
682*cdf0e10cSrcweir         double jPDm = invM;
683*cdf0e10cSrcweir         for(unsigned int j(0); j < m; ++j)
684*cdf0e10cSrcweir         {
685*cdf0e10cSrcweir             Primitive Tile;
686*cdf0e10cSrcweir 
687*cdf0e10cSrcweir             Tile.pushTriangle(basegfx::B2DVector( iPDn , jDm ) , basegfx::B2DVector( iDn , jDm ) , basegfx::B2DVector( iDn , jPDm ));
688*cdf0e10cSrcweir 
689*cdf0e10cSrcweir             Tile.pushTriangle(basegfx::B2DVector( iPDn , jPDm ) , basegfx::B2DVector( iPDn , jDm ) , basegfx::B2DVector( iDn , jPDm ));//bottom left corner of tile
690*cdf0e10cSrcweir 
691*cdf0e10cSrcweir             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 ) );
692*cdf0e10cSrcweir             maLeavingSlidePrimitives.push_back(Tile);
693*cdf0e10cSrcweir             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 ) );
694*cdf0e10cSrcweir 
695*cdf0e10cSrcweir             maEnteringSlidePrimitives.push_back(Tile);
696*cdf0e10cSrcweir 
697*cdf0e10cSrcweir             jDm += invM;
698*cdf0e10cSrcweir             jPDm += invM;
699*cdf0e10cSrcweir         }
700*cdf0e10cSrcweir         iDn += invN;
701*cdf0e10cSrcweir         iPDn += invN;
702*cdf0e10cSrcweir     }
703*cdf0e10cSrcweir }
704*cdf0e10cSrcweir 
705*cdf0e10cSrcweir SRotate::SRotate(const basegfx::B3DVector& Axis,const basegfx::B3DVector& Origin,double Angle, bool bInter, double T0, double T1):axis(Axis),origin(Origin),angle(Angle)
706*cdf0e10cSrcweir {
707*cdf0e10cSrcweir     nT0 = T0;
708*cdf0e10cSrcweir     nT1 = T1;
709*cdf0e10cSrcweir     bInterpolate = bInter;
710*cdf0e10cSrcweir }
711*cdf0e10cSrcweir 
712*cdf0e10cSrcweir SScale::SScale(const basegfx::B3DVector& Scale,const basegfx::B3DVector& Origin, bool bInter, double T0, double T1):scale(Scale),origin(Origin)
713*cdf0e10cSrcweir {
714*cdf0e10cSrcweir     nT0 = T0;
715*cdf0e10cSrcweir     nT1 = T1;
716*cdf0e10cSrcweir     bInterpolate = bInter;
717*cdf0e10cSrcweir }
718*cdf0e10cSrcweir 
719*cdf0e10cSrcweir RotateAndScaleDepthByWidth::RotateAndScaleDepthByWidth(const basegfx::B3DVector& Axis,const basegfx::B3DVector& Origin,double Angle, bool bInter, double T0, double T1):axis(Axis),origin(Origin),angle(Angle)
720*cdf0e10cSrcweir {
721*cdf0e10cSrcweir     nT0 = T0;
722*cdf0e10cSrcweir     nT1 = T1;
723*cdf0e10cSrcweir     bInterpolate = bInter;
724*cdf0e10cSrcweir }
725*cdf0e10cSrcweir 
726*cdf0e10cSrcweir RotateAndScaleDepthByHeight::RotateAndScaleDepthByHeight(const basegfx::B3DVector& Axis,const basegfx::B3DVector& Origin,double Angle, bool bInter, double T0, double T1):axis(Axis),origin(Origin),angle(Angle)
727*cdf0e10cSrcweir {
728*cdf0e10cSrcweir     nT0 = T0;
729*cdf0e10cSrcweir     nT1 = T1;
730*cdf0e10cSrcweir     bInterpolate = bInter;
731*cdf0e10cSrcweir }
732*cdf0e10cSrcweir 
733*cdf0e10cSrcweir 
734*cdf0e10cSrcweir STranslate::STranslate(const basegfx::B3DVector& Vector, bool bInter, double T0, double T1):vector(Vector)
735*cdf0e10cSrcweir {
736*cdf0e10cSrcweir     nT0 = T0;
737*cdf0e10cSrcweir     nT1 = T1;
738*cdf0e10cSrcweir     bInterpolate = bInter;
739*cdf0e10cSrcweir }
740*cdf0e10cSrcweir 
741*cdf0e10cSrcweir inline double intervalInter(double t, double T0, double T1)
742*cdf0e10cSrcweir {
743*cdf0e10cSrcweir     return ( t - T0 ) / ( T1 - T0 );
744*cdf0e10cSrcweir }
745*cdf0e10cSrcweir 
746*cdf0e10cSrcweir void STranslate::interpolate(double t,double SlideWidthScale,double SlideHeightScale)
747*cdf0e10cSrcweir {
748*cdf0e10cSrcweir     if(t <= nT0)
749*cdf0e10cSrcweir         return;
750*cdf0e10cSrcweir     if(!bInterpolate || t > nT1)
751*cdf0e10cSrcweir         t = nT1;
752*cdf0e10cSrcweir     t = intervalInter(t,nT0,nT1);
753*cdf0e10cSrcweir     glTranslated(SlideWidthScale*t*vector.getX(),SlideHeightScale*t*vector.getY(),t*vector.getZ());
754*cdf0e10cSrcweir }
755*cdf0e10cSrcweir 
756*cdf0e10cSrcweir void SRotate::interpolate(double t,double SlideWidthScale,double SlideHeightScale)
757*cdf0e10cSrcweir {
758*cdf0e10cSrcweir     if(t <= nT0)
759*cdf0e10cSrcweir         return;
760*cdf0e10cSrcweir     if(!bInterpolate || t > nT1)
761*cdf0e10cSrcweir         t = nT1;
762*cdf0e10cSrcweir     t = intervalInter(t,nT0,nT1);
763*cdf0e10cSrcweir     glTranslated(SlideWidthScale*origin.getX(),SlideHeightScale*origin.getY(),origin.getZ());
764*cdf0e10cSrcweir     glScaled(SlideWidthScale,SlideHeightScale,1);
765*cdf0e10cSrcweir     glRotated(t*angle,axis.getX(),axis.getY(),axis.getZ());
766*cdf0e10cSrcweir     glScaled(1/SlideWidthScale,1/SlideHeightScale,1);
767*cdf0e10cSrcweir     glTranslated(-SlideWidthScale*origin.getX(),-SlideHeightScale*origin.getY(),-origin.getZ());
768*cdf0e10cSrcweir }
769*cdf0e10cSrcweir 
770*cdf0e10cSrcweir void SScale::interpolate(double t,double SlideWidthScale,double SlideHeightScale)
771*cdf0e10cSrcweir {
772*cdf0e10cSrcweir     if(t <= nT0)
773*cdf0e10cSrcweir         return;
774*cdf0e10cSrcweir     if(!bInterpolate || t > nT1)
775*cdf0e10cSrcweir         t = nT1;
776*cdf0e10cSrcweir     t = intervalInter(t,nT0,nT1);
777*cdf0e10cSrcweir     glTranslated(SlideWidthScale*origin.getX(),SlideHeightScale*origin.getY(),origin.getZ());
778*cdf0e10cSrcweir     glScaled((1-t) + t*scale.getX(),(1-t) + t*scale.getY(),(1-t) + t*scale.getZ());
779*cdf0e10cSrcweir     glTranslated(-SlideWidthScale*origin.getX(),-SlideHeightScale*origin.getY(),-origin.getZ());
780*cdf0e10cSrcweir }
781*cdf0e10cSrcweir 
782*cdf0e10cSrcweir void RotateAndScaleDepthByWidth::interpolate(double t,double SlideWidthScale,double SlideHeightScale)
783*cdf0e10cSrcweir {
784*cdf0e10cSrcweir     if(t <= nT0)
785*cdf0e10cSrcweir         return;
786*cdf0e10cSrcweir     if(!bInterpolate || t > nT1)
787*cdf0e10cSrcweir         t = nT1;
788*cdf0e10cSrcweir     t = intervalInter(t,nT0,nT1);
789*cdf0e10cSrcweir     glTranslated(SlideWidthScale*origin.getX(),SlideHeightScale*origin.getY(),SlideWidthScale*origin.getZ());
790*cdf0e10cSrcweir     glRotated(t*angle,axis.getX(),axis.getY(),axis.getZ());
791*cdf0e10cSrcweir     glTranslated(-SlideWidthScale*origin.getX(),-SlideHeightScale*origin.getY(),-SlideWidthScale*origin.getZ());
792*cdf0e10cSrcweir }
793*cdf0e10cSrcweir 
794*cdf0e10cSrcweir void RotateAndScaleDepthByHeight::interpolate(double t,double SlideWidthScale,double SlideHeightScale)
795*cdf0e10cSrcweir {
796*cdf0e10cSrcweir     if(t <= nT0)
797*cdf0e10cSrcweir         return;
798*cdf0e10cSrcweir     if(!bInterpolate || t > nT1)
799*cdf0e10cSrcweir         t = nT1;
800*cdf0e10cSrcweir     t = intervalInter(t,nT0,nT1);
801*cdf0e10cSrcweir     glTranslated(SlideWidthScale*origin.getX(),SlideHeightScale*origin.getY(),SlideHeightScale*origin.getZ());
802*cdf0e10cSrcweir     glRotated(t*angle,axis.getX(),axis.getY(),axis.getZ());
803*cdf0e10cSrcweir     glTranslated(-SlideWidthScale*origin.getX(),-SlideHeightScale*origin.getY(),-SlideHeightScale*origin.getZ());
804*cdf0e10cSrcweir }
805*cdf0e10cSrcweir 
806*cdf0e10cSrcweir SEllipseTranslate::SEllipseTranslate(double dWidth, double dHeight, double dStartPosition, double dEndPosition, bool bInter, double T0, double T1)
807*cdf0e10cSrcweir {
808*cdf0e10cSrcweir     nT0 = T0;
809*cdf0e10cSrcweir     nT1 = T1;
810*cdf0e10cSrcweir     bInterpolate = bInter;
811*cdf0e10cSrcweir     width = dWidth;
812*cdf0e10cSrcweir     height = dHeight;
813*cdf0e10cSrcweir     startPosition = dStartPosition;
814*cdf0e10cSrcweir     endPosition = dEndPosition;
815*cdf0e10cSrcweir }
816*cdf0e10cSrcweir 
817*cdf0e10cSrcweir void SEllipseTranslate::interpolate(double t,double /* SlideWidthScale */,double /* SlideHeightScale */)
818*cdf0e10cSrcweir {
819*cdf0e10cSrcweir     if(t <= nT0)
820*cdf0e10cSrcweir         return;
821*cdf0e10cSrcweir     if(!bInterpolate || t > nT1)
822*cdf0e10cSrcweir         t = nT1;
823*cdf0e10cSrcweir     t = intervalInter(t,nT0,nT1);
824*cdf0e10cSrcweir 
825*cdf0e10cSrcweir     double a1, a2, x, y;
826*cdf0e10cSrcweir     a1 = startPosition*2*M_PI;
827*cdf0e10cSrcweir     a2 = (startPosition + t*(endPosition - startPosition))*2*M_PI;
828*cdf0e10cSrcweir     x = width*(cos (a2) - cos (a1))/2;
829*cdf0e10cSrcweir     y = height*(sin (a2) - sin (a1))/2;
830*cdf0e10cSrcweir 
831*cdf0e10cSrcweir     glTranslated(x, 0, y);
832*cdf0e10cSrcweir }
833*cdf0e10cSrcweir 
834*cdf0e10cSrcweir STranslate* STranslate::clone()
835*cdf0e10cSrcweir {
836*cdf0e10cSrcweir     return new STranslate(*this);
837*cdf0e10cSrcweir }
838*cdf0e10cSrcweir SRotate* SRotate::clone()
839*cdf0e10cSrcweir {
840*cdf0e10cSrcweir     return new SRotate(*this);
841*cdf0e10cSrcweir }
842*cdf0e10cSrcweir 
843*cdf0e10cSrcweir SScale* SScale::clone()
844*cdf0e10cSrcweir {
845*cdf0e10cSrcweir     return new SScale(*this);
846*cdf0e10cSrcweir }
847*cdf0e10cSrcweir 
848*cdf0e10cSrcweir SEllipseTranslate* SEllipseTranslate::clone()
849*cdf0e10cSrcweir {
850*cdf0e10cSrcweir     return new SEllipseTranslate(*this);
851*cdf0e10cSrcweir }
852*cdf0e10cSrcweir 
853*cdf0e10cSrcweir RotateAndScaleDepthByWidth* RotateAndScaleDepthByWidth::clone()
854*cdf0e10cSrcweir {
855*cdf0e10cSrcweir     return new RotateAndScaleDepthByWidth(*this);
856*cdf0e10cSrcweir }
857*cdf0e10cSrcweir 
858*cdf0e10cSrcweir RotateAndScaleDepthByHeight* RotateAndScaleDepthByHeight::clone()
859*cdf0e10cSrcweir {
860*cdf0e10cSrcweir     return new RotateAndScaleDepthByHeight(*this);
861*cdf0e10cSrcweir }
862*cdf0e10cSrcweir 
863*cdf0e10cSrcweir const Primitive& Primitive::operator=(const Primitive& rvalue)
864*cdf0e10cSrcweir {
865*cdf0e10cSrcweir     for(unsigned int i( 0 ); i < rvalue.Operations.size(); ++i)
866*cdf0e10cSrcweir         Operations.push_back(rvalue.Operations[i]->clone());
867*cdf0e10cSrcweir     for(unsigned int i( 0 ); i < rvalue.Vertices.size(); ++i)//SPEED! use copy or something. this is slow.
868*cdf0e10cSrcweir         Vertices.push_back(rvalue.Vertices[i]);
869*cdf0e10cSrcweir     for(unsigned int i( 0 ); i < rvalue.TexCoords.size(); ++i)//SPEED! use copy or something. this is slow.
870*cdf0e10cSrcweir         TexCoords.push_back(rvalue.TexCoords[i]);
871*cdf0e10cSrcweir     for(unsigned int i( 0 ); i < rvalue.Normals.size(); ++i)//SPEED! use copy or something. this is slow.
872*cdf0e10cSrcweir         Normals.push_back(rvalue.Normals[i]);
873*cdf0e10cSrcweir     return *this;
874*cdf0e10cSrcweir }
875*cdf0e10cSrcweir 
876*cdf0e10cSrcweir Primitive::Primitive(const Primitive& rvalue)
877*cdf0e10cSrcweir {
878*cdf0e10cSrcweir     for(unsigned int i( 0 ); i < rvalue.Operations.size(); ++i)
879*cdf0e10cSrcweir         Operations.push_back(rvalue.Operations[i]->clone());
880*cdf0e10cSrcweir     for(unsigned int i( 0 ); i < rvalue.Vertices.size(); ++i)//SPEED! use copy or something. this is slow.
881*cdf0e10cSrcweir         Vertices.push_back(rvalue.Vertices[i]);
882*cdf0e10cSrcweir     for(unsigned int i( 0 ); i < rvalue.TexCoords.size(); ++i)//SPEED! use copy or something. this is slow.
883*cdf0e10cSrcweir         TexCoords.push_back(rvalue.TexCoords[i]);
884*cdf0e10cSrcweir     for(unsigned int i( 0 ); i < rvalue.Normals.size(); ++i)//SPEED! use copy or something. this is slow.
885*cdf0e10cSrcweir         Normals.push_back(rvalue.Normals[i]);
886*cdf0e10cSrcweir }
887*cdf0e10cSrcweir 
888*cdf0e10cSrcweir void Primitive::pushTriangle(const basegfx::B2DVector& SlideLocation0,const basegfx::B2DVector& SlideLocation1,const basegfx::B2DVector& SlideLocation2)
889*cdf0e10cSrcweir {
890*cdf0e10cSrcweir     vector<basegfx::B3DVector> Verts;
891*cdf0e10cSrcweir     vector<basegfx::B2DVector> Texs;
892*cdf0e10cSrcweir     Verts.reserve(3);
893*cdf0e10cSrcweir     Texs.reserve(3);
894*cdf0e10cSrcweir 
895*cdf0e10cSrcweir     Verts.push_back(basegfx::B3DVector( 2*SlideLocation0.getX() - 1, -2*SlideLocation0.getY() + 1 , 0.0 ));
896*cdf0e10cSrcweir     Verts.push_back(basegfx::B3DVector( 2*SlideLocation1.getX() - 1, -2*SlideLocation1.getY() + 1 , 0.0 ));
897*cdf0e10cSrcweir     Verts.push_back(basegfx::B3DVector( 2*SlideLocation2.getX() - 1, -2*SlideLocation2.getY() + 1 , 0.0 ));
898*cdf0e10cSrcweir 
899*cdf0e10cSrcweir     //figure out if they're facing the correct way, and make them face the correct way.
900*cdf0e10cSrcweir     basegfx::B3DVector Normal( basegfx::cross( Verts[0] - Verts[1] , Verts[1] - Verts[2] ) );
901*cdf0e10cSrcweir     if(Normal.getZ() >= 0.0)//if the normal is facing us
902*cdf0e10cSrcweir     {
903*cdf0e10cSrcweir         Texs.push_back(SlideLocation0);
904*cdf0e10cSrcweir         Texs.push_back(SlideLocation1);
905*cdf0e10cSrcweir         Texs.push_back(SlideLocation2);
906*cdf0e10cSrcweir     }
907*cdf0e10cSrcweir     else // if the normal is facing away from us, make it face us
908*cdf0e10cSrcweir     {
909*cdf0e10cSrcweir         Texs.push_back(SlideLocation0);
910*cdf0e10cSrcweir         Texs.push_back(SlideLocation2);
911*cdf0e10cSrcweir         Texs.push_back(SlideLocation1);
912*cdf0e10cSrcweir         Verts.clear();
913*cdf0e10cSrcweir         Verts.push_back(basegfx::B3DVector( 2*SlideLocation0.getX() - 1, -2*SlideLocation0.getY() + 1 , 0.0 ));
914*cdf0e10cSrcweir         Verts.push_back(basegfx::B3DVector( 2*SlideLocation2.getX() - 1, -2*SlideLocation2.getY() + 1 , 0.0 ));
915*cdf0e10cSrcweir         Verts.push_back(basegfx::B3DVector( 2*SlideLocation1.getX() - 1, -2*SlideLocation1.getY() + 1 , 0.0 ));
916*cdf0e10cSrcweir     }
917*cdf0e10cSrcweir 
918*cdf0e10cSrcweir     Vertices.push_back(Verts[0]);
919*cdf0e10cSrcweir     Vertices.push_back(Verts[1]);
920*cdf0e10cSrcweir     Vertices.push_back(Verts[2]);
921*cdf0e10cSrcweir 
922*cdf0e10cSrcweir     TexCoords.push_back(Texs[0]);
923*cdf0e10cSrcweir     TexCoords.push_back(Texs[1]);
924*cdf0e10cSrcweir     TexCoords.push_back(Texs[2]);
925*cdf0e10cSrcweir 
926*cdf0e10cSrcweir     Normals.push_back(basegfx::B3DVector(0,0,1));//all normals always face the screen when untransformed.
927*cdf0e10cSrcweir     Normals.push_back(basegfx::B3DVector(0,0,1));//all normals always face the screen when untransformed.
928*cdf0e10cSrcweir     Normals.push_back(basegfx::B3DVector(0,0,1));//all normals always face the screen when untransformed.
929*cdf0e10cSrcweir }
930*cdf0e10cSrcweir 
931*cdf0e10cSrcweir void OGLTransitionImpl::makeDiamond()
932*cdf0e10cSrcweir {
933*cdf0e10cSrcweir     mmPrepare = &OGLTransitionImpl::prepareDiamond;
934*cdf0e10cSrcweir     mbUseMipMapLeaving = mbUseMipMapEntering = false;
935*cdf0e10cSrcweir }
936*cdf0e10cSrcweir 
937*cdf0e10cSrcweir void OGLTransitionImpl::prepareDiamond( double nTime, double /* SlideWidth */, double /* SlideHeight */, double /* DispWidth */, double /* DispHeight */ )
938*cdf0e10cSrcweir {
939*cdf0e10cSrcweir     Primitive Slide1, Slide2;
940*cdf0e10cSrcweir 
941*cdf0e10cSrcweir     Slide1.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1));
942*cdf0e10cSrcweir     Slide1.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1));
943*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back (Slide1);
944*cdf0e10cSrcweir 
945*cdf0e10cSrcweir 
946*cdf0e10cSrcweir     if( nTime >= 0.5 ) {
947*cdf0e10cSrcweir         double m = 1 - nTime;
948*cdf0e10cSrcweir 
949*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (m,0), basegfx::B2DVector (0,m));
950*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (nTime,0), basegfx::B2DVector (1,0), basegfx::B2DVector (1,m));
951*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (1,nTime), basegfx::B2DVector (1,1), basegfx::B2DVector (nTime,1));
952*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (0,nTime), basegfx::B2DVector (m,1), basegfx::B2DVector (0,1));
953*cdf0e10cSrcweir     } else {
954*cdf0e10cSrcweir         double l = 0.5 - nTime;
955*cdf0e10cSrcweir         double h = 0.5 + nTime;
956*cdf0e10cSrcweir 
957*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0.5,l));
958*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (0.5,l), basegfx::B2DVector (1,0), basegfx::B2DVector (h,0.5));
959*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (1,1), basegfx::B2DVector (h,0.5));
960*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (h,0.5), basegfx::B2DVector (1,1), basegfx::B2DVector (0.5,h));
961*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (0.5,h), basegfx::B2DVector (1,1), basegfx::B2DVector (0,1));
962*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (l,0.5), basegfx::B2DVector (0.5,h), basegfx::B2DVector (0,1));
963*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (l,0.5), basegfx::B2DVector (0,1));
964*cdf0e10cSrcweir         Slide2.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (0.5,l), basegfx::B2DVector (l,0.5));
965*cdf0e10cSrcweir     }
966*cdf0e10cSrcweir     Slide2.Operations.push_back (new STranslate (basegfx::B3DVector (0, 0, 0.00000001), false, -1, 0));
967*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back (Slide2);
968*cdf0e10cSrcweir }
969*cdf0e10cSrcweir 
970*cdf0e10cSrcweir void OGLTransitionImpl::makeVenetianBlinds( bool vertical, int parts )
971*cdf0e10cSrcweir {
972*cdf0e10cSrcweir     static double t30 = tan( M_PI/6.0 );
973*cdf0e10cSrcweir     double n, ln = 0;
974*cdf0e10cSrcweir     double p = 1.0/parts;
975*cdf0e10cSrcweir 
976*cdf0e10cSrcweir     for( int i=0; i<parts; i++ ) {
977*cdf0e10cSrcweir         Primitive Slide;
978*cdf0e10cSrcweir         n = (i + 1)/(double)parts;
979*cdf0e10cSrcweir         if( vertical ) {
980*cdf0e10cSrcweir             Slide.pushTriangle (basegfx::B2DVector (ln,0), basegfx::B2DVector (n,0), basegfx::B2DVector (ln,1));
981*cdf0e10cSrcweir             Slide.pushTriangle (basegfx::B2DVector (n,0), basegfx::B2DVector (ln,1), basegfx::B2DVector (n,1));
982*cdf0e10cSrcweir             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));
983*cdf0e10cSrcweir         } else {
984*cdf0e10cSrcweir             Slide.pushTriangle (basegfx::B2DVector (0,ln), basegfx::B2DVector (1,ln), basegfx::B2DVector (0,n));
985*cdf0e10cSrcweir             Slide.pushTriangle (basegfx::B2DVector (1,ln), basegfx::B2DVector (0,n), basegfx::B2DVector (1,n));
986*cdf0e10cSrcweir             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));
987*cdf0e10cSrcweir         }
988*cdf0e10cSrcweir         maLeavingSlidePrimitives.push_back (Slide);
989*cdf0e10cSrcweir 
990*cdf0e10cSrcweir         if( vertical ) {
991*cdf0e10cSrcweir             Slide.Operations.push_back(new SRotate(basegfx::B3DVector(0, 1, 0), basegfx::B3DVector(2*n - 1, 0, 0), -60, false, -1, 0));
992*cdf0e10cSrcweir             Slide.Operations.push_back(new SRotate(basegfx::B3DVector(0, 1, 0), basegfx::B3DVector(n + ln - 1, 0, 0), 180, false, -1, 0));
993*cdf0e10cSrcweir         } else {
994*cdf0e10cSrcweir             Slide.Operations.push_back(new SRotate(basegfx::B3DVector(1, 0, 0), basegfx::B3DVector(0, 1 - 2*n, 0), -60, false, -1, 0));
995*cdf0e10cSrcweir             Slide.Operations.push_back(new SRotate(basegfx::B3DVector(1, 0, 0), basegfx::B3DVector(0, 1 - n - ln, 0), 180, false, -1, 0));
996*cdf0e10cSrcweir         }
997*cdf0e10cSrcweir         maEnteringSlidePrimitives.push_back (Slide);
998*cdf0e10cSrcweir         ln = n;
999*cdf0e10cSrcweir     }
1000*cdf0e10cSrcweir }
1001*cdf0e10cSrcweir 
1002*cdf0e10cSrcweir void OGLTransitionImpl::displaySlidesFadeSmoothly( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale )
1003*cdf0e10cSrcweir {
1004*cdf0e10cSrcweir     applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
1005*cdf0e10cSrcweir 
1006*cdf0e10cSrcweir     glDisable(GL_DEPTH_TEST);
1007*cdf0e10cSrcweir 
1008*cdf0e10cSrcweir     displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale );
1009*cdf0e10cSrcweir 
1010*cdf0e10cSrcweir     glDisable(GL_LIGHTING);
1011*cdf0e10cSrcweir     glEnable(GL_BLEND);
1012*cdf0e10cSrcweir     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1013*cdf0e10cSrcweir     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1014*cdf0e10cSrcweir     glColor4f( 1, 1, 1, nTime );
1015*cdf0e10cSrcweir     displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale );
1016*cdf0e10cSrcweir     glDisable(GL_BLEND);
1017*cdf0e10cSrcweir     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1018*cdf0e10cSrcweir     glEnable(GL_LIGHTING);
1019*cdf0e10cSrcweir 
1020*cdf0e10cSrcweir     glEnable(GL_DEPTH_TEST);
1021*cdf0e10cSrcweir }
1022*cdf0e10cSrcweir 
1023*cdf0e10cSrcweir void OGLTransitionImpl::makeFadeSmoothly()
1024*cdf0e10cSrcweir {
1025*cdf0e10cSrcweir     Primitive Slide;
1026*cdf0e10cSrcweir 
1027*cdf0e10cSrcweir     Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1));
1028*cdf0e10cSrcweir     Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1));
1029*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back (Slide);
1030*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back (Slide);
1031*cdf0e10cSrcweir 
1032*cdf0e10cSrcweir     mmDisplaySlides = &OGLTransitionImpl::displaySlidesFadeSmoothly;
1033*cdf0e10cSrcweir     mbUseMipMapLeaving = mbUseMipMapEntering = false;
1034*cdf0e10cSrcweir }
1035*cdf0e10cSrcweir 
1036*cdf0e10cSrcweir void OGLTransitionImpl::displaySlidesFadeThroughBlack( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale )
1037*cdf0e10cSrcweir {
1038*cdf0e10cSrcweir     applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
1039*cdf0e10cSrcweir 
1040*cdf0e10cSrcweir     glDisable(GL_DEPTH_TEST);
1041*cdf0e10cSrcweir 
1042*cdf0e10cSrcweir     glDisable(GL_LIGHTING);
1043*cdf0e10cSrcweir     glEnable(GL_BLEND);
1044*cdf0e10cSrcweir     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1045*cdf0e10cSrcweir     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
1046*cdf0e10cSrcweir     if( nTime < 0.5 ) {
1047*cdf0e10cSrcweir 	glColor4f( 1, 1, 1, 1 - nTime*2 );
1048*cdf0e10cSrcweir 	displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale );
1049*cdf0e10cSrcweir     } else {
1050*cdf0e10cSrcweir 	glColor4f( 1, 1, 1, (nTime - 0.5)*2 );
1051*cdf0e10cSrcweir 	displaySlide( nTime, glEnteringSlideTex, maEnteringSlidePrimitives, SlideWidthScale, SlideHeightScale );
1052*cdf0e10cSrcweir     }
1053*cdf0e10cSrcweir     glDisable(GL_BLEND);
1054*cdf0e10cSrcweir     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
1055*cdf0e10cSrcweir     glEnable(GL_LIGHTING);
1056*cdf0e10cSrcweir 
1057*cdf0e10cSrcweir     glEnable(GL_DEPTH_TEST);
1058*cdf0e10cSrcweir }
1059*cdf0e10cSrcweir 
1060*cdf0e10cSrcweir void OGLTransitionImpl::makeFadeThroughBlack()
1061*cdf0e10cSrcweir {
1062*cdf0e10cSrcweir     Primitive Slide;
1063*cdf0e10cSrcweir 
1064*cdf0e10cSrcweir     Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1));
1065*cdf0e10cSrcweir     Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1));
1066*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back (Slide);
1067*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back (Slide);
1068*cdf0e10cSrcweir 
1069*cdf0e10cSrcweir     mmDisplaySlides = &OGLTransitionImpl::displaySlidesFadeThroughBlack;
1070*cdf0e10cSrcweir     mbUseMipMapLeaving = mbUseMipMapEntering = false;
1071*cdf0e10cSrcweir }
1072*cdf0e10cSrcweir 
1073*cdf0e10cSrcweir static const char* basicVertexShader = "\n\
1074*cdf0e10cSrcweir varying vec2 v_texturePosition;\n\
1075*cdf0e10cSrcweir \n\
1076*cdf0e10cSrcweir void main( void )\n\
1077*cdf0e10cSrcweir {\n\
1078*cdf0e10cSrcweir 	gl_Position = ftransform();\n\
1079*cdf0e10cSrcweir 	v_texturePosition = gl_MultiTexCoord0.xy;\n\
1080*cdf0e10cSrcweir }\n\
1081*cdf0e10cSrcweir ";
1082*cdf0e10cSrcweir 
1083*cdf0e10cSrcweir static const char* staticFragmentShader = "\n\
1084*cdf0e10cSrcweir uniform sampler2D leavingSlideTexture;\n\
1085*cdf0e10cSrcweir uniform sampler2D enteringSlideTexture;\n\
1086*cdf0e10cSrcweir uniform sampler2D permTexture;\n\
1087*cdf0e10cSrcweir uniform float time;\n\
1088*cdf0e10cSrcweir varying vec2 v_texturePosition;\n\
1089*cdf0e10cSrcweir \n\
1090*cdf0e10cSrcweir float snoise(vec2 P) {\n\
1091*cdf0e10cSrcweir \n\
1092*cdf0e10cSrcweir   return texture2D(permTexture, P).r;\n\
1093*cdf0e10cSrcweir }\n\
1094*cdf0e10cSrcweir \n\
1095*cdf0e10cSrcweir \n\
1096*cdf0e10cSrcweir #define PART 0.5\n\
1097*cdf0e10cSrcweir #define START 0.4\n\
1098*cdf0e10cSrcweir #define END 0.9\n\
1099*cdf0e10cSrcweir \n\
1100*cdf0e10cSrcweir void main() {\n\
1101*cdf0e10cSrcweir     float sn = snoise(10.0*v_texturePosition+time*0.07);\n\
1102*cdf0e10cSrcweir     if( time < PART ) {\n\
1103*cdf0e10cSrcweir         float sn1 = snoise(vec2(time*15.0, 20.0*v_texturePosition.y));\n\
1104*cdf0e10cSrcweir         float sn2 = snoise(v_texturePosition);\n\
1105*cdf0e10cSrcweir         if (sn1 > 1.0 - time*time && sn2 < 2.0*time+0.1)\n\
1106*cdf0e10cSrcweir 	        gl_FragColor = vec4(sn, sn, sn, 1.0);\n\
1107*cdf0e10cSrcweir         else if (time > START )\n\
1108*cdf0e10cSrcweir             gl_FragColor = ((time-START)/(PART - START))*vec4(sn, sn, sn, 1.0) + (1.0 - (time - START)/(PART - START))*texture2D(leavingSlideTexture, v_texturePosition);\n\
1109*cdf0e10cSrcweir         else\n\
1110*cdf0e10cSrcweir             gl_FragColor = texture2D(leavingSlideTexture, v_texturePosition);\n\
1111*cdf0e10cSrcweir     } else if ( time < PART ) {\n\
1112*cdf0e10cSrcweir             gl_FragColor = texture2D(leavingSlideTexture, v_texturePosition);\n\
1113*cdf0e10cSrcweir     } else if ( time > END ) {\n\
1114*cdf0e10cSrcweir         gl_FragColor = ((1.0 - time)/(1.0 - END))*vec4(sn, sn, sn, 1.0) + ((time - END)/(1.0 - END))*texture2D(enteringSlideTexture, v_texturePosition);\n\
1115*cdf0e10cSrcweir     } else \n\
1116*cdf0e10cSrcweir 	    gl_FragColor = vec4(sn, sn, sn, 1.0);\n\
1117*cdf0e10cSrcweir }\n\
1118*cdf0e10cSrcweir ";
1119*cdf0e10cSrcweir 
1120*cdf0e10cSrcweir static const char* dissolveFragmentShader = "\n\
1121*cdf0e10cSrcweir uniform sampler2D leavingSlideTexture;\n\
1122*cdf0e10cSrcweir uniform sampler2D enteringSlideTexture;\n\
1123*cdf0e10cSrcweir uniform sampler2D permTexture;\n\
1124*cdf0e10cSrcweir uniform float time;\n\
1125*cdf0e10cSrcweir varying vec2 v_texturePosition;\n\
1126*cdf0e10cSrcweir \n\
1127*cdf0e10cSrcweir float snoise(vec2 P) {\n\
1128*cdf0e10cSrcweir \n\
1129*cdf0e10cSrcweir   return texture2D(permTexture, P).r;\n\
1130*cdf0e10cSrcweir }\n\
1131*cdf0e10cSrcweir \n\
1132*cdf0e10cSrcweir void main() {\n\
1133*cdf0e10cSrcweir      float sn = snoise(10.0*v_texturePosition);\n\
1134*cdf0e10cSrcweir      if( sn < time)\n\
1135*cdf0e10cSrcweir          gl_FragColor = texture2D(enteringSlideTexture, v_texturePosition);\n\
1136*cdf0e10cSrcweir      else\n\
1137*cdf0e10cSrcweir          gl_FragColor = texture2D(leavingSlideTexture, v_texturePosition);\n\
1138*cdf0e10cSrcweir }\n\
1139*cdf0e10cSrcweir ";
1140*cdf0e10cSrcweir 
1141*cdf0e10cSrcweir int permutation256 [256]= {
1142*cdf0e10cSrcweir 215, 100, 200, 204, 233,  50,  85, 196,
1143*cdf0e10cSrcweir  71, 141, 122, 160,  93, 131, 243, 234,
1144*cdf0e10cSrcweir 162, 183,  36, 155,   4,  62,  35, 205,
1145*cdf0e10cSrcweir  40, 102,  33,  27, 255,  55, 214, 156,
1146*cdf0e10cSrcweir  75, 163, 134, 126, 249,  74, 197, 228,
1147*cdf0e10cSrcweir  72,  90, 206, 235,  17,  22,  49, 169,
1148*cdf0e10cSrcweir 227,  89,  16,   5, 117,  60, 248, 230,
1149*cdf0e10cSrcweir 217,  68, 138,  96, 194, 170, 136,  10,
1150*cdf0e10cSrcweir 112, 238, 184, 189, 176,  42, 225, 212,
1151*cdf0e10cSrcweir  84,  58, 175, 244, 150, 168, 219, 236,
1152*cdf0e10cSrcweir 101, 208, 123,  37, 164, 110, 158, 201,
1153*cdf0e10cSrcweir  78, 114,  57,  48,  70, 142, 106,  43,
1154*cdf0e10cSrcweir 232,  26,  32, 252, 239,  98, 191,  94,
1155*cdf0e10cSrcweir  59, 149,  39, 187, 203, 190,  19,  13,
1156*cdf0e10cSrcweir 133,  45,  61, 247,  23,  34,  20,  52,
1157*cdf0e10cSrcweir 118, 209, 146, 193, 222,  18,   1, 152,
1158*cdf0e10cSrcweir  46,  41,  91, 148, 115,  25, 135,  77,
1159*cdf0e10cSrcweir 254, 147, 224, 161,   9, 213, 223, 250,
1160*cdf0e10cSrcweir 231, 251, 127, 166,  63, 179,  81, 130,
1161*cdf0e10cSrcweir 139,  28, 120, 151, 241,  86, 111,   0,
1162*cdf0e10cSrcweir  88, 153, 172, 182, 159, 105, 178,  47,
1163*cdf0e10cSrcweir  51, 167,  65,  66,  92,  73, 198, 211,
1164*cdf0e10cSrcweir 245, 195,  31, 220, 140,  76, 221, 186,
1165*cdf0e10cSrcweir 154, 185,  56,  83,  38, 165, 109,  67,
1166*cdf0e10cSrcweir 124, 226, 132,  53, 229,  29,  12, 181,
1167*cdf0e10cSrcweir 121,  24, 207, 199, 177, 113,  30,  80,
1168*cdf0e10cSrcweir   3,  97, 188,  79, 216, 173,   8, 145,
1169*cdf0e10cSrcweir  87, 128, 180, 237, 240, 137, 125, 104,
1170*cdf0e10cSrcweir  15, 242, 119, 246, 103, 143,  95, 144,
1171*cdf0e10cSrcweir   2,  44,  69, 157, 192, 174,  14,  54,
1172*cdf0e10cSrcweir 218,  82,  64, 210,  11,   6, 129,  21,
1173*cdf0e10cSrcweir 116, 171,  99, 202,   7, 107, 253, 108
1174*cdf0e10cSrcweir };
1175*cdf0e10cSrcweir 
1176*cdf0e10cSrcweir void initPermTexture(GLuint *texID)
1177*cdf0e10cSrcweir {
1178*cdf0e10cSrcweir   glGenTextures(1, texID);
1179*cdf0e10cSrcweir   glBindTexture(GL_TEXTURE_2D, *texID);
1180*cdf0e10cSrcweir 
1181*cdf0e10cSrcweir   static bool initialized = false;
1182*cdf0e10cSrcweir   static unsigned char permutation2D[256*256*4];
1183*cdf0e10cSrcweir   if( !initialized ) {
1184*cdf0e10cSrcweir       int x, y;
1185*cdf0e10cSrcweir 
1186*cdf0e10cSrcweir       for( y=0; y < 256; y++ )
1187*cdf0e10cSrcweir           for( x=0; x < 256; x++ )
1188*cdf0e10cSrcweir               permutation2D[x*4 + y*1024] = permutation256[(y + permutation256[x]) & 0xff];
1189*cdf0e10cSrcweir 
1190*cdf0e10cSrcweir       initialized = true;
1191*cdf0e10cSrcweir   }
1192*cdf0e10cSrcweir 
1193*cdf0e10cSrcweir   glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, permutation2D );
1194*cdf0e10cSrcweir   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
1195*cdf0e10cSrcweir   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
1196*cdf0e10cSrcweir }
1197*cdf0e10cSrcweir 
1198*cdf0e10cSrcweir void OGLTransitionImpl::preparePermShader()
1199*cdf0e10cSrcweir {
1200*cdf0e10cSrcweir #ifdef GL_VERSION_2_0
1201*cdf0e10cSrcweir     if( mProgramObject ) {
1202*cdf0e10cSrcweir         OGLShaders::glUseProgram( mProgramObject );
1203*cdf0e10cSrcweir 
1204*cdf0e10cSrcweir         GLint location = OGLShaders::glGetUniformLocation( mProgramObject, "leavingSlideTexture" );
1205*cdf0e10cSrcweir         if( location != -1 ) {
1206*cdf0e10cSrcweir             OGLShaders::glUniform1i( location, 0 );  // texture unit 0
1207*cdf0e10cSrcweir         }
1208*cdf0e10cSrcweir 
1209*cdf0e10cSrcweir         glActiveTexture(GL_TEXTURE1);
1210*cdf0e10cSrcweir         if( !maHelperTexture )
1211*cdf0e10cSrcweir             initPermTexture( &maHelperTexture );
1212*cdf0e10cSrcweir         glActiveTexture(GL_TEXTURE0);
1213*cdf0e10cSrcweir 
1214*cdf0e10cSrcweir         location = OGLShaders::glGetUniformLocation( mProgramObject, "permTexture" );
1215*cdf0e10cSrcweir         if( location != -1 ) {
1216*cdf0e10cSrcweir             OGLShaders::glUniform1i( location, 1 );  // texture unit 1
1217*cdf0e10cSrcweir         }
1218*cdf0e10cSrcweir 
1219*cdf0e10cSrcweir         location = OGLShaders::glGetUniformLocation( mProgramObject, "enteringSlideTexture" );
1220*cdf0e10cSrcweir         if( location != -1 ) {
1221*cdf0e10cSrcweir             OGLShaders::glUniform1i( location, 2 );  // texture unit 2
1222*cdf0e10cSrcweir         }
1223*cdf0e10cSrcweir     }
1224*cdf0e10cSrcweir #endif
1225*cdf0e10cSrcweir }
1226*cdf0e10cSrcweir 
1227*cdf0e10cSrcweir void OGLTransitionImpl::prepareStatic( ::sal_Int32 /* glLeavingSlideTex */, ::sal_Int32 /* glEnteringSlideTex */ )
1228*cdf0e10cSrcweir {
1229*cdf0e10cSrcweir     mProgramObject = OGLShaders::LinkProgram( basicVertexShader, staticFragmentShader );
1230*cdf0e10cSrcweir 
1231*cdf0e10cSrcweir     preparePermShader();
1232*cdf0e10cSrcweir }
1233*cdf0e10cSrcweir 
1234*cdf0e10cSrcweir void OGLTransitionImpl::displaySlidesShaders( double nTime, ::sal_Int32 glLeavingSlideTex, ::sal_Int32 glEnteringSlideTex,
1235*cdf0e10cSrcweir                                               double SlideWidthScale, double SlideHeightScale )
1236*cdf0e10cSrcweir {
1237*cdf0e10cSrcweir     applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
1238*cdf0e10cSrcweir 
1239*cdf0e10cSrcweir #ifdef GL_VERSION_2_0
1240*cdf0e10cSrcweir     if( mProgramObject ) {
1241*cdf0e10cSrcweir         GLint location = OGLShaders::glGetUniformLocation( mProgramObject, "time" );
1242*cdf0e10cSrcweir         if( location != -1 ) {
1243*cdf0e10cSrcweir             OGLShaders::glUniform1f( location, nTime );
1244*cdf0e10cSrcweir         }
1245*cdf0e10cSrcweir     }
1246*cdf0e10cSrcweir 
1247*cdf0e10cSrcweir     glActiveTexture( GL_TEXTURE2 );
1248*cdf0e10cSrcweir     glBindTexture( GL_TEXTURE_2D, glEnteringSlideTex );
1249*cdf0e10cSrcweir     glActiveTexture( GL_TEXTURE0 );
1250*cdf0e10cSrcweir #endif
1251*cdf0e10cSrcweir 
1252*cdf0e10cSrcweir     displaySlide( nTime, glLeavingSlideTex, maLeavingSlidePrimitives, SlideWidthScale, SlideHeightScale );
1253*cdf0e10cSrcweir }
1254*cdf0e10cSrcweir 
1255*cdf0e10cSrcweir void OGLTransitionImpl::makeStatic()
1256*cdf0e10cSrcweir {
1257*cdf0e10cSrcweir     Primitive Slide;
1258*cdf0e10cSrcweir 
1259*cdf0e10cSrcweir     Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1));
1260*cdf0e10cSrcweir     Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1));
1261*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back (Slide);
1262*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back (Slide);
1263*cdf0e10cSrcweir 
1264*cdf0e10cSrcweir     mmDisplaySlides = &OGLTransitionImpl::displaySlidesShaders;
1265*cdf0e10cSrcweir     mmPrepareTransition = &OGLTransitionImpl::prepareStatic;
1266*cdf0e10cSrcweir     mbUseMipMapLeaving = mbUseMipMapEntering = false;
1267*cdf0e10cSrcweir 
1268*cdf0e10cSrcweir     mnRequiredGLVersion = 2.0;
1269*cdf0e10cSrcweir }
1270*cdf0e10cSrcweir 
1271*cdf0e10cSrcweir void OGLTransitionImpl::prepareDissolve( ::sal_Int32 /* glLeavingSlideTex */, ::sal_Int32 /* glEnteringSlideTex */ )
1272*cdf0e10cSrcweir {
1273*cdf0e10cSrcweir     mProgramObject = OGLShaders::LinkProgram( basicVertexShader, dissolveFragmentShader );
1274*cdf0e10cSrcweir 
1275*cdf0e10cSrcweir     preparePermShader();
1276*cdf0e10cSrcweir }
1277*cdf0e10cSrcweir 
1278*cdf0e10cSrcweir void OGLTransitionImpl::makeDissolve()
1279*cdf0e10cSrcweir {
1280*cdf0e10cSrcweir     Primitive Slide;
1281*cdf0e10cSrcweir 
1282*cdf0e10cSrcweir     Slide.pushTriangle (basegfx::B2DVector (0,0), basegfx::B2DVector (1,0), basegfx::B2DVector (0,1));
1283*cdf0e10cSrcweir     Slide.pushTriangle (basegfx::B2DVector (1,0), basegfx::B2DVector (0,1), basegfx::B2DVector (1,1));
1284*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back (Slide);
1285*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back (Slide);
1286*cdf0e10cSrcweir 
1287*cdf0e10cSrcweir     mmDisplaySlides = &OGLTransitionImpl::displaySlidesShaders;
1288*cdf0e10cSrcweir     mmPrepareTransition = &OGLTransitionImpl::prepareDissolve;
1289*cdf0e10cSrcweir     mbUseMipMapLeaving = mbUseMipMapEntering = false;
1290*cdf0e10cSrcweir 
1291*cdf0e10cSrcweir     mnRequiredGLVersion = 2.0;
1292*cdf0e10cSrcweir }
1293*cdf0e10cSrcweir 
1294*cdf0e10cSrcweir void OGLTransitionImpl::makeNewsflash()
1295*cdf0e10cSrcweir {
1296*cdf0e10cSrcweir     Primitive Slide;
1297*cdf0e10cSrcweir 
1298*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(0,0),basegfx::B2DVector(1,0),basegfx::B2DVector(0,1));
1299*cdf0e10cSrcweir     Slide.pushTriangle(basegfx::B2DVector(1,0),basegfx::B2DVector(0,1),basegfx::B2DVector(1,1));
1300*cdf0e10cSrcweir     Slide.Operations.push_back(new SRotate(basegfx::B3DVector(0,0,1),basegfx::B3DVector(0,0,0),3000,true,0,0.5));
1301*cdf0e10cSrcweir     Slide.Operations.push_back(new SScale(basegfx::B3DVector(0.01,0.01,0.01),basegfx::B3DVector(0,0,0),true,0,0.5));
1302*cdf0e10cSrcweir     Slide.Operations.push_back(new STranslate(basegfx::B3DVector(-10000, 0, 0),false, 0.5, 2));
1303*cdf0e10cSrcweir     maLeavingSlidePrimitives.push_back(Slide);
1304*cdf0e10cSrcweir 
1305*cdf0e10cSrcweir     Slide.Operations.clear();
1306*cdf0e10cSrcweir     Slide.Operations.push_back(new SRotate(basegfx::B3DVector(0,0,1),basegfx::B3DVector(0,0,0),-3000,true,0.5,1));
1307*cdf0e10cSrcweir     Slide.Operations.push_back(new STranslate(basegfx::B3DVector(-100, 0, 0),false, -1, 1));
1308*cdf0e10cSrcweir     Slide.Operations.push_back(new STranslate(basegfx::B3DVector(100, 0, 0),false, 0.5, 1));
1309*cdf0e10cSrcweir     Slide.Operations.push_back(new SScale(basegfx::B3DVector(0.01,0.01,0.01),basegfx::B3DVector(0,0,0),false,-1,1));
1310*cdf0e10cSrcweir     Slide.Operations.push_back(new SScale(basegfx::B3DVector(100,100,100),basegfx::B3DVector(0,0,0),true,0.5,1));
1311*cdf0e10cSrcweir     maEnteringSlidePrimitives.push_back(Slide);
1312*cdf0e10cSrcweir 
1313*cdf0e10cSrcweir     OverallOperations.push_back(new SRotate(basegfx::B3DVector(0,0,1),basegfx::B3DVector(0.2,0.2,0),1080,true,0,1));
1314*cdf0e10cSrcweir }
1315*cdf0e10cSrcweir 
1316