implement movement from one corner to the next
Change-Id: I6c782f7630c9f77e3e3f28a79e26391e8c97c706
This commit is contained in:
committed by
Markus Mohrhard
parent
c8d07416e3
commit
d051a1a677
@@ -31,12 +31,16 @@ GL3DBarChart::GL3DBarChart(
|
|||||||
mrWindow(rWindow),
|
mrWindow(rWindow),
|
||||||
mpCamera(NULL),
|
mpCamera(NULL),
|
||||||
mbValidContext(true),
|
mbValidContext(true),
|
||||||
mpTextCache(new opengl3D::TextCache())
|
mpTextCache(new opengl3D::TextCache()),
|
||||||
|
mnStep(0),
|
||||||
|
mnStepsTotal(0),
|
||||||
|
mnCornerId(0)
|
||||||
{
|
{
|
||||||
Size aSize = mrWindow.GetSizePixel();
|
Size aSize = mrWindow.GetSizePixel();
|
||||||
mpRenderer->SetSize(aSize);
|
mpRenderer->SetSize(aSize);
|
||||||
mrWindow.setRenderer(this);
|
mrWindow.setRenderer(this);
|
||||||
mpRenderer->init();
|
mpRenderer->init();
|
||||||
|
maTimer.SetTimeoutHdl(LINK(this, GL3DBarChart, MoveCamera));
|
||||||
}
|
}
|
||||||
|
|
||||||
GL3DBarChart::~GL3DBarChart()
|
GL3DBarChart::~GL3DBarChart()
|
||||||
@@ -48,6 +52,7 @@ GL3DBarChart::~GL3DBarChart()
|
|||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
const float TEXT_HEIGHT = 15.0f;
|
const float TEXT_HEIGHT = 15.0f;
|
||||||
|
const sal_uLong TIMEOUT = 5;
|
||||||
|
|
||||||
float calculateTextWidth(const OUString& rText)
|
float calculateTextWidth(const OUString& rText)
|
||||||
{
|
{
|
||||||
@@ -227,6 +232,9 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer
|
|||||||
p->setPosition(aTopLeft, aTopRight, aBottomRight);
|
p->setPosition(aTopLeft, aTopRight, aBottomRight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mnMaxX = nMaxPointCount * (nBarSizeX + nBarDistanceX) + 40;
|
||||||
|
mnMaxY = nSeriesIndex * (nBarSizeY + nBarDistanceY) + 40;
|
||||||
|
|
||||||
maCameraPosition = glm::vec3(-30, -30, 200);
|
maCameraPosition = glm::vec3(-30, -30, 200);
|
||||||
mpCamera->setPosition(maCameraPosition);
|
mpCamera->setPosition(maCameraPosition);
|
||||||
maCameraDirection = glm::vec3(0, 0, 0);
|
maCameraDirection = glm::vec3(0, 0, 0);
|
||||||
@@ -293,12 +301,83 @@ void GL3DBarChart::clickedAt(const Point& rPos)
|
|||||||
void GL3DBarChart::mouseDragMove(const Point& rStartPos, const Point& rEndPos, sal_uInt16 nButtons)
|
void GL3DBarChart::mouseDragMove(const Point& rStartPos, const Point& rEndPos, sal_uInt16 nButtons)
|
||||||
{
|
{
|
||||||
SAL_WARN("chart2.opengl", "Dragging: " << rStartPos << " to : " << rEndPos << " Buttons: " << nButtons);
|
SAL_WARN("chart2.opengl", "Dragging: " << rStartPos << " to : " << rEndPos << " Buttons: " << nButtons);
|
||||||
|
if(nButtons == MOUSE_RIGHT)
|
||||||
|
{
|
||||||
|
mnCornerId = (mnCornerId + 1) % 4;
|
||||||
|
moveToCorner();
|
||||||
|
}
|
||||||
|
else if(nButtons == MOUSE_LEFT)
|
||||||
|
{
|
||||||
|
mnCornerId = mnCornerId - 1;
|
||||||
|
if(mnCornerId < 0)
|
||||||
|
mnCornerId = 3;
|
||||||
|
moveToCorner();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::vec3 GL3DBarChart::getCornerPosition(sal_Int8 nId)
|
||||||
|
{
|
||||||
|
switch(nId)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
return glm::vec3(-30, -30, 200);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
return glm::vec3(mnMaxX, -30, 200);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
return glm::vec3(mnMaxX, mnMaxY, 200);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
return glm::vec3(-30, mnMaxY, 200);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return glm::vec3(-30, -30, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GL3DBarChart::moveToCorner()
|
||||||
|
{
|
||||||
|
mnStepsTotal = 100;
|
||||||
|
maStep = (getCornerPosition(mnCornerId) - maCameraPosition) / float(mnStepsTotal);
|
||||||
|
maTimer.SetTimeout(TIMEOUT);
|
||||||
|
maTimer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPL_LINK_NOARG(GL3DBarChart, MoveCamera)
|
||||||
|
{
|
||||||
|
maTimer.Stop();
|
||||||
|
if(mnStep < mnStepsTotal)
|
||||||
|
{
|
||||||
|
++mnStep;
|
||||||
|
maCameraPosition += maStep;
|
||||||
|
mpCamera->setPosition(maCameraPosition);
|
||||||
|
render();
|
||||||
|
maTimer.SetTimeout(TIMEOUT);
|
||||||
|
maTimer.Start();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mnStep = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GL3DBarChart::scroll(long nDelta)
|
void GL3DBarChart::scroll(long nDelta)
|
||||||
{
|
{
|
||||||
glm::vec3 maDir = glm::normalize(maCameraPosition - maCameraDirection);
|
glm::vec3 maDir = glm::normalize(maCameraPosition - maCameraDirection);
|
||||||
maCameraPosition += (float((nDelta/10)) * maDir);
|
maCameraPosition -= (float((nDelta/10)) * maDir);
|
||||||
mpCamera->setPosition(maCameraPosition);
|
mpCamera->setPosition(maCameraPosition);
|
||||||
render();
|
render();
|
||||||
}
|
}
|
||||||
|
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
|
#include <vcl/timer.hxx>
|
||||||
#include <vcl/openglwin.hxx>
|
#include <vcl/openglwin.hxx>
|
||||||
|
|
||||||
namespace chart {
|
namespace chart {
|
||||||
@@ -55,6 +56,12 @@ public:
|
|||||||
virtual void contextDestroyed() SAL_OVERRIDE;
|
virtual void contextDestroyed() SAL_OVERRIDE;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void moveToCorner();
|
||||||
|
glm::vec3 getCornerPosition(sal_Int8 nCornerId);
|
||||||
|
|
||||||
|
DECL_LINK(MoveCamera, void*);
|
||||||
|
|
||||||
css::uno::Reference<css::chart2::XChartType> mxChartType;
|
css::uno::Reference<css::chart2::XChartType> mxChartType;
|
||||||
boost::ptr_vector<opengl3D::Renderable3DObject> maShapes;
|
boost::ptr_vector<opengl3D::Renderable3DObject> maShapes;
|
||||||
|
|
||||||
@@ -68,6 +75,18 @@ private:
|
|||||||
|
|
||||||
glm::vec3 maCameraPosition;
|
glm::vec3 maCameraPosition;
|
||||||
glm::vec3 maCameraDirection;
|
glm::vec3 maCameraDirection;
|
||||||
|
|
||||||
|
Timer maTimer;
|
||||||
|
glm::vec3 maStep;
|
||||||
|
size_t mnStep;
|
||||||
|
size_t mnStepsTotal;
|
||||||
|
float mnMaxX;
|
||||||
|
float mnMaxY;
|
||||||
|
/**
|
||||||
|
* 0 = corner at (0,0,0);
|
||||||
|
* numbering counter clockwise
|
||||||
|
*/
|
||||||
|
sal_Int8 mnCornerId;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user