summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2014-11-06 10:46:49 +0200
committerMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2014-11-06 10:48:41 +0200
commitbc317e1ea56c85a41413a5ddde4112623a1b4913 (patch)
treee51b2b78f81940cfc70b49953308197080cd368f
parent03cbebd97354b7251e87dcde8adc6b49eba973e5 (diff)
parent46ef32d424d7e0209e52528286e31f656c654289 (diff)
Merge branch 'develop'
-rw-r--r--README3
-rw-r--r--examples/datavisualization/qmloscilloscope/datasource.cpp4
-rw-r--r--examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml2
-rw-r--r--src/datavisualization/data/labelitem.cpp7
-rw-r--r--src/datavisualization/doc/src/qtdatavisualization.qdoc2
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp5
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h4
-rw-r--r--src/datavisualization/utils/qutils.h59
-rw-r--r--src/datavisualization/utils/texturehelper.cpp2
-rw-r--r--src/datavisualization/utils/utils.cpp80
-rw-r--r--src/datavisualization/utils/utils_p.h1
-rw-r--r--src/datavisualizationqml2/designer/Scatter3DSpecifics.qml2
-rw-r--r--src/datavisualizationqml2/designer/Surface3DSpecifics.qml2
-rw-r--r--src/datavisualizationqml2/glstatestore.cpp4
-rw-r--r--src/datavisualizationqml2/glstatestore_p.h2
-rw-r--r--tests/auto/cpptest/q3dscene/tst_scene.cpp2
-rw-r--r--tests/barstest/main.cpp22
-rw-r--r--tests/qmlperf/datagenerator.cpp67
-rw-r--r--tests/qmlperf/datagenerator.h (renamed from tests/qmlperf/qml/qmlperf/script.js)36
-rw-r--r--tests/qmlperf/main.cpp6
-rw-r--r--tests/qmlperf/qml/qmlperf/main.qml18
-rw-r--r--tests/qmlperf/qmlperf.pro6
-rw-r--r--tests/qmlperf/qmlperf.qrc1
23 files changed, 232 insertions, 105 deletions
diff --git a/README b/README
index 667dcdaa..96099dbe 100644
--- a/README
+++ b/README
@@ -88,4 +88,5 @@ Known Issues
"QT += datavisualization" in the pro file. This is because Qt Data Visualization QML plugin has
a dependency to Qt Data Visualization C++ library, which Qt Creator doesn't automatically add
to the deployment package.
-
+- Only OpenGL ES2 emulation is available for software renderer (that is, when using
+ QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL))
diff --git a/examples/datavisualization/qmloscilloscope/datasource.cpp b/examples/datavisualization/qmloscilloscope/datasource.cpp
index f466b2b0..353c878b 100644
--- a/examples/datavisualization/qmloscilloscope/datasource.cpp
+++ b/examples/datavisualization/qmloscilloscope/datasource.cpp
@@ -45,7 +45,7 @@ void DataSource::generateData(int cacheCount, int rowCount, int columnCount,
float xMin, float xMax, float yMin, float yMax,
float zMin, float zMax)
{
- if (!cacheCount)
+ if (!cacheCount || !rowCount || !columnCount)
return;
clearData();
@@ -84,7 +84,7 @@ void DataSource::generateData(int cacheCount, int rowCount, int columnCount,
float colWave = float(qSin((2.0 * M_PI * colMod) - (1.0 / 2.0 * M_PI)) + 1.0);
float y = (colWave * ((float(qSin(rowColWaveAngleMul * colMod) + 1.0))))
* rowColWaveMul
- + (0.15f * float(rand()) / float(RAND_MAX)) * yRangeMod;
+ + (0.15f * float(qrand()) / float(RAND_MAX)) * yRangeMod;
int index = k + cacheIndexAdjustment;
if (index >= columnCount) {
diff --git a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml
index c2e6b70b..2ad43e97 100644
--- a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml
+++ b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml
@@ -150,7 +150,7 @@ Item {
maximumValue: minimumValue * 10
stepSize: mainView.sampleCache
updateValueWhileDragging: false
- value: minimumValue * 2
+ Component.onCompleted: value = minimumValue * 2
}
Rectangle {
diff --git a/src/datavisualization/data/labelitem.cpp b/src/datavisualization/data/labelitem.cpp
index ec8ba3fd..4e0e9b5c 100644
--- a/src/datavisualization/data/labelitem.cpp
+++ b/src/datavisualization/data/labelitem.cpp
@@ -28,7 +28,7 @@ LabelItem::LabelItem()
LabelItem::~LabelItem()
{
- QOpenGLContext::currentContext()->functions()->glDeleteTextures(1, &m_textureId);
+ clear();
}
void LabelItem::setSize(const QSize &size)
@@ -54,10 +54,9 @@ GLuint LabelItem::textureId() const
void LabelItem::clear()
{
- if (m_textureId) {
+ if (m_textureId && QOpenGLContext::currentContext())
QOpenGLContext::currentContext()->functions()->glDeleteTextures(1, &m_textureId);
- m_textureId = 0;
- }
+ m_textureId = 0;
m_size = QSize(0, 0);
}
diff --git a/src/datavisualization/doc/src/qtdatavisualization.qdoc b/src/datavisualization/doc/src/qtdatavisualization.qdoc
index b07074b1..c243a1cd 100644
--- a/src/datavisualization/doc/src/qtdatavisualization.qdoc
+++ b/src/datavisualization/doc/src/qtdatavisualization.qdoc
@@ -338,6 +338,8 @@
"QT += datavisualization" in the pro file. This is because Qt Data Visualization
QML plugin has a dependency to Qt Data Visualization C++ library, which Qt Creator
doesn't automatically add to the deployment package.
+ \li Only OpenGL ES2 emulation is available for software renderer (that is, when using
+ QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL))
\endlist
*/
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index cfc691af..fc3b4a19 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -28,7 +28,7 @@
#include "scatter3drenderer_p.h"
#include <QtCore/qmath.h>
-#include <QtGui/QWindow>
+#include <QtGui/QOffscreenSurface>
#include <QtCore/QThread>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -1789,8 +1789,7 @@ void Abstract3DRenderer::fixContextBeforeDelete()
// Otherwise we expect it to be our shared context, so we can use it for cleanup.
if (!QOpenGLContext::currentContext() && !m_context.isNull()
&& QThread::currentThread() == this->thread()) {
- m_dummySurfaceAtDelete = new QWindow();
- m_dummySurfaceAtDelete->setSurfaceType(QWindow::OpenGLSurface);
+ m_dummySurfaceAtDelete = new QOffscreenSurface();
m_dummySurfaceAtDelete->setFormat(m_context->format());
m_dummySurfaceAtDelete->create();
diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h
index 1e38023d..15793797 100644
--- a/src/datavisualization/engine/abstract3drenderer_p.h
+++ b/src/datavisualization/engine/abstract3drenderer_p.h
@@ -39,7 +39,7 @@
#include "seriesrendercache_p.h"
#include "customrenderitem_p.h"
-class QSurface;
+class QOffscreenSurface;
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -327,7 +327,7 @@ protected:
QOpenGLFunctions_2_1 *m_funcs_2_1; // Not owned
#endif
QPointer<QOpenGLContext> m_context; // Not owned
- QWindow *m_dummySurfaceAtDelete;
+ QOffscreenSurface *m_dummySurfaceAtDelete;
bool m_isOpenGLES;
private:
diff --git a/src/datavisualization/utils/qutils.h b/src/datavisualization/utils/qutils.h
index d4acfc99..93226be9 100644
--- a/src/datavisualization/utils/qutils.h
+++ b/src/datavisualization/utils/qutils.h
@@ -20,29 +20,70 @@
#define QUTILS_H
#include <QtGui/QSurfaceFormat>
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QOffscreenSurface>
+#include <QtCore/QCoreApplication>
namespace QtDataVisualization {
inline static QSurfaceFormat qDefaultSurfaceFormat(bool antialias = true)
{
+ bool isES = false;
+
QSurfaceFormat surfaceFormat;
+ // Common attributes
surfaceFormat.setDepthBufferSize(24);
surfaceFormat.setStencilBufferSize(8);
surfaceFormat.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
surfaceFormat.setRenderableType(QSurfaceFormat::DefaultRenderableType);
+
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ QOffscreenSurface *dummySurface = 0;
+ if (!ctx) {
+ dummySurface = new QOffscreenSurface();
+ dummySurface->setFormat(surfaceFormat);
+ dummySurface->create();
+ ctx = new QOpenGLContext;
+ ctx->setFormat(surfaceFormat);
+ ctx->create();
+ ctx->makeCurrent(dummySurface);
+ }
+
#if defined(QT_OPENGL_ES_2)
- // Antialias not supported for ES
- antialias = false;
- surfaceFormat.setRedBufferSize(8);
- surfaceFormat.setBlueBufferSize(8);
- surfaceFormat.setGreenBufferSize(8);
+ isES = true;
+#elif (QT_VERSION < QT_VERSION_CHECK(5, 3, 0))
+ isES = false;
+#else
+ isES = ctx->isOpenGLES();
+#endif
+
+ if (dummySurface) {
+ ctx->doneCurrent();
+ delete ctx;
+ delete dummySurface;
+ }
+
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0))
+ // We support only ES2 emulation with software renderer for now
+ if (QCoreApplication::testAttribute(Qt::AA_UseSoftwareOpenGL)) {
+ qWarning("Only OpenGL ES2 emulation is available for software rendering.");
+ isES = true;
+ }
#endif
- if (antialias)
- surfaceFormat.setSamples(8);
- else
- surfaceFormat.setSamples(0);
+ if (isES) {
+ // For ES2 only attributes
+ surfaceFormat.setRedBufferSize(8);
+ surfaceFormat.setBlueBufferSize(8);
+ surfaceFormat.setGreenBufferSize(8);
+ } else {
+ // For OpenGL only attributes
+ if (antialias)
+ surfaceFormat.setSamples(8);
+ else
+ surfaceFormat.setSamples(0);
+ }
return surfaceFormat;
}
diff --git a/src/datavisualization/utils/texturehelper.cpp b/src/datavisualization/utils/texturehelper.cpp
index 3944fb0c..16396de7 100644
--- a/src/datavisualization/utils/texturehelper.cpp
+++ b/src/datavisualization/utils/texturehelper.cpp
@@ -58,7 +58,7 @@ GLuint TextureHelper::create2DTexture(const QImage &image, bool useTrilinearFilt
QImage texImage = image;
- if (!Utils::isOpenGLES()) {
+ if (Utils::isOpenGLES()) {
GLuint imageWidth = Utils::getNearestPowerOfTwo(image.width());
GLuint imageHeight = Utils::getNearestPowerOfTwo(image.height());
if (smoothScale) {
diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp
index 42a1e532..7f10bac7 100644
--- a/src/datavisualization/utils/utils.cpp
+++ b/src/datavisualization/utils/utils.cpp
@@ -21,14 +21,17 @@
#include <QtGui/QPainter>
#include <QtGui/QOpenGLContext>
-#include <QtGui/QWindow>
+#include <QtGui/QOffscreenSurface>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
#define NUM_IN_POWER(y, x) for (;y<x;y<<=1)
#define MIN_POWER 2
-static GLint maxTextureSize = 0; // Safe, as all instances have the same texture size
+// Some values that only need to be resolved once
+static bool staticsResolved = false;
+static GLint maxTextureSize = 0;
+static bool isES = false;
GLuint Utils::getNearestPowerOfTwo(GLuint value)
{
@@ -58,10 +61,9 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo
const QColor &txtColor, bool labelBackground,
bool borders, int maxLabelWidth)
{
- if (maxTextureSize == 0) {
- QOpenGLContext::currentContext()->functions()->glGetIntegerv(
- GL_MAX_TEXTURE_SIZE, &maxTextureSize);
- }
+ if (!staticsResolved)
+ resolveStatics();
+
GLuint paddingWidth = 20;
GLuint paddingHeight = 20;
GLuint prePadding = 20;
@@ -87,7 +89,7 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo
// make a label with large empty space
uint testWidth = getNearestPowerOfTwo(valueStrWidth + prePadding) >> 1;
int diffToFit = (valueStrWidth + prePadding) - testWidth;
- int maxSqueeze = int((valueStrWidth + prePadding) * 0.1f);
+ int maxSqueeze = int((valueStrWidth + prePadding) * 0.25f);
if (diffToFit < maxSqueeze && maxTextureSize > GLint(testWidth))
targetWidth = testWidth;
}
@@ -317,39 +319,51 @@ QQuaternion Utils::calculateRotation(const QVector3D &xyzRotations)
bool Utils::isOpenGLES()
{
+ if (!staticsResolved)
+ resolveStatics();
+ return isES;
+}
+
+void Utils::resolveStatics()
+{
+ QOpenGLContext *ctx = QOpenGLContext::currentContext();
+ QOffscreenSurface *dummySurface = 0;
+ if (!ctx) {
+ QSurfaceFormat surfaceFormat;
+ dummySurface = new QOffscreenSurface();
+ dummySurface->setFormat(surfaceFormat);
+ dummySurface->create();
+ ctx = new QOpenGLContext;
+ ctx->setFormat(surfaceFormat);
+ ctx->create();
+ ctx->makeCurrent(dummySurface);
+ }
+
#if defined(QT_OPENGL_ES_2)
- return true;
+ isES = true;
#elif (QT_VERSION < QT_VERSION_CHECK(5, 3, 0))
- return false;
+ isES = false;
#else
- static bool resolved = false;
- static bool isES = false;
- if (!resolved) {
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- QWindow *dummySurface = 0;
- if (!ctx) {
- QSurfaceFormat surfaceFormat = qDefaultSurfaceFormat();
- dummySurface = new QWindow();
- dummySurface->setSurfaceType(QWindow::OpenGLSurface);
- dummySurface->setFormat(surfaceFormat);
- dummySurface->create();
- ctx = new QOpenGLContext;
- ctx->setFormat(surfaceFormat);
- ctx->create();
- ctx->makeCurrent(dummySurface);
- }
+ isES = ctx->isOpenGLES();
+#endif
- isES = ctx->isOpenGLES();
- resolved = true;
+ ctx->functions()->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
- if (dummySurface) {
- ctx->doneCurrent();
- delete ctx;
- delete dummySurface;
- }
+ if (dummySurface) {
+ ctx->doneCurrent();
+ delete ctx;
+ delete dummySurface;
+ }
+
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0))
+ // We support only ES2 emulation with software renderer for now
+ if (QCoreApplication::testAttribute(Qt::AA_UseSoftwareOpenGL)) {
+ qWarning("Only OpenGL ES2 emulation is available for software rendering.");
+ isES = true;
}
- return isES;
#endif
+
+ staticsResolved = true;
}
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/utils/utils_p.h b/src/datavisualization/utils/utils_p.h
index 1a46c731..06895bcf 100644
--- a/src/datavisualization/utils/utils_p.h
+++ b/src/datavisualization/utils/utils_p.h
@@ -70,6 +70,7 @@ public:
static float wrapValue(float value, float min, float max);
static QQuaternion calculateRotation(const QVector3D &xyzRotations);
static bool isOpenGLES();
+ static void resolveStatics();
private:
static ParamType mapFormatCharToParamType(char formatSpec);
diff --git a/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml b/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml
index 131f71fd..00dddcc2 100644
--- a/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml
+++ b/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml
@@ -159,7 +159,7 @@ Column {
minimumValue: 0.0
maximumValue: 1.0
stepSize: 0.01
- decimals: 1
+ decimals: 2
Layout.fillWidth: true
}
}
diff --git a/src/datavisualizationqml2/designer/Surface3DSpecifics.qml b/src/datavisualizationqml2/designer/Surface3DSpecifics.qml
index a834f677..9804c32c 100644
--- a/src/datavisualizationqml2/designer/Surface3DSpecifics.qml
+++ b/src/datavisualizationqml2/designer/Surface3DSpecifics.qml
@@ -277,7 +277,7 @@ Column {
minimumValue: 0.0
maximumValue: 1.0
stepSize: 0.01
- decimals: 1
+ decimals: 2
Layout.fillWidth: true
}
}
diff --git a/src/datavisualizationqml2/glstatestore.cpp b/src/datavisualizationqml2/glstatestore.cpp
index 973d5054..5775694d 100644
--- a/src/datavisualizationqml2/glstatestore.cpp
+++ b/src/datavisualizationqml2/glstatestore.cpp
@@ -57,7 +57,7 @@ GLStateStore::GLStateStore(QOpenGLContext *context, QObject *parent) :
m_vertexAttribArrayTypes.reset(new GLint[maxVertexAttribs]);
m_vertexAttribArrayNormalized.reset(new GLint[maxVertexAttribs]);
m_vertexAttribArrayStrides.reset(new GLint[maxVertexAttribs]);
- m_vertexAttribArrayOffsets.reset(new GLint[maxVertexAttribs]);
+ m_vertexAttribArrayOffsets.reset(new void *[maxVertexAttribs]);
initGLDefaultState();
}
@@ -336,7 +336,7 @@ void GLStateStore::restoreGLState()
m_vertexAttribArrayTypes[i],
m_vertexAttribArrayNormalized[i],
m_vertexAttribArrayStrides[i],
- (void *) m_vertexAttribArrayOffsets[i]);
+ m_vertexAttribArrayOffsets[i]);
}
glBindBuffer(GL_ARRAY_BUFFER, m_boundArrayBuffer);
diff --git a/src/datavisualizationqml2/glstatestore_p.h b/src/datavisualizationqml2/glstatestore_p.h
index 4add606b..48b30a15 100644
--- a/src/datavisualizationqml2/glstatestore_p.h
+++ b/src/datavisualizationqml2/glstatestore_p.h
@@ -71,7 +71,7 @@ public:
QScopedArrayPointer<GLint> m_vertexAttribArrayTypes;
QScopedArrayPointer<GLint> m_vertexAttribArrayNormalized;
QScopedArrayPointer<GLint> m_vertexAttribArrayStrides;
- QScopedArrayPointer<GLint> m_vertexAttribArrayOffsets;
+ QScopedArrayPointer<void *> m_vertexAttribArrayOffsets;
GLint m_activeTexture;
GLint m_texBinding2D;
diff --git a/tests/auto/cpptest/q3dscene/tst_scene.cpp b/tests/auto/cpptest/q3dscene/tst_scene.cpp
index 7d1ecad3..83eff9eb 100644
--- a/tests/auto/cpptest/q3dscene/tst_scene.cpp
+++ b/tests/auto/cpptest/q3dscene/tst_scene.cpp
@@ -136,7 +136,7 @@ void tst_scene::subViews()
QCoreApplication::processEvents();
- QCOMPARE(scene->viewport(), QRect(0, 0, 200, 200));
+ QTRY_COMPARE(scene->viewport(), QRect(0, 0, 200, 200));
QCOMPARE(scene->primarySubViewport(), QRect(0, 0, 200, 200));
QCOMPARE(scene->secondarySubViewport(), QRect(0, 0, 0, 0));
diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp
index af033990..1305fff9 100644
--- a/tests/barstest/main.cpp
+++ b/tests/barstest/main.cpp
@@ -35,22 +35,19 @@
#include <QLineEdit>
#include <QSpinBox>
#include <QtGui/QOpenGLContext>
-
-static bool isOpenGLES()
-{
-#if defined(QT_OPENGL_ES_2)
- return true;
-#elif (QT_VERSION < QT_VERSION_CHECK(5, 3, 0))
- return false;
-#else
- return QOpenGLContext::currentContext()->isOpenGLES();
-#endif
-}
+#include <QtDataVisualization/QCustom3DItem>
+#include <QtDataVisualization/QCustom3DLabel>
+#include <QtDataVisualization/QCustom3DVolume>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
+ // Test creating custom items before graph is created
+ QCustom3DItem customItem;
+ QCustom3DLabel customLabel;
+ QCustom3DVolume customVolume;
+
QWidget *widget = new QWidget;
QHBoxLayout *hLayout = new QHBoxLayout(widget);
QVBoxLayout *vLayout = new QVBoxLayout();
@@ -60,8 +57,7 @@ int main(int argc, char **argv)
// For testing custom surface format
QSurfaceFormat surfaceFormat;
surfaceFormat.setDepthBufferSize(24);
- if (!isOpenGLES())
- surfaceFormat.setSamples(8);
+ surfaceFormat.setSamples(8);
Q3DBars *widgetchart = new Q3DBars(&surfaceFormat);
QSize screenSize = widgetchart->screen()->size();
diff --git a/tests/qmlperf/datagenerator.cpp b/tests/qmlperf/datagenerator.cpp
new file mode 100644
index 00000000..4819f59d
--- /dev/null
+++ b/tests/qmlperf/datagenerator.cpp
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 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 "datagenerator.h"
+#include <QDebug>
+
+using namespace QtDataVisualization;
+
+Q_DECLARE_METATYPE(QScatter3DSeries *)
+
+DataGenerator::DataGenerator(QObject *parent) :
+ QObject(parent)
+{
+ qRegisterMetaType<QScatter3DSeries *>();
+}
+
+DataGenerator::~DataGenerator()
+{
+ qDebug() << __FUNCTION__;
+}
+
+void DataGenerator::generateData(QScatter3DSeries *series, uint count)
+{
+ QScatterDataArray *dataArray = new QScatterDataArray;
+ dataArray->resize(count);
+ QScatterDataItem *ptrToDataArray = &dataArray->first();
+
+ float rand_max = float(RAND_MAX);
+ for (uint i = 0; i < count; i++) {
+ ptrToDataArray->setPosition(QVector3D(float(qrand()) / rand_max,
+ float(qrand()) / rand_max,
+ float(qrand()) / rand_max));
+ ptrToDataArray++;
+ }
+
+ series->dataProxy()->resetArray(dataArray);
+}
+
+void DataGenerator::add(QScatter3DSeries *series, uint count)
+{
+ QScatterDataArray appendArray;
+ appendArray.resize(count);
+
+ float rand_max = float(RAND_MAX);
+ for (uint i = 0; i < count; i++) {
+ appendArray[i].setPosition(QVector3D(float(qrand()) / rand_max,
+ float(qrand()) / rand_max,
+ float(qrand()) / rand_max));
+ }
+
+ series->dataProxy()->addItems(appendArray);
+}
diff --git a/tests/qmlperf/qml/qmlperf/script.js b/tests/qmlperf/datagenerator.h
index dc271e8d..0687ecec 100644
--- a/tests/qmlperf/qml/qmlperf/script.js
+++ b/tests/qmlperf/datagenerator.h
@@ -16,18 +16,26 @@
**
****************************************************************************/
-//function createData(base) {
-// for (var z = 0; z < 30; z++) {
-// for (var x = 0; x < 30; x++) {
-// var angle = (((z - 16) * (x - 16)) / 144.0) * 1.57;
-// var y = Math.sin(angle + base);
-// dataModel.append({"z": z, "x": x, "y": y});
-// }
-// }
-//}
+#ifndef DATAGENERATOR_H
+#define DATAGENERATOR_H
-function createData(base) {
- for (var i = 0; i < base; i++) {
- dataModel.append({"z": Math.random(), "x": Math.random(), "y": Math.random()});
- }
-}
+#include <QtDataVisualization/QScatter3DSeries>
+
+using namespace QtDataVisualization;
+
+class DataGenerator : public QObject
+{
+ Q_OBJECT
+public:
+ DataGenerator(QObject *parent = 0);
+ virtual ~DataGenerator();
+
+public slots:
+ void generateData(QScatter3DSeries *series, uint count);
+ void add(QScatter3DSeries *series, uint count);
+
+private:
+ QScatter3DSeries m_series;
+};
+
+#endif // DATAGENERATOR_H
diff --git a/tests/qmlperf/main.cpp b/tests/qmlperf/main.cpp
index 7d35b2ed..06b18816 100644
--- a/tests/qmlperf/main.cpp
+++ b/tests/qmlperf/main.cpp
@@ -16,8 +16,11 @@
**
****************************************************************************/
+#include "datagenerator.h"
+
#include <QtGui/QGuiApplication>
#include <QtCore/QDir>
+#include <QtQml/QQmlContext>
#include <QtQuick/QQuickView>
#include <QtQml/QQmlEngine>
@@ -38,6 +41,9 @@ int main(int argc, char *argv[])
QString::fromLatin1("qml")));
QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
+ DataGenerator dataGenerator;
+ viewer.rootContext()->setContextProperty("dataGenerator", &dataGenerator);
+
viewer.setTitle(QStringLiteral("QML Performance"));
viewer.setSource(QUrl("qrc:/qml/qmlperf/main.qml"));
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
diff --git a/tests/qmlperf/qml/qmlperf/main.qml b/tests/qmlperf/qml/qmlperf/main.qml
index 35f8df5d..bb3f1b82 100644
--- a/tests/qmlperf/qml/qmlperf/main.qml
+++ b/tests/qmlperf/qml/qmlperf/main.qml
@@ -20,7 +20,6 @@ import QtQuick 2.1
import QtQuick.Layouts 1.0
import QtQuick.Controls 1.0
import QtDataVisualization 1.1
-import "script.js" as Script
import "."
Rectangle {
@@ -29,7 +28,7 @@ Rectangle {
height: 1024
property var itemCount: 1000.0
- property var addItems: 1000.0
+ property var addItems: 500.0
Button {
id: changeButton
@@ -90,7 +89,7 @@ Rectangle {
text: "Add"
onClicked: {
itemCount = itemCount + addItems;
- Script.createData(addItems);
+ dataGenerator.add(scatterSeries, addItems);
}
}
@@ -102,11 +101,6 @@ Rectangle {
anchors.left: mainview.left
state: "meshsphere"
- ListModel {
- id: dataModel
- Component.onCompleted: Script.createData(itemCount)
- }
-
Scatter3D {
id: scatterPlot
width: graphView.width
@@ -134,13 +128,9 @@ Rectangle {
Scatter3DSeries {
id: scatterSeries
mesh: Abstract3DSeries.MeshSphere
- ItemModelScatterDataProxy {
- itemModel: dataModel
- xPosRole: "x"
- yPosRole: "y"
- zPosRole: "z"
- }
}
+
+ Component.onCompleted: dataGenerator.generateData(scatterSeries, itemCount);
}
states: [
diff --git a/tests/qmlperf/qmlperf.pro b/tests/qmlperf/qmlperf.pro
index 6560f55c..e29ef75d 100644
--- a/tests/qmlperf/qmlperf.pro
+++ b/tests/qmlperf/qmlperf.pro
@@ -3,10 +3,14 @@
}
# The .cpp file which was generated for your project. Feel free to hack it.
-SOURCES += main.cpp
+SOURCES += main.cpp \
+ datagenerator.cpp
RESOURCES += qmlperf.qrc
OTHER_FILES += doc/src/* \
doc/images/* \
qml/qmlperf/*
+
+HEADERS += \
+ datagenerator.h
diff --git a/tests/qmlperf/qmlperf.qrc b/tests/qmlperf/qmlperf.qrc
index e50815c5..b52f4bb9 100644
--- a/tests/qmlperf/qmlperf.qrc
+++ b/tests/qmlperf/qmlperf.qrc
@@ -1,6 +1,5 @@
<RCC>
<qresource prefix="/">
<file>qml/qmlperf/main.qml</file>
- <file>qml/qmlperf/script.js</file>
</qresource>
</RCC>