From 294a23e02474838186cc102a8ec9e50aa159a2dd Mon Sep 17 00:00:00 2001 From: Mika Salmela Date: Fri, 6 Sep 2013 12:17:06 +0300 Subject: First step for using proxy in surface TODOS: - handling for deletions, insertions and modifications - some solution for axis handling Change-Id: I5a35a45e103d1a4393ca8747a7a99af95147da90 Reviewed-by: Miikka Heikkinen --- examples/surfacechart/Heightmap.png | Bin 0 -> 71764 bytes examples/surfacechart/chartmodifier.cpp | 74 ++++++++++++++++++++++++-------- examples/surfacechart/chartmodifier.h | 1 + examples/surfacechart/main.cpp | 7 +++ examples/surfacechart/surface.qrc | 5 +++ examples/surfacechart/surfacechart.pro | 3 +- 6 files changed, 70 insertions(+), 20 deletions(-) create mode 100644 examples/surfacechart/Heightmap.png create mode 100644 examples/surfacechart/surface.qrc (limited to 'examples') diff --git a/examples/surfacechart/Heightmap.png b/examples/surfacechart/Heightmap.png new file mode 100644 index 00000000..2a860111 Binary files /dev/null and b/examples/surfacechart/Heightmap.png differ diff --git a/examples/surfacechart/chartmodifier.cpp b/examples/surfacechart/chartmodifier.cpp index bfd032f7..30df0998 100644 --- a/examples/surfacechart/chartmodifier.cpp +++ b/examples/surfacechart/chartmodifier.cpp @@ -18,6 +18,7 @@ #include "chartmodifier.h" #include +#include #include @@ -33,6 +34,9 @@ ChartModifier::ChartModifier(Q3DSurface *chart) m_chart->setAxisX(new Q3DValueAxis); m_chart->setAxisY(new Q3DValueAxis); m_chart->setAxisZ(new Q3DValueAxis); + + QSurfaceDataProxy *proxy = new QSurfaceDataProxy; + m_chart->setActiveDataProxy(proxy); } ChartModifier::~ChartModifier() @@ -56,7 +60,6 @@ void ChartModifier::toggleSqrtSin(bool enable) { qreal biggest = -9999.0; qreal smallest = 9999.0; - QList series; if (enable) { qDebug() << "Create Sqrt&Sin surface, (" << m_xCount << ", " << m_zCount << ")"; @@ -64,22 +67,27 @@ void ChartModifier::toggleSqrtSin(bool enable) qreal stepZ = 16.0 / qreal(m_zCount); qreal stepX = 16.0 / qreal(m_xCount); + QSurfaceDataArray *dataArray = new QSurfaceDataArray; + dataArray->reserve(m_zCount); for (qreal i = -8.0 + stepZ / 2.0 ; i < 8.0 ; i += stepZ) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + int index = 0; for (qreal j = -8.0 + stepX / 2.0; j < 8.0; j += stepX) { qreal R = qSqrt(i*i + j*j) + 0.01; qreal y = (sin(R)/R + 0.24) * 1.61; - series << y; + (*newRow)[index++] = y; if (y > biggest) biggest = y; if (y < smallest) smallest = y; } + *dataArray << newRow; } - m_chart->setSegmentCount(4, 0.5f); // Going to be obsolete - m_chart->appendSeries(series, m_xCount, m_zCount); - - m_chart->axisZ()->setSegmentCount(7); + m_chart->axisX()->setRange(0.0, qreal(m_xCount - 1)); + m_chart->axisY()->setRange(0.0, 2.0); + m_chart->axisZ()->setRange(0.0, qreal(m_zCount - 1)); + m_chart->activeDataProxy()->resetArray(dataArray); - qDebug() << "biggest = " << biggest << ", smallest = " << smallest; + //qDebug() << "biggest = " << biggest << ", smallest = " << smallest; } else { qDebug() << "Remove surface"; } @@ -88,24 +96,52 @@ void ChartModifier::toggleSqrtSin(bool enable) void ChartModifier::togglePlane(bool enable) { qDebug() << "ChartModifier::togglePlane " << enable; - if (enable) { - QList series; + if (enable) { + QSurfaceDataArray *dataArray = new QSurfaceDataArray; qreal y = 2.0 / qreal(m_zCount - 1); + dataArray->reserve(m_zCount); for (int i = 0; i < m_zCount; i++) { - for (int j = 0; j < m_xCount; j++) { - series << i * y; - } + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + for (int j = 0; j < m_xCount; j++) + (*newRow)[j] = i * y; + *dataArray << newRow; } - m_chart->setSegmentCount(4, 0.5f); - m_chart->appendSeries(series, m_xCount, m_zCount); - m_chart->axisX()->setSegmentCount(m_xCount - 1); - m_chart->axisX()->setRange(1.0, qreal(m_xCount)); - m_chart->axisY()->setSegmentCount(4); + m_chart->axisX()->setSegmentCount(3); + m_chart->axisX()->setRange(0.0, qreal(m_xCount - 1)); + //m_chart->axisY()->setSegmentCount(4); m_chart->axisY()->setRange(0.0, 2.0); - m_chart->axisZ()->setSegmentCount(m_zCount - 1); - m_chart->axisZ()->setRange(1.0, qreal(m_zCount)); + //m_chart->axisZ()->setSegmentCount(4/*m_zCount - 1*/); + m_chart->axisZ()->setRange(0.0, qreal(m_zCount - 1)); + + m_chart->activeDataProxy()->resetArray(dataArray); + } +} + +void ChartModifier::setHeightMapData(bool enable) +{ + if (enable) { + QImage image(":/maps/map"); + + QSurfaceDataArray *dataArray = new QSurfaceDataArray; + uchar *bits = image.bits(); + + int p = image.width() * 4 * (image.height() - 1); + dataArray->reserve(image.height()); + qDebug() << image.height() << image.width(); + for (int i = image.height(); i > 0; i--, p -= image.width() * 4) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(image.width()); + for (int j = 0; j < image.width(); j++) + (*newRow)[j] = (qreal(bits[p + (j * 4)]) + 1.0) / 1.0; + *dataArray << newRow; + } + + m_chart->axisX()->setRange(0.0, qreal(image.width() - 1)); + m_chart->axisY()->setRange(0.0, 255.0); + m_chart->axisZ()->setRange(0.0, qreal(image.height() - 1)); + + m_chart->activeDataProxy()->resetArray(dataArray); } } diff --git a/examples/surfacechart/chartmodifier.h b/examples/surfacechart/chartmodifier.h index 3ab2d179..3c0f8ad9 100644 --- a/examples/surfacechart/chartmodifier.h +++ b/examples/surfacechart/chartmodifier.h @@ -35,6 +35,7 @@ public: void toggleSurfaceGrid(bool enable); void toggleSqrtSin(bool enable); void togglePlane(bool enable); + void setHeightMapData(bool enable); void toggleGridSliderLock(bool enable); void setGridSliderX(QSlider *slider) { m_gridSliderX = slider; } void setGridSliderZ(QSlider *slider) { m_gridSliderZ = slider; } diff --git a/examples/surfacechart/main.cpp b/examples/surfacechart/main.cpp index 1297d92b..00fd8627 100644 --- a/examples/surfacechart/main.cpp +++ b/examples/surfacechart/main.cpp @@ -72,6 +72,10 @@ int main(int argc, char *argv[]) planeCB->setText(QStringLiteral("Plane")); planeCB->setChecked(false); + QCheckBox *heightMapCB = new QCheckBox(widget); + heightMapCB->setText(QStringLiteral("Height map")); + heightMapCB->setChecked(false); + QCheckBox *gridSlidersLockCB = new QCheckBox(widget); gridSlidersLockCB->setText(QStringLiteral("Lock")); gridSlidersLockCB->setChecked(false); @@ -110,6 +114,7 @@ int main(int argc, char *argv[]) vLayout->addWidget(new QLabel(QStringLiteral("Select surface sample"))); vLayout->addWidget(sqrtSinCB); vLayout->addWidget(planeCB); + vLayout->addWidget(heightMapCB); vLayout->addWidget(new QLabel(QStringLiteral("Adjust sample count"))); vLayout->addWidget(gridSlidersLockCB); vLayout->addWidget(gridSliderX); @@ -129,6 +134,8 @@ int main(int argc, char *argv[]) modifier, &ChartModifier::toggleSqrtSin); QObject::connect(planeCB, &QCheckBox::stateChanged, modifier, &ChartModifier::togglePlane); + QObject::connect(heightMapCB, &QCheckBox::stateChanged, + modifier, &ChartModifier::setHeightMapData); QObject::connect(gridSlidersLockCB, &QCheckBox::stateChanged, modifier, &ChartModifier::toggleGridSliderLock); QObject::connect(gridSliderX, &QSlider::valueChanged, diff --git a/examples/surfacechart/surface.qrc b/examples/surfacechart/surface.qrc new file mode 100644 index 00000000..c18da2c4 --- /dev/null +++ b/examples/surfacechart/surface.qrc @@ -0,0 +1,5 @@ + + + Heightmap.png + + diff --git a/examples/surfacechart/surfacechart.pro b/examples/surfacechart/surfacechart.pro index 6b3067ae..2ebc90da 100644 --- a/examples/surfacechart/surfacechart.pro +++ b/examples/surfacechart/surfacechart.pro @@ -12,4 +12,5 @@ INSTALLS += target HEADERS += \ chartmodifier.h -QT += widgets +RESOURCES += \ + surface.qrc -- cgit v1.2.3