summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-07-09 10:02:00 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-07-09 10:38:41 +0300
commit93b5a6af81a7c719f63870b3e9c5ce071b113970 (patch)
tree5edbb41b556b4dc859734a3d2b3616020efea3c4
parent24275c551f0a10df022f037962d1678b7213ef09 (diff)
Misc fixes:
- Prettied up widget example dynamic data axes a bit by only generating label for each fifth row/column. - Category axes clear labelitem when label string is empty. - Inlined most render item functions. - Cache bar height into render items. - Fix building of rainfall example. Change-Id: Ia945e2253bd31bf3f6b3ac4856ab6bbcc18e2d59 Reviewed-by: Mika Salmela <mika.salmela@digia.com>
-rw-r--r--examples/rainfall/main.cpp2
-rw-r--r--examples/widget/chart.cpp20
-rw-r--r--src/datavis3d/axis/qcategoryaxis.cpp12
-rw-r--r--src/datavis3d/data/abstractrenderitem_p.h4
-rw-r--r--src/datavis3d/data/barrenderitem.cpp8
-rw-r--r--src/datavis3d/data/barrenderitem_p.h24
-rw-r--r--src/datavis3d/engine/bars3drenderer.cpp75
-rw-r--r--src/datavis3d/engine/bars3drenderer_p.h2
-rw-r--r--src/datavis3d/engine/drawer_p.h2
9 files changed, 80 insertions, 69 deletions
diff --git a/examples/rainfall/main.cpp b/examples/rainfall/main.cpp
index a13e91f9..db736903 100644
--- a/examples/rainfall/main.cpp
+++ b/examples/rainfall/main.cpp
@@ -45,7 +45,7 @@
#include <QGuiApplication>
#include <QFont>
-//#include <QDebug>
+#include <QDebug>
using namespace QtDataVis3D;
diff --git a/examples/widget/chart.cpp b/examples/widget/chart.cpp
index 8d6c5f99..39e19d4c 100644
--- a/examples/widget/chart.cpp
+++ b/examples/widget/chart.cpp
@@ -66,11 +66,18 @@ ChartModifier::ChartModifier(Q3DBars *barchart)
{
// Don't set any styles or specifications, start from defaults
// Generate generic labels
- for (int i = 0; i < 200; i++)
- m_genericRowLabels << QStringLiteral("Row %1").arg(i);
- for (int i = 0; i < 200; i++)
- m_genericColumnLabels << QStringLiteral("Column %1").arg(i);
-
+ for (int i = 0; i < 200; i++) {
+ if (i % 5)
+ m_genericRowLabels << QString();
+ else
+ m_genericRowLabels << QStringLiteral("Row %1").arg(i);
+ }
+ for (int i = 0; i < 200; i++) {
+ if (i % 5)
+ m_genericColumnLabels << QString();
+ else
+ m_genericColumnLabels << QStringLiteral("Column %1").arg(i);
+ }
}
ChartModifier::~ChartModifier()
@@ -199,9 +206,10 @@ void ChartModifier::addRows()
dataArray->append(dataRow);
}
m_chart->dataProxy()->insertRows(0, dataArray);
+ qDebug() << "Added" << m_rowCount << "rows, time:" << timer.elapsed();
if (oldCount < m_rowCount)
m_chart->rowAxis()->setLabels(m_genericRowLabels.mid(0, m_rowCount));
- qDebug() << "Added" << m_rowCount << "rows, time:" << timer.elapsed();
+ qDebug() << "... Including Label creation, time:" << timer.elapsed();
}
void ChartModifier::changeStyle()
diff --git a/src/datavis3d/axis/qcategoryaxis.cpp b/src/datavis3d/axis/qcategoryaxis.cpp
index d268c98b..80dc8fdb 100644
--- a/src/datavis3d/axis/qcategoryaxis.cpp
+++ b/src/datavis3d/axis/qcategoryaxis.cpp
@@ -67,7 +67,9 @@ void QCategoryAxis::setLabels(const QStringList &labels)
for (int i = 0; i < newSize; i++) {
if (i >= oldSize)
d_ptr->m_labelItems.append(new LabelItem);
- if (i >= oldSize || labels.at(i) != d_ptr->m_labels.at(i))
+ if (labels.at(i).isEmpty())
+ d_ptr->m_labelItems[i]->clear();
+ else if (i >= oldSize || labels.at(i) != d_ptr->m_labels.at(i))
d_ptr->m_drawer->generateLabelItem(*d_ptr->m_labelItems[i], labels.at(i));
}
}
@@ -91,8 +93,12 @@ QCategoryAxisPrivate::~QCategoryAxisPrivate()
void QCategoryAxisPrivate::updateLabels()
{
- for (int i = 0; i < m_labels.size(); i++)
- m_drawer->generateLabelItem(*m_labelItems[i], m_labels.at(i));
+ for (int i = 0; i < m_labels.size(); i++) {
+ if (m_labels.at(i).isEmpty())
+ m_labelItems[i]->clear();
+ else
+ m_drawer->generateLabelItem(*m_labelItems[i], m_labels.at(i));
+ }
}
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/data/abstractrenderitem_p.h b/src/datavis3d/data/abstractrenderitem_p.h
index fa896169..7db487fd 100644
--- a/src/datavis3d/data/abstractrenderitem_p.h
+++ b/src/datavis3d/data/abstractrenderitem_p.h
@@ -68,8 +68,8 @@ public:
virtual ~AbstractRenderItem();
// Position in 3D scene
- void setTranslation(const QVector3D &translation) { m_translation = translation; }
- const QVector3D &translation() const {return m_translation; }
+ inline void setTranslation(const QVector3D &translation) { m_translation = translation; }
+ inline const QVector3D &translation() const {return m_translation; }
// Label item for formatted label
// Ownership of the label texture (if any) transfers to QAbstractDataItemPrivate
diff --git a/src/datavis3d/data/barrenderitem.cpp b/src/datavis3d/data/barrenderitem.cpp
index d7f5a70c..f17a5d3a 100644
--- a/src/datavis3d/data/barrenderitem.cpp
+++ b/src/datavis3d/data/barrenderitem.cpp
@@ -55,14 +55,6 @@ BarRenderItem::~BarRenderItem()
{
}
-void BarRenderItem::setValue(qreal value)
-{
- if (m_value != value) {
- m_value = value;
- setLabel(QString()); // Forces reformatting on next access
- }
-}
-
void BarRenderItem::formatLabel()
{
// Format the string on first access
diff --git a/src/datavis3d/data/barrenderitem_p.h b/src/datavis3d/data/barrenderitem_p.h
index 0bafa9ba..e576cbb7 100644
--- a/src/datavis3d/data/barrenderitem_p.h
+++ b/src/datavis3d/data/barrenderitem_p.h
@@ -65,15 +65,19 @@ public:
virtual ~BarRenderItem();
// Position relative to data window (for bar label generation)
- const QPoint &position() { return m_position; }
- void setPosition(const QPoint &pos) { m_position = pos; }
+ inline const QPoint &position() { return m_position; }
+ inline void setPosition(const QPoint &pos) { m_position = pos; }
// Actual cached data value of the bar (needed to trigger label reformats)
- void setValue(qreal value);
- qreal value() { return m_value; }
+ inline void setValue(qreal value);
+ inline qreal value() { return m_value; }
+
+ // Normalized bar height
+ inline void setHeight(GLfloat height) { m_height = height; }
+ inline GLfloat height() { return m_height; }
// TODO should be in abstract, but currently there is no abstract renderer
- void setRenderer(Bars3dRenderer *renderer) { m_renderer = renderer; }
+ inline void setRenderer(Bars3dRenderer *renderer) { m_renderer = renderer; }
protected:
virtual void formatLabel();
@@ -81,10 +85,20 @@ protected:
Bars3dRenderer *m_renderer;
qreal m_value;
QPoint m_position; // x = row, y = column
+ GLfloat m_height;
friend class QBarDataItem;
};
+void BarRenderItem::setValue(qreal value)
+{
+ if (m_value != value) {
+ m_value = value;
+ if (!m_label.isNull())
+ setLabel(QString()); // Forces reformatting on next access
+ }
+}
+
typedef QVector<BarRenderItem> BarRenderItemRow;
typedef QVector<BarRenderItemRow> BarRenderItemArray;
diff --git a/src/datavis3d/engine/bars3drenderer.cpp b/src/datavis3d/engine/bars3drenderer.cpp
index c2bfc8ed..65b50112 100644
--- a/src/datavis3d/engine/bars3drenderer.cpp
+++ b/src/datavis3d/engine/bars3drenderer.cpp
@@ -110,7 +110,7 @@ Bars3dRenderer::Bars3dRenderer(Bars3dController *controller)
m_selectionDepthBuffer(0),
m_shadowQualityToShader(33.3f),
m_autoScaleAdjustment(1.0f),
- m_heightNormalizer(0.0f),
+ m_heightNormalizer(1.0f),
m_yAdjustment(0.0f),
m_rowWidth(0),
m_columnDepth(0),
@@ -122,7 +122,7 @@ Bars3dRenderer::Bars3dRenderer(Bars3dController *controller)
m_selection(selectionSkipColor),
m_hasHeightAdjustmentChanged(true),
m_dataProxy(0),
- m_dataWindowChanged(false)
+ m_valueUpdateNeeded(false)
#ifdef DISPLAY_RENDER_SPEED
,m_isFirstFrame(true),
m_numFrames(0)
@@ -337,8 +337,8 @@ void Bars3dRenderer::render(QBarDataProxy *dataProxy,
// Update cached data window
// TODO Should data changes be notified via signal instead of reading data in render?
// TODO this cache initialization assumes data window starts at 0,0 offset from array
- if (valuesDirty || m_dataWindowChanged) {
- m_dataWindowChanged = false;
+ if (valuesDirty || m_valueUpdateNeeded) {
+ m_valueUpdateNeeded = false;
int dataRowCount = dataProxy->rowCount();
for (int i = 0; i < m_renderItemArray.size(); i++) {
int j = 0;
@@ -346,8 +346,11 @@ void Bars3dRenderer::render(QBarDataProxy *dataProxy,
const QBarDataRow *dataRow = dataProxy->rowAt(i);
int updateSize = qMin(dataRow->size(), m_renderItemArray[i].size());
if (dataRow) {
- for (; j < updateSize ; j++)
- m_renderItemArray[i][j].setValue(dataRow->at(j).value());
+ for (; j < updateSize ; j++) {
+ qreal value = dataRow->at(j).value();
+ m_renderItemArray[i][j].setValue(value);
+ m_renderItemArray[i][j].setHeight(value / m_heightNormalizer);
+ }
}
}
for (; j < m_renderItemArray[i].size(); j++)
@@ -446,9 +449,7 @@ void Bars3dRenderer::drawSlicedScene(CameraHelper *camera,
if (!item)
continue;
- GLfloat barHeight = item->value() / m_heightNormalizer;
-
- if (barHeight < 0)
+ if (item->height() < 0)
glCullFace(GL_FRONT);
else
glCullFace(GL_BACK);
@@ -463,19 +464,19 @@ void Bars3dRenderer::drawSlicedScene(CameraHelper *camera,
else
barPosX = -(item->translation().z() - zComp); // flip z; frontmost bar to the left
modelMatrix.translate(barPosX, barPosY, zComp);
- modelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ));
- itModelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ));
+ modelMatrix.scale(QVector3D(m_scaleX, item->height(), m_scaleZ));
+ itModelMatrix.scale(QVector3D(m_scaleX, item->height(), m_scaleZ));
MVPMatrix = projectionMatrix * viewMatrix * modelMatrix;
QVector3D baseColor = Utils::vectorFromColor(m_cachedTheme.m_baseColor);
- QVector3D heightColor = Utils::vectorFromColor(m_cachedTheme.m_heightColor) * barHeight;
+ QVector3D heightColor = Utils::vectorFromColor(m_cachedTheme.m_heightColor) * item->height();
QVector3D barColor = baseColor + heightColor;
GLfloat lightStrength = m_cachedTheme.m_lightStrength;
- if (barHeight != 0) {
+ if (item->height() != 0) {
// Set shader bindings
m_barShader->setUniformValue(m_barShader->lightP(), lightPos);
m_barShader->setUniformValue(m_barShader->view(), viewMatrix);
@@ -547,7 +548,7 @@ void Bars3dRenderer::drawSlicedScene(CameraHelper *camera,
// Draw values
m_drawer->drawLabel(*item, item->labelItem(), viewMatrix, projectionMatrix,
QVector3D(0.0f, m_yAdjustment, zComp),
- QVector3D(0.0f, 0.0f, 0.0f), (item->value() / m_heightNormalizer),
+ QVector3D(0.0f, 0.0f, 0.0f), item->height(),
m_cachedSelectionMode, m_labelShader,
m_labelObj, camera);
@@ -564,7 +565,7 @@ void Bars3dRenderer::drawSlicedScene(CameraHelper *camera,
}
m_drawer->drawLabel(*item, *labelItem, viewMatrix, projectionMatrix,
QVector3D(0.0f, m_yAdjustment, zComp),
- QVector3D(0.0f, 0.0f, -45.0f), (item->value() / m_heightNormalizer),
+ QVector3D(0.0f, 0.0f, -45.0f), item->height(),
m_cachedSelectionMode, m_labelShader,
m_labelObj, camera, false, false, LabelBelow);
}
@@ -701,16 +702,9 @@ void Bars3dRenderer::drawScene(CameraHelper *camera,
if (!item.value())
continue;
- // TODO Cache barHeights to render items
- GLfloat barHeight = item.value() / m_heightNormalizer;
-
- // skip shadows for 0 -height bars
- if (barHeight == 0)
- continue;
-
// Set front face culling for positive valued bars and back face culling for
// negative valued bars to reduce self-shadowing issues
- if (barHeight < 0)
+ if (item.height() < 0)
glCullFace(GL_BACK);
else
glCullFace(GL_FRONT);
@@ -722,9 +716,9 @@ void Bars3dRenderer::drawScene(CameraHelper *camera,
rowPos = (row + 1) * (m_cachedBarSpacing.height());
modelMatrix.translate((m_rowWidth - barPos) / m_scaleFactor,
- barHeight - m_yAdjustment,
+ item.height() - m_yAdjustment,
(m_columnDepth - rowPos) / m_scaleFactor + zComp);
- modelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ));
+ modelMatrix.scale(QVector3D(m_scaleX, item.height(), m_scaleZ));
MVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
@@ -801,10 +795,8 @@ void Bars3dRenderer::drawScene(CameraHelper *camera,
BarRenderItem &item = m_renderItemArray[row][bar];
if (!item.value())
continue;
- // TODO resolved bar heights should be cached?
- GLfloat barHeight = item.value() / m_heightNormalizer;
- if (barHeight < 0)
+ if (item.height() < 0)
glCullFace(GL_FRONT);
else
glCullFace(GL_BACK);
@@ -816,9 +808,9 @@ void Bars3dRenderer::drawScene(CameraHelper *camera,
rowPos = (row + 1) * (m_cachedBarSpacing.height());
modelMatrix.translate((m_rowWidth - barPos) / m_scaleFactor,
- barHeight - m_yAdjustment,
+ item.height() - m_yAdjustment,
(m_columnDepth - rowPos) / m_scaleFactor + zComp);
- modelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ));
+ modelMatrix.scale(QVector3D(m_scaleX, item.height(), m_scaleZ));
MVPMatrix = projectionMatrix * viewMatrix * modelMatrix;
@@ -914,10 +906,7 @@ void Bars3dRenderer::drawScene(CameraHelper *camera,
if (!item.value())
continue;
- // TODO resolved bar heights should be cached?
- GLfloat barHeight = item.value() / m_heightNormalizer;
-
- if (barHeight < 0)
+ if (item.height() < 0)
glCullFace(GL_FRONT);
else
glCullFace(GL_BACK);
@@ -930,10 +919,10 @@ void Bars3dRenderer::drawScene(CameraHelper *camera,
barPos = (bar + 1) * (m_cachedBarSpacing.width());
rowPos = (row + 1) * (m_cachedBarSpacing.height());
modelMatrix.translate((m_rowWidth - barPos) / m_scaleFactor,
- barHeight - m_yAdjustment,
+ item.height() - m_yAdjustment,
(m_columnDepth - rowPos) / m_scaleFactor + zComp);
- modelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ));
- itModelMatrix.scale(QVector3D(m_scaleX, barHeight, m_scaleZ));
+ modelMatrix.scale(QVector3D(m_scaleX, item.height(), m_scaleZ));
+ itModelMatrix.scale(QVector3D(m_scaleX, item.height(), m_scaleZ));
#ifdef SHOW_DEPTH_TEXTURE_SCENE
MVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
#else
@@ -942,7 +931,7 @@ void Bars3dRenderer::drawScene(CameraHelper *camera,
depthMVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
QVector3D baseColor = Utils::vectorFromColor(m_cachedTheme.m_baseColor);
- QVector3D heightColor = Utils::vectorFromColor(m_cachedTheme.m_heightColor) * barHeight;
+ QVector3D heightColor = Utils::vectorFromColor(m_cachedTheme.m_heightColor) * item.height();
QVector3D depthColor = Utils::vectorFromColor(m_cachedTheme.m_depthColor)
* (float(row) / GLfloat(m_cachedRowCount));
@@ -1011,7 +1000,7 @@ void Bars3dRenderer::drawScene(CameraHelper *camera,
}
}
- if (barHeight != 0) {
+ if (item.height() != 0) {
// Set shader bindings
m_barShader->setUniformValue(m_barShader->lightP(), lightPos);
m_barShader->setUniformValue(m_barShader->view(), viewMatrix);
@@ -1400,7 +1389,7 @@ void Bars3dRenderer::drawScene(CameraHelper *camera,
m_drawer->drawLabel(*m_selectedBar, m_selectedBar->label(),
viewMatrix, projectionMatrix,
QVector3D(0.0f, m_yAdjustment, zComp),
- QVector3D(0.0f, 0.0f, 0.0f), m_heightNormalizer,
+ QVector3D(0.0f, 0.0f, 0.0f),
m_cachedSelectionMode, m_labelShader,
m_labelObj, true);
#else
@@ -1423,7 +1412,7 @@ void Bars3dRenderer::drawScene(CameraHelper *camera,
m_drawer->drawLabel(*m_selectedBar, labelItem, viewMatrix, projectionMatrix,
QVector3D(0.0f, m_yAdjustment, zComp),
- QVector3D(0.0f, 0.0f, 0.0f), (m_selectedBar->value() / m_heightNormalizer),
+ QVector3D(0.0f, 0.0f, 0.0f), m_selectedBar->height(),
m_cachedSelectionMode, m_labelShader,
m_labelObj, camera, true, false);
#endif
@@ -1615,7 +1604,7 @@ void Bars3dRenderer::updateSampleSpace(int rowCount, int columnCount)
m_renderItemArray[i][j].setRenderer(this);
}
- m_dataWindowChanged = true;
+ m_valueUpdateNeeded = true;
// Force update for selection related items
m_sliceAxisP = 0;
@@ -1772,6 +1761,7 @@ void Bars3dRenderer::updateTickCount(GLint tickCount, GLfloat step, GLfloat mini
if (tickCount > 0 && step > 0) {
m_heightNormalizer = tickCount * step;
calculateHeightAdjustment(QPair<float, float>(minimum, m_heightNormalizer));
+ m_valueUpdateNeeded = true;
}
}
@@ -1914,6 +1904,7 @@ void Bars3dRenderer::updateLimits(QPair<GLfloat, GLfloat> limits)
if (m_tickCount == 0) {
m_heightNormalizer = (GLfloat)qMax(qFabs(limits.second), qFabs(limits.first));
calculateHeightAdjustment(limits);
+ m_valueUpdateNeeded = true;
}
}
diff --git a/src/datavis3d/engine/bars3drenderer_p.h b/src/datavis3d/engine/bars3drenderer_p.h
index 2f56ef62..9f5c9bc3 100644
--- a/src/datavis3d/engine/bars3drenderer_p.h
+++ b/src/datavis3d/engine/bars3drenderer_p.h
@@ -167,7 +167,7 @@ private:
QBarDataProxy *m_dataProxy; // Only valid during render
BarRenderItemArray m_renderItemArray;
- bool m_dataWindowChanged;
+ bool m_valueUpdateNeeded;
#ifdef DISPLAY_RENDER_SPEED
bool m_isFirstFrame;
diff --git a/src/datavis3d/engine/drawer_p.h b/src/datavis3d/engine/drawer_p.h
index 0657da0c..27f1e871 100644
--- a/src/datavis3d/engine/drawer_p.h
+++ b/src/datavis3d/engine/drawer_p.h
@@ -84,7 +84,7 @@ public:
GLuint depthTextureId = 0);
void drawLabel(const AbstractRenderItem &item, const LabelItem &label,
const QMatrix4x4 &viewmatrix, const QMatrix4x4 &projectionmatrix,
- const QVector3D &positionComp, const QVector3D &rotation, GLfloat maxHeight,
+ const QVector3D &positionComp, const QVector3D &rotation, GLfloat itemHeight,
SelectionMode mode, ShaderHelper *shader, ObjectHelper *object,
CameraHelper *camera,
bool useDepth = false, bool rotateAlong = false,