From a1293a58e0909d56e34654549ba719bacfdda1bb Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 30 Jun 2014 10:33:33 +0300 Subject: Added horizontal aspect ratio property for abstract graphs Value 0.0 indicates automatic scaling (the default). Task-number: QTRD-3192 Change-Id: I5e4cc1b7a03c0ba811e2ed3916a440906429af57 Reviewed-by: Mika Salmela --- ...tdatavisualization-qml-abstractdeclarative.qdoc | 21 +++++++++-- .../engine/abstract3dcontroller.cpp | 30 +++++++++++++--- .../engine/abstract3dcontroller_p.h | 15 +++++--- .../engine/abstract3drenderer.cpp | 9 +++++ .../engine/abstract3drenderer_p.h | 2 ++ src/datavisualization/engine/qabstract3dgraph.cpp | 34 ++++++++++++++++-- src/datavisualization/engine/qabstract3dgraph.h | 5 +++ src/datavisualization/engine/scatter3drenderer.cpp | 41 +++++++++++----------- src/datavisualization/engine/surface3drenderer.cpp | 25 ++++++++----- 9 files changed, 141 insertions(+), 41 deletions(-) (limited to 'src/datavisualization') 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 @@ -696,6 +698,30 @@ float QAbstract3DGraph::radialLabelOffset() const return d_ptr->m_visualController->radialLabelOffset(); } +/*! + * \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 */ @@ -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; -- cgit v1.2.3