summaryrefslogtreecommitdiffstats
path: root/src/datavis3d
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-04-19 13:17:41 +0300
committerMika Salmela <mika.salmela@digia.com>2013-04-19 17:23:09 +0300
commit603afaebc81b8240657b58a1a349c2027a622ef3 (patch)
treef666047feb9f534c239e9eb9a967cb47bdc483bb /src/datavis3d
parent9c5557a2ba453564ec96165d0c54752b94c21578 (diff)
Crash fix
..when returning from zoom view and there were no label items for rows/columns Change-Id: Ia9b5da595185adf6ef3fff3c8c926f1b36f8eb8e Change-Id: Ia9b5da595185adf6ef3fff3c8c926f1b36f8eb8e Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com> Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Diffstat (limited to 'src/datavis3d')
-rw-r--r--src/datavis3d/engine/q3dbars.cpp88
-rw-r--r--src/datavis3d/engine/qdataset.cpp12
-rw-r--r--src/datavis3d/utils/texturehelper.cpp4
3 files changed, 61 insertions, 43 deletions
diff --git a/src/datavis3d/engine/q3dbars.cpp b/src/datavis3d/engine/q3dbars.cpp
index e5bf1632..175e2902 100644
--- a/src/datavis3d/engine/q3dbars.cpp
+++ b/src/datavis3d/engine/q3dbars.cpp
@@ -62,7 +62,7 @@
#include <QDebug>
-//#define DISPLAY_RENDER_SPEED
+#define DISPLAY_RENDER_SPEED
#ifdef DISPLAY_RENDER_SPEED
#include <QTime>
@@ -352,7 +352,7 @@ void Q3DBars::drawZoomScene()
else
barPosX = -(item->d_ptr->translation().z() - zComp); // flip z; frontmost bar to the left
modelMatrix.translate(barPosX,
- item->d_ptr->translation().y() - 0.5f,// TODO: Needs a better system; calculate y position modifier somehow
+ item->d_ptr->translation().y(), // TODO: Needs a better system; calculate y position modifier somehow (based on highest bar height?)
zComp);
modelMatrix.scale(QVector3D(d_ptr->m_scaleX, barHeight, d_ptr->m_scaleZ));
@@ -499,9 +499,7 @@ void Q3DBars::drawZoomScene()
}
}
}
- // Check if there is a label before drawing
- if (labelItem.textureId() > 0)
- drawLabel(*item, labelItem, viewMatrix, projectionMatrix, false, -45.0f, LabelBelow);
+ drawLabel(*item, labelItem, viewMatrix, projectionMatrix, false, -45.0f, LabelBelow);
}
glDisable(GL_TEXTURE_2D);
@@ -826,11 +824,14 @@ void Q3DBars::drawScene()
// Insert data to QDataItem. We have no ownership, don't delete the previous one
if (!d_ptr->m_zoomActivated) {
d_ptr->m_selectedBar = item;
- d_ptr->m_selectedBar->d_ptr->setPosition(
- QPoint(d_ptr->m_dataSet->d_ptr->rowLabelItems().size()
- - row - 1,
- d_ptr->m_dataSet->d_ptr->columnLabelItems().size()
- - bar - 1));
+ if (d_ptr->m_dataSet->d_ptr->rowLabelItems().size() > row
+ && d_ptr->m_dataSet->d_ptr->columnLabelItems().size() > bar) {
+ d_ptr->m_selectedBar->d_ptr->setPosition(
+ QPoint(d_ptr->m_dataSet->d_ptr->rowLabelItems().size()
+ - row - 1,
+ d_ptr->m_dataSet->d_ptr->columnLabelItems().size()
+ - bar - 1));
+ }
#ifdef USE_PAINTER_TEXT
QSize mousePositionAsSize = QSize(d_ptr->m_mousePos.x(),
d_ptr->m_mousePos.y());
@@ -854,10 +855,12 @@ void Q3DBars::drawScene()
if (!d_ptr->m_zoomActivated && ZoomRow == d_ptr->m_selectionMode) {
item->d_ptr->setTranslation(modelMatrix.column(3).toVector3D());
d_ptr->m_zoomSelection->addItem(item);
- d_ptr->m_zoomSelection->d_ptr->setLabelItem(
- d_ptr->m_dataSet->d_ptr->rowLabelItems().at(
- d_ptr->m_dataSet->d_ptr->rowLabelItems().size()
- - row - 1));
+ if (d_ptr->m_dataSet->d_ptr->rowLabelItems().size() > row) {
+ d_ptr->m_zoomSelection->d_ptr->setLabelItem(
+ d_ptr->m_dataSet->d_ptr->rowLabelItems().at(
+ d_ptr->m_dataSet->d_ptr->rowLabelItems().size()
+ - row - 1));
+ }
}
break;
}
@@ -869,10 +872,12 @@ void Q3DBars::drawScene()
if (!d_ptr->m_zoomActivated && ZoomColumn == d_ptr->m_selectionMode) {
item->d_ptr->setTranslation(modelMatrix.column(3).toVector3D());
d_ptr->m_zoomSelection->addItem(item);
- d_ptr->m_zoomSelection->d_ptr->setLabelItem(
- d_ptr->m_dataSet->d_ptr->columnLabelItems().at(
- d_ptr->m_dataSet->d_ptr->columnLabelItems().size()
- - bar - 1));
+ if (d_ptr->m_dataSet->d_ptr->columnLabelItems().size() > bar) {
+ d_ptr->m_zoomSelection->d_ptr->setLabelItem(
+ d_ptr->m_dataSet->d_ptr->columnLabelItems().at(
+ d_ptr->m_dataSet->d_ptr->columnLabelItems().size()
+ - bar - 1));
+ }
}
break;
}
@@ -947,14 +952,19 @@ void Q3DBars::drawScene()
LabelItem labelItem = d_ptr->m_selectedBar->d_ptr->selectionLabel();
if (firstSelection || prevItem != d_ptr->m_selectedBar) {
QString labelText = d_ptr->m_selectedBar->d_ptr->valueStr();
- labelText.append(QStringLiteral(" ("));
- labelText.append(d_ptr->m_dataSet->d_ptr->rowLabels().at(
- d_ptr->m_selectedBar->d_ptr->position().x()));
- labelText.append(QStringLiteral(", "));
- labelText.append(d_ptr->m_dataSet->d_ptr->columnLabels().at(
- d_ptr->m_selectedBar->d_ptr->position().y()));
- labelText.append(QStringLiteral(")"));
- //qDebug() << labelText;
+ if ((d_ptr->m_dataSet->d_ptr->columnLabels().size()
+ > d_ptr->m_selectedBar->d_ptr->position().y())
+ && (d_ptr->m_dataSet->d_ptr->rowLabels().size()
+ > d_ptr->m_selectedBar->d_ptr->position().x())) {
+ labelText.append(QStringLiteral(" ("));
+ labelText.append(d_ptr->m_dataSet->d_ptr->rowLabels().at(
+ d_ptr->m_selectedBar->d_ptr->position().x()));
+ labelText.append(QStringLiteral(", "));
+ labelText.append(d_ptr->m_dataSet->d_ptr->columnLabels().at(
+ d_ptr->m_selectedBar->d_ptr->position().y()));
+ labelText.append(QStringLiteral(")"));
+ //qDebug() << labelText;
+ }
d_ptr->m_drawer->generateLabelItem(&labelItem, labelText);
d_ptr->m_selectedBar->d_ptr->setSelectionLabel(labelItem);
prevItem = d_ptr->m_selectedBar;
@@ -982,19 +992,23 @@ void Q3DBars::drawLabel(const QDataItem &item, const LabelItem &label,
bool useDepth, qreal rotation, Q3DBars::LabelPosition position)
{
// Draw label
+ LabelItem labelItem = label;
+ if (!labelItem.textureId())
+ return; // No texture, skip
+
+ QSize textureSize = labelItem.size();
QMatrix4x4 modelMatrix;
QMatrix4x4 MVPMatrix;
GLfloat xPosition;
GLfloat yPosition;
GLfloat zPosition = zComp;
- LabelItem labelItem = label;
- QSize textureSize = labelItem.size();
+
switch (position) {
case Q3DBars::LabelBelow:
{
- yPosition = -1.5f;
- if (!useDepth)
- yPosition -= 0.25f;
+ yPosition = -1.25f;
+ //if (!useDepth)
+ // yPosition -= 0.25f;
break;
}
case Q3DBars::LabelLow:
@@ -1017,31 +1031,31 @@ void Q3DBars::drawLabel(const QDataItem &item, const LabelItem &label,
{
yPosition = item.d_ptr->translation().y()
+ (item.d_ptr->value() / d_ptr->m_heightNormalizer) + 0.1f;
- if (!useDepth)
- yPosition -= 0.5f;
+ //if (!useDepth)
+ // yPosition -= 0.25f;
break;
}
case Q3DBars::LabelBottom:
{
- yPosition = -2.0f; // TODO: Calculate from scene
+ yPosition = -1.9f; // TODO: Calculate from scene
xPosition = 0.0f;
break;
}
case Q3DBars::LabelTop:
{
- yPosition = 0.75f; // TODO: Calculate from scene
+ yPosition = 1.5f; // TODO: Calculate from scene
xPosition = 0.0f;
break;
}
case Q3DBars::LabelLeft:
{
- yPosition = -0.625f; // TODO: Calculate from scene
+ yPosition = -0.2f; // TODO: Calculate from scene
xPosition = -2.5f; // TODO: Calculate from scene
break;
}
case Q3DBars::LabelRight:
{
- yPosition = -0.625f; // TODO: Calculate from scene
+ yPosition = -0.2f; // TODO: Calculate from scene
xPosition = 2.5f; // TODO: Calculate from scene
break;
}
diff --git a/src/datavis3d/engine/qdataset.cpp b/src/datavis3d/engine/qdataset.cpp
index 4a04a39c..effe92d2 100644
--- a/src/datavis3d/engine/qdataset.cpp
+++ b/src/datavis3d/engine/qdataset.cpp
@@ -51,6 +51,8 @@
QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE
+const QString empty;
+
QDataSet::QDataSet()
: d_ptr(new QDataSetPrivate(this))
{
@@ -68,7 +70,6 @@ void QDataSet::setLabels(const QString &xAxis,
const QVector<QString> &labelsRow,
const QVector<QString> &labelsColumn)
{
- QString empty;
// skip empty labels, keep the previous ones
if (xAxis != empty && d_ptr->m_xAxis != xAxis) {
d_ptr->m_xAxis = xAxis;
@@ -247,9 +248,12 @@ float QDataSetPrivate::highestValue()
void QDataSetPrivate::updateTextures()
{
- m_drawer->generateLabelItem(&m_xAxisItem, m_xAxis);
- m_drawer->generateLabelItem(&m_zAxisItem, m_zAxis);
- m_drawer->generateLabelItem(&m_yAxisItem, m_yAxis);
+ if (m_xAxis != empty)
+ m_drawer->generateLabelItem(&m_xAxisItem, m_xAxis);
+ if (m_zAxis != empty)
+ m_drawer->generateLabelItem(&m_zAxisItem, m_zAxis);
+ if (m_yAxis != empty)
+ m_drawer->generateLabelItem(&m_yAxisItem, m_yAxis);
for (int itemCount = 0; itemCount < m_labelsColumn.size(); itemCount++) {
if (m_labelItemsColumn.size() < itemCount + 1)
m_labelItemsColumn.append(LabelItem());
diff --git a/src/datavis3d/utils/texturehelper.cpp b/src/datavis3d/utils/texturehelper.cpp
index 1cb245cc..37779121 100644
--- a/src/datavis3d/utils/texturehelper.cpp
+++ b/src/datavis3d/utils/texturehelper.cpp
@@ -153,14 +153,14 @@ GLuint TextureHelper::createSelectionTexture(const QSize &size, GLuint &frameBuf
glBindTexture(GL_TEXTURE_2D, textureid);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, size.width(), size.height(), 0, GL_RGBA,
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.width(), size.height(), 0, GL_RGB,
GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
// Create render buffer
glGenRenderbuffers(1, &depthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, size.width(), size.height());
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, size.width(), size.height());
glBindRenderbuffer(GL_RENDERBUFFER, 0);
// Create frame buffer