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