canvas/source/opengl/ogl_canvascustomsprite.cxx | 24 +++++---------------- canvas/source/opengl/ogl_canvascustomsprite.hxx | 2 - canvas/source/opengl/ogl_renderHelper.cxx | 27 ++++++++++++++++++++++++ canvas/source/opengl/ogl_renderHelper.hxx | 27 +++++++++++++++++++++++- 4 files changed, 60 insertions(+), 20 deletions(-)
New commits: commit 964c17891c580c6ef8821b5f9c3d380f448565ca Author: Michael Jaumann <meta_...@yahoo.com> Date: Fri Oct 24 07:39:11 2014 +0000 renderHelper uses MVP shader, removed matricestack Change-Id: I850216b6d52df52f71672d3b7b8142de90a63f83 diff --git a/canvas/source/opengl/ogl_canvascustomsprite.cxx b/canvas/source/opengl/ogl_canvascustomsprite.cxx index 812ab73..3f95107 100644 --- a/canvas/source/opengl/ogl_canvascustomsprite.cxx +++ b/canvas/source/opengl/ogl_canvascustomsprite.cxx @@ -47,6 +47,7 @@ namespace oglcanvas ::canvas::tools::setIdentityAffineMatrix2D(maTransformation); maCanvasHelper.init( *rRefDevice.get(), rDeviceHelper ); + mRenderHelper.SetVP(1600, 900);//is this right? } void CanvasCustomSprite::disposeThis() @@ -126,30 +127,14 @@ namespace oglcanvas } - bool CanvasCustomSprite::renderSprite() const + bool CanvasCustomSprite::renderSprite() { if( ::basegfx::fTools::equalZero( mfAlpha ) ) return true; - TransformationPreserver aPreserver1; const ::basegfx::B2IVector aSpriteSizePixel( ::canvas::tools::roundUp( maSize.Width ), ::canvas::tools::roundUp( maSize.Height )); - // translate sprite to output position - glTranslated(maPosition.getX(), maPosition.getY(), 0); - - { - TransformationPreserver aPreserver2; - - // apply sprite content transformation matrix - double aGLTransform[] = - { - maTransformation.m00, maTransformation.m10, 0, 0, - maTransformation.m01, maTransformation.m11, 0, 0, - 0, 0, 1, 0, - maTransformation.m02, maTransformation.m12, 0, 1 - }; - glMultMatrixd(aGLTransform); IBufferContextSharedPtr pBufferContext; if( mfAlpha != 1.0 || mxClip.is() ) @@ -168,6 +153,8 @@ namespace oglcanvas if( pBufferContext ) { + //no transformation + mRenderHelper.SetModelAndMVP(glm::mat4()); // content ended up in background buffer - compose to // screen now. Calls below switches us back to window // context, and binds to generated, dynamic texture @@ -235,7 +222,8 @@ namespace oglcanvas glBindTexture(GL_TEXTURE_2D, 0); glDisable(GL_TEXTURE_2D); } - } + // translate sprite to output position + mRenderHelper.SetModelAndMVP(glm::translate(glm::vec3(maPosition.getX(), maPosition.getY(), 0))); GLfloat vertices[] = {-2, -2, -2, (float) maSize.Height+4, (float) maSize.Width+4, (float) maSize.Height+4, diff --git a/canvas/source/opengl/ogl_canvascustomsprite.hxx b/canvas/source/opengl/ogl_canvascustomsprite.hxx index b678f1a..6f78a72 100644 --- a/canvas/source/opengl/ogl_canvascustomsprite.hxx +++ b/canvas/source/opengl/ogl_canvascustomsprite.hxx @@ -78,7 +78,7 @@ namespace oglcanvas double getPriority() const { return mfPriority; } /// Render sprite content at sprite position - bool renderSprite() const; + bool renderSprite(); private: /** MUST hold here, too, since CanvasHelper only contains a diff --git a/canvas/source/opengl/ogl_renderHelper.cxx b/canvas/source/opengl/ogl_renderHelper.cxx index 5447a54..3bc934e 100644 --- a/canvas/source/opengl/ogl_renderHelper.cxx +++ b/canvas/source/opengl/ogl_renderHelper.cxx @@ -4,6 +4,9 @@ namespace oglcanvas { RenderHelper::RenderHelper() + : m_iWidth(1600) //Why this dimensions? + , m_iHeight(900) + , m_Model(glm::mat4(1.0f)) { InitOpenGL(); } @@ -16,10 +19,16 @@ namespace oglcanvas // Get a handle for uniforms m_manTexUnf = glGetUniformLocation(m_texManProgID, "TextTex"); m_simpleTexUnf = glGetUniformLocation(m_simpleProgID, "TextTex"); + m_manCordUnf = glGetUniformLocation(m_texManProgID, "texCord"); m_texColorUnf = glGetUniformLocation(m_texProgID, "constantColor"); + m_manColorUnf = glGetUniformLocation(m_texManProgID,"colorTex"); m_simpleColorUnf = glGetUniformLocation(m_simpleProgID,"colorTex"); + + m_texMVPUnf = glGetUniformLocation(m_texProgID, "MVP"); + m_manMVPUnf = glGetUniformLocation(m_texManProgID, "MVP"); + m_simpleMVPUnf = glGetUniformLocation(m_simpleProgID, "MVP"); //Gen Buffers for texturecoordinates/vertices glGenBuffers(1, &m_vertexBuffer); glGenBuffers(1, &m_uvBuffer); @@ -27,8 +36,24 @@ namespace oglcanvas m_simpleUvAttrb = glGetAttribLocation(m_simpleProgID ,"UV"); m_simplePosAttrb = glGetAttribLocation(m_simpleProgID ,"vPosition"); m_texPosAttrb = glGetAttribLocation(m_texProgID ,"vPosition"); + + glViewport(0, 0, m_iWidth, m_iHeight); } + //Todo figgure out, which parameters i should use :) + void RenderHelper::SetVP(int width, int height) + { + m_Projection = glm::ortho(0.f, float(m_iWidth), 0.f, float(m_iHeight), -4.f, 3.f); + m_Projection = m_Projection * glm::scale(glm::vec3((float)width / m_iWidth, -(float)height / m_iHeight, 1.0f)); + m_View = glm::lookAt(glm::vec3(0,m_iHeight,1), + glm::vec3(0,m_iHeight,0), + glm::vec3(0,1,0) ); + } + void RenderHelper::SetModelAndMVP(glm::mat4 mat) + { + m_Model = mat; + m_MVP = m_Projection * m_View * m_Model; + } void RenderHelper::renderVertexConstColor(GLfloat vertices[], GLfloat color[4], GLenum mode) const { glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); @@ -69,6 +94,7 @@ namespace oglcanvas glUniform1i(m_simpleTexUnf, 0); //Use texture Unit 0 glUniform4f(m_simpleColorUnf, color[0], color[1], color[2], color[3]); + glUniformMatrix4fv(m_simpleMVPUnf, 1, GL_FALSE, &m_MVP[0][0]); glEnableVertexAttribArray(m_simplePosAttrb); glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); @@ -122,6 +148,7 @@ namespace oglcanvas glUniform1i(m_manTexUnf, 0); glUniform2f(m_manCordUnf,fWidth,fHeight); glUniform4f(m_manColorUnf, color[0], color[1], color[2], color[3] ); + glUniformMatrix4fv(m_manMVPUnf, 1, GL_FALSE, &m_MVP[0][0]); glEnableVertexAttribArray(m_manPosAttrb); glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); diff --git a/canvas/source/opengl/ogl_renderHelper.hxx b/canvas/source/opengl/ogl_renderHelper.hxx index 454b3ff..0a63ab1 100644 --- a/canvas/source/opengl/ogl_renderHelper.hxx +++ b/canvas/source/opengl/ogl_renderHelper.hxx @@ -1,4 +1,6 @@ #include <GL/glew.h> +#include <glm/glm.hpp> +#include "glm/gtx/transform.hpp" namespace oglcanvas { class RenderHelper @@ -8,12 +10,19 @@ namespace oglcanvas void renderVertexConstColor(GLfloat vertices[] , GLfloat color[4], GLenum mode) const ; void renderVertexUVTex(GLfloat vertices[], GLfloat uvCoordinates[], GLfloat color[4], GLenum mode) const ; void renderVertexTex(GLfloat vertices[], GLfloat, GLfloat, GLfloat color[4], GLenum mode) const; - void dispose(); + RenderHelper(); + + void SetVP(int width, int height); + void SetModelAndMVP(glm::mat4 mat); + void dispose(); + private: RenderHelper& operator = (const RenderHelper& other); RenderHelper(const RenderHelper& other); + void InitOpenGL(); + GLuint m_vertexBuffer; GLuint m_uvBuffer; @@ -23,15 +32,31 @@ namespace oglcanvas GLuint m_simplePosAttrb; GLuint m_simpleTexUnf; GLuint m_simpleColorUnf; + GLuint m_simpleMVPUnf; GLuint m_manTexUnf; GLuint m_manPosAttrb; GLuint m_manCordUnf; GLuint m_manColorUnf; + GLuint m_manMVPUnf; GLuint m_texPosAttrb; GLuint m_texColorUnf; GLuint m_texManProgID; GLuint m_texProgID; + GLuint m_texMVPUnf; + //dimension + int m_iWidth; + int m_iHeight; + + // Projection matrix : default 45 degree Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units + glm::mat4 m_Projection; + // Camera matrix + glm::mat4 m_View; + // Model matrix : an identity matrix (model will be at the origin + glm::mat4 m_Model; + // Our ModelViewProjection : multiplication of our 3 matrices + glm::mat4 m_MVP; + }; } \ No newline at end of file _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits