|
1 #include "gameview.h" |
|
2 |
|
3 #include <QtGui/QOpenGLContext> |
|
4 #include <QtGui/QOpenGLShaderProgram> |
|
5 #include <QtQuick/qquickwindow.h> |
|
6 |
|
7 #include "flib.h" |
|
8 |
|
9 extern "C" { |
|
10 extern GameTick_t* flibGameTick; |
|
11 } |
|
12 |
|
13 GameView::GameView() |
|
14 : m_delta(0) |
|
15 , m_renderer(0) |
|
16 { |
|
17 connect(this, &QQuickItem::windowChanged, this, &GameView::handleWindowChanged); |
|
18 } |
|
19 |
|
20 void GameView::tick(quint32 delta) |
|
21 { |
|
22 m_delta = delta; |
|
23 if (window()) |
|
24 window()->update(); |
|
25 } |
|
26 |
|
27 void GameView::handleWindowChanged(QQuickWindow* win) |
|
28 { |
|
29 if (win) { |
|
30 connect(win, &QQuickWindow::beforeSynchronizing, this, &GameView::sync, Qt::DirectConnection); |
|
31 connect(win, &QQuickWindow::sceneGraphInvalidated, this, &GameView::cleanup, Qt::DirectConnection); |
|
32 |
|
33 win->setClearBeforeRendering(false); |
|
34 } |
|
35 } |
|
36 |
|
37 void GameView::cleanup() |
|
38 { |
|
39 if (m_renderer) { |
|
40 delete m_renderer; |
|
41 m_renderer = 0; |
|
42 } |
|
43 } |
|
44 |
|
45 GameViewRenderer::~GameViewRenderer() |
|
46 { |
|
47 } |
|
48 |
|
49 void GameView::sync() |
|
50 { |
|
51 if (!m_renderer) { |
|
52 m_renderer = new GameViewRenderer(); |
|
53 connect(window(), &QQuickWindow::beforeRendering, m_renderer, &GameViewRenderer::paint, Qt::DirectConnection); |
|
54 } |
|
55 m_renderer->setViewportSize(window()->size() * window()->devicePixelRatio()); |
|
56 m_renderer->tick(m_delta); |
|
57 m_renderer->setWindow(window()); |
|
58 } |
|
59 |
|
60 void GameViewRenderer::paint() |
|
61 { |
|
62 if (m_delta == 0) |
|
63 return; |
|
64 |
|
65 flibGameTick(m_delta); |
|
66 |
|
67 m_window->resetOpenGLState(); |
|
68 } |