diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-11-20 14:49:06 +0200 |
---|---|---|
committer | Mika Salmela <mika.salmela@digia.com> | 2013-11-21 10:26:32 +0200 |
commit | d12f993ca802ff02091d6a5141d2847641bc65a8 (patch) | |
tree | c4e5fe4811e6942ef51dca6f48a96a7e129fccc3 /src/datavisualization/engine/scatter3drenderer.cpp | |
parent | 51d4a9fcba6089ba433ae126f554b50979220d07 (diff) |
Multi series selection part 2: scatter
Task-number: QTRD-2556
Change-Id: I9ee193141dff6603b47db28b0ed0682db6f914c8
Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Diffstat (limited to 'src/datavisualization/engine/scatter3drenderer.cpp')
-rw-r--r-- | src/datavisualization/engine/scatter3drenderer.cpp | 66 |
1 files changed, 51 insertions, 15 deletions
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 2abb4fe9..5f03f982 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -80,6 +80,10 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_shadowQualityMultiplier(3), m_heightNormalizer(1.0f), m_scaleFactor(0), + m_selectedItemIndex(Scatter3DController::invalidSelectionIndex()), + m_selectedItemTotalIndex(Scatter3DController::invalidSelectionIndex()), + m_selectedItemSeriesIndex(Scatter3DController::invalidSelectionIndex()), + m_selectedSeries(0), m_areaSize(QSizeF(0.0, 0.0)), m_dotSizeScale(1.0f), m_hasHeightAdjustmentChanged(true), @@ -180,7 +184,8 @@ void Scatter3DRenderer::updateData() } } m_dotSizeScale = (GLfloat)qBound(0.01, (2.0 / qSqrt((qreal)totalDataSize)), 0.1); - m_selectedItem = 0; + + updateSelectedItem(m_selectedItemIndex, m_selectedSeries); } void Scatter3DRenderer::updateScene(Q3DScene *scene) @@ -342,6 +347,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) modelMatrix.translate(item.translation()); if (!m_drawingPoints) { modelMatrix.scale(modelScaler); + // TODO: Remove all references to item size? //modelMatrix.scale(QVector3D(widthMultiplier * item.size() + widthScaler, // heightMultiplier * item.size() + heightScaler, // depthMultiplier * item.size() + depthScaler)); @@ -451,6 +457,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) modelMatrix.translate(item.translation()); if (!m_drawingPoints) { modelMatrix.scale(modelScaler); + // TODO: Remove all references to item size? //modelMatrix.scale(QVector3D(widthMultiplier * item.size() + widthScaler, // heightMultiplier * item.size() + heightScaler, // depthMultiplier * item.size() + depthScaler)); @@ -494,7 +501,10 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Read color under cursor QVector3D clickedColor = Utils::getSelection(m_inputPosition, m_cachedBoundingRect.height()); - emit itemClicked(selectionColorToIndex(clickedColor)); + int clickedIndex = 0; + QScatter3DSeries *clickedSeries = 0; + selectionColorToSeriesAndIndex(clickedColor, clickedIndex, clickedSeries); + emit itemClicked(clickedIndex, clickedSeries); glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); @@ -556,7 +566,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Draw dots bool dotSelectionFound = false; ScatterRenderItem *selectedItem(0); - int selectedSeriesIndex(0); int dotNo = 0; for (int series = 0; series < seriesCount; series++) { @@ -577,6 +586,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) if (!m_drawingPoints) { modelMatrix.scale(modelScaler); itModelMatrix.scale(modelScaler); + // TODO: Remove all references to item size? //modelMatrix.scale(QVector3D(widthMultiplier * item.size() + widthScaler, // heightMultiplier * item.size() + heightScaler, // depthMultiplier * item.size() + depthScaler)); @@ -596,7 +606,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) gradientTexture = m_objectGradientTexture; GLfloat lightStrength = m_cachedTheme.m_lightStrength; - if (m_cachedSelectionMode > QDataVis::SelectionNone && (m_selectedItemIndex == dotNo)) { + if (m_cachedSelectionMode > QDataVis::SelectionNone && (m_selectedItemTotalIndex == dotNo)) { if (m_cachedColorStyle == QDataVis::ColorStyleUniform || m_drawingPoints) dotColor = Utils::vectorFromColor(m_cachedSingleHighlightColor); else @@ -604,7 +614,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) lightStrength = m_cachedTheme.m_highlightLightStrength; // Insert data to ScatterRenderItem. We have no ownership, don't delete the previous one selectedItem = &item; - selectedSeriesIndex = series; dotSelectionFound = true; } @@ -1359,7 +1368,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) static const QString yLabelTag(QStringLiteral("@yLabel")); static const QString zLabelTag(QStringLiteral("@zLabel")); - labelText = m_visibleSeriesList[selectedSeriesIndex].itemLabelFormat(); + labelText = m_visibleSeriesList[m_selectedItemSeriesIndex].itemLabelFormat(); labelText.replace(xTitleTag, m_axisCacheX.title()); labelText.replace(yTitleTag, m_axisCacheY.title()); @@ -1410,12 +1419,30 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Release label shader m_labelShader->release(); + + m_selectionDirty = false; } -void Scatter3DRenderer::updateSelectedItemIndex(int index) +void Scatter3DRenderer::updateSelectedItem(int index, const QScatter3DSeries *series) { m_selectionDirty = true; - m_selectedItemIndex = index; + m_selectedSeries = series; + m_selectedItemIndex = Scatter3DController::invalidSelectionIndex(); + m_selectedItemTotalIndex = Scatter3DController::invalidSelectionIndex(); + m_selectedItemSeriesIndex = Scatter3DController::invalidSelectionIndex(); + + if (!m_renderingArrays.isEmpty() && index != Scatter3DController::invalidSelectionIndex()) { + int totalIndex = 0; + for (int i = 0; i < m_visibleSeriesList.size(); i++) { + if (m_visibleSeriesList.at(i).series() == series) { + m_selectedItemSeriesIndex = i; + m_selectedItemIndex = index; + m_selectedItemTotalIndex = index + totalIndex; + break; + } + totalIndex += m_renderingArrays.at(i).size(); + } + } } void Scatter3DRenderer::handleResize() @@ -1656,17 +1683,26 @@ QVector3D Scatter3DRenderer::indexToSelectionColor(GLint index) return QVector3D(dotIdxRed, dotIdxGreen, dotIdxBlue); } -int Scatter3DRenderer::selectionColorToIndex(const QVector3D &color) +void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector3D &color, int &index, QScatter3DSeries *&series) { - int selectedIndex; - if (color == selectionSkipColor) { - selectedIndex = Scatter3DController::noSelectionIndex(); - } else { - selectedIndex = int(color.x()) + if (color != selectionSkipColor) { + index = int(color.x()) + (int(color.y()) << 8) + (int(color.z()) << 16); + // Find the series and adjust the index accordingly + for (int i = 0; i < m_renderingArrays.size(); i++) { + if (index < m_renderingArrays.at(i).size()) { + series = static_cast<QScatter3DSeries *>(m_visibleSeriesList.at(i).series()); + return; // Valid found and already set to return parameters, so we can return + } else { + index -= m_renderingArrays.at(i).size(); + } + } } - return selectedIndex; + + // No valid match found + index = Scatter3DController::invalidSelectionIndex(); + series = 0; } QT_DATAVISUALIZATION_END_NAMESPACE |