summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2014-05-26 09:57:25 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2014-05-26 10:00:29 +0300
commit5611563234ac7edd47ad9df3a8bf0a293718d8f8 (patch)
treecf86ae40fdc51e9df7197fc5756438b1023858c6
parent039a4b04c5207e869fed958baefcd74fe9423426 (diff)
Added API for changing data aspect ratio
Task-number: QTRD-3144 Change-Id: I9acd1be13083d7fbbed840882260a60f46c5f698 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc12
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp24
-rw-r--r--src/datavisualization/engine/abstract3dcontroller_p.h9
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp33
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h6
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp5
-rw-r--r--src/datavisualization/engine/bars3drenderer_p.h2
-rw-r--r--src/datavisualization/engine/qabstract3dgraph.cpp22
-rw-r--r--src/datavisualization/engine/qabstract3dgraph.h5
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp67
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp7
-rw-r--r--src/datavisualizationqml2/abstractdeclarative.cpp13
-rw-r--r--src/datavisualizationqml2/abstractdeclarative_p.h5
-rw-r--r--tests/scattertest/main.cpp31
-rw-r--r--tests/scattertest/scatterchart.cpp6
-rw-r--r--tests/scattertest/scatterchart.h1
-rw-r--r--tests/surfacetest/graphmodifier.cpp6
-rw-r--r--tests/surfacetest/graphmodifier.h2
-rw-r--r--tests/surfacetest/main.cpp10
19 files changed, 211 insertions, 55 deletions
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
@@ -592,6 +592,25 @@ bool QAbstract3DGraph::isOrthoProjection() const
}
/*!
+ * \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
*/
bool QAbstract3DGraph::event(QEvent *event)
@@ -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<QCustom3DItem> 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<Abstract3DController> m_controller;
diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp
index b0e52c8c..ad147b0d 100644
--- a/tests/scattertest/main.cpp
+++ b/tests/scattertest/main.cpp
@@ -170,59 +170,68 @@ int main(int argc, char **argv)
QFontComboBox *fontList = new QFontComboBox(widget);
QSlider *fontSizeSlider = new QSlider(Qt::Horizontal, widget);
- fontSizeSlider->setTickInterval(1);
+ fontSizeSlider->setTickInterval(15);
+ fontSizeSlider->setTickPosition(QSlider::TicksBelow);
fontSizeSlider->setMinimum(1);
fontSizeSlider->setValue(30);
fontSizeSlider->setMaximum(200);
QSlider *pointSizeSlider = new QSlider(Qt::Horizontal, widget);
- pointSizeSlider->setTickInterval(1);
+ pointSizeSlider->setTickInterval(15);
+ pointSizeSlider->setTickPosition(QSlider::TicksBelow);
pointSizeSlider->setMinimum(1);
pointSizeSlider->setValue(30);
pointSizeSlider->setMaximum(100);
QSlider *minSliderX = new QSlider(Qt::Horizontal, widget);
- minSliderX->setTickInterval(1);
+ minSliderX->setTickInterval(50);
minSliderX->setTickPosition(QSlider::TicksBelow);
minSliderX->setMinimum(-100);
minSliderX->setValue(-50);
minSliderX->setMaximum(100);
QSlider *minSliderY = new QSlider(Qt::Horizontal, widget);
- minSliderY->setTickInterval(1);
+ minSliderY->setTickInterval(100);
minSliderY->setTickPosition(QSlider::TicksBelow);
minSliderY->setMinimum(-200);
minSliderY->setValue(-100);
minSliderY->setMaximum(200);
QSlider *minSliderZ = new QSlider(Qt::Horizontal, widget);
- minSliderZ->setTickInterval(1);
+ minSliderZ->setTickInterval(50);
minSliderZ->setTickPosition(QSlider::TicksBelow);
minSliderZ->setMinimum(-100);
minSliderZ->setValue(-50);
minSliderZ->setMaximum(100);
QSlider *maxSliderX = new QSlider(Qt::Horizontal, widget);
- maxSliderX->setTickInterval(1);
+ maxSliderX->setTickInterval(50);
maxSliderX->setTickPosition(QSlider::TicksAbove);
maxSliderX->setMinimum(-100);
maxSliderX->setValue(50);
maxSliderX->setMaximum(100);
QSlider *maxSliderY = new QSlider(Qt::Horizontal, widget);
- maxSliderY->setTickInterval(1);
+ maxSliderY->setTickInterval(100);
maxSliderY->setTickPosition(QSlider::TicksAbove);
maxSliderY->setMinimum(-200);
maxSliderY->setValue(120);
maxSliderY->setMaximum(200);
QSlider *maxSliderZ = new QSlider(Qt::Horizontal, widget);
- maxSliderZ->setTickInterval(1);
+ maxSliderZ->setTickInterval(50);
maxSliderZ->setTickPosition(QSlider::TicksAbove);
maxSliderZ->setMinimum(-100);
maxSliderZ->setValue(50);
maxSliderZ->setMaximum(100);
+ QSlider *aspectRatioSlider = new QSlider(Qt::Horizontal, widget);
+ aspectRatioSlider->setTickInterval(10);
+ aspectRatioSlider->setTickPosition(QSlider::TicksBelow);
+ aspectRatioSlider->setMinimum(1);
+ aspectRatioSlider->setValue(20);
+ aspectRatioSlider->setMaximum(100);
+
vLayout->addWidget(themeButton, 0, Qt::AlignTop);
vLayout->addWidget(labelButton, 0, Qt::AlignTop);
vLayout->addWidget(styleButton, 0, Qt::AlignTop);
@@ -267,7 +276,9 @@ int main(int argc, char **argv)
vLayout2->addWidget(new QLabel(QStringLiteral("Change font")));
vLayout2->addWidget(fontList);
vLayout2->addWidget(new QLabel(QStringLiteral("Adjust font size")));
- vLayout2->addWidget(fontSizeSlider, 1, Qt::AlignTop);
+ vLayout2->addWidget(fontSizeSlider, 0, Qt::AlignTop);
+ vLayout2->addWidget(new QLabel(QStringLiteral("Adjust aspect ratio")));
+ vLayout2->addWidget(aspectRatioSlider, 1, Qt::AlignTop);
widget->show();
@@ -356,6 +367,8 @@ int main(int argc, char **argv)
QObject::connect(maxSliderZ, &QSlider::valueChanged, modifier,
&ScatterDataModifier::setMaxZ);
+ QObject::connect(aspectRatioSlider, &QSlider::valueChanged, modifier,
+ &ScatterDataModifier::setAspectRatio);
modifier->setFpsLabel(fpsLabel);
diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp
index 430279c3..3f900909 100644
--- a/tests/scattertest/scatterchart.cpp
+++ b/tests/scattertest/scatterchart.cpp
@@ -968,6 +968,12 @@ void ScatterDataModifier::setMaxZ(int max)
m_chart->axisZ()->setMax(max);
}
+void ScatterDataModifier::setAspectRatio(int ratio)
+{
+ float aspectRatio = float(ratio) / 10.0f;
+ m_chart->setAspectRatio(aspectRatio);
+}
+
QVector3D ScatterDataModifier::randVector()
{
QVector3D retvec = QVector3D(
diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h
index 977e1201..34826aba 100644
--- a/tests/scattertest/scatterchart.h
+++ b/tests/scattertest/scatterchart.h
@@ -52,6 +52,7 @@ public:
void setMaxX(int max);
void setMaxY(int max);
void setMaxZ(int max);
+ void setAspectRatio(int ratio);
void start();
void massiveDataTest();
void massiveTestScroll();
diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp
index 33cfb8a1..442e7742 100644
--- a/tests/surfacetest/graphmodifier.cpp
+++ b/tests/surfacetest/graphmodifier.cpp
@@ -1489,3 +1489,9 @@ void GraphModifier::updateSamples()
break;
}
}
+
+void GraphModifier::setAspectRatio(int ratio)
+{
+ float aspectRatio = float(ratio) / 10.0f;
+ m_graph->setAspectRatio(aspectRatio);
+}
diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h
index b02e1c31..ff0b325e 100644
--- a/tests/surfacetest/graphmodifier.h
+++ b/tests/surfacetest/graphmodifier.h
@@ -113,6 +113,8 @@ public:
void testAxisReverse();
void testDataOrdering();
+ void setAspectRatio(int ratio);
+
public slots:
void changeShadowQuality(int quality);
void changeTheme(int theme);
diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp
index 9d6165e6..7444a66a 100644
--- a/tests/surfacetest/main.cpp
+++ b/tests/surfacetest/main.cpp
@@ -218,6 +218,11 @@ int main(int argc, char *argv[])
axisMinSliderZ->setMaximum(100);
axisMinSliderZ->setEnabled(true);
+ QSlider *aspectRatioSlider = new QSlider(Qt::Horizontal, widget);
+ aspectRatioSlider->setMinimum(1);
+ aspectRatioSlider->setValue(20);
+ aspectRatioSlider->setMaximum(100);
+
QLinearGradient gr(0, 0, 100, 1);
gr.setColorAt(0.0, Qt::black);
gr.setColorAt(0.33, Qt::blue);
@@ -403,6 +408,8 @@ int main(int argc, char *argv[])
vLayout->addWidget(gridSliderX);
vLayout->addWidget(gridSliderZ);
#endif
+ vLayout->addWidget(new QLabel(QStringLiteral("Adjust aspect ratio")));
+ vLayout->addWidget(aspectRatioSlider);
vLayout->addWidget(new QLabel(QStringLiteral("Adjust axis range")));
vLayout->addWidget(axisRangeSliderX);
vLayout->addWidget(axisRangeSliderY);
@@ -605,6 +612,9 @@ int main(int argc, char *argv[])
QObject::connect(testDataOrderingButton, &QPushButton::clicked,
modifier, &GraphModifier::testDataOrdering);
+ QObject::connect(aspectRatioSlider, &QSlider::valueChanged,
+ modifier, &GraphModifier::setAspectRatio);
+
#ifdef MULTI_SERIES
modifier->setSeries1CB(series1CB);
modifier->setSeries2CB(series2CB);