summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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();
}
}