summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-12-04 06:47:31 +0200
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-12-04 08:12:42 +0200
commitf272b13f025897e157480b9bc3e5b6f1163c6125 (patch)
tree7d5637ce1d88b0ba621fbeaeef93f21939c0f533
parent344870fb79e647b87aa79b9433eef8237c901e10 (diff)
Item size per series for scatter
Task-number: QTRD-2568 Change-Id: Ic137185304a5cc5ad16699cbb127035db86196cb Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
-rw-r--r--examples/qmlscatter/qml/qmlscatter/data.qml8
-rw-r--r--examples/qmlscatter/qml/qmlscatter/main.qml55
-rw-r--r--src/datavisualization/data/qscatter3dseries.cpp40
-rw-r--r--src/datavisualization/data/qscatter3dseries.h6
-rw-r--r--src/datavisualization/data/qscatter3dseries_p.h2
-rw-r--r--src/datavisualization/data/qscatterdataitem.cpp12
-rw-r--r--src/datavisualization/data/qscatterdataitem.h5
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp211
-rw-r--r--src/datavisualization/engine/scatter3drenderer_p.h3
9 files changed, 236 insertions, 106 deletions
diff --git a/examples/qmlscatter/qml/qmlscatter/data.qml b/examples/qmlscatter/qml/qmlscatter/data.qml
index b8b2a77b..e5e7d11f 100644
--- a/examples/qmlscatter/qml/qmlscatter/data.qml
+++ b/examples/qmlscatter/qml/qmlscatter/data.qml
@@ -23,6 +23,8 @@ Item {
//! [3]
property alias model: dataModel
//! [3]
+ property alias modelTwo: dataModelTwo
+ property alias modelThree: dataModelThree
//! [0]
ListModel {
@@ -51,7 +53,10 @@ Item {
ListElement{ xPos: -7.9 ; yPos: 3.4 ; zPos: -2.78 }
ListElement{ xPos: -7.4 ; yPos: 3.12 ; zPos: -3.1 }
ListElement{ xPos: -7.54 ; yPos: 2.8 ; zPos: -3.68 }
+ }
+ ListModel {
+ id: dataModelTwo
ListElement{ xPos: 2.25 ; yPos: 1.36 ; zPos: -1.3 }
ListElement{ xPos: -2 ; yPos: -0.08 ; zPos: 1 }
ListElement{ xPos: 2.65 ; yPos: -1.2 ; zPos: 2.7 }
@@ -1052,7 +1057,10 @@ Item {
ListElement{ xPos: 0.85 ; yPos: -2.92 ; zPos: 3.4 }
ListElement{ xPos: -0.7 ; yPos: 2.52 ; zPos: 1 }
ListElement{ xPos: -3.4 ; yPos: 0.6 ; zPos: 0.9 }
+ }
+ ListModel {
+ id: dataModelThree
ListElement{ xPos: 8.0; yPos: -2.0; zPos: 4.0 }
ListElement{ xPos: 7.8; yPos: -2.2; zPos: 5.0 }
ListElement{ xPos: 7.6; yPos: -2.4; zPos: 4.5 }
diff --git a/examples/qmlscatter/qml/qmlscatter/main.qml b/examples/qmlscatter/qml/qmlscatter/main.qml
index 636239bf..179980be 100644
--- a/examples/qmlscatter/qml/qmlscatter/main.qml
+++ b/examples/qmlscatter/qml/qmlscatter/main.qml
@@ -30,10 +30,18 @@ Item {
//! [4]
Data {
- id: graphData
+ id: seriesOneData
}
//! [4]
+ Data {
+ id: seriesTwoData
+ }
+
+ Data {
+ id: seriesThreeData
+ }
+
//! [8]
//! [9]
Item {
@@ -69,13 +77,20 @@ Item {
axisY.subSegmentCount: 2
axisY.labelFormat: "%.2f"
//! [6]
+ // TODO: Remove once QTRD-2605 is fixed
+ axisX.min: -10
+ axisX.max: 10
+ axisY.min: -5
+ axisY.max: 5
+ axisZ.min: -5
+ axisZ.max: 5
//! [5]
Scatter3DSeries {
id: scatterSeries
- itemLabelFormat: "X:@xLabel Y:@yLabel Z:@zLabel"
+ itemLabelFormat: "Series 1: X:@xLabel Y:@yLabel Z:@zLabel"
ItemModelScatterDataProxy {
- itemModel: graphData.model
+ itemModel: seriesOneData.model
xPosRole: "xPos"
yPosRole: "yPos"
zPosRole: "zPos"
@@ -83,6 +98,32 @@ Item {
}
//! [5]
+ Scatter3DSeries {
+ id: scatterSeriesTwo
+ itemLabelFormat: "Series 2: X:@xLabel Y:@yLabel Z:@zLabel"
+ itemSize: 0.1
+ mesh: Abstract3DSeries.MeshCube
+
+ ItemModelScatterDataProxy {
+ itemModel: seriesTwoData.modelTwo
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ }
+ }
+ Scatter3DSeries {
+ id: scatterSeriesThree
+ itemLabelFormat: "Series 3: X:@xLabel Y:@yLabel Z:@zLabel"
+ itemSize: 0.2
+ mesh: Abstract3DSeries.MeshMinimal
+
+ ItemModelScatterDataProxy {
+ itemModel: seriesThreeData.modelThree
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ }
+ }
}
}
@@ -106,14 +147,14 @@ Item {
NewButton {
id: smoothToggle
width: parent.width / 6
- text: "Use Smooth Dots"
+ text: "Use Smooth for Series One"
anchors.left: shadowToggle.right
onClicked: {
if (scatterSeries.meshSmooth === false) {
- text = "Use Flat Dots";
+ text = "Use Flat for Series One";
scatterSeries.meshSmooth = true;
} else {
- text = "Use Smooth Dots"
+ text = "Use Smooth for Series One"
scatterSeries.meshSmooth = false;
}
}
@@ -142,7 +183,7 @@ Item {
if (scatterGraph.theme.type === Theme3D.ThemeArmyBlue) {
// Ownership of the theme is transferred and old theme is destroyed when setting
// a new one, so we need to create them dynamically
- scatterGraph.theme = Qt.createQmlObject('import QtDataVisualization 1.0; Theme3D {type: Theme3D.ThemeIsabelle}', parent);
+ scatterGraph.theme = Qt.createQmlObject('import QtDataVisualization 1.0; Theme3D {type: Theme3D.ThemeIsabelle; font.family: "Lucida Handwriting"; font.pointSize: 40}', parent);
} else {
scatterGraph.theme = Qt.createQmlObject('import QtDataVisualization 1.0; Theme3D {type: Theme3D.ThemeArmyBlue}', parent);
}
diff --git a/src/datavisualization/data/qscatter3dseries.cpp b/src/datavisualization/data/qscatter3dseries.cpp
index 25e32ffe..4c2f368a 100644
--- a/src/datavisualization/data/qscatter3dseries.cpp
+++ b/src/datavisualization/data/qscatter3dseries.cpp
@@ -95,6 +95,14 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE
*/
/*!
+ * \qmlproperty float Scatter3DSeries::itemSize
+ *
+ * Set item size for the series. Size must be between 0.0 and 1.0. Setting the size to 0.0
+ * causes item size to be automatically scaled based on combined item count in all the series for
+ * the graph. Preset default is \c 0.0.
+ */
+
+/*!
* \qmlmethod int Scatter3DSeries::invalidSelectionIndex()
* \return an invalid index for selection. Set this index to selectedItem property if you
* want to clear the selection.
@@ -176,6 +184,28 @@ int QScatter3DSeries::selectedItem() const
}
/*!
+ * \property QScatter3DSeries::selectedItem
+ *
+ * Set item \a size for the series. Size must be between 0.0f and 1.0f. Setting the size to 0.0f
+ * causes item size to be automatically scaled based on combined item count in all the series for
+ * the graph. Preset default is \c 0.0f.
+ */
+void QScatter3DSeries::setItemSize(float size)
+{
+ if (size < 0.0f || size > 1.0f) {
+ qWarning("Invalid size. Valid range for itemSize is 0.0f...1.0f");
+ } else if (size != dptr()->m_itemSize) {
+ dptr()->setItemSize(size);
+ emit itemSizeChanged(size);
+ }
+}
+
+float QScatter3DSeries::itemSize() const
+{
+ return dptrc()->m_itemSize;
+}
+
+/*!
* \return an invalid index for selection. Set this index to selectedItem property if you
* want to clear the selection.
*/
@@ -204,7 +234,8 @@ const QScatter3DSeriesPrivate *QScatter3DSeries::dptrc() const
QScatter3DSeriesPrivate::QScatter3DSeriesPrivate(QScatter3DSeries *q)
: QAbstract3DSeriesPrivate(q, QAbstract3DSeries::SeriesTypeScatter),
- m_selectedItem(Scatter3DController::invalidSelectionIndex())
+ m_selectedItem(Scatter3DController::invalidSelectionIndex()),
+ m_itemSize(0.0f)
{
m_itemLabelFormat = QStringLiteral("@valueTitle: @valueLabel");
m_mesh = QAbstract3DSeries::MeshSphere;
@@ -261,4 +292,11 @@ void QScatter3DSeriesPrivate::setSelectedItem(int index)
}
}
+void QScatter3DSeriesPrivate::setItemSize(float size)
+{
+ m_itemSize = size;
+ if (m_controller)
+ m_controller->markSeriesVisualsDirty();
+}
+
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/data/qscatter3dseries.h b/src/datavisualization/data/qscatter3dseries.h
index 8c28f3a6..1d9abc11 100644
--- a/src/datavisualization/data/qscatter3dseries.h
+++ b/src/datavisualization/data/qscatter3dseries.h
@@ -31,6 +31,7 @@ class QT_DATAVISUALIZATION_EXPORT QScatter3DSeries : public QAbstract3DSeries
Q_OBJECT
Q_PROPERTY(QScatterDataProxy *dataProxy READ dataProxy WRITE setDataProxy NOTIFY dataProxyChanged)
Q_PROPERTY(int selectedItem READ selectedItem WRITE setSelectedItem NOTIFY selectedItemChanged)
+ Q_PROPERTY(float itemSize READ itemSize WRITE setItemSize NOTIFY itemSizeChanged)
public:
explicit QScatter3DSeries(QObject *parent = 0);
@@ -42,11 +43,16 @@ public:
void setSelectedItem(int index);
int selectedItem() const;
+
+ void setItemSize(float size);
+ float itemSize() const;
+
Q_INVOKABLE int invalidSelectionIndex() const;
signals:
void dataProxyChanged(QScatterDataProxy *proxy);
void selectedItemChanged(int index);
+ void itemSizeChanged(float size);
protected:
explicit QScatter3DSeries(QScatter3DSeriesPrivate *d, QObject *parent = 0);
diff --git a/src/datavisualization/data/qscatter3dseries_p.h b/src/datavisualization/data/qscatter3dseries_p.h
index 0cf47bce..a09536c9 100644
--- a/src/datavisualization/data/qscatter3dseries_p.h
+++ b/src/datavisualization/data/qscatter3dseries_p.h
@@ -45,10 +45,12 @@ public:
virtual void connectControllerAndProxy(Abstract3DController *newController);
void setSelectedItem(int index);
+ void setItemSize(float size);
private:
QScatter3DSeries *qptr();
int m_selectedItem;
+ float m_itemSize;
private:
friend class QScatter3DSeries;
diff --git a/src/datavisualization/data/qscatterdataitem.cpp b/src/datavisualization/data/qscatterdataitem.cpp
index 480bc13b..2c0c0d5a 100644
--- a/src/datavisualization/data/qscatterdataitem.cpp
+++ b/src/datavisualization/data/qscatterdataitem.cpp
@@ -72,13 +72,11 @@ QScatterDataItem::~QScatterDataItem()
QScatterDataItem &QScatterDataItem::operator=(const QScatterDataItem &other)
{
m_position = other.m_position;
- //m_size = other.m_size;
if (other.d_ptr)
createExtraData();
else
d_ptr = 0;
- // TODO set extra data
return *this;
}
@@ -123,16 +121,6 @@ QScatterDataItem &QScatterDataItem::operator=(const QScatterDataItem &other)
* \return the Z component of the position of this data item.
*/
-//void QScatterDataItem::setSize(float size)
-//{
-// m_size = size;
-//}
-
-//const float &QScatterDataItem::size() const
-//{
-// return m_size;
-//}
-
/*!
* \internal
*/
diff --git a/src/datavisualization/data/qscatterdataitem.h b/src/datavisualization/data/qscatterdataitem.h
index ab6007db..7992864c 100644
--- a/src/datavisualization/data/qscatterdataitem.h
+++ b/src/datavisualization/data/qscatterdataitem.h
@@ -45,10 +45,6 @@ public:
inline float y() const { return m_position.y(); }
inline float z() const { return m_position.z(); }
- // TODO: Will we ever support item specific size? If not, remove.
- //void setSize(float size);
- //float size() const;
-
protected:
virtual void createExtraData();
@@ -56,7 +52,6 @@ protected:
private:
QVector3D m_position;
- //float m_size;
};
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index 11df55dd..f8b1df77 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -47,8 +47,10 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE
const GLfloat aspectRatio = 2.0f; // Forced ratio of x and z to y. Dynamic will make it look odd.
const GLfloat labelMargin = 0.05f;
-// TODO: Make margin modifiable?
-const GLfloat backgroundMargin = 1.1f; // Margin for background (1.1f = make it 10% larger to avoid items being drawn inside background)
+const GLfloat defaultMinSize = 0.01f;
+const GLfloat defaultMaxSize = 0.1f;
+const GLfloat defaultMargin = 1.0f + defaultMaxSize; // Default margin for background
+const GLfloat itemScaler = 3.0f;
const GLfloat gridLineWidth = 0.005f;
Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller)
@@ -85,7 +87,9 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller)
m_selectedSeries(0),
m_areaSize(QSizeF(0.0, 0.0)),
m_dotSizeScale(1.0f),
- m_hasHeightAdjustmentChanged(true)
+ m_hasHeightAdjustmentChanged(true),
+ m_backgroundMargin(defaultMargin),
+ m_maxItemSize(0.0f)
{
initializeOpenGLFunctions();
initializeOpenGL();
@@ -141,6 +145,26 @@ void Scatter3DRenderer::initializeOpenGL()
loadBackgroundMesh();
}
+void Scatter3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesList,
+ bool updateVisibility)
+{
+ Abstract3DRenderer::updateSeries(seriesList, updateVisibility);
+
+ int seriesCount = m_visibleSeriesList.size();
+ float maxItemSize = 0.0f;
+ float itemSize = 0.0f;
+
+ for (int series = 0; series < seriesCount; series++) {
+ itemSize = static_cast<QScatter3DSeries *>(m_visibleSeriesList.at(series).series())->itemSize();
+ if (maxItemSize < itemSize)
+ maxItemSize = itemSize;
+ }
+ m_backgroundMargin = defaultMargin;
+ m_maxItemSize = maxItemSize;
+ if (maxItemSize > defaultMaxSize)
+ m_backgroundMargin += maxItemSize / itemScaler;
+}
+
void Scatter3DRenderer::updateData()
{
int seriesCount = m_visibleSeriesList.size();
@@ -179,7 +203,8 @@ void Scatter3DRenderer::updateData()
}
}
}
- m_dotSizeScale = GLfloat(qBound(0.01f, 2.0f / float(qSqrt(qreal(totalDataSize))), 0.1f));
+ m_dotSizeScale = GLfloat(qBound(defaultMinSize, 2.0f / float(qSqrt(qreal(totalDataSize))),
+ defaultMaxSize));
updateSelectedItem(m_selectedItemIndex, m_selectedSeries);
}
@@ -270,17 +295,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
// Get light position from the scene
QVector3D lightPos = m_cachedScene->activeLight()->position();
- // Map adjustment direction to model matrix scaling
- // TODO: Let's use these for testing the autoscaling of dots based on their number
- GLfloat heightMultiplier = m_dotSizeScale; //1.0f;
- GLfloat widthMultiplier = m_dotSizeScale; //1.0f;
- GLfloat depthMultiplier = m_dotSizeScale; //1.0f;
- GLfloat heightScaler = 0.0f;
- GLfloat widthScaler = 0.0f;
- GLfloat depthScaler = 0.0f;
- QVector3D modelScaler(widthMultiplier + widthScaler,
- heightMultiplier + heightScaler,
- depthMultiplier + depthScaler);
// Introduce regardless of shadow quality to simplify logic
QMatrix4x4 depthViewMatrix;
QMatrix4x4 depthProjectionMatrix;
@@ -300,8 +314,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
if (havePointSeries) {
glEnable(GL_POINT_SMOOTH);
glEnable(GL_PROGRAM_POINT_SIZE);
- // Scale points based on shadow quality for shadows, not by zoom level
- glPointSize(m_dotSizeScale * 100.0f * m_shadowQualityMultiplier);
}
if (m_cachedShadowQuality > QDataVis::ShadowQualityNone) {
@@ -349,6 +361,18 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
for (int series = 0; series < seriesCount; series++) {
ObjectHelper *dotObj = m_visibleSeriesList.at(series).object();
bool drawingPoints = (m_visibleSeriesList.at(series).mesh() == QAbstract3DSeries::MeshPoint);
+
+ float itemSize =
+ static_cast<QScatter3DSeries *>(m_visibleSeriesList.at(series).series())->itemSize()
+ / itemScaler;
+ if (itemSize == 0.0f)
+ itemSize = m_dotSizeScale;
+ if (drawingPoints) {
+ // Scale points based on shadow quality for shadows, not by zoom level
+ glPointSize(itemSize * 100.0f * m_shadowQualityMultiplier);
+ }
+ QVector3D modelScaler(itemSize, itemSize, itemSize);
+
for (int dot = 0; dot < m_renderingArrays.at(series).size(); dot++) {
const ScatterRenderItem &item = m_renderingArrays.at(series).at(dot);
if (!item.isVisible())
@@ -358,13 +382,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
QMatrix4x4 MVPMatrix;
modelMatrix.translate(item.translation());
- if (!drawingPoints) {
+ if (!drawingPoints)
modelMatrix.scale(modelScaler);
- // TODO: Remove all references to item size?
- //modelMatrix.scale(QVector3D(widthMultiplier * item.size() + widthScaler,
- // heightMultiplier * item.size() + heightScaler,
- // depthMultiplier * item.size() + depthScaler));
- }
MVPMatrix = depthProjectionViewMatrix * modelMatrix;
@@ -423,9 +442,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
#endif
}
- if (havePointSeries)
- glPointSize(m_dotSizeScale * activeCamera->zoomLevel()); // Scale points based on zoom
-
ShaderHelper *pointSelectionShader = m_selectionShader;
#else
ShaderHelper *pointSelectionShader = m_pointShader;
@@ -451,6 +467,16 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
for (int series = 0; series < seriesCount; series++) {
ObjectHelper *dotObj = m_visibleSeriesList.at(series).object();
bool drawingPoints = (m_visibleSeriesList.at(series).mesh() == QAbstract3DSeries::MeshPoint);
+
+ float itemSize =
+ static_cast<QScatter3DSeries *>(m_visibleSeriesList.at(series).series())->itemSize()
+ / itemScaler;
+ if (itemSize == 0.0f)
+ itemSize = m_dotSizeScale;
+ if (drawingPoints)
+ glPointSize(itemSize * activeCamera->zoomLevel()); // Scale points based on zoom
+ QVector3D modelScaler(itemSize, itemSize, itemSize);
+
// Rebind selection shader if it has changed
if (drawingPoints != previousDrawingPoints) {
previousDrawingPoints = drawingPoints;
@@ -478,13 +504,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
QMatrix4x4 MVPMatrix;
modelMatrix.translate(item.translation());
- if (!drawingPoints) {
+ if (!drawingPoints)
modelMatrix.scale(modelScaler);
- // TODO: Remove all references to item size?
- //modelMatrix.scale(QVector3D(widthMultiplier * item.size() + widthScaler,
- // heightMultiplier * item.size() + heightScaler,
- // depthMultiplier * item.size() + depthScaler));
- }
MVPMatrix = projectionViewMatrix * modelMatrix;
@@ -587,6 +608,16 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
for (int series = 0; series < seriesCount; series++) {
ObjectHelper *dotObj = m_visibleSeriesList.at(series).object();
bool drawingPoints = (m_visibleSeriesList.at(series).mesh() == QAbstract3DSeries::MeshPoint);
+
+ float itemSize =
+ static_cast<QScatter3DSeries *>(m_visibleSeriesList.at(series).series())->itemSize()
+ / itemScaler;
+ if (itemSize == 0.0f)
+ itemSize = m_dotSizeScale;
+ if (drawingPoints)
+ glPointSize(itemSize * activeCamera->zoomLevel()); // Scale points based on zoom
+ QVector3D modelScaler(itemSize, itemSize, itemSize);
+
// Rebind selection shader if it has changed
if (drawingPoints != previousDrawingPoints) {
previousDrawingPoints = drawingPoints;
@@ -615,13 +646,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
if (!drawingPoints) {
modelMatrix.scale(modelScaler);
itModelMatrix.scale(modelScaler);
- // TODO: Remove all references to item size?
- //modelMatrix.scale(QVector3D(widthMultiplier * item.size() + widthScaler,
- // heightMultiplier * item.size() + heightScaler,
- // depthMultiplier * item.size() + depthScaler));
- //itModelMatrix.scale(QVector3D(widthMultiplier * item.size() + widthScaler,
- // heightMultiplier * item.size() + heightScaler,
- // depthMultiplier * item.size() + depthScaler));
}
#ifdef SHOW_DEPTH_TEXTURE_SCENE
MVPMatrix = depthProjectionViewMatrix * modelMatrix;
@@ -713,13 +737,17 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
QMatrix4x4 itModelMatrix;
#ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z
- QVector3D bgScale((aspectRatio * backgroundMargin * m_areaSize.width()) / m_scaleFactor,
- backgroundMargin,
- (aspectRatio * backgroundMargin * m_areaSize.height()) / m_scaleFactor);
+ GLfloat xScale = (aspectRatio * m_backgroundMargin * m_areaSize.width()) / m_scaleFactor;
+ GLfloat zScale = (aspectRatio * m_backgroundMargin * m_areaSize.height()) / m_scaleFactor;
+ if (m_maxItemSize > xScale)
+ xScale = m_maxItemSize;
+ if (m_maxItemSize > zScale)
+ zScale = m_maxItemSize;
+ QVector3D bgScale(xScale, m_backgroundMargin, zScale);
#else // ..and this if we want uniform scaling based on largest dimension
- QVector3D bgScale((aspectRatio * backgroundMargin),
- backgroundMargin,
- (aspectRatio * backgroundMargin));
+ QVector3D bgScale((aspectRatio * m_backgroundMargin),
+ m_backgroundMargin,
+ (aspectRatio * m_backgroundMargin));
#endif
modelMatrix.scale(bgScale);
// If we're viewing from below, background object must be flipped
@@ -826,7 +854,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
else
lineXRotation = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, -90.0f);
- GLfloat yFloorLinePosition = -backgroundMargin + gridLineOffset;
+ GLfloat yFloorLinePosition = -m_backgroundMargin + gridLineOffset;
if (m_yFlipped)
yFloorLinePosition = -yFloorLinePosition;
@@ -844,11 +872,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
#endif
#ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z
- QVector3D gridLineScaler(
- (aspectRatio * backgroundMargin * m_areaSize.width()) / m_scaleFactor,
- gridLineWidth, gridLineWidth);
+ GLfloat xScale = (aspectRatio * m_backgroundMargin * m_areaSize.width()) / m_scaleFactor;
+ 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 * backgroundMargin),
+ QVector3D gridLineScaler((aspectRatio * m_backgroundMargin),
gridLineWidth, gridLineWidth);
#endif
@@ -890,13 +919,15 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
}
// Side wall lines
- gridLineScaler = QVector3D(gridLineWidth, backgroundMargin, gridLineWidth);
+ gridLineScaler = QVector3D(gridLineWidth, m_backgroundMargin, gridLineWidth);
#ifndef USE_UNIFORM_SCALING
- GLfloat lineXTrans = (aspectRatio * backgroundMargin * m_areaSize.width())
+ GLfloat lineXTrans = (aspectRatio * m_backgroundMargin * m_areaSize.width())
/ m_scaleFactor - gridLineOffset;
+ if (m_maxItemSize > lineXTrans)
+ lineXTrans = m_maxItemSize - gridLineOffset;
linePos = -aspectRatio * (m_axisCacheZ.min() - m_translationOffset.z()); // Start line
#else
- GLfloat lineXTrans = aspectRatio * backgroundMargin - gridLineOffset;
+ GLfloat lineXTrans = aspectRatio * m_backgroundMargin - gridLineOffset;
linePos = -aspectRatio * m_scaleFactor; // Start line
#endif
if (!m_xFlipped)
@@ -947,15 +978,16 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
GLfloat lineStep = aspectRatio * m_axisCacheX.subSegmentStep();
GLfloat linePos = aspectRatio * (m_axisCacheX.min() - m_translationOffset.x());
int lastSegment = m_axisCacheX.subSegmentCount() * m_axisCacheX.segmentCount();
- QVector3D gridLineScaler(
- gridLineWidth, gridLineWidth,
- (aspectRatio * backgroundMargin * m_areaSize.height()) / m_scaleFactor);
+ GLfloat zScale = (aspectRatio * m_backgroundMargin * m_areaSize.height()) / m_scaleFactor;
+ if (m_maxItemSize > zScale)
+ zScale = m_maxItemSize;
+ QVector3D gridLineScaler(gridLineWidth, gridLineWidth, zScale);
#else
GLfloat lineStep = aspectRatio * axisCacheMax->subSegmentStep();
GLfloat linePos = -aspectRatio * m_scaleFactor;
int lastSegment = axisCacheMax->subSegmentCount() * axisCacheMax->segmentCount();
QVector3D gridLineScaler(gridLineWidth, gridLineWidth,
- aspectRatio * backgroundMargin);
+ aspectRatio * m_backgroundMargin);
#endif
for (int segment = 0; segment <= lastSegment; segment++) {
@@ -997,17 +1029,19 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
// Back wall lines
#ifndef USE_UNIFORM_SCALING
- GLfloat lineZTrans = (aspectRatio * backgroundMargin * m_areaSize.height())
+ GLfloat lineZTrans = (aspectRatio * m_backgroundMargin * m_areaSize.height())
/ m_scaleFactor - gridLineOffset;
+ if (m_maxItemSize > lineZTrans)
+ lineZTrans = m_maxItemSize - gridLineOffset;
linePos = aspectRatio * (m_axisCacheX.min() - m_translationOffset.x());
#else
- GLfloat lineZTrans = aspectRatio * backgroundMargin - gridLineOffset;
+ GLfloat lineZTrans = aspectRatio * m_backgroundMargin - gridLineOffset;
linePos = -aspectRatio * m_scaleFactor;
#endif
if (!m_zFlipped)
lineZTrans = -lineZTrans;
- gridLineScaler = QVector3D(gridLineWidth, backgroundMargin, gridLineWidth);
+ gridLineScaler = QVector3D(gridLineWidth, m_backgroundMargin, gridLineWidth);
for (int segment = 0; segment <= lastSegment; segment++) {
QMatrix4x4 modelMatrix;
@@ -1057,14 +1091,17 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
int lastSegment = m_axisCacheY.subSegmentCount() * m_axisCacheY.segmentCount();
#ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z
- GLfloat lineZTrans = (aspectRatio * backgroundMargin * m_areaSize.height())
+ GLfloat lineZTrans = (aspectRatio * m_backgroundMargin * m_areaSize.height())
/ m_scaleFactor - gridLineOffset;
- QVector3D gridLineScaler(
- (aspectRatio * backgroundMargin * m_areaSize.width() / m_scaleFactor),
- gridLineWidth, gridLineWidth);
+ if (m_maxItemSize > lineZTrans)
+ lineZTrans = m_maxItemSize - gridLineOffset;
+ GLfloat xScale = (aspectRatio * m_backgroundMargin * m_areaSize.width()) / m_scaleFactor;
+ 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 * backgroundMargin - gridLineOffset;
- QVector3D gridLineScaler((aspectRatio * backgroundMargin),
+ GLfloat lineZTrans = aspectRatio * m_backgroundMargin - gridLineOffset;
+ QVector3D gridLineScaler((aspectRatio * m_backgroundMargin),
gridLineWidth, gridLineWidth);
#endif
if (!m_zFlipped)
@@ -1113,15 +1150,19 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
linePos = m_axisCacheY.min() - m_translationOffset.y();
lastSegment = m_axisCacheY.subSegmentCount() * m_axisCacheY.segmentCount();
#ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z
- GLfloat lineXTrans = (aspectRatio * backgroundMargin * m_areaSize.width())
+ GLfloat lineXTrans = (aspectRatio * m_backgroundMargin * m_areaSize.width())
/ m_scaleFactor - gridLineOffset;
- gridLineScaler = QVector3D(
- gridLineWidth, gridLineWidth,
- (aspectRatio * backgroundMargin * m_areaSize.height()) / m_scaleFactor);
+ if (m_maxItemSize > lineXTrans)
+ lineXTrans = m_maxItemSize - gridLineOffset;
+ GLfloat zScale = (aspectRatio * m_backgroundMargin * m_areaSize.height())
+ / m_scaleFactor;
+ 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 * backgroundMargin - gridLineOffset;
+ GLfloat lineXTrans = aspectRatio * m_backgroundMargin - gridLineOffset;
gridLineScaler = QVector3D(gridLineWidth, gridLineWidth,
- aspectRatio * backgroundMargin);
+ aspectRatio * m_backgroundMargin);
#endif
if (!m_xFlipped)
lineXTrans = -lineXTrans;
@@ -1185,16 +1226,18 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
GLfloat posStep = aspectRatio * m_axisCacheZ.segmentStep();
GLfloat labelPos = -aspectRatio * (m_axisCacheZ.min() - m_translationOffset.z());
int lastSegment = m_axisCacheZ.segmentCount();
- GLfloat labelXTrans = (aspectRatio * backgroundMargin * m_areaSize.width())
+ GLfloat labelXTrans = (aspectRatio * m_backgroundMargin * m_areaSize.width())
/ m_scaleFactor + labelMargin;
+ if (m_maxItemSize > labelXTrans)
+ labelXTrans = m_maxItemSize + labelMargin;
#else
GLfloat posStep = aspectRatio * axisCacheMax->segmentStep();
GLfloat labelPos = aspectRatio * m_scaleFactor;
int lastSegment = axisCacheMax->segmentCount();
- GLfloat labelXTrans = aspectRatio * backgroundMargin + labelMargin;
+ GLfloat labelXTrans = aspectRatio * m_backgroundMargin + labelMargin;
#endif
int labelNbr = 0;
- GLfloat labelYTrans = -backgroundMargin;
+ GLfloat labelYTrans = -m_backgroundMargin;
GLfloat rotLabelX = -90.0f;
GLfloat rotLabelY = 0.0f;
GLfloat rotLabelZ = 0.0f;
@@ -1245,16 +1288,18 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
GLfloat posStep = aspectRatio * m_axisCacheX.segmentStep();
GLfloat labelPos = aspectRatio * (m_axisCacheX.min() - m_translationOffset.x());
int lastSegment = m_axisCacheX.segmentCount();
- GLfloat labelZTrans = (aspectRatio * backgroundMargin * m_areaSize.height())
+ GLfloat labelZTrans = (aspectRatio * m_backgroundMargin * m_areaSize.height())
/ m_scaleFactor + labelMargin;
+ if (m_maxItemSize > labelZTrans)
+ labelZTrans = m_maxItemSize + labelMargin;
#else
GLfloat posStep = aspectRatio * axisCacheMax->segmentStep();
GLfloat labelPos = -aspectRatio * m_scaleFactor;
int lastSegment = axisCacheMax->segmentCount();
- GLfloat labelZTrans = aspectRatio * backgroundMargin + labelMargin;
+ GLfloat labelZTrans = aspectRatio * m_backgroundMargin + labelMargin;
#endif
int labelNbr = 0;
- GLfloat labelYTrans = -backgroundMargin;
+ GLfloat labelYTrans = -m_backgroundMargin;
GLfloat rotLabelX = -90.0f;
GLfloat rotLabelY = 90.0f;
GLfloat rotLabelZ = 0.0f;
@@ -1305,12 +1350,16 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
GLfloat labelPos = m_axisCacheY.min() - m_translationOffset.y();
int labelNbr = 0;
#ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z
- GLfloat labelXTrans = (aspectRatio * backgroundMargin * m_areaSize.width())
+ GLfloat labelXTrans = (aspectRatio * m_backgroundMargin * m_areaSize.width())
/ m_scaleFactor;
- GLfloat labelZTrans = (aspectRatio * backgroundMargin * m_areaSize.height())
+ GLfloat labelZTrans = (aspectRatio * m_backgroundMargin * m_areaSize.height())
/ m_scaleFactor;
+ 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 * backgroundMargin;
+ GLfloat labelXTrans = aspectRatio * m_backgroundMargin;
GLfloat labelZTrans = labelXTrans;
#endif
// Back wall init
diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h
index 0eb84c84..989e3016 100644
--- a/src/datavisualization/engine/scatter3drenderer_p.h
+++ b/src/datavisualization/engine/scatter3drenderer_p.h
@@ -90,11 +90,14 @@ private:
bool m_hasHeightAdjustmentChanged;
ScatterRenderItem m_dummyRenderItem;
QVector<ScatterRenderItemArray> m_renderingArrays;
+ GLfloat m_backgroundMargin;
+ GLfloat m_maxItemSize;
public:
explicit Scatter3DRenderer(Scatter3DController *controller);
~Scatter3DRenderer();
+ void updateSeries(const QList<QAbstract3DSeries *> &seriesList, bool updateVisibility);
void updateData();
void updateScene(Q3DScene *scene);