diff options
Diffstat (limited to 'src')
-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 123c0f0..ed1b13d 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 7631ae7..cfa3f2a 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 |