Kaydet (Commit) d06ce014 authored tarafından Markus Mohrhard's avatar Markus Mohrhard Kaydeden (comit) Markus Mohrhard

add initial work on zoom into the bar movement

Change-Id: Idc8c1f27dbeafdf34706f09c890f202849c2ce33
üst 22e1895a
......@@ -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);
......
......@@ -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;
......
......@@ -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;
};
}
......
......@@ -209,11 +209,6 @@ void Camera::setDirection(const glm::vec3& rDir)
maDirection = rDir;
}
void Camera::zoom(sal_uInt32 /*nId*/)
{
// TODO here
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment