summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorMika Salmela <mika.salmela@digia.com>2013-09-06 12:17:06 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-09-06 13:53:19 +0300
commit294a23e02474838186cc102a8ec9e50aa159a2dd (patch)
treea7c67cc66ffdf3dc08f753b2a1c4fffda60dd1a4 /examples
parent48ec1d061bfd202f68f8c6771917fa22f9e45733 (diff)
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 <miikka.heikkinen@digia.com>
Diffstat (limited to 'examples')
-rw-r--r--examples/surfacechart/Heightmap.pngbin0 -> 71764 bytes
-rw-r--r--examples/surfacechart/chartmodifier.cpp74
-rw-r--r--examples/surfacechart/chartmodifier.h1
-rw-r--r--examples/surfacechart/main.cpp7
-rw-r--r--examples/surfacechart/surface.qrc5
-rw-r--r--examples/surfacechart/surfacechart.pro3
6 files changed, 70 insertions, 20 deletions
diff --git a/examples/surfacechart/Heightmap.png b/examples/surfacechart/Heightmap.png
new file mode 100644
index 00000000..2a860111
--- /dev/null
+++ b/examples/surfacechart/Heightmap.png
Binary files 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 <Q3DValueAxis>
+#include <QSurfaceDataProxy>
#include <qmath.h>
@@ -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<qreal> 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<qreal> 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 @@
+<RCC>
+ <qresource prefix="/maps">
+ <file alias="map">Heightmap.png</file>
+ </qresource>
+</RCC>
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