From 5611563234ac7edd47ad9df3a8bf0a293718d8f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 26 May 2014 09:57:25 +0300 Subject: Added API for changing data aspect ratio Task-number: QTRD-3144 Change-Id: I9acd1be13083d7fbbed840882260a60f46c5f698 Reviewed-by: Miikka Heikkinen --- ...tdatavisualization-qml-abstractdeclarative.qdoc | 12 +++- .../engine/abstract3dcontroller.cpp | 24 +++++++- .../engine/abstract3dcontroller_p.h | 9 ++- .../engine/abstract3drenderer.cpp | 33 ++++++++--- .../engine/abstract3drenderer_p.h | 6 ++ src/datavisualization/engine/bars3drenderer.cpp | 5 ++ src/datavisualization/engine/bars3drenderer_p.h | 2 + src/datavisualization/engine/qabstract3dgraph.cpp | 22 +++++++ src/datavisualization/engine/qabstract3dgraph.h | 5 ++ src/datavisualization/engine/scatter3drenderer.cpp | 67 ++++++++++++---------- src/datavisualization/engine/surface3drenderer.cpp | 7 +-- src/datavisualizationqml2/abstractdeclarative.cpp | 13 +++++ src/datavisualizationqml2/abstractdeclarative_p.h | 5 ++ 13 files changed, 164 insertions(+), 46 deletions(-) (limited to 'src') diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 2af73021..ece4f681 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -270,9 +270,19 @@ */ /*! - * \qmlproperty bool QAbstract3DGraph::orthoProjection + * \qmlproperty bool AbstractGraph3D::orthoProjection * \since Qt Data Visualization 1.1 * * If \c {true}, orthographic projection will be used for displaying the graph. Defaults to \c{false}. * \note Shadows will be disabled when set to \c{true}. */ + +/*! + * \qmlproperty real AbstractGraph3D::aspectRatio + * \since Qt Data Visualization 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}. + * + * \note Has no effect on Bars3D. + */ diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 838d6926..98b0c792 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -58,7 +58,8 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_renderPending(false), m_measureFps(false), m_numFrames(0), - m_currentFps(0.0) + m_currentFps(0.0), + m_aspectRatio(2.0f) { if (!m_scene) m_scene = new Q3DScene; @@ -197,6 +198,11 @@ void Abstract3DController::synchDataToRenderer() m_changeTracker.projectionChanged = false; } + if (m_changeTracker.aspectRatioChanged) { + m_renderer->updateAspectRatio(m_aspectRatio); + m_changeTracker.aspectRatioChanged = false; + } + if (m_changeTracker.axisXFormatterChanged) { m_changeTracker.axisXFormatterChanged = false; if (m_axisX->type() & QAbstract3DAxis::AxisTypeValue) { @@ -1416,4 +1422,20 @@ bool Abstract3DController::isOrthoProjection() const return m_useOrthoProjection; } +void Abstract3DController::setAspectRatio(float ratio) +{ + if (m_aspectRatio != ratio) { + m_aspectRatio = ratio; + m_changeTracker.aspectRatioChanged = true; + emit aspectRatioChanged(m_aspectRatio); + m_isDataDirty = true; + emitNeedRender(); + } +} + +float Abstract3DController::aspectRatio() +{ + return m_aspectRatio; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index a5d00cff..e359d40d 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -86,6 +86,7 @@ struct Abstract3DChangeBitField { bool axisXLabelAutoRotationChanged : 1; bool axisYLabelAutoRotationChanged : 1; bool axisZLabelAutoRotationChanged : 1; + bool aspectRatioChanged : 1; Abstract3DChangeBitField() : zoomLevelChanged(true), @@ -123,7 +124,8 @@ struct Abstract3DChangeBitField { projectionChanged(true), axisXLabelAutoRotationChanged(true), axisYLabelAutoRotationChanged(true), - axisZLabelAutoRotationChanged(true) + axisZLabelAutoRotationChanged(true), + aspectRatioChanged(true) { } }; @@ -157,6 +159,7 @@ private: QAbstract3DGraph::SelectionFlags m_selectionMode; QAbstract3DGraph::ShadowQuality m_shadowQuality; bool m_useOrthoProjection; + float m_aspectRatio; protected: Q3DScene *m_scene; @@ -324,6 +327,9 @@ public slots: void updateCustomItem(); + void setAspectRatio(float ratio); + float aspectRatio(); + signals: void shadowQualityChanged(QAbstract3DGraph::ShadowQuality quality); void activeInputHandlerChanged(QAbstract3DInputHandler *inputHandler); @@ -337,6 +343,7 @@ signals: void measureFpsChanged(bool enabled); void currentFpsChanged(qreal fps); void orthoProjectionChanged(bool enabled); + void aspectRatioChanged(float ratio); protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index da839e2d..adba857b 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -52,7 +52,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_selectionLabelItem(0), m_visibleSeriesCount(0), m_customItemShader(0), - m_useOrthoProjection(false) + m_useOrthoProjection(false), + m_graphAspectRatio(2.0f) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -271,18 +272,23 @@ void Abstract3DRenderer::updateSelectionMode(QAbstract3DGraph::SelectionFlags mo m_selectionDirty = true; } +void Abstract3DRenderer::updateAspectRatio(float ratio) +{ + m_graphAspectRatio = ratio; + calculateZoomLevel(); + m_cachedScene->activeCamera()->d_ptr->updateViewMatrix(m_autoScaleAdjustment); + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setDataDirty(true); + updateCustomItemPositions(); +} + void Abstract3DRenderer::handleResize() { if (m_primarySubViewport.width() == 0 || m_primarySubViewport.height() == 0) return; - // Calculate zoom level based on aspect ratio - GLfloat div; - GLfloat zoomAdjustment; - div = qMin(m_primarySubViewport.width(), m_primarySubViewport.height()); - zoomAdjustment = defaultRatio * ((m_primarySubViewport.width() / div) - / (m_primarySubViewport.height() / div)); - m_autoScaleAdjustment = qMin(zoomAdjustment, 1.0f); // clamp to 1.0f + // Recalculate zoom + calculateZoomLevel(); // Re-init selection buffer initSelectionBuffer(); @@ -293,6 +299,17 @@ void Abstract3DRenderer::handleResize() #endif } +void Abstract3DRenderer::calculateZoomLevel() +{ + // Calculate zoom level based on aspect ratio + GLfloat div; + GLfloat zoomAdjustment; + div = qMin(m_primarySubViewport.width(), m_primarySubViewport.height()); + zoomAdjustment = 2.0f * defaultRatio * ((m_primarySubViewport.width() / div) + / (m_primarySubViewport.height() / div)) / m_graphAspectRatio; + m_autoScaleAdjustment = qMin(zoomAdjustment, 1.0f); // clamp to 1.0f +} + void Abstract3DRenderer::updateAxisType(QAbstract3DAxis::AxisOrientation orientation, QAbstract3DAxis::AxisType type) { diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 4a6ee545..cd3608a8 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -118,6 +118,8 @@ public: virtual CustomRenderItem *addCustomItem(QCustom3DItem *item); virtual void updateCustomItem(CustomRenderItem *renderItem); + virtual void updateAspectRatio(float ratio); + virtual QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute) = 0; @@ -159,6 +161,8 @@ protected: void fixGradient(QLinearGradient *gradient, GLuint *gradientTexture); + void calculateZoomLevel(); + bool m_hasNegativeValues; Q3DTheme *m_cachedTheme; Drawer *m_drawer; @@ -197,6 +201,8 @@ protected: bool m_useOrthoProjection; + float m_graphAspectRatio; + private: friend class Abstract3DController; }; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index b9448687..db23460c 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2618,4 +2618,9 @@ QVector3D Bars3DRenderer::convertPositionToTranslation(const QVector3D &position return QVector3D(xTrans, yTrans, zTrans); } +void Bars3DRenderer::updateAspectRatio(float ratio) +{ + Q_UNUSED(ratio) +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index d62171eb..4b544082 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -124,6 +124,8 @@ public: QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute); + void updateAspectRatio(float ratio); + protected: virtual void initializeOpenGL(); diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 02606b85..480307fe 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -591,6 +591,25 @@ bool QAbstract3DGraph::isOrthoProjection() const return d_ptr->m_visualController->isOrthoProjection(); } +/*! + * \property QAbstract3DGraph::aspectRatio + * \since Qt Data Visualization 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}. + * + * \note Has no effect on Q3DBars. + */ +void QAbstract3DGraph::setAspectRatio(qreal ratio) +{ + d_ptr->m_visualController->setAspectRatio(float(ratio)); +} + +qreal QAbstract3DGraph::aspectRatio() const +{ + return d_ptr->m_visualController->aspectRatio(); +} + /*! * \internal */ @@ -736,6 +755,9 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll QObject::connect(m_visualController, &Abstract3DController::orthoProjectionChanged, q_ptr, &QAbstract3DGraph::orthoProjectionChanged); + + QObject::connect(m_visualController, &Abstract3DController::aspectRatioChanged, q_ptr, + &QAbstract3DGraph::aspectRatioChanged); } void QAbstract3DGraphPrivate::handleDevicePixelRatioChange() diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 0db9fc4c..2d4f18da 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -47,6 +47,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged) Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged) Q_PROPERTY(ElementType selectedElement READ selectedElement NOTIFY selectedElementChanged) + Q_PROPERTY(qreal aspectRatio READ aspectRatio WRITE setAspectRatio NOTIFY aspectRatioChanged) protected: explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, @@ -135,6 +136,9 @@ public: ElementType selectedElement() const; + void setAspectRatio(qreal ratio); + qreal aspectRatio() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); @@ -156,6 +160,7 @@ signals: void measureFpsChanged(bool enabled); void currentFpsChanged(qreal fps); void orthoProjectionChanged(bool enabled); + void aspectRatioChanged(qreal ratio); private: Q_DISABLE_COPY(QAbstract3DGraph) diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 3c1adfa0..e37089a2 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -45,7 +45,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION //#define USE_UNIFORM_SCALING // Scale x and z uniformly, or based on autoscaled values -const GLfloat aspectRatio = 2.0f; // Forced ratio of x and z to y. Dynamic will make it look odd. const GLfloat labelMargin = 0.05f; const GLfloat defaultMinSize = 0.01f; const GLfloat defaultMaxSize = 0.1f; @@ -825,17 +824,19 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 itModelMatrix; #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat xScale = (aspectRatio * m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; - GLfloat zScale = (aspectRatio * m_areaSize.height()) / m_scaleFactor + m_backgroundMargin; + GLfloat xScale = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor + + m_backgroundMargin; + GLfloat zScale = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor + + m_backgroundMargin; if (m_maxItemSize > xScale) xScale = m_maxItemSize; if (m_maxItemSize > zScale) zScale = m_maxItemSize; QVector3D bgScale(xScale, 1.0f + m_backgroundMargin, zScale); #else // ..and this if we want uniform scaling based on largest dimension - QVector3D bgScale((aspectRatio + m_backgroundMargin), + QVector3D bgScale((m_graphAspectRatio + m_backgroundMargin), 1.0f + m_backgroundMargin, - (aspectRatio + m_backgroundMargin)); + (m_graphAspectRatio + m_backgroundMargin)); #endif modelMatrix.scale(bgScale); // If we're viewing from below, background object must be flipped @@ -948,12 +949,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) int gridLineCount = m_axisCacheZ.gridLineCount(); #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat xScale = (aspectRatio * m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; + GLfloat xScale = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor + + m_backgroundMargin; if (m_maxItemSize > xScale) xScale = m_maxItemSize; QVector3D gridLineScaler(xScale, gridLineWidth, gridLineWidth); #else // ..and this if we want uniform scaling based on largest dimension - QVector3D gridLineScaler((aspectRatio + m_backgroundMargin), + QVector3D gridLineScaler((m_graphAspectRatio + m_backgroundMargin), gridLineWidth, gridLineWidth); #endif @@ -997,12 +999,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Side wall lines gridLineScaler = QVector3D(gridLineWidth, 1.0f + m_backgroundMargin, gridLineWidth); #ifndef USE_UNIFORM_SCALING - GLfloat lineXTrans = (aspectRatio * m_areaSize.width()) + GLfloat lineXTrans = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineXTrans) lineXTrans = m_maxItemSize - gridLineOffset; #else - GLfloat lineXTrans = aspectRatio + m_backgroundMargin - gridLineOffset; + GLfloat lineXTrans = m_graphAspectRatio + m_backgroundMargin - gridLineOffset; #endif if (!m_xFlipped) lineXTrans = -lineXTrans; @@ -1059,13 +1061,14 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) int gridLineCount = m_axisCacheX.gridLineCount(); #ifndef USE_UNIFORM_SCALING - GLfloat zScale = (aspectRatio * m_areaSize.height()) / m_scaleFactor + m_backgroundMargin; + GLfloat zScale = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor + + m_backgroundMargin; if (m_maxItemSize > zScale) zScale = m_maxItemSize; QVector3D gridLineScaler(gridLineWidth, gridLineWidth, zScale); #else QVector3D gridLineScaler(gridLineWidth, gridLineWidth, - aspectRatio + m_backgroundMargin); + m_graphAspectRatio + m_backgroundMargin); #endif for (int line = 0; line < gridLineCount; line++) { @@ -1107,12 +1110,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Back wall lines #ifndef USE_UNIFORM_SCALING - GLfloat lineZTrans = (aspectRatio * m_areaSize.height()) + GLfloat lineZTrans = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineZTrans) lineZTrans = m_maxItemSize - gridLineOffset; #else - GLfloat lineZTrans = aspectRatio + m_backgroundMargin - gridLineOffset; + GLfloat lineZTrans = m_graphAspectRatio + m_backgroundMargin - gridLineOffset; #endif if (!m_zFlipped) lineZTrans = -lineZTrans; @@ -1170,17 +1173,18 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) int gridLineCount = m_axisCacheY.gridLineCount(); #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat lineZTrans = (aspectRatio * m_areaSize.height()) + GLfloat lineZTrans = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineZTrans) lineZTrans = m_maxItemSize - gridLineOffset; - GLfloat xScale = (aspectRatio * m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; + GLfloat xScale = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor + + m_backgroundMargin; if (m_maxItemSize > xScale) xScale = m_maxItemSize; QVector3D gridLineScaler(xScale, gridLineWidth, gridLineWidth); #else // ..and this if we want uniform scaling based on largest dimension - GLfloat lineZTrans = aspectRatio + m_backgroundMargin - gridLineOffset; - QVector3D gridLineScaler((aspectRatio + m_backgroundMargin), + GLfloat lineZTrans = m_graphAspectRatio + m_backgroundMargin - gridLineOffset; + QVector3D gridLineScaler((m_graphAspectRatio + m_backgroundMargin), gridLineWidth, gridLineWidth); #endif if (!m_zFlipped) @@ -1227,19 +1231,19 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Side wall #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat lineXTrans = (aspectRatio * m_areaSize.width()) + GLfloat lineXTrans = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineXTrans) lineXTrans = m_maxItemSize - gridLineOffset; - GLfloat zScale = (aspectRatio * m_areaSize.height()) + GLfloat zScale = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor + m_backgroundMargin; if (m_maxItemSize > zScale) zScale = m_maxItemSize; gridLineScaler = QVector3D(gridLineWidth, gridLineWidth, zScale); #else // ..and this if we want uniform scaling based on largest dimension - GLfloat lineXTrans = aspectRatio + m_backgroundMargin - gridLineOffset; + GLfloat lineXTrans = m_graphAspectRatio + m_backgroundMargin - gridLineOffset; gridLineScaler = QVector3D(gridLineWidth, gridLineWidth, - aspectRatio + m_backgroundMargin); + m_graphAspectRatio + m_backgroundMargin); #endif if (!m_xFlipped) lineXTrans = -lineXTrans; @@ -1358,12 +1362,12 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa if (m_axisCacheZ.segmentCount() > 0) { int labelCount = m_axisCacheZ.labelCount(); #ifndef USE_UNIFORM_SCALING - GLfloat labelXTrans = (aspectRatio * m_areaSize.width()) + GLfloat labelXTrans = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor + labelMargin + m_backgroundMargin; if (m_maxItemSize > labelXTrans) labelXTrans = m_maxItemSize + labelMargin; #else - GLfloat labelXTrans = aspectRatio + m_backgroundMargin + labelMargin; + GLfloat labelXTrans = m_graphAspectRatio + m_backgroundMargin + labelMargin; #endif int labelNbr = 0; GLfloat labelYTrans = -1.0f - m_backgroundMargin; @@ -1467,12 +1471,12 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa fractionCamX = activeCamera->xRotation() * labelAngleFraction; int labelCount = m_axisCacheX.labelCount(); #ifndef USE_UNIFORM_SCALING - GLfloat labelZTrans = (aspectRatio * m_areaSize.height()) + GLfloat labelZTrans = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor + labelMargin + m_backgroundMargin; if (m_maxItemSize > labelZTrans) labelZTrans = m_maxItemSize + labelMargin; #else - GLfloat labelZTrans = aspectRatio + m_backgroundMargin + labelMargin; + GLfloat labelZTrans = m_graphAspectRatio + m_backgroundMargin + labelMargin; #endif int labelNbr = 0; GLfloat labelYTrans = -1.0f - m_backgroundMargin; @@ -1580,16 +1584,16 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa int labelCount = m_axisCacheY.labelCount(); int labelNbr = 0; #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat labelXTrans = (aspectRatio* m_areaSize.width()) + GLfloat labelXTrans = (m_graphAspectRatio* m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; - GLfloat labelZTrans = (aspectRatio * m_areaSize.height()) + GLfloat labelZTrans = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor + m_backgroundMargin; if (m_maxItemSize > labelXTrans) labelXTrans = m_maxItemSize; if (m_maxItemSize > labelZTrans) labelZTrans = m_maxItemSize; #else // ..and this if we want uniform scaling based on largest dimension - GLfloat labelXTrans = aspectRatio + m_backgroundMargin; + GLfloat labelXTrans = m_graphAspectRatio + m_backgroundMargin; GLfloat labelZTrans = labelXTrans; #endif // Back & side wall @@ -1784,11 +1788,11 @@ void Scatter3DRenderer::calculateSceneScalingFactors() m_scaleFactor = qMax(m_areaSize.width(), m_areaSize.height()); #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - float factorScaler = 2.0f * aspectRatio / m_scaleFactor; + float factorScaler = 2.0f * m_graphAspectRatio / m_scaleFactor; m_axisCacheX.setScale(factorScaler * m_areaSize.width()); m_axisCacheZ.setScale(-factorScaler * m_areaSize.height()); #else // ..and this if we want uniform scaling based on largest dimension - m_axisCacheX.setScale(2.0f * aspectRatio); + m_axisCacheX.setScale(2.0f * m_graphAspectRatio); m_axisCacheZ.setScale(-m_axisCacheX.scale()); #endif m_axisCacheX.setTranslate(-m_axisCacheX.scale() / 2.0f); @@ -1943,7 +1947,8 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, series = 0; } -void Scatter3DRenderer::updateRenderItem(const QScatterDataItem &dataItem, ScatterRenderItem &renderItem) +void Scatter3DRenderer::updateRenderItem(const QScatterDataItem &dataItem, + ScatterRenderItem &renderItem) { QVector3D dotPos = dataItem.position(); if ((dotPos.x() >= m_axisCacheX.min() && dotPos.x() <= m_axisCacheX.max() ) diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 1f3a6932..54544396 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -40,7 +40,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION //#define SHOW_DEPTH_TEXTURE_SCENE -const GLfloat aspectRatio = 2.0f; // Forced ratio of x and z to y. Dynamic will make it look odd. // Margin for background (1.10 make it 10% larger to avoid // selection ball being drawn inside background) const GLfloat backgroundMargin = 1.1f; @@ -2262,12 +2261,12 @@ void Surface3DRenderer::calculateSceneScalingFactors() m_areaSize.setHeight(m_axisCacheZ.max() - m_axisCacheZ.min()); m_areaSize.setWidth(m_axisCacheX.max() - m_axisCacheX.min()); m_scaleFactor = qMax(m_areaSize.width(), m_areaSize.height()); - m_scaleX = aspectRatio * m_areaSize.width() / m_scaleFactor; - m_scaleZ = aspectRatio * m_areaSize.height() / m_scaleFactor; + m_scaleX = m_graphAspectRatio * m_areaSize.width() / m_scaleFactor; + m_scaleZ = m_graphAspectRatio * m_areaSize.height() / m_scaleFactor; m_scaleXWithBackground = m_scaleX + backgroundMargin - 1.0f; m_scaleZWithBackground = m_scaleZ + backgroundMargin - 1.0f; - float factorScaler = 2.0f * aspectRatio / m_scaleFactor; + float factorScaler = 2.0f * m_graphAspectRatio / m_scaleFactor; m_axisCacheX.setScale(factorScaler * m_areaSize.width()); m_axisCacheZ.setScale(-factorScaler * m_areaSize.height()); m_axisCacheX.setTranslate(-m_axisCacheX.scale() / 2.0f); diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index c09204da..9805cfb4 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -325,6 +325,9 @@ void AbstractDeclarative::setSharedController(Abstract3DController *controller) QObject::connect(m_controller.data(), &Abstract3DController::orthoProjectionChanged, this, &AbstractDeclarative::orthoProjectionChanged); + + QObject::connect(m_controller.data(), &Abstract3DController::aspectRatioChanged, this, + &AbstractDeclarative::aspectRatioChanged); } void AbstractDeclarative::activateOpenGLContext(QQuickWindow *window) @@ -687,6 +690,16 @@ AbstractDeclarative::ElementType AbstractDeclarative::selectedElement() const return ElementType(m_controller->selectedElement()); } +void AbstractDeclarative::setAspectRatio(qreal ratio) +{ + m_controller->setAspectRatio(float(ratio)); +} + +qreal AbstractDeclarative::aspectRatio() const +{ + return m_controller->aspectRatio(); +} + void AbstractDeclarative::windowDestroyed(QObject *obj) { // Remove destroyed window from window lists diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 374e6fb3..c2f9ee08 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -72,6 +72,7 @@ class AbstractDeclarative : public QQuickItem Q_PROPERTY(QQmlListProperty customItemList READ customItemList REVISION 1) Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged REVISION 1) Q_PROPERTY(ElementType selectedElement READ selectedElement NOTIFY selectedElementChanged REVISION 1) + Q_PROPERTY(qreal aspectRatio READ aspectRatio WRITE setAspectRatio NOTIFY aspectRatioChanged REVISION 1) public: enum SelectionFlag { @@ -181,6 +182,9 @@ public: AbstractDeclarative::ElementType selectedElement() const; + void setAspectRatio(qreal ratio); + qreal aspectRatio() const; + public slots: virtual void handleAxisXChanged(QAbstract3DAxis *axis) = 0; virtual void handleAxisYChanged(QAbstract3DAxis *axis) = 0; @@ -214,6 +218,7 @@ signals: Q_REVISION(1) void currentFpsChanged(qreal fps); Q_REVISION(1) void selectedElementChanged(QAbstract3DGraph::ElementType type); Q_REVISION(1) void orthoProjectionChanged(bool enabled); + Q_REVISION(1) void aspectRatioChanged(qreal ratio); private: QPointer m_controller; -- cgit v1.2.3