summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-11-15 12:48:13 +0200
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-11-20 09:34:06 +0200
commit51d4a9fcba6089ba433ae126f554b50979220d07 (patch)
tree5ffdabb461efc3989224226b600a649d395ef80a /src/datavisualization/engine
parent96995bda0da7ecf99d2ac4a4e417545c3506bf02 (diff)
Multi series selection part 1: bars
Task-number: QTRD-2556 Change-Id: I1f537f0b4c299028d4415f074d5eac6552bb3b9b Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
Diffstat (limited to 'src/datavisualization/engine')
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp17
-rw-r--r--src/datavisualization/engine/abstract3dcontroller_p.h3
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp24
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h7
-rw-r--r--src/datavisualization/engine/bars3dcontroller.cpp123
-rw-r--r--src/datavisualization/engine/bars3dcontroller_p.h12
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp122
-rw-r--r--src/datavisualization/engine/bars3drenderer_p.h14
-rw-r--r--src/datavisualization/engine/engine.pri2
-rw-r--r--src/datavisualization/engine/q3dbars.cpp23
-rw-r--r--src/datavisualization/engine/q3dbars.h5
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp37
-rw-r--r--src/datavisualization/engine/scatter3drenderer_p.h3
-rw-r--r--src/datavisualization/engine/seriesrendercache.cpp42
-rw-r--r--src/datavisualization/engine/seriesrendercache_p.h60
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp11
-rw-r--r--src/datavisualization/engine/surface3drenderer_p.h2
17 files changed, 334 insertions, 173 deletions
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp
index 625794a5..7f87ac7c 100644
--- a/src/datavisualization/engine/abstract3dcontroller.cpp
+++ b/src/datavisualization/engine/abstract3dcontroller.cpp
@@ -51,6 +51,7 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) :
m_axisZ(0),
m_renderer(0),
m_isDataDirty(true),
+ m_isSeriesDirty(true),
m_renderPending(false)
{
// Set initial theme
@@ -96,6 +97,8 @@ void Abstract3DController::addSeries(QAbstract3DSeries *series)
if (series && !m_seriesList.contains(series)) {
m_seriesList.append(series);
series->d_ptr->setController(this);
+ if (series->isVisible())
+ handleSeriesVisibilityChangedBySender(series);
}
}
@@ -104,6 +107,9 @@ void Abstract3DController::removeSeries(QAbstract3DSeries *series)
if (series && series->d_ptr->m_controller == this) {
m_seriesList.removeAll(series);
series->d_ptr->setController(0);
+ m_isDataDirty = true;
+ m_isSeriesDirty = true;
+ emitNeedRender();
}
}
@@ -353,9 +359,15 @@ void Abstract3DController::synchDataToRenderer()
}
}
- // TODO: Another (per-series?) flag about series visuals being dirty?
+ if (m_isSeriesDirty) {
+ m_renderer->updateSeries(m_seriesList);
+ m_isSeriesDirty = false;
+ }
+
if (m_isDataDirty) {
- m_renderer->updateSeriesData(m_seriesList);
+ // Series list supplied above in updateSeries() is used to access the data,
+ // so no data needs to be passed in updateData()
+ m_renderer->updateData();
m_isDataDirty = false;
}
}
@@ -1086,6 +1098,7 @@ void Abstract3DController::handleSeriesVisibilityChangedBySender(QObject *sender
Q_UNUSED(sender)
m_isDataDirty = true;
+ m_isSeriesDirty = true;
emitNeedRender();
}
diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h
index 6f7112b7..c86f9672 100644
--- a/src/datavisualization/engine/abstract3dcontroller_p.h
+++ b/src/datavisualization/engine/abstract3dcontroller_p.h
@@ -194,6 +194,7 @@ protected:
QList<Q3DAbstractAxis *> m_axes; // List of all added axes
Abstract3DRenderer *m_renderer;
bool m_isDataDirty;
+ bool m_isSeriesDirty;
bool m_renderPending;
QList<QAbstract3DSeries *> m_seriesList;
@@ -306,7 +307,7 @@ public:
Q3DScene *scene();
- inline void setDataDirty() { m_isDataDirty = true; }
+ inline void setSeriesDirty() { m_isSeriesDirty = true; }
void emitNeedRender();
virtual void mouseDoubleClickEvent(QMouseEvent *event);
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index 1446d39a..0f1349d1 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -143,11 +143,6 @@ QString Abstract3DRenderer::generateValueLabel(const QString &format, qreal valu
return Utils::formatLabel(valueFormatArray, valueParamType, value);
}
-QString Abstract3DRenderer::itemLabelFormat() const
-{
- return m_cachedItemLabelFormat;
-}
-
void Abstract3DRenderer::updateSelectionState(SelectionState state)
{
m_selectionState = state;
@@ -394,11 +389,22 @@ void Abstract3DRenderer::updateMultiHighlightGradient(const QLinearGradient &gra
fixGradient(&m_cachedMultiHighlightGradient, &m_multiHighlightGradientTexture);
}
-void Abstract3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList)
+void Abstract3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesList)
{
- // TODO: To series visuals update - just use first series format for now
- if (seriesList.size())
- m_cachedItemLabelFormat = seriesList.at(0)->itemLabelFormat();
+ int visibleCount = 0;
+ foreach (QAbstract3DSeries *current, seriesList) {
+ if (current->isVisible())
+ visibleCount++;
+ }
+
+ if (visibleCount != m_visibleSeriesList.size())
+ m_visibleSeriesList.resize(visibleCount);
+
+ visibleCount = 0;
+ foreach (QAbstract3DSeries *current, seriesList) {
+ if (current->isVisible())
+ m_visibleSeriesList[visibleCount++].populate(current);
+ }
}
AxisRenderCache &Abstract3DRenderer::axisCacheForOrientation(Q3DAbstractAxis::AxisOrientation orientation)
diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h
index 24d42e37..1a95aaeb 100644
--- a/src/datavisualization/engine/abstract3drenderer_p.h
+++ b/src/datavisualization/engine/abstract3drenderer_p.h
@@ -37,6 +37,7 @@
#include "abstract3dcontroller_p.h"
#include "axisrendercache_p.h"
#include "qabstractdataproxy.h"
+#include "seriesrendercache_p.h"
//#define DISPLAY_RENDER_SPEED
@@ -67,7 +68,6 @@ protected:
QDataVis::ShadowQuality m_cachedShadowQuality;
GLfloat m_autoScaleAdjustment;
- QString m_cachedItemLabelFormat;
QString m_cachedObjFile;
QDataVis::SelectionFlags m_cachedSelectionMode;
bool m_cachedIsGridEnabled;
@@ -94,6 +94,7 @@ protected:
bool m_selectionDirty;
SelectionState m_selectionState;
QPoint m_inputPosition;
+ QVector<SeriesRenderCache> m_visibleSeriesList;
#ifdef DISPLAY_RENDER_SPEED
bool m_isFirstFrame;
@@ -106,7 +107,8 @@ protected:
public:
virtual ~Abstract3DRenderer();
- virtual void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList);
+ virtual void updateData() = 0;
+ virtual void updateSeries(const QList<QAbstract3DSeries *> &seriesList);
virtual void render(GLuint defaultFboHandle);
@@ -121,7 +123,6 @@ public:
virtual void updateBackgroundEnabled(bool enable);
virtual void updateMeshFileName(const QString &objFileName);
virtual void updateScene(Q3DScene *scene);
- virtual QString itemLabelFormat() const;
virtual void updateTextures() = 0;
virtual void initSelectionBuffer() = 0;
virtual void updateSelectionState(SelectionState state);
diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp
index 019a96be..995633a8 100644
--- a/src/datavisualization/engine/bars3dcontroller.cpp
+++ b/src/datavisualization/engine/bars3dcontroller.cpp
@@ -33,6 +33,7 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE
Bars3DController::Bars3DController(QRect boundRect)
: Abstract3DController(boundRect),
m_selectedBar(noSelectionPoint()),
+ m_selectedBarSeries(0),
m_isBarSpecRelative(true),
m_barThicknessRatio(1.0f),
m_barSpacing(QSizeF(1.0, 1.0)),
@@ -84,7 +85,7 @@ void Bars3DController::synchDataToRenderer()
// Needs to be done after data is set, as it needs to know the visual array.
if (m_changeTracker.selectedBarChanged) {
- m_renderer->updateSelectedBar(m_selectedBar);
+ m_renderer->updateSelectedBar(m_selectedBar, m_selectedBarSeries);
m_changeTracker.selectedBarChanged = false;
}
}
@@ -94,7 +95,7 @@ void Bars3DController::handleArrayReset()
adjustAxisRanges();
m_isDataDirty = true;
// Clear selection unless still valid
- setSelectedBar(m_selectedBar);
+ setSelectedBar(m_selectedBar, m_selectedBarSeries);
emitNeedRender();
}
@@ -124,7 +125,7 @@ void Bars3DController::handleRowsRemoved(int startIndex, int count)
m_isDataDirty = true;
// Clear selection unless still valid
- setSelectedBar(m_selectedBar);
+ setSelectedBar(m_selectedBar, m_selectedBarSeries);
emitNeedRender();
}
@@ -176,9 +177,14 @@ void Bars3DController::handleDataColumnLabelsChanged()
}
}
-void Bars3DController::handleBarClicked(const QPoint &position)
+void Bars3DController::handleBarClicked(const QPoint &position, QBar3DSeries *series)
{
- setSelectedBar(position);
+ // Series may already have been removed, so check it before setting the selection.
+ if (m_seriesList.contains(series))
+ setSelectedBar(position, series);
+ else
+ setSelectedBar(noSelectionPoint(), 0);
+
// TODO: pass clicked to parent. (QTRD-2517)
// TODO: Also hover needed? (QTRD-2131)
}
@@ -191,6 +197,15 @@ void Bars3DController::handleAxisAutoAdjustRangeChangedInOrientation(
adjustAxisRanges();
}
+void Bars3DController::handleSeriesVisibilityChangedBySender(QObject *sender)
+{
+ Abstract3DController::handleSeriesVisibilityChangedBySender(sender);
+
+ // Visibility changes may require disabling/enabling slicing,
+ // so just reset selection to ensure everything is still valid.
+ setSelectedBar(m_selectedBar, m_selectedBarSeries);
+}
+
QPoint Bars3DController::noSelectionPoint()
{
static QPoint noSelectionPos(-1, -1);
@@ -222,16 +237,20 @@ void Bars3DController::addSeries(QAbstract3DSeries *series)
handleDataRowLabelsChanged();
handleDataColumnLabelsChanged();
-
- // TODO: Temp until selection by series is properly implemented
- setSelectedBar(noSelectionPoint());
}
+
+ QBar3DSeries *barSeries = static_cast<QBar3DSeries *>(series);
+ if (barSeries->selectedBar() != noSelectionPoint())
+ setSelectedBar(barSeries->selectedBar(), barSeries);
}
void Bars3DController::removeSeries(QAbstract3DSeries *series)
{
bool firstRemoved = (m_seriesList.size() && m_seriesList.at(0) == series);
+ if (m_selectedBarSeries == series)
+ setSelectedBar(noSelectionPoint(), 0);
+
Abstract3DController::removeSeries(series);
if (firstRemoved) {
@@ -239,9 +258,6 @@ void Bars3DController::removeSeries(QAbstract3DSeries *series)
handleDataRowLabelsChanged();
handleDataColumnLabelsChanged();
-
- // TODO: Temp until selection by series is properly implemented
- setSelectedBar(noSelectionPoint());
}
}
@@ -271,7 +287,7 @@ void Bars3DController::handleAxisRangeChangedBySender(QObject *sender)
Abstract3DController::handleAxisRangeChangedBySender(sender);
// Update selected bar - may be moved offscreen
- setSelectedBar(m_selectedBar);
+ setSelectedBar(m_selectedBar, m_selectedBarSeries);
}
void Bars3DController::setBarSpecs(GLfloat thicknessRatio, const QSizeF &spacing, bool relative)
@@ -325,44 +341,37 @@ void Bars3DController::setSelectionMode(QDataVis::SelectionFlags mode)
&& (mode.testFlag(QDataVis::SelectionRow) == mode.testFlag(QDataVis::SelectionColumn))) {
qWarning("Must specify one of either row or column selection mode in conjunction with slicing mode.");
} else {
- // When setting selection mode to a new slicing mode, activate slicing
- if (mode != selectionMode()) {
- bool isSlicing = mode.testFlag(QDataVis::SelectionSlice);
- if (isSlicing && m_selectedBar != noSelectionPoint())
- scene()->setSlicingActive(true);
- else
- scene()->setSlicingActive(false);
- }
+ QDataVis::SelectionFlags oldMode = selectionMode();
Abstract3DController::setSelectionMode(mode);
+
+ if (mode != oldMode) {
+ // Refresh selection upon mode change to ensure slicing is correctly updated
+ // according to series the visibility.
+ setSelectedBar(m_selectedBar, m_selectedBarSeries);
+
+ // Special case: Always deactivate slicing when changing away from slice
+ // automanagement, as this can't be handled in setSelectedBar.
+ if (!mode.testFlag(QDataVis::SelectionSlice)
+ && oldMode.testFlag(QDataVis::SelectionSlice)) {
+ scene()->setSlicingActive(false);
+ }
+ }
}
}
-void Bars3DController::setSelectedBar(const QPoint &position)
+void Bars3DController::setSelectedBar(const QPoint &position, QBar3DSeries *series)
{
// If the selection targets non-existent bar, clear selection instead.
QPoint pos = position;
- // TODO: Selection needs to be refactored to be handled by series
- const QBarDataProxy *proxy = 0;
- if (m_seriesList.size())
- proxy = static_cast<QBar3DSeries *>(m_seriesList.at(0))->dataProxy();
- else
- return;
-
- if (pos != noSelectionPoint()) {
- int maxRow = proxy->rowCount() - 1;
- int maxCol = (pos.x() <= maxRow && pos.x() >= 0 && proxy->rowAt(pos.x()))
- ? proxy->rowAt(pos.x())->size() - 1 : -1;
-
- if (pos.x() < 0 || pos.x() > maxRow || pos.y() < 0 || pos.y() > maxCol)
- pos = noSelectionPoint();
- }
+ adjustSelectionPosition(pos, series);
if (selectionMode().testFlag(QDataVis::SelectionSlice)) {
- // If the selected bar is outside data window, or there is no selected bar, disable slicing
+ // If the selected bar is outside data window, or there is no visible selected bar, disable slicing
if (pos.x() < m_axisX->min() || pos.x() > m_axisX->max()
- || pos.y() < m_axisZ->min() || pos.y() > m_axisZ->max()) {
+ || pos.y() < m_axisZ->min() || pos.y() > m_axisZ->max()
+ || !series->isVisible()) {
scene()->setSlicingActive(false);
} else {
scene()->setSlicingActive(true);
@@ -370,19 +379,23 @@ void Bars3DController::setSelectedBar(const QPoint &position)
emitNeedRender();
}
- if (pos != m_selectedBar) {
+ if (pos != m_selectedBar || series != m_selectedBarSeries) {
m_selectedBar = pos;
+ m_selectedBarSeries = series;
m_changeTracker.selectedBarChanged = true;
- emit selectedBarChanged(pos);
+ // Clear selection from other series and set the new selection to the affected series
+ foreach (QAbstract3DSeries *otherSeries, m_seriesList) {
+ QBar3DSeries *barSeries = static_cast<QBar3DSeries *>(otherSeries);
+ if (barSeries != m_selectedBarSeries)
+ barSeries->dptr()->setSelectedBar(noSelectionPoint());
+ else
+ barSeries->dptr()->setSelectedBar(m_selectedBar);
+ }
+
emitNeedRender();
}
}
-QPoint Bars3DController::selectedBar() const
-{
- return m_selectedBar;
-}
-
void Bars3DController::adjustAxisRanges()
{
if (m_seriesList.size()) {
@@ -428,6 +441,26 @@ void Bars3DController::adjustAxisRanges()
}
}
+// Invalidate selection position if outside data for the series
+void Bars3DController::adjustSelectionPosition(QPoint &pos, const QBar3DSeries *series)
+{
+ const QBarDataProxy *proxy = 0;
+ if (series)
+ proxy = series->dataProxy();
+
+ if (!proxy)
+ pos = noSelectionPoint();
+
+ if (pos != noSelectionPoint()) {
+ int maxRow = proxy->rowCount() - 1;
+ int maxCol = (pos.x() <= maxRow && pos.x() >= 0 && proxy->rowAt(pos.x()))
+ ? proxy->rowAt(pos.x())->size() - 1 : -1;
+
+ if (pos.x() < 0 || pos.x() > maxRow || pos.y() < 0 || pos.y() > maxCol)
+ pos = noSelectionPoint();
+ }
+}
+
Q3DAbstractAxis *Bars3DController::createDefaultAxis(Q3DAbstractAxis::AxisOrientation orientation)
{
Q3DAbstractAxis *defaultAxis = 0;
diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h
index f1eda225..4da6c730 100644
--- a/src/datavisualization/engine/bars3dcontroller_p.h
+++ b/src/datavisualization/engine/bars3dcontroller_p.h
@@ -61,6 +61,8 @@ private:
// Interaction
QPoint m_selectedBar; // Points to row & column in data window.
+ QBar3DSeries *m_selectedBarSeries; // Points to the series for which the bar is selected in
+ // single series selection cases.
// Look'n'feel
bool m_isBarSpecRelative;
@@ -89,10 +91,10 @@ public:
void setBarType(QDataVis::MeshStyle style, bool smooth = false);
void setSelectionMode(QDataVis::SelectionFlags mode);
- void setSelectedBar(const QPoint &position);
- QPoint selectedBar() const;
+ void setSelectedBar(const QPoint &position, QBar3DSeries *series);
virtual void handleAxisAutoAdjustRangeChangedInOrientation(Q3DAbstractAxis::AxisOrientation orientation, bool autoAdjust);
+ virtual void handleSeriesVisibilityChangedBySender(QObject *sender);
static QPoint noSelectionPoint();
@@ -116,16 +118,14 @@ public slots:
void handleDataColumnLabelsChanged();
// Renderer callback handlers
- void handleBarClicked(const QPoint &position);
-
-signals:
- void selectedBarChanged(QPoint position);
+ void handleBarClicked(const QPoint &position, QBar3DSeries *series);
protected:
virtual Q3DAbstractAxis *createDefaultAxis(Q3DAbstractAxis::AxisOrientation orientation);
private:
void adjustAxisRanges();
+ void adjustSelectionPosition(QPoint &pos, const QBar3DSeries *series);
Q_DISABLE_COPY(Bars3DController)
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)
diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h
index 5424c096..08db5e06 100644
--- a/src/datavisualization/engine/bars3drenderer_p.h
+++ b/src/datavisualization/engine/bars3drenderer_p.h
@@ -96,15 +96,16 @@ private:
GLfloat m_scaleZ;
GLfloat m_scaleFactor;
GLfloat m_maxSceneSize;
- QPoint m_visualSelectedBarPos; // The selection id color
+ QPoint m_visualSelectedBarPos;
+ int m_visualSelectedBarSeriesIndex;
int m_renderRows;
int m_renderColumns;
bool m_hasHeightAdjustmentChanged;
QPoint m_selectedBarPos;
+ const QBar3DSeries *m_selectedBarSeries;
BarRenderItem m_dummyBarRenderItem;
QVector<BarRenderItemArray> m_renderingArrays;
bool m_noZeroInRange;
- int m_seriesCount;
float m_seriesScale;
float m_seriesStep;
float m_seriesStart;
@@ -113,7 +114,7 @@ public:
explicit Bars3DRenderer(Bars3DController *controller);
~Bars3DRenderer();
- void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList);
+ void updateData();
void updateScene(Q3DScene *scene);
void render(GLuint defaultFboHandle = 0);
@@ -129,13 +130,13 @@ public slots:
bool relative = true);
void updateSlicingActive(bool isSlicing);
void updateBackgroundEnabled(bool enable);
- void updateSelectedBar(const QPoint &position);
+ void updateSelectedBar(const QPoint &position, const QBar3DSeries *series);
// Overloaded from abstract renderer
virtual void updateAxisRange(Q3DAbstractAxis::AxisOrientation orientation, qreal min, qreal max);
signals:
- void barClicked(QPoint position);
+ void barClicked(QPoint position, QBar3DSeries *series);
private:
virtual void initShaders(const QString &vertexShader, const QString &fragmentShader);
@@ -160,8 +161,9 @@ private:
#endif
void calculateSceneScalingFactors();
void calculateHeightAdjustment();
- Abstract3DController::SelectionType isSelected(GLint row, GLint bar);
+ Abstract3DController::SelectionType isSelected(int row, int bar, int seriesIndex);
QPoint selectionColorToArrayPosition(const QVector3D &selectionColor);
+ QBar3DSeries *selectionColorToSeries(const QVector3D &selectionColor);
Q_DISABLE_COPY(Bars3DRenderer)
diff --git a/src/datavisualization/engine/engine.pri b/src/datavisualization/engine/engine.pri
index 4c905fe9..7bf58379 100644
--- a/src/datavisualization/engine/engine.pri
+++ b/src/datavisualization/engine/engine.pri
@@ -16,6 +16,7 @@ HEADERS += $$PWD/q3dwindow_p.h \
$$PWD/scatter3dcontroller_p.h \
$$PWD/scatter3drenderer_p.h \
$$PWD/axisrendercache_p.h \
+ $$PWD/seriesrendercache_p.h \
$$PWD/abstract3drenderer_p.h \
$$PWD/selectionpointer_p.h \
$$PWD/q3dcamera.h \
@@ -42,6 +43,7 @@ SOURCES += $$PWD/q3dwindow.cpp \
$$PWD/scatter3dcontroller.cpp \
$$PWD/scatter3drenderer.cpp \
$$PWD/axisrendercache.cpp \
+ $$PWD/seriesrendercache.cpp \
$$PWD/abstract3drenderer.cpp \
$$PWD/selectionpointer.cpp \
$$PWD/q3dcamera.cpp \
diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp
index 3baff904..60d827bd 100644
--- a/src/datavisualization/engine/q3dbars.cpp
+++ b/src/datavisualization/engine/q3dbars.cpp
@@ -119,8 +119,6 @@ Q3DBars::Q3DBars()
&Q3DBars::gridVisibleChanged);
QObject::connect(d_ptr->m_shared, &Abstract3DController::backgroundVisibleChanged, this,
&Q3DBars::backgroundVisibleChanged);
- QObject::connect(d_ptr->m_shared, &Bars3DController::selectedBarChanged, this,
- &Q3DBars::selectedBarChanged);
QObject::connect(d_ptr->m_shared, &Abstract3DController::colorStyleChanged, this,
&Q3DBars::colorStyleChanged);
QObject::connect(d_ptr->m_shared, &Abstract3DController::objectColorChanged, this,
@@ -151,7 +149,8 @@ Q3DBars::~Q3DBars()
* so the rows and columns of all series must match for the visualized data to be meaningful.
* If the graph has multiple visible series, only the first one added will
* generate the row or column labels on the axes in cases where the labels are not explicitly set
- * to the axes.
+ * to the axes. If newly added series has specified a selected bar, it will be highlighted and
+ * any existing selection will be cleared. Only one added series can have an active selection.
*/
void Q3DBars::addSeries(QBar3DSeries *series)
{
@@ -450,24 +449,6 @@ bool Q3DBars::isBackgroundVisible() const
}
/*!
- * \property Q3DBars::selectedBar
- *
- * Selects a bar in a \a position. The position is the (row, column) position in
- * the data array of the series.
- * Only one bar can be selected at a time.
- * To clear selection, specify an illegal \a position, e.g. (-1, -1).
- */
-void Q3DBars::setSelectedBar(const QPoint &position)
-{
- d_ptr->m_shared->setSelectedBar(position);
-}
-
-QPoint Q3DBars::selectedBar() const
-{
- return d_ptr->m_shared->selectedBar();
-}
-
-/*!
* \property Q3DBars::shadowQuality
*
* Sets shadow \a quality to one of \c QDataVis::ShadowQuality. It is preset to
diff --git a/src/datavisualization/engine/q3dbars.h b/src/datavisualization/engine/q3dbars.h
index cba54dce..86a02b5d 100644
--- a/src/datavisualization/engine/q3dbars.h
+++ b/src/datavisualization/engine/q3dbars.h
@@ -47,7 +47,6 @@ class QT_DATAVISUALIZATION_EXPORT Q3DBars : public Q3DWindow
Q_PROPERTY(QtDataVisualization::QDataVis::Theme theme READ theme WRITE setTheme NOTIFY themeChanged)
Q_PROPERTY(bool gridVisible READ isGridVisible WRITE setGridVisible NOTIFY gridVisibleChanged)
Q_PROPERTY(bool backgroundVisible READ isBackgroundVisible WRITE setBackgroundVisible NOTIFY backgroundVisibleChanged)
- Q_PROPERTY(QPoint selectedBar READ selectedBar WRITE setSelectedBar NOTIFY selectedBarChanged)
Q_PROPERTY(Q3DScene* scene READ scene)
Q_PROPERTY(QtDataVisualization::QDataVis::ColorStyle colorStyle READ colorStyle WRITE setColorStyle NOTIFY colorStyleChanged)
Q_PROPERTY(QColor barColor READ barColor WRITE setBarColor NOTIFY barColorChanged)
@@ -104,9 +103,6 @@ public:
void setBackgroundVisible(bool visible);
bool isBackgroundVisible() const;
- void setSelectedBar(const QPoint &position);
- QPoint selectedBar() const;
-
void setShadowQuality(QDataVis::ShadowQuality quality);
QDataVis::ShadowQuality shadowQuality() const;
@@ -148,7 +144,6 @@ signals:
void themeChanged(QDataVis::Theme theme);
void gridVisibleChanged(bool visible);
void backgroundVisibleChanged(bool visible);
- void selectedBarChanged(QPoint position);
void colorStyleChanged(QDataVis::ColorStyle style);
void barColorChanged(QColor color);
void barGradientChanged(QLinearGradient gradient);
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index 311373da..2abb4fe9 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -83,8 +83,7 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller)
m_areaSize(QSizeF(0.0, 0.0)),
m_dotSizeScale(1.0f),
m_hasHeightAdjustmentChanged(true),
- m_drawingPoints(false),
- m_seriesCount(0)
+ m_drawingPoints(false)
{
initializeOpenGLFunctions();
initializeOpenGL();
@@ -141,14 +140,9 @@ void Scatter3DRenderer::initializeOpenGL()
loadBackgroundMesh();
}
-void Scatter3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList)
+void Scatter3DRenderer::updateData()
{
- QList<QScatter3DSeries *> visibleSeries;
- foreach (QAbstract3DSeries *current, seriesList) {
- if (current->isVisible())
- visibleSeries.append(static_cast<QScatter3DSeries *>(current));
- }
- int seriesCount = visibleSeries.size();
+ int seriesCount = m_visibleSeriesList.size();
calculateSceneScalingFactors();
float minX = float(m_axisCacheX.min());
float maxX = float(m_axisCacheX.max());
@@ -158,13 +152,12 @@ void Scatter3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &serie
float maxZ = float(m_axisCacheZ.max());
int totalDataSize = 0;
- if (m_seriesCount != seriesCount) {
- m_seriesCount = seriesCount;
- m_renderingArrays.resize(m_seriesCount);
- }
+ if (m_renderingArrays.size() != seriesCount)
+ m_renderingArrays.resize(seriesCount);
- for (int series = 0; series < m_seriesCount; series++) {
- QScatterDataProxy *dataProxy = visibleSeries.at(series)->dataProxy();
+ for (int series = 0; series < seriesCount; series++) {
+ QScatterDataProxy *dataProxy =
+ static_cast<QScatter3DSeries *>(m_visibleSeriesList.at(series).series())->dataProxy();
const QScatterDataArray &dataArray = *dataProxy->array();
int dataSize = dataArray.size();
totalDataSize += dataSize;
@@ -188,8 +181,6 @@ void Scatter3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &serie
}
m_dotSizeScale = (GLfloat)qBound(0.01, (2.0 / qSqrt((qreal)totalDataSize)), 0.1);
m_selectedItem = 0;
-
- Abstract3DRenderer::updateSeriesData(seriesList);
}
void Scatter3DRenderer::updateScene(Q3DScene *scene)
@@ -242,6 +233,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
QMatrix4x4 projectionViewMatrix = projectionMatrix * viewMatrix;
+ int seriesCount = m_visibleSeriesList.size();
+
// Calculate label flipping
if (viewMatrix.row(0).x() > 0)
m_zFlipped = false;
@@ -337,7 +330,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
depthProjectionViewMatrix = depthProjectionMatrix * depthViewMatrix;
// Draw dots to depth buffer
- for (int series = 0; series < m_seriesCount; series++) {
+ for (int series = 0; series < seriesCount; series++) {
for (int dot = 0; dot < m_renderingArrays.at(series).size(); dot++) {
const ScatterRenderItem &item = m_renderingArrays.at(series).at(dot);
if (!item.isVisible())
@@ -440,7 +433,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
int totalArraySize = 0;
int dotNo = 0;
- for (int series = 0; series < m_seriesCount; series++) {
+ for (int series = 0; series < seriesCount; series++) {
arraySize = m_renderingArrays.at(series).size();
totalArraySize += arraySize;
@@ -563,9 +556,10 @@ 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 < m_seriesCount; series++) {
+ for (int series = 0; series < seriesCount; series++) {
// TODO: Color per series. Let's just hack it while testing with 2 series QTRD-2557
QVector3D baseColor = Utils::vectorFromColor(m_cachedObjectColor) * (series + 0.25f);
QVector3D dotColor = baseColor;
@@ -610,6 +604,7 @@ 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;
}
@@ -1364,7 +1359,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
static const QString yLabelTag(QStringLiteral("@yLabel"));
static const QString zLabelTag(QStringLiteral("@zLabel"));
- labelText = itemLabelFormat();
+ labelText = m_visibleSeriesList[selectedSeriesIndex].itemLabelFormat();
labelText.replace(xTitleTag, m_axisCacheX.title());
labelText.replace(yTitleTag, m_axisCacheY.title());
diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h
index 6513e571..bba790a1 100644
--- a/src/datavisualization/engine/scatter3drenderer_p.h
+++ b/src/datavisualization/engine/scatter3drenderer_p.h
@@ -89,13 +89,12 @@ private:
bool m_drawingPoints;
ScatterRenderItem m_dummyRenderItem;
QVector<ScatterRenderItemArray> m_renderingArrays;
- int m_seriesCount;
public:
explicit Scatter3DRenderer(Scatter3DController *controller);
~Scatter3DRenderer();
- void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList);
+ void updateData();
void updateScene(Q3DScene *scene);
void render(GLuint defaultFboHandle);
diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp
new file mode 100644
index 00000000..53bc97a1
--- /dev/null
+++ b/src/datavisualization/engine/seriesrendercache.cpp
@@ -0,0 +1,42 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "seriesrendercache_p.h"
+
+QT_DATAVISUALIZATION_BEGIN_NAMESPACE
+
+SeriesRenderCache::SeriesRenderCache()
+ : m_series(0)
+{
+}
+
+SeriesRenderCache::~SeriesRenderCache()
+{
+}
+
+void SeriesRenderCache::populate(QAbstract3DSeries *series)
+{
+ Q_ASSERT(series);
+
+ m_series = series;
+ m_itemLabelFormat = series->itemLabelFormat();
+
+ // TODO: Add other visual element extractions
+}
+
+QT_DATAVISUALIZATION_END_NAMESPACE
diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h
new file mode 100644
index 00000000..34b1d97d
--- /dev/null
+++ b/src/datavisualization/engine/seriesrendercache_p.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QtDataVisualization API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#ifndef SERIESRENDERCACHE_P_H
+#define SERIESRENDERCACHE_P_H
+
+#include "datavisualizationglobal_p.h"
+#include "qabstract3dseries_p.h"
+
+QT_DATAVISUALIZATION_BEGIN_NAMESPACE
+
+class SeriesRenderCache
+{
+public:
+ SeriesRenderCache();
+ virtual ~SeriesRenderCache();
+
+ void populate(QAbstract3DSeries *series);
+
+ inline const QString &itemLabelFormat() const { return m_itemLabelFormat; }
+
+ // NOTE: Series pointer can only be used to access the series when syncing with controller.
+ // It is not guaranteed to be valid while rendering and should only be used as an identifier.
+ inline QAbstract3DSeries *series() const { return m_series; }
+
+ // TODO: Add other visual elements
+
+protected:
+ QString m_itemLabelFormat;
+ QAbstract3DSeries *m_series;
+};
+
+QT_DATAVISUALIZATION_END_NAMESPACE
+
+#endif
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index e8b0a0f4..85e189f8 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -197,12 +197,12 @@ void Surface3DRenderer::initializeOpenGL()
loadBackgroundMesh();
}
-void Surface3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &seriesList)
+void Surface3DRenderer::updateData()
{
// Surface only supports single series for now, so we are only interested in the first series
const QSurfaceDataArray *array = 0;
- if (seriesList.size()) {
- QSurface3DSeries *firstSeries = static_cast<QSurface3DSeries *>(seriesList.at(0));
+ if (m_visibleSeriesList.size()) {
+ QSurface3DSeries *firstSeries = static_cast<QSurface3DSeries *>(m_visibleSeriesList.at(0).series());
m_cachedSurfaceVisible = firstSeries->isVisible(); // TODO: To series visuals update?
if (m_cachedSurfaceGridOn || m_cachedSurfaceVisible) {
QSurfaceDataProxy *dataProxy = firstSeries->dataProxy();
@@ -268,8 +268,6 @@ void Surface3DRenderer::updateSeriesData(const QList<QAbstract3DSeries *> &serie
m_sliceDataArray.clear();
m_selectionDirty = true;
-
- Abstract3DRenderer::updateSeriesData(seriesList);
}
void Surface3DRenderer::updateSliceDataModel(const QPoint &point)
@@ -1871,7 +1869,8 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id)
QString Surface3DRenderer::createSelectionLabel(qreal value, int column, int row)
{
- QString labelText = itemLabelFormat();
+ // TODO: Get from correct series once multiple series supported
+ QString labelText = m_visibleSeriesList[0].itemLabelFormat();
static const QString xTitleTag(QStringLiteral("@xTitle"));
static const QString yTitleTag(QStringLiteral("@yTitle"));
static const QString zTitleTag(QStringLiteral("@zTitle"));
diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h
index 45222564..5ac20e0e 100644
--- a/src/datavisualization/engine/surface3drenderer_p.h
+++ b/src/datavisualization/engine/surface3drenderer_p.h
@@ -132,7 +132,7 @@ public:
explicit Surface3DRenderer(Surface3DController *controller);
~Surface3DRenderer();
- void updateSeriesData(const QList<QAbstract3DSeries *> &seriesList);
+ void updateData();
void updateScene(Q3DScene *scene);
bool updateSmoothStatus(bool enable);
void updateSurfaceGridStatus(bool enable);