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/q3dscene.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/q3dscene.cpp')
-rw-r--r-- | src/datavisualization/engine/q3dscene.cpp | 149 |
1 files changed, 101 insertions, 48 deletions
diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp index b39daab6..29eb54f4 100644 --- a/src/datavisualization/engine/q3dscene.cpp +++ b/src/datavisualization/engine/q3dscene.cpp @@ -22,8 +22,8 @@ #include "q3dscene.h" #include "q3dscene_p.h" -#include "q3dcamera.h" -#include "q3dlight.h" +#include "q3dcamera_p.h" +#include "q3dlight_p.h" QT_DATAVISUALIZATION_BEGIN_NAMESPACE @@ -31,31 +31,8 @@ Q3DScene::Q3DScene(QObject *parent) : QObject(parent), d_ptr(new Q3DScenePrivate(this)) { -} - -Q3DScene *Q3DScene::clone(QObject *parent) -{ - Q3DScene *cloneScene = new Q3DScene(parent); - cloneScene->setViewport(viewport()); - cloneScene->setMainViewport(mainViewport()); - cloneScene->setSliceViewport(sliceViewport()); - - if (d_ptr->m_camera) { - Q3DCamera *cloneCamera = new Q3DCamera(); - cloneCamera->copyValuesFrom(*d_ptr->m_camera); - cloneScene->setCamera(cloneCamera); - } - - if (d_ptr->m_light) { - Q3DLight *cloneLight = new Q3DLight(); - cloneLight->copyValuesFrom(*d_ptr->m_light); - cloneScene->setLight(cloneLight); - } - - cloneScene->setSlicingActivated(isSlicingActivated()); - cloneScene->setUnderSideCameraEnabled(isUnderSideCameraEnabled()); - - return cloneScene; + setCamera(new Q3DCamera(0)); + setLight(new Q3DLight(0)); } Q3DScene::~Q3DScene() @@ -69,15 +46,22 @@ QRect Q3DScene::viewport() const void Q3DScene::setViewport(const QRect &viewport) { - d_ptr->m_viewport = viewport; - d_ptr->m_viewport.setX(0); - d_ptr->m_viewport.setY(0); + if (d_ptr->m_viewport.width() != viewport.width() + || d_ptr->m_viewport.height() != viewport.height()) { + d_ptr->m_viewport = viewport; + d_ptr->m_viewport.setX(0); + d_ptr->m_viewport.setY(0); + d_ptr->m_changeTracker.viewportChanged = true; + } } void Q3DScene::setViewportSize(int width, int height) { - d_ptr->m_viewport.setWidth(width); - d_ptr->m_viewport.setHeight(height); + if (d_ptr->m_viewport.width() != width || d_ptr->m_viewport.height() != height) { + d_ptr->m_viewport.setWidth(width); + d_ptr->m_viewport.setHeight(height); + d_ptr->m_changeTracker.viewportChanged = true; + } } QRect Q3DScene::mainViewport() const @@ -87,7 +71,10 @@ QRect Q3DScene::mainViewport() const void Q3DScene::setMainViewport(const QRect &mainViewPort) { - d_ptr->m_mainViewport = mainViewPort; + if (d_ptr->m_mainViewport != mainViewPort) { + d_ptr->m_mainViewport = mainViewPort; + d_ptr->m_changeTracker.mainViewportChanged = true; + } } bool Q3DScene::isInputInsideMainView(const QPoint &point) @@ -121,7 +108,10 @@ QRect Q3DScene::sliceViewport() const void Q3DScene::setSliceViewport(const QRect &sliceViewPort) { - d_ptr->m_sliceViewport = sliceViewPort; + if (d_ptr->m_sliceViewport != sliceViewPort) { + d_ptr->m_sliceViewport = sliceViewPort; + d_ptr->m_changeTracker.sliceViewportChanged = true; + } } // TODO: Refactor the current way of building the scene... @@ -134,11 +124,16 @@ Q3DCamera *Q3DScene::camera() const void Q3DScene::setCamera(Q3DCamera *camera) { - if (d_ptr->m_camera) - d_ptr->m_camera->setParentScene(0); + if (camera != d_ptr->m_camera) { + // TODO Do we need to be able to swap cameras? May need similar ownership mechanism like axes + delete d_ptr->m_camera; + + d_ptr->m_camera = camera; + d_ptr->m_camera->setParentScene(this); - d_ptr->m_camera = camera; - d_ptr->m_camera->setParentScene(this); + d_ptr->m_changeTracker.cameraChanged = true; + + } } Q3DLight *Q3DScene::light() const @@ -148,11 +143,15 @@ Q3DLight *Q3DScene::light() const void Q3DScene::setLight(Q3DLight *light) { - if (d_ptr->m_light) - d_ptr->m_light->setParentScene(0); + if (light != d_ptr->m_light) { + // TODO Do we need to be able to swap lights? May need similar ownership mechanism like axes + delete d_ptr->m_light; - d_ptr->m_light = light; - d_ptr->m_light->setParentScene(this); + d_ptr->m_light = light; + d_ptr->m_light->setParentScene(this); + + d_ptr->m_changeTracker.lightChanged = true; + } } bool Q3DScene::isUnderSideCameraEnabled() const @@ -162,7 +161,10 @@ bool Q3DScene::isUnderSideCameraEnabled() const void Q3DScene::setUnderSideCameraEnabled(bool isEnabled) { - d_ptr->m_isUnderSideCameraEnabled = isEnabled; + if (d_ptr->m_isUnderSideCameraEnabled != isEnabled) { + d_ptr->m_isUnderSideCameraEnabled = isEnabled; + d_ptr->m_changeTracker.underSideCameraEnabledChanged = true; + } } bool Q3DScene::isSlicingActivated() const @@ -172,20 +174,26 @@ bool Q3DScene::isSlicingActivated() const void Q3DScene::setSlicingActivated(bool isSlicing) { - if (isSlicing != d_ptr->m_isSlicingActivated) + if (d_ptr->m_isSlicingActivated != isSlicing) { d_ptr->m_isSlicingActivated = isSlicing; + d_ptr->m_changeTracker.slicingActivatedChanged = true; + } } -void Q3DScene::setLightPositionRelativeToCamera(const QVector3D &relativePosition, GLfloat fixedRotation, GLfloat distanceModifier) +void Q3DScene::setLightPositionRelativeToCamera(const QVector3D &relativePosition, + qreal fixedRotation, qreal distanceModifier) { - d_ptr->m_light->setPosition(d_ptr->m_camera->calculatePositionRelativeToCamera(relativePosition, fixedRotation, distanceModifier)); + d_ptr->m_light->setPosition( + d_ptr->m_camera->calculatePositionRelativeToCamera(relativePosition, + fixedRotation, + distanceModifier)); } Q3DScenePrivate::Q3DScenePrivate(Q3DScene *q) : q_ptr(q), - m_camera(0), - m_light(0), + m_camera(), + m_light(), m_isUnderSideCameraEnabled(false), m_isSlicingActivated(false) { @@ -197,4 +205,49 @@ Q3DScenePrivate::~Q3DScenePrivate() delete m_light; } +// Copies changed values from this scene to the other scene. If the other scene had same changes, +// those changes are discarded. +void Q3DScenePrivate::sync(Q3DScenePrivate &other) +{ + if (m_changeTracker.viewportChanged) { + other.q_ptr->setViewport(q_ptr->viewport()); + m_changeTracker.viewportChanged = false; + other.m_changeTracker.viewportChanged = false; + } + if (m_changeTracker.mainViewportChanged) { + other.q_ptr->setMainViewport(q_ptr->mainViewport()); + m_changeTracker.mainViewportChanged = false; + other.m_changeTracker.mainViewportChanged = false; + } + if (m_changeTracker.sliceViewportChanged) { + other.q_ptr->setSliceViewport(q_ptr->sliceViewport()); + m_changeTracker.sliceViewportChanged = false; + other.m_changeTracker.sliceViewportChanged = false; + } + if (m_changeTracker.cameraChanged) { + m_camera->setDirty(true); + m_changeTracker.cameraChanged = false; + other.m_changeTracker.cameraChanged = false; + } + m_camera->d_ptr->sync(*other.m_camera); + + if (m_changeTracker.lightChanged) { + m_light->setDirty(true); + m_changeTracker.lightChanged = false; + other.m_changeTracker.lightChanged = false; + } + m_light->d_ptr->sync(*other.m_light); + + if (m_changeTracker.underSideCameraEnabledChanged) { + other.q_ptr->setUnderSideCameraEnabled(q_ptr->isUnderSideCameraEnabled()); + m_changeTracker.underSideCameraEnabledChanged = false; + other.m_changeTracker.underSideCameraEnabledChanged = false; + } + if (m_changeTracker.slicingActivatedChanged) { + other.q_ptr->setSlicingActivated(q_ptr->isSlicingActivated()); + m_changeTracker.slicingActivatedChanged = false; + other.m_changeTracker.slicingActivatedChanged = false; + } +} + QT_DATAVISUALIZATION_END_NAMESPACE |