diff options
author | xukai <xukai@multicorewareinc.com> | 2014-09-22 20:08:26 +0800 |
---|---|---|
committer | Kohei Yoshida <libreoffice@kohei.us> | 2014-09-23 15:04:23 +0000 |
commit | 32d267f556634d3bbceba4978efc4d8cb62b148c (patch) | |
tree | dada897d61e9541ec5cfdb6ffcebacf2d60f20a1 /chart2/source | |
parent | 192b360cfb1bf422f282f4c93e7d0fc0fe83f7db (diff) |
make Camera flythrough looks more smooth
Change-Id: I46f79bb6ede2da133fe8971319fc4b7257848382
Reviewed-on: https://gerrit.libreoffice.org/11590
Reviewed-by: Kohei Yoshida <libreoffice@kohei.us>
Tested-by: Kohei Yoshida <libreoffice@kohei.us>
Diffstat (limited to 'chart2/source')
-rw-r--r-- | chart2/source/view/charttypes/GL3DBarChart.cxx | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx index 3474de32daea..d07653fe4c8c 100644 --- a/chart2/source/view/charttypes/GL3DBarChart.cxx +++ b/chart2/source/view/charttypes/GL3DBarChart.cxx @@ -209,6 +209,7 @@ protected: private: void ProcessMouseEvent(); void MoveCamera(); + void MoveCameraToBar(); void MoveToBar(); void MoveToDefault(); void MoveToCorner(); @@ -224,11 +225,14 @@ private: bool mbNeedFlyBack; glm::vec3 maStep; glm::vec3 maStepDirection; + glm::mat4 maMatrixStep; size_t mnStep; size_t mnStepsTotal; TimeValue maClickFlyBackStartTime; TimeValue maClickFlyBackEndTime; OUString maFPS; + glm::vec3 maTargetPosition; + glm::vec3 maTargetDirection; }; void RenderBenchMarkThread::MoveCamera() @@ -246,21 +250,36 @@ void RenderBenchMarkThread::MoveCamera() mnStep = 0; mbExecuting = false; mbAutoFlyExecuting = false; - if ((mpChart->maRenderEvent == EVENT_CLICK) || (mpChart->maRenderEvent == EVENT_AUTO_FLY)) - { - mbNeedFlyBack = true; - osl_getSystemTime(&maClickFlyBackStartTime); - osl_getSystemTime(&maClickFlyBackEndTime); - mpChart->maRenderEvent = EVENT_SHOW_SELECT; - } - else - { - mbNeedFlyBack = false; - mpChart->maRenderEvent = EVENT_NONE; - } + mbNeedFlyBack = false; + mpChart->maRenderEvent = EVENT_NONE; + } +} + +void RenderBenchMarkThread::MoveCameraToBar() +{ + if(mnStep < mnStepsTotal) + { + ++mnStep; + mpChart->mpRenderer->AddMatrixDiff(maMatrixStep); + } + else + { + mpChart->maCameraPosition = maTargetPosition; + mpChart->maCameraDirection = maTargetDirection; + mpChart->mpCamera->setPosition(maTargetPosition); + mpChart->mpCamera->setDirection(maTargetDirection); + mpChart->mpRenderer->ResetMatrixDiff(); + mnStep = 0; + mbExecuting = false; + mbAutoFlyExecuting = false; + mbNeedFlyBack = true; + osl_getSystemTime(&maClickFlyBackStartTime); + osl_getSystemTime(&maClickFlyBackEndTime); + mpChart->maRenderEvent = EVENT_SHOW_SELECT; } } + void RenderBenchMarkThread::MoveToDefault() { if ((mpChart->maCameraPosition == mpChart->maDefaultCameraDirection) && @@ -301,21 +320,20 @@ void RenderBenchMarkThread::MoveToBar() const GL3DBarChart::BarInformation& rBarInfo = itr->second; mnStep = 0; mnStepsTotal = STEPS; - glm::vec3 maTargetPosition = rBarInfo.maPos; + maTargetPosition = rBarInfo.maPos; maTargetPosition.z += 240; maTargetPosition.x += BAR_SIZE_X / 2.0f; - glm::vec3 maTargetDirection = rBarInfo.maPos; + maTargetDirection = rBarInfo.maPos; maTargetDirection.x += BAR_SIZE_X / 2.0f; maTargetDirection.y += BAR_SIZE_Y / 2.0f; maTargetPosition.y = maTargetDirection.y - 240; - maStep = (maTargetPosition - mpChart->maCameraPosition)/((float)mnStepsTotal); - maStepDirection = (maTargetDirection - mpChart->maCameraDirection)/((float)mnStepsTotal); + maMatrixStep = mpChart->mpRenderer->GetDiffOfTwoCameras(mpChart->maCameraPosition, maTargetPosition, mpChart->maCameraDirection, maTargetDirection)/((float)mnStepsTotal); mpChart->maClickCond.set(); mbExecuting = true; mbNeedFlyBack = false; mpChart->mpRenderer->StartClick(mpChart->mnSelectBarId); } - MoveCamera(); + MoveCameraToBar(); } void RenderBenchMarkThread::AutoMoveToBar() @@ -332,20 +350,19 @@ void RenderBenchMarkThread::AutoMoveToBar() const GL3DBarChart::BarInformation& rBarInfo = itr->second; mnStep = 0; mnStepsTotal = STEPS; - glm::vec3 maTargetPosition = rBarInfo.maPos; + maTargetPosition = rBarInfo.maPos; maTargetPosition.z += 240; maTargetPosition.x += BAR_SIZE_X / 2.0f; - glm::vec3 maTargetDirection = rBarInfo.maPos; + maTargetDirection = rBarInfo.maPos; maTargetDirection.x += BAR_SIZE_X / 2.0f; maTargetDirection.y += BAR_SIZE_Y / 2.0f; maTargetPosition.y = maTargetDirection.y - 240; - maStep = (maTargetPosition - mpChart->maCameraPosition)/((float)mnStepsTotal); - maStepDirection = (maTargetDirection - mpChart->maCameraDirection)/((float)mnStepsTotal); + maMatrixStep = mpChart->mpRenderer->GetDiffOfTwoCameras(mpChart->maCameraPosition, maTargetPosition, mpChart->maCameraDirection, maTargetDirection)/((float)mnStepsTotal); mpChart->mpRenderer->StartClick(mpChart->mnSelectBarId); mbAutoFlyExecuting = true; mbNeedFlyBack = false; } - MoveCamera(); + MoveCameraToBar(); } void RenderBenchMarkThread::MoveToCorner() |