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