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