summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/bars3drenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavisualization/engine/bars3drenderer.cpp')
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp119
1 files changed, 66 insertions, 53 deletions
diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp
index be844a43..c7dac4f9 100644
--- a/src/datavisualization/engine/bars3drenderer.cpp
+++ b/src/datavisualization/engine/bars3drenderer.cpp
@@ -27,6 +27,7 @@
#include "drawer_p.h"
#include "qbardataitem.h"
#include "q3dlight.h"
+#include "qbar3dseries_p.h"
#include <QMatrix4x4>
#include <QMouseEvent>
@@ -46,12 +47,6 @@ const int smallerVPSize = 5;
const bool sliceGridLabels = true; // TODO: Make this user controllable (QTRD-2546)
-// TODO: These will be based on sets (QTRD-2548)
-const int seriesCount = 1;
-const float seriesScale = 1.0f / float(seriesCount);
-const float seriesStep = 1.0f / float(seriesCount);
-const float seriesStart = -((float(seriesCount) - 1.0f) / 2.0f) * seriesStep;
-
Bars3DRenderer::Bars3DRenderer(Bars3DController *controller)
: Abstract3DRenderer(controller),
m_cachedIsSlicingActivated(false),
@@ -95,7 +90,11 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller)
m_clickedBarColor(invalidColorVector),
m_hasHeightAdjustmentChanged(true),
m_selectedBarPos(Bars3DController::noSelectionPoint()),
- m_noZeroInRange(false)
+ m_noZeroInRange(false),
+ m_seriesCount(0),
+ m_seriesScale(0.0f),
+ m_seriesStep(0.0f),
+ m_seriesStart(0.0f)
{
initializeOpenGLFunctions();
initializeOpenGL();
@@ -153,8 +152,15 @@ void Bars3DRenderer::initializeOpenGL()
loadBackgroundMesh();
}
-void Bars3DRenderer::updateDataModel(QBarDataProxy *dataProxy)
+void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList)
{
+ QList<QBar3DSeries *> visibleSeries;
+ foreach (QAbstract3DSeries *current, seriesList) {
+ if (current->isVisible())
+ visibleSeries.append(static_cast<QBar3DSeries *>(current));
+ }
+
+ int seriesCount = visibleSeries.size();
int minRow = m_axisCacheX.min();
int maxRow = m_axisCacheX.max();
int minCol = m_axisCacheZ.min();
@@ -163,38 +169,43 @@ void Bars3DRenderer::updateDataModel(QBarDataProxy *dataProxy)
int newColumns = maxCol - minCol + 1;
int updateSize = 0;
int dataRowCount = 0;
- // TODO: Dummy series, replace with actual after QTRD-2548
- // TODO: Check if resize is needed
- m_renderingArrays.clear();
- m_renderingArrays.resize(seriesCount);
- for (int series = 0; series < seriesCount; series++) {
+
+ if (m_seriesCount != seriesCount) {
+ m_seriesCount = seriesCount;
+ m_renderingArrays.resize(m_seriesCount);
+ m_seriesScale = 1.0f / float(m_seriesCount);
+ m_seriesStep = 1.0f / float(m_seriesCount);
+ m_seriesStart = -((float(m_seriesCount) - 1.0f) / 2.0f) * m_seriesStep;
+ }
+
+ if (m_cachedRowCount != newRows || m_cachedColumnCount != newColumns) {
+ // Force update for selection related items
+ m_sliceCache = 0;
+ m_sliceTitleItem = 0;
+ if (m_sliceSelection)
+ m_sliceSelection->clear();
+
+ m_cachedColumnCount = newColumns;
+ m_cachedRowCount = newRows;
+ // Calculate max scene size
+ GLfloat sceneRatio = qMin(GLfloat(newColumns) / GLfloat(newRows),
+ GLfloat(newRows) / GLfloat(newColumns));
+ m_maxSceneSize = 2.0f * qSqrt(sceneRatio * newColumns * newRows);
+ // Calculate here and at setting bar specs
+ calculateSceneScalingFactors();
+ }
+
+ for (int series = 0; series < m_seriesCount; series++) {
if (newRows != m_renderingArrays.at(series).size()
|| newColumns != m_renderingArrays.at(series).at(0).size()) {
// Destroy old render items and reallocate new array
- m_renderingArrays[series].clear();
m_renderingArrays[series].resize(newRows);
for (int i = 0; i < newRows; i++)
m_renderingArrays[series][i].resize(newColumns);
-
- if (series == 0) {
- // Force update for selection related items
- m_sliceCache = 0;
- m_sliceTitleItem = 0;
- if (m_sliceSelection)
- m_sliceSelection->clear();
-
- m_cachedColumnCount = newColumns;
- m_cachedRowCount = newRows;
- // Calculate max scene size
- GLfloat sceneRatio = qMin(GLfloat(newColumns) / GLfloat(newRows),
- GLfloat(newRows) / GLfloat(newColumns));
- m_maxSceneSize = 2.0f * qSqrt(sceneRatio * newColumns * newRows);
- // Calculate here and at setting bar specs
- calculateSceneScalingFactors();
- }
}
// Update cached data window
+ QBarDataProxy *dataProxy = visibleSeries.at(series)->dataProxy();
dataRowCount = dataProxy->rowCount();
int dataRowIndex = minRow;
GLfloat heightValue = 0.0f;
@@ -222,9 +233,8 @@ void Bars3DRenderer::updateDataModel(QBarDataProxy *dataProxy)
heightValue = 0.0f;
}
}
- // TODO: Dummy values for replicated series, replace with actual after QTRD-2548
- m_renderingArrays[series][i][j].setValue(value * ((series + 1.0f) / float(seriesCount)));
- m_renderingArrays[series][i][j].setHeight((heightValue / m_heightNormalizer) * ((series + 1.0f) / float(seriesCount)));
+ m_renderingArrays[series][i][j].setValue(value);
+ m_renderingArrays[series][i][j].setHeight(heightValue / m_heightNormalizer);
dataColIndex++;
}
}
@@ -238,12 +248,15 @@ void Bars3DRenderer::updateDataModel(QBarDataProxy *dataProxy)
}
m_renderColumns = updateSize;
- m_renderRows = qMin((dataRowCount - minRow), m_renderingArrays[0].size());
+ if (m_renderingArrays.size())
+ m_renderRows = qMin((dataRowCount - minRow), newRows);
+ else
+ m_renderRows = 0;
// Reset selected bar to update selection
updateSelectedBar(m_selectedBarPos);
- Abstract3DRenderer::updateDataModel(dataProxy);
+ Abstract3DRenderer::updateSeriesData(seriesList);
}
void Bars3DRenderer::updateScene(Q3DScene *scene)
@@ -459,9 +472,9 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel,
GLuint gradientTexture = 0;
QVector3D modelMatrixScaler(m_scaleX, 0.0f, m_scaleZ);
if (rowMode)
- modelMatrixScaler.setX(m_scaleX * seriesScale);
+ modelMatrixScaler.setX(m_scaleX * m_seriesScale);
else
- modelMatrixScaler.setZ(m_scaleZ * seriesScale);
+ modelMatrixScaler.setZ(m_scaleZ * m_seriesScale);
// Set common bar shader bindings
m_barShader->setUniformValue(m_barShader->lightP(), lightPos);
@@ -596,7 +609,7 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel,
int labelCount = m_sliceCache->labelItems().size();
for (int labelNo = 0; labelNo < labelCount; labelNo++) {
// Get labels from first series only
- BarRenderItem *item = m_sliceSelection->at(labelNo * seriesCount);
+ BarRenderItem *item = m_sliceSelection->at(labelNo * m_seriesCount);
// TODO: Make user controllable (QTRD-2546)
// Draw labels
int labelIndex = flipped ? m_sliceCache->labelItems().size() - 1 - labelNo : labelNo;
@@ -760,12 +773,12 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
depthProjectionViewMatrix = depthProjectionMatrix * depthViewMatrix;
// Draw bars to depth buffer
- QVector3D shadowScaler(m_scaleX * seriesScale * 0.9f, 0.0f, m_scaleZ * 0.9f);
+ QVector3D shadowScaler(m_scaleX * m_seriesScale * 0.9f, 0.0f, m_scaleZ * 0.9f);
for (int row = startRow; row != stopRow; row += stepRow) {
for (int bar = startBar; bar != stopBar; bar += stepBar) {
GLfloat shadowOffset = 0.0f;
- float seriesPos = seriesStart;
- for (int series = 0; series < seriesCount; series++) {
+ float seriesPos = m_seriesStart;
+ for (int series = 0; series < m_seriesCount; series++) {
const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar);
if (!item.value())
continue;
@@ -818,7 +831,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(m_depthShader->posAtt());
- seriesPos += seriesStep;
+ seriesPos += m_seriesStep;
}
}
}
@@ -867,8 +880,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
glDisable(GL_DITHER); // disable dithering, it may affect colors if enabled
for (int row = startRow; row != stopRow; row += stepRow) {
for (int bar = startBar; bar != stopBar; bar += stepBar) {
- float seriesPos = seriesStart;
- for (int series = 0; series < seriesCount; series++) {
+ float seriesPos = m_seriesStart;
+ for (int series = 0; series < m_seriesCount; series++) {
const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar);
if (!item.value())
continue;
@@ -887,7 +900,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
modelMatrix.translate((colPos - m_rowWidth) / m_scaleFactor,
item.height(),
(m_columnDepth - rowPos) / m_scaleFactor);
- modelMatrix.scale(QVector3D(m_scaleX * seriesScale,
+ modelMatrix.scale(QVector3D(m_scaleX * m_seriesScale,
item.height(),
m_scaleZ));
@@ -925,7 +938,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
glDisableVertexAttribArray(m_selectionShader->posAtt());
- seriesPos += seriesStep;
+ seriesPos += m_seriesStep;
}
}
}
@@ -1008,12 +1021,12 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
bool barSelectionFound = false;
BarRenderItem *selectedBar(0);
- QVector3D modelScaler(m_scaleX * seriesScale, 0.0f, m_scaleZ);
+ QVector3D modelScaler(m_scaleX * m_seriesScale, 0.0f, m_scaleZ);
bool somethingSelected = (m_visualSelectedBarPos != Bars3DController::noSelectionPoint());
for (int row = startRow; row != stopRow; row += stepRow) {
for (int bar = startBar; bar != stopBar; bar += stepBar) {
- float seriesPos = seriesStart;
- for (int series = 0; series < seriesCount; series++) {
+ float seriesPos = m_seriesStart;
+ for (int series = 0; series < m_seriesCount; series++) {
BarRenderItem &item = m_renderingArrays[series][row][bar];
if (item.height() < 0)
@@ -1072,7 +1085,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
if (m_selectionDirty && m_cachedIsSlicingActivated) {
QVector3D translation = modelMatrix.column(3).toVector3D();
if (m_cachedSelectionMode & QDataVis::SelectionColumn
- && seriesCount > 1) {
+ && m_seriesCount > 1) {
translation.setZ((m_columnDepth - ((row + 0.5f + seriesPos)
* (m_cachedBarSpacing.height())))
/ m_scaleFactor);
@@ -1115,7 +1128,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
shadowLightStrength = adjustedHighlightStrength;
if (m_cachedIsSlicingActivated) {
QVector3D translation = modelMatrix.column(3).toVector3D();
- if (seriesCount > 1) {
+ if (m_seriesCount > 1) {
translation.setZ((m_columnDepth - ((row + 0.5f + seriesPos)
* (m_cachedBarSpacing.height())))
/ m_scaleFactor);
@@ -1172,7 +1185,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
m_drawer->drawObject(m_barShader, m_barObj, gradientTexture);
}
}
- seriesPos += seriesStep;
+ seriesPos += m_seriesStep;
}
}
}