summaryrefslogtreecommitdiff
path: root/chart2
diff options
context:
space:
mode:
authorxukai <xukai@multicorewareinc.com>2014-09-22 20:08:26 +0800
committerKohei Yoshida <libreoffice@kohei.us>2014-09-23 15:04:23 +0000
commit32d267f556634d3bbceba4978efc4d8cb62b148c (patch)
treedada897d61e9541ec5cfdb6ffcebacf2d60f20a1 /chart2
parent192b360cfb1bf422f282f4c93e7d0fc0fe83f7db (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')
-rw-r--r--chart2/source/view/charttypes/GL3DBarChart.cxx61
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()