[Libreoffice-commits] core.git: Branch 'feature/opengl-canvas-rework' - canvas/Library_oglcanvas.mk canvas/source
Michael Jaumann
meta_dev at yahoo.com
Wed Oct 22 01:31:23 PDT 2014
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_dev at 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
More information about the Libreoffice-commits
mailing list