summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorRhys Weatherley <rhys.weatherley@nokia.com>2009-10-25 22:04:23 (GMT)
committerRhys Weatherley <rhys.weatherley@nokia.com>2009-10-25 22:04:23 (GMT)
commit48df46cd38e69fed9454d97eeaf8cf0c0489acfa (patch)
treeacdfbab7c2a822f0e5c1f4cf648aede68ebd522d /src/gui
parentcbf6b6ee60816f44ad72f8ff550b35332d0114a6 (diff)
downloadQt-48df46cd38e69fed9454d97eeaf8cf0c0489acfa.zip
Qt-48df46cd38e69fed9454d97eeaf8cf0c0489acfa.tar.gz
Qt-48df46cd38e69fed9454d97eeaf8cf0c0489acfa.tar.bz2
Add an extra overload for QMatrix4x4::toTransform()
Change 100afe8d fixed a bug in QGraphicsRotation related to when the "distance to plane" projection needed to be performed. As a side effect it made the toTransform() API not do the expected thing when the function is called with no argument. This change makes the default no-argument version of toTransform() do the simple "drop row 3 and column 3" orthographic transformation that normal users of the class expect, and adds a new overload for the "distance to plane" projection case for the special case. Reviewed-by: trustme
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/graphicsview/qgraphicsitem_p.h2
-rw-r--r--src/gui/graphicsview/qgraphicstransform.cpp2
-rw-r--r--src/gui/math3d/qmatrix4x4.cpp22
-rw-r--r--src/gui/math3d/qmatrix4x4.h3
4 files changed, 24 insertions, 5 deletions
diff --git a/src/gui/graphicsview/qgraphicsitem_p.h b/src/gui/graphicsview/qgraphicsitem_p.h
index 046f5dc..7c3c4f0 100644
--- a/src/gui/graphicsview/qgraphicsitem_p.h
+++ b/src/gui/graphicsview/qgraphicsitem_p.h
@@ -542,7 +542,7 @@ struct QGraphicsItemPrivate::TransformData
QMatrix4x4 m;
for (int i = 0; i < graphicsTransforms.size(); ++i)
graphicsTransforms.at(i)->applyTo(&m);
- x *= m.toTransform(0);
+ x *= m.toTransform();
}
x.translate(xOrigin, yOrigin);
x.rotate(rotation);
diff --git a/src/gui/graphicsview/qgraphicstransform.cpp b/src/gui/graphicsview/qgraphicstransform.cpp
index 49d8999..a0b5493 100644
--- a/src/gui/graphicsview/qgraphicstransform.cpp
+++ b/src/gui/graphicsview/qgraphicstransform.cpp
@@ -549,7 +549,7 @@ void QGraphicsRotation::applyTo(QMatrix4x4 *matrix) const
matrix->translate(d->origin);
QMatrix4x4 m;
m.rotate(d->angle, d->axis.x(), d->axis.y(), d->axis.z());
- *matrix *= m.toTransform();
+ *matrix *= m.toTransform(1024.0f); // Project back to 2D.
matrix->translate(-d->origin);
}
diff --git a/src/gui/math3d/qmatrix4x4.cpp b/src/gui/math3d/qmatrix4x4.cpp
index ed1b13d..00e8f15 100644
--- a/src/gui/math3d/qmatrix4x4.cpp
+++ b/src/gui/math3d/qmatrix4x4.cpp
@@ -1430,6 +1430,24 @@ QMatrix QMatrix4x4::toAffine() const
m[3][0], m[3][1]);
}
+/*!
+ Returns the conventional Qt 2D transformation matrix that
+ corresponds to this matrix.
+
+ The returned QTransform is formed by simply dropping the
+ third row and third column of the QMatrix4x4. This is suitable
+ for implementing orthographic projections where the z co-ordinate
+ should be dropped rather than projected.
+
+ \sa toAffine()
+*/
+QTransform QMatrix4x4::toTransform() const
+{
+ return QTransform(m[0][0], m[0][1], m[0][3],
+ m[1][0], m[1][1], m[1][3],
+ m[3][0], m[3][1], m[3][3]);
+}
+
static const qreal inv_dist_to_plane = 1. / 1024.;
/*!
@@ -1437,8 +1455,8 @@ static const qreal inv_dist_to_plane = 1. / 1024.;
corresponds to this matrix.
If \a distanceToPlane is non-zero, it indicates a projection
- factor to use to adjust for the z co-ordinate. The default
- value of 1024 corresponds to the projection factor used
+ factor to use to adjust for the z co-ordinate. The value of
+ 1024 corresponds to the projection factor used
by QTransform::rotate() for the x and y axes.
If \a distanceToPlane is zero, then the returned QTransform
diff --git a/src/gui/math3d/qmatrix4x4.h b/src/gui/math3d/qmatrix4x4.h
index b32e00a..42d992e 100644
--- a/src/gui/math3d/qmatrix4x4.h
+++ b/src/gui/math3d/qmatrix4x4.h
@@ -159,7 +159,8 @@ public:
void toValueArray(qreal *values) const;
QMatrix toAffine() const;
- QTransform toTransform(qreal distanceToPlane = 1024.0f) const;
+ QTransform toTransform() const;
+ QTransform toTransform(qreal distanceToPlane) const;
QPoint map(const QPoint& point) const;
QPointF map(const QPointF& point) const;