summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main.cpp4
-rw-r--r--mazescene.cpp25
-rw-r--r--mazescene.h5
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<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;
};