chart2/Package_opengl.mk | 2 chart2/opengl/screenTextFragmentShader.glsl | 17 ++ chart2/opengl/screenTextVertexShader.glsl | 19 ++ chart2/source/view/charttypes/GL3DBarChart.cxx | 101 +++++++++++- chart2/source/view/inc/3DChartObjects.hxx | 17 +- chart2/source/view/inc/GL3DBarChart.hxx | 23 ++ chart2/source/view/inc/GL3DRenderer.hxx | 70 +------- chart2/source/view/main/3DChartObjects.cxx | 22 ++ chart2/source/view/main/GL3DRenderer.cxx | 202 ++++++++++++++++++++----- include/vcl/openglwin.hxx | 2 vcl/source/window/openglwin.cxx | 2 11 files changed, 362 insertions(+), 115 deletions(-)
New commits: commit dc91ebed1a3b0ef900b1bb5cf203c6a9aeb83016 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Mon May 26 03:20:12 2014 +0200 react only to left mouse click Change-Id: Ia4c2c52b8803cd36d7ed32be559ba446589377e7 diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index ea589ac..3f330a8 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -306,11 +306,14 @@ public: } -void GL3DBarChart::clickedAt(const Point& /*rPos*/) +void GL3DBarChart::clickedAt(const Point& /*rPos*/, sal_uInt16 nButtons) { if(mbBlockUserInput) return; + if(nButtons != MOUSE_LEFT) + return; + mbBlockUserInput = true; sal_uInt32 nId = 5; /* diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx index 377b18c..eb436db 100644 --- a/chart2/source/view/inc/GL3DBarChart.hxx +++ b/chart2/source/view/inc/GL3DBarChart.hxx @@ -50,7 +50,7 @@ public: virtual void update() SAL_OVERRIDE; - virtual void clickedAt(const Point& rPos) SAL_OVERRIDE; + virtual void clickedAt(const Point& rPos, sal_uInt16 nButtons) SAL_OVERRIDE; virtual void mouseDragMove(const Point& rStartPos, const Point& rEndPos, sal_uInt16 nButtons) SAL_OVERRIDE; virtual void scroll(long nDelta) SAL_OVERRIDE; virtual void contextDestroyed() SAL_OVERRIDE; diff --git a/include/vcl/openglwin.hxx b/include/vcl/openglwin.hxx index d2e86cc..85d1940 100644 --- a/include/vcl/openglwin.hxx +++ b/include/vcl/openglwin.hxx @@ -24,7 +24,7 @@ class VCLOPENGL_DLLPUBLIC IRenderer public: virtual ~IRenderer() {} virtual void update() = 0; - virtual void clickedAt(const Point& rPos) = 0; + virtual void clickedAt(const Point& rPos, sal_uInt16 nButtons) = 0; virtual void mouseDragMove(const Point& rPosBegin, const Point& rPosEnd, sal_uInt16 nButtons) = 0; virtual void scroll(long nDelta) = 0; diff --git a/vcl/source/window/openglwin.cxx b/vcl/source/window/openglwin.cxx index 455e455..1983376 100644 --- a/vcl/source/window/openglwin.cxx +++ b/vcl/source/window/openglwin.cxx @@ -68,7 +68,7 @@ void OpenGLWindow::MouseButtonUp( const MouseEvent& rMEvt ) Color aColor = GetPixel(aPoint); SAL_WARN("vcl.opengl", aColor.GetColor()); if(mpRenderer) - mpRenderer->clickedAt(aPoint); + mpRenderer->clickedAt(aPoint, rMEvt.GetButtons()); } else { commit 8097fff2cc3ec601248c55f4d1434bd6d4c6c66e Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Mon May 26 03:15:18 2014 +0200 remove unnecessary debug message Change-Id: I63e65bce671d1feab4ea93bdff906b597ce180c3 diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index 03897df..ea589ac 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -347,13 +347,13 @@ void GL3DBarChart::clickedAt(const Point& /*rPos*/) } -void GL3DBarChart::mouseDragMove(const Point& rStartPos, const Point& rEndPos, sal_uInt16 nButtons) +void GL3DBarChart::mouseDragMove(const Point& , const Point& , sal_uInt16 nButtons) { if(mbBlockUserInput) return; mbBlockUserInput = true; - SAL_WARN("chart2.opengl", "Dragging: " << rStartPos << " to : " << rEndPos << " Buttons: " << nButtons); + if(nButtons == MOUSE_RIGHT) { mnCornerId = (mnCornerId + 1) % 4; commit d0f2ea6aefd7fb797cad55cf73964cb0e261318b Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Mon May 26 03:14:48 2014 +0200 improve screen text positioning Change-Id: Ia1f4ae40b8dbed2324c600f7ef68a33a5b04027b diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index 73a41d8..03897df 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -343,7 +343,7 @@ void GL3DBarChart::clickedAt(const Point& /*rPos*/) maShapes.push_back(new opengl3D::ScreenText(mpRenderer.get(), *mpTextCache, OUString("Value: ") + OUString::number(rBarInfo.mnVal), 0)); opengl3D::ScreenText* pScreenText = static_cast<opengl3D::ScreenText*>(&maShapes.back()); - pScreenText->setPosition(glm::vec2(-1.0f, 0.9f), glm::vec2(-0.6f, 0.75f)); + pScreenText->setPosition(glm::vec2(-0.9f, 0.9f), glm::vec2(-0.6f, 0.8f)); } commit 257510bffb75eb11d759db7d86b78861b49e921e Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Mon May 26 03:11:22 2014 +0200 block user input while we are in another user interaction Change-Id: I25a846b0648d2d28585a58066a9bb1088d607c24 diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index 951188d..73a41d8 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -34,7 +34,8 @@ GL3DBarChart::GL3DBarChart( mpTextCache(new opengl3D::TextCache()), mnStep(0), mnStepsTotal(0), - mnCornerId(0) + mnCornerId(0), + mbBlockUserInput(false) { Size aSize = mrWindow.GetSizePixel(); mpRenderer->SetSize(aSize); @@ -307,6 +308,10 @@ public: void GL3DBarChart::clickedAt(const Point& /*rPos*/) { + if(mbBlockUserInput) + return; + + mbBlockUserInput = true; sal_uInt32 nId = 5; /* { @@ -344,6 +349,10 @@ void GL3DBarChart::clickedAt(const Point& /*rPos*/) void GL3DBarChart::mouseDragMove(const Point& rStartPos, const Point& rEndPos, sal_uInt16 nButtons) { + if(mbBlockUserInput) + return; + + mbBlockUserInput = true; SAL_WARN("chart2.opengl", "Dragging: " << rStartPos << " to : " << rEndPos << " Buttons: " << nButtons); if(nButtons == MOUSE_RIGHT) { @@ -413,6 +422,7 @@ IMPL_LINK_NOARG(GL3DBarChart, MoveCamera) } else { + mbBlockUserInput = false; mnStep = 0; } @@ -434,6 +444,7 @@ IMPL_LINK_NOARG(GL3DBarChart, MoveToBar) else { maShapes.pop_back(); + mbBlockUserInput = false; mnStep = 0; } @@ -442,6 +453,9 @@ IMPL_LINK_NOARG(GL3DBarChart, MoveToBar) void GL3DBarChart::scroll(long nDelta) { + if(mbBlockUserInput) + return; + glm::vec3 maDir = glm::normalize(maCameraPosition - maCameraDirection); maCameraPosition -= (float((nDelta/10)) * maDir); mpCamera->setPosition(maCameraPosition); diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx index 1f54cc6..377b18c 100644 --- a/chart2/source/view/inc/GL3DBarChart.hxx +++ b/chart2/source/view/inc/GL3DBarChart.hxx @@ -107,6 +107,7 @@ private: std::map<sal_uInt32, const BarInformation> maBarMap; + bool mbBlockUserInput; }; } commit b8dc914cdc0eab0735e4fec7613221fef2fc0fdb Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Mon May 26 03:08:08 2014 +0200 adapt bar size to demo Change-Id: Id746ce00f9e91397a3edf0b39bf7dbb08ea59885 diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index 6131e05..951188d 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -97,7 +97,7 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer // guarantee they are positioned correctly. In fact, they are guaranteed // to be positioned incorrectly. - const float nBarSizeX = 10.0f; + const float nBarSizeX = 5.0f; const float nBarSizeY = 30.0f; const float nBarDistanceX = 5.0f; const float nBarDistanceY = 5.0; commit d06ce014edf0c83b27b31d6c5af20de39d593037 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Mon May 26 02:37:28 2014 +0200 add initial work on zoom into the bar movement Change-Id: Idc8c1f27dbeafdf34706f09c890f202849c2ce33 diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index 9674495..6131e05 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -40,7 +40,15 @@ GL3DBarChart::GL3DBarChart( mpRenderer->SetSize(aSize); mrWindow.setRenderer(this); mpRenderer->init(); - maTimer.SetTimeoutHdl(LINK(this, GL3DBarChart, MoveCamera)); +} + +GL3DBarChart::BarInformation::BarInformation(const glm::vec3& rPos, float nVal, + sal_Int32 nIndex, sal_Int32 nSeriesIndex): + maPos(rPos), + mnVal(nVal), + mnIndex(nIndex), + mnSeriesIndex(nSeriesIndex) +{ } GL3DBarChart::~GL3DBarChart() @@ -102,6 +110,10 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer COL_RED, COL_GREEN, COL_YELLOW, COL_BROWN, COL_GRAY }; + maCategories.clear(); + maSeriesNames.clear(); + maSeriesNames.reserve(rDataSeriesContainer.size()); + maBarMap.clear(); maShapes.clear(); maShapes.push_back(new opengl3D::Camera(mpRenderer.get())); mpCamera = static_cast<opengl3D::Camera*>(&maShapes.back()); @@ -125,6 +137,8 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer DataSeriesHelper::getDataSeriesLabel( rDataSeries.getModel(), mxChartType->getRoleOfSequenceForSeriesLabel()); + maSeriesNames.push_back(aSeriesName); + if(!aSeriesName.isEmpty()) { maShapes.push_back(new opengl3D::Text(mpRenderer.get(), @@ -155,6 +169,10 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer glm::mat4 aTranslationMatrix = glm::translate(nXPos, nYPos, 0.0f); glm::mat4 aBarPosition = aTranslationMatrix * aScaleMatrix; + maBarMap.insert(std::pair<sal_uInt32, BarInformation>(nId, + BarInformation(glm::vec3(nXPos, nYPos, float(nVal/nMaxVal)), + nVal, nIndex, nSeriesIndex))); + maShapes.push_back(new opengl3D::Bar(mpRenderer.get(), aBarPosition, nColor, nId++)); } @@ -186,12 +204,6 @@ 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()); @@ -208,6 +220,7 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer uno::Sequence<OUString> aCats = rCatProvider.getSimpleCategories(); for (sal_Int32 i = 0; i < aCats.getLength(); ++i) { + maCategories.push_back(aCats[i]); if(aCats[i].isEmpty()) continue; @@ -292,16 +305,41 @@ public: } -void GL3DBarChart::clickedAt(const Point& rPos) +void GL3DBarChart::clickedAt(const Point& /*rPos*/) { - sal_uInt32 nId = 1; + sal_uInt32 nId = 5; + /* { PickingModeSetter aPickingModeSetter(mpRenderer.get()); render(); nId = mpRenderer->GetPixelColorFromPoint(rPos.X(), rPos.Y()); } - if (mpCamera && nId != COL_WHITE) - mpCamera->zoom(nId); + */ + + std::map<sal_uInt32, const BarInformation>::const_iterator itr = + maBarMap.find(nId); + + if(itr == maBarMap.end()) + return; + + const BarInformation& rBarInfo = itr->second; + mnStepsTotal = 100; + mnStep = 0; + maOldCameraDirection = maCameraDirection; + maCameraDirection = rBarInfo.maPos; + render(); + + maStep = (rBarInfo.maPos - maCameraPosition)/102.0f; + + maTimer.SetTimeout(TIMEOUT); + maTimer.SetTimeoutHdl(LINK(this, GL3DBarChart, MoveToBar)); + maTimer.Start(); + + maShapes.push_back(new opengl3D::ScreenText(mpRenderer.get(), *mpTextCache, + OUString("Value: ") + OUString::number(rBarInfo.mnVal), 0)); + opengl3D::ScreenText* pScreenText = static_cast<opengl3D::ScreenText*>(&maShapes.back()); + pScreenText->setPosition(glm::vec2(-1.0f, 0.9f), glm::vec2(-0.6f, 0.75f)); + } void GL3DBarChart::mouseDragMove(const Point& rStartPos, const Point& rEndPos, sal_uInt16 nButtons) @@ -357,6 +395,7 @@ void GL3DBarChart::moveToCorner() mnStepsTotal = 100; maStep = (getCornerPosition(mnCornerId) - maCameraPosition) / float(mnStepsTotal); maTimer.SetTimeout(TIMEOUT); + maTimer.SetTimeoutHdl(LINK(this, GL3DBarChart, MoveCamera)); maTimer.Start(); } @@ -380,6 +419,27 @@ IMPL_LINK_NOARG(GL3DBarChart, MoveCamera) return 0; } +IMPL_LINK_NOARG(GL3DBarChart, MoveToBar) +{ + maTimer.Stop(); + if(mnStep < mnStepsTotal) + { + ++mnStep; + maCameraPosition += maStep; + mpCamera->setPosition(maCameraPosition); + render(); + maTimer.SetTimeout(TIMEOUT); + maTimer.Start(); + } + else + { + maShapes.pop_back(); + mnStep = 0; + } + + return 0; +} + void GL3DBarChart::scroll(long nDelta) { glm::vec3 maDir = glm::normalize(maCameraPosition - maCameraDirection); diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx index 24eb19f..31e64f2 100644 --- a/chart2/source/view/inc/3DChartObjects.hxx +++ b/chart2/source/view/inc/3DChartObjects.hxx @@ -132,9 +132,6 @@ public: void setPosition(const glm::vec3& rPos); void setDirection(const glm::vec3& rPos); - /// Zooms the camera towards the bar with Unique Id nId. - void zoom(sal_uInt32 nId); - private: glm::vec3 maPos; glm::vec3 maUp; diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx index f7408d8..1f54cc6 100644 --- a/chart2/source/view/inc/GL3DBarChart.hxx +++ b/chart2/source/view/inc/GL3DBarChart.hxx @@ -61,6 +61,7 @@ private: glm::vec3 getCornerPosition(sal_Int8 nCornerId); DECL_LINK(MoveCamera, void*); + DECL_LINK(MoveToBar, void*); css::uno::Reference<css::chart2::XChartType> mxChartType; boost::ptr_vector<opengl3D::Renderable3DObject> maShapes; @@ -76,6 +77,9 @@ private: glm::vec3 maCameraPosition; glm::vec3 maCameraDirection; + glm::vec3 maOldCameraPosition; + glm::vec3 maOldCameraDirection; + Timer maTimer; glm::vec3 maStep; size_t mnStep; @@ -88,14 +92,21 @@ private: */ sal_Int8 mnCornerId; + std::vector<OUString> maCategories; + std::vector<OUString> maSeriesNames; struct BarInformation { - double nVal; - OUString aSeriesName; + glm::vec3 maPos; + float mnVal; + sal_Int32 mnIndex; + sal_Int32 mnSeriesIndex; + + BarInformation(const glm::vec3& rPos, float nVal, + sal_Int32 nIndex, sal_Int32 nSeriesIndex); }; - std::map<sal_uInt32, BarInformation> maBarMap; + std::map<sal_uInt32, const BarInformation> maBarMap; }; } diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx index 730bd1e..e510235 100644 --- a/chart2/source/view/main/3DChartObjects.cxx +++ b/chart2/source/view/main/3DChartObjects.cxx @@ -209,11 +209,6 @@ void Camera::setDirection(const glm::vec3& rDir) maDirection = rDir; } -void Camera::zoom(sal_uInt32 /*nId*/) -{ - // TODO here -} - } } commit 22e1895acb128e6b950cd4763c0f56e017d4cb3a Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Mon May 26 00:35:35 2014 +0200 remove more unused methods Change-Id: If50cb8b21aa7b7196027a411f207eff9aee3676a diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index 852366a..21f12c7 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -263,10 +263,6 @@ private: ShaderResources maResources; PickingShaderResources maPickingResources; - // Projection matrix : default 45 degree Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units - glm::mat4 m_Projection; - // Camera matrix - glm::mat4 m_View; // Model matrix : an identity matrix (model will be at the origin glm::mat4 m_Model; @@ -282,8 +278,6 @@ private: std::vector <Polygon3DInfo> m_Polygon3DInfoList; - glm::mat4 m_D3DTrasform; - glm::mat4 m_3DProjection; glm::mat4 m_3DView; commit 64b5ba4bfa195637bad12c9f6c2dcd19f53fc05b Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Mon May 26 00:33:39 2014 +0200 remove unused method and shader Change-Id: Ic4aafe0aa596f97ea4220e6fc063a61fa13b877d diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index 387f8ef..852366a 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -202,7 +202,6 @@ private: int GenerateRoundCornerBar(std::vector<glm::vec3> &vertices, std::vector<glm::vec3> &normals, float fRadius, int iSubDivY, int iSubDivZ, float width, float height, float depth); void CreateSceneBoxView(); - void RenderTexture(GLuint TexID); void ReleaseShapes(); void ReleasePolygonShapes(); @@ -241,12 +240,6 @@ private: GLint m_2DColorID; GLint m_MatrixID; - // RenderProID - GLint m_RenderProID; - GLint m_RenderTexID; - GLint m_RenderVertexID; - GLint m_RenderTexCoordID; - ShaderResources(); ~ShaderResources(); diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 7f6e9c3..7182a94 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -128,17 +128,12 @@ OpenGL3DRenderer::ShaderResources::ShaderResources() , m_2DVertexID(0) , m_2DColorID(0) , m_MatrixID(0) - , m_RenderProID(0) - , m_RenderTexID(0) - , m_RenderVertexID(0) - , m_RenderTexCoordID(0) { } OpenGL3DRenderer::ShaderResources::~ShaderResources() { glDeleteProgram(m_CommonProID); - glDeleteProgram(m_RenderProID); glDeleteProgram(m_TextProID); glDeleteProgram(m_ScreenTextProID); glDeleteProgram(m_3DProID); @@ -170,10 +165,6 @@ void OpenGL3DRenderer::ShaderResources::LoadShaders() m_2DVertexID = glGetAttribLocation(m_CommonProID, "vPosition"); m_2DColorID = glGetUniformLocation(m_CommonProID, "vColor"); - m_RenderProID = OpenGLHelper::LoadShaders("renderTextureVertexShader", "renderTextureFragmentShader"); - m_RenderVertexID = glGetAttribLocation(m_RenderProID, "vPosition"); - m_RenderTexCoordID = glGetAttribLocation(m_RenderProID, "texCoord"); - m_RenderTexID = glGetUniformLocation(m_RenderProID, "RenderTex"); CHECK_GL_ERROR(); } @@ -205,41 +196,6 @@ void OpenGL3DRenderer::SetCameraInfo(glm::vec3 pos, glm::vec3 direction, glm::ve m_CameraInfo.cameraUp = up; } -void OpenGL3DRenderer::RenderTexture(GLuint TexID) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glUseProgram(maResources.m_RenderProID); - - glEnableVertexAttribArray(maResources.m_RenderVertexID); - glBindBuffer(GL_ARRAY_BUFFER, m_RenderVertexBuf); - glVertexAttribPointer( - maResources.m_RenderVertexID, // attribute - 3, // size - GL_FLOAT, // type - GL_FALSE, // normalized? - 0, // stride - (void*)0 // array buffer offset - ); - glEnableVertexAttribArray(maResources.m_RenderTexCoordID); - glBindBuffer(GL_ARRAY_BUFFER, m_RenderTexCoordBuf); - glVertexAttribPointer( - maResources.m_RenderTexCoordID, // attribute. - 2, // size - GL_FLOAT, // type - GL_FALSE, // normalized? - 0, // stride - (void*)0 // array buffer offset - ); - glBindTexture(GL_TEXTURE_2D, TexID); - glUniform1i(maResources.m_RenderTexID, 0); - glDrawArrays(GL_QUADS, 0, 4); - glDisableVertexAttribArray(maResources.m_RenderTexCoordID); - glDisableVertexAttribArray(maResources.m_RenderVertexID); - glBindTexture(GL_TEXTURE_2D, 0); - glUseProgram(0); -} - void OpenGL3DRenderer::init() { glEnable(GL_TEXTURE_2D); commit 3fbaec0501385cd31818ba704c5cb91b7b96aa59 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Mon May 26 00:31:53 2014 +0200 let us not implement this large constructor in the header file Change-Id: I271882d8cba0201b6aa63308e502509b3c2ac170 diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index e337623..387f8ef 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -247,42 +247,8 @@ private: GLint m_RenderVertexID; GLint m_RenderTexCoordID; - ShaderResources() - : m_3DProID(0) - , m_3DProjectionID(0) - , m_3DViewID(0) - , m_3DModelID(0) - , m_3DNormalMatrixID(0) - , m_3DVertexID(0) - , m_3DNormalID(0) - , m_TextProID(0) - , m_TextMatrixID(0) - , 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) - , m_MatrixID(0) - , m_RenderProID(0) - , m_RenderTexID(0) - , m_RenderVertexID(0) - , m_RenderTexCoordID(0) - { - } - - ~ShaderResources() - { - glDeleteProgram(m_CommonProID); - glDeleteProgram(m_RenderProID); - glDeleteProgram(m_TextProID); - glDeleteProgram(m_ScreenTextProID); - glDeleteProgram(m_3DProID); - } + ShaderResources(); + ~ShaderResources(); void LoadShaders(); }; @@ -295,18 +261,8 @@ private: GLint m_2DColorID; GLint m_MatrixID; - PickingShaderResources() - : m_CommonProID(0) - , m_2DVertexID(0) - , m_2DColorID(0) - , m_MatrixID(0) - { - } - - ~PickingShaderResources() - { - glDeleteProgram(m_CommonProID); - } + PickingShaderResources(); + ~PickingShaderResources(); void LoadShaders(); }; diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 8bbd5e7..7f6e9c3 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -107,6 +107,43 @@ OpenGL3DRenderer::~OpenGL3DRenderer() glDeleteRenderbuffers(1, &mnPickingRboColor); } +OpenGL3DRenderer::ShaderResources::ShaderResources() + : m_3DProID(0) + , m_3DProjectionID(0) + , m_3DViewID(0) + , m_3DModelID(0) + , m_3DNormalMatrixID(0) + , m_3DVertexID(0) + , m_3DNormalID(0) + , m_TextProID(0) + , m_TextMatrixID(0) + , 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) + , m_MatrixID(0) + , m_RenderProID(0) + , m_RenderTexID(0) + , m_RenderVertexID(0) + , m_RenderTexCoordID(0) +{ +} + +OpenGL3DRenderer::ShaderResources::~ShaderResources() +{ + glDeleteProgram(m_CommonProID); + glDeleteProgram(m_RenderProID); + glDeleteProgram(m_TextProID); + glDeleteProgram(m_ScreenTextProID); + glDeleteProgram(m_3DProID); +} + void OpenGL3DRenderer::ShaderResources::LoadShaders() { m_3DProID = OpenGLHelper::LoadShaders("shape3DVertexShader", "shape3DFragmentShader"); @@ -140,6 +177,19 @@ void OpenGL3DRenderer::ShaderResources::LoadShaders() CHECK_GL_ERROR(); } +OpenGL3DRenderer::PickingShaderResources::PickingShaderResources() + : m_CommonProID(0) + , m_2DVertexID(0) + , m_2DColorID(0) + , m_MatrixID(0) +{ +} + +OpenGL3DRenderer::PickingShaderResources::~PickingShaderResources() +{ + glDeleteProgram(m_CommonProID); +} + void OpenGL3DRenderer::PickingShaderResources::LoadShaders() { m_CommonProID = OpenGLHelper::LoadShaders("pickingVertexShader", "pickingFragmentShader"); commit 36943e981baf837191d78a0b7fe77c23e7dde0d6 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Mon May 26 00:27:22 2014 +0200 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 diff --git a/chart2/Package_opengl.mk b/chart2/Package_opengl.mk index cb8c456..99cdde3 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 0000000..a848103 --- /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 0000000..8d046f5 --- /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 6594c03..9674495 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 acc3bf4..24eb19f 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 0f56b64..f7408d8 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 5584458..e337623 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 ce959f3..730bd1e 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 4489388..8bbd5e7 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(); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits