From 42f9444e983b5257241c17242471ca63f208c3f6 Mon Sep 17 00:00:00 2001 From: Chris Adams Date: Mon, 16 Jul 2012 16:32:49 +1000 Subject: 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 --- src/quick/util/qquickglobal.cpp | 22 +-- src/quick/util/qquickvaluetypes.cpp | 309 ++++++++++++++++++++++++++++++++++++ src/quick/util/qquickvaluetypes_p.h | 60 +++++++ 3 files changed, 380 insertions(+), 11 deletions(-) (limited to 'src/quick/util') 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(argv[0]); + const qreal *sxyz = reinterpret_cast(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(argv[0]); + const qreal *vals = reinterpret_cast(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(); + 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(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(); + 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(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(); + 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(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()) + return false; + + QMatrix4x4 otherMatrix = other.value(); + return (v == otherMatrix); + +} QQuickFontValueType::QQuickFontValueType(QObject *parent) : QQmlValueTypeBase(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 @@ -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 @@ -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 @@ -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 -- cgit v1.2.3