diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-09-12 09:53:52 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-09-12 10:31:27 +0300 |
commit | 7f8966b035c9fd73d2cde04521c92892feefc0f9 (patch) | |
tree | 55fee47c70805ff6bd4df1a8cd7693ea34132b27 /src/datavisualization/engine/q3dcamera.cpp | |
parent | 1262c6562d7264c9fe4caf2f433615348c0f2ef8 (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.cpp | 118 |
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 |