summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-11-01 09:53:20 +0200
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-11-01 13:07:06 +0200
commit90ecf703af76a4dbca65d0150dcce48b73d40c58 (patch)
tree419f5547fec31f3f735d4d8a43b852ccd9c0be13 /src
parentb9da2b74fe6f29f602ad700554527018174761c9 (diff)
Support for non-zero centered data in scatter
Task-number: QTRD-2311 Change-Id: I12a60b2d10dd6706d5303cdf127a54f05a819780 Change-Id: I12a60b2d10dd6706d5303cdf127a54f05a819780 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/datavisualization/data/qscatterdataproxy.cpp57
-rw-r--r--src/datavisualization/data/qscatterdataproxy_p.h2
-rw-r--r--src/datavisualization/engine/scatter3dcontroller.cpp22
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp42
-rw-r--r--src/datavisualization/engine/scatter3drenderer_p.h1
5 files changed, 79 insertions, 45 deletions
diff --git a/src/datavisualization/data/qscatterdataproxy.cpp b/src/datavisualization/data/qscatterdataproxy.cpp
index c9bd56d7..c5559e9c 100644
--- a/src/datavisualization/data/qscatterdataproxy.cpp
+++ b/src/datavisualization/data/qscatterdataproxy.cpp
@@ -346,22 +346,51 @@ void QScatterDataProxyPrivate::removeItems(int index, int removeCount)
m_dataArray->remove(index, removeCount);
}
-QVector3D QScatterDataProxyPrivate::limitValues()
+void QScatterDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxValues)
{
- QVector3D limits;
- for (int i = 0; i < m_dataArray->size(); i++) {
- const QScatterDataItem &item = m_dataArray->at(i);
- float xValue = qAbs(item.position().x());
- if (limits.x() < xValue)
- limits.setX(xValue);
- float yValue = qAbs(item.position().y());
- if (limits.y() < yValue)
- limits.setY(yValue);
- float zValue = qAbs(item.position().z());
- if (limits.z() < zValue)
- limits.setZ(zValue);
+ if (m_dataArray->isEmpty())
+ return;
+
+ const QVector3D &firstPos = m_dataArray->at(0).position();
+
+ float minX = firstPos.x();
+ float maxX = minX;
+ float minY = firstPos.y();
+ float maxY = minY;
+ float minZ = firstPos.z();
+ float maxZ = minZ;
+
+ if (m_dataArray->size() > 1) {
+ for (int i = 1; i < m_dataArray->size(); i++) {
+ const QVector3D &pos = m_dataArray->at(i).position();
+
+ float value = pos.x();
+ if (minX > value)
+ minX = value;
+ if (maxX < value)
+ maxX = value;
+
+ value = pos.y();
+ if (minY > value)
+ minY = value;
+ if (maxY < value)
+ maxY = value;
+
+ value = pos.z();
+ if (minZ > value)
+ minZ = value;
+ if (maxZ < value)
+ maxZ = value;
+ }
}
- return limits;
+
+ minValues.setX(minX);
+ minValues.setY(minY);
+ minValues.setZ(minZ);
+
+ maxValues.setX(maxX);
+ maxValues.setY(maxY);
+ maxValues.setZ(maxZ);
}
QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/data/qscatterdataproxy_p.h b/src/datavisualization/data/qscatterdataproxy_p.h
index 9920e3a7..24b5eb67 100644
--- a/src/datavisualization/data/qscatterdataproxy_p.h
+++ b/src/datavisualization/data/qscatterdataproxy_p.h
@@ -51,7 +51,7 @@ public:
void insertItems(int index, const QScatterDataArray &items);
void removeItems(int index, int removeCount);
- QVector3D limitValues();
+ void limitValues(QVector3D &minValues, QVector3D &maxValues);
private:
QScatterDataArray *m_dataArray;
diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp
index ca16a34b..1b865adc 100644
--- a/src/datavisualization/engine/scatter3dcontroller.cpp
+++ b/src/datavisualization/engine/scatter3dcontroller.cpp
@@ -241,30 +241,32 @@ int Scatter3DController::selectedItemIndex() const
void Scatter3DController::adjustValueAxisRange()
{
+ QVector3D minLimits;
+ QVector3D maxLimits;
if (m_data) {
- QVector3D limits = static_cast<QScatterDataProxy *>(m_data)->dptr()->limitValues();
+ static_cast<QScatterDataProxy *>(m_data)->dptr()->limitValues(minLimits, maxLimits);
Q3DValueAxis *valueAxis = static_cast<Q3DValueAxis *>(m_axisX);
if (valueAxis && valueAxis->isAutoAdjustRange()) {
- if (limits.x() > 0)
- valueAxis->dptr()->setRange(-limits.x(), limits.x());
+ if (minLimits.x() != maxLimits.x())
+ valueAxis->dptr()->setRange(minLimits.x(), maxLimits.x());
else
- valueAxis->dptr()->setRange(-1.0, 1.0); // Only zero value values in data set, set range to default.
+ valueAxis->dptr()->setRange(minLimits.x() - 1.0f, minLimits.x() + 1.0f); // Default to a valid range
}
valueAxis = static_cast<Q3DValueAxis *>(m_axisY);
if (valueAxis && valueAxis->isAutoAdjustRange()) {
- if (limits.y() > 0)
- valueAxis->dptr()->setRange(-limits.y(), limits.y());
+ if (minLimits.y() != maxLimits.y())
+ valueAxis->dptr()->setRange(minLimits.y(), maxLimits.y());
else
- valueAxis->dptr()->setRange(-1.0, 1.0); // Only zero value values in data set, set range to default.
+ valueAxis->dptr()->setRange(minLimits.y() - 1.0f, minLimits.y() + 1.0f); // Default to a valid range
}
valueAxis = static_cast<Q3DValueAxis *>(m_axisZ);
if (valueAxis && valueAxis->isAutoAdjustRange()) {
- if (limits.z() > 0)
- valueAxis->dptr()->setRange(-limits.z(), limits.z());
+ if (minLimits.z() != maxLimits.z())
+ valueAxis->dptr()->setRange(minLimits.z(), maxLimits.z());
else
- valueAxis->dptr()->setRange(-1.0, 1.0); // Only zero value values in data set, set range to default.
+ valueAxis->dptr()->setRange(minLimits.z() - 1.0f, minLimits.z() + 1.0f); // Default to a valid range
}
}
}
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index f0534c77..285560e3 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -696,7 +696,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
// Floor lines
#ifndef USE_UNIFORM_SCALING
GLfloat lineStep = aspectRatio * m_axisCacheZ.subSegmentStep();
- GLfloat linePos = -aspectRatio * m_axisCacheZ.min(); // Start line
+ GLfloat linePos = -aspectRatio * (m_axisCacheZ.min() - m_translationOffset.z()); // Start line
int lastSegment = m_axisCacheZ.subSegmentCount() * m_axisCacheZ.segmentCount();
#else
GLfloat lineStep = aspectRatio * axisCacheMax->subSegmentStep();
@@ -755,7 +755,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
#ifndef USE_UNIFORM_SCALING
GLfloat lineXTrans = (aspectRatio * backgroundMargin * m_areaSize.width())
/ m_scaleFactor - gridLineOffset;
- linePos = -aspectRatio * m_axisCacheZ.min(); // Start line
+ linePos = -aspectRatio * (m_axisCacheZ.min() - m_translationOffset.z()); // Start line
#else
GLfloat lineXTrans = aspectRatio * backgroundMargin - gridLineOffset;
linePos = -aspectRatio * m_scaleFactor; // Start line
@@ -806,7 +806,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
// Floor lines
#ifndef USE_UNIFORM_SCALING
GLfloat lineStep = aspectRatio * m_axisCacheX.subSegmentStep();
- GLfloat linePos = aspectRatio * m_axisCacheX.min();
+ GLfloat linePos = aspectRatio * (m_axisCacheX.min() - m_translationOffset.x());
int lastSegment = m_axisCacheX.subSegmentCount() * m_axisCacheX.segmentCount();
QVector3D gridLineScaler(
gridLineWidth, gridLineWidth,
@@ -860,7 +860,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
#ifndef USE_UNIFORM_SCALING
GLfloat lineZTrans = (aspectRatio * backgroundMargin * m_areaSize.height())
/ m_scaleFactor - gridLineOffset;
- linePos = aspectRatio * m_axisCacheX.min();
+ linePos = aspectRatio * (m_axisCacheX.min() - m_translationOffset.x());
#else
GLfloat lineZTrans = aspectRatio * backgroundMargin - gridLineOffset;
linePos = -aspectRatio * m_scaleFactor;
@@ -914,7 +914,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
if (m_axisCacheY.segmentCount() > 0) {
// Back wall
GLfloat lineStep = m_axisCacheY.subSegmentStep();
- GLfloat linePos = m_axisCacheY.min();
+ GLfloat linePos = m_axisCacheY.min() - m_translationOffset.y();
int lastSegment = m_axisCacheY.subSegmentCount() * m_axisCacheY.segmentCount();
#ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z
@@ -971,7 +971,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
}
// Side wall
- linePos = m_axisCacheY.min();
+ 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())
@@ -1044,7 +1044,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
if (m_axisCacheZ.segmentCount() > 0) {
#ifndef USE_UNIFORM_SCALING
GLfloat posStep = aspectRatio * m_axisCacheZ.segmentStep();
- GLfloat labelPos = -aspectRatio * m_axisCacheZ.min();
+ GLfloat labelPos = -aspectRatio * (m_axisCacheZ.min() - m_translationOffset.z());
int lastSegment = m_axisCacheZ.segmentCount();
GLfloat labelXTrans = (aspectRatio * backgroundMargin * m_areaSize.width())
/ m_scaleFactor + labelMargin;
@@ -1104,7 +1104,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
if (m_axisCacheX.segmentCount() > 0) {
#ifndef USE_UNIFORM_SCALING
GLfloat posStep = aspectRatio * m_axisCacheX.segmentStep();
- GLfloat labelPos = aspectRatio * m_axisCacheX.min();
+ GLfloat labelPos = aspectRatio * (m_axisCacheX.min() - m_translationOffset.x());
int lastSegment = m_axisCacheX.segmentCount();
GLfloat labelZTrans = (aspectRatio * backgroundMargin * m_areaSize.height())
/ m_scaleFactor + labelMargin;
@@ -1163,7 +1163,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
// Y Labels
if (m_axisCacheY.segmentCount() > 0) {
GLfloat posStep = m_axisCacheY.segmentStep();
- GLfloat labelPos = m_axisCacheY.min();
+ 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())
@@ -1423,24 +1423,26 @@ void Scatter3DRenderer::updateAxisRange(Q3DAbstractAxis::AxisOrientation orienta
void Scatter3DRenderer::calculateTranslation(ScatterRenderItem &item)
{
- // Origin should be in the center of scene, ie. both positive and negative values are drawn
- // above background
-
// We need to normalize translations
- GLfloat xTrans = (aspectRatio * item.position().x()) / m_scaleFactor;
- GLfloat zTrans = -(aspectRatio * item.position().z()) / m_scaleFactor;
- GLfloat yTrans = item.position().y() / m_heightNormalizer;
+ GLfloat xTrans = (aspectRatio * (item.position().x() - m_translationOffset.x()))
+ / m_scaleFactor;
+ GLfloat zTrans = -(aspectRatio * (item.position().z() - m_translationOffset.z()))
+ / m_scaleFactor;
+ GLfloat yTrans = (item.position().y() - m_translationOffset.y()) / m_heightNormalizer;
item.setTranslation(QVector3D(xTrans, yTrans, zTrans));
- //qDebug() << item.translation();
}
void Scatter3DRenderer::calculateSceneScalingFactors()
{
- m_heightNormalizer = (GLfloat)qMax(qAbs(m_axisCacheY.max()), qAbs(m_axisCacheY.min()));
- m_areaSize.setHeight(qMax(qAbs(m_axisCacheZ.max()), qAbs(m_axisCacheZ.min())));
- m_areaSize.setWidth(qMax(qAbs(m_axisCacheX.max()), qAbs(m_axisCacheX.min())));
+ m_heightNormalizer = GLfloat(m_axisCacheY.max() - m_axisCacheY.min()) / 2.0f;
+ m_areaSize.setHeight((m_axisCacheZ.max() - m_axisCacheZ.min()) / 2.0f);
+ m_areaSize.setWidth((m_axisCacheX.max() - m_axisCacheX.min()) / 2.0f);
m_scaleFactor = qMax(m_areaSize.width(), m_areaSize.height());
- //qDebug() << m_heightNormalizer << m_areaSize << m_scaleFactor << m_axisCacheY.max() << m_axisCacheX.max() << m_axisCacheZ.max();
+
+ // Calculate translation offsets
+ m_translationOffset = QVector3D((m_axisCacheX.max() + m_axisCacheX.min()) / 2.0f,
+ (m_axisCacheY.max() + m_axisCacheY.min()) / 2.0f,
+ (m_axisCacheZ.max() + m_axisCacheZ.min()) / 2.0f);
}
QRect Scatter3DRenderer::mainViewPort()
diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h
index 4cfc5b7b..fc69094f 100644
--- a/src/datavisualization/engine/scatter3drenderer_p.h
+++ b/src/datavisualization/engine/scatter3drenderer_p.h
@@ -82,6 +82,7 @@ private:
int m_selectedItemIndex;
QSizeF m_areaSize;
GLfloat m_dotSizeScale;
+ QVector3D m_translationOffset;
bool m_hasHeightAdjustmentChanged;
ScatterRenderItem m_dummyRenderItem;