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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12876
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
     1
#include "gameview.h"
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
     2
12890
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
     3
#include <QCursor>
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
     4
#include <QTimer>
12876
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
     5
#include <QtGui/QOpenGLContext>
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
     6
#include <QtGui/QOpenGLShaderProgram>
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
     7
#include <QtQuick/qquickwindow.h>
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
     8
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
     9
#include "flib.h"
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    10
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    11
extern "C" {
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    12
extern GameTick_t* flibGameTick;
12883
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    13
extern ResizeWindow_t* flibResizeWindow;
12890
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    14
extern updateMousePosition_t* flibUpdateMousePosition;
12876
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    15
}
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    16
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    17
GameView::GameView()
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    18
    : m_delta(0)
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    19
    , m_renderer(0)
12883
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    20
    , m_windowChanged(true)
12876
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    21
{
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    22
    connect(this, &QQuickItem::windowChanged, this, &GameView::handleWindowChanged);
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    23
}
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    24
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    25
void GameView::tick(quint32 delta)
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    26
{
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    27
    m_delta = delta;
12890
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    28
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    29
    if (window()) {
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    30
        QTimer* timer = new QTimer(this);
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    31
        connect(timer, &QTimer::timeout, window(), &QQuickWindow::update);
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    32
        timer->start(100);
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    33
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    34
        //window()->update();
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    35
    }
12876
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    36
}
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    37
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    38
void GameView::handleWindowChanged(QQuickWindow* win)
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    39
{
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    40
    if (win) {
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    41
        connect(win, &QQuickWindow::beforeSynchronizing, this, &GameView::sync, Qt::DirectConnection);
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    42
        connect(win, &QQuickWindow::sceneGraphInvalidated, this, &GameView::cleanup, Qt::DirectConnection);
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    43
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    44
        win->setClearBeforeRendering(false);
12883
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    45
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    46
        m_windowChanged = true;
12876
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    47
    }
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    48
}
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    49
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    50
void GameView::cleanup()
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    51
{
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    52
    if (m_renderer) {
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    53
        delete m_renderer;
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    54
        m_renderer = 0;
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    55
    }
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    56
}
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    57
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    58
void GameView::sync()
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    59
{
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    60
    if (!m_renderer) {
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    61
        m_renderer = new GameViewRenderer();
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    62
        connect(window(), &QQuickWindow::beforeRendering, m_renderer, &GameViewRenderer::paint, Qt::DirectConnection);
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    63
    }
12883
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    64
12890
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    65
    if (m_windowChanged) {
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    66
        QSize windowSize = window()->size();
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    67
        m_renderer->setViewportSize(windowSize * window()->devicePixelRatio());
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    68
        m_centerX = windowSize.width() / 2;
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    69
        m_centerY = windowSize.height() / 2;
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    70
    }
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    71
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    72
    QPoint mousePos = mapFromGlobal(QCursor::pos()).toPoint();
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    73
    if (flibUpdateMousePosition(m_centerX, m_centerY, mousePos.x(), mousePos.y()))
9c259fb4d405 Pass mouse movements to engine, warp cursor in frontend
unc0rr
parents: 12883
diff changeset
    74
        QCursor::setPos(mapToGlobal(QPointF(m_centerX, m_centerY)).toPoint());
12883
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    75
12876
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    76
    m_renderer->tick(m_delta);
12883
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    77
}
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    78
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    79
GameViewRenderer::~GameViewRenderer()
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    80
{
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    81
}
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    82
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    83
void GameViewRenderer::setViewportSize(const QSize& size)
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    84
{
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    85
    flibResizeWindow(size.width(), size.height());
12876
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    86
}
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    87
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    88
void GameViewRenderer::paint()
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    89
{
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    90
    if (m_delta == 0)
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    91
        return;
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    92
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    93
    flibGameTick(m_delta);
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    94
12883
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12876
diff changeset
    95
    //m_window->resetOpenGLState();
12876
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents:
diff changeset
    96
}