diff options
author | weigao <weigao@multicorewareinc.com> | 2014-08-19 19:24:06 +0800 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@collabora.co.uk> | 2014-08-20 13:01:53 +0200 |
commit | 8434a2b6aaff9a1a9ce10d9eb9489ebf2929f724 (patch) | |
tree | cc470012fa33c79a1b00ffc7864ce05a59cc89fa /chart2 | |
parent | 0ce1267ae27c840a417ee1758aa016da033405fa (diff) |
add auto fly code
Change-Id: Id137892b855b4a70625335ede8015dfe6dce1e7e
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/source/view/charttypes/GL3DBarChart.cxx | 96 | ||||
-rw-r--r-- | chart2/source/view/inc/GL3DBarChart.hxx | 5 |
2 files changed, 95 insertions, 6 deletions
diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index 8f9d8ecc0376..be8a5614bcaf 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -33,6 +33,7 @@ #define HISTORY_NUM 5 #define SHOW_VALUE_COUNT 15 #define SHOW_SCROLL_TEXT_DISTANCE 1000 +#define FLY_THRESHOLD 20 using namespace com::sun::star; @@ -192,6 +193,7 @@ public: , mbNeedFlyBack(false) , mnStep(0) , mnStepsTotal(0) + , mbAutoFlyExecuting(0) { osl_getSystemTime(&maClickFlyBackStartTime); osl_getSystemTime(&maClickFlyBackEndTime); @@ -207,9 +209,11 @@ private: void ProcessScroll(); void UpdateScreenText(); void ProcessClickFlyBack(); + void AutoMoveToBar(); private: glm::vec3 maStartPos; glm::vec3 maEndPos; + bool mbAutoFlyExecuting; bool mbExecuting; bool mbNeedFlyBack; glm::vec3 maStep; @@ -235,7 +239,8 @@ void RenderBenchMarkThread::MoveCamera() { mnStep = 0; mbExecuting = false; - if (mpChart->maRenderEvent == EVENT_CLICK) + mbAutoFlyExecuting = false; + if ((mpChart->maRenderEvent == EVENT_CLICK) || (mpChart->maRenderEvent == EVENT_AUTO_FLY)) { mpChart->mpRenderer->EndClick(); mbNeedFlyBack = true; @@ -260,6 +265,8 @@ void RenderBenchMarkThread::MoveToDefault() } if (!mbExecuting) { + mpChart->mpRenderer->EndClick(); + mnStep = 0; mnStepsTotal = STEPS; maStep = (mpChart->maDefaultCameraPosition - mpChart->maCameraPosition)/((float)mnStepsTotal); maStepDirection = (mpChart->maDefaultCameraDirection - mpChart->maCameraDirection)/((float)mnStepsTotal); @@ -272,6 +279,7 @@ void RenderBenchMarkThread::MoveToBar() { if (!mbExecuting) { + mpChart->mpRenderer->EndClick(); mpChart->mpRenderer->SetPickingMode(true); mpChart->mpCamera->render(); mpChart->mpRenderer->ProcessUnrenderedShape(mpChart->mbNeedsNewRender); @@ -285,6 +293,7 @@ void RenderBenchMarkThread::MoveToBar() return; } const GL3DBarChart::BarInformation& rBarInfo = itr->second; + mnStep = 0; mnStepsTotal = STEPS; glm::vec3 maTargetPosition = rBarInfo.maPos; maTargetPosition.z += 240; @@ -301,10 +310,40 @@ void RenderBenchMarkThread::MoveToBar() MoveCamera(); } +void RenderBenchMarkThread::AutoMoveToBar() +{ + if (!mbAutoFlyExecuting) + { + mpChart->mpRenderer->EndClick(); + std::map<sal_uInt32, const GL3DBarChart::BarInformation>::const_iterator itr = mpChart->maBarMap.find(mpChart->mnAutoFlyBarID); + if(itr == mpChart->maBarMap.end()) + { + mpChart->maRenderEvent = EVENT_NONE; + return; + } + const GL3DBarChart::BarInformation& rBarInfo = itr->second; + mnStep = 0; + mnStepsTotal = STEPS; + glm::vec3 maTargetPosition = rBarInfo.maPos; + maTargetPosition.z += 240; + maTargetPosition.x += BAR_SIZE_X / 2.0f; + maStep = (maTargetPosition - mpChart->maCameraPosition)/((float)mnStepsTotal); + glm::vec3 maTargetDirection = rBarInfo.maPos; + maTargetDirection.x += BAR_SIZE_X / 2.0f; + maTargetDirection.y += BAR_SIZE_Y / 2.0f; + maStepDirection = (maTargetDirection - mpChart->maCameraDirection)/((float)mnStepsTotal); + mpChart->mpRenderer->StartClick(mpChart->mnAutoFlyBarID); + mbAutoFlyExecuting = true; + } + MoveCamera(); +} + void RenderBenchMarkThread::MoveToCorner() { if (!mbExecuting) { + mpChart->mpRenderer->EndClick(); + mnStep = 0; mnStepsTotal = STEPS; maStep = (mpChart->getCornerPosition(mpChart->mnCornerId) - mpChart->maCameraPosition) / float(mnStepsTotal); maStepDirection = (glm::vec3(mpChart->mnMaxX/2.0f, mpChart->mnMaxY/2.0f, 0) - mpChart->maCameraDirection)/ float(mnStepsTotal); @@ -350,6 +389,11 @@ void RenderBenchMarkThread::ProcessMouseEvent() { ProcessScroll(); } + else if (mpChart->maRenderEvent == EVENT_AUTO_FLY) + { + AutoMoveToBar(); + } + } void RenderBenchMarkThread::UpdateScreenText() @@ -414,7 +458,9 @@ GL3DBarChart::GL3DBarChart( maFPS(OUString("Render FPS: 0")), maDataUpdateFPS(OUString("Data Update FPS: 0")), miFrameCount(0), - miDataUpdateCounter(0) + miDataUpdateCounter(0), + mnColorRate(0), + mnAutoFlyBarID(0) { if (BENCH_MARK_MODE) { @@ -487,6 +533,11 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer maSeriesNames.reserve(rDataSeriesContainer.size()); maBarMap.clear(); maShapes.clear(); + if (BENCH_MARK_MODE) + { + mnColorRate = 0; + mnAutoFlyBarID = 0; + } maShapes.push_back(new opengl3D::Camera(mpRenderer.get())); mpCamera = static_cast<opengl3D::Camera*>(&maShapes.back()); @@ -548,6 +599,18 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer BarInformation(glm::vec3(nXPos, nYPos, float(nVal/nMaxVal)), nVal, nIndex, nSeriesIndex))); recordBarHistory(nId, nVal); + if (BENCH_MARK_MODE) + { + std::map<sal_uInt32, sal_uInt32>::const_iterator itr = maBarColorMap.find(nId); + if (itr == maBarColorMap.end()) + { + maBarColorMap[nId] = nColor; + } + else + { + processAutoFly(nId, nColor); + } + } maShapes.push_back(new opengl3D::Bar(mpRenderer.get(), aBarPosition, nColor, nId)); nId += ID_STEP; } @@ -719,7 +782,7 @@ void GL3DBarChart::moveToDefault() if(BENCH_MARK_MODE) { // add correct handling here!! - if ((maRenderEvent != EVENT_NONE) && (maRenderEvent != EVENT_SHOW_SCROLL)) + if ((maRenderEvent != EVENT_NONE) && (maRenderEvent != EVENT_SHOW_SCROLL) && (maRenderEvent != EVENT_AUTO_FLY)) return; { @@ -760,7 +823,7 @@ void GL3DBarChart::clickedAt(const Point& rPos, sal_uInt16 nButtons) if (BENCH_MARK_MODE) { // add correct handling here !! - if ((maRenderEvent != EVENT_NONE) && (maRenderEvent != EVENT_SHOW_SCROLL)) + if ((maRenderEvent != EVENT_NONE) && (maRenderEvent != EVENT_SHOW_SCROLL) && (maRenderEvent != EVENT_AUTO_FLY)) return; { @@ -831,7 +894,7 @@ void GL3DBarChart::mouseDragMove(const Point& rStartPos, const Point& rEndPos, s { long nDirection = rEndPos.X() - rStartPos.X(); osl::MutexGuard aGuard(maMutex); - if ((maRenderEvent == EVENT_NONE) || (maRenderEvent == EVENT_SHOW_SCROLL)) + if ((maRenderEvent == EVENT_NONE) || (maRenderEvent == EVENT_SHOW_SCROLL) || (maRenderEvent == EVENT_AUTO_FLY)) maRenderEvent = nDirection > 0 ? EVENT_DRAG_RIGHT : EVENT_DRAG_LEFT; if(nDirection < 0) { @@ -906,7 +969,7 @@ void GL3DBarChart::scroll(long nDelta) { { osl::MutexGuard aGuard(maMutex); - if ((maRenderEvent != EVENT_NONE) && (maRenderEvent != EVENT_SHOW_SCROLL)) + if ((maRenderEvent != EVENT_NONE) && (maRenderEvent != EVENT_SHOW_SCROLL) && (maRenderEvent != EVENT_AUTO_FLY)) return; glm::vec3 maDir = glm::normalize(maCameraPosition - maCameraDirection); maCameraPosition -= (float((nDelta/10)) * maDir); @@ -1171,6 +1234,27 @@ void GL3DBarChart::updateScroll() } } +void GL3DBarChart::processAutoFly(sal_uInt32 nId, sal_uInt32 nColor) +{ + //record the color + sal_uInt32 nPreColor = maBarColorMap[nId]; + maBarColorMap[nId] = nColor; + //if has manul event, just record the color and process manul event first + if ((maRenderEvent != EVENT_NONE) && (maRenderEvent != EVENT_AUTO_FLY)) + { + return; + } + //calc the percentage of color change + int nColorRate = (nColor - nPreColor) * 100 / nPreColor; + nColorRate = abs(nColorRate); + if (nColorRate >= FLY_THRESHOLD) + { + maRenderEvent = EVENT_AUTO_FLY; + mnAutoFlyBarID = nColorRate > mnColorRate ? nId : mnAutoFlyBarID; + mnColorRate = nColorRate > mnColorRate ? nColorRate : mnColorRate; + } +} + IMPL_LINK_NOARG(GL3DBarChart, updateTimer) { maTimer.Stop(); diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx index 4e9f7caf64c3..2560d586ffdf 100644 --- a/chart2/source/view/inc/GL3DBarChart.hxx +++ b/chart2/source/view/inc/GL3DBarChart.hxx @@ -47,6 +47,7 @@ enum RenderEventType EVENT_DRAG_RIGHT, EVENT_SCROLL, EVENT_SHOW_SCROLL, + EVENT_AUTO_FLY, EVENT_DIE }; @@ -100,6 +101,7 @@ private: void swapVector(int i, int j, std::vector<sal_uInt32> &vectorNearest); void getNearestBars(std::vector<sal_uInt32> &vectorNearest); void updateScroll(); + void processAutoFly(sal_uInt32 nId, sal_uInt32 nColor); css::uno::Reference<css::chart2::XChartType> mxChartType; boost::ptr_vector<opengl3D::Renderable3DObject> maShapes; @@ -167,6 +169,9 @@ private: std::map<sal_uInt32, std::list<float> > maBarHistory; std::vector<sal_uInt32> maVectorNearest; std::map<sal_uInt32, float> maDistanceMap; + std::map<sal_uInt32, sal_uInt32> maBarColorMap; + int mnColorRate; + sal_uInt32 mnAutoFlyBarID; }; } |