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