summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@collabora.co.uk>2014-05-26 00:27:22 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-05-26 03:29:07 +0200
commit36943e981baf837191d78a0b7fe77c23e7dde0d6 (patch)
treee1c208ed7f028e15ca3915e300999914a1d4cd7a
parentf9d9aceb1c6448d2ed1ab3086e7a73684629233f (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
-rw-r--r--chart2/Package_opengl.mk2
-rw-r--r--chart2/opengl/screenTextFragmentShader.glsl17
-rw-r--r--chart2/opengl/screenTextVertexShader.glsl19
-rw-r--r--chart2/source/view/charttypes/GL3DBarChart.cxx6
-rw-r--r--chart2/source/view/inc/3DChartObjects.hxx14
-rw-r--r--chart2/source/view/inc/GL3DBarChart.hxx9
-rw-r--r--chart2/source/view/inc/GL3DRenderer.hxx15
-rw-r--r--chart2/source/view/main/3DChartObjects.cxx17
-rw-r--r--chart2/source/view/main/GL3DRenderer.cxx118
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();
}
}