Kaydet (Commit) 63f8cb01 authored tarafından Emmanuel Gil Peyrot's avatar Emmanuel Gil Peyrot Kaydeden (comit) Tomaž Vajngerl

slideshow: upload the transform matrices as uniforms

Change-Id: I2380fc7f8462514e6c032b18b44df51fbaaccb9f
(cherry picked from commit 566eca14)
üst 3a9aa5d1
...@@ -28,14 +28,20 @@ ...@@ -28,14 +28,20 @@
#version 120 #version 120
uniform mat4 u_sceneTransformMatrix;
uniform mat4 u_primitiveTransformMatrix;
uniform mat4 u_operationsTransformMatrix;
varying vec2 v_texturePosition; varying vec2 v_texturePosition;
varying vec3 v_normal; varying vec3 v_normal;
void main( void ) void main( void )
{ {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; mat4 modelViewMatrix = gl_ModelViewMatrix * u_operationsTransformMatrix * u_sceneTransformMatrix * u_primitiveTransformMatrix;
mat3 normalMatrix = mat3(transpose(inverse(modelViewMatrix)));
gl_Position = gl_ProjectionMatrix * modelViewMatrix * gl_Vertex;
v_texturePosition = gl_MultiTexCoord0.xy; v_texturePosition = gl_MultiTexCoord0.xy;
v_normal = normalize(gl_NormalMatrix * gl_Normal); v_normal = normalize(normalMatrix * gl_Normal);
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -28,15 +28,21 @@ ...@@ -28,15 +28,21 @@
#version 130 #version 130
uniform mat4 u_sceneTransformMatrix;
uniform mat4 u_primitiveTransformMatrix;
uniform mat4 u_operationsTransformMatrix;
varying vec2 v_texturePosition; varying vec2 v_texturePosition;
varying vec3 v_normal; varying vec3 v_normal;
varying float v_isShadow; varying float v_isShadow;
void main( void ) void main( void )
{ {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; mat4 modelViewMatrix = gl_ModelViewMatrix * u_operationsTransformMatrix * u_sceneTransformMatrix * u_primitiveTransformMatrix;
mat3 normalMatrix = mat3(transpose(inverse(modelViewMatrix)));
gl_Position = gl_ProjectionMatrix * modelViewMatrix * gl_Vertex;
v_texturePosition = gl_MultiTexCoord0.xy; v_texturePosition = gl_MultiTexCoord0.xy;
v_normal = normalize(gl_NormalMatrix * gl_Normal); v_normal = normalize(normalMatrix * gl_Normal);
v_isShadow = float(gl_VertexID >= 6); v_isShadow = float(gl_VertexID >= 6);
} }
......
...@@ -99,6 +99,10 @@ void OGLTransitionImpl::prepare( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteri ...@@ -99,6 +99,10 @@ void OGLTransitionImpl::prepare( sal_Int32 glLeavingSlideTex, sal_Int32 glEnteri
glUniform1i( location, 2 ); // texture unit 2 glUniform1i( location, 2 ); // texture unit 2
CHECK_GL_ERROR(); CHECK_GL_ERROR();
} }
m_nPrimitiveTransformLocation = glGetUniformLocation( m_nProgramObject, "u_primitiveTransformMatrix" );
m_nSceneTransformLocation = glGetUniformLocation( m_nProgramObject, "u_sceneTransformMatrix" );
m_nOperationsTransformLocation = glGetUniformLocation( m_nProgramObject, "u_operationsTransformMatrix" );
} }
CHECK_GL_ERROR(); CHECK_GL_ERROR();
...@@ -168,15 +172,11 @@ void OGLTransitionImpl::display( double nTime, sal_Int32 glLeavingSlideTex, sal_ ...@@ -168,15 +172,11 @@ void OGLTransitionImpl::display( double nTime, sal_Int32 glLeavingSlideTex, sal_
CHECK_GL_ERROR(); CHECK_GL_ERROR();
prepare( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight ); prepare( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight );
CHECK_GL_ERROR();
glPushMatrix();
CHECK_GL_ERROR(); CHECK_GL_ERROR();
displaySlides_( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale ); displaySlides_( nTime, glLeavingSlideTex, glEnteringSlideTex, SlideWidthScale, SlideHeightScale );
CHECK_GL_ERROR(); CHECK_GL_ERROR();
displayScene( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight ); displayScene( nTime, SlideWidth, SlideHeight, DispWidth, DispHeight );
CHECK_GL_ERROR(); CHECK_GL_ERROR();
glPopMatrix();
CHECK_GL_ERROR();
} }
void OGLTransitionImpl::applyOverallOperations( double nTime, double SlideWidthScale, double SlideHeightScale ) void OGLTransitionImpl::applyOverallOperations( double nTime, double SlideWidthScale, double SlideHeightScale )
...@@ -186,11 +186,11 @@ void OGLTransitionImpl::applyOverallOperations( double nTime, double SlideWidthS ...@@ -186,11 +186,11 @@ void OGLTransitionImpl::applyOverallOperations( double nTime, double SlideWidthS
for(size_t i(0); i != rOverallOperations.size(); ++i) for(size_t i(0); i != rOverallOperations.size(); ++i)
rOverallOperations[i]->interpolate(matrix, nTime, SlideWidthScale, SlideHeightScale); rOverallOperations[i]->interpolate(matrix, nTime, SlideWidthScale, SlideHeightScale);
CHECK_GL_ERROR(); CHECK_GL_ERROR();
glMultMatrixf(glm::value_ptr(matrix)); glUniformMatrix4fv(m_nOperationsTransformLocation, 1, false, glm::value_ptr(matrix));
CHECK_GL_ERROR(); CHECK_GL_ERROR();
} }
static void display_primitives(const Primitives_t& primitives, double nTime, double WidthScale, double HeightScale) static void display_primitives(const Primitives_t& primitives, GLint primitiveTransformLocation, double nTime, double WidthScale, double HeightScale)
{ {
CHECK_GL_ERROR(); CHECK_GL_ERROR();
GLuint buffer; GLuint buffer;
...@@ -236,7 +236,7 @@ static void display_primitives(const Primitives_t& primitives, double nTime, dou ...@@ -236,7 +236,7 @@ static void display_primitives(const Primitives_t& primitives, double nTime, dou
glTexCoordPointer( 2, GL_FLOAT, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, texcoord)) ); glTexCoordPointer( 2, GL_FLOAT, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, texcoord)) );
for (const Primitive& primitive: primitives) for (const Primitive& primitive: primitives)
primitive.display(nTime, WidthScale, HeightScale, *first++); primitive.display(primitiveTransformLocation, nTime, WidthScale, HeightScale, *first++);
CHECK_GL_ERROR(); CHECK_GL_ERROR();
glDeleteBuffers(1, &buffer); glDeleteBuffers(1, &buffer);
...@@ -251,7 +251,9 @@ OGLTransitionImpl::displaySlide( ...@@ -251,7 +251,9 @@ OGLTransitionImpl::displaySlide(
CHECK_GL_ERROR(); CHECK_GL_ERROR();
glBindTexture(GL_TEXTURE_2D, glSlideTex); glBindTexture(GL_TEXTURE_2D, glSlideTex);
CHECK_GL_ERROR(); CHECK_GL_ERROR();
display_primitives(primitives, nTime, SlideWidthScale, SlideHeightScale); glUniformMatrix4fv(m_nSceneTransformLocation, 1, false, glm::value_ptr(glm::mat4()));
CHECK_GL_ERROR();
display_primitives(primitives, m_nPrimitiveTransformLocation, nTime, SlideWidthScale, SlideHeightScale);
CHECK_GL_ERROR(); CHECK_GL_ERROR();
} }
...@@ -261,55 +263,43 @@ void OGLTransitionImpl::displayScene( double nTime, double SlideWidth, double Sl ...@@ -261,55 +263,43 @@ void OGLTransitionImpl::displayScene( double nTime, double SlideWidth, double Sl
const SceneObjects_t& rSceneObjects(maScene.getSceneObjects()); const SceneObjects_t& rSceneObjects(maScene.getSceneObjects());
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
for(size_t i(0); i != rSceneObjects.size(); ++i) for(size_t i(0); i != rSceneObjects.size(); ++i)
rSceneObjects[i]->display(nTime, SlideWidth, SlideHeight, DispWidth, DispHeight); rSceneObjects[i]->display(m_nSceneTransformLocation, m_nPrimitiveTransformLocation, nTime, SlideWidth, SlideHeight, DispWidth, DispHeight);
CHECK_GL_ERROR(); CHECK_GL_ERROR();
} }
void Primitive::display(double nTime, double WidthScale, double HeightScale, int first) const void Primitive::display(GLint primitiveTransformLocation, double nTime, double WidthScale, double HeightScale, int first) const
{ {
CHECK_GL_ERROR(); glm::mat4 matrix;
glPushMatrix(); applyOperations( matrix, nTime, WidthScale, HeightScale );
CHECK_GL_ERROR(); CHECK_GL_ERROR();
applyOperations( nTime, WidthScale, HeightScale ); glUniformMatrix4fv(primitiveTransformLocation, 1, false, glm::value_ptr(matrix));
CHECK_GL_ERROR(); CHECK_GL_ERROR();
glDrawArrays( GL_TRIANGLES, first, Vertices.size() ); glDrawArrays( GL_TRIANGLES, first, Vertices.size() );
CHECK_GL_ERROR(); CHECK_GL_ERROR();
glPopMatrix();
CHECK_GL_ERROR();
} }
void Primitive::applyOperations(double nTime, double WidthScale, double HeightScale) const void Primitive::applyOperations(glm::mat4& matrix, double nTime, double WidthScale, double HeightScale) const
{ {
glm::mat4 matrix;
for(size_t i(0); i < Operations.size(); ++i) for(size_t i(0); i < Operations.size(); ++i)
Operations[i]->interpolate(matrix, nTime, WidthScale, HeightScale); Operations[i]->interpolate(matrix, nTime, WidthScale, HeightScale);
matrix = glm::scale(matrix, glm::vec3(WidthScale, HeightScale, 1)); matrix = glm::scale(matrix, glm::vec3(WidthScale, HeightScale, 1));
CHECK_GL_ERROR();
// TODO: replace that with an uniform upload instead.
glMultMatrixf(glm::value_ptr(matrix));
CHECK_GL_ERROR();
} }
void SceneObject::display(double nTime, double /* SlideWidth */, double /* SlideHeight */, double DispWidth, double DispHeight ) const void SceneObject::display(GLint sceneTransformLocation, GLint primitiveTransformLocation, double nTime, double /* SlideWidth */, double /* SlideHeight */, double DispWidth, double DispHeight ) const
{ {
// fixme: allow various model spaces, now we make it so that // fixme: allow various model spaces, now we make it so that
// it is regular -1,-1 to 1,1, where the whole display fits in // it is regular -1,-1 to 1,1, where the whole display fits in
CHECK_GL_ERROR();
glPushMatrix();
CHECK_GL_ERROR();
glm::mat4 matrix; glm::mat4 matrix;
if (DispHeight > DispWidth) if (DispHeight > DispWidth)
matrix = glm::scale(matrix, glm::vec3(DispHeight/DispWidth, 1, 1)); matrix = glm::scale(matrix, glm::vec3(DispHeight/DispWidth, 1, 1));
else else
matrix = glm::scale(matrix, glm::vec3(1, DispWidth/DispHeight, 1)); matrix = glm::scale(matrix, glm::vec3(1, DispWidth/DispHeight, 1));
glMultMatrixf(glm::value_ptr(matrix));
CHECK_GL_ERROR(); CHECK_GL_ERROR();
display_primitives(maPrimitives, nTime, 1, 1); glUniformMatrix4fv(sceneTransformLocation, 1, false, glm::value_ptr(matrix));
CHECK_GL_ERROR(); CHECK_GL_ERROR();
glPopMatrix(); display_primitives(maPrimitives, primitiveTransformLocation, nTime, 1, 1);
CHECK_GL_ERROR(); CHECK_GL_ERROR();
} }
...@@ -336,18 +326,18 @@ public: ...@@ -336,18 +326,18 @@ public:
Iris() = default; Iris() = default;
virtual void prepare() override; virtual void prepare() override;
virtual void display(double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight) const override; virtual void display(GLint sceneTransformLocation, GLint primitiveTransformLocation, double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight) const override;
virtual void finish() override; virtual void finish() override;
private: private:
GLuint maTexture = 0; GLuint maTexture = 0;
}; };
void Iris::display(double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) const void Iris::display(GLint sceneTransformLocation, GLint primitiveTransformLocation, double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) const
{ {
glBindTexture(GL_TEXTURE_2D, maTexture); glBindTexture(GL_TEXTURE_2D, maTexture);
CHECK_GL_ERROR(); CHECK_GL_ERROR();
SceneObject::display(nTime, SlideWidth, SlideHeight, DispWidth, DispHeight); SceneObject::display(sceneTransformLocation, primitiveTransformLocation, nTime, SlideWidth, SlideHeight, DispWidth, DispHeight);
} }
void Iris::prepare() void Iris::prepare()
......
...@@ -166,7 +166,7 @@ protected: ...@@ -166,7 +166,7 @@ protected:
void setScene(TransitionScene const& rScene); void setScene(TransitionScene const& rScene);
static void displaySlide( double nTime, sal_Int32 glSlideTex, const Primitives_t& primitives, double SlideWidthScale, double SlideHeightScale ); void displaySlide( double nTime, sal_Int32 glSlideTex, const Primitives_t& primitives, double SlideWidthScale, double SlideHeightScale );
void displayScene( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight); void displayScene( double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight);
void applyOverallOperations( double nTime, double SlideWidthScale, double SlideHeightScale ); void applyOverallOperations( double nTime, double SlideWidthScale, double SlideHeightScale );
...@@ -212,6 +212,18 @@ private: ...@@ -212,6 +212,18 @@ private:
TransitionScene maScene; TransitionScene maScene;
const TransitionSettings maSettings; const TransitionSettings maSettings;
/** Uniform location for primitive transform
*/
GLint m_nPrimitiveTransformLocation = -1;
/** Uniform location for scene transform
*/
GLint m_nSceneTransformLocation = -1;
/** Uniform location for operations transform
*/
GLint m_nOperationsTransformLocation = -1;
protected: protected:
/** GLSL program object /** GLSL program object
*/ */
...@@ -252,7 +264,7 @@ public: ...@@ -252,7 +264,7 @@ public:
virtual ~SceneObject(); virtual ~SceneObject();
virtual void prepare() {} virtual void prepare() {}
virtual void display(double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight) const; virtual void display(GLint sceneTransformLocation, GLint primitiveTransformLocation, double nTime, double SlideWidth, double SlideHeight, double DispWidth, double DispHeight ) const;
virtual void finish() {} virtual void finish() {}
void pushPrimitive (const Primitive &p); void pushPrimitive (const Primitive &p);
...@@ -283,8 +295,8 @@ public: ...@@ -283,8 +295,8 @@ public:
void swap(Primitive& rOther); void swap(Primitive& rOther);
void applyOperations(double nTime, double SlideWidthScale, double SlideHeightScale) const; void applyOperations(glm::mat4& matrix, double nTime, double SlideWidthScale, double SlideHeightScale) const;
void display(double nTime, double SlideWidthScale, double SlideHeightScale, int first) const; void display(GLint primitiveTransformLocation, double nTime, double WidthScale, double HeightScale, int first) const;
/** PushBack a vertex,normal, and tex coord. Each SlideLocation is where on the slide is mapped to this location ( from (0,0) to (1,1) ). This will make sure the correct aspect ratio is used, and helps to make slides begin and end at the correct position. (0,0) is the top left of the slide, and (1,1) is the bottom right. /** PushBack a vertex,normal, and tex coord. Each SlideLocation is where on the slide is mapped to this location ( from (0,0) to (1,1) ). This will make sure the correct aspect ratio is used, and helps to make slides begin and end at the correct position. (0,0) is the top left of the slide, and (1,1) is the bottom right.
......
...@@ -532,6 +532,7 @@ void OGLTransitionerImpl::impl_prepareSlides() ...@@ -532,6 +532,7 @@ void OGLTransitionerImpl::impl_prepareSlides()
void OGLTransitionerImpl::impl_prepareTransition() void OGLTransitionerImpl::impl_prepareTransition()
{ {
prepareEnvironment();
if( mpTransition && mpTransition->getSettings().mnRequiredGLVersion <= mnGLVersion ) if( mpTransition && mpTransition->getSettings().mnRequiredGLVersion <= mnGLVersion )
mpTransition->prepare( maLeavingSlideGL, maEnteringSlideGL ); mpTransition->prepare( maLeavingSlideGL, maEnteringSlideGL );
} }
...@@ -1182,7 +1183,6 @@ void OGLTransitionerImpl::GLInitSlides() ...@@ -1182,7 +1183,6 @@ void OGLTransitionerImpl::GLInitSlides()
#endif #endif
mpContext->makeCurrent(); mpContext->makeCurrent();
prepareEnvironment();
const OGLFormat* pFormat = nullptr; const OGLFormat* pFormat = nullptr;
if( !mbUseLeavingPixmap || !mbUseEnteringPixmap ) if( !mbUseLeavingPixmap || !mbUseEnteringPixmap )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment