diff options
Diffstat (limited to 'src/datavisualization/engine/bars3drenderer.cpp')
-rw-r--r-- | src/datavisualization/engine/bars3drenderer.cpp | 122 |
1 files changed, 77 insertions, 45 deletions
diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 23932f23..7682f389 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -87,10 +87,11 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_scaleFactor(0), m_maxSceneSize(40.0f), m_visualSelectedBarPos(Bars3DController::noSelectionPoint()), + m_visualSelectedBarSeriesIndex(-1), m_hasHeightAdjustmentChanged(true), m_selectedBarPos(Bars3DController::noSelectionPoint()), + m_selectedBarSeries(0), m_noZeroInRange(false), - m_seriesCount(0), m_seriesScale(0.0f), m_seriesStep(0.0f), m_seriesStart(0.0f) @@ -151,15 +152,9 @@ void Bars3DRenderer::initializeOpenGL() loadBackgroundMesh(); } -void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList) +void Bars3DRenderer::updateData() { - QList<QBar3DSeries *> visibleSeries; - foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) - visibleSeries.append(static_cast<QBar3DSeries *>(current)); - } - - int seriesCount = visibleSeries.size(); + int seriesCount = m_visibleSeriesList.size(); int minRow = m_axisCacheX.min(); int maxRow = m_axisCacheX.max(); int minCol = m_axisCacheZ.min(); @@ -168,13 +163,13 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi int newColumns = maxCol - minCol + 1; int updateSize = 0; int dataRowCount = 0; + int maxDataRowCount = 0; - 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_renderingArrays.size() != seriesCount) { + m_renderingArrays.resize(seriesCount); + m_seriesScale = 1.0f / float(seriesCount); + m_seriesStep = 1.0f / float(seriesCount); + m_seriesStart = -((float(seriesCount) - 1.0f) / 2.0f) * m_seriesStep; } if (m_cachedRowCount != newRows || m_cachedColumnCount != newColumns) { @@ -194,7 +189,7 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi calculateSceneScalingFactors(); } - for (int series = 0; series < m_seriesCount; series++) { + for (int series = 0; series < 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 @@ -204,8 +199,11 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi } // Update cached data window - QBarDataProxy *dataProxy = visibleSeries.at(series)->dataProxy(); + QBarDataProxy *dataProxy = + static_cast<QBar3DSeries *>(m_visibleSeriesList.at(series).series())->dataProxy(); dataRowCount = dataProxy->rowCount(); + if (maxDataRowCount < dataRowCount) + maxDataRowCount = qMin(dataRowCount, newRows); int dataRowIndex = minRow; GLfloat heightValue = 0.0f; for (int i = 0; i < newRows; i++) { @@ -248,14 +246,12 @@ void Bars3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesLi m_renderColumns = updateSize; if (m_renderingArrays.size()) - m_renderRows = qMin((dataRowCount - minRow), newRows); + m_renderRows = qMin((maxDataRowCount - minRow), newRows); else m_renderRows = 0; // Reset selected bar to update selection - updateSelectedBar(m_selectedBarPos); - - Abstract3DRenderer::updateSeriesData(seriesList); + updateSelectedBar(m_selectedBarPos, m_selectedBarSeries); } void Bars3DRenderer::updateScene(Q3DScene *scene) @@ -606,9 +602,16 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel, } int labelCount = m_sliceCache->labelItems().size(); + int seriesCount = 1; + if (m_cachedSelectionMode.testFlag(QDataVis::SelectionMultiSeries)) + seriesCount = m_visibleSeriesList.size(); + int adjustment = flipped ? (m_sliceSelection->size() - (labelCount * seriesCount)) : 0; + for (int labelNo = 0; labelNo < labelCount; labelNo++) { // Get labels from first series only - BarRenderItem *item = m_sliceSelection->at(labelNo * m_seriesCount); + // Adjustment is used in flipped cases to fix label positioning in cases when there are + // more actual data rows in the slice than labeled rows + BarRenderItem *item = m_sliceSelection->at(labelNo * seriesCount + adjustment); // TODO: Make user controllable (QTRD-2546) // Draw labels int labelIndex = flipped ? m_sliceCache->labelItems().size() - 1 - labelNo : labelNo; @@ -672,6 +675,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) GLfloat colPos = 0; GLfloat rowPos = 0; + int seriesCount = m_visibleSeriesList.size(); + const Q3DCamera *activeCamera = m_cachedScene->activeCamera(); // Specify viewport @@ -777,7 +782,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) for (int bar = startBar; bar != stopBar; bar += stepBar) { GLfloat shadowOffset = 0.0f; float seriesPos = m_seriesStart; - for (int series = 0; series < m_seriesCount; series++) { + for (int series = 0; series < seriesCount; series++) { const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar); if (!item.value()) continue; @@ -880,10 +885,12 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) for (int row = startRow; row != stopRow; row += stepRow) { for (int bar = startBar; bar != stopBar; bar += stepBar) { float seriesPos = m_seriesStart; - for (int series = 0; series < m_seriesCount; series++) { + for (int series = 0; series < seriesCount; series++) { const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar); - if (!item.value()) + if (!item.value()) { + seriesPos += m_seriesStep; continue; + } if (item.height() < 0) glCullFace(GL_FRONT); @@ -912,7 +919,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) //#else QVector3D barColor = QVector3D((GLdouble)row / 255.0, (GLdouble)bar / 255.0, - 0.0); + (GLdouble)series / 255.0); //#endif m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix); @@ -946,7 +953,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Read color under cursor QVector3D clickedColor = Utils::getSelection(m_inputPosition, m_cachedBoundingRect.height()); - emit barClicked(selectionColorToArrayPosition(clickedColor)); + emit barClicked(selectionColorToArrayPosition(clickedColor), selectionColorToSeries(clickedColor)); glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); @@ -990,7 +997,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) gradientTexture = m_objectGradientTexture; } - // TODO: Can't call back to controller here! (QTRD-2216) if (m_selectionDirty) { if (m_cachedIsSlicingActivated) { if (m_sliceSelection && m_sliceSelection->size()) { @@ -1017,12 +1023,13 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) bool barSelectionFound = false; BarRenderItem *selectedBar(0); + 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 = m_seriesStart; - for (int series = 0; series < m_seriesCount; series++) { + for (int series = 0; series < seriesCount; series++) { BarRenderItem &item = m_renderingArrays[series][row][bar]; if (item.height() < 0) @@ -1060,7 +1067,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) if (m_cachedSelectionMode > QDataVis::SelectionNone) { Bars3DController::SelectionType selectionType = Bars3DController::SelectionNone; if (somethingSelected) - selectionType = isSelected(row, bar); + selectionType = isSelected(row, bar, series); switch (selectionType) { case Bars3DController::SelectionItem: { @@ -1072,7 +1079,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) lightStrength = m_cachedTheme.m_highlightLightStrength; shadowLightStrength = adjustedHighlightStrength; // Insert position data into render item. We have no ownership, don't delete the previous one - if (!m_cachedIsSlicingActivated) { + if (!m_cachedIsSlicingActivated && m_visualSelectedBarSeriesIndex == series) { selectedBar = &item; selectedBar->setPosition(QPoint(row, bar)); item.setTranslation(modelMatrix.column(3).toVector3D()); @@ -1081,7 +1088,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) if (m_selectionDirty && m_cachedIsSlicingActivated) { QVector3D translation = modelMatrix.column(3).toVector3D(); if (m_cachedSelectionMode & QDataVis::SelectionColumn - && m_seriesCount > 1) { + && seriesCount > 1) { translation.setZ((m_columnDepth - ((row + 0.5f + seriesPos) * (m_cachedBarSpacing.height()))) / m_scaleFactor); @@ -1124,7 +1131,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) shadowLightStrength = adjustedHighlightStrength; if (m_cachedIsSlicingActivated) { QVector3D translation = modelMatrix.column(3).toVector3D(); - if (m_seriesCount > 1) { + if (seriesCount > 1) { translation.setZ((m_columnDepth - ((row + 0.5f + seriesPos) * (m_cachedBarSpacing.height()))) / m_scaleFactor); @@ -1712,7 +1719,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) static const QString valueLabelTag(QStringLiteral("@valueLabel")); // Custom format expects printf format specifier. There is no tag for it. - labelText = generateValueLabel(itemLabelFormat(), selectedBar->value()); + labelText = generateValueLabel( + m_visibleSeriesList[m_visualSelectedBarSeriesIndex].itemLabelFormat(), + selectedBar->value()); int selBarPosX = selectedBar->position().x(); int selBarPosY = selectedBar->position().y(); @@ -1829,13 +1838,15 @@ void Bars3DRenderer::updateBackgroundEnabled(bool enable) } } -void Bars3DRenderer::updateSelectedBar(const QPoint &position) +void Bars3DRenderer::updateSelectedBar(const QPoint &position, const QBar3DSeries *series) { m_selectedBarPos = position; + m_selectedBarSeries = series; m_selectionDirty = true; if (m_renderingArrays.isEmpty()) { m_visualSelectedBarPos = Bars3DController::noSelectionPoint(); + m_visualSelectedBarSeriesIndex = -1; return; } @@ -1844,6 +1855,14 @@ void Bars3DRenderer::updateSelectedBar(const QPoint &position) int maxX = m_renderingArrays.at(0).size() - 1; int maxZ = maxX >= 0 ? m_renderingArrays.at(0).at(0).size() - 1 : -1; + m_visualSelectedBarSeriesIndex = -1; + for (int i = 0; i < m_visibleSeriesList.size(); i++) { + if (m_visibleSeriesList.at(i).series() == series) { + m_visualSelectedBarSeriesIndex = i; + break; + } + } + if (m_selectedBarPos == Bars3DController::noSelectionPoint() || adjustedX < 0 || adjustedX > maxX || adjustedZ < 0 || adjustedZ > maxZ) { @@ -1983,20 +2002,25 @@ void Bars3DRenderer::calculateHeightAdjustment() } } -Bars3DController::SelectionType Bars3DRenderer::isSelected(GLint row, GLint bar) +Bars3DController::SelectionType Bars3DRenderer::isSelected(int row, int bar, int seriesIndex) { Bars3DController::SelectionType isSelectedType = Bars3DController::SelectionNone; - if (row == m_visualSelectedBarPos.x() && bar == m_visualSelectedBarPos.y() - && (m_cachedSelectionMode.testFlag(QDataVis::SelectionItem))) { - isSelectedType = Bars3DController::SelectionItem; - } else if (row == m_visualSelectedBarPos.x() - && (m_cachedSelectionMode.testFlag(QDataVis::SelectionRow))) { - isSelectedType = Bars3DController::SelectionRow; - } else if (bar == m_visualSelectedBarPos.y() - && (m_cachedSelectionMode.testFlag(QDataVis::SelectionColumn))) { - isSelectedType = Bars3DController::SelectionColumn; + if ((m_cachedSelectionMode.testFlag(QDataVis::SelectionMultiSeries) + && m_visualSelectedBarSeriesIndex >= 0) + || seriesIndex == m_visualSelectedBarSeriesIndex) { + if (row == m_visualSelectedBarPos.x() && bar == m_visualSelectedBarPos.y() + && (m_cachedSelectionMode.testFlag(QDataVis::SelectionItem))) { + isSelectedType = Bars3DController::SelectionItem; + } else if (row == m_visualSelectedBarPos.x() + && (m_cachedSelectionMode.testFlag(QDataVis::SelectionRow))) { + isSelectedType = Bars3DController::SelectionRow; + } else if (bar == m_visualSelectedBarPos.y() + && (m_cachedSelectionMode.testFlag(QDataVis::SelectionColumn))) { + isSelectedType = Bars3DController::SelectionColumn; + } } + return isSelectedType; } @@ -2012,6 +2036,14 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector3D &selectionC return position; } +QBar3DSeries *Bars3DRenderer::selectionColorToSeries(const QVector3D &selectionColor) +{ + if (selectionColor == selectionSkipColor) + return 0; + else + return static_cast<QBar3DSeries *>(m_visibleSeriesList.at(int(selectionColor.z())).series()); +} + void Bars3DRenderer::updateSlicingActive(bool isSlicing) { if (isSlicing == m_cachedIsSlicingActivated) |