aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util
diff options
context:
space:
mode:
authorChris Adams <christopher.adams@nokia.com>2012-07-16 16:32:49 +1000
committerQt by Nokia <qt-info@nokia.com>2012-08-09 07:58:06 +0200
commit42f9444e983b5257241c17242471ca63f208c3f6 (patch)
tree4847ae743a0e05b0ff9d3d4ab6003ea257a6c682 /src/quick/util
parentf09517bd9c907698a05ee92ccf158a06db3340b8 (diff)
Allow invokable functions of value-type classes to be called
Previously, invokable functions of value-type classes were returned as properties. This commit fixes that bug by allowing such functions to be invoked normally. It also improves copy-value type handling. This commit also ensures that QMatrix4x4 value types are constructed with qreal values as this is the storage type used internally. Change-Id: Iab0fe4c522ed53d60154e8a8d46dda925fb9f4de Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/quick/util')
-rw-r--r--src/quick/util/qquickglobal.cpp22
-rw-r--r--src/quick/util/qquickvaluetypes.cpp309
-rw-r--r--src/quick/util/qquickvaluetypes_p.h60
3 files changed, 380 insertions, 11 deletions
diff --git a/src/quick/util/qquickglobal.cpp b/src/quick/util/qquickglobal.cpp
index 1708cf7331..3d27e832ee 100644
--- a/src/quick/util/qquickglobal.cpp
+++ b/src/quick/util/qquickglobal.cpp
@@ -203,8 +203,8 @@ public:
int index = s.indexOf(QLatin1Char(','));
bool xGood, yGood;
- qreal xCoord = s.left(index).toDouble(&xGood);
- qreal yCoord = s.mid(index+1).toDouble(&yGood);
+ float xCoord = s.left(index).toFloat(&xGood);
+ float yCoord = s.mid(index+1).toFloat(&yGood);
if (xGood && yGood) {
if (ok) *ok = true;
@@ -223,9 +223,9 @@ public:
int index2 = s.indexOf(QLatin1Char(','), index+1);
bool xGood, yGood, zGood;
- qreal xCoord = s.left(index).toDouble(&xGood);
- qreal yCoord = s.mid(index+1, index2-index-1).toDouble(&yGood);
- qreal zCoord = s.mid(index2+1).toDouble(&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 (xGood && yGood && zGood) {
if (ok) *ok = true;
@@ -245,10 +245,10 @@ public:
int index3 = s.indexOf(QLatin1Char(','), index2+1);
bool xGood, yGood, zGood, wGood;
- qreal xCoord = s.left(index).toDouble(&xGood);
- qreal yCoord = s.mid(index+1, index2-index-1).toDouble(&yGood);
- qreal zCoord = s.mid(index2+1, index3-index2-1).toDouble(&zGood);
- qreal wCoord = s.mid(index3+1).toDouble(&wGood);
+ float xCoord = s.left(index).toFloat(&xGood);
+ float yCoord = s.mid(index+1, index2-index-1).toFloat(&yGood);
+ float zCoord = s.mid(index2+1, index3-index2-1).toFloat(&zGood);
+ float wCoord = s.mid(index3+1).toFloat(&wGood);
if (xGood && yGood && zGood && wGood) {
if (ok) *ok = true;
@@ -582,7 +582,7 @@ public:
break;
case QMetaType::QQuaternion:
if (argc == 1) {
- const double *sxyz = reinterpret_cast<const double*>(argv[0]);
+ const qreal *sxyz = reinterpret_cast<const qreal*>(argv[0]);
QQuaternion q(sxyz[0], sxyz[1], sxyz[2], sxyz[3]);
*v = QVariant(q);
return true;
@@ -590,7 +590,7 @@ public:
break;
case QMetaType::QMatrix4x4:
if (argc == 1) {
- const float *vals = reinterpret_cast<const float*>(argv[0]);
+ const qreal *vals = reinterpret_cast<const qreal*>(argv[0]);
QMatrix4x4 m(vals[0], vals[1], vals[2], vals[3],
vals[4], vals[5], vals[6], vals[7],
vals[8], vals[9], vals[10], vals[11],
diff --git a/src/quick/util/qquickvaluetypes.cpp b/src/quick/util/qquickvaluetypes.cpp
index 4224847311..c0f7e62c15 100644
--- a/src/quick/util/qquickvaluetypes.cpp
+++ b/src/quick/util/qquickvaluetypes.cpp
@@ -118,6 +118,15 @@ QString QQuickVector2DValueType::toString() const
return QString(QLatin1String("QVector2D(%1, %2)")).arg(v.x()).arg(v.y());
}
+bool QQuickVector2DValueType::isEqual(const QVariant &other) const
+{
+ if (other.userType() != QMetaType::QVector2D)
+ return false;
+
+ QVector2D otherVector = other.value<QVector2D>();
+ return (v == otherVector);
+}
+
qreal QQuickVector2DValueType::x() const
{
return v.x();
@@ -138,6 +147,66 @@ void QQuickVector2DValueType::setY(qreal y)
v.setY(y);
}
+qreal QQuickVector2DValueType::dotProduct(const QVector2D &vec) const
+{
+ return QVector2D::dotProduct(v, vec);
+}
+
+QVector2D QQuickVector2DValueType::times(const QVector2D &vec) const
+{
+ return v * vec;
+}
+
+QVector2D QQuickVector2DValueType::times(qreal scalar) const
+{
+ return v * scalar;
+}
+
+QVector2D QQuickVector2DValueType::plus(const QVector2D &vec) const
+{
+ return v + vec;
+}
+
+QVector2D QQuickVector2DValueType::minus(const QVector2D &vec) const
+{
+ return v - vec;
+}
+
+QVector2D QQuickVector2DValueType::normalized() const
+{
+ return v.normalized();
+}
+
+qreal QQuickVector2DValueType::length() const
+{
+ return v.length();
+}
+
+QVector3D QQuickVector2DValueType::toVector3d() const
+{
+ return v.toVector3D();
+}
+
+QVector4D QQuickVector2DValueType::toVector4d() const
+{
+ return v.toVector4D();
+}
+
+bool QQuickVector2DValueType::fuzzyEquals(const QVector2D &vec, qreal epsilon) const
+{
+ qreal absEps = qAbs(epsilon);
+ if (qAbs(v.x() - vec.x()) > absEps)
+ return false;
+ if (qAbs(v.y() - vec.y()) > absEps)
+ return false;
+ return true;
+}
+
+bool QQuickVector2DValueType::fuzzyEquals(const QVector2D &vec) const
+{
+ return qFuzzyCompare(v, vec);
+}
+
QQuickVector3DValueType::QQuickVector3DValueType(QObject *parent)
: QQmlValueTypeBase<QVector3D>(QMetaType::QVector3D, parent)
@@ -149,6 +218,15 @@ QString QQuickVector3DValueType::toString() const
return QString(QLatin1String("QVector3D(%1, %2, %3)")).arg(v.x()).arg(v.y()).arg(v.z());
}
+bool QQuickVector3DValueType::isEqual(const QVariant &other) const
+{
+ if (other.userType() != QMetaType::QVector3D)
+ return false;
+
+ QVector3D otherVector = other.value<QVector3D>();
+ return (v == otherVector);
+}
+
qreal QQuickVector3DValueType::x() const
{
return v.x();
@@ -179,6 +257,78 @@ void QQuickVector3DValueType::setZ(qreal z)
v.setZ(z);
}
+QVector3D QQuickVector3DValueType::crossProduct(const QVector3D &vec) const
+{
+ return QVector3D::crossProduct(v, vec);
+}
+
+qreal QQuickVector3DValueType::dotProduct(const QVector3D &vec) const
+{
+ return QVector3D::dotProduct(v, vec);
+}
+
+QVector3D QQuickVector3DValueType::times(const QMatrix4x4 &m) const
+{
+ return v * m;
+}
+
+QVector3D QQuickVector3DValueType::times(const QVector3D &vec) const
+{
+ return v * vec;
+}
+
+QVector3D QQuickVector3DValueType::times(qreal scalar) const
+{
+ return v * scalar;
+}
+
+QVector3D QQuickVector3DValueType::plus(const QVector3D &vec) const
+{
+ return v + vec;
+}
+
+QVector3D QQuickVector3DValueType::minus(const QVector3D &vec) const
+{
+ return v - vec;
+}
+
+QVector3D QQuickVector3DValueType::normalized() const
+{
+ return v.normalized();
+}
+
+qreal QQuickVector3DValueType::length() const
+{
+ return v.length();
+}
+
+QVector2D QQuickVector3DValueType::toVector2d() const
+{
+ return v.toVector2D();
+}
+
+QVector4D QQuickVector3DValueType::toVector4d() const
+{
+ return v.toVector4D();
+}
+
+bool QQuickVector3DValueType::fuzzyEquals(const QVector3D &vec, qreal epsilon) const
+{
+ qreal absEps = qAbs(epsilon);
+ if (qAbs(v.x() - vec.x()) > absEps)
+ return false;
+ if (qAbs(v.y() - vec.y()) > absEps)
+ return false;
+ if (qAbs(v.z() - vec.z()) > absEps)
+ return false;
+ return true;
+}
+
+bool QQuickVector3DValueType::fuzzyEquals(const QVector3D &vec) const
+{
+ return qFuzzyCompare(v, vec);
+}
+
QQuickVector4DValueType::QQuickVector4DValueType(QObject *parent)
: QQmlValueTypeBase<QVector4D>(QMetaType::QVector4D, parent)
@@ -190,6 +340,15 @@ QString QQuickVector4DValueType::toString() const
return QString(QLatin1String("QVector4D(%1, %2, %3, %4)")).arg(v.x()).arg(v.y()).arg(v.z()).arg(v.w());
}
+bool QQuickVector4DValueType::isEqual(const QVariant &other) const
+{
+ if (other.userType() != QMetaType::QVector4D)
+ return false;
+
+ QVector4D otherVector = other.value<QVector4D>();
+ return (v == otherVector);
+}
+
qreal QQuickVector4DValueType::x() const
{
return v.x();
@@ -230,6 +389,74 @@ void QQuickVector4DValueType::setW(qreal w)
v.setW(w);
}
+qreal QQuickVector4DValueType::dotProduct(const QVector4D &vec) const
+{
+ return QVector4D::dotProduct(v, vec);
+}
+
+QVector4D QQuickVector4DValueType::times(const QVector4D &vec) const
+{
+ return v * vec;
+}
+
+QVector4D QQuickVector4DValueType::times(const QMatrix4x4 &m) const
+{
+ return v * m;
+}
+
+QVector4D QQuickVector4DValueType::times(qreal scalar) const
+{
+ return v * scalar;
+}
+
+QVector4D QQuickVector4DValueType::plus(const QVector4D &vec) const
+{
+ return v + vec;
+}
+
+QVector4D QQuickVector4DValueType::minus(const QVector4D &vec) const
+{
+ return v - vec;
+}
+
+QVector4D QQuickVector4DValueType::normalized() const
+{
+ return v.normalized();
+}
+
+qreal QQuickVector4DValueType::length() const
+{
+ return v.length();
+}
+
+QVector2D QQuickVector4DValueType::toVector2d() const
+{
+ return v.toVector2D();
+}
+
+QVector3D QQuickVector4DValueType::toVector3d() const
+{
+ return v.toVector3D();
+}
+
+bool QQuickVector4DValueType::fuzzyEquals(const QVector4D &vec, qreal epsilon) const
+{
+ qreal absEps = qAbs(epsilon);
+ if (qAbs(v.x() - vec.x()) > absEps)
+ return false;
+ if (qAbs(v.y() - vec.y()) > absEps)
+ return false;
+ if (qAbs(v.z() - vec.z()) > absEps)
+ return false;
+ if (qAbs(v.w() - vec.w()) > absEps)
+ return false;
+ return true;
+}
+
+bool QQuickVector4DValueType::fuzzyEquals(const QVector4D &vec) const
+{
+ return qFuzzyCompare(v, vec);
+}
QQuickQuaternionValueType::QQuickQuaternionValueType(QObject *parent)
: QQmlValueTypeBase<QQuaternion>(QMetaType::QQuaternion, parent)
@@ -287,6 +514,79 @@ QQuickMatrix4x4ValueType::QQuickMatrix4x4ValueType(QObject *parent)
{
}
+QMatrix4x4 QQuickMatrix4x4ValueType::times(const QMatrix4x4 &m) const
+{
+ return v * m;
+}
+
+QVector4D QQuickMatrix4x4ValueType::times(const QVector4D &vec) const
+{
+ return v * vec;
+}
+
+QVector3D QQuickMatrix4x4ValueType::times(const QVector3D &vec) const
+{
+ return v * vec;
+}
+
+QMatrix4x4 QQuickMatrix4x4ValueType::times(qreal factor) const
+{
+ return v * factor;
+}
+
+QMatrix4x4 QQuickMatrix4x4ValueType::plus(const QMatrix4x4 &m) const
+{
+ return v + m;
+}
+
+QMatrix4x4 QQuickMatrix4x4ValueType::minus(const QMatrix4x4 &m) const
+{
+ return v - m;
+}
+
+QVector4D QQuickMatrix4x4ValueType::row(int n) const
+{
+ return v.row(n);
+}
+
+QVector4D QQuickMatrix4x4ValueType::column(int m) const
+{
+ return v.column(m);
+}
+
+qreal QQuickMatrix4x4ValueType::determinant() const
+{
+ return v.determinant();
+}
+
+QMatrix4x4 QQuickMatrix4x4ValueType::inverted() const
+{
+ return v.inverted();
+}
+
+QMatrix4x4 QQuickMatrix4x4ValueType::transposed() const
+{
+ return v.transposed();
+}
+
+bool QQuickMatrix4x4ValueType::fuzzyEquals(const QMatrix4x4 &m, qreal epsilon) const
+{
+ qreal absEps = qAbs(epsilon);
+ for (int i = 0; i < 4; ++i) {
+ for (int j = 0; j < 4; ++j) {
+ if (qAbs(v(i,j) - m(i,j)) > absEps) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+bool QQuickMatrix4x4ValueType::fuzzyEquals(const QMatrix4x4 &m) const
+{
+ return qFuzzyCompare(v, m);
+}
+
QString QQuickMatrix4x4ValueType::toString() const
{
return QString(QLatin1String("QMatrix4x4(%1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16)"))
@@ -296,6 +596,15 @@ QString QQuickMatrix4x4ValueType::toString() const
.arg(v(3, 0)).arg(v(3, 1)).arg(v(3, 2)).arg(v(3, 3));
}
+bool QQuickMatrix4x4ValueType::isEqual(const QVariant &other) const
+{
+ if (other.userType() != qMetaTypeId<QMatrix4x4>())
+ return false;
+
+ QMatrix4x4 otherMatrix = other.value<QMatrix4x4>();
+ return (v == otherMatrix);
+
+}
QQuickFontValueType::QQuickFontValueType(QObject *parent)
: QQmlValueTypeBase<QFont>(QMetaType::QFont, parent),
diff --git a/src/quick/util/qquickvaluetypes_p.h b/src/quick/util/qquickvaluetypes_p.h
index d2767db329..09c91d3bdf 100644
--- a/src/quick/util/qquickvaluetypes_p.h
+++ b/src/quick/util/qquickvaluetypes_p.h
@@ -95,11 +95,24 @@ public:
QQuickVector2DValueType(QObject *parent = 0);
virtual QString toString() const;
+ virtual bool isEqual(const QVariant &other) const;
qreal x() const;
qreal y() const;
void setX(qreal);
void setY(qreal);
+
+ Q_INVOKABLE qreal dotProduct(const QVector2D &vec) const;
+ Q_INVOKABLE QVector2D times(const QVector2D &vec) const;
+ Q_INVOKABLE QVector2D times(qreal scalar) const;
+ Q_INVOKABLE QVector2D plus(const QVector2D &vec) const;
+ Q_INVOKABLE QVector2D minus(const QVector2D &vec) const;
+ Q_INVOKABLE QVector2D normalized() const;
+ Q_INVOKABLE qreal length() const;
+ Q_INVOKABLE QVector3D toVector3d() const;
+ Q_INVOKABLE QVector4D toVector4d() const;
+ Q_INVOKABLE bool fuzzyEquals(const QVector2D &vec, qreal epsilon) const;
+ Q_INVOKABLE bool fuzzyEquals(const QVector2D &vec) const;
};
class Q_AUTOTEST_EXPORT QQuickVector3DValueType : public QQmlValueTypeBase<QVector3D>
@@ -112,6 +125,7 @@ public:
QQuickVector3DValueType(QObject *parent = 0);
virtual QString toString() const;
+ virtual bool isEqual(const QVariant &other) const;
qreal x() const;
qreal y() const;
@@ -119,6 +133,20 @@ public:
void setX(qreal);
void setY(qreal);
void setZ(qreal);
+
+ Q_INVOKABLE QVector3D crossProduct(const QVector3D &vec) const;
+ Q_INVOKABLE qreal dotProduct(const QVector3D &vec) const;
+ Q_INVOKABLE QVector3D times(const QMatrix4x4 &m) const;
+ Q_INVOKABLE QVector3D times(const QVector3D &vec) const;
+ Q_INVOKABLE QVector3D times(qreal scalar) const;
+ Q_INVOKABLE QVector3D plus(const QVector3D &vec) const;
+ Q_INVOKABLE QVector3D minus(const QVector3D &vec) const;
+ Q_INVOKABLE QVector3D normalized() const;
+ Q_INVOKABLE qreal length() const;
+ Q_INVOKABLE QVector2D toVector2d() const;
+ Q_INVOKABLE QVector4D toVector4d() const;
+ Q_INVOKABLE bool fuzzyEquals(const QVector3D &vec, qreal epsilon) const;
+ Q_INVOKABLE bool fuzzyEquals(const QVector3D &vec) const;
};
class Q_AUTOTEST_EXPORT QQuickVector4DValueType : public QQmlValueTypeBase<QVector4D>
@@ -132,6 +160,7 @@ public:
QQuickVector4DValueType(QObject *parent = 0);
virtual QString toString() const;
+ virtual bool isEqual(const QVariant &other) const;
qreal x() const;
qreal y() const;
@@ -141,6 +170,19 @@ public:
void setY(qreal);
void setZ(qreal);
void setW(qreal);
+
+ Q_INVOKABLE qreal dotProduct(const QVector4D &vec) const;
+ Q_INVOKABLE QVector4D times(const QVector4D &vec) const;
+ Q_INVOKABLE QVector4D times(const QMatrix4x4 &m) const;
+ Q_INVOKABLE QVector4D times(qreal scalar) const;
+ Q_INVOKABLE QVector4D plus(const QVector4D &vec) const;
+ Q_INVOKABLE QVector4D minus(const QVector4D &vec) const;
+ Q_INVOKABLE QVector4D normalized() const;
+ Q_INVOKABLE qreal length() const;
+ Q_INVOKABLE QVector2D toVector2d() const;
+ Q_INVOKABLE QVector3D toVector3d() const;
+ Q_INVOKABLE bool fuzzyEquals(const QVector4D &vec, qreal epsilon) const;
+ Q_INVOKABLE bool fuzzyEquals(const QVector4D &vec) const;
};
class Q_AUTOTEST_EXPORT QQuickQuaternionValueType : public QQmlValueTypeBase<QQuaternion>
@@ -188,6 +230,7 @@ public:
QQuickMatrix4x4ValueType(QObject *parent = 0);
virtual QString toString() const;
+ virtual bool isEqual(const QVariant &other) const;
qreal m11() const { return v(0, 0); }
qreal m12() const { return v(0, 1); }
@@ -222,6 +265,23 @@ public:
void setM42(qreal value) { v(3, 1) = value; }
void setM43(qreal value) { v(3, 2) = value; }
void setM44(qreal value) { v(3, 3) = value; }
+
+ Q_INVOKABLE QMatrix4x4 times(const QMatrix4x4 &m) const;
+ Q_INVOKABLE QVector4D times(const QVector4D &vec) const;
+ Q_INVOKABLE QVector3D times(const QVector3D &vec) const;
+ Q_INVOKABLE QMatrix4x4 times(qreal factor) const;
+ Q_INVOKABLE QMatrix4x4 plus(const QMatrix4x4 &m) const;
+ Q_INVOKABLE QMatrix4x4 minus(const QMatrix4x4 &m) const;
+
+ Q_INVOKABLE QVector4D row(int n) const;
+ Q_INVOKABLE QVector4D column(int m) const;
+
+ Q_INVOKABLE qreal determinant() const;
+ Q_INVOKABLE QMatrix4x4 inverted() const;
+ Q_INVOKABLE QMatrix4x4 transposed() const;
+
+ Q_INVOKABLE bool fuzzyEquals(const QMatrix4x4 &m, qreal epsilon) const;
+ Q_INVOKABLE bool fuzzyEquals(const QMatrix4x4 &m) const;
};
class Q_AUTOTEST_EXPORT QQuickFontValueType : public QQmlValueTypeBase<QFont>