summaryrefslogtreecommitdiffstats
path: root/examples/charts/openglseries/datasource.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2015-09-15 17:39:54 +0300
committerMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2015-09-25 06:44:35 +0000
commit79a856530b6986ca6d6d7485b2e6cec810c3b7fe (patch)
tree6f3f8dfe76e64da9ec48909fef1d7cccb87c3fc0 /examples/charts/openglseries/datasource.cpp
parent3a89e3fee61a52927f836f3b3de4c922c6b954e4 (diff)
Accelerating lineseries with OpenGL
Added support for QAbstractSeries::useOpenGL property. When true, the series in question is drawn on a separate offscreen buffer using OpenGL and then superimposed on the chart. Currently this property is only supported for line and scatter series. Change-Id: I174fec541f9f3c23464270c1fe08f824af16a0fb Reviewed-by: Titta Heikkala <titta.heikkala@theqtcompany.com> Reviewed-by: Tomi Korpipää <tomi.korpipaa@theqtcompany.com>
Diffstat (limited to 'examples/charts/openglseries/datasource.cpp')
-rw-r--r--examples/charts/openglseries/datasource.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/examples/charts/openglseries/datasource.cpp b/examples/charts/openglseries/datasource.cpp
new file mode 100644
index 00000000..64b45405
--- /dev/null
+++ b/examples/charts/openglseries/datasource.cpp
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd
+** All rights reserved.
+** For any questions to The Qt Company, please use contact form at http://qt.io
+**
+** This file is part of the Qt Charts module.
+**
+** Licensees holding valid commercial license for Qt may use this file in
+** accordance with the Qt License Agreement provided with the Software
+** or, alternatively, in accordance with the terms contained in a written
+** agreement between you and The Qt Company.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.io
+**
+****************************************************************************/
+
+#include "datasource.h"
+#include <QtCore/QtMath>
+
+QT_CHARTS_USE_NAMESPACE
+
+DataSource::DataSource(QObject *parent) :
+ QObject(parent),
+ m_index(-1)
+{
+ generateData(0, 0, 0);
+}
+
+void DataSource::update(QAbstractSeries *series, int seriesIndex)
+{
+ if (series) {
+ QXYSeries *xySeries = static_cast<QXYSeries *>(series);
+ const QVector<QVector<QPointF> > &seriesData = m_data.at(seriesIndex);
+ if (seriesIndex == 0)
+ m_index++;
+ if (m_index > seriesData.count() - 1)
+ m_index = 0;
+
+ QVector<QPointF> points = seriesData.at(m_index);
+ // Use replace instead of clear + append, it's optimized for performance
+ xySeries->replace(points);
+ }
+}
+
+void DataSource::handleSceneChanged()
+{
+ m_dataUpdater.start();
+}
+
+void DataSource::updateAllSeries()
+{
+ static int frameCount = 0;
+ static QString labelText = QStringLiteral("FPS: %1");
+
+ for (int i = 0; i < m_seriesList.size(); i++)
+ update(m_seriesList[i], i);
+
+ frameCount++;
+ int elapsed = m_fpsTimer.elapsed();
+ if (elapsed >= 1000) {
+ elapsed = m_fpsTimer.restart();
+ qreal fps = qreal(0.1 * int(10000.0 * (qreal(frameCount) / qreal(elapsed))));
+ m_fpsLabel->setText(labelText.arg(QString::number(fps, 'f', 1)));
+ frameCount = 0;
+ }
+}
+
+void DataSource::startUpdates(const QList<QXYSeries *> &seriesList, QLabel *fpsLabel)
+{
+ m_seriesList = seriesList;
+ m_fpsLabel = fpsLabel;
+
+ m_dataUpdater.setInterval(0);
+ m_dataUpdater.setSingleShot(true);
+ QObject::connect(&m_dataUpdater, &QTimer::timeout,
+ this, &DataSource::updateAllSeries);
+
+ m_fpsTimer.start();
+ updateAllSeries();
+}
+
+void DataSource::generateData(int seriesCount, int rowCount, int colCount)
+{
+ // Remove previous data
+ foreach (QVector<QVector<QPointF> > seriesData, m_data) {
+ foreach (QVector<QPointF> row, seriesData)
+ row.clear();
+ }
+
+ m_data.clear();
+
+ qreal xAdjustment = 20.0 / (colCount * rowCount);
+ qreal yMultiplier = 3.0 / qreal(seriesCount);
+
+ // Append the new data depending on the type
+ for (int k(0); k < seriesCount; k++) {
+ QVector<QVector<QPointF> > seriesData;
+ qreal height = qreal(k) * (10.0 / qreal(seriesCount)) + 0.3;
+ for (int i(0); i < rowCount; i++) {
+ QVector<QPointF> points;
+ points.reserve(colCount);
+ for (int j(0); j < colCount; j++) {
+ qreal x(0);
+ qreal y(0);
+ // data with sin + random component
+ y = height + (yMultiplier * qSin(3.14159265358979 / 50 * j)
+ + (yMultiplier * (qreal) rand() / (qreal) RAND_MAX));
+ // 0.000001 added to make values logaxis compatible
+ x = 0.000001 + 20.0 * (qreal(j) / qreal(colCount)) + (xAdjustment * qreal(i));
+ points.append(QPointF(x, y));
+ }
+ seriesData.append(points);
+ }
+ m_data.append(seriesData);
+ }
+}