29#include <glm/gtc/matrix_transform.hpp>
30#include <glm/gtc/type_ptr.hpp>
45 : maLeavingSlidePrimitives(rOther.maLeavingSlidePrimitives)
46 , maEnteringSlidePrimitives(rOther.maEnteringSlidePrimitives)
47 , maOverallOperations(rOther.maOverallOperations)
48 , maSceneObjects(rOther.maSceneObjects)
76 double const RealF(1.0);
77 double const RealN(-1.0);
78 double const RealL(-1.0);
80 double const RealB(-1.0);
82 double ClipN(EyePos+5.0*RealN);
83 double ClipF(EyePos+15.0*RealF);
84 double ClipL(RealL*8.0);
85 double ClipR(RealR*8.0);
86 double ClipB(RealB*8.0);
87 double ClipT(RealT*8.0);
89 glm::mat4 projection = glm::frustum<float>(ClipL, ClipR, ClipB, ClipT, ClipN, ClipF);
91 glm::vec3
scale(1.0 / (((RealR * 2.0 * ClipN) / (EyePos * (ClipR - ClipL))) - ((ClipR + ClipL) / (ClipR - ClipL))),
92 1.0 / (((RealT * 2.0 * ClipN) / (EyePos * (ClipT - ClipB))) - ((ClipT + ClipB) / (ClipT - ClipB))),
94 projection = glm::scale(projection,
scale);
95 glm::mat4 modelview = glm::translate(glm::mat4(), glm::vec3(0, 0, -EyePos));
97 GLint location = glGetUniformLocation(
m_nProgramObject,
"u_projectionMatrix" );
98 if( location != -1 ) {
99 glUniformMatrix4fv(location, 1,
false, glm::value_ptr(projection));
104 if( location != -1 ) {
105 glUniformMatrix4fv(location, 1,
false, glm::value_ptr(modelview));
113 for (
const Primitive& primitive: primitives)
114 size += primitive.getVerticesByteSize();
117 glBufferData(GL_ARRAY_BUFFER,
size,
nullptr, GL_STATIC_DRAW);
119 Vertex *buf =
static_cast<Vertex*
>(glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY));
121 std::vector<int> indices;
123 for (
const Primitive& primitive: primitives) {
124 indices.push_back(last_pos);
125 int num = primitive.writeVertices(buf);
131 glUnmapBuffer(GL_ARRAY_BUFFER);
147 for(
size_t i(0);
i != rSceneObjects.size(); ++
i) {
151 GLint location = glGetUniformLocation(
m_nProgramObject,
"leavingSlideTexture" );
152 if( location != -1 ) {
153 glUniform1i( location, 0 );
157 location = glGetUniformLocation(
m_nProgramObject,
"enteringSlideTexture" );
158 if( location != -1 ) {
159 glUniform1i( location, 2 );
201 glBindBuffer(GL_ARRAY_BUFFER, 0);
211 for(
size_t i(0);
i != rSceneObjects.size(); ++
i) {
212 rSceneObjects[
i]->finish();
252 glActiveTexture( GL_TEXTURE2 );
253 glBindTexture( GL_TEXTURE_2D, glEnteringSlideTex );
254 glActiveTexture( GL_TEXTURE0 );
256 displaySlide( nTime, glLeavingSlideTex,
getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale );
261 double SlideWidth,
double SlideHeight,
double DispWidth,
double DispHeight,
OpenGLContext *pContext )
263 const double SlideWidthScale = SlideWidth/DispWidth;
264 const double SlideHeightScale = SlideHeight/DispHeight;
268 prepare( SlideWidth, SlideHeight );
271 displaySlides_( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale, pContext );
273 displayScene( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight );
281 for(
size_t i(0);
i != rOverallOperations.size(); ++
i)
290static void displayPrimitives(
const Primitives_t& primitives, GLint primitiveTransformLocation,
double nTime,
double WidthScale,
double HeightScale, std::vector<int>::const_iterator first)
292 for (
const Primitive& primitive: primitives)
293 primitive.display(primitiveTransformLocation, nTime, WidthScale, HeightScale, *
first++);
299 const sal_Int32 glSlideTex,
const Primitives_t& primitives,
300 double SlideWidthScale,
double SlideHeightScale )
303 glBindTexture(GL_TEXTURE_2D, glSlideTex);
316 const sal_Int32 glSlideTex,
const Primitives_t& primitives,
317 double SlideWidthScale,
double SlideHeightScale )
320 glBindTexture(GL_TEXTURE_2D, glSlideTex);
322 glBindVertexArray(0);
324 glBindBuffer(GL_ARRAY_BUFFER, 0);
330 for (
const Primitive& primitive: primitives)
343 for(
size_t i(0);
i != rSceneObjects.size(); ++
i)
348void Primitive::display(GLint primitiveTransformLocation,
double nTime,
double WidthScale,
double HeightScale)
const
354 if (primitiveTransformLocation != -1) {
355 glUniformMatrix4fv(primitiveTransformLocation, 1,
false, glm::value_ptr(
matrix));
359 GLuint nVertexArrayObject;
360 glGenVertexArrays(1, &nVertexArrayObject);
362 glBindVertexArray(nVertexArrayObject);
366 glGenBuffers(1, &nBuffer);
368 glBindBuffer(GL_ARRAY_BUFFER, nBuffer);
372 glEnableVertexAttribArray(0);
374 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,
sizeof(
Vertex),
nullptr);
376 glDrawArrays( GL_TRIANGLES, 0,
Vertices.size() );
379 glDeleteBuffers(1, &nBuffer);
382 glDeleteVertexArrays(1, &nVertexArrayObject);
386void Primitive::display(GLint primitiveTransformLocation,
double nTime,
double WidthScale,
double HeightScale,
int first)
const
392 if (primitiveTransformLocation != -1) {
393 glUniformMatrix4fv(primitiveTransformLocation, 1,
false, glm::value_ptr(
matrix));
404 rOperation->interpolate(
matrix, nTime, WidthScale, HeightScale);
405 matrix = glm::scale(
matrix, glm::vec3(WidthScale, HeightScale, 1));
408void SceneObject::display(GLint sceneTransformLocation, GLint primitiveTransformLocation,
double nTime,
double ,
double ,
double DispWidth,
double DispHeight )
const
413 if (DispHeight > DispWidth)
414 matrix = glm::scale(
matrix, glm::vec3(DispHeight/DispWidth, 1, 1));
416 matrix = glm::scale(
matrix, glm::vec3(1, DispWidth/DispHeight, 1));
418 if (sceneTransformLocation != -1) {
419 glUniformMatrix4fv(sceneTransformLocation, 1,
false, glm::value_ptr(
matrix));
448 virtual void prepare(GLuint program)
override;
449 virtual void display(GLint sceneTransformLocation, GLint primitiveTransformLocation,
double nTime,
double SlideWidth,
double SlideHeight,
double DispWidth,
double DispHeight)
const override;
450 virtual void finish()
override;
455 GLuint maVertexArray = 0;
458void Iris::display(GLint sceneTransformLocation, GLint primitiveTransformLocation,
double nTime,
double SlideWidth,
double SlideHeight,
double DispWidth,
double DispHeight )
const
460 glBindVertexArray(maVertexArray);
462 glBindTexture(GL_TEXTURE_2D, maTexture);
464 SceneObject::display(sceneTransformLocation, primitiveTransformLocation, nTime, SlideWidth, SlideHeight, DispWidth, DispHeight);
467void Iris::prepare(GLuint program)
470 static const GLubyte img[3] = { 80, 80, 80 };
472 glGenTextures(1, &maTexture);
473 glBindTexture(GL_TEXTURE_2D, maTexture);
474 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, img);
475 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
476 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
477 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
478 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
481 glGenVertexArrays(1, &maVertexArray);
482 glBindVertexArray(maVertexArray);
484 glGenBuffers(1, &maBuffer);
485 glBindBuffer(GL_ARRAY_BUFFER, maBuffer);
489 GLint location = glGetAttribLocation(program,
"a_position");
490 if (location != -1) {
491 glEnableVertexAttribArray(location);
492 glVertexAttribPointer( location, 3, GL_FLOAT,
false,
sizeof(
Vertex),
reinterpret_cast<void*
>(offsetof(
Vertex, position)) );
496 location = glGetAttribLocation(program,
"a_normal");
497 if (location != -1) {
498 glEnableVertexAttribArray(location);
499 glVertexAttribPointer( location, 3, GL_FLOAT,
false,
sizeof(
Vertex),
reinterpret_cast<void*
>(offsetof(
Vertex, normal)) );
503 location = glGetAttribLocation(program,
"a_texCoord");
504 if (location != -1) {
505 glEnableVertexAttribArray(location);
506 glVertexAttribPointer( location, 2, GL_FLOAT,
false,
sizeof(
Vertex),
reinterpret_cast<void*
>(offsetof(
Vertex, texcoord)) );
510 glBindBuffer(GL_ARRAY_BUFFER, 0);
516 glDeleteBuffers(1, &maBuffer);
518 glDeleteVertexArrays(1, &maVertexArray);
520 glDeleteTextures(1, &maTexture);
538 virtual void displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
double SlideWidthScale,
double SlideHeightScale,
OpenGLContext *pContext )
override;
541 glDisable(GL_CULL_FACE);
545 glEnable(GL_CULL_FACE);
549GLuint ReflectionTransition::makeShader()
const
554void ReflectionTransition::displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
555 double SlideWidthScale,
double SlideHeightScale,
OpenGLContext * )
558 applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
563 texture = glLeavingSlideTex;
564 slide = getScene().getLeavingSlide();
566 texture = glEnteringSlideTex;
567 slide = getScene().getEnteringSlide();
570 displaySlide( nTime, texture, slide, SlideWidthScale, SlideHeightScale );
574std::shared_ptr<OGLTransitionImpl>
575makeReflectionTransition(
581 return std::make_shared<ReflectionTransition>(
602 virtual void displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
double SlideWidthScale,
double SlideHeightScale,
OpenGLContext *pContext )
override;
605GLuint SimpleTransition::makeShader()
const
610void SimpleTransition::displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
611 double SlideWidthScale,
double SlideHeightScale,
OpenGLContext * )
614 applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
617 displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale );
618 displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale );
622std::shared_ptr<OGLTransitionImpl>
630 return std::make_shared<SimpleTransition>(
631 TransitionScene(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives),
632 std::move(rOverallOperations), std::move(rSceneObjects)),
636std::shared_ptr<OGLTransitionImpl>
643 return makeSimpleTransition(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives),
647std::shared_ptr<OGLTransitionImpl>
654 return makeSimpleTransition(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives),
658std::shared_ptr<OGLTransitionImpl>
664 return makeSimpleTransition(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives),
674 Slide.pushTriangle(glm::vec2(0,0),glm::vec2(1,0),glm::vec2(0,1));
675 Slide.pushTriangle(glm::vec2(1,0),glm::vec2(0,1),glm::vec2(1,1));
678 aLeavingPrimitives.push_back(
Slide);
680 Slide.Operations.push_back(
makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,-1),90,
false,
false,0.0,1.0));
683 aEnteringPrimitives.push_back(
Slide);
686 aOperations.push_back(
makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,-1),-90,
false,
true,0.0,1.0));
688 return makeSimpleTransition(std::move(aLeavingPrimitives), std::move(aEnteringPrimitives), std::move(aOperations));
695 Slide.pushTriangle(glm::vec2(0,0),glm::vec2(1,0),glm::vec2(0,1));
696 Slide.pushTriangle(glm::vec2(1,0),glm::vec2(0,1),glm::vec2(1,1));
699 aLeavingPrimitives.push_back(
Slide);
701 Slide.Operations.push_back(
makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,1),-90,
false,
false,0.0,1.0));
704 aEnteringPrimitives.push_back(
Slide);
707 aOperations.push_back(
makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,1),90,
false,
true,0.0,1.0));
709 return makeSimpleTransition(std::move(aLeavingPrimitives), std::move(aEnteringPrimitives), std::move(aOperations));
716 Slide.pushTriangle(glm::vec2(0,0),glm::vec2(1,0),glm::vec2(0,1));
717 Slide.pushTriangle(glm::vec2(1,0),glm::vec2(0,1),glm::vec2(1,1));
720 aEnteringPrimitives.push_back(
Slide);
722 Slide.Operations.push_back(
makeRotateAndScaleDepthByWidth(glm::vec3(1,0,0),glm::vec3(0,-1,0), 90,
true,
true,0.0,1.0));
724 aLeavingPrimitives.push_back(
Slide);
729 return makeSimpleTransition(std::move(aLeavingPrimitives), std::move(aEnteringPrimitives), aSettings);
737 Slide.pushTriangle(glm::vec2(0,0),glm::vec2(1,0),glm::vec2(0,1));
738 Slide.pushTriangle(glm::vec2(1,0),glm::vec2(0,1),glm::vec2(1,1));
740 aLeavingPrimitives.push_back(
Slide);
742 Slide.Operations.push_back(
makeSScale(glm::vec3(1, -1, 1), glm::vec3(0, -1.02, 0),
false, -1, 0));
743 aLeavingPrimitives.push_back(
Slide);
745 Slide.Operations.clear();
746 Slide.Operations.push_back(
makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0),-180,
true,
false,0.0,1.0));
748 aEnteringPrimitives.push_back(
Slide);
750 Slide.Operations.push_back(
makeSScale(glm::vec3(1, -1, 1), glm::vec3(0, -1.02, 0),
false, -1, 0));
751 aEnteringPrimitives.push_back(
Slide);
754 aOperations.push_back(
makeSTranslate(glm::vec3(0, 0, -1.5),
true, 0, 0.5));
755 aOperations.push_back(
makeSTranslate(glm::vec3(0, 0, 1.5),
true, 0.5, 1));
756 aOperations.push_back(
makeRotateAndScaleDepthByWidth(glm::vec3(0, 1, 0),glm::vec3(0, 0, 0), -180,
true,
true, 0.0, 1.0));
758 return makeReflectionTransition(std::move(aLeavingPrimitives), std::move(aEnteringPrimitives), std::move(aOperations), aSettings);
765 Slide.pushTriangle(glm::vec2(0,0),glm::vec2(1,0),glm::vec2(0,1));
766 Slide.pushTriangle(glm::vec2(1,0),glm::vec2(0,1),glm::vec2(1,1));
768 aLeavingPrimitives.push_back(
Slide);
771 Slide.Operations.push_back(
makeSRotate (glm::vec3(0, 0, 1), glm::vec3(-1, 1, 0), -90,
true, 0.0, 1.0));
772 Slide.Operations.push_back(
makeSRotate (glm::vec3(0, 0, 1), glm::vec3(-1, 1, 0), 90,
false, -1.0, 0.0));
774 aEnteringPrimitives.push_back(
Slide);
779 return makeSimpleTransition(std::move(aLeavingPrimitives), std::move(aEnteringPrimitives), aSettings);
786 Slide.pushTriangle (glm::vec2 (0,0), glm::vec2 (1,0), glm::vec2 (0,1));
787 Slide.pushTriangle (glm::vec2 (1,0), glm::vec2 (0,1), glm::vec2 (1,1));
789 aEnteringPrimitives.push_back (
Slide);
794 aLeavingPrimitives.push_back (
Slide);
798 int i, nSteps = 24, nParts = 7;
799 double t = 1.0/nSteps, lx = 1, ly = 0, of=2.2, f=1.42;
801 for (
i=1;
i<=nSteps;
i++) {
802 double x = cos ((3*2*M_PI*
t)/nParts);
803 double y = -sin ((3*2*M_PI*
t)/nParts);
804 double cx = (f*
x + 1)/2;
805 double cy = (f*
y + 1)/2;
806 double lcx = (f*lx + 1)/2;
807 double lcy = (f*ly + 1)/2;
808 double cxo = (of*
x + 1)/2;
809 double cyo = (of*
y + 1)/2;
810 double lcxo = (of*lx + 1)/2;
811 double lcyo = (of*ly + 1)/2;
813 glm::vec2 (lcxo, lcyo),
816 glm::vec2 (lcxo, lcyo),
817 glm::vec2 (cxo, cyo));
823 std::shared_ptr<Iris> pIris = std::make_shared<Iris>();
826 for (
i = 0;
i < nParts;
i++) {
830 rx = cos ((2*M_PI*
i)/nParts);
831 ry = sin ((2*M_PI*
i)/nParts);
832 irisPart.
Operations.push_back (
makeSRotate (glm::vec3(0, 0, 1), glm::vec3(rx, ry, 0), angle,
true, 0.0, 0.5));
833 irisPart.
Operations.push_back (
makeSRotate (glm::vec3(0, 0, 1), glm::vec3(rx, ry, 0), -angle,
true, 0.5, 1));
836 irisPart.
Operations.push_back (
makeSRotate (glm::vec3(0, 0, 1), glm::vec3(0, 0, 0),
i*360.0/nParts,
false, -1, 0));
840 irisPart.
Operations.push_back (
makeSRotate (glm::vec3(1, .5, 0), glm::vec3(1, 0, 0), -30,
false, -1, 0));
841 pIris->pushPrimitive (irisPart);
845 aSceneObjects.push_back (pIris);
850 return makeSimpleTransition(std::move(aLeavingPrimitives), std::move(aEnteringPrimitives), std::move(aSceneObjects), aSettings);
856class RochadeTransition :
public ReflectionTransition
860 : ReflectionTransition(rScene, rSettings)
864 virtual void displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
double SlideWidthScale,
double SlideHeightScale,
OpenGLContext *pContext)
override;
867void RochadeTransition::displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
double SlideWidthScale,
double SlideHeightScale,
OpenGLContext * )
869 applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
872 displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale );
873 displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale );
875 displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale );
876 displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale );
880std::shared_ptr<OGLTransitionImpl>
881makeRochadeTransition(
886 return std::make_shared<RochadeTransition>(
887 TransitionScene(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives)),
904 Slide.pushTriangle(glm::vec2(0,0),glm::vec2(1,0),glm::vec2(0,1));
905 Slide.pushTriangle(glm::vec2(1,0),glm::vec2(0,1),glm::vec2(1,1));
908 Slide.Operations.push_back(
makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0), -45,
true,
true, 0, 1));
910 aLeavingSlide.push_back(
Slide);
912 Slide.Operations.push_back(
makeSScale(glm::vec3(1, -1, 1), glm::vec3(0, -1.02, 0),
false, -1, 0));
913 aLeavingSlide.push_back(
Slide);
915 Slide.Operations.clear();
918 Slide.Operations.push_back(
makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0), -45,
true,
true, 0, 1));
919 Slide.Operations.push_back(
makeRotateAndScaleDepthByWidth(glm::vec3(0,1,0),glm::vec3(0,0,0), 45,
true,
false, -1, 0));
921 aEnteringSlide.push_back(
Slide);
923 Slide.Operations.push_back(
makeSScale(glm::vec3(1, -1, 1), glm::vec3(0, -1.02, 0),
false, -1, 0));
924 aEnteringSlide.push_back(
Slide);
926 return makeRochadeTransition(std::move(aLeavingSlide), std::move(aEnteringSlide), aSettings);
938 return glm::normalize(toReturn);
949 double dAngle(2*M_PI/
static_cast<double>( nPointsOnCircles ));
950 if(nCircles < 2 || nPointsOnCircles < 4)
952 float Radius(1.0/
static_cast<double>( nCircles ));
953 float dRadius(Radius);
954 float LastRadius(0.0);
955 float NextRadius(2*Radius);
962 std::vector<glm::vec2> unScaledTexCoords;
963 float TempAngle(0.0);
966 unScaledTexCoords.emplace_back( cos(TempAngle - M_PI_2) , sin(TempAngle- M_PI_2) );
978 EnteringSlide.
pushTriangle( glm::vec2( 0.5 , 0.5 ) , Radius * unScaledTexCoords[
Point + 1 ] / 2.0f + glm::vec2( 0.5 , 0.5 ) , Radius * unScaledTexCoords[
Point ] / 2.0f + glm::vec2( 0.5 , 0.5 ) );
979 LeavingSlide.
pushTriangle( glm::vec2( 0.5 , 0.5 ) , Radius * unScaledTexCoords[
Point + 1 ] / 2.0f + glm::vec2( 0.5 , 0.5 ) , Radius * unScaledTexCoords[
Point ] / 2.0f + glm::vec2( 0.5, 0.5) );
981 EnteringSlide.
pushTriangle( glm::vec2(0.5,0.5) , Radius * unScaledTexCoords[ 0 ] / 2.0f + glm::vec2( 0.5 , 0.5 ) , Radius * unScaledTexCoords[ nPointsOnCircles - 1 ] / 2.0f + glm::vec2( 0.5 , 0.5 ) );
982 LeavingSlide.
pushTriangle( glm::vec2(0.5,0.5) , Radius*unScaledTexCoords[0]/2.0f + glm::vec2(0.5,0.5) , Radius*unScaledTexCoords[nPointsOnCircles - 1]/2.0f + glm::vec2(0.5,0.5) );
985 EnteringSlide.
Operations.push_back(
makeSRotate( axis , glm::vec3(0,0,0) , 180,
true, Radius/2.0 , (NextRadius + 1)/2.0 ) );
986 LeavingSlide.
Operations.push_back(
makeSRotate( axis , glm::vec3(0,0,0) , 180,
true, Radius/2.0 , (NextRadius + 1)/2.0 ) );
989 aEnteringSlide.push_back(EnteringSlide);
990 aLeavingSlide.push_back(LeavingSlide);
993 NextRadius += dRadius;
996 for(
int i(1);
i < nCircles - 1; ++
i)
1000 for(
int Side(0); Side < nPointsOnCircles - 1; ++Side)
1002 EnteringSlide.
pushTriangle(Radius*unScaledTexCoords[Side]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0f + glm::vec2(0.5,0.5) );
1003 EnteringSlide.
pushTriangle(Radius*unScaledTexCoords[Side]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0f + glm::vec2(0.5,0.5) , Radius*unScaledTexCoords[Side + 1]/2.0f + glm::vec2(0.5,0.5) );
1005 LeavingSlide.
pushTriangle(Radius*unScaledTexCoords[Side]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0f + glm::vec2(0.5,0.5) );
1006 LeavingSlide.
pushTriangle(Radius*unScaledTexCoords[Side]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0f + glm::vec2(0.5,0.5) , Radius*unScaledTexCoords[Side + 1]/2.0f + glm::vec2(0.5,0.5) );
1009 EnteringSlide.
pushTriangle(Radius*unScaledTexCoords[nPointsOnCircles - 1]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[nPointsOnCircles - 1]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0f + glm::vec2(0.5,0.5) );
1010 EnteringSlide.
pushTriangle(Radius*unScaledTexCoords[nPointsOnCircles - 1]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0f + glm::vec2(0.5,0.5) , Radius*unScaledTexCoords[0]/2.0f + glm::vec2(0.5,0.5) );
1012 LeavingSlide.
pushTriangle(Radius*unScaledTexCoords[nPointsOnCircles - 1]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[nPointsOnCircles - 1]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0f + glm::vec2(0.5,0.5) );
1013 LeavingSlide.
pushTriangle(Radius*unScaledTexCoords[nPointsOnCircles - 1]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0f + glm::vec2(0.5,0.5) , Radius*unScaledTexCoords[0]/2.0f + glm::vec2(0.5,0.5) );
1016 EnteringSlide.
Operations.push_back(
makeSRotate( axis , glm::vec3(0,0,0) , 180,
true, Radius/2.0 , (NextRadius + 1)/2.0 ) );
1017 LeavingSlide.
Operations.push_back(
makeSRotate( axis , glm::vec3(0,0,0) , 180,
true, Radius/2.0 , (NextRadius + 1)/2.0 ) );
1020 aEnteringSlide.push_back(EnteringSlide);
1021 aLeavingSlide.push_back(LeavingSlide);
1023 LastRadius = Radius;
1024 Radius = NextRadius;
1025 NextRadius += dRadius;
1031 for(
int Side(0); Side < nPointsOnCircles - 1; ++Side)
1034 EnteringSlide.
pushTriangle(
clamp(Radius*unScaledTexCoords[Side])/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0f + glm::vec2(0.5,0.5) );
1035 EnteringSlide.
pushTriangle(
clamp(Radius*unScaledTexCoords[Side])/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0f + glm::vec2(0.5,0.5) ,
clamp(Radius*unScaledTexCoords[Side + 1])/2.0f + glm::vec2(0.5,0.5) );
1037 LeavingSlide.
pushTriangle(
clamp(Radius*unScaledTexCoords[Side])/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0f + glm::vec2(0.5,0.5) );
1038 LeavingSlide.
pushTriangle(
clamp(Radius*unScaledTexCoords[Side])/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[Side + 1]/2.0f + glm::vec2(0.5,0.5) ,
clamp(Radius*unScaledTexCoords[Side + 1])/2.0f + glm::vec2(0.5,0.5) );
1041 EnteringSlide.
pushTriangle(
clamp(Radius*unScaledTexCoords[nPointsOnCircles - 1])/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[nPointsOnCircles - 1]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0f + glm::vec2(0.5,0.5) );
1042 EnteringSlide.
pushTriangle(
clamp(Radius*unScaledTexCoords[nPointsOnCircles - 1])/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0f + glm::vec2(0.5,0.5) ,
clamp(Radius*unScaledTexCoords[0])/2.0f + glm::vec2(0.5,0.5) );
1044 LeavingSlide.
pushTriangle(
clamp(Radius*unScaledTexCoords[nPointsOnCircles - 1])/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[nPointsOnCircles - 1]/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0f + glm::vec2(0.5,0.5) );
1045 LeavingSlide.
pushTriangle(
clamp(Radius*unScaledTexCoords[nPointsOnCircles - 1])/2.0f + glm::vec2(0.5,0.5) , LastRadius*unScaledTexCoords[0]/2.0f + glm::vec2(0.5,0.5) ,
clamp(Radius*unScaledTexCoords[0])/2.0f + glm::vec2(0.5,0.5) );
1048 EnteringSlide.
Operations.push_back(
makeSRotate( axis , glm::vec3(0,0,0) , 180,
true, (LastRadius + dRadius)/2.0 , 1.0 ) );
1049 LeavingSlide.
Operations.push_back(
makeSRotate( axis , glm::vec3(0,0,0) , 180,
true, (LastRadius + dRadius)/2.0 , 1.0 ) );
1052 aEnteringSlide.push_back(EnteringSlide);
1053 aLeavingSlide.push_back(LeavingSlide);
1056 return makeSimpleTransition(std::move(aLeavingSlide), std::move(aEnteringSlide));
1059std::shared_ptr<OGLTransitionImpl>
makeHelix( sal_uInt16 nRows )
1061 double invN(1.0/
static_cast<double>(nRows));
1066 for(
unsigned int i(0);
i < nRows; ++
i)
1070 Tile.pushTriangle(glm::vec2( 1.0 , iDn ) , glm::vec2( 0.0 , iDn ) , glm::vec2( 0.0 , iPDn ));
1072 Tile.pushTriangle(glm::vec2( 1.0 , iPDn ) , glm::vec2( 1.0 , iDn ) , glm::vec2( 0.0 , iPDn ));
1074 Tile.Operations.push_back(
makeSRotate( glm::vec3( 0 , 1 , 0 ) , (
Tile.getVertex(1) +
Tile.getVertex(3) )/2.0f , 180 ,
1075 true, std::min(std::max(
static_cast<double>(
i - nRows/2.0)*invN/2.0,0.0),1.0),
1076 std::min(std::max(
static_cast<double>(
i + nRows/2.0)*invN/2.0,0.0),1.0) ) );
1078 aLeavingSlide.push_back(
Tile);
1080 Tile.Operations.push_back(
makeSRotate( glm::vec3( 0 , 1 , 0 ) , (
Tile.getVertex(1) +
Tile.getVertex(3) )/2.0f , -180 ,
false,0.0,1.0) );
1082 aEnteringSlide.push_back(
Tile);
1088 return makeSimpleTransition(std::move(aLeavingSlide), std::move(aEnteringSlide));
1093 return static_cast<float>(
a)/b;
1096static glm::vec2
vec(
float x,
float y,
float nx,
float ny)
1098 x =
x < 0.0 ? 0.0 :
x;
1099 x = std::min(
x,
nx);
1100 y =
y < 0.0 ? 0.0 :
y;
1101 y = std::min(
y,
ny);
1110 for (
int x = 0;
x <
n;
x++)
1112 for (
int y = 0;
y <
n;
y++)
1115 glm::vec2 x11 =
vec(
x,
y,
n,
m);
1116 glm::vec2 x12 =
vec(
x,
y+1,
n,
m);
1117 glm::vec2 x21 =
vec(
x+1,
y,
n,
m);
1118 glm::vec2 x22 =
vec(
x+1,
y+1,
n,
m);
1124 aLeavingSlide.push_back(aTile);
1127 aEnteringSlide.push_back(aTile);
1131 return makeSimpleTransition(std::move(aLeavingSlide), std::move(aEnteringSlide));
1142 : Operations(rvalue.Operations)
1143 , Vertices(rvalue.Vertices)
1157 std::vector<glm::vec3> Verts;
1158 std::vector<glm::vec2> Texs;
1162 Verts.emplace_back( 2*SlideLocation0.x - 1, -2*SlideLocation0.y + 1 , 0.0 );
1163 Verts.emplace_back( 2*SlideLocation1.x - 1, -2*SlideLocation1.y + 1 , 0.0 );
1164 Verts.emplace_back( 2*SlideLocation2.x - 1, -2*SlideLocation2.y + 1 , 0.0 );
1167 glm::vec3
Normal( glm::cross( Verts[0] - Verts[1] , Verts[1] - Verts[2] ) );
1170 Texs.push_back(SlideLocation0);
1171 Texs.push_back(SlideLocation1);
1172 Texs.push_back(SlideLocation2);
1176 Texs.push_back(SlideLocation0);
1177 Texs.push_back(SlideLocation2);
1178 Texs.push_back(SlideLocation1);
1180 Verts.emplace_back( 2*SlideLocation0.x - 1, -2*SlideLocation0.y + 1 , 0.0 );
1181 Verts.emplace_back( 2*SlideLocation2.x - 1, -2*SlideLocation2.y + 1 , 0.0 );
1182 Verts.emplace_back( 2*SlideLocation1.x - 1, -2*SlideLocation1.y + 1 , 0.0 );
1185 Vertices.push_back({Verts[0], glm::vec3(0, 0, 1), Texs[0]});
1186 Vertices.push_back({Verts[1], glm::vec3(0, 0, 1), Texs[1]});
1187 Vertices.push_back({Verts[2], glm::vec3(0, 0, 1), Texs[2]});
1193class DiamondTransition :
public SimpleTransition
1197 : SimpleTransition(rScene, rSettings)
1201 virtual void displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
double SlideWidthScale,
double SlideHeightScale,
OpenGLContext *pContext )
override;
1207 if( nTime >= 0.5 ) {
1208 double m = 1 - nTime;
1210 Slide2.
pushTriangle (glm::vec2 (0,0), glm::vec2 (m,0), glm::vec2 (0,m));
1211 Slide2.
pushTriangle (glm::vec2 (nTime,0), glm::vec2 (1,0), glm::vec2 (1,m));
1212 Slide2.
pushTriangle (glm::vec2 (1,nTime), glm::vec2 (1,1), glm::vec2 (nTime,1));
1213 Slide2.
pushTriangle (glm::vec2 (0,nTime), glm::vec2 (m,1), glm::vec2 (0,1));
1215 double l = 0.5 - nTime;
1216 double h = 0.5 + nTime;
1218 Slide2.
pushTriangle (glm::vec2 (0,0), glm::vec2 (1,0), glm::vec2 (0.5,l));
1219 Slide2.
pushTriangle (glm::vec2 (0.5,l), glm::vec2 (1,0), glm::vec2 (h,0.5));
1220 Slide2.
pushTriangle (glm::vec2 (1,0), glm::vec2 (1,1), glm::vec2 (h,0.5));
1221 Slide2.
pushTriangle (glm::vec2 (h,0.5), glm::vec2 (1,1), glm::vec2 (0.5,h));
1222 Slide2.
pushTriangle (glm::vec2 (0.5,h), glm::vec2 (1,1), glm::vec2 (0,1));
1223 Slide2.
pushTriangle (glm::vec2 (l,0.5), glm::vec2 (0.5,h), glm::vec2 (0,1));
1224 Slide2.
pushTriangle (glm::vec2 (0,0), glm::vec2 (l,0.5), glm::vec2 (0,1));
1225 Slide2.
pushTriangle (glm::vec2 (0,0), glm::vec2 (0.5,l), glm::vec2 (l,0.5));
1229 aLeavingSlidePrimitives.push_back (Slide2);
1231 return aLeavingSlidePrimitives;
1234void DiamondTransition::displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
1235 double SlideWidthScale,
double SlideHeightScale,
OpenGLContext * )
1238 applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
1241 displayUnbufferedSlide( nTime, glLeavingSlideTex, makeLeavingSlide(nTime), SlideWidthScale, SlideHeightScale );
1242 displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale );
1246std::shared_ptr<OGLTransitionImpl>
1250 Slide1.
pushTriangle (glm::vec2 (0,0), glm::vec2 (1,0), glm::vec2 (0,1));
1251 Slide1.
pushTriangle (glm::vec2 (1,0), glm::vec2 (0,1), glm::vec2 (1,1));
1253 aEnteringSlidePrimitives.push_back (Slide1);
1255 aLeavingSlidePrimitives.push_back (Slide1);
1256 return std::make_shared<DiamondTransition>(
TransitionScene(std::move(aLeavingSlidePrimitives), std::move(aEnteringSlidePrimitives)), rSettings);
1266 return makeDiamondTransition(aSettings);
1271 static double t30 = tan( M_PI/6.0 );
1273 double p = 1.0/parts;
1277 for(
int i=0;
i<parts;
i++ ) {
1279 double n = (
i + 1)/
static_cast<double>(parts);
1281 Slide.pushTriangle (glm::vec2 (ln,0), glm::vec2 (
n,0), glm::vec2 (ln,1));
1282 Slide.pushTriangle (glm::vec2 (
n,0), glm::vec2 (ln,1), glm::vec2 (
n,1));
1283 Slide.Operations.push_back(
makeRotateAndScaleDepthByWidth(glm::vec3(0, 1, 0), glm::vec3(
n + ln - 1, 0, -t30*
p), -120,
true,
true, 0.0, 1.0));
1285 Slide.pushTriangle (glm::vec2 (0,ln), glm::vec2 (1,ln), glm::vec2 (0,
n));
1286 Slide.pushTriangle (glm::vec2 (1,ln), glm::vec2 (0,
n), glm::vec2 (1,
n));
1287 Slide.Operations.push_back(
makeRotateAndScaleDepthByHeight(glm::vec3(1, 0, 0), glm::vec3(0, 1 -
n - ln, -t30*
p), -120,
true,
true, 0.0, 1.0));
1289 aLeavingSlide.push_back (
Slide);
1292 Slide.Operations.push_back(
makeSRotate(glm::vec3(0, 1, 0), glm::vec3(2*
n - 1, 0, 0), -60,
false, -1, 0));
1293 Slide.Operations.push_back(
makeSRotate(glm::vec3(0, 1, 0), glm::vec3(
n + ln - 1, 0, 0), 180,
false, -1, 0));
1295 Slide.Operations.push_back(
makeSRotate(glm::vec3(1, 0, 0), glm::vec3(0, 1 - 2*
n, 0), -60,
false, -1, 0));
1296 Slide.Operations.push_back(
makeSRotate(glm::vec3(1, 0, 0), glm::vec3(0, 1 -
n - ln, 0), 180,
false, -1, 0));
1298 aEnteringSlide.push_back (
Slide);
1302 return makeSimpleTransition(std::move(aLeavingSlide), std::move(aEnteringSlide));
1319GLuint FadeSmoothlyTransition::makeShader()
const
1324std::shared_ptr<OGLTransitionImpl>
1325makeFadeSmoothlyTransition(
1330 return std::make_shared<FadeSmoothlyTransition>(
1331 TransitionScene(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives)),
1342 Slide.pushTriangle (glm::vec2 (0,0), glm::vec2 (1,0), glm::vec2 (0,1));
1343 Slide.pushTriangle (glm::vec2 (1,0), glm::vec2 (0,1), glm::vec2 (1,1));
1345 aLeavingSlide.push_back (
Slide);
1347 aEnteringSlide.push_back (
Slide);
1352 return makeFadeSmoothlyTransition(std::move(aLeavingSlide), std::move(aEnteringSlide), aSettings);
1370GLuint FadeThroughColorTransition::makeShader()
const
1373 useWhite ?
"#define use_white" :
"",
"" );
1376std::shared_ptr<OGLTransitionImpl>
1377makeFadeThroughColorTransition(
1383 return std::make_shared<FadeThroughColorTransition>(
1384 TransitionScene(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives)),
1395 Slide.pushTriangle (glm::vec2 (0,0), glm::vec2 (1,0), glm::vec2 (0,1));
1396 Slide.pushTriangle (glm::vec2 (1,0), glm::vec2 (0,1), glm::vec2 (1,1));
1398 aLeavingSlide.push_back (
Slide);
1400 aEnteringSlide.push_back (
Slide);
1405 return makeFadeThroughColorTransition(std::move(aLeavingSlide), std::move(aEnteringSlide), aSettings, white);
1416 , m_nHelperTexture(0)
1424 GLuint m_nHelperTexture;
1427void PermTextureTransition::finishTransition()
1430 if ( m_nHelperTexture )
1432 glDeleteTextures( 1, &m_nHelperTexture );
1433 m_nHelperTexture = 0;
1438constexpr auto permutation2D = []()
constexpr {
1439 int permutation256 [256]= {
1440 215, 100, 200, 204, 233, 50, 85, 196,
1441 71, 141, 122, 160, 93, 131, 243, 234,
1442 162, 183, 36, 155, 4, 62, 35, 205,
1443 40, 102, 33, 27, 255, 55, 214, 156,
1444 75, 163, 134, 126, 249, 74, 197, 228,
1445 72, 90, 206, 235, 17, 22, 49, 169,
1446 227, 89, 16, 5, 117, 60, 248, 230,
1447 217, 68, 138, 96, 194, 170, 136, 10,
1448 112, 238, 184, 189, 176, 42, 225, 212,
1449 84, 58, 175, 244, 150, 168, 219, 236,
1450 101, 208, 123, 37, 164, 110, 158, 201,
1451 78, 114, 57, 48, 70, 142, 106, 43,
1452 232, 26, 32, 252, 239, 98, 191, 94,
1453 59, 149, 39, 187, 203, 190, 19, 13,
1454 133, 45, 61, 247, 23, 34, 20, 52,
1455 118, 209, 146, 193, 222, 18, 1, 152,
1456 46, 41, 91, 148, 115, 25, 135, 77,
1457 254, 147, 224, 161, 9, 213, 223, 250,
1458 231, 251, 127, 166, 63, 179, 81, 130,
1459 139, 28, 120, 151, 241, 86, 111, 0,
1460 88, 153, 172, 182, 159, 105, 178, 47,
1461 51, 167, 65, 66, 92, 73, 198, 211,
1462 245, 195, 31, 220, 140, 76, 221, 186,
1463 154, 185, 56, 83, 38, 165, 109, 67,
1464 124, 226, 132, 53, 229, 29, 12, 181,
1465 121, 24, 207, 199, 177, 113, 30, 80,
1466 3, 97, 188, 79, 216, 173, 8, 145,
1467 87, 128, 180, 237, 240, 137, 125, 104,
1468 15, 242, 119, 246, 103, 143, 95, 144,
1469 2, 44, 69, 157, 192, 174, 14, 54,
1470 218, 82, 64, 210, 11, 6, 129, 21,
1471 116, 171, 99, 202, 7, 107, 253, 108
1473 std::array<unsigned char, 256 * 256>
a{};
1474 for (
int y = 0;
y < 256;
y++)
1475 for (
int x = 0;
x < 256;
x++)
1476 a[x + y * 256] = permutation256[(y + permutation256[x]) & 0xff];
1480void initPermTexture(GLuint *texID)
1483 glGenTextures(1, texID);
1484 glBindTexture(GL_TEXTURE_2D, *texID);
1485 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RED, GL_UNSIGNED_BYTE,
1486 permutation2D.data());
1487 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
1488 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
1492void PermTextureTransition::prepareTransition( sal_Int32, sal_Int32,
OpenGLContext* )
1495 GLint location = glGetUniformLocation( m_nProgramObject,
"permTexture" );
1496 if( location != -1 ) {
1497 glActiveTexture(GL_TEXTURE1);
1499 if( !m_nHelperTexture )
1500 initPermTexture( &m_nHelperTexture );
1502 glActiveTexture(GL_TEXTURE0);
1505 glUniform1i( location, 1 );
1516class StaticNoiseTransition :
public PermTextureTransition
1520 : PermTextureTransition(rScene, rSettings)
1524 virtual GLuint makeShader()
const override;
1527GLuint StaticNoiseTransition::makeShader()
const
1532std::shared_ptr<OGLTransitionImpl>
1533makeStaticNoiseTransition(
1538 return std::make_shared<StaticNoiseTransition>(
1539 TransitionScene(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives)),
1550 Slide.pushTriangle (glm::vec2 (0,0), glm::vec2 (1,0), glm::vec2 (0,1));
1551 Slide.pushTriangle (glm::vec2 (1,0), glm::vec2 (0,1), glm::vec2 (1,1));
1553 aLeavingSlide.push_back (
Slide);
1555 aEnteringSlide.push_back (
Slide);
1560 return makeStaticNoiseTransition(std::move(aLeavingSlide), std::move(aEnteringSlide), aSettings);
1566class DissolveTransition :
public PermTextureTransition
1570 : PermTextureTransition(rScene, rSettings)
1574 virtual GLuint makeShader()
const override;
1577GLuint DissolveTransition::makeShader()
const
1582std::shared_ptr<OGLTransitionImpl>
1583makeDissolveTransition(
1588 return std::make_shared<DissolveTransition>(
1589 TransitionScene(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives)),
1600 Slide.pushTriangle (glm::vec2 (0,0), glm::vec2 (1,0), glm::vec2 (0,1));
1601 Slide.pushTriangle (glm::vec2 (1,0), glm::vec2 (0,1), glm::vec2 (1,1));
1603 aLeavingSlide.push_back (
Slide);
1605 aEnteringSlide.push_back (
Slide);
1610 return makeDissolveTransition(std::move(aLeavingSlide), std::move(aEnteringSlide), aSettings);
1616class VortexTransition :
public PermTextureTransition
1620 : PermTextureTransition(rScene, rSettings)
1621 , maNumTiles(nNX,nNY)
1623 mvTileInfo.resize(6*maNumTiles.x*maNumTiles.y);
1624 mnFramebuffers[0] = 0;
1625 mnFramebuffers[1] = 0;
1626 mnDepthTextures[0] = 0;
1627 mnDepthTextures[1] = 0;
1631 virtual void finishTransition()
override;
1632 virtual GLuint makeShader()
const override;
1633 virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
OpenGLContext *pContext )
override;
1634 virtual void displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
double SlideWidthScale,
double SlideHeightScale,
OpenGLContext *pContext )
override;
1636 GLint mnSlideLocation = -1;
1637 GLint mnTileInfoLocation = -1;
1638 GLuint mnTileInfoBuffer = 0
u;
1639 GLint mnShadowLocation = -1;
1640 std::array<GLuint, 2> mnFramebuffers;
1641 std::array<GLuint, 2> mnDepthTextures;
1643 glm::ivec2 maNumTiles;
1645 std::vector<GLfloat> mvTileInfo;
1648void VortexTransition::finishTransition()
1650 PermTextureTransition::finishTransition();
1653 glDeleteTextures(2, mnDepthTextures.data());
1654 mnDepthTextures = {0
u, 0
u};
1656 glDeleteFramebuffers(2, mnFramebuffers.data());
1657 mnFramebuffers = {0
u, 0
u};
1658 glDeleteBuffers(1, &mnTileInfoBuffer);
1659 mnTileInfoBuffer = 0
u;
1660 mnSlideLocation = -1;
1661 mnTileInfoLocation = -1;
1662 mnShadowLocation = -1;
1666GLuint VortexTransition::makeShader()
const
1671glm::mat4 lookAt(
const glm::vec3& eye,
const glm::vec3& center,
const glm::vec3& up) {
1672 glm::vec3 f = glm::normalize(center - eye);
1673 glm::vec3
u = glm::normalize(up);
1674 glm::vec3 s = glm::normalize(glm::cross(f, u));
1675 u = glm::cross(s, f);
1677 return glm::mat4(s.x,
u.x, -f.x, 0,
1680 -glm::dot(s, eye), -glm::dot(u, eye), glm::dot(f, eye), 1);
1683void VortexTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
OpenGLContext *pContext )
1686 PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex, pContext );
1689 mnSlideLocation = glGetUniformLocation(m_nProgramObject,
"slide");
1690 mnTileInfoLocation = glGetAttribLocation(m_nProgramObject,
"tileInfo");
1691 GLint nNumTilesLocation = glGetUniformLocation(m_nProgramObject,
"numTiles");
1692 mnShadowLocation = glGetUniformLocation(m_nProgramObject,
"shadow");
1693 GLint nOrthoProjectionMatrix = glGetUniformLocation(m_nProgramObject,
"orthoProjectionMatrix");
1694 GLint nOrthoViewMatrix = glGetUniformLocation(m_nProgramObject,
"orthoViewMatrix");
1695 GLint location = glGetUniformLocation(m_nProgramObject,
"leavingShadowTexture");
1696 glUniform1i(location, 2);
1697 location = glGetUniformLocation(m_nProgramObject,
"enteringShadowTexture");
1698 glUniform1i(location, 3);
1701 glUniform2iv(nNumTilesLocation, 1, glm::value_ptr(maNumTiles));
1704 glGenBuffers(1, &mnTileInfoBuffer);
1708 assert(maNumTiles.x < 256);
1709 assert(maNumTiles.y < 256);
1714 for (
int x = 0;
x < maNumTiles.x;
x++)
1716 for (
int y = 0;
y < maNumTiles.y;
y++)
1718 for (
int v = 0;
v < 6;
v++)
1720 mvTileInfo[
n] =
x + (
y << 8) + (v << 16);
1727 glBindBuffer(GL_ARRAY_BUFFER, mnTileInfoBuffer);
1729 glEnableVertexAttribArray(mnTileInfoLocation);
1731 glVertexAttribPointer(mnTileInfoLocation, 1, GL_FLOAT, GL_FALSE, 0,
nullptr);
1733 glBufferData(GL_ARRAY_BUFFER, mvTileInfo.size()*
sizeof(GLfloat), mvTileInfo.data(), GL_STATIC_DRAW);
1736 glBindBuffer(GL_ARRAY_BUFFER, 0);
1739 double EyePos(10.0);
1740 double const RealF(1.0);
1741 double const RealN(-1.0);
1742 double const RealL(-2.0);
1744 double const RealB(-2.0);
1746 double ClipN(EyePos+5.0*RealN);
1747 double ClipF(EyePos+15.0*RealF);
1748 double ClipL(RealL*8.0);
1749 double ClipR(RealR*8.0);
1750 double ClipB(RealB*8.0);
1751 double ClipT(RealT*8.0);
1753 glm::mat4 projection = glm::ortho<float>(ClipL, ClipR, ClipB, ClipT, ClipN, ClipF);
1755 glm::vec3
scale(1.0 / (((RealR * 2.0 * ClipN) / (EyePos * (ClipR - ClipL))) - ((ClipR + ClipL) / (ClipR - ClipL))),
1756 1.0 / (((RealT * 2.0 * ClipN) / (EyePos * (ClipT - ClipB))) - ((ClipT + ClipB) / (ClipT - ClipB))),
1758 projection = glm::scale(projection, scale);
1759 glUniformMatrix4fv(nOrthoProjectionMatrix, 1,
false, glm::value_ptr(projection));
1761 glm::mat4 view = lookAt(glm::vec3(-1, 1, EyePos), glm::vec3(-0.5, 0.5, 0), glm::vec3(0, 1, 0));
1762 glUniformMatrix4fv(nOrthoViewMatrix, 1,
false, glm::value_ptr(view));
1765 glGenTextures(2, mnDepthTextures.data());
1766 glGenFramebuffers(2, mnFramebuffers.data());
1768 for (
int i : {0, 1}) {
1769 glBindTexture(GL_TEXTURE_2D, mnDepthTextures[i]);
1770 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, 2048, 2048, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
nullptr);
1771 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1772 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1773 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1774 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1776 glBindFramebuffer(GL_FRAMEBUFFER, mnFramebuffers[i]);
1777 glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, mnDepthTextures[i], 0);
1778 glDrawBuffer(GL_NONE);
1781 if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
1782 SAL_WARN(
"slideshow.opengl",
"Wrong framebuffer!");
1788 glBindTexture(GL_TEXTURE_2D, 0);
1790 glActiveTexture( GL_TEXTURE2 );
1791 glBindTexture( GL_TEXTURE_2D, mnDepthTextures[0] );
1792 glActiveTexture( GL_TEXTURE3 );
1793 glBindTexture( GL_TEXTURE_2D, mnDepthTextures[1] );
1794 glActiveTexture( GL_TEXTURE0 );
1797void VortexTransition::displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
double SlideWidthScale,
double SlideHeightScale,
OpenGLContext * pContext )
1800 applyOverallOperations( nTime, SlideWidthScale, SlideHeightScale );
1801 glUniform1f( m_nTimeLocation, nTime );
1802 glUniform1f( mnShadowLocation, 1.0 );
1804 std::array<GLint, 4> viewport;
1805 glGetIntegerv(GL_VIEWPORT, viewport.data());
1806 glViewport(0, 0, 2048, 2048);
1808 glBindFramebuffer(GL_FRAMEBUFFER, mnFramebuffers[0]);
1809 glClear(GL_DEPTH_BUFFER_BIT);
1810 glUniform1f( mnSlideLocation, 0.0 );
1811 displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale );
1813 glBindFramebuffer(GL_FRAMEBUFFER, mnFramebuffers[1]);
1814 glClear(GL_DEPTH_BUFFER_BIT);
1815 glUniform1f( mnSlideLocation, 1.0 );
1816 displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale );
1818 glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
1820 glUniform1f( mnShadowLocation, 0.0 );
1821 glUniform1f( mnSlideLocation, 0.0 );
1822 displaySlide( nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale );
1823 glUniform1f( mnSlideLocation, 1.0 );
1824 displaySlide( nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale );
1828std::shared_ptr<OGLTransitionImpl>
1829makeVortexTransition(
Primitives_t&& rLeavingSlidePrimitives,
1835 return std::make_shared<VortexTransition>(
TransitionScene(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives)),
1844 const int NX = 96, NY = 96;
1847 for (
int x = 0;
x < NX;
x++)
1849 for (
int y = 0;
y < NY;
y++)
1851 Slide.pushTriangle (glm::vec2 (
fdiv(
x,NX),
fdiv(
y,NY)), glm::vec2 (
fdiv(
x+1,NX),
fdiv(
y,NY)), glm::vec2 (
fdiv(
x,NX),
fdiv(
y+1,NY)));
1852 Slide.pushTriangle (glm::vec2 (
fdiv(
x+1,NX),
fdiv(
y,NY)), glm::vec2 (
fdiv(
x,NX),
fdiv(
y+1,NY)), glm::vec2 (
fdiv(
x+1,NX),
fdiv(
y+1,NY)));
1856 aLeavingSlide.push_back (
Slide);
1858 aEnteringSlide.push_back (
Slide);
1864 return makeVortexTransition(std::move(aLeavingSlide), std::move(aEnteringSlide), aSettings, NX, NY);
1882 virtual void prepare(
double SlideWidth,
double SlideHeight )
override;
1885 GLint maSlideRatioLocation = -1;
1888GLuint RippleTransition::makeShader()
const
1893void RippleTransition::prepareTransition( sal_Int32, sal_Int32,
OpenGLContext* )
1895 GLint nCenterLocation = glGetUniformLocation(m_nProgramObject,
"center");
1898 glUniform2fv(nCenterLocation, 1, glm::value_ptr(maCenter));
1901 maSlideRatioLocation = glGetUniformLocation(m_nProgramObject,
"slideRatio");
1905void RippleTransition::prepare(
double SlideWidth,
double SlideHeight )
1907 if( maSlideRatioLocation != -1 )
1908 glUniform1f( maSlideRatioLocation, SlideWidth / SlideHeight );
1911std::shared_ptr<OGLTransitionImpl>
1912makeRippleTransition(
Primitives_t&& rLeavingSlidePrimitives,
1917 return std::make_shared<RippleTransition>(
TransitionScene(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives)),
1919 glm::vec2(0.5, 0.5));
1928 Slide.pushTriangle (glm::vec2 (0,0), glm::vec2 (1,0), glm::vec2 (0,1));
1929 Slide.pushTriangle (glm::vec2 (1,0), glm::vec2 (0,1), glm::vec2 (1,1));
1932 aLeavingSlide.push_back (
Slide);
1935 aEnteringSlide.push_back (
Slide);
1940 return makeRippleTransition(std::move(aLeavingSlide), std::move(aEnteringSlide), aSettings);
1947 aHexagon.
pushTriangle(
vec(
x-1,
y-1, NX, NY),
vec(
x,
y-2, NX, NY),
vec(
x,
y+0.5, NX, NY));
1948 aHexagon.
pushTriangle(
vec(
x,
y-2, NX, NY),
vec(
x+1,
y-1, NX, NY),
vec(
x,
y+0.5, NX, NY));
1949 aHexagon.
pushTriangle(
vec(
x+1,
y-1, NX, NY),
vec(
x+1,
y, NX, NY),
vec(
x,
y+0.5, NX, NY));
1950 aHexagon.
pushTriangle(
vec(
x+1,
y, NX, NY),
vec(
x,
y+1, NX, NY),
vec(
x,
y+0.5, NX, NY));
1951 aHexagon.
pushTriangle(
vec(
x,
y+1, NX, NY),
vec(
x-1,
y, NX, NY),
vec(
x,
y+0.5, NX, NY));
1952 aHexagon.
pushTriangle(
vec(
x-1,
y, NX, NY),
vec(
x-1,
y-1, NX, NY),
vec(
x,
y+0.5, NX, NY));
1956 aHexagon.
pushTriangle(
vec(
x-2,
y-1, NX, NY),
vec(
x-1,
y-2, NX, NY),
vec(
x,
y+0.5, NX, NY));
1957 aHexagon.
pushTriangle(
vec(
x-1,
y-2, NX, NY),
vec(
x,
y-1, NX, NY),
vec(
x,
y+0.5, NX, NY));
1958 aHexagon.
pushTriangle(
vec(
x,
y-1, NX, NY),
vec(
x,
y, NX, NY),
vec(
x,
y+0.5, NX, NY));
1959 aHexagon.
pushTriangle(
vec(
x,
y, NX, NY),
vec(
x-1,
y+1, NX, NY),
vec(
x,
y+0.5, NX, NY));
1960 aHexagon.
pushTriangle(
vec(
x-1,
y+1, NX, NY),
vec(
x-2,
y, NX, NY),
vec(
x,
y+0.5, NX, NY));
1961 aHexagon.
pushTriangle(
vec(
x-2,
y, NX, NY),
vec(
x-2,
y-1, NX, NY),
vec(
x,
y+0.5, NX, NY));
1968class GlitterTransition :
public PermTextureTransition
1972 : PermTextureTransition(rScene, rSettings)
1977 virtual GLuint makeShader()
const override;
1978 virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
OpenGLContext *pContext )
override;
1979 virtual void cleanup()
override;
1981 GLuint maBuffer = 0;
1984GLuint GlitterTransition::makeShader()
const
1994void GlitterTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
OpenGLContext *pContext )
1997 PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex, pContext );
2000 GLint nNumTilesLocation = glGetUniformLocation(m_nProgramObject,
"numTiles");
2001 if (nNumTilesLocation != -1) {
2002 glUniform2iv(nNumTilesLocation, 1, glm::value_ptr(glm::ivec2(41, 41 * 4 / 3)));
2006 glGenBuffers(1, &maBuffer);
2007 glBindBuffer(GL_ARRAY_BUFFER, maBuffer);
2010 const Primitive& primitive = getScene().getLeavingSlide()[0];
2011 std::vector<ThreeFloats> vertices;
2014 for (
int j = 0; j < 18; ++j)
2015 vertices.push_back({center.x, center.y, center.z});
2017 glBufferData(GL_ARRAY_BUFFER, vertices.size() * 3 *
sizeof(GLfloat), vertices.data(), GL_STATIC_DRAW);
2019 GLint location = glGetAttribLocation(m_nProgramObject,
"center");
2020 if (location != -1) {
2021 glEnableVertexAttribArray(location);
2022 glVertexAttribPointer( location, 3, GL_FLOAT,
false, 0,
nullptr );
2026 glBindBuffer(GL_ARRAY_BUFFER, 0);
2029void GlitterTransition::cleanup()
2032 glDeleteBuffers(1, &maBuffer);
2036std::shared_ptr<OGLTransitionImpl>
2037makeGlitterTransition(
Primitives_t&& rLeavingSlidePrimitives,
2041 return std::make_shared<GlitterTransition>(
TransitionScene(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives)),
2050 const int NY = NX * 4 / 3;
2056 for (
int y = 0;
y < NY+2;
y+=2)
2057 for (
int x = 0;
x < NX+2;
x+=2)
2060 aSlide.push_back(aHexagon);
2062 return makeGlitterTransition(std::move(aSlide), std::move(aEmptySlide),
TransitionSettings());
2068class HoneycombTransition :
public PermTextureTransition
2072 : PermTextureTransition(rScene, rSettings)
2074 mnDepthTextures[0] = 0;
2075 mnDepthTextures[1] = 0;
2079 virtual void finishTransition()
override;
2080 virtual GLuint makeShader()
const override;
2081 virtual void prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
OpenGLContext *pContext )
override;
2082 virtual void displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
double SlideWidthScale,
double SlideHeightScale,
OpenGLContext *pContext )
override;
2084 GLint maHexagonSizeLocation = -1;
2085 GLint maSelectedTextureLocation = -1;
2086 GLint mnShadowLocation = -1;
2087 GLuint mnFramebuffer = 0
u;
2088 std::array<GLuint, 2> mnDepthTextures;
2091void HoneycombTransition::finishTransition()
2093 PermTextureTransition::finishTransition();
2096 glActiveTexture( GL_TEXTURE2 );
2097 glBindTexture( GL_TEXTURE_2D, 0 );
2098 glActiveTexture( GL_TEXTURE3 );
2099 glBindTexture( GL_TEXTURE_2D, 0 );
2100 glActiveTexture( GL_TEXTURE0 );
2102 glDeleteTextures(2, mnDepthTextures.data());
2103 mnDepthTextures = {0
u, 0
u};
2105 glDeleteFramebuffers(1, &mnFramebuffer);
2110GLuint HoneycombTransition::makeShader()
const
2115void HoneycombTransition::prepareTransition( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
OpenGLContext *pContext )
2118 PermTextureTransition::prepareTransition( glLeavingSlideTex, glEnteringSlideTex, pContext );
2121 maHexagonSizeLocation = glGetUniformLocation(m_nProgramObject,
"hexagonSize");
2122 maSelectedTextureLocation = glGetUniformLocation( m_nProgramObject,
"selectedTexture" );
2123 mnShadowLocation = glGetUniformLocation(m_nProgramObject,
"shadow");
2124 GLint nOrthoProjectionMatrix = glGetUniformLocation(m_nProgramObject,
"orthoProjectionMatrix");
2125 GLint nOrthoViewMatrix = glGetUniformLocation(m_nProgramObject,
"orthoViewMatrix");
2126 GLint location = glGetUniformLocation(m_nProgramObject,
"colorShadowTexture");
2127 glUniform1i(location, 2);
2128 location = glGetUniformLocation(m_nProgramObject,
"depthShadowTexture");
2129 glUniform1i(location, 3);
2134 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2137 double EyePos(10.0);
2138 double const RealF(1.0);
2139 double const RealN(-1.0);
2140 double const RealL(-4.0);
2142 double const RealB(-4.0);
2144 double ClipN(EyePos+5.0*RealN);
2145 double ClipF(EyePos+15.0*RealF);
2146 double ClipL(RealL*8.0);
2147 double ClipR(RealR*8.0);
2148 double ClipB(RealB*8.0);
2149 double ClipT(RealT*8.0);
2151 glm::mat4 projection = glm::ortho<float>(ClipL, ClipR, ClipB, ClipT, ClipN, ClipF);
2153 glm::vec3
scale(1.0 / (((RealR * 2.0 * ClipN) / (EyePos * (ClipR - ClipL))) - ((ClipR + ClipL) / (ClipR - ClipL))),
2154 1.0 / (((RealT * 2.0 * ClipN) / (EyePos * (ClipT - ClipB))) - ((ClipT + ClipB) / (ClipT - ClipB))),
2156 projection = glm::scale(projection, scale);
2157 glUniformMatrix4fv(nOrthoProjectionMatrix, 1,
false, glm::value_ptr(projection));
2159 glm::mat4 view = lookAt(glm::vec3(0, 0, EyePos), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
2160 glUniformMatrix4fv(nOrthoViewMatrix, 1,
false, glm::value_ptr(view));
2163 glGenTextures(2, mnDepthTextures.data());
2164 glActiveTexture(GL_TEXTURE2);
2165 glBindTexture(GL_TEXTURE_2D, mnDepthTextures[0]);
2166 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2048, 2048, 0, GL_RGBA, GL_FLOAT,
nullptr);
2167 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2168 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2169 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2170 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2172 glActiveTexture(GL_TEXTURE3);
2173 glBindTexture(GL_TEXTURE_2D, mnDepthTextures[1]);
2174 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, 2048, 2048, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
nullptr);
2175 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
2176 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
2177 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
2178 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
2180 glActiveTexture(GL_TEXTURE0);
2181 glGenFramebuffers(1, &mnFramebuffer);
2182 glBindFramebuffer(GL_FRAMEBUFFER, mnFramebuffer);
2183 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mnDepthTextures[0], 0);
2184 glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, mnDepthTextures[1], 0);
2187 if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
2188 SAL_WARN(
"slideshow.opengl",
"Wrong framebuffer!");
2195void HoneycombTransition::displaySlides_(
double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex,
2196 double SlideWidthScale,
double SlideHeightScale,
OpenGLContext *pContext )
2199 applyOverallOperations(nTime, SlideWidthScale, SlideHeightScale);
2200 glUniform1f(m_nTimeLocation, nTime);
2201 glUniform1f(mnShadowLocation, 1.0);
2204 const float borderSize = 0.15f;
2206 std::array<GLint, 4> viewport;
2207 glGetIntegerv(GL_VIEWPORT, viewport.data());
2208 glViewport(0, 0, 2048, 2048);
2209 glBindFramebuffer(GL_FRAMEBUFFER, mnFramebuffer);
2210 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
2211 glUniform1f(mnShadowLocation, 1.0);
2212 glUniform1f(maSelectedTextureLocation, 1.0);
2213 glUniform1f(maHexagonSizeLocation, 1.0f - borderSize);
2214 displaySlide(nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale);
2215 glUniform1f(maHexagonSizeLocation, 1.0f + borderSize);
2216 displaySlide(nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale);
2219 glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
2221 glUniform1f(mnShadowLocation, 0.0);
2222 glUniform1f(maSelectedTextureLocation, 0.0);
2223 glUniform1f(maHexagonSizeLocation, 1.0f - borderSize);
2224 displaySlide(nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale);
2225 glUniform1f(maHexagonSizeLocation, 1.0f + borderSize);
2226 displaySlide(nTime, glEnteringSlideTex, getScene().getEnteringSlide(), SlideWidthScale, SlideHeightScale);
2227 glUniform1f(maSelectedTextureLocation, 1.0);
2228 glUniform1f(maHexagonSizeLocation, 1.0f - borderSize);
2229 displaySlide(nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale);
2230 glUniform1f(maHexagonSizeLocation, 1.0f + borderSize);
2231 displaySlide(nTime, glLeavingSlideTex, getScene().getLeavingSlide(), SlideWidthScale, SlideHeightScale);
2235std::shared_ptr<OGLTransitionImpl>
2236makeHoneycombTransition(
Primitives_t&& rLeavingSlidePrimitives,
2241 return std::make_shared<HoneycombTransition>(
TransitionScene(std::move(rLeavingSlidePrimitives), std::move(rEnteringSlidePrimitives)),
2257 for (
int y = 0;
y < NY+2;
y+=2)
2258 for (
int x = 0;
x < NX+2;
x+=2)
2260 aSlide.push_back(aHexagon);
2262 return makeHoneycombTransition(std::vector(aSlide), std::vector(aSlide), aSettings);
2269 Slide.pushTriangle(glm::vec2(0,0),glm::vec2(1,0),glm::vec2(0,1));
2270 Slide.pushTriangle(glm::vec2(1,0),glm::vec2(0,1),glm::vec2(1,1));
2271 Slide.Operations.push_back(
makeSRotate(glm::vec3(0,0,1),glm::vec3(0,0,0),3000,
true,0,0.5));
2272 Slide.Operations.push_back(
makeSScale(glm::vec3(0.01,0.01,0.01),glm::vec3(0,0,0),
true,0,0.5));
2275 aLeavingSlide.push_back(
Slide);
2277 Slide.Operations.clear();
2278 Slide.Operations.push_back(
makeSRotate(glm::vec3(0,0,1),glm::vec3(0,0,0),-3000,
true,0.5,1));
2281 Slide.Operations.push_back(
makeSScale(glm::vec3(0.01,0.01,0.01),glm::vec3(0,0,0),
false,-1,1));
2282 Slide.Operations.push_back(
makeSScale(glm::vec3(100,100,100),glm::vec3(0,0,0),
true,0.5,1));
2284 aEnteringSlide.push_back(
Slide);
2287 aOverallOperations.push_back(
makeSRotate(glm::vec3(0,0,1),glm::vec3(0.2,0.2,0),1080,
true,0,1));
2289 return makeSimpleTransition(std::move(aLeavingSlide), std::move(aEnteringSlide), std::move(aOverallOperations));
std::shared_ptr< RotateAndScaleDepthByWidth > makeRotateAndScaleDepthByWidth(const glm::vec3 &Axis, const glm::vec3 &Origin, double Angle, bool bScale, bool bInter, double T0, double T1)
std::shared_ptr< SRotate > makeSRotate(const glm::vec3 &Axis, const glm::vec3 &Origin, double Angle, bool bInter, double T0, double T1)
std::shared_ptr< SScale > makeSScale(const glm::vec3 &Scale, const glm::vec3 &Origin, bool bInter, double T0, double T1)
std::shared_ptr< SEllipseTranslate > makeSEllipseTranslate(double dWidth, double dHeight, double dStartPosition, double dEndPosition, bool bInter, double T0, double T1)
std::shared_ptr< RotateAndScaleDepthByHeight > makeRotateAndScaleDepthByHeight(const glm::vec3 &Axis, const glm::vec3 &Origin, double Angle, bool bScale, bool bInter, double T0, double T1)
std::shared_ptr< STranslate > makeSTranslate(const glm::vec3 &Vector, bool bInter, double T0, double T1)
std::shared_ptr< OGLTransitionImpl > makeTurnAround()
static double randFromNeg1to1()
std::shared_ptr< OGLTransitionImpl > makeHoneycomb()
std::shared_ptr< OGLTransitionImpl > makeRipple()
std::shared_ptr< OGLTransitionImpl > makeVenetianBlinds(bool vertical, int parts)
std::shared_ptr< OGLTransitionImpl > makeGlitter()
static void createHexagon(Primitive &aHexagon, const int x, const int y, const int NX, const int NY)
static float fdiv(int a, int b)
std::shared_ptr< OGLTransitionImpl > makeDiamond()
2D replacements
static void displayPrimitives(const Primitives_t &primitives, GLint primitiveTransformLocation, double nTime, double WidthScale, double HeightScale, std::vector< int >::const_iterator first)
std::shared_ptr< OGLTransitionImpl > makeDissolve()
std::shared_ptr< OGLTransitionImpl > makeRochade()
std::shared_ptr< OGLTransitionImpl > makeRevolvingCircles(sal_uInt16 nCircles, sal_uInt16 nPointsOnCircles)
std::shared_ptr< OGLTransitionImpl > makeNByMTileFlip(sal_uInt16 n, sal_uInt16 m)
std::shared_ptr< OGLTransitionImpl > makeFallLeaving()
static T clamp(const T &rIn)
static glm::vec3 randNormVectorInXYPlane()
std::shared_ptr< OGLTransitionImpl > makeFadeSmoothly()
std::shared_ptr< OGLTransitionImpl > makeIris()
std::shared_ptr< OGLTransitionImpl > makeNewsflash()
std::shared_ptr< OGLTransitionImpl > makeStatic()
std::shared_ptr< OGLTransitionImpl > makeOutsideCubeFaceToLeft()
static std::vector< int > uploadPrimitives(const Primitives_t &primitives)
std::shared_ptr< OGLTransitionImpl > makeTurnDown()
std::shared_ptr< OGLTransitionImpl > makeVortex()
std::shared_ptr< OGLTransitionImpl > makeFadeThroughColor(bool white)
std::shared_ptr< OGLTransitionImpl > makeHelix(sal_uInt16 nRows)
std::shared_ptr< OGLTransitionImpl > makeInsideCubeFaceToLeft()
static glm::vec2 vec(float x, float y, float nx, float ny)
std::vector< Primitive > Primitives_t
std::vector< std::shared_ptr< Operation > > Operations_t
std::vector< std::shared_ptr< SceneObject > > SceneObjects_t
OpenGL 3D Transition class.
std::vector< int > m_nFirstIndices
void displaySlide(double nTime, sal_Int32 glSlideTex, const Primitives_t &primitives, double SlideWidthScale, double SlideHeightScale)
void uploadModelViewProjectionMatrices()
Calculates the projection and model/view matrices, and upload them.
GLint m_nSceneTransformLocation
GLint m_nOperationsTransformLocation
GLint m_nTimeLocation
Location of the "time" uniform.
void finish()
Clean up after transition.
const TransitionScene maScene
virtual void displaySlides_(double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidthScale, double SlideHeightScale, OpenGLContext *pContext)
This function is called in display method to display the slides.
void display(double nTime, sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight, OpenGLContext *pContext)
Display a step of the transition.
GLuint m_nVertexBufferObject
VBO in which to put primitive data.
GLuint m_nProgramObject
GLSL program object.
virtual void prepareTransition(sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext)
This function is called after glx context is ready to let the transition prepare GL related things,...
virtual void finishTransition()
This function is called when the transition needs to clear after itself, like delete own textures etc...
void displayScene(double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight)
virtual void cleanup()
This function is called in display method to prepare the slides, scene, etc.
GLint m_nPrimitiveTransformLocation
Uniform locations for transform matrices.
void displayUnbufferedSlide(double nTime, sal_Int32 glSlideTex, const Primitives_t &primitives, double SlideWidthScale, double SlideHeightScale)
bool prepare(sal_Int32 glLeavingSlideTex, sal_Int32 glEnteringSlideTex, OpenGLContext *pContext)
Prepare transition.
virtual ~OGLTransitionImpl()
TransitionScene const & getScene() const
GLuint m_nVertexArrayObject
GLint m_nPositionLocation
Per-vertex attribute locations.
void applyOverallOperations(double nTime, double SlideWidthScale, double SlideHeightScale)
virtual GLuint makeShader() const =0
This function is called in prepare method to create the GL program.
GLint m_nTexCoordLocation
virtual void restoreDefaultFramebuffer()
This class is a list of Triangles that will share Operations, and could possibly share.
void applyOperations(glm::mat4 &matrix, double nTime, double SlideWidthScale, double SlideHeightScale) const
Operations_t Operations
list of Operations to be performed on this primitive.These operations will be called in the order the...
void swap(Primitive &rOther)
std::vector< Vertex > Vertices
list of vertices
const glm::vec3 & getVertex(int n) const
guards against directly changing the vertices
void display(GLint primitiveTransformLocation, double nTime, double WidthScale, double HeightScale) const
int getVerticesByteSize() const
accessor for the size of the vertices data
void pushTriangle(const glm::vec2 &SlideLocation0, const glm::vec2 &SlideLocation1, const glm::vec2 &SlideLocation2)
PushBack a vertex,normal, and tex coord.
Primitive & operator=(const Primitive &rvalue)
int getVerticesCount() const
void pushPrimitive(const Primitive &p)
Primitives_t maPrimitives
All the surrounding scene primitives.
virtual void prepare(GLuint)
std::vector< int > maFirstIndices
virtual void display(GLint sceneTransformLocation, GLint primitiveTransformLocation, double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight) const
const SceneObjects_t & getSceneObjects() const
void swap(TransitionScene &rOther)
Primitives_t maLeavingSlidePrimitives
All the primitives that use the leaving slide texture.
TransitionScene(Primitives_t &&rLeavingSlidePrimitives, Primitives_t &&rEnteringSlidePrimitives, Operations_t &&rOverallOperations=Operations_t(), SceneObjects_t &&rSceneObjects=SceneObjects_t())
SceneObjects_t maSceneObjects
All the surrounding scene objects.
const Operations_t & getOperations() const
Operations_t maOverallOperations
All the operations that should be applied to both leaving and entering slide primitives.
Primitives_t maEnteringSlidePrimitives
All the primitives that use the leaving slide texture.
TransitionScene & operator=(const TransitionScene &rOther)
#define SAL_WARN(area, stream)
tDoubleVectorPair cleanup(const css::uno::Sequence< double > &rXValues, const css::uno::Sequence< double > &rYValues, Pred aPred)
double uniform_real_distribution(double a=0.0, double b=1.0)
constexpr OUStringLiteral first
HSLColor interpolate(const HSLColor &rFrom, const HSLColor &rTo, double t, bool bCCW)
HSL color linear interpolator.
const rendering::Texture maTexture
static GLint LoadShaders(const OUString &rVertexShaderName, const OUString &rFragmentShaderName, const OUString &rGeometryShaderName, std::string_view preamble, std::string_view rDigest)
bool mbUseMipMapLeaving
Whether to use mipmapping for slides textures.
float mnRequiredGLVersion
which GL version does the transition require