diff options
author | Rhys Weatherley <rhys.weatherley@nokia.com> | 2009-09-22 10:55:02 +1000 |
---|---|---|
committer | Rhys Weatherley <rhys.weatherley@nokia.com> | 2009-09-22 10:55:02 +1000 |
commit | 8416ae1af3f13ad865b25a87e3e94e298b3a0ca2 (patch) | |
tree | 21fd4e9e878792bbc1ba8694aa404e428e98667e /src/gui/math3d | |
parent | 40bdb6a5bed66385c3c2320447b1530e99befeb3 (diff) | |
download | qt4-tools-8416ae1af3f13ad865b25a87e3e94e298b3a0ca2.tar.gz |
QMatrix4x4::mapVector() to transform by top-left 3x3
It is useful to be able to map direction vectors by the top-left
3x3 component of a 4x4 matrix, ignoring the translation and
projection components.
Reviewed-by: Sarah Smith
Diffstat (limited to 'src/gui/math3d')
-rw-r--r-- | src/gui/math3d/qmatrix4x4.cpp | 12 | ||||
-rw-r--r-- | src/gui/math3d/qmatrix4x4.h | 22 |
2 files changed, 33 insertions, 1 deletions
diff --git a/src/gui/math3d/qmatrix4x4.cpp b/src/gui/math3d/qmatrix4x4.cpp index 123c0f041c..ed1b13d4dd 100644 --- a/src/gui/math3d/qmatrix4x4.cpp +++ b/src/gui/math3d/qmatrix4x4.cpp @@ -1502,7 +1502,17 @@ QTransform QMatrix4x4::toTransform(qreal distanceToPlane) const Maps \a point by multiplying this matrix by \a point. - \sa mapRect() + \sa mapRect(), mapVector() +*/ + +/*! + \fn QVector3D QMatrix4x4::mapVector(const QVector3D& vector) const + + Maps \a vector by multiplying the top 3x3 portion of this matrix + by \a vector. The translation and projection components of + this matrix are ignored. + + \sa map() */ #endif diff --git a/src/gui/math3d/qmatrix4x4.h b/src/gui/math3d/qmatrix4x4.h index 7631ae72cf..cfa3f2a7a0 100644 --- a/src/gui/math3d/qmatrix4x4.h +++ b/src/gui/math3d/qmatrix4x4.h @@ -165,6 +165,7 @@ public: QPointF map(const QPointF& point) const; #ifndef QT_NO_VECTOR3D QVector3D map(const QVector3D& point) const; + QVector3D mapVector(const QVector3D& vector) const; #endif #ifndef QT_NO_VECTOR4D QVector4D map(const QVector4D& point) const; @@ -940,6 +941,27 @@ inline QVector3D QMatrix4x4::map(const QVector3D& point) const return *this * point; } +inline QVector3D QMatrix4x4::mapVector(const QVector3D& vector) const +{ + if (flagBits == Identity || flagBits == Translation) { + return vector; + } else if (flagBits == Scale || flagBits == (Translation | Scale)) { + return QVector3D(vector.x() * m[0][0], + vector.y() * m[1][1], + vector.z() * m[2][2]); + } else { + return QVector3D(vector.x() * m[0][0] + + vector.y() * m[1][0] + + vector.z() * m[2][0], + vector.x() * m[0][1] + + vector.y() * m[1][1] + + vector.z() * m[2][1], + vector.x() * m[0][2] + + vector.y() * m[1][2] + + vector.z() * m[2][2]); + } +} + #endif #ifndef QT_NO_VECTOR4D |