diff options
author | Samuel Rødal <srodal@gmail.com> | 2008-11-29 20:07:06 +0100 |
---|---|---|
committer | Samuel Rødal <srodal@gmail.com> | 2008-11-29 20:07:06 +0100 |
commit | 406717252f90d1d8b318114c86ec87ad338265a6 (patch) | |
tree | b8cb397c12db798297d8d44492f03d52801d1fc5 /mazescene.cpp | |
parent | 36253b8255967b683805d0808feef0bfcb747921 (diff) |
Add simple Matrix4x4 class for more generic transformations.
Diffstat (limited to 'mazescene.cpp')
-rw-r--r-- | mazescene.cpp | 49 |
1 files changed, 29 insertions, 20 deletions
diff --git a/mazescene.cpp b/mazescene.cpp index 26fce9d..9b6e1ac 100644 --- a/mazescene.cpp +++ b/mazescene.cpp @@ -14,6 +14,8 @@ #include <qmath.h> #include <qdebug.h> +#include "matrix4x4.h" + #ifdef USE_PHONON #include "mediaplayer/mediaplayer.h" #endif @@ -162,9 +164,6 @@ void MazeScene::drawBackground(QPainter *painter, const QRectF &rect) painter->fillRect(QRectF(rect.topLeft(), QPointF(rect.right(), rect.center().y())), QColor(100, 120, 200)); painter->fillRect(QRectF(QPointF(rect.left(), rect.center().y()), rect.bottomRight()), QColor(127, 190, 100)); - QTransform rotation = rotatingTransform(m_cameraAngle); - rotation.translate(-m_cameraPos.x(), -m_cameraPos.y()); - static QImage floor = QImage("floor.png").convertToFormat(QImage::Format_RGB32); QBrush floorBrush(floor); @@ -176,21 +175,29 @@ void MazeScene::drawBackground(QPainter *painter, const QRectF &rect) floorBrush.setTransform(brushScale); ceilingBrush.setTransform(brushScale); - QTransform project; - const qreal fov = 0.5; - const qreal wallHeight = 0.5 + 0.04 * qSin(0.01 * m_walkTime) + 0.1; - const qreal ceilingHeight = -0.5 + 0.04 * qSin(0.01 * m_walkTime) + 0.1; const QRectF r(1, 1, m_width-2, m_height-2); + Matrix4x4 m; + m *= Matrix4x4::fromRotation(m_cameraAngle, Qt::YAxis); + m *= Matrix4x4::fromProjection(0.5); + + qreal heightOffset = 0.04 * qSin(0.01 * m_walkTime) + 0.1; + + Matrix4x4 floorMatrix = Matrix4x4::fromRotation(90, Qt::XAxis); + floorMatrix *= Matrix4x4::fromTranslation(-m_cameraPos.x(), heightOffset + 0.5, -m_cameraPos.y()); + floorMatrix *= m; + painter->save(); - project = QTransform(rotation.m11(), 0, fov * rotation.m12(), rotation.m21(), 0, fov * rotation.m22(), rotation.m31(), wallHeight, fov * rotation.m32()); - painter->setTransform(project, true); + painter->setTransform(floorMatrix.toQTransform(), true); painter->fillRect(r, floorBrush); painter->restore(); + Matrix4x4 ceilingMatrix = Matrix4x4::fromRotation(90, Qt::XAxis); + ceilingMatrix *= Matrix4x4::fromTranslation(-m_cameraPos.x(), heightOffset - 0.5, -m_cameraPos.y()); + ceilingMatrix *= m; + painter->save(); - project = QTransform(rotation.m11(), 0, fov * rotation.m12(), rotation.m21(), 0, fov * rotation.m22(), rotation.m31(), ceilingHeight, fov * rotation.m32()); - painter->setTransform(project, true); + painter->setTransform(ceilingMatrix.toQTransform(), true); painter->fillRect(r, ceilingBrush); painter->restore(); @@ -423,29 +430,31 @@ void ProjectedItem::setImage(const QImage &image) void ProjectedItem::updateTransform(const QPointF &cameraPos, qreal cameraAngle, qreal time) { - QTransform rotation = rotatingTransform(cameraAngle); - rotation.translate(-cameraPos.x(), -cameraPos.y()); + QTransform rotation; + rotation *= QTransform().translate(-cameraPos.x(), -cameraPos.y()); + rotation *= rotatingTransform(cameraAngle); QPointF ca = rotation.map(m_a); QPointF cb = rotation.map(m_b); + qreal zm = QLineF(QPointF(), (ca + cb) / 2).length(); if (ca.y() <= 0 && cb.y() <= 0) { setVisible(false); return; } - const qreal mx = ca.x() - cb.x(); - const qreal tx = 0.5 * (ca.x() + cb.x()); - const qreal mz = ca.y() - cb.y(); - const qreal tz = 0.5 * (ca.y() + cb.y()); const qreal fov = 0.5; + QPointF center = (m_a + m_b) / 2; - const QTransform project(mx, 0, mz * fov, 0, 1, 0, tx, 0.04 * qSin(10 * time) + 0.1, tz * fov); - const qreal zm = QLineF(QPointF(), (ca + cb) / 2).length(); + Matrix4x4 m; + m *= Matrix4x4::fromRotation(-QLineF(m_b, m_a).angle(), Qt::YAxis); + m *= Matrix4x4::fromTranslation(center.x() - cameraPos.x(), 0.04 * qSin(10 * time) + 0.1, center.y() - cameraPos.y()); + m *= Matrix4x4::fromRotation(cameraAngle, Qt::YAxis); + m *= Matrix4x4::fromProjection(fov); setVisible(true); setZValue(-zm); - setTransform(project); + setTransform(m.toQTransform()); } void MazeScene::keyPressEvent(QKeyEvent *event) |