Multiseries support for surface slice

Task-number: QTRD-2867

Change-Id: I705e3b743ab9d561d93039a60288d71627db8661
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
This commit is contained in:
Mika Salmela 2014-02-11 13:55:59 +02:00
parent 911770952a
commit 64acaf065f
5 changed files with 78 additions and 48 deletions

View File

@ -394,60 +394,73 @@ void Surface3DRenderer::updateItem(const QVector<Surface3DController::ChangeItem
}
void Surface3DRenderer::updateSliceDataModel(const QPoint &point)
{
foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList)
cache->sliceSurfaceObject()->clear();
if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionMultiSeries)) {
foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList)
updateSliceObject(cache, point);
} else {
if (m_selectedSeries) {
SurfaceSeriesRenderCache *cache =
m_renderCacheList.value(const_cast<QSurface3DSeries *>(m_selectedSeries));
if (cache)
updateSliceObject(cache, point);
}
}
}
void Surface3DRenderer::updateSliceObject(SurfaceSeriesRenderCache *cache, const QPoint &point)
{
int column = point.y();
int row = point.x();
foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) {
QSurfaceDataArray &sliceDataArray = cache->sliceDataArray();
for (int i = 0; i < sliceDataArray.size(); i++)
delete sliceDataArray.at(i);
sliceDataArray.clear();
sliceDataArray.reserve(2);
QSurfaceDataArray &sliceDataArray = cache->sliceDataArray();
for (int i = 0; i < sliceDataArray.size(); i++)
delete sliceDataArray.at(i);
sliceDataArray.clear();
sliceDataArray.reserve(2);
QSurfaceDataRow *sliceRow;
QSurfaceDataArray &dataArray = cache->dataArray();
float adjust = (0.025f * m_heightNormalizer) / 2.0f;
float stepDown = 2.0f * adjust;
if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow)) {
QSurfaceDataRow *src = dataArray.at(row);
sliceRow = new QSurfaceDataRow(src->size());
for (int i = 0; i < sliceRow->size(); i++)
(*sliceRow)[i].setPosition(QVector3D(src->at(i).x(), src->at(i).y() + adjust, -1.0f));
QSurfaceDataRow *sliceRow;
QSurfaceDataArray &dataArray = cache->dataArray();
float adjust = (0.025f * m_heightNormalizer) / 2.0f;
float stepDown = 2.0f * adjust;
if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow)) {
QSurfaceDataRow *src = dataArray.at(row);
sliceRow = new QSurfaceDataRow(src->size());
for (int i = 0; i < sliceRow->size(); i++)
(*sliceRow)[i].setPosition(QVector3D(src->at(i).x(), src->at(i).y() + adjust, -1.0f));
} else {
QRect sampleSpace = cache->sampleSpace();
sliceRow = new QSurfaceDataRow(sampleSpace.height());
for (int i = 0; i < sampleSpace.height(); i++) {
(*sliceRow)[i].setPosition(QVector3D(dataArray.at(i)->at(column).z(),
dataArray.at(i)->at(column).y() + adjust,
-1.0f));
}
}
sliceDataArray << sliceRow;
// Make a duplicate, so that we get a little bit depth
QSurfaceDataRow *duplicateRow = new QSurfaceDataRow(*sliceRow);
for (int i = 0; i < sliceRow->size(); i++) {
(*sliceRow)[i].setPosition(QVector3D(sliceRow->at(i).x(),
sliceRow->at(i).y() - stepDown,
1.0f));
}
sliceDataArray << duplicateRow;
QRect sliceRect(0, 0, sliceRow->size(), 2);
if (sliceRow->size() > 0) {
if (cache->isFlatShadingEnabled()) {
cache->sliceSurfaceObject()->setUpData(sliceDataArray, sliceRect,
m_heightNormalizer,
m_axisCacheY.min(), true);
} else {
QRect sampleSpace = cache->sampleSpace();
sliceRow = new QSurfaceDataRow(sampleSpace.height());
for (int i = 0; i < sampleSpace.height(); i++) {
(*sliceRow)[i].setPosition(QVector3D(dataArray.at(i)->at(column).z(),
dataArray.at(i)->at(column).y() + adjust,
-1.0f));
}
}
sliceDataArray << sliceRow;
// Make a duplicate, so that we get a little bit depth
QSurfaceDataRow *duplicateRow = new QSurfaceDataRow(*sliceRow);
for (int i = 0; i < sliceRow->size(); i++) {
(*sliceRow)[i].setPosition(QVector3D(sliceRow->at(i).x(),
sliceRow->at(i).y() - stepDown,
1.0f));
}
sliceDataArray << duplicateRow;
QRect sliceRect(0, 0, sliceRow->size(), 2);
if (sliceRow->size() > 0) {
if (cache->isFlatShadingEnabled()) {
cache->sliceSurfaceObject()->setUpData(sliceDataArray, sliceRect,
m_heightNormalizer,
m_axisCacheY.min(), true);
} else {
cache->sliceSurfaceObject()->setUpSmoothData(sliceDataArray, sliceRect,
m_heightNormalizer,
m_axisCacheY.min(), true);
}
cache->sliceSurfaceObject()->setUpSmoothData(sliceDataArray, sliceRect,
m_heightNormalizer,
m_axisCacheY.min(), true);
}
}
}

View File

@ -131,6 +131,7 @@ private:
void checkFlatSupport(SurfaceSeriesRenderCache *cache);
void updateObjects(SurfaceSeriesRenderCache *cache, bool dimensionChanged);
void updateSliceDataModel(const QPoint &point);
void updateSliceObject(SurfaceSeriesRenderCache *cache, const QPoint &point);
void updateShadowQuality(QAbstract3DGraph::ShadowQuality quality);
void updateTextures();
void initShaders(const QString &vertexShader, const QString &fragmentShader);

View File

@ -682,6 +682,13 @@ QVector3D SurfaceObject::vertexAt(int column, int row)
return m_vertices.at(pos);
}
void SurfaceObject::clear()
{
m_gridIndexCount = 0;
m_indexCount = 0;
m_surfaceType = Undefined;
}
QVector3D SurfaceObject::normal(const QVector3D &a, const QVector3D &b, const QVector3D &c)
{
QVector3D v1 = b - a;

View File

@ -70,6 +70,7 @@ public:
GLuint gridElementBuf();
GLuint gridIndexCount();
QVector3D vertexAt(int column, int row);
void clear();
private:
QVector3D normal(const QVector3D &a, const QVector3D &b, const QVector3D &c);

View File

@ -267,14 +267,22 @@ int main(int argc, char *argv[])
int(QAbstract3DGraph::SelectionRowAndColumn));
selectionMode->addItem(QStringLiteral("Item, Row and Column"),
int(QAbstract3DGraph::SelectionItemRowAndColumn));
selectionMode->addItem(QStringLiteral("Multi: Item, Row and Column"),
int(QAbstract3DGraph::SelectionItemRowAndColumn | QAbstract3DGraph::SelectionMultiSeries));
selectionMode->addItem(QStringLiteral("Slice into Row"),
int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionRow));
selectionMode->addItem(QStringLiteral("Slice into Row and Item"),
int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow));
selectionMode->addItem(QStringLiteral("Multi: Slice, Row & Item"),
int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow
| QAbstract3DGraph::SelectionMultiSeries));
selectionMode->addItem(QStringLiteral("Slice into Column"),
int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionColumn));
selectionMode->addItem(QStringLiteral("Slice into Column and Item"),
int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn));
selectionMode->addItem(QStringLiteral("Multi: Slice, Column & Item"),
int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn
| QAbstract3DGraph::SelectionMultiSeries));
selectionMode->setCurrentIndex(1);
#ifndef MULTI_SERIES