canvas/Library_oglcanvas.mk | 1 canvas/source/opengl/ogl_canvascustomsprite.cxx | 127 +-------------------- canvas/source/opengl/ogl_canvascustomsprite.hxx | 23 --- canvas/source/opengl/ogl_renderHelper.cxx | 142 ++++++++++++++++++++++++ canvas/source/opengl/ogl_renderHelper.hxx | 35 +++++ 5 files changed, 189 insertions(+), 139 deletions(-)
New commits: commit 5e7b0adfd78e8a636a4b8de809fc6ecbe8efe799 Author: Michael Jaumann <meta_...@yahoo.com> Date: Wed Oct 22 08:25:47 2014 +0000 refactoring,shader input to renderHelper Change-Id: Ic695032e57374d1736004fa577cdc31d3e67a951 diff --git a/canvas/Library_oglcanvas.mk b/canvas/Library_oglcanvas.mk index b5d3377..17edbb1 100644 --- a/canvas/Library_oglcanvas.mk +++ b/canvas/Library_oglcanvas.mk @@ -39,6 +39,7 @@ $(eval $(call gb_Library_add_exception_objects,oglcanvas,\ canvas/source/opengl/ogl_spritedevicehelper \ canvas/source/opengl/ogl_textlayout \ canvas/source/opengl/ogl_texturecache \ + canvas/source/opengl/ogl_renderHelper \ )) $(eval $(call gb_Library_use_externals,oglcanvas,\ diff --git a/canvas/source/opengl/ogl_canvascustomsprite.cxx b/canvas/source/opengl/ogl_canvascustomsprite.cxx index bf5f347..a9c127b 100644 --- a/canvas/source/opengl/ogl_canvascustomsprite.cxx +++ b/canvas/source/opengl/ogl_canvascustomsprite.cxx @@ -24,7 +24,6 @@ #include <basegfx/polygon/b2dpolygonclipper.hxx> #include <basegfx/polygon/b2dpolygontriangulator.hxx> #include <basegfx/polygon/b2dpolypolygontools.hxx> -#include <vcl/opengl/OpenGLHelper.hxx> #include <GL/glew.h> using namespace ::com::sun::star; @@ -48,7 +47,7 @@ namespace oglcanvas ::canvas::tools::setIdentityAffineMatrix2D(maTransformation); maCanvasHelper.init( *rRefDevice.get(), rDeviceHelper ); - InitOpenGL(); + mRenderHelper = RenderHelper(); } void CanvasCustomSprite::disposeThis() @@ -56,11 +55,7 @@ namespace oglcanvas ::osl::MutexGuard aGuard( m_aMutex ); mpSpriteCanvas.clear(); - glDeleteBuffers(1, &m_vertexBuffer); - glDeleteBuffers(1, &m_uvBuffer); - glDeleteProgram( m_texManProgID); - glDeleteProgram( m_simpleProgID); - glDeleteProgram( m_texProgID); + mRenderHelper.dispose(); // forward to parent CanvasCustomSpriteBaseT::disposeThis(); } @@ -131,27 +126,6 @@ namespace oglcanvas return this; } - void CanvasCustomSprite::InitOpenGL() - { - //Load Shaders // - m_texManProgID = OpenGLHelper::LoadShaders("textManipulatingVertexShader", "textFragmentShader"); - m_simpleProgID = OpenGLHelper::LoadShaders("simpleVertexShader", "textFragmentShader"); - m_texProgID = OpenGLHelper::LoadShaders("texVertrexShader", "constantFragmentShader"); - // 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"); - //Gen Buffers for texturecoordinates/vertices - glGenBuffers(1, &m_vertexBuffer); - glGenBuffers(1, &m_uvBuffer); - m_manPosAttrb = glGetAttribLocation(m_texManProgID ,"vPosition"); - m_simpleUvAttrb = glGetAttribLocation(m_simpleProgID ,"UV"); - m_simplePosAttrb = glGetAttribLocation(m_simpleProgID ,"vPosition"); - m_texPosAttrb = glGetAttribLocation(m_texProgID ,"vPosition"); - } bool CanvasCustomSprite::renderSprite() const { @@ -213,7 +187,8 @@ namespace oglcanvas glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - // blend against fixed vertex color; texture alpha is multiplied in + GLfloat color[] = {1, 1, 1, (float)mfAlpha}; + if( mxClip.is() ) { const double fWidth=maSize.Width; @@ -239,33 +214,7 @@ namespace oglcanvas vertices[i*2]= rPt.getX(); vertices[i*2+1]= rPt.getY(); } - - //Bind Buffers - glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - - glUseProgram(m_texManProgID); - - //Set Uniforms - glUniform1i(m_manTexUnf, 0); - glUniform2f(m_manCordUnf,fWidth,fHeight); - glUniform4f(m_manColorUnf, 1, 1, 1, mfAlpha); - - glEnableVertexAttribArray(m_manPosAttrb); - glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); - glVertexAttribPointer( - m_manPosAttrb, - 2, // size - GL_FLOAT, // type - GL_FALSE, // normalized? - 0, // stride - (void*)0 // array buffer offset - ); - - glDrawArrays(GL_TRIANGLES, 0, rTriangulatedPolygon.count()); - - glDisableVertexAttribArray(m_manPosAttrb); - glUseProgram(0); + mRenderHelper.renderVertexTex( vertices, fWidth, fHeight, color, GL_TRIANGLES); } else { @@ -281,44 +230,7 @@ namespace oglcanvas (float) fWidth, 0, (float) fWidth, (float) fHeight }; - glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - - glBindBuffer(GL_ARRAY_BUFFER, m_uvBuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(uvCoordinates), uvCoordinates, GL_STATIC_DRAW); - - glUseProgram(m_simpleProgID); - - glUniform1i(m_simpleTexUnf, 0); - glUniform4f(m_simpleColorUnf, 1, 1, 1, mfAlpha); - - glEnableVertexAttribArray(m_simplePosAttrb); //richtige ID herausfinden - glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); - glVertexAttribPointer( - m_simplePosAttrb, - 2, // size - GL_FLOAT, // type - GL_FALSE, // normalized? - 0, // stride - (void*)0 // array buffer offset - ); - - glEnableVertexAttribArray(m_simpleUvAttrb); - glBindBuffer(GL_ARRAY_BUFFER, m_uvBuffer); - glVertexAttribPointer( - m_simpleUvAttrb, - 2, // size - GL_FLOAT, // type - GL_FALSE, // normalized? - 0, // stride - (void*)0 // array buffer offset - ); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - glDisableVertexAttribArray(m_simplePosAttrb); - glDisableVertexAttribArray(m_simpleUvAttrb); - glUseProgram(0); + mRenderHelper.renderVertexUVTex(vertices, uvCoordinates, color, GL_TRIANGLE_STRIP ); } glBindTexture(GL_TEXTURE_2D, 0); @@ -331,31 +243,9 @@ namespace oglcanvas (float) maSize.Width+4, -2, -2, -2, (float) maSize.Width+4, (float) maSize.Height+4 }; + GLfloat color[] = {1, 0, 0, 1}; - glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - - glUseProgram(m_texProgID); - - glUniform4f(m_texColorUnf, 1, 0, 0, 1); - glEnableVertexAttribArray(m_texPosAttrb); //richtige ID herausfinden - - glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); - glVertexAttribPointer( - m_texPosAttrb, - 2, // size - GL_FLOAT, // type - GL_FALSE, // normalized? - 0, // stride - (void*)0 // array buffer offset - ); - - glDrawArrays(GL_LINE_STRIP, 0, 6); - - glDisableVertexAttribArray(m_texPosAttrb); - glUseProgram(0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - + mRenderHelper.renderVertexConstColor(vertices, color, GL_LINE_STRIP); std::vector<double> aVec; aVec.push_back(mfAlpha); @@ -366,6 +256,7 @@ namespace oglcanvas return true; } + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/opengl/ogl_canvascustomsprite.hxx b/canvas/source/opengl/ogl_canvascustomsprite.hxx index 46b59fe..b678f1a 100644 --- a/canvas/source/opengl/ogl_canvascustomsprite.hxx +++ b/canvas/source/opengl/ogl_canvascustomsprite.hxx @@ -26,6 +26,7 @@ #include "ogl_spritecanvas.hxx" #include "ogl_canvashelper.hxx" #include <GL/glew.h> +#include "ogl_renderHelper.hxx" namespace oglcanvas { @@ -85,33 +86,13 @@ namespace oglcanvas */ SpriteCanvasRef mpSpriteCanvas; const ::com::sun::star::geometry::RealSize2D maSize; - void InitOpenGL(); ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D > mxClip; ::com::sun::star::geometry::AffineMatrix2D maTransformation; ::basegfx::B2DPoint maPosition; double mfAlpha; double mfPriority; - - GLuint m_vertexBuffer; - GLuint m_uvBuffer; - - - GLuint m_simpleProgID; - GLuint m_simpleUvAttrb; - GLuint m_simplePosAttrb; - GLuint m_simpleTexUnf; - GLuint m_simpleColorUnf; - - GLuint m_manTexUnf; - GLuint m_manPosAttrb; - GLuint m_manCordUnf; - GLuint m_manColorUnf; - - GLuint m_texPosAttrb; - GLuint m_texColorUnf; - GLuint m_texManProgID; - GLuint m_texProgID; + RenderHelper mRenderHelper; }; } diff --git a/canvas/source/opengl/ogl_renderHelper.cxx b/canvas/source/opengl/ogl_renderHelper.cxx new file mode 100644 index 0000000..c3d6a87 --- /dev/null +++ b/canvas/source/opengl/ogl_renderHelper.cxx @@ -0,0 +1,142 @@ +#include <GL/glew.h> +#include "ogl_renderHelper.hxx" +namespace oglcanvas +{ + RenderHelper::RenderHelper() + { + InitOpenGL(); + } + + void RenderHelper::InitOpenGL() + { + //Load Shaders // + m_texManProgID = OpenGLHelper::LoadShaders("textManipulatingVertexShader", "textFragmentShader"); + m_simpleProgID = OpenGLHelper::LoadShaders("simpleVertexShader", "textFragmentShader"); + m_texProgID = OpenGLHelper::LoadShaders("texVertrexShader", "constantFragmentShader"); + // 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"); + //Gen Buffers for texturecoordinates/vertices + glGenBuffers(1, &m_vertexBuffer); + glGenBuffers(1, &m_uvBuffer); + m_manPosAttrb = glGetAttribLocation(m_texManProgID ,"vPosition"); + m_simpleUvAttrb = glGetAttribLocation(m_simpleProgID ,"UV"); + m_simplePosAttrb = glGetAttribLocation(m_simpleProgID ,"vPosition"); + m_texPosAttrb = glGetAttribLocation(m_texProgID ,"vPosition"); + } + + void RenderHelper::renderVertexConstColor(GLfloat vertices[], GLfloat color[4], GLenum mode) const + { + glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + glUseProgram(m_texProgID); + + glUniform4f(m_texColorUnf,color[0], color[1], color[2], color[3]); + glEnableVertexAttribArray(m_texPosAttrb); //vertices + + glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); + glVertexAttribPointer( + m_texPosAttrb, + 2, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + + glDrawArrays(mode, 0, sizeof(vertices) / sizeof(vertices[0]) /2); + + glDisableVertexAttribArray(m_texPosAttrb); + glUseProgram(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + } + //Renders a TriangleStrip, Texture has to be stored in TextureUnit0 + void RenderHelper::renderVertexUVTex(GLfloat vertices[], GLfloat uvCoordinates[], GLfloat color[4], GLenum mode) const + { + glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, m_uvBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(uvCoordinates), uvCoordinates, GL_STATIC_DRAW); + + glUseProgram(m_simpleProgID); + + glUniform1i(m_simpleTexUnf, 0); //Use texture Unit 0 + glUniform4f(m_simpleColorUnf, color[0], color[1], color[2], color[3]); + + glEnableVertexAttribArray(m_simplePosAttrb); + glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); + glVertexAttribPointer( + m_simplePosAttrb, + 2, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + + glEnableVertexAttribArray(m_simpleUvAttrb); + glBindBuffer(GL_ARRAY_BUFFER, m_uvBuffer); + glVertexAttribPointer( + m_simpleUvAttrb, + 2, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + + glDrawArrays(mode, 0, sizeof(vertices) / sizeof(vertices[0]) /2); + + glDisableVertexAttribArray(m_simplePosAttrb); + glDisableVertexAttribArray(m_simpleUvAttrb); + glUseProgram(0); + } + + //Clean up + void RenderHelper::dispose() + { + glDeleteBuffers(1, &m_vertexBuffer); + glDeleteBuffers(1, &m_uvBuffer); + glDeleteProgram( m_texManProgID); + glDeleteProgram( m_simpleProgID); + glDeleteProgram( m_texProgID); + } + + // Renders a Polygon, Texture has to be stored in TextureUnit0 + // Uses fWidth,fHeight to generate texture coordinates in vertex-shader. + void RenderHelper::renderVertexTex(GLfloat vertices[], GLfloat fWidth, GLfloat fHeight, GLfloat color[4], GLenum mode) const + { + glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + glUseProgram(m_texManProgID); + + //Set Uniforms + glUniform1i(m_manTexUnf, 0); + glUniform2f(m_manCordUnf,fWidth,fHeight); + glUniform4f(m_manColorUnf, color[0], color[1], color[2], color[3] ); + + glEnableVertexAttribArray(m_manPosAttrb); + glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); + glVertexAttribPointer( + m_manPosAttrb, + 2, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + + glDrawArrays(mode, 0, sizeof(vertices) / sizeof(vertices[0]) /2); + + glDisableVertexAttribArray(m_manPosAttrb); + glUseProgram(0); + } +} \ No newline at end of file diff --git a/canvas/source/opengl/ogl_renderHelper.hxx b/canvas/source/opengl/ogl_renderHelper.hxx new file mode 100644 index 0000000..ea368a7 --- /dev/null +++ b/canvas/source/opengl/ogl_renderHelper.hxx @@ -0,0 +1,35 @@ +#include <GL/glew.h> +#include <vcl/opengl/OpenGLHelper.hxx> +namespace oglcanvas +{ + class RenderHelper + { + public: + RenderHelper(); + 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(); + private: + void InitOpenGL(); + GLuint m_vertexBuffer; + GLuint m_uvBuffer; + + + GLuint m_simpleProgID; + GLuint m_simpleUvAttrb; + GLuint m_simplePosAttrb; + GLuint m_simpleTexUnf; + GLuint m_simpleColorUnf; + + GLuint m_manTexUnf; + GLuint m_manPosAttrb; + GLuint m_manCordUnf; + GLuint m_manColorUnf; + + GLuint m_texPosAttrb; + GLuint m_texColorUnf; + GLuint m_texManProgID; + GLuint m_texProgID; + }; +} \ No newline at end of file _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits