qmlfrontend/gameview.cpp
author unc0rr
Wed, 10 Jan 2018 23:49:47 +0100
branchqmlfrontend
changeset 12890 9c259fb4d405
parent 12883 adb1fccc706a
permissions -rw-r--r--
Pass mouse movements to engine, warp cursor in frontend

#include "gameview.h"

#include <QCursor>
#include <QTimer>
#include <QtGui/QOpenGLContext>
#include <QtGui/QOpenGLShaderProgram>
#include <QtQuick/qquickwindow.h>

#include "flib.h"

extern "C" {
extern GameTick_t* flibGameTick;
extern ResizeWindow_t* flibResizeWindow;
extern updateMousePosition_t* flibUpdateMousePosition;
}

GameView::GameView()
    : m_delta(0)
    , m_renderer(0)
    , m_windowChanged(true)
{
    connect(this, &QQuickItem::windowChanged, this, &GameView::handleWindowChanged);
}

void GameView::tick(quint32 delta)
{
    m_delta = delta;

    if (window()) {
        QTimer* timer = new QTimer(this);
        connect(timer, &QTimer::timeout, window(), &QQuickWindow::update);
        timer->start(100);

        //window()->update();
    }
}

void GameView::handleWindowChanged(QQuickWindow* win)
{
    if (win) {
        connect(win, &QQuickWindow::beforeSynchronizing, this, &GameView::sync, Qt::DirectConnection);
        connect(win, &QQuickWindow::sceneGraphInvalidated, this, &GameView::cleanup, Qt::DirectConnection);

        win->setClearBeforeRendering(false);

        m_windowChanged = true;
    }
}

void GameView::cleanup()
{
    if (m_renderer) {
        delete m_renderer;
        m_renderer = 0;
    }
}

void GameView::sync()
{
    if (!m_renderer) {
        m_renderer = new GameViewRenderer();
        connect(window(), &QQuickWindow::beforeRendering, m_renderer, &GameViewRenderer::paint, Qt::DirectConnection);
    }

    if (m_windowChanged) {
        QSize windowSize = window()->size();
        m_renderer->setViewportSize(windowSize * window()->devicePixelRatio());
        m_centerX = windowSize.width() / 2;
        m_centerY = windowSize.height() / 2;
    }

    QPoint mousePos = mapFromGlobal(QCursor::pos()).toPoint();
    if (flibUpdateMousePosition(m_centerX, m_centerY, mousePos.x(), mousePos.y()))
        QCursor::setPos(mapToGlobal(QPointF(m_centerX, m_centerY)).toPoint());

    m_renderer->tick(m_delta);
}

GameViewRenderer::~GameViewRenderer()
{
}

void GameViewRenderer::setViewportSize(const QSize& size)
{
    flibResizeWindow(size.width(), size.height());
}

void GameViewRenderer::paint()
{
    if (m_delta == 0)
        return;

    flibGameTick(m_delta);

    //m_window->resetOpenGLState();
}