From 440f6851eef0d0e3afbafedeace44608a0b58b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Thu, 2 Sep 2010 12:32:16 +0200 Subject: Only toggle to a QGLWidget if not using an OpenGL based graphics system. --- main.cpp | 4 +--- mazescene.cpp | 25 ++++++++++++++++++++++++- mazescene.h | 5 +++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/main.cpp b/main.cpp index 2797201..0588180 100644 --- a/main.cpp +++ b/main.cpp @@ -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(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 &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 &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; }; -- cgit v1.2.3