summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/q3dcamera.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-09-12 09:53:52 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-09-12 10:31:27 +0300
commit7f8966b035c9fd73d2cde04521c92892feefc0f9 (patch)
tree55fee47c70805ff6bd4df1a8cd7693ea34132b27 /src/datavisualization/engine/q3dcamera.cpp
parent1262c6562d7264c9fe4caf2f433615348c0f2ef8 (diff)
Fix Q3DScene caching
Task-number: QTRD-2258 Change-Id: Ifce23dca40566e75398e00975e8b2159b325739e Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com> Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
Diffstat (limited to 'src/datavisualization/engine/q3dcamera.cpp')
-rw-r--r--src/datavisualization/engine/q3dcamera.cpp118
1 files changed, 76 insertions, 42 deletions
diff --git a/src/datavisualization/engine/q3dcamera.cpp b/src/datavisualization/engine/q3dcamera.cpp
index 906cd466..4b1ca81f 100644
--- a/src/datavisualization/engine/q3dcamera.cpp
+++ b/src/datavisualization/engine/q3dcamera.cpp
@@ -63,17 +63,25 @@ void Q3DCamera::copyValuesFrom(const Q3DCamera &source)
void Q3DCamera::setRotations(const QPointF &rotation)
{
- setRotationsPrivate(rotation);
- d_ptr->m_activePreset = QDataVis::NoPreset;
+ d_ptr->setRotations(rotation);
+ if (d_ptr->m_activePreset != QDataVis::NoPreset) {
+ d_ptr->m_activePreset = QDataVis::NoPreset;
+ setDirty(true);
+ }
}
void Q3DCamera::setDefaultOrientation(const QVector3D &defaultPosition,
const QVector3D &defaultTarget,
const QVector3D &defaultUp)
{
- Q3DObject::setPosition(defaultPosition);
- d_ptr->m_target = defaultTarget;
- d_ptr->m_up = defaultUp;
+ if (position() != defaultPosition
+ || d_ptr->m_target != defaultTarget
+ || d_ptr->m_up != defaultUp) {
+ setPosition(defaultPosition);
+ d_ptr->m_target = defaultTarget;
+ d_ptr->m_up = defaultUp;
+ setDirty(true);
+ }
}
QPointF Q3DCamera::rotations() const
@@ -84,7 +92,10 @@ QPointF Q3DCamera::rotations() const
void Q3DCamera::setViewMatrix(const QMatrix4x4 &viewMatrix)
{
- d_ptr->m_viewMatrix = viewMatrix;
+ if (d_ptr->m_viewMatrix != viewMatrix) {
+ d_ptr->m_viewMatrix = viewMatrix;
+ setDirty(true);
+ }
}
QMatrix4x4 Q3DCamera::viewMatrix() const
@@ -92,7 +103,7 @@ QMatrix4x4 Q3DCamera::viewMatrix() const
return d_ptr->m_viewMatrix;
}
-void Q3DCamera::updateViewMatrix(GLfloat zoomAdjustment)
+void Q3DCamera::updateViewMatrix(qreal zoomAdjustment)
{
bool showUnder = parentScene()->isUnderSideCameraEnabled();
int zoom = zoomLevel() * zoomAdjustment;
@@ -136,99 +147,99 @@ void Q3DCamera::setCameraPreset(QDataVis::CameraPreset preset)
{
switch (preset) {
case QDataVis::PresetFrontLow: {
- Q3DCamera::setRotationsPrivate(QPointF(0.0f, 0.0f));
+ d_ptr->setRotations(QPointF(0.0f, 0.0f));
break;
}
case QDataVis::PresetFront: {
- Q3DCamera::setRotationsPrivate(QPointF(0.0f, 22.5f));
+ d_ptr->setRotations(QPointF(0.0f, 22.5f));
break;
}
case QDataVis::PresetFrontHigh: {
- Q3DCamera::setRotationsPrivate(QPointF(0.0f, 45.0f));
+ d_ptr->setRotations(QPointF(0.0f, 45.0f));
break;
}
case QDataVis::PresetLeftLow: {
- Q3DCamera::setRotationsPrivate(QPointF(90.0f, 0.0f));
+ d_ptr->setRotations(QPointF(90.0f, 0.0f));
break;
}
case QDataVis::PresetLeft: {
- Q3DCamera::setRotationsPrivate(QPointF(90.0f, 22.5f));
+ d_ptr->setRotations(QPointF(90.0f, 22.5f));
break;
}
case QDataVis::PresetLeftHigh: {
- Q3DCamera::setRotationsPrivate(QPointF(90.0f, 45.0f));
+ d_ptr->setRotations(QPointF(90.0f, 45.0f));
break;
}
case QDataVis::PresetRightLow: {
- Q3DCamera::setRotationsPrivate(QPointF(-90.0f, 0.0f));
+ d_ptr->setRotations(QPointF(-90.0f, 0.0f));
break;
}
case QDataVis::PresetRight: {
- Q3DCamera::setRotationsPrivate(QPointF(-90.0f, 22.5f));
+ d_ptr->setRotations(QPointF(-90.0f, 22.5f));
break;
}
case QDataVis::PresetRightHigh: {
- Q3DCamera::setRotationsPrivate(QPointF(-90.0f, 45.0f));
+ d_ptr->setRotations(QPointF(-90.0f, 45.0f));
break;
}
case QDataVis::PresetBehindLow: {
- Q3DCamera::setRotationsPrivate(QPointF(180.0f, 0.0f));
+ d_ptr->setRotations(QPointF(180.0f, 0.0f));
break;
}
case QDataVis::PresetBehind: {
- Q3DCamera::setRotationsPrivate(QPointF(180.0f, 22.5f));
+ d_ptr->setRotations(QPointF(180.0f, 22.5f));
break;
}
case QDataVis::PresetBehindHigh: {
- Q3DCamera::setRotationsPrivate(QPointF(180.0f, 45.0f));
+ d_ptr->setRotations(QPointF(180.0f, 45.0f));
break;
}
case QDataVis::PresetIsometricLeft: {
- Q3DCamera::setRotationsPrivate(QPointF(45.0f, 22.5f));
+ d_ptr->setRotations(QPointF(45.0f, 22.5f));
break;
}
case QDataVis::PresetIsometricLeftHigh: {
- Q3DCamera::setRotationsPrivate(QPointF(45.0f, 45.0f));
+ d_ptr->setRotations(QPointF(45.0f, 45.0f));
break;
}
case QDataVis::PresetIsometricRight: {
- Q3DCamera::setRotationsPrivate(QPointF(-45.0f, 22.5f));
+ d_ptr->setRotations(QPointF(-45.0f, 22.5f));
break;
}
case QDataVis::PresetIsometricRightHigh: {
- Q3DCamera::setRotationsPrivate(QPointF(-45.0f, 45.0f));
+ d_ptr->setRotations(QPointF(-45.0f, 45.0f));
break;
}
case QDataVis::PresetDirectlyAbove: {
- Q3DCamera::setRotationsPrivate(QPointF(0.0f, 90.0f));
+ d_ptr->setRotations(QPointF(0.0f, 90.0f));
break;
}
case QDataVis::PresetDirectlyAboveCW45: {
- Q3DCamera::setRotationsPrivate(QPointF(-45.0f, 90.0f));
+ d_ptr->setRotations(QPointF(-45.0f, 90.0f));
break;
}
case QDataVis::PresetDirectlyAboveCCW45: {
- Q3DCamera::setRotationsPrivate(QPointF(45.0f, 90.0f));
+ d_ptr->setRotations(QPointF(45.0f, 90.0f));
break;
}
case QDataVis::PresetFrontBelow: {
- Q3DCamera::setRotationsPrivate(QPointF(0.0f, -45.0f));
+ d_ptr->setRotations(QPointF(0.0f, -45.0f));
break;
}
case QDataVis::PresetLeftBelow: {
- Q3DCamera::setRotationsPrivate(QPointF(90.0f, -45.0f));
+ d_ptr->setRotations(QPointF(90.0f, -45.0f));
break;
}
case QDataVis::PresetRightBelow: {
- Q3DCamera::setRotationsPrivate(QPointF(-90.0f, -45.0f));
+ d_ptr->setRotations(QPointF(-90.0f, -45.0f));
break;
}
case QDataVis::PresetBehindBelow: {
- Q3DCamera::setRotationsPrivate(QPointF(180.0f, -45.0f));
+ d_ptr->setRotations(QPointF(180.0f, -45.0f));
break;
}
case QDataVis::PresetDirectlyBelow: {
- Q3DCamera::setRotationsPrivate(QPointF(0.0f, -90.0f));
+ d_ptr->setRotations(QPointF(0.0f, -90.0f));
break;
}
default:
@@ -236,18 +247,18 @@ void Q3DCamera::setCameraPreset(QDataVis::CameraPreset preset)
break;
}
- d_ptr->m_activePreset = preset;
-}
-
-void Q3DCamera::setRotationsPrivate(const QPointF &rotation)
-{
- d_ptr->m_xRotation = rotation.x();
- d_ptr->m_yRotation = rotation.y();
+ if (d_ptr->m_activePreset != preset) {
+ d_ptr->m_activePreset = preset;
+ setDirty(true);
+ }
}
void Q3DCamera::setZoomLevel(int zoomLevel)
{
- d_ptr->m_zoomLevel = zoomLevel;
+ if (d_ptr->m_zoomLevel != zoomLevel) {
+ d_ptr->m_zoomLevel = zoomLevel;
+ setDirty(true);
+ }
}
int Q3DCamera::zoomLevel()
@@ -256,8 +267,8 @@ int Q3DCamera::zoomLevel()
}
QVector3D Q3DCamera::calculatePositionRelativeToCamera(const QVector3D &relativePosition,
- GLfloat fixedRotation,
- GLfloat distanceModifier) const
+ qreal fixedRotation,
+ qreal distanceModifier) const
{
// Move the position with camera
GLfloat radiusFactor = relativePosition.z() * (1.5f + distanceModifier);
@@ -283,7 +294,10 @@ QVector3D Q3DCamera::calculatePositionRelativeToCamera(const QVector3D &relative
Q3DCameraPrivate::Q3DCameraPrivate(Q3DCamera *q) :
q_ptr(q),
- m_zoomLevel(100)
+ m_xRotation(0.0f),
+ m_yRotation(0.0f),
+ m_zoomLevel(100),
+ m_activePreset(QDataVis::NoPreset)
{
}
@@ -292,4 +306,24 @@ Q3DCameraPrivate::~Q3DCameraPrivate()
{
}
+// Copies changed values from this camera to the other camera. If the other camera had same changes,
+// those changes are discarded.
+void Q3DCameraPrivate::sync(Q3DCamera &other)
+{
+ if (q_ptr->isDirty()) {
+ other.copyValuesFrom(*q_ptr);
+ q_ptr->setDirty(false);
+ other.setDirty(false);
+ }
+}
+
+void Q3DCameraPrivate::setRotations(const QPointF &rotation)
+{
+ if (m_xRotation != rotation.x() || m_yRotation != rotation.y()) {
+ m_xRotation = rotation.x();
+ m_yRotation = rotation.y();
+ q_ptr->setDirty(true);
+ }
+}
+
QT_DATAVISUALIZATION_END_NAMESPACE