diff options
author | Markus Mohrhard <markus.mohrhard@collabora.co.uk> | 2014-05-21 01:49:59 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@collabora.co.uk> | 2014-05-21 01:50:44 +0200 |
commit | 61b2ae31c6642e09b3052599ae22077e8d41eabd (patch) | |
tree | 2878994b90446fb2374cad3b94c75a43ee0d9617 | |
parent | 8c39739a38237df6e8f39f312cf08fadae896ae4 (diff) |
use FBO for the picking
Change-Id: Ibab6daa1f76300d159ccd4cfbca061c8d8c1951f
-rw-r--r-- | chart2/source/view/charttypes/GL3DBarChart.cxx | 6 | ||||
-rw-r--r-- | chart2/source/view/inc/GL3DRenderer.hxx | 6 | ||||
-rw-r--r-- | chart2/source/view/main/GL3DRenderer.cxx | 18 |
3 files changed, 28 insertions, 2 deletions
diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index 165366816639..d36a00869cd8 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -217,14 +217,16 @@ public: } -void GL3DBarChart::clickedAt(const Point& ) +void GL3DBarChart::clickedAt(const Point& rPos) { + sal_uInt32 nId = 1; { PickingModeSetter(mpRenderer.get()); render(); + nId = mpRenderer->GetPixelColorFromPoint(rPos.X(), rPos.Y()); } if (mpCamera) - mpCamera->zoom(1); + mpCamera->zoom(nId); } } diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index 52d341acc840..b08e90e22ae6 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -179,6 +179,8 @@ public: void ProcessUnrenderedShape(); void SetPickingMode(bool bPickingMode); + + sal_uInt32 GetPixelColorFromPoint(long nX, long nY); private: void MoveModelf(PosVecf3& trans,PosVecf3& angle,PosVecf3& scale); @@ -362,6 +364,10 @@ private: bool mbPickingMode; SceneBox m_SenceBox; + + GLuint mnPickingFbo; + GLuint mnPickingRbo; + GLuint mnPickingTexture; }; } diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 92cf61dc93f0..cea7e0fde7fc 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -249,6 +249,8 @@ void OpenGL3DRenderer::init() glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertices), squareVertices, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); + OpenGLHelper::createFramebuffer(m_iWidth, m_iHeight, mnPickingFbo, mnPickingRbo, mnPickingTexture); + CHECK_GL_ERROR(); Init3DUniformBlock(); @@ -1580,6 +1582,22 @@ void OpenGL3DRenderer::MoveModelf(PosVecf3& trans,PosVecf3& angle,PosVecf3& scal void OpenGL3DRenderer::SetPickingMode(bool bPickingMode) { mbPickingMode = bPickingMode; + if(mbPickingMode) + { + glBindFramebuffer(GL_FRAMEBUFFER, mnPickingFbo); + } + else + { + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } +} + +sal_uInt32 OpenGL3DRenderer::GetPixelColorFromPoint(long nX, long nY) +{ + boost::scoped_array<sal_uInt8> buf(new sal_uInt8[4]); + glReadPixels(nX, nY, 1, 1, GL_BGRA, GL_UNSIGNED_BYTE, buf.get()); + Color aColor(buf[3], buf[2], buf[1], buf[0]); + return aColor.GetColor(); } } |