diff options
author | Markus Mohrhard <markus.mohrhard@collabora.co.uk> | 2014-05-26 00:27:22 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-05-26 03:29:07 +0200 |
commit | 36943e981baf837191d78a0b7fe77c23e7dde0d6 (patch) | |
tree | e1c208ed7f028e15ca3915e300999914a1d4cd7a /chart2 | |
parent | f9d9aceb1c6448d2ed1ab3086e7a73684629233f (diff) |
initial work on screen text
Screen text is positioned in screen coordinates and therefore in 2D.
This means it will not move with the camera.
Change-Id: I3cf2e8859871ebc8034396b4c2d6f1ff9fe5d9f6
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/Package_opengl.mk | 2 | ||||
-rw-r--r-- | chart2/opengl/screenTextFragmentShader.glsl | 17 | ||||
-rw-r--r-- | chart2/opengl/screenTextVertexShader.glsl | 19 | ||||
-rw-r--r-- | chart2/source/view/charttypes/GL3DBarChart.cxx | 6 | ||||
-rw-r--r-- | chart2/source/view/inc/3DChartObjects.hxx | 14 | ||||
-rw-r--r-- | chart2/source/view/inc/GL3DBarChart.hxx | 9 | ||||
-rw-r--r-- | chart2/source/view/inc/GL3DRenderer.hxx | 15 | ||||
-rw-r--r-- | chart2/source/view/main/3DChartObjects.cxx | 17 | ||||
-rw-r--r-- | chart2/source/view/main/GL3DRenderer.cxx | 118 |
9 files changed, 217 insertions, 0 deletions
diff --git a/chart2/Package_opengl.mk b/chart2/Package_opengl.mk index cb8c45670870..99cdde345756 100644 --- a/chart2/Package_opengl.mk +++ b/chart2/Package_opengl.mk @@ -22,6 +22,8 @@ $(eval $(call gb_Package_add_files,chart2_opengl_shader,$(LIBO_BIN_FOLDER)/openg symbolVertexShader.glsl \ textFragmentShader.glsl \ textVertexShader.glsl \ + screenTextFragmentShader.glsl \ + screenTextVertexShader.glsl \ shape3DFragmentShader.glsl \ shape3DVertexShader.glsl \ renderTextureVertexShader.glsl \ diff --git a/chart2/opengl/screenTextFragmentShader.glsl b/chart2/opengl/screenTextFragmentShader.glsl new file mode 100644 index 000000000000..a8481034210a --- /dev/null +++ b/chart2/opengl/screenTextFragmentShader.glsl @@ -0,0 +1,17 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +varying vec2 vTexCoord; +uniform sampler2D TextTex; +void main() +{ + gl_FragColor = vec4(texture2D(TextTex, vTexCoord).rgba); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/opengl/screenTextVertexShader.glsl b/chart2/opengl/screenTextVertexShader.glsl new file mode 100644 index 000000000000..8d046f56394c --- /dev/null +++ b/chart2/opengl/screenTextVertexShader.glsl @@ -0,0 +1,19 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +attribute vec3 vPosition; +attribute vec2 texCoord; +varying vec2 vTexCoord; +void main() +{ + gl_Position = vec4(vPosition, 1); + vTexCoord = texCoord; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index 6594c03ca9fe..9674495b0be7 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -186,6 +186,12 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer pAxis->setPosition(aBegin, aEnd); pAxis->setLineColor(COL_BLUE); + // test for information + maShapes.push_back(new opengl3D::ScreenText(mpRenderer.get(), *mpTextCache, + "I'm really nice text", 0)); + opengl3D::ScreenText* pScreenText = static_cast<opengl3D::ScreenText*>(&maShapes.back()); + pScreenText->setPosition(glm::vec2(-1.0f, 0.9f), glm::vec2(-0.6f, 0.75f)); + // Chart background. maShapes.push_back(new opengl3D::Rectangle(mpRenderer.get(), nId++)); opengl3D::Rectangle* pRect = static_cast<opengl3D::Rectangle*>(&maShapes.back()); diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx index acc3bf471838..24eb19f67e56 100644 --- a/chart2/source/view/inc/3DChartObjects.hxx +++ b/chart2/source/view/inc/3DChartObjects.hxx @@ -91,6 +91,20 @@ private: glm::vec3 maBottomRight; }; +class ScreenText : public Renderable3DObject +{ +public: + ScreenText(OpenGL3DRenderer* pRenderer, TextCache& rTextCache, const OUString& rStr, sal_uInt32 nId); + + virtual void render() SAL_OVERRIDE; + void setPosition(const glm::vec2& rTopLeft, const glm::vec2& rBottomRight); + +private: + const BitmapEx& mrText; + glm::vec2 maTopLeft; + glm::vec2 maBottomRight; +}; + class Rectangle : public Renderable3DObject { public: diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx index 0f56b6455490..f7408d8da95a 100644 --- a/chart2/source/view/inc/GL3DBarChart.hxx +++ b/chart2/source/view/inc/GL3DBarChart.hxx @@ -87,6 +87,15 @@ private: * numbering counter clockwise */ sal_Int8 mnCornerId; + + struct BarInformation + { + double nVal; + OUString aSeriesName; + }; + + + std::map<sal_uInt32, BarInformation> maBarMap; }; } diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index 5584458848f3..e337623a347c 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -162,6 +162,7 @@ public: void SetSize(const Size& rSize); void SetCameraInfo(glm::vec3 pos, glm::vec3 direction, glm::vec3 up); void CreateTextTexture(const BitmapEx& rBitmapEx, glm::vec3 vTopLeft,glm::vec3 vTopRight, glm::vec3 vBottomRight, glm::vec3 vBottomLeft, sal_uInt32 nUniqueId); + void CreateScreenTextTexture(const BitmapEx& rBitmapEx, glm::vec2 vTopLeft, glm::vec2 vBottomRight, sal_uInt32 nUniqueId); void ProcessUnrenderedShape(); void SetPickingMode(bool bPickingMode); @@ -178,6 +179,7 @@ private: void RenderExtrude3DObject(); //add for text void RenderTextShape(); + void RenderScreenTextShape(); void RenderExtrudeSurface(const Extrude3DInfo& extrude3D); void RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D); void RenderExtrudeMiddleSurface(const Extrude3DInfo& extrude3D); @@ -206,6 +208,7 @@ private: void ReleasePolygonShapes(); void ReleaseExtrude3DShapes(); void ReleaseTextShapes(); + void ReleaseScreenTextShapes(); private: struct ShaderResources @@ -226,6 +229,12 @@ private: GLint m_TextTexCoordID; GLint m_TextTexID; + // ScreenTextProID + GLint m_ScreenTextProID; + GLint m_ScreenTextVertexID; + GLint m_ScreenTextTexCoordID; + GLint m_ScreenTextTexID; + // CommonProID GLint m_CommonProID; GLint m_2DVertexID; @@ -251,6 +260,10 @@ private: , m_TextVertexID(0) , m_TextTexCoordID(0) , m_TextTexID(0) + , m_ScreenTextProID(0) + , m_ScreenTextVertexID(0) + , m_ScreenTextTexCoordID(0) + , m_ScreenTextTexID(0) , m_CommonProID(0) , m_2DVertexID(0) , m_2DColorID(0) @@ -267,6 +280,7 @@ private: glDeleteProgram(m_CommonProID); glDeleteProgram(m_RenderProID); glDeleteProgram(m_TextProID); + glDeleteProgram(m_ScreenTextProID); glDeleteProgram(m_3DProID); } @@ -353,6 +367,7 @@ private: GLuint m_BoundBoxNormal; // add for text std::vector <TextInfo> m_TextInfoList; + std::vector <TextInfo> m_ScreenTextInfoList; GLuint m_TextTexCoordBuf; std::vector<glm::vec3> m_Vertices; diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx index ce959f3111a2..730bd1e527f0 100644 --- a/chart2/source/view/main/3DChartObjects.cxx +++ b/chart2/source/view/main/3DChartObjects.cxx @@ -115,6 +115,23 @@ void Text::setPosition(const glm::vec3& rTopLeft, const glm::vec3& rTopRight, co maBottomRight = rBottomRight; } +ScreenText::ScreenText(OpenGL3DRenderer* pRenderer, TextCache& rTextCache, const OUString& rStr, sal_uInt32 nId): + Renderable3DObject(pRenderer, nId), + mrText(rTextCache.getText(rStr)) +{ +} + +void ScreenText::setPosition(const glm::vec2& rTopLeft, const glm::vec2& rBottomRight) +{ + maTopLeft = rTopLeft; + maBottomRight = rBottomRight; +} + +void ScreenText::render() +{ + mpRenderer->CreateScreenTextTexture(mrText, maTopLeft, maBottomRight, mnUniqueId); +} + Rectangle::Rectangle(OpenGL3DRenderer* pRenderer, sal_uInt32 nId): Renderable3DObject(pRenderer, nId) { diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 448938802f67..8bbd5e7ea2cf 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -123,6 +123,11 @@ void OpenGL3DRenderer::ShaderResources::LoadShaders() m_TextTexCoordID = glGetAttribLocation(m_TextProID, "texCoord"); m_TextTexID = glGetUniformLocation(m_TextProID, "TextTex"); + m_ScreenTextProID = OpenGLHelper::LoadShaders("screenTextVertexShader", "screenTextFragmentShader"); + m_ScreenTextVertexID = glGetAttribLocation(m_ScreenTextProID, "vPosition"); + m_ScreenTextTexCoordID = glGetAttribLocation(m_ScreenTextProID, "texCoord"); + m_ScreenTextTexID = glGetUniformLocation(m_ScreenTextProID, "TextTex"); + m_CommonProID = OpenGLHelper::LoadShaders("commonVertexShader", "commonFragmentShader"); m_MatrixID = glGetUniformLocation(m_CommonProID, "MVP"); m_2DVertexID = glGetAttribLocation(m_CommonProID, "vPosition"); @@ -1349,6 +1354,50 @@ void OpenGL3DRenderer::RenderExtrude3DObject() glDisable(GL_CULL_FACE); } +void OpenGL3DRenderer::CreateScreenTextTexture(const BitmapEx& rBitmapEx, glm::vec2 vTopLeft, glm::vec2 vBottomRight, sal_uInt32 nUniqueId) +{ + long bmpWidth = rBitmapEx.GetSizePixel().Width(); + long bmpHeight = rBitmapEx.GetSizePixel().Height(); + boost::scoped_array<sal_uInt8> bitmapBuf(OpenGLHelper::ConvertBitmapExToRGBABuffer(rBitmapEx)); + + TextInfo aTextInfo; + aTextInfo.id = getColorAsVector(nUniqueId); + aTextInfo.vertex[0] = vTopLeft.x; + aTextInfo.vertex[1] = vTopLeft.y; + aTextInfo.vertex[2] = 0; + + aTextInfo.vertex[3] = vBottomRight.x; + aTextInfo.vertex[4] = vTopLeft.y; + aTextInfo.vertex[5] = 0; + + aTextInfo.vertex[9] = vTopLeft.x; + aTextInfo.vertex[10] = vBottomRight.y; + aTextInfo.vertex[11] = 0; + + aTextInfo.vertex[6] = vBottomRight.x; + aTextInfo.vertex[7] = vBottomRight.y; + aTextInfo.vertex[8] = 0; + + CHECK_GL_ERROR(); + glGenTextures(1, &aTextInfo.texture); + CHECK_GL_ERROR(); + glBindTexture(GL_TEXTURE_2D, aTextInfo.texture); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + CHECK_GL_ERROR(); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bmpWidth, bmpHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapBuf.get()); + CHECK_GL_ERROR(); + glBindTexture(GL_TEXTURE_2D, 0); + CHECK_GL_ERROR(); + m_ScreenTextInfoList.push_back(aTextInfo); +} + void OpenGL3DRenderer::CreateTextTexture(const BitmapEx& rBitmapEx, glm::vec3 vTopLeft,glm::vec3 vTopRight, glm::vec3 vBottomRight, glm::vec3 vBottomLeft, sal_uInt32 nUniqueId) { long bmpWidth = rBitmapEx.GetSizePixel().Width(); @@ -1403,6 +1452,72 @@ void OpenGL3DRenderer::ReleaseTextShapes() m_TextInfoList.clear(); } +void OpenGL3DRenderer::ReleaseScreenTextShapes() +{ + for (size_t i = 0; i < m_ScreenTextInfoList.size(); i++) + { + TextInfo &textInfo = m_ScreenTextInfoList[i]; + glDeleteTextures(1, &textInfo.texture); + } + m_ScreenTextInfoList.clear(); +} + +void OpenGL3DRenderer::RenderScreenTextShape() +{ + CHECK_GL_ERROR(); + for (size_t i = 0; i < m_ScreenTextInfoList.size(); i++) + { + TextInfo &textInfo = m_ScreenTextInfoList[i]; + glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); + CHECK_GL_ERROR(); + glBufferData(GL_ARRAY_BUFFER, sizeof(textInfo.vertex), textInfo.vertex, GL_STATIC_DRAW); + CHECK_GL_ERROR(); + glUseProgram(maResources.m_ScreenTextProID); + + CHECK_GL_ERROR(); + + // 1rst attribute buffer : vertices + glEnableVertexAttribArray(maResources.m_ScreenTextVertexID); + glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); + glVertexAttribPointer( + maResources.m_ScreenTextVertexID, + 3, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + //tex coord + CHECK_GL_ERROR(); + glEnableVertexAttribArray(maResources.m_ScreenTextTexCoordID); + glBindBuffer(GL_ARRAY_BUFFER, m_TextTexCoordBuf); + glVertexAttribPointer( + maResources.m_ScreenTextTexCoordID, + 2, // size + GL_FLOAT, // type + GL_FALSE, // normalized? + 0, // stride + (void*)0 // array buffer offset + ); + //texture + CHECK_GL_ERROR(); + glBindTexture(GL_TEXTURE_2D, textInfo.texture); + CHECK_GL_ERROR(); + glUniform1i(maResources.m_ScreenTextTexID, 0); + CHECK_GL_ERROR(); + //TODO: moggi: get rid fo GL_QUADS + glDrawArrays(GL_QUADS, 0, 4); + CHECK_GL_ERROR(); + glDisableVertexAttribArray(maResources.m_ScreenTextTexCoordID); + CHECK_GL_ERROR(); + glDisableVertexAttribArray(maResources.m_ScreenTextVertexID); + CHECK_GL_ERROR(); + glBindTexture(GL_TEXTURE_2D, 0); + glUseProgram(0); + } + CHECK_GL_ERROR(); +} + void OpenGL3DRenderer::RenderTextShape() { CHECK_GL_ERROR(); @@ -1484,6 +1599,8 @@ void OpenGL3DRenderer::ProcessUnrenderedShape() RenderExtrude3DObject(); //render text RenderTextShape(); + // render screen text + RenderScreenTextShape(); ReleaseShapes(); #if DEBUG_FBO OUString aFileName = OUString("D://shaderout_") + OUString::number(m_iWidth) + "_" + OUString::number(m_iHeight) + ".png"; @@ -1525,6 +1642,7 @@ void OpenGL3DRenderer::ReleaseShapes() ReleasePolygonShapes(); ReleaseExtrude3DShapes(); ReleaseTextShapes(); + ReleaseScreenTextShapes(); } } |