summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2014-02-06 14:00:25 +0200
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2014-02-06 14:23:31 +0200
commit811be6f81b2e8c4d9d23cff5b4287c8a5dc86fc3 (patch)
tree549f2a46531c853893e31083a12d3729d07c4a86
parente91237b54c2f58eaa8a2ce36bf016e2d8e8588f2 (diff)
Change rotations to use angle and vector in APIs
Quaternions are pain in the behind to use, especially in QML, so change them to angle + vector combinations. Change-Id: I25eb5ea92deaf3a079e2e193cce2e8de89f3c3c4 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
-rw-r--r--examples/qmloscilloscope/datasource.cpp7
-rw-r--r--examples/qmloscilloscope/datasource.h3
-rw-r--r--examples/qmloscilloscope/main.cpp2
-rw-r--r--src/datavisualization/data/abstractrenderitem.cpp1
-rw-r--r--src/datavisualization/data/abstractrenderitem_p.h8
-rw-r--r--src/datavisualization/data/barrenderitem.cpp1
-rw-r--r--src/datavisualization/data/barrenderitem_p.h4
-rw-r--r--src/datavisualization/data/qabstract3dseries.cpp94
-rw-r--r--src/datavisualization/data/qabstract3dseries.h14
-rw-r--r--src/datavisualization/data/qabstract3dseries_p.h6
-rw-r--r--src/datavisualization/data/qbar3dseries.cpp57
-rw-r--r--src/datavisualization/data/qbar3dseries.h5
-rw-r--r--src/datavisualization/data/qbar3dseries_p.h4
-rw-r--r--src/datavisualization/data/qitemmodelscatterdataproxy.cpp60
-rw-r--r--src/datavisualization/data/qitemmodelscatterdataproxy.h18
-rw-r--r--src/datavisualization/data/qitemmodelscatterdataproxy_p.h3
-rw-r--r--src/datavisualization/data/qscatterdataitem.cpp52
-rw-r--r--src/datavisualization/data/qscatterdataitem.h11
-rw-r--r--src/datavisualization/data/scatteritemmodelhandler.cpp33
-rw-r--r--src/datavisualization/data/scatteritemmodelhandler_p.h3
-rw-r--r--src/datavisualization/data/scatterrenderitem.cpp1
-rw-r--r--src/datavisualization/data/scatterrenderitem_p.h8
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp8
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp9
-rw-r--r--src/datavisualization/engine/seriesrendercache.cpp6
-rw-r--r--src/datavisualization/global/datavisualizationglobal_p.h2
-rw-r--r--tests/barstest/chart.cpp6
-rw-r--r--tests/directional/main.cpp16
-rw-r--r--tests/directional/scatterdatamodifier.cpp13
-rw-r--r--tests/qmlcamera/qml/qmlcamera/Data.qml2
-rw-r--r--tests/qmldynamicdata/qml/qmldynamicdata/main.qml43
31 files changed, 279 insertions, 221 deletions
diff --git a/examples/qmloscilloscope/datasource.cpp b/examples/qmloscilloscope/datasource.cpp
index 3d2f908d..922ed576 100644
--- a/examples/qmloscilloscope/datasource.cpp
+++ b/examples/qmloscilloscope/datasource.cpp
@@ -17,18 +17,14 @@
****************************************************************************/
#include "datasource.h"
-#include <QtQuick/QQuickView>
-#include <QtQuick/QQuickItem>
-#include <QDebug>
#include <qmath.h>
using namespace QtDataVisualization;
Q_DECLARE_METATYPE(QSurface3DSeries *)
-DataSource::DataSource(QQuickView *appViewer, QObject *parent) :
+DataSource::DataSource(QObject *parent) :
QObject(parent),
- m_appViewer(appViewer),
m_index(-1),
m_resetArray(0)
{
@@ -46,7 +42,6 @@ void DataSource::generateData(int cacheCount, int rowCount, int columnCount,
float zMin, float zMax)
{
clearData();
-
// Re-create the cache array
m_data.resize(cacheCount);
for (int i(0); i < cacheCount; i++) {
diff --git a/examples/qmloscilloscope/datasource.h b/examples/qmloscilloscope/datasource.h
index 6ef0cacb..51d3e8e0 100644
--- a/examples/qmloscilloscope/datasource.h
+++ b/examples/qmloscilloscope/datasource.h
@@ -30,7 +30,7 @@ class DataSource : public QObject
{
Q_OBJECT
public:
- explicit DataSource(QQuickView *appViewer, QObject *parent = 0);
+ explicit DataSource(QObject *parent = 0);
virtual ~DataSource();
//! [0]
@@ -46,7 +46,6 @@ public slots:
private:
void clearData();
- QQuickView *m_appViewer;
QVector<QSurfaceDataArray> m_data;
int m_index;
QSurfaceDataArray *m_resetArray;
diff --git a/examples/qmloscilloscope/main.cpp b/examples/qmloscilloscope/main.cpp
index c4e2430a..8cbaba71 100644
--- a/examples/qmloscilloscope/main.cpp
+++ b/examples/qmloscilloscope/main.cpp
@@ -44,7 +44,7 @@ int main(int argc, char *argv[])
viewer.setTitle(QStringLiteral("Oscilloscope example"));
//! [0]
- DataSource dataSource(&viewer);
+ DataSource dataSource;
viewer.rootContext()->setContextProperty("dataSource", &dataSource);
//! [0]
diff --git a/src/datavisualization/data/abstractrenderitem.cpp b/src/datavisualization/data/abstractrenderitem.cpp
index 522fd144..e22a46d8 100644
--- a/src/datavisualization/data/abstractrenderitem.cpp
+++ b/src/datavisualization/data/abstractrenderitem.cpp
@@ -29,6 +29,7 @@ AbstractRenderItem::AbstractRenderItem(const AbstractRenderItem &other)
{
m_selectionLabel = other.m_selectionLabel;
m_translation = other.m_translation;
+ m_rotation = other.m_rotation;
m_selectionLabelItem = 0;
}
diff --git a/src/datavisualization/data/abstractrenderitem_p.h b/src/datavisualization/data/abstractrenderitem_p.h
index fa06db54..8d2fab8a 100644
--- a/src/datavisualization/data/abstractrenderitem_p.h
+++ b/src/datavisualization/data/abstractrenderitem_p.h
@@ -57,10 +57,18 @@ public:
void setSelectionLabel(const QString &label);
QString &selectionLabel(); // Formats selection label if not previously formatted
+ inline QQuaternion rotation() const { return m_rotation; }
+ inline void setRotation(const QQuaternion &rotation)
+ {
+ if (m_rotation != rotation)
+ m_rotation = rotation;
+ }
+
protected:
QString m_selectionLabel;
QVector3D m_translation;
LabelItem *m_selectionLabelItem;
+ QQuaternion m_rotation;
friend class QAbstractDataItem;
};
diff --git a/src/datavisualization/data/barrenderitem.cpp b/src/datavisualization/data/barrenderitem.cpp
index 915f3f78..869dac2e 100644
--- a/src/datavisualization/data/barrenderitem.cpp
+++ b/src/datavisualization/data/barrenderitem.cpp
@@ -39,7 +39,6 @@ BarRenderItem::BarRenderItem(const BarRenderItem &other)
m_sliceLabel = other.m_sliceLabel;
m_sliceLabelItem = 0;
m_seriesIndex = other.m_seriesIndex;
- m_rotation = other.m_rotation;
}
BarRenderItem::~BarRenderItem()
diff --git a/src/datavisualization/data/barrenderitem_p.h b/src/datavisualization/data/barrenderitem_p.h
index e1062969..df9d7a60 100644
--- a/src/datavisualization/data/barrenderitem_p.h
+++ b/src/datavisualization/data/barrenderitem_p.h
@@ -74,9 +74,6 @@ public:
inline void setSeriesIndex(int seriesIndex) { m_seriesIndex = seriesIndex; }
inline int seriesIndex() const { return m_seriesIndex; }
- inline void setRotation(const QQuaternion &rotation) { m_rotation = rotation; }
- inline const QQuaternion &rotation() const { return m_rotation; }
-
protected:
float m_value;
QPoint m_position; // x = row, y = column
@@ -84,7 +81,6 @@ protected:
QString m_sliceLabel;
LabelItem *m_sliceLabelItem;
int m_seriesIndex;
- QQuaternion m_rotation;
friend class QBarDataItem;
};
diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp
index dc241fdb..fbc72410 100644
--- a/src/datavisualization/data/qabstract3dseries.cpp
+++ b/src/datavisualization/data/qabstract3dseries.cpp
@@ -142,15 +142,28 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
- * \qmlproperty quaternion Abstract3DSeries::meshRotation
+ * \qmlproperty vector3d Abstract3DSeries::meshRotationAxis
*
- * Sets the mesh \a rotation that is applied to all items of the series.
- * The \a rotation should be a normalized quaternion.
- * For those series types that support item specific rotation, the rotations are
- * multiplied together.
- * Bar3DSeries ignores any rotation that is not around Y-axis.
+ * Sets the mesh rotation \a axis that is applied to all items of the series.
+ * For those series types that support item specific rotation, the resulting
+ * rotation quaternions are multiplied together at render time.
+ * Bar3DSeries ignores rotation axis, as it only supports rotation around Y-axis.
* Surface3DSeries applies the rotation only to the selection pointer.
- * Defaults to no rotation.
+ * Defaults to Y-axis.
+ *
+ * \sa meshRotationAngle
+ */
+
+/*!
+ * \qmlproperty float Abstract3DSeries::meshRotationAngle
+ *
+ * Sets the mesh rotation \a angle that is applied to all items of the series.
+ * For those series types that support item specific rotation, the resulting
+ * rotation quaternions are multiplied together at render time.
+ * Surface3DSeries applies the rotation only to the selection pointer.
+ * Defaults to 0.
+ *
+ * \sa meshRotationAxis
*/
/*!
@@ -351,27 +364,54 @@ bool QAbstract3DSeries::isMeshSmooth() const
}
/*!
- * \property QAbstract3DSeries::meshRotation
+ * \property QAbstract3DSeries::meshRotationAxis
+ *
+ * Sets the mesh rotation \a axis that is applied to all items of the series.
+ * For those series types that support item specific rotation, the resulting
+ * rotation quaternions are multiplied together at render time.
+ * QBar3DSeries ignores rotation axis, as it only supports rotation around Y-axis.
+ * QSurface3DSeries applies the rotation only to the selection pointer.
+ * Defaults to Y-axis.
+ *
+ * \sa meshRotationAngle
+ */
+void QAbstract3DSeries::setMeshRotationAxis(const QVector3D &axis)
+{
+ if (d_ptr->m_type != SeriesTypeBar) {
+ if (d_ptr->m_meshRotationAxis != axis) {
+ d_ptr->setMeshRotationAxis(axis);
+ emit meshRotationAxisChanged(axis);
+ }
+ }
+}
+
+QVector3D QAbstract3DSeries::meshRotationAxis() const
+{
+ return d_ptr->m_meshRotationAxis;
+}
+
+/*!
+ * \property QAbstract3DSeries::meshRotationAngle
*
- * Sets the mesh \a rotation that is applied to all items of the series.
- * The \a rotation should be a normalized QQuaternion.
- * For those series types that support item specific rotation, the rotations are
- * multiplied together.
- * QBar3DSeries ignores any rotation that is not around Y-axis.
+ * Sets the mesh rotation \a angle that is applied to all items of the series.
+ * For those series types that support item specific rotation, the resulting
+ * rotation quaternions are multiplied together at render time.
* QSurface3DSeries applies the rotation only to the selection pointer.
- * Defaults to no rotation.
+ * Defaults to 0.
+ *
+ * \sa meshRotationAxis
*/
-void QAbstract3DSeries::setMeshRotation(const QQuaternion &rotation)
+void QAbstract3DSeries::setMeshRotationAngle(float angle)
{
- if (d_ptr->m_meshRotation != rotation) {
- d_ptr->setMeshRotation(rotation);
- emit meshRotationChanged(rotation);
+ if (d_ptr->m_meshRotationAngle != angle) {
+ d_ptr->setMeshRotationAngle(angle);
+ emit meshRotationAngleChanged(angle);
}
}
-QQuaternion QAbstract3DSeries::meshRotation() const
+float QAbstract3DSeries::meshRotationAngle() const
{
- return d_ptr->m_meshRotation;
+ return d_ptr->m_meshRotationAngle;
}
/*!
@@ -579,6 +619,8 @@ QAbstract3DSeriesPrivate::QAbstract3DSeriesPrivate(QAbstract3DSeries *q, QAbstra
m_controller(0),
m_mesh(QAbstract3DSeries::MeshCube),
m_meshSmooth(false),
+ m_meshRotationAxis(upVector),
+ m_meshRotationAngle(0.0f),
m_colorStyle(Q3DTheme::ColorStyleUniform)
{
}
@@ -645,9 +687,17 @@ void QAbstract3DSeriesPrivate::setMeshSmooth(bool enable)
m_controller->markSeriesVisualsDirty();
}
-void QAbstract3DSeriesPrivate::setMeshRotation(const QQuaternion &rotation)
+void QAbstract3DSeriesPrivate::setMeshRotationAxis(const QVector3D &axis)
+{
+ m_meshRotationAxis = axis;
+ m_changeTracker.meshRotationChanged = true;
+ if (m_controller)
+ m_controller->markSeriesVisualsDirty();
+}
+
+void QAbstract3DSeriesPrivate::setMeshRotationAngle(float angle)
{
- m_meshRotation = rotation;
+ m_meshRotationAngle = angle;
m_changeTracker.meshRotationChanged = true;
if (m_controller)
m_controller->markSeriesVisualsDirty();
diff --git a/src/datavisualization/data/qabstract3dseries.h b/src/datavisualization/data/qabstract3dseries.h
index c45bb801..b0396126 100644
--- a/src/datavisualization/data/qabstract3dseries.h
+++ b/src/datavisualization/data/qabstract3dseries.h
@@ -23,7 +23,7 @@
#include <QObject>
#include <QScopedPointer>
#include <QLinearGradient>
-#include <QQuaternion>
+#include <QVector3D>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -39,7 +39,8 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DSeries : public QObject
Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibilityChanged)
Q_PROPERTY(Mesh mesh READ mesh WRITE setMesh NOTIFY meshChanged)
Q_PROPERTY(bool meshSmooth READ isMeshSmooth WRITE setMeshSmooth NOTIFY meshSmoothChanged)
- Q_PROPERTY(QQuaternion meshRotation READ meshRotation WRITE setMeshRotation NOTIFY meshRotationChanged)
+ Q_PROPERTY(QVector3D meshRotationAxis READ meshRotationAxis WRITE setMeshRotationAxis NOTIFY meshRotationAxisChanged)
+ Q_PROPERTY(float meshRotationAngle READ meshRotationAngle WRITE setMeshRotationAngle NOTIFY meshRotationAngleChanged)
Q_PROPERTY(QString userDefinedMesh READ userDefinedMesh WRITE setUserDefinedMesh NOTIFY userDefinedMeshChanged)
Q_PROPERTY(QtDataVisualization::Q3DTheme::ColorStyle colorStyle READ colorStyle WRITE setColorStyle NOTIFY colorStyleChanged)
Q_PROPERTY(QColor baseColor READ baseColor WRITE setBaseColor NOTIFY baseColorChanged)
@@ -93,8 +94,10 @@ public:
void setMeshSmooth(bool enable);
bool isMeshSmooth() const;
- void setMeshRotation(const QQuaternion &rotation);
- QQuaternion meshRotation() const;
+ void setMeshRotationAxis(const QVector3D &axis);
+ QVector3D meshRotationAxis() const;
+ void setMeshRotationAngle(float angle);
+ float meshRotationAngle() const;
void setUserDefinedMesh(const QString &fileName);
QString userDefinedMesh() const;
@@ -122,7 +125,8 @@ signals:
void visibilityChanged(bool visible);
void meshChanged(Mesh mesh);
void meshSmoothChanged(bool enabled);
- void meshRotationChanged(QQuaternion rotation);
+ void meshRotationAxisChanged(QVector3D axis);
+ void meshRotationAngleChanged(float angle);
void userDefinedMeshChanged(QString fileName);
void colorStyleChanged(Q3DTheme::ColorStyle style);
void baseColorChanged(QColor color);
diff --git a/src/datavisualization/data/qabstract3dseries_p.h b/src/datavisualization/data/qabstract3dseries_p.h
index 6fbabd3d..3c9a9582 100644
--- a/src/datavisualization/data/qabstract3dseries_p.h
+++ b/src/datavisualization/data/qabstract3dseries_p.h
@@ -108,7 +108,8 @@ public:
void setVisible(bool visible);
void setMesh(QAbstract3DSeries::Mesh mesh);
void setMeshSmooth(bool enable);
- void setMeshRotation(const QQuaternion &rotation);
+ void setMeshRotationAxis(const QVector3D &axis);
+ void setMeshRotationAngle(float angle);
void setUserDefinedMesh(const QString &meshFile);
void setColorStyle(Q3DTheme::ColorStyle style);
@@ -132,7 +133,8 @@ public:
Abstract3DController *m_controller;
QAbstract3DSeries::Mesh m_mesh;
bool m_meshSmooth;
- QQuaternion m_meshRotation;
+ QVector3D m_meshRotationAxis;
+ float m_meshRotationAngle;
QString m_userDefinedMesh;
Q3DTheme::ColorStyle m_colorStyle;
diff --git a/src/datavisualization/data/qbar3dseries.cpp b/src/datavisualization/data/qbar3dseries.cpp
index 0616d4e4..124f996b 100644
--- a/src/datavisualization/data/qbar3dseries.cpp
+++ b/src/datavisualization/data/qbar3dseries.cpp
@@ -115,17 +115,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
- * \qmlproperty real Bar3DSeries::meshAngle
- *
- * A convenience property for defining the series rotation \a angle in degrees.
- *
- * \note: When reading this property, it is calculated from Abstract3DSeries::meshRotation value and
- * always returns a value from zero to 360 degrees. It may also have small rounding errors.
- *
- * \sa Abstract3DSeries::meshRotation
- */
-
-/*!
* Constructs QBar3DSeries with the given \a parent.
*/
QBar3DSeries::QBar3DSeries(QObject *parent) :
@@ -133,7 +122,6 @@ QBar3DSeries::QBar3DSeries(QObject *parent) :
{
// Default proxy
dptr()->setDataProxy(new QBarDataProxy);
- dptr()->connectSignals();
}
/*!
@@ -143,7 +131,6 @@ QBar3DSeries::QBar3DSeries(QBarDataProxy *dataProxy, QObject *parent) :
QAbstract3DSeries(new QBar3DSeriesPrivate(this), parent)
{
dptr()->setDataProxy(dataProxy);
- dptr()->connectSignals();
}
/*!
@@ -152,7 +139,6 @@ QBar3DSeries::QBar3DSeries(QBarDataProxy *dataProxy, QObject *parent) :
QBar3DSeries::QBar3DSeries(QBar3DSeriesPrivate *d, QObject *parent) :
QAbstract3DSeries(d, parent)
{
- dptr()->connectSignals();
}
/*!
@@ -219,38 +205,6 @@ QPoint QBar3DSeries::invalidSelectionPosition()
return Bars3DController::invalidSelectionPosition();
}
-static inline float quaternionAngle(const QQuaternion &rotation)
-{
- return qAcos(rotation.scalar()) * 360.0f / M_PI;
-}
-
-/*!
- * \property QBar3DSeries::meshAngle
- *
- * A convenience property for defining the series rotation \a angle in degrees.
- * Setting this property is equivalent to the following call:
- * \code setMeshRotation(QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, angle)) \endcode
- *
- * \note: When reading this property, it is calculated from QAbstract3DSeries::meshRotation value
- * and always returns a value from zero to 360 degrees. It may also have small rounding errors.
- *
- * \sa QAbstract3DSeries::meshRotation
- */
-void QBar3DSeries::setMeshAngle(float angle)
-{
- setMeshRotation(QQuaternion::fromAxisAndAngle(upVector, angle));
-}
-
-float QBar3DSeries::meshAngle() const
-{
- QQuaternion rotation = meshRotation();
-
- if (rotation.isIdentity() || rotation.x() != 0.0f || rotation.z() != 0.0f)
- return 0.0f;
- else
- return quaternionAngle(rotation);
-}
-
/*!
* \internal
*/
@@ -326,11 +280,6 @@ void QBar3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *newCon
}
}
-void QBar3DSeriesPrivate::handleMeshRotationChanged(const QQuaternion &rotation)
-{
- emit qptr()->meshAngleChanged(quaternionAngle(rotation));
-}
-
void QBar3DSeriesPrivate::setSelectedBar(const QPoint &position)
{
if (position != m_selectedBar) {
@@ -339,10 +288,4 @@ void QBar3DSeriesPrivate::setSelectedBar(const QPoint &position)
}
}
-void QBar3DSeriesPrivate::connectSignals()
-{
- QObject::connect(q_ptr, &QAbstract3DSeries::meshRotationChanged, this,
- &QBar3DSeriesPrivate::handleMeshRotationChanged);
-}
-
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/qbar3dseries.h b/src/datavisualization/data/qbar3dseries.h
index aa67dadb..be748516 100644
--- a/src/datavisualization/data/qbar3dseries.h
+++ b/src/datavisualization/data/qbar3dseries.h
@@ -32,7 +32,6 @@ class QT_DATAVISUALIZATION_EXPORT QBar3DSeries : public QAbstract3DSeries
Q_OBJECT
Q_PROPERTY(QBarDataProxy *dataProxy READ dataProxy WRITE setDataProxy NOTIFY dataProxyChanged)
Q_PROPERTY(QPoint selectedBar READ selectedBar WRITE setSelectedBar NOTIFY selectedBarChanged)
- Q_PROPERTY(float meshAngle READ meshAngle WRITE setMeshAngle NOTIFY meshAngleChanged)
public:
explicit QBar3DSeries(QObject *parent = 0);
@@ -46,13 +45,9 @@ public:
QPoint selectedBar() const;
static QPoint invalidSelectionPosition();
- void setMeshAngle(float angle);
- float meshAngle() const;
-
signals:
void dataProxyChanged(QBarDataProxy *proxy);
void selectedBarChanged(QPoint position);
- void meshAngleChanged(float angle);
protected:
explicit QBar3DSeries(QBar3DSeriesPrivate *d, QObject *parent = 0);
diff --git a/src/datavisualization/data/qbar3dseries_p.h b/src/datavisualization/data/qbar3dseries_p.h
index 718f1237..173f1cd9 100644
--- a/src/datavisualization/data/qbar3dseries_p.h
+++ b/src/datavisualization/data/qbar3dseries_p.h
@@ -44,12 +44,8 @@ public:
virtual void setDataProxy(QAbstractDataProxy *proxy);
virtual void connectControllerAndProxy(Abstract3DController *newController);
- void handleMeshRotationChanged(const QQuaternion &rotation);
-
void setSelectedBar(const QPoint &position);
- void connectSignals();
-
private:
QBar3DSeries *qptr();
diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp
index 489f8da7..b73538e9 100644
--- a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp
+++ b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp
@@ -93,9 +93,15 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
*/
/*!
- * \qmlproperty string ItemModelScatterDataProxy::rotationRole
+ * \qmlproperty string ItemModelScatterDataProxy::rotationAxisRole
*
- * Defines the rotation role for the mapping.
+ * Defines the rotation axis role for the mapping.
+ */
+
+/*!
+ * \qmlproperty string ItemModelScatterDataProxy::rotationAngleRole
+ *
+ * Defines the rotation angle role for the mapping.
*/
/*!
@@ -143,13 +149,15 @@ QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel
* Constructs QItemModelScatterDataProxy with \a itemModel and optional \a parent. Proxy doesn't take
* ownership of the \a itemModel, as typically item models are owned by other controls.
* The xPosRole property is set to \a xPosRole, yPosRole property to \a yPosRole, zPosRole property
- * to \a zPosRole, and rotationRole property to \a rotationRole.
+ * to \a zPosRole, rotationAxisRole property to \a rotationAxisRole, and rotationAngleRole
+ * property to \a rotationAngleRole.
*/
QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel,
const QString &xPosRole,
const QString &yPosRole,
const QString &zPosRole,
- const QString &rotationRole,
+ const QString &rotationAxisRole,
+ const QString &rotationAngleRole,
QObject *parent)
: QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this), parent)
{
@@ -157,7 +165,8 @@ QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel
dptr()->m_xPosRole = xPosRole;
dptr()->m_yPosRole = yPosRole;
dptr()->m_zPosRole = zPosRole;
- dptr()->m_rotationRole = rotationRole;
+ dptr()->m_rotationAxisRole = rotationAxisRole;
+ dptr()->m_rotationAngleRole = rotationAngleRole;
dptr()->connectItemModelHandler();
}
@@ -239,32 +248,53 @@ QString QItemModelScatterDataProxy::zPosRole() const
}
/*!
- * \property QItemModelScatterDataProxy::rotationRole
+ * \property QItemModelScatterDataProxy::rotationAxisRole
+ *
+ * Defines the rotation axis role for the mapping.
+ */
+void QItemModelScatterDataProxy::setRotationAxisRole(const QString &role)
+{
+ if (dptr()->m_rotationAxisRole != role) {
+ dptr()->m_rotationAxisRole = role;
+ emit rotationAxisRoleChanged(role);
+ }
+}
+
+QString QItemModelScatterDataProxy::rotationAxisRole() const
+{
+ return dptrc()->m_rotationAxisRole;
+}
+
+/*!
+ * \property QItemModelScatterDataProxy::rotationAngleRole
*
- * Defines the rotation role for the mapping.
+ * Defines the rotation angle role for the mapping.
*/
-void QItemModelScatterDataProxy::setRotationRole(const QString &role)
+void QItemModelScatterDataProxy::setRotationAngleRole(const QString &role)
{
- if (dptr()->m_rotationRole != role) {
- dptr()->m_rotationRole = role;
- emit rotationRoleChanged(role);
+ if (dptr()->m_rotationAngleRole != role) {
+ dptr()->m_rotationAngleRole = role;
+ emit rotationAngleRoleChanged(role);
}
}
-QString QItemModelScatterDataProxy::rotationRole() const
+QString QItemModelScatterDataProxy::rotationAngleRole() const
{
- return dptrc()->m_rotationRole;
+ return dptrc()->m_rotationAngleRole;
}
/*!
- * Changes \a xPosRole, \a yPosRole and \a zPosRole mapping.
+ * Changes \a xPosRole, \a yPosRole, \a zPosRole, \a rotationAxis, and \a rotationAngle mapping.
*/
void QItemModelScatterDataProxy::remap(const QString &xPosRole, const QString &yPosRole,
- const QString &zPosRole)
+ const QString &zPosRole, const QString &rotationAxis,
+ const QString &rotationAngle)
{
setXPosRole(xPosRole);
setYPosRole(yPosRole);
setZPosRole(zPosRole);
+ setRotationAxisRole(rotationAxis);
+ setRotationAngleRole(rotationAngle);
}
/*!
diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.h b/src/datavisualization/data/qitemmodelscatterdataproxy.h
index accfeb18..ec2deee2 100644
--- a/src/datavisualization/data/qitemmodelscatterdataproxy.h
+++ b/src/datavisualization/data/qitemmodelscatterdataproxy.h
@@ -34,7 +34,8 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelScatterDataProxy : public QScatterDa
Q_PROPERTY(QString xPosRole READ xPosRole WRITE setXPosRole NOTIFY xPosRoleChanged)
Q_PROPERTY(QString yPosRole READ yPosRole WRITE setYPosRole NOTIFY yPosRoleChanged)
Q_PROPERTY(QString zPosRole READ zPosRole WRITE setZPosRole NOTIFY zPosRoleChanged)
- Q_PROPERTY(QString rotationRole READ rotationRole WRITE setRotationRole NOTIFY rotationRoleChanged)
+ Q_PROPERTY(QString rotationAxisRole READ rotationAxisRole WRITE setRotationAxisRole NOTIFY rotationAxisRoleChanged)
+ Q_PROPERTY(QString rotationAngleRole READ rotationAngleRole WRITE setRotationAngleRole NOTIFY rotationAngleRoleChanged)
public:
explicit QItemModelScatterDataProxy(QObject *parent = 0);
@@ -44,7 +45,8 @@ public:
const QString &zPosRole, QObject *parent = 0);
QItemModelScatterDataProxy(const QAbstractItemModel *itemModel,
const QString &xPosRole, const QString &yPosRole,
- const QString &zPosRole, const QString &rotationRole,
+ const QString &zPosRole, const QString &rotationAxisRole,
+ const QString &rotationAngleRole,
QObject *parent = 0);
virtual ~QItemModelScatterDataProxy();
@@ -57,17 +59,21 @@ public:
QString yPosRole() const;
void setZPosRole(const QString &role);
QString zPosRole() const;
- void setRotationRole(const QString &role);
- QString rotationRole() const;
+ void setRotationAxisRole(const QString &role);
+ QString rotationAxisRole() const;
+ void setRotationAngleRole(const QString &role);
+ QString rotationAngleRole() const;
- void remap(const QString &xPosRole, const QString &yPosRole, const QString &zPosRole);
+ void remap(const QString &xPosRole, const QString &yPosRole, const QString &zPosRole,
+ const QString &rotationAxis, const QString &rotationAngle);
signals:
void itemModelChanged(const QAbstractItemModel* itemModel);
void xPosRoleChanged(QString role);
void yPosRoleChanged(QString role);
void zPosRoleChanged(QString role);
- void rotationRoleChanged(QString role);
+ void rotationAxisRoleChanged(QString role);
+ void rotationAngleRoleChanged(QString role);
protected:
QItemModelScatterDataProxyPrivate *dptr();
diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy_p.h b/src/datavisualization/data/qitemmodelscatterdataproxy_p.h
index 4e1f321f..7057c910 100644
--- a/src/datavisualization/data/qitemmodelscatterdataproxy_p.h
+++ b/src/datavisualization/data/qitemmodelscatterdataproxy_p.h
@@ -52,7 +52,8 @@ private:
QString m_xPosRole;
QString m_yPosRole;
QString m_zPosRole;
- QString m_rotationRole;
+ QString m_rotationAxisRole;
+ QString m_rotationAngleRole;
friend class ScatterItemModelHandler;
friend class QItemModelScatterDataProxy;
diff --git a/src/datavisualization/data/qscatterdataitem.cpp b/src/datavisualization/data/qscatterdataitem.cpp
index 33f8bed0..43b52041 100644
--- a/src/datavisualization/data/qscatterdataitem.cpp
+++ b/src/datavisualization/data/qscatterdataitem.cpp
@@ -37,7 +37,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
* Constructs QScatterDataItem.
*/
QScatterDataItem::QScatterDataItem()
- : d_ptr(0) // private data doesn't exist by default (optimization)
+ : d_ptr(0), // private data doesn't exist by default (optimization)
+ m_rotationAxis(upVector),
+ m_rotationAngle(0.0f)
{
}
@@ -47,7 +49,18 @@ QScatterDataItem::QScatterDataItem()
*/
QScatterDataItem::QScatterDataItem(const QVector3D &position)
: d_ptr(0),
- m_position(position)
+ m_position(position),
+ m_rotationAxis(upVector),
+ m_rotationAngle(0.0f)
+{
+}
+
+QScatterDataItem::QScatterDataItem(const QVector3D &position, const QVector3D &rotationAxis,
+ float rotationAngle)
+ : d_ptr(0),
+ m_position(position),
+ m_rotationAxis(rotationAxis),
+ m_rotationAngle(rotationAngle)
{
}
@@ -72,7 +85,8 @@ QScatterDataItem::~QScatterDataItem()
QScatterDataItem &QScatterDataItem::operator=(const QScatterDataItem &other)
{
m_position = other.m_position;
- m_rotation = other.m_rotation;
+ m_rotationAxis = other.m_rotationAxis;
+ m_rotationAngle = other.m_rotationAngle;
if (other.d_ptr)
createExtraData();
@@ -93,17 +107,35 @@ QScatterDataItem &QScatterDataItem::operator=(const QScatterDataItem &other)
*/
/*!
- * \fn void QScatterDataItem::setRotation(const QQuaternion &rotation)
- * Sets \a rotation to this data item.
- * The \a rotation should be a normalized QQuaternion.
- * If the series also has rotation, item and series rotations are multiplied together.
+ * \fn void QScatterDataItem::setRotationAxis(const QVector3D &axis)
+ * Sets rotation \a axis of this data item.
+ * If the series also has rotation, the resulting rotation quaternions
+ * are multiplied together at render time.
+ * Defaults to Y-axis.
+ *
+ * \sa setRotationAngle()
+ */
+
+/*!
+ * \fn QVector3D QScatterDataItem::rotationAxis() const
+ * \return rotation axis of this data item.
+ * \sa setRotationAxis(), setRotationAngle()
+ */
+
+/*!
+ * \fn void QScatterDataItem::setRotationAngle(float angle)
+ * Sets rotation \a angle of this data item.
+ * If the series also has rotation, the resulting rotation quaternions
+ * are multiplied together at render time.
* Defaults to no rotation.
+ *
+ * \sa setRotationAxis()
*/
/*!
- * \fn QQuaternion QScatterDataItem::rotation() const
- * \return rotation of this data item.
- * \sa setRotation()
+ * \fn float QScatterDataItem::rotationAngle() const
+ * \return rotation angle of this data item.
+ * \sa setRotationAxis(), setRotationAngle()
*/
/*!
diff --git a/src/datavisualization/data/qscatterdataitem.h b/src/datavisualization/data/qscatterdataitem.h
index d2ef3bcc..64337631 100644
--- a/src/datavisualization/data/qscatterdataitem.h
+++ b/src/datavisualization/data/qscatterdataitem.h
@@ -22,7 +22,6 @@
#include <QtDataVisualization/qdatavisualizationglobal.h>
#include <QVector3D>
-#include <QQuaternion>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -33,6 +32,7 @@ class QT_DATAVISUALIZATION_EXPORT QScatterDataItem
public:
QScatterDataItem();
QScatterDataItem(const QVector3D &position);
+ QScatterDataItem(const QVector3D &position, const QVector3D &rotationAxis, float rotationAngle);
QScatterDataItem(const QScatterDataItem &other);
~QScatterDataItem();
@@ -40,8 +40,10 @@ public:
inline void setPosition(const QVector3D &position) { m_position = position; }
inline QVector3D position() const { return m_position; }
- inline void setRotation(const QQuaternion &rotation) { m_rotation = rotation; }
- inline QQuaternion rotation() const { return m_rotation; }
+ inline void setRotationAxis(const QVector3D &axis) { m_rotationAxis = axis; }
+ inline QVector3D rotationAxis() const { return m_rotationAxis; }
+ inline void setRotationAngle(float angle) { m_rotationAngle = angle; }
+ inline float rotationAngle() const { return m_rotationAngle; }
inline void setX(float value) { m_position.setX(value); }
inline void setY(float value) { m_position.setY(value); }
inline void setZ(float value) { m_position.setZ(value); }
@@ -56,7 +58,8 @@ protected:
private:
QVector3D m_position;
- QQuaternion m_rotation;
+ QVector3D m_rotationAxis;
+ float m_rotationAngle;
};
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/scatteritemmodelhandler.cpp b/src/datavisualization/data/scatteritemmodelhandler.cpp
index 1b1aaefe..a1158453 100644
--- a/src/datavisualization/data/scatteritemmodelhandler.cpp
+++ b/src/datavisualization/data/scatteritemmodelhandler.cpp
@@ -92,28 +92,26 @@ void ScatterItemModelHandler::handleRowsRemoved(const QModelIndex &parent, int s
}
}
-static inline QQuaternion toQuaternion(const QVariant &variant)
+static inline QVector3D toRotationAxis(const QVariant &variant)
{
- if (variant.canConvert<QQuaternion>()) {
- return variant.value<QQuaternion>();
+ if (variant.canConvert<QVector3D>()) {
+ return variant.value<QVector3D>();
} else if (variant.canConvert<QString>()) {
QString s = variant.toString();
- if (!s.isEmpty() && s.count(QLatin1Char(',')) == 3) {
+ if (!s.isEmpty() && s.count(QLatin1Char(',')) == 2) {
int index = s.indexOf(QLatin1Char(','));
int index2 = s.indexOf(QLatin1Char(','), index + 1);
- int index3 = s.indexOf(QLatin1Char(','), index2 + 1);
- bool sGood, xGood, yGood, zGood;
- float sCoord = s.left(index).toFloat(&sGood);
- float xCoord = s.mid(index + 1, index2 - index - 1).toFloat(&xGood);
- float yCoord = s.mid(index2 + 1, index3 - index2 - 1).toFloat(&yGood);
- float zCoord = s.mid(index3 + 1).toFloat(&zGood);
+ bool xGood, yGood, zGood;
+ float xCoord = s.left(index).toFloat(&xGood);
+ float yCoord = s.mid(index + 1, index2 - index - 1).toFloat(&yGood);
+ float zCoord = s.mid(index2 + 1).toFloat(&zGood);
- if (sGood && xGood && yGood && zGood)
- return QQuaternion(sCoord, xCoord, yCoord, zCoord);
+ if (xGood && yGood && zGood)
+ return QVector3D(xCoord, yCoord, zCoord);
}
}
- return QQuaternion();
+ return upVector;
}
void ScatterItemModelHandler::modelPosToScatterItem(int modelRow, int modelColumn,
@@ -129,8 +127,10 @@ void ScatterItemModelHandler::modelPosToScatterItem(int modelRow, int modelColum
yPos = index.data(m_yPosRole).toFloat();
if (m_zPosRole != noRoleIndex)
zPos = index.data(m_zPosRole).toFloat();
- if (m_rotationRole != noRoleIndex)
- item.setRotation(toQuaternion(index.data(m_rotationRole)));
+ if (m_rotationAxisRole != noRoleIndex)
+ item.setRotationAxis(toRotationAxis(index.data(m_rotationAxisRole)));
+ if (m_rotationAngleRole != noRoleIndex)
+ item.setRotationAngle(index.data(m_rotationAngleRole).toFloat());
item.setPosition(QVector3D(xPos, yPos, zPos));
}
@@ -147,7 +147,8 @@ void ScatterItemModelHandler::resolveModel()
m_xPosRole = roleHash.key(m_proxy->xPosRole().toLatin1(), noRoleIndex);
m_yPosRole = roleHash.key(m_proxy->yPosRole().toLatin1(), noRoleIndex);
m_zPosRole = roleHash.key(m_proxy->zPosRole().toLatin1(), noRoleIndex);
- m_rotationRole = roleHash.key(m_proxy->rotationRole().toLatin1(), noRoleIndex);
+ m_rotationAxisRole = roleHash.key(m_proxy->rotationAxisRole().toLatin1(), noRoleIndex);
+ m_rotationAngleRole = roleHash.key(m_proxy->rotationAngleRole().toLatin1(), noRoleIndex);
const int columnCount = m_itemModel->columnCount();
const int rowCount = m_itemModel->rowCount();
const int totalCount = rowCount * columnCount;
diff --git a/src/datavisualization/data/scatteritemmodelhandler_p.h b/src/datavisualization/data/scatteritemmodelhandler_p.h
index 0661d734..5f148434 100644
--- a/src/datavisualization/data/scatteritemmodelhandler_p.h
+++ b/src/datavisualization/data/scatteritemmodelhandler_p.h
@@ -58,7 +58,8 @@ private:
int m_xPosRole;
int m_yPosRole;
int m_zPosRole;
- int m_rotationRole;
+ int m_rotationAxisRole;
+ int m_rotationAngleRole;
};
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/data/scatterrenderitem.cpp b/src/datavisualization/data/scatterrenderitem.cpp
index d39af816..3b2e64c5 100644
--- a/src/datavisualization/data/scatterrenderitem.cpp
+++ b/src/datavisualization/data/scatterrenderitem.cpp
@@ -33,7 +33,6 @@ ScatterRenderItem::ScatterRenderItem(const ScatterRenderItem &other)
m_visible(false)
{
m_position = other.m_position;
- m_rotation = other.m_rotation;
}
ScatterRenderItem::~ScatterRenderItem()
diff --git a/src/datavisualization/data/scatterrenderitem_p.h b/src/datavisualization/data/scatterrenderitem_p.h
index 45066dd8..8b560c89 100644
--- a/src/datavisualization/data/scatterrenderitem_p.h
+++ b/src/datavisualization/data/scatterrenderitem_p.h
@@ -53,19 +53,11 @@ public:
}
}
- inline QQuaternion rotation() const { return m_rotation; }
- inline void setRotation(const QQuaternion &rotation)
- {
- if (m_rotation != rotation)
- m_rotation = rotation;
- }
-
inline bool isVisible() const { return m_visible; }
inline void setVisible(bool visible) { m_visible = visible; }
protected:
QVector3D m_position;
- QQuaternion m_rotation;
bool m_visible;
friend class QScatterDataItem;
diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp
index 7b610cd9..264d25d0 100644
--- a/src/datavisualization/engine/bars3drenderer.cpp
+++ b/src/datavisualization/engine/bars3drenderer.cpp
@@ -44,7 +44,6 @@ const GLfloat labelMargin = 0.05f;
const GLfloat gridLineWidth = 0.005f;
const bool sliceGridLabels = true;
-const QQuaternion identityQuaternion;
Bars3DRenderer::Bars3DRenderer(Bars3DController *controller)
: Abstract3DRenderer(controller),
@@ -262,13 +261,6 @@ void Bars3DRenderer::updateData()
void Bars3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesList, bool updateVisibility)
{
Abstract3DRenderer::updateSeries(seriesList, updateVisibility);
-
- // Fix the series rotations - ignore any rotations that are not along Y-axis
- for (int series = 0; series < m_visibleSeriesList.size(); series++) {
- QVector3D vector = m_visibleSeriesList.at(series).meshRotation().vector();
- if (vector.x() || vector.z())
- m_visibleSeriesList[series].setMeshRotation(identityQuaternion);
- }
}
void Bars3DRenderer::updateScene(Q3DScene *scene)
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index 92c5a619..0c835c77 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -210,7 +210,14 @@ void Scatter3DRenderer::updateData()
&& (dotPos.z() >= minZ && dotPos.z() <= maxZ)) {
renderItem.setPosition(dotPos);
renderItem.setVisible(true);
- renderItem.setRotation(dataArray.at(i).rotation());
+ float angle = dataArray.at(i).rotationAngle();
+ if (angle) {
+ renderItem.setRotation(QQuaternion::fromAxisAndAngle(
+ dataArray.at(i).rotationAxis(),
+ dataArray.at(i).rotationAngle()));
+ } else {
+ renderItem.setRotation(identityQuaternion);
+ }
calculateTranslation(renderItem);
} else {
renderItem.setVisible(false);
diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp
index 5d20e761..9ce0fe99 100644
--- a/src/datavisualization/engine/seriesrendercache.cpp
+++ b/src/datavisualization/engine/seriesrendercache.cpp
@@ -128,7 +128,11 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer *
}
if (seriesChanged || changeTracker.meshRotationChanged) {
- m_meshRotation = series->meshRotation();
+ float angle = series->meshRotationAngle();
+ if (angle)
+ m_meshRotation = QQuaternion::fromAxisAndAngle(series->meshRotationAxis(), series->meshRotationAngle());
+ else
+ m_meshRotation = identityQuaternion;
changeTracker.meshRotationChanged = false;
}
diff --git a/src/datavisualization/global/datavisualizationglobal_p.h b/src/datavisualization/global/datavisualizationglobal_p.h
index 2cfa559c..fc39874f 100644
--- a/src/datavisualization/global/datavisualizationglobal_p.h
+++ b/src/datavisualization/global/datavisualizationglobal_p.h
@@ -32,6 +32,7 @@
#include "qdatavisualizationglobal.h"
#include <QOpenGLFunctions>
#include <QVector3D>
+#include <QQuaternion>
#include <QDebug>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -49,6 +50,7 @@ static const QVector3D defaultLightPos = QVector3D(0.0f, 0.5f, 0.0f);
static const QVector3D zeroVector = QVector3D(0.0f, 0.0f, 0.0f);
static const QVector3D upVector = QVector3D(0.0f, 1.0f, 0.0f);
static const QVector3D cameraDistanceVector = QVector3D(0.0f, 0.0f, cameraDistance);
+static const QQuaternion identityQuaternion;
// Skip color == selection texture's background color
static const QVector3D selectionSkipColor = QVector3D(255.0f, 255.0f, 255.0f);
diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp
index 8ab619ec..df71a0ed 100644
--- a/tests/barstest/chart.cpp
+++ b/tests/barstest/chart.cpp
@@ -1095,10 +1095,8 @@ void GraphModifier::triggerRotation()
} else {
// Rotate the first series instead
static float seriesAngle = 0.0f;
- if (m_graph->seriesList().size()) {
- QQuaternion rotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, seriesAngle++);
- m_graph->seriesList().at(0)->setMeshRotation(rotation);
- }
+ if (m_graph->seriesList().size())
+ m_graph->seriesList().at(0)->setMeshRotationAngle(seriesAngle++);
}
}
diff --git a/tests/directional/main.cpp b/tests/directional/main.cpp
index f4871a70..2b077b97 100644
--- a/tests/directional/main.cpp
+++ b/tests/directional/main.cpp
@@ -32,11 +32,9 @@
int main(int argc, char **argv)
{
- //! [0]
QApplication app(argc, argv);
Q3DScatter *graph = new Q3DScatter();
QWidget *container = QWidget::createWindowContainer(graph);
- //! [0]
QSize screenSize = graph->screen()->size();
container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
@@ -44,17 +42,14 @@ int main(int argc, char **argv)
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
container->setFocusPolicy(Qt::StrongFocus);
- //! [1]
QWidget *widget = new QWidget;
QHBoxLayout *hLayout = new QHBoxLayout(widget);
QVBoxLayout *vLayout = new QVBoxLayout();
hLayout->addWidget(container, 1);
hLayout->addLayout(vLayout);
- //! [1]
widget->setWindowTitle(QStringLiteral("Directional scatter"));
- //! [4]
QComboBox *themeList = new QComboBox(widget);
themeList->addItem(QStringLiteral("Qt"));
themeList->addItem(QStringLiteral("Primary Colors"));
@@ -79,7 +74,7 @@ int main(int argc, char **argv)
cameraButton->setText(QStringLiteral("Change camera preset"));
QPushButton *toggleRotationButton = new QPushButton(widget);
- toggleRotationButton->setText(QStringLiteral("Toggle rotation"));
+ toggleRotationButton->setText(QStringLiteral("Toggle animation"));
QCheckBox *backgroundCheckBox = new QCheckBox(widget);
backgroundCheckBox->setText(QStringLiteral("Show background"));
@@ -101,9 +96,7 @@ int main(int argc, char **argv)
QFontComboBox *fontList = new QFontComboBox(widget);
fontList->setCurrentFont(QFont("Arial"));
- //! [4]
- //! [5]
vLayout->addWidget(labelButton, 0, Qt::AlignTop);
vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
vLayout->addWidget(toggleRotationButton, 0, Qt::AlignTop);
@@ -117,13 +110,9 @@ int main(int argc, char **argv)
vLayout->addWidget(shadowQuality);
vLayout->addWidget(new QLabel(QStringLiteral("Change font")));
vLayout->addWidget(fontList, 1, Qt::AlignTop);
- //! [5]
- //! [2]
ScatterDataModifier *modifier = new ScatterDataModifier(graph);
- //! [2]
- //! [6]
QObject::connect(cameraButton, &QPushButton::clicked, modifier,
&ScatterDataModifier::changePresetCamera);
QObject::connect(toggleRotationButton, &QPushButton::clicked, modifier,
@@ -159,12 +148,9 @@ int main(int argc, char **argv)
QObject::connect(modifier, &ScatterDataModifier::fontChanged, fontList,
&QFontComboBox::setCurrentFont);
- //! [6]
itemStyleList->setCurrentIndex(0);
- //! [3]
widget->show();
return app.exec();
- //! [3]
}
diff --git a/tests/directional/scatterdatamodifier.cpp b/tests/directional/scatterdatamodifier.cpp
index 96a7b975..3735e14c 100644
--- a/tests/directional/scatterdatamodifier.cpp
+++ b/tests/directional/scatterdatamodifier.cpp
@@ -32,7 +32,7 @@ const int numberOfCols = 8;
const int numberOfRows = 8;
const float limit = 8.0f;
const float PI = 3.14159f;
-//#define HEDGEHOG
+#define HEDGEHOG
ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
: m_graph(scatter),
@@ -111,7 +111,8 @@ void ScatterDataModifier::addData()
#endif
ptrToDataArray->setPosition(QVector3D(x, y, z));
- ptrToDataArray->setRotation(rotation);
+ ptrToDataArray->setRotationAxis(rotation.vector());
+ ptrToDataArray->setRotationAngle(qAcos(rotation.scalar()) * 360.0f / M_PI);
ptrToDataArray++;
}
}
@@ -172,15 +173,13 @@ void ScatterDataModifier::triggerRotation()
if (m_graph->seriesList().size()) {
int selectedIndex = m_graph->seriesList().at(0)->selectedItem();
if (selectedIndex != QScatter3DSeries::invalidSelectionIndex()) {
- static float itemAngle = 0.0f;
QScatterDataItem item(*(m_graph->seriesList().at(0)->dataProxy()->itemAt(selectedIndex)));
- QQuaternion itemRotation = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, itemAngle++);
- item.setRotation(itemRotation);
+ item.setRotationAngle(item.rotationAngle() + 1);
m_graph->seriesList().at(0)->dataProxy()->setItem(selectedIndex, item);
} else {
static float seriesAngle = 0.0f;
- QQuaternion rotation = QQuaternion::fromAxisAndAngle(1.0f, 1.0f, 1.0f, seriesAngle++);
- m_graph->seriesList().at(0)->setMeshRotation(rotation);
+ m_graph->seriesList().at(0)->setMeshRotationAxis(QVector3D(1.0f, 1.0f, 1.0f));
+ m_graph->seriesList().at(0)->setMeshRotationAngle(seriesAngle++);
}
}
}
diff --git a/tests/qmlcamera/qml/qmlcamera/Data.qml b/tests/qmlcamera/qml/qmlcamera/Data.qml
index bab6bf78..ba920ef9 100644
--- a/tests/qmlcamera/qml/qmlcamera/Data.qml
+++ b/tests/qmlcamera/qml/qmlcamera/Data.qml
@@ -38,7 +38,7 @@ Item {
dataProxy: modelProxy
itemLabelFormat: "@valueTitle for @colLabel, @rowLabel: @valueLabel"
- onMeshAngleChanged: console.log("angle changed:", angle)
+ onMeshRotationAngleChanged: console.log("angle changed:", angle)
}
ListModel {
diff --git a/tests/qmldynamicdata/qml/qmldynamicdata/main.qml b/tests/qmldynamicdata/qml/qmldynamicdata/main.qml
index d384c3ee..03bf4b2d 100644
--- a/tests/qmldynamicdata/qml/qmldynamicdata/main.qml
+++ b/tests/qmldynamicdata/qml/qmldynamicdata/main.qml
@@ -28,8 +28,8 @@ Item {
ListModel {
id: graphModel
- ListElement{ xPos: 0.0; yPos: 0.0; zPos: 0.0; rotation: "0.92388, 0.220942, 0.220942, 0.220942"}
- ListElement{ xPos: 1.0; yPos: 1.0; zPos: 1.0; rotation: "0.953717, 0.173613, 0.173613, 0.173613"}
+ ListElement{ xPos: 0.0; yPos: 0.0; zPos: 0.0; rotationAxis: "1.0,1.0,1.0"; rotationAngle: 45 }
+ ListElement{ xPos: 1.0; yPos: 1.0; zPos: 1.0; rotationAxis: "1.0,1.0,1.0"; rotationAngle: 45 }
}
Timer {
@@ -39,18 +39,34 @@ Item {
repeat: true
property bool isIncreasing: true
+ function generateAngle() {
+ return Math.random() * 360
+ }
+
+ function generateAxis() {
+ return Math.random() + "," + Math.random() + "," + Math.random()
+ }
+
+ function appendRow() {
+ graphModel.append({"xPos": Math.random(),
+ "yPos": Math.random(),
+ "zPos": Math.random(),
+ "rotationAxis": generateAxis(),
+ "rotationAngle": generateAngle()});
+ }
+
onTriggered: {
if (isIncreasing) {
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
- graphModel.append({"xPos": Math.random(), "yPos": Math.random(), "zPos": Math.random()});
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
+ appendRow()
if (graphModel.count > 5000) {
scatterGraph.theme.type = Theme3D.ThemeIsabelle;
isIncreasing = false;
@@ -114,7 +130,8 @@ Item {
xPosRole: "xPos"
yPosRole: "yPos"
zPosRole: "zPos"
- rotationRole: "rotation"
+ rotationAxisRole: "rotationAxis"
+ rotationAngleRole: "rotationAngle"
}
}
}