diff options
-rw-r--r-- | mazescene.cpp | 28 | ||||
-rw-r--r-- | modelitem.cpp | 15 |
2 files changed, 22 insertions, 21 deletions
diff --git a/mazescene.cpp b/mazescene.cpp index 46c1acb..2ac0f2c 100644 --- a/mazescene.cpp +++ b/mazescene.cpp @@ -376,13 +376,12 @@ void Camera::updateMatrix() const m_matrixDirty = false; QMatrix4x4 m; - m = QMatrix4x4().translate(-m_pos.x(), 0.04 * qSin(10 * m_time) + 0.1, -m_pos.y()) * m; - m = fromRotation(m_yaw + 180, Qt::YAxis) * m; - m = QMatrix4x4().scale(-1, 1, 1) * m; + m.scale(-1, 1, 1); + m *= fromRotation(m_yaw + 180, Qt::YAxis); + m.translate(-m_pos.x(), 0.04 * qSin(10 * m_time) + 0.1, -m_pos.y()); m = fromRotation(m_pitch, Qt::XAxis) * m; m_viewMatrix = m; - m = fromProjection(m_fov) * m; - m_viewProjectionMatrix = m; + m_viewProjectionMatrix = fromProjection(m_fov) * m_viewMatrix; } void MazeScene::drawBackground(QPainter *painter, const QRectF &) @@ -402,18 +401,18 @@ void MazeScene::drawBackground(QPainter *painter, const QRectF &) QMatrix4x4 m = m_camera.viewProjectionMatrix(); - QMatrix4x4 floorMatrix = fromRotation(90, Qt::XAxis); - floorMatrix = QMatrix4x4().translate(0, 0.5, 0) * floorMatrix; - floorMatrix = m * floorMatrix; + QMatrix4x4 floorMatrix = m; + floorMatrix.translate(0, 0.5, 0); + floorMatrix *= fromRotation(90, Qt::XAxis); painter->save(); painter->setTransform(floorMatrix.toTransform(0), true); painter->fillRect(r, floorBrush); painter->restore(); - QMatrix4x4 ceilingMatrix = fromRotation(90, Qt::XAxis); - ceilingMatrix = QMatrix4x4().translate(0, -0.5, 0) * ceilingMatrix; - ceilingMatrix = m * ceilingMatrix; + QMatrix4x4 ceilingMatrix = m; + ceilingMatrix.translate(0, -0.5, 0); + ceilingMatrix *= fromRotation(90, Qt::XAxis); painter->save(); painter->setTransform(ceilingMatrix.toTransform(0), true); @@ -699,10 +698,9 @@ void ProjectedItem::updateTransform(const Camera &camera) QPointF cb = rotation.map(m_b); if (ca.y() > 0 || cb.y() > 0) { - QMatrix4x4 m; - m = fromRotation(-QLineF(m_b, m_a).angle(), Qt::YAxis) * m; - m = QMatrix4x4().translate(center.x(), 0, center.y()) * m; - m = camera.viewProjectionMatrix() * m; + QMatrix4x4 m = camera.viewProjectionMatrix(); + m.translate(center.x(), 0, center.y()); + m *= fromRotation(-QLineF(m_b, m_a).angle(), Qt::YAxis); qreal zm = QLineF(camera.pos(), center).length(); diff --git a/modelitem.cpp b/modelitem.cpp index 4448519..6265e98 100644 --- a/modelitem.cpp +++ b/modelitem.cpp @@ -52,7 +52,9 @@ void ModelItem::updateTransform(const Camera &camera) ProjectedItem::updateTransform(camera); setTransform(QTransform()); - m_matrix = camera.viewMatrix() * QMatrix4x4().translate(3, 0, 7); + + m_matrix = camera.viewMatrix(); + m_matrix.translate(3, 0, 7); } QRectF ModelItem::boundingRect() const @@ -107,7 +109,8 @@ void ModelItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidg QVector3D size = m_model->size(); float extent = qSqrt(2.0); float scale = 1 / qMax(size.y(), qMax(size.x() / extent, size.z() / extent)); - QMatrix4x4 modelMatrix = QMatrix4x4().scale(scale, -scale, scale); + QMatrix4x4 modelMatrix; + modelMatrix.scale(scale, -scale, scale); modelMatrix = fromRotation(m_rotation.z(), Qt::ZAxis) * modelMatrix; modelMatrix = fromRotation(m_rotation.y(), Qt::YAxis) * modelMatrix; @@ -145,8 +148,8 @@ void ModelItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidg glewInit(); #endif m_program = new QGLShaderProgram; - m_program->addShader(QGLShader::FragmentShader, fragmentProgram); - m_program->addShader(QGLShader::VertexShader, vertexProgram); + m_program->addShaderFromSourceCode(QGLShader::Fragment, fragmentProgram); + m_program->addShaderFromSourceCode(QGLShader::Vertex, vertexProgram); m_program->bindAttributeLocation("vertexCoordsArray", 0); m_program->bindAttributeLocation("normalCoordsArray", 1); m_program->link(); @@ -162,12 +165,12 @@ void ModelItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidg 0, 0, 0, 1 }; - m_program->enable(); + m_program->bind(); m_program->setUniformValue("color", m_modelColor); m_program->setUniformValue("pmvMatrix", QMatrix4x4(ortho) * projectionMatrix * m_matrix * modelMatrix); m_program->setUniformValue("modelMatrix", modelMatrix); m_model->render(m_wireframeEnabled, m_normalsEnabled); - m_program->disable(); + m_program->release(); painter->endNativePainting(); #endif |