summaryrefslogtreecommitdiffstats
path: root/src/datavisualization
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavisualization')
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc21
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp30
-rw-r--r--src/datavisualization/engine/abstract3dcontroller_p.h15
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp9
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h2
-rw-r--r--src/datavisualization/engine/qabstract3dgraph.cpp34
-rw-r--r--src/datavisualization/engine/qabstract3dgraph.h5
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp41
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp25
9 files changed, 141 insertions, 41 deletions
diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc
index cae9a406..c83beb74 100644
--- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc
+++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc
@@ -315,10 +315,27 @@
* \qmlproperty real AbstractGraph3D::aspectRatio
* \since QtDataVisualization 1.1
*
- * Aspect ratio of the graph data. This is the ratio of data scaling between horizontal and
- * vertical axes. Defaults to \c{2.0}.
+ * The aspect ratio is the ratio of the graph scaling between the longest axis on the horizontal
+ * plane and the Y-axis. Defaults to \c{2.0}.
*
* \note Has no effect on Bars3D.
+ *
+ * \sa horizontalAspectRatio
+ */
+
+/*!
+ * \qmlproperty real AbstractGraph3D::horizontalAspectRatio
+ * \since QtDataVisualization 1.2
+ *
+ * The horizontal aspect ratio is the ratio of the graph scaling between the X and Z axes.
+ * Value of 0.0 indicates automatic scaling according to axis ranges.
+ * Defaults to \c{0.0}.
+ *
+ * \note Has no effect on Bars3D, which handles scaling on the horizontal plane via
+ * \l{Bars3D::barThickness}{barThickness} and \l{Bars3D::barSpacing}{barSpacing} properties.
+ * Polar graphs also ignore this property.
+ *
+ * \sa aspectRatio, polar, Bars3D::barThickness, Bars3D::barSpacing
*/
/*!
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp
index 6b090fcd..1b497490 100644
--- a/src/datavisualization/engine/abstract3dcontroller.cpp
+++ b/src/datavisualization/engine/abstract3dcontroller.cpp
@@ -37,7 +37,8 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen
m_selectionMode(QAbstract3DGraph::SelectionItem),
m_shadowQuality(QAbstract3DGraph::ShadowQualityMedium),
m_useOrthoProjection(false),
- m_aspectRatio(2.0f),
+ m_aspectRatio(2.0),
+ m_horizontalAspectRatio(0.0),
m_optimizationHints(QAbstract3DGraph::OptimizationDefault),
m_scene(scene),
m_activeInputHandler(0),
@@ -204,10 +205,15 @@ void Abstract3DController::synchDataToRenderer()
}
if (m_changeTracker.aspectRatioChanged) {
- m_renderer->updateAspectRatio(m_aspectRatio);
+ m_renderer->updateAspectRatio(float(m_aspectRatio));
m_changeTracker.aspectRatioChanged = false;
}
+ if (m_changeTracker.horizontalAspectRatioChanged) {
+ m_renderer->updateHorizontalAspectRatio(float(m_horizontalAspectRatio));
+ m_changeTracker.horizontalAspectRatioChanged = false;
+ }
+
if (m_changeTracker.optimizationHintChanged) {
m_renderer->updateOptimizationHint(m_optimizationHints);
m_changeTracker.optimizationHintChanged = false;
@@ -1517,7 +1523,7 @@ bool Abstract3DController::isOrthoProjection() const
return m_useOrthoProjection;
}
-void Abstract3DController::setAspectRatio(float ratio)
+void Abstract3DController::setAspectRatio(qreal ratio)
{
if (m_aspectRatio != ratio) {
m_aspectRatio = ratio;
@@ -1528,11 +1534,27 @@ void Abstract3DController::setAspectRatio(float ratio)
}
}
-float Abstract3DController::aspectRatio()
+qreal Abstract3DController::aspectRatio()
{
return m_aspectRatio;
}
+void Abstract3DController::setHorizontalAspectRatio(qreal ratio)
+{
+ if (m_horizontalAspectRatio != ratio) {
+ m_horizontalAspectRatio = ratio;
+ m_changeTracker.horizontalAspectRatioChanged = true;
+ emit horizontalAspectRatioChanged(m_horizontalAspectRatio);
+ m_isDataDirty = true;
+ emitNeedRender();
+ }
+}
+
+qreal Abstract3DController::horizontalAspectRatio() const
+{
+ return m_horizontalAspectRatio;
+}
+
void Abstract3DController::setPolar(bool enable)
{
if (enable != m_isPolar) {
diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h
index 6394da1e..f6cfb057 100644
--- a/src/datavisualization/engine/abstract3dcontroller_p.h
+++ b/src/datavisualization/engine/abstract3dcontroller_p.h
@@ -84,6 +84,7 @@ struct Abstract3DChangeBitField {
bool axisYLabelAutoRotationChanged : 1;
bool axisZLabelAutoRotationChanged : 1;
bool aspectRatioChanged : 1;
+ bool horizontalAspectRatioChanged : 1;
bool axisXTitleVisibilityChanged : 1;
bool axisYTitleVisibilityChanged : 1;
bool axisZTitleVisibilityChanged : 1;
@@ -130,6 +131,7 @@ struct Abstract3DChangeBitField {
axisYLabelAutoRotationChanged(true),
axisZLabelAutoRotationChanged(true),
aspectRatioChanged(true),
+ horizontalAspectRatioChanged(true),
axisXTitleVisibilityChanged(true),
axisYTitleVisibilityChanged(true),
axisZTitleVisibilityChanged(true),
@@ -160,7 +162,8 @@ private:
QAbstract3DGraph::SelectionFlags m_selectionMode;
QAbstract3DGraph::ShadowQuality m_shadowQuality;
bool m_useOrthoProjection;
- float m_aspectRatio;
+ qreal m_aspectRatio;
+ qreal m_horizontalAspectRatio;
QAbstract3DGraph::OptimizationHints m_optimizationHints;
protected:
@@ -273,8 +276,11 @@ public:
QAbstract3DGraph::ElementType selectedElement() const;
- void setAspectRatio(float ratio);
- float aspectRatio();
+ void setAspectRatio(qreal ratio);
+ qreal aspectRatio();
+ void setHorizontalAspectRatio(qreal ratio);
+ qreal horizontalAspectRatio() const;
+
void setPolar(bool enable);
bool isPolar() const;
void setRadialLabelOffset(float offset);
@@ -354,7 +360,8 @@ signals:
void measureFpsChanged(bool enabled);
void currentFpsChanged(qreal fps);
void orthoProjectionChanged(bool enabled);
- void aspectRatioChanged(float ratio);
+ void aspectRatioChanged(qreal ratio);
+ void horizontalAspectRatioChanged(qreal ratio);
void optimizationHintsChanged(QAbstract3DGraph::OptimizationHints hints);
void polarChanged(bool enabled);
void radialLabelOffsetChanged(float offset);
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index 19fdf53b..782b1480 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -66,6 +66,7 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller)
m_gridLineObj(0),
m_labelObj(0),
m_graphAspectRatio(2.0f),
+ m_graphHorizontalAspectRatio(0.0f),
m_polarGraph(false),
m_radialLabelOffset(1.0f),
m_xRightAngleRotation(QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, 90.0f)),
@@ -319,6 +320,14 @@ void Abstract3DRenderer::updateAspectRatio(float ratio)
updateCustomItemPositions();
}
+void Abstract3DRenderer::updateHorizontalAspectRatio(float ratio)
+{
+ m_graphHorizontalAspectRatio = ratio;
+ foreach (SeriesRenderCache *cache, m_renderCacheList)
+ cache->setDataDirty(true);
+ updateCustomItemPositions();
+}
+
void Abstract3DRenderer::updatePolar(bool enable)
{
m_polarGraph = enable;
diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h
index 0c24c41e..f7fa748b 100644
--- a/src/datavisualization/engine/abstract3drenderer_p.h
+++ b/src/datavisualization/engine/abstract3drenderer_p.h
@@ -125,6 +125,7 @@ public:
virtual void updateCustomItem(CustomRenderItem *renderItem);
virtual void updateAspectRatio(float ratio);
+ virtual void updateHorizontalAspectRatio(float ratio);
virtual void updatePolar(bool enable);
virtual void updateRadialLabelOffset(float offset);
@@ -256,6 +257,7 @@ protected:
ObjectHelper *m_labelObj; // Shared reference
float m_graphAspectRatio;
+ float m_graphHorizontalAspectRatio;
bool m_polarGraph;
float m_radialLabelOffset;
diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp
index af809100..23290d69 100644
--- a/src/datavisualization/engine/qabstract3dgraph.cpp
+++ b/src/datavisualization/engine/qabstract3dgraph.cpp
@@ -615,14 +615,16 @@ bool QAbstract3DGraph::isOrthoProjection() const
* \property QAbstract3DGraph::aspectRatio
* \since QtDataVisualization 1.1
*
- * Aspect ratio of the graph data. This is the ratio of data scaling between horizontal and
- * vertical axes. Defaults to \c{2.0}.
+ * The aspect ratio is the ratio of the graph scaling between the longest axis on the horizontal
+ * plane and the Y-axis. Defaults to \c{2.0}.
*
* \note Has no effect on Q3DBars.
+ *
+ * \sa horizontalAspectRatio
*/
void QAbstract3DGraph::setAspectRatio(qreal ratio)
{
- d_ptr->m_visualController->setAspectRatio(float(ratio));
+ d_ptr->m_visualController->setAspectRatio(ratio);
}
qreal QAbstract3DGraph::aspectRatio() const
@@ -697,6 +699,30 @@ float QAbstract3DGraph::radialLabelOffset() const
}
/*!
+ * \property QAbstract3DGraph::horizontalAspectRatio
+ * \since QtDataVisualization 1.2
+ *
+ * The horizontal aspect ratio is the ratio of the graph scaling between the X and Z axes.
+ * Value of 0.0 indicates automatic scaling according to axis ranges.
+ * Defaults to \c{0.0}.
+ *
+ * \note Has no effect on Q3DBars, which handles scaling on the horizontal plane via
+ * \l{Q3DBars::barThickness}{barThickness} and \l{Q3DBars::barSpacing}{barSpacing} properties.
+ * Polar graphs also ignore this property.
+ *
+ * \sa aspectRatio, polar, Q3DBars::barThickness, Q3DBars::barSpacing
+ */
+void QAbstract3DGraph::setHorizontalAspectRatio(qreal ratio)
+{
+ d_ptr->m_visualController->setHorizontalAspectRatio(ratio);
+}
+
+qreal QAbstract3DGraph::horizontalAspectRatio() const
+{
+ return d_ptr->m_visualController->horizontalAspectRatio();
+}
+
+/*!
* \internal
*/
bool QAbstract3DGraph::event(QEvent *event)
@@ -850,6 +876,8 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll
&QAbstract3DGraph::polarChanged);
QObject::connect(m_visualController, &Abstract3DController::radialLabelOffsetChanged, q_ptr,
&QAbstract3DGraph::radialLabelOffsetChanged);
+ QObject::connect(m_visualController, &Abstract3DController::horizontalAspectRatioChanged, q_ptr,
+ &QAbstract3DGraph::horizontalAspectRatioChanged);
}
void QAbstract3DGraphPrivate::handleDevicePixelRatioChange()
diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h
index e6ebc42b..ba099395 100644
--- a/src/datavisualization/engine/qabstract3dgraph.h
+++ b/src/datavisualization/engine/qabstract3dgraph.h
@@ -52,6 +52,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q
Q_PROPERTY(OptimizationHints optimizationHints READ optimizationHints WRITE setOptimizationHints NOTIFY optimizationHintsChanged)
Q_PROPERTY(bool polar READ isPolar WRITE setPolar NOTIFY polarChanged)
Q_PROPERTY(float radialLabelOffset READ radialLabelOffset WRITE setRadialLabelOffset NOTIFY radialLabelOffsetChanged)
+ Q_PROPERTY(qreal horizontalAspectRatio READ horizontalAspectRatio WRITE setHorizontalAspectRatio NOTIFY horizontalAspectRatioChanged)
protected:
explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format,
@@ -158,6 +159,9 @@ public:
void setRadialLabelOffset(float offset);
float radialLabelOffset() const;
+ void setHorizontalAspectRatio(qreal ratio);
+ qreal horizontalAspectRatio() const;
+
protected:
bool event(QEvent *event);
void resizeEvent(QResizeEvent *event);
@@ -183,6 +187,7 @@ signals:
void optimizationHintsChanged(QAbstract3DGraph::OptimizationHints hints);
void polarChanged(bool enabled);
void radialLabelOffsetChanged(float offset);
+ void horizontalAspectRatioChanged(qreal ratio);
private:
Q_DISABLE_COPY(QAbstract3DGraph)
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index 852341a4..56219339 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -33,8 +33,6 @@
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
-//#define USE_UNIFORM_SCALING // Scale x and z uniformly, or based on autoscaled values
-
const GLfloat defaultMinSize = 0.01f;
const GLfloat defaultMaxSize = 0.1f;
const GLfloat itemScaler = 3.0f;
@@ -2025,30 +2023,33 @@ void Scatter3DRenderer::calculateSceneScalingFactors()
}
m_heightNormalizer = GLfloat(m_axisCacheY.max() - m_axisCacheY.min()) / 2.0f;
-#ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z
+
+ float horizontalAspectRatio;
+ if (m_polarGraph)
+ horizontalAspectRatio = 1.0f;
+ else
+ horizontalAspectRatio = m_graphHorizontalAspectRatio;
+
QSizeF areaSize;
- areaSize.setHeight((m_axisCacheZ.max() - m_axisCacheZ.min()));
- areaSize.setWidth((m_axisCacheX.max() - m_axisCacheX.min()));
- float scaleFactor = qMax(areaSize.width(), areaSize.height());
- if (m_polarGraph) {
- m_scaleX = m_graphAspectRatio;
- m_scaleZ = m_graphAspectRatio;
+ if (horizontalAspectRatio == 0.0f) {
+ areaSize.setHeight(m_axisCacheZ.max() - m_axisCacheZ.min());
+ areaSize.setWidth(m_axisCacheX.max() - m_axisCacheX.min());
} else {
- m_scaleX = m_graphAspectRatio * areaSize.width() / scaleFactor;
- m_scaleZ = m_graphAspectRatio * areaSize.height() / scaleFactor;
+ areaSize.setHeight(1.0f);
+ areaSize.setWidth(horizontalAspectRatio);
}
- float factorScaler = 2.0f * m_graphAspectRatio / scaleFactor;
- m_axisCacheX.setScale(factorScaler * areaSize.width());
- m_axisCacheZ.setScale(-factorScaler * areaSize.height());
-#else // ..and this if we want uniform scaling based on largest dimension
- m_scaleX = m_graphAspectRatio;
- m_scaleZ = m_graphAspectRatio;
- m_axisCacheX.setScale(2.0f * m_graphAspectRatio);
- m_axisCacheZ.setScale(-m_axisCacheX.scale());
-#endif
+
+ float scaleFactor = qMax(areaSize.width(), areaSize.height());
+ m_scaleX = m_graphAspectRatio * areaSize.width() / scaleFactor;
+ m_scaleZ = m_graphAspectRatio * areaSize.height() / scaleFactor;
+
m_scaleXWithBackground = m_scaleX + m_hBackgroundMargin;
m_scaleZWithBackground = m_scaleZ + m_hBackgroundMargin;
m_scaleYWithBackground = m_vBackgroundMargin + 1.0f;
+
+ float factorScaler = 2.0f * m_graphAspectRatio / scaleFactor;
+ m_axisCacheX.setScale(factorScaler * areaSize.width());
+ m_axisCacheZ.setScale(-factorScaler * areaSize.height());
m_axisCacheX.setTranslate(-m_axisCacheX.scale() / 2.0f);
m_axisCacheZ.setTranslate(-m_axisCacheZ.scale() / 2.0f);
}
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index 50104a93..c1a23493 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -2399,17 +2399,26 @@ void Surface3DRenderer::calculateSceneScalingFactors()
// Calculate scene scaling and translation factors
m_heightNormalizer = GLfloat(m_axisCacheY.max() - m_axisCacheY.min());
+
+ float horizontalAspectRatio;
+ if (m_polarGraph)
+ horizontalAspectRatio = 1.0f;
+ else
+ horizontalAspectRatio = m_graphHorizontalAspectRatio;
+
QSizeF areaSize;
- areaSize.setHeight(m_axisCacheZ.max() - m_axisCacheZ.min());
- areaSize.setWidth(m_axisCacheX.max() - m_axisCacheX.min());
- float scaleFactor = qMax(areaSize.width(), areaSize.height());
- if (m_polarGraph) {
- m_scaleX = m_graphAspectRatio;
- m_scaleZ = m_graphAspectRatio;
+ if (horizontalAspectRatio == 0.0f) {
+ areaSize.setHeight(m_axisCacheZ.max() - m_axisCacheZ.min());
+ areaSize.setWidth(m_axisCacheX.max() - m_axisCacheX.min());
} else {
- m_scaleX = m_graphAspectRatio * areaSize.width() / scaleFactor;
- m_scaleZ = m_graphAspectRatio * areaSize.height() / scaleFactor;
+ areaSize.setHeight(1.0f);
+ areaSize.setWidth(horizontalAspectRatio);
}
+
+ float scaleFactor = qMax(areaSize.width(), areaSize.height());
+ m_scaleX = m_graphAspectRatio * areaSize.width() / scaleFactor;
+ m_scaleZ = m_graphAspectRatio * areaSize.height() / scaleFactor;
+
m_scaleXWithBackground = m_scaleX + m_hBackgroundMargin;
m_scaleZWithBackground = m_scaleZ + m_hBackgroundMargin;
m_scaleYWithBackground = m_vBackgroundMargin + 1.0f;