summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-10-01 10:14:50 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-10-01 10:31:45 +0300
commitff512434c8272989ff08c027cccd1460f8808756 (patch)
treea6afefa25193f6f589cc4c052158c4e184346c46
parent50ea77c890b3fd9b07a5d8ce57a44f4176e810da (diff)
Fix kinect demo scatter artifacts - also speeds up scatter
+minor optimization to scatter renderer Change-Id: Iee3f52642a43ec9348edec6bde9d247c5d171e04 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp15
-rw-r--r--tests/kinectsurface/surfacedata.cpp6
2 files changed, 16 insertions, 5 deletions
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index 28359c5a..25173c89 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -143,13 +143,22 @@ void Scatter3DRenderer::updateDataModel(QScatterDataProxy *dataProxy)
const QScatterDataArray &dataArray = *dataProxy->array();
calculateSceneScalingFactors();
int dataSize = dataArray.size();
+ float minX = float(m_axisCacheX.min());
+ float maxX = float(m_axisCacheX.max());
+ float minY = float(m_axisCacheY.min());
+ float maxY = float(m_axisCacheY.max());
+ float minZ = float(m_axisCacheZ.min());
+ float maxZ = float(m_axisCacheZ.max());
+
if (dataSize != m_renderItemArray.size())
m_renderItemArray.resize(dataSize);
for (int i = 0; i < dataSize ; i++) {
QVector3D dotPos = dataArray.at(i).position();
- if ((dotPos.x() >= m_axisCacheX.min() && dotPos.x() <= m_axisCacheX.max())
- && (dotPos.y() >= m_axisCacheY.min() && dotPos.y() <= m_axisCacheY.max())
- && (dotPos.z() >= m_axisCacheZ.min() && dotPos.z() <= m_axisCacheZ.max())) {
+ // TODO: Check if this still works always when ranges are no longer required to be zero centered
+ // TODO: qreal -> float conversion for axis min/max may cause issues like in surface
+ if ((dotPos.x() >= minX && dotPos.x() <= maxX )
+ && (dotPos.y() >= minY && dotPos.y() <= maxY)
+ && (dotPos.z() >= minZ && dotPos.z() <= maxZ)) {
m_renderItemArray[i].setPosition(dotPos);
m_renderItemArray[i].setVisible(true);
calculateTranslation(m_renderItemArray[i]);
diff --git a/tests/kinectsurface/surfacedata.cpp b/tests/kinectsurface/surfacedata.cpp
index 45aa68c9..999ccfce 100644
--- a/tests/kinectsurface/surfacedata.cpp
+++ b/tests/kinectsurface/surfacedata.cpp
@@ -258,12 +258,12 @@ void SurfaceData::setData(const QImage &image)
int widthBits = imageWidth * 4;
if (m_mode == Scatter) {
- QScatterDataArray *dataArray = m_scatterDataArray;
- QScatterDataItem *ptrToDataArray = &dataArray->first();
+ QScatterDataItem *ptrToDataArray = &m_scatterDataArray->first();
int limitsX = imageWidth / 2;
int limitsZ = imageHeight / 2;
qreal height = 0;
+ int count = 0;
for (int i = -limitsZ; i < limitsZ; i++, bitCount -= widthBits) {
for (int j = -limitsX; j < limitsX; j++) {
@@ -271,10 +271,12 @@ void SurfaceData::setData(const QImage &image)
if (height > -128) {
ptrToDataArray->setPosition(QVector3D(qreal(j), height, qreal(i)));
ptrToDataArray++;
+ count++;
}
}
}
+ QScatterDataArray *dataArray = new QScatterDataArray(m_scatterDataArray->mid(0, count));
static_cast<QScatterDataProxy *>(m_scatter->activeDataProxy())->resetArray(dataArray);
} else {
QBarDataArray *dataArray = m_barDataArray;