forked from rogii-com/SceneSample
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLogTrackSceneCameraManipulator.cpp
103 lines (74 loc) · 3.22 KB
/
LogTrackSceneCameraManipulator.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "LogTrackSceneCameraManipulator.hpp"
namespace rogii
{
namespace qt_quick
{
const double gZoomFactor(0.01);
const double gDefaultMinimalScalePower(-23.5);
const double gDefaultMaximalScalePower(10);
template<typename T>
T clamp(T start, T end, T value)
{
return std::max(start, std::min(end, value));
}
LogTrackSceneCameraManipulator::LogTrackSceneCameraManipulator(SceneCamera & camera)
: mCamera(camera)
, mManipulatorTool(camera)
{
}
void LogTrackSceneCameraManipulator::zoom(int zoomSteps)
{
const QSizeF & viewportSize(mCamera.getViewportSize());
const QPoint center(viewportSize.width() / 2.0, viewportSize.height() / 2.0);
zoom(zoomSteps, center);
}
void LogTrackSceneCameraManipulator::zoom(int zoomSteps, QPoint pivotPoint)
{
SceneArea sceneArea(mManipulatorTool.getSceneArea());
const QPointF pivotPointOnSceneBeforeZoom(mManipulatorTool.mapToScene(pivotPoint, sceneArea));
const double powerDelta(zoomSteps * gZoomFactor);
const double powerY(std::log2(std::abs(mCamera.getViewportSize().height()
/ sceneArea.getHeight())));
const double newPowerY(clamp(gDefaultMinimalScalePower, gDefaultMaximalScalePower, powerY + powerDelta));
const double scaleY(std::pow(2, -(newPowerY - powerY)));
sceneArea.setHeight(sceneArea.getHeight() * scaleY);
const QPointF pivotPointOnSceneAfterZoom(mManipulatorTool.mapToScene(pivotPoint, sceneArea));
sceneArea.translate(pivotPointOnSceneBeforeZoom - pivotPointOnSceneAfterZoom);
mManipulatorTool.showSceneArea(sceneArea);
}
void LogTrackSceneCameraManipulator::showArea(const QRect & windowAreaToZoom)
{
const QSizeF & viewportSize(mCamera.getViewportSize());
const double minimalSceneAreaHeigth(viewportSize.height() / std::pow(2, gDefaultMaximalScalePower));
const double requiredSceneAreaHeight((mManipulatorTool.mapToScene(QPoint(0, windowAreaToZoom.height()))
- mManipulatorTool.mapToScene(QPoint(0, 0))).y());
const double newSceneAreaHeight(std::min(minimalSceneAreaHeigth,
requiredSceneAreaHeight));
SceneArea newSceneArea(mManipulatorTool.mapToScene(windowAreaToZoom.center()),
QSizeF(2.0, newSceneAreaHeight));
mManipulatorTool.showSceneArea(newSceneArea);
}
void LogTrackSceneCameraManipulator::shift(int dx, int dy)
{
/** TODO: check limits. Maybe this has to be done inmManipulatorTool.showSceneArea(sceneArea);
*/
SceneArea sceneArea(mManipulatorTool.getSceneArea());
const QPointF deltaInScene(
mManipulatorTool.mapToScene(QPoint(0, 0), sceneArea)
- mManipulatorTool.mapToScene(QPoint(dx, dy), sceneArea));
sceneArea.translate(deltaInScene);
mManipulatorTool.showSceneArea(sceneArea);
}
void LogTrackSceneCameraManipulator::showSceneArea(const QRectF & area)
{
/** TODO: check limits. Maybe this has to be done inmManipulatorTool.showSceneArea(sceneArea);
*/
SceneArea sceneArea(area);
{
sceneArea.setCenter(0.0, sceneArea.getCenterY());
sceneArea.setWidth(2.0);
}
mManipulatorTool.showSceneArea(sceneArea);
}
} //~namespace qt_quick
} //~namespace rogii