qmlfrontend/gameview.cpp
branchqmlfrontend
changeset 12876 b544bbbd0696
child 12883 adb1fccc706a
equal deleted inserted replaced
12863:fe16fa088b69 12876:b544bbbd0696
       
     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 }