diff options
-rw-r--r-- | main.cpp | 4 | ||||
-rw-r--r-- | mazescene.cpp | 25 | ||||
-rw-r--r-- | mazescene.h | 5 |
3 files changed, 30 insertions, 4 deletions
@@ -65,9 +65,7 @@ int main(int argc, char **argv) View view; view.resize(800, 600); view.setScene(scene); - view.show(); - - scene->toggleRenderer(); + view.showFullScreen(); return app.exec(); } diff --git a/mazescene.cpp b/mazescene.cpp index 19d65e5..ce5e678 100644 --- a/mazescene.cpp +++ b/mazescene.cpp @@ -68,6 +68,7 @@ POSSIBILITY OF SUCH DAMAGE." View::View() : m_scene(0) + , m_firstPaint(true) { } @@ -89,6 +90,19 @@ void View::resizeEvent(QResizeEvent *) m_scene->viewResized(this); } +void View::paintEvent(QPaintEvent *event) +{ + if (m_firstPaint) { + QPainter p(viewport()); + static_cast<MazeScene *>(scene())->setAcceleratedViewport( + p.paintEngine()->type() == QPaintEngine::OpenGL + || p.paintEngine()->type() == QPaintEngine::OpenGL2); + m_firstPaint = false; + } + + QGraphicsView::paintEvent(event); +} + Light::Light(const QPointF &pos, qreal intensity) : m_pos(pos) , m_intensity(intensity) @@ -208,6 +222,7 @@ MazeScene::MazeScene(const QVector<Light> &lights, const char *map, int width, i , m_width(width) , m_height(height) , m_player(0) + , m_accelerated(false) { m_camera.setPos(QPointF(1.5, 1.5)); m_camera.setYaw(0.1); @@ -272,6 +287,14 @@ MazeScene::MazeScene(const QVector<Light> &lights, const char *map, int width, i addItem(m_walkingItem); } +void MazeScene::setAcceleratedViewport(bool accelerated) +{ + m_accelerated = accelerated; + + if (!accelerated) + QTimer::singleShot(0, this, SLOT(toggleRenderer())); +} + void MazeScene::viewResized(QGraphicsView *view) { QRectF bounds = m_walkingItem->sceneBoundingRect(); @@ -1150,7 +1173,7 @@ void MazeScene::toggleRenderer() void MazeScene::updateRenderer() { QGraphicsView *view = views().isEmpty() ? 0 : views().at(0); - bool accelerated = view && view->viewport()->inherits("QGLWidget"); + bool accelerated = m_accelerated || view && view->viewport()->inherits("QGLWidget"); if (view) { if (accelerated) view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); diff --git a/mazescene.h b/mazescene.h index e73b703..8f7e3f4 100644 --- a/mazescene.h +++ b/mazescene.h @@ -59,9 +59,11 @@ public: View(); void resizeEvent(QResizeEvent *event); void setScene(MazeScene *scene); + void paintEvent(QPaintEvent *event); private: MazeScene *m_scene; + bool m_firstPaint; }; class Camera @@ -195,6 +197,7 @@ public: Camera camera() const { return m_camera; } void viewResized(QGraphicsView *view); + void setAcceleratedViewport(bool accelerated); protected: void mouseMoveEvent(QGraphicsSceneMouseEvent *event); @@ -245,6 +248,8 @@ private: MediaPlayer *m_player; QPointF m_playerPos; + bool m_accelerated; + WalkingItem *m_walkingItem; }; |