summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@collabora.co.uk>2014-05-21 01:49:59 +0200
committerMarkus Mohrhard <markus.mohrhard@collabora.co.uk>2014-05-21 01:50:44 +0200
commit61b2ae31c6642e09b3052599ae22077e8d41eabd (patch)
tree2878994b90446fb2374cad3b94c75a43ee0d9617
parent8c39739a38237df6e8f39f312cf08fadae896ae4 (diff)
use FBO for the picking
Change-Id: Ibab6daa1f76300d159ccd4cfbca061c8d8c1951f
-rw-r--r--chart2/source/view/charttypes/GL3DBarChart.cxx6
-rw-r--r--chart2/source/view/inc/GL3DRenderer.hxx6
-rw-r--r--chart2/source/view/main/GL3DRenderer.cxx18
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();
}
}