qmlfrontend/game_view.cpp
changeset 14290 92e5682810d4
parent 14154 8354b390f1a2
child 14298 00b56ec8b7df
equal deleted inserted replaced
14289:12618cd83af8 14290:92e5682810d4
     1 #include "gameview.h"
     1 #include "game_view.h"
     2 
     2 
     3 #include <QtQuick/qquickwindow.h>
     3 #include <QtQuick/qquickwindow.h>
     4 #include <QCursor>
     4 #include <QCursor>
     5 #include <QTimer>
     5 #include <QTimer>
     6 #include <QtGui/QOpenGLContext>
     6 #include <QtGui/QOpenGLContext>
     7 #include <QtGui/QOpenGLShaderProgram>
     7 #include <QtGui/QOpenGLShaderProgram>
     8 
     8 
     9 #include "flib.h"
     9 GameView::GameView() : m_delta(0), m_windowChanged(true) {
    10 
       
    11 extern "C" {
       
    12 extern GameTick_t* flibGameTick;
       
    13 extern ResizeWindow_t* flibResizeWindow;
       
    14 extern updateMousePosition_t* flibUpdateMousePosition;
       
    15 }
       
    16 
       
    17 GameView::GameView() : m_delta(0), m_renderer(nullptr), m_windowChanged(true) {
       
    18   connect(this, &QQuickItem::windowChanged, this,
    10   connect(this, &QQuickItem::windowChanged, this,
    19           &GameView::handleWindowChanged);
    11           &GameView::handleWindowChanged);
    20 }
    12 }
    21 
    13 
    22 void GameView::tick(quint32 delta) {
    14 void GameView::tick(quint32 delta) {
    29 
    21 
    30     // window()->update();
    22     // window()->update();
    31   }
    23   }
    32 }
    24 }
    33 
    25 
       
    26 EngineInstance* GameView::engineInstance() const { return m_engineInstance; }
       
    27 
    34 void GameView::handleWindowChanged(QQuickWindow* win) {
    28 void GameView::handleWindowChanged(QQuickWindow* win) {
    35   if (win) {
    29   if (win) {
    36     connect(win, &QQuickWindow::beforeSynchronizing, this, &GameView::sync,
    30     connect(win, &QQuickWindow::beforeSynchronizing, this, &GameView::sync,
    37             Qt::DirectConnection);
    31             Qt::DirectConnection);
    38     connect(win, &QQuickWindow::sceneGraphInvalidated, this, &GameView::cleanup,
    32     connect(win, &QQuickWindow::sceneGraphInvalidated, this, &GameView::cleanup,
    42 
    36 
    43     m_windowChanged = true;
    37     m_windowChanged = true;
    44   }
    38   }
    45 }
    39 }
    46 
    40 
    47 void GameView::cleanup() {
    41 void GameView::cleanup() { m_renderer.reset(); }
    48   if (m_renderer) {
    42 
    49     delete m_renderer;
    43 void GameView::setEngineInstance(EngineInstance* engineInstance) {
    50     m_renderer = 0;
    44   if (m_engineInstance == engineInstance) return;
    51   }
    45 
       
    46   cleanup();
       
    47   m_engineInstance = engineInstance;
       
    48   engineInstance->setOpenGLContext(window()->openglContext());
       
    49   emit engineInstanceChanged(m_engineInstance);
    52 }
    50 }
    53 
    51 
    54 void GameView::sync() {
    52 void GameView::sync() {
    55   if (!m_renderer) {
    53   if (!m_renderer) {
    56     m_renderer = new GameViewRenderer();
    54     m_renderer.reset(new GameViewRenderer());
    57     connect(window(), &QQuickWindow::beforeRendering, m_renderer,
    55     connect(window(), &QQuickWindow::beforeRendering, m_renderer.data(),
    58             &GameViewRenderer::paint, Qt::DirectConnection);
    56             &GameViewRenderer::paint, Qt::DirectConnection);
    59   }
    57   }
    60 
    58 
    61   if (m_windowChanged) {
    59   if (m_windowChanged) {
    62     QSize windowSize = window()->size();
    60     QSize windowSize = window()->size();
    63     m_renderer->setViewportSize(windowSize * window()->devicePixelRatio());
    61     m_renderer->setViewportSize(windowSize * window()->devicePixelRatio());
    64     m_centerX = windowSize.width() / 2;
    62     m_centerX = windowSize.width() / 2;
    65     m_centerY = windowSize.height() / 2;
    63     m_centerY = windowSize.height() / 2;
    66   }
    64   }
    67 
    65 
    68   QPoint mousePos = mapFromGlobal(QCursor::pos()).toPoint();
    66   // QPoint mousePos = mapFromGlobal(QCursor::pos()).toPoint();
    69   if (flibUpdateMousePosition(m_centerX, m_centerY, mousePos.x(), mousePos.y()))
    67   // if (flibUpdateMousePosition(m_centerX, m_centerY, mousePos.x(),
    70     QCursor::setPos(mapToGlobal(QPointF(m_centerX, m_centerY)).toPoint());
    68   // mousePos.y()))
       
    69   //  QCursor::setPos(mapToGlobal(QPointF(m_centerX, m_centerY)).toPoint());
    71 
    70 
    72   m_renderer->tick(m_delta);
    71   m_renderer->tick(m_delta);
    73 }
    72 }
    74 
    73 
       
    74 GameViewRenderer::GameViewRenderer()
       
    75     : QObject(), m_delta(0), m_engineInstance(nullptr) {}
       
    76 
    75 GameViewRenderer::~GameViewRenderer() {}
    77 GameViewRenderer::~GameViewRenderer() {}
    76 
    78 
       
    79 void GameViewRenderer::tick(quint32 delta) { m_delta = delta; }
       
    80 
    77 void GameViewRenderer::setViewportSize(const QSize& size) {
    81 void GameViewRenderer::setViewportSize(const QSize& size) {
    78   flibResizeWindow(size.width(), size.height());
    82   // flibResizeWindow(size.width(), size.height());
       
    83 }
       
    84 
       
    85 void GameViewRenderer::setEngineInstance(EngineInstance* engineInstance) {
       
    86   m_engineInstance = engineInstance;
    79 }
    87 }
    80 
    88 
    81 void GameViewRenderer::paint() {
    89 void GameViewRenderer::paint() {
    82   if (m_delta == 0) return;
    90   if (m_delta == 0) return;
    83 
    91 
    84   flibGameTick(m_delta);
    92   if (m_engineInstance) {
       
    93     m_engineInstance->advance(m_delta);
       
    94     m_engineInstance->renderFrame();
       
    95   }
    85 
    96 
    86   // m_window->resetOpenGLState();
    97   // m_window->resetOpenGLState();
    87 }
    98 }