summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/q3dscene.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/q3dscene.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/q3dscene.cpp')
-rw-r--r--src/datavisualization/engine/q3dscene.cpp149
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