qmlfrontend/hwengine.cpp
author unc0rr
Sun, 07 Jan 2018 01:21:42 +0100
branchqmlfrontend
changeset 12888 adb1fccc706a
parent 12887 bf58f2403953
child 12895 9c259fb4d405
permissions -rw-r--r--
- ResizeWindow function to pass engine new window size - Remove TabBar to leave more space at the bottom of the screen - ifdef GL_ES in shaders
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12862
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
     1
#include "hwengine.h"
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
     2
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
     3
#include <QDebug>
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
     4
#include <QLibrary>
12865
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
     5
#include <QQmlEngine>
12866
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
     6
#include <QUuid>
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
     7
12881
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents: 12868
diff changeset
     8
#include "gameview.h"
12866
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
     9
#include "previewimageprovider.h"
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
    10
#include "runqueue.h"
12862
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    11
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    12
extern "C" {
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    13
RunEngine_t* flibRunEngine;
12881
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents: 12868
diff changeset
    14
GameTick_t* flibGameTick;
12888
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12887
diff changeset
    15
ResizeWindow_t* flibResizeWindow;
12864
a03f245243b0 And more refactoring...
unc0rr
parents: 12863
diff changeset
    16
ipcToEngineRaw_t* flibIpcToEngineRaw;
a03f245243b0 And more refactoring...
unc0rr
parents: 12863
diff changeset
    17
ipcSetEngineBarrier_t* flibIpcSetEngineBarrier;
a03f245243b0 And more refactoring...
unc0rr
parents: 12863
diff changeset
    18
ipcRemoveBarrierFromEngineQueue_t* flibIpcRemoveBarrierFromEngineQueue;
12862
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    19
registerUIMessagesCallback_t* flibRegisterUIMessagesCallback;
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    20
flibInit_t* flibInit;
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    21
flibFree_t* flibFree;
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    22
passFlibEvent_t* flibPassFlibEvent;
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    23
}
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    24
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    25
HWEngine::HWEngine(QQmlEngine* engine, QObject* parent)
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    26
    : QObject(parent)
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    27
    , m_engine(engine)
12866
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
    28
    , m_previewProvider(new PreviewImageProvider())
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
    29
    , m_runQueue(new RunQueue(this))
12862
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    30
{
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    31
    qRegisterMetaType<MessageType>("MessageType");
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    32
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    33
#ifdef Q_OS_WIN
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    34
    QLibrary hwlib("./libhwengine.dll");
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    35
#else
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    36
    QLibrary hwlib("./libhwengine.so");
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    37
#endif
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    38
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    39
    if (!hwlib.load())
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    40
        qWarning() << "Engine library not found" << hwlib.errorString();
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    41
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    42
    flibRunEngine = (RunEngine_t*)hwlib.resolve("RunEngine");
12881
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents: 12868
diff changeset
    43
    flibGameTick = (GameTick_t*)hwlib.resolve("GameTick");
12888
adb1fccc706a - ResizeWindow function to pass engine new window size
unc0rr
parents: 12887
diff changeset
    44
    flibResizeWindow = (ResizeWindow_t*)hwlib.resolve("ResizeWindow");
12864
a03f245243b0 And more refactoring...
unc0rr
parents: 12863
diff changeset
    45
    flibIpcToEngineRaw = (ipcToEngineRaw_t*)hwlib.resolve("ipcToEngineRaw");
a03f245243b0 And more refactoring...
unc0rr
parents: 12863
diff changeset
    46
    flibIpcSetEngineBarrier = (ipcSetEngineBarrier_t*)hwlib.resolve("ipcSetEngineBarrier");
a03f245243b0 And more refactoring...
unc0rr
parents: 12863
diff changeset
    47
    flibIpcRemoveBarrierFromEngineQueue = (ipcRemoveBarrierFromEngineQueue_t*)hwlib.resolve("ipcRemoveBarrierFromEngineQueue");
12862
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    48
    flibRegisterUIMessagesCallback = (registerUIMessagesCallback_t*)hwlib.resolve("registerUIMessagesCallback");
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    49
    flibInit = (flibInit_t*)hwlib.resolve("flibInit");
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    50
    flibFree = (flibFree_t*)hwlib.resolve("flibFree");
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    51
12887
bf58f2403953 whoops, I ruined the path of the unC0Rr
sheepluva
parents: 12886
diff changeset
    52
    flibInit("/usr/home/unC0Rr/Sources/Hedgewars/MainRepo/share/hedgewars/Data", "/usr/home/unC0Rr/.hedgewars");
12862
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    53
    flibRegisterUIMessagesCallback(this, &guiMessagesCallback);
12866
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
    54
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
    55
    m_engine->addImageProvider(QLatin1String("preview"), m_previewProvider);
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
    56
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
    57
    connect(m_runQueue, &RunQueue::previewIsRendering, this, &HWEngine::previewIsRendering);
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
    58
    connect(this, &HWEngine::gameFinished, m_runQueue, &RunQueue::onGameFinished);
12862
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    59
}
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    60
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    61
HWEngine::~HWEngine()
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    62
{
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    63
    flibFree();
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    64
}
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    65
12865
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    66
static QObject* hwengine_singletontype_provider(QQmlEngine* engine, QJSEngine* scriptEngine)
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    67
{
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    68
    Q_UNUSED(scriptEngine)
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    69
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    70
    HWEngine* hwengine = new HWEngine(engine);
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    71
    return hwengine;
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    72
}
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    73
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    74
void HWEngine::exposeToQML()
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    75
{
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    76
    qDebug("HWEngine::exposeToQML");
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    77
    qmlRegisterSingletonType<HWEngine>("Hedgewars.Engine", 1, 0, "HWEngine", hwengine_singletontype_provider);
12881
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents: 12868
diff changeset
    78
    qmlRegisterType<GameView>("Hedgewars.Engine", 1, 0, "GameView");
12865
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    79
}
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    80
12862
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    81
void HWEngine::guiMessagesCallback(void* context, MessageType mt, const char* msg, uint32_t len)
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    82
{
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    83
    HWEngine* obj = reinterpret_cast<HWEngine*>(context);
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    84
    QByteArray b = QByteArray(msg, len);
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    85
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    86
    qDebug() << "FLIPC in" << mt << " size = " << b.size();
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    87
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    88
    QMetaObject::invokeMethod(obj, "engineMessageHandler", Qt::QueuedConnection, Q_ARG(MessageType, mt), Q_ARG(QByteArray, b));
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    89
}
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    90
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    91
void HWEngine::engineMessageHandler(MessageType mt, const QByteArray& msg)
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    92
{
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    93
    switch (mt) {
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    94
    case MSG_PREVIEW: {
12865
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
    95
        qDebug("MSG_PREVIEW");
12866
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
    96
        m_previewProvider->setPixmap(msg);
12862
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    97
        emit previewImageChanged();
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    98
        break;
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
    99
    }
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
   100
    case MSG_PREVIEWHOGCOUNT: {
12865
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
   101
        qDebug("MSG_PREVIEWHOGCOUNT");
12862
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
   102
        emit previewHogCountChanged((quint8)msg.data()[0]);
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
   103
        break;
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
   104
    }
12865
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
   105
    case MSG_TONET: {
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
   106
        qDebug("MSG_TONET");
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
   107
        break;
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
   108
    }
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
   109
    case MSG_GAMEFINISHED: {
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
   110
        qDebug("MSG_GAMEFINISHED");
12866
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
   111
        emit gameFinished();
12865
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
   112
        break;
e33bcb9d5e9c Preview rendering seems to work now
unc0rr
parents: 12864
diff changeset
   113
    }
12862
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
   114
    }
90f927b4b9e1 Start hacking new frontend
unc0rr
parents:
diff changeset
   115
}
12863
0c6fb706f747 More refactoring in attempt to move away from frontlib
unc0rr
parents: 12862
diff changeset
   116
0c6fb706f747 More refactoring in attempt to move away from frontlib
unc0rr
parents: 12862
diff changeset
   117
void HWEngine::getPreview()
0c6fb706f747 More refactoring in attempt to move away from frontlib
unc0rr
parents: 12862
diff changeset
   118
{
12881
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents: 12868
diff changeset
   119
    m_seed = QUuid::createUuid().toByteArray();
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents: 12868
diff changeset
   120
    m_gameConfig.cmdSeed(m_seed);
12868
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   121
    m_gameConfig.setPreview(true);
12866
488782d9aba9 Recreate uFLRunQueue in Qt, render previews
unc0rr
parents: 12865
diff changeset
   122
12868
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   123
    m_runQueue->queue(m_gameConfig);
12863
0c6fb706f747 More refactoring in attempt to move away from frontlib
unc0rr
parents: 12862
diff changeset
   124
}
0c6fb706f747 More refactoring in attempt to move away from frontlib
unc0rr
parents: 12862
diff changeset
   125
0c6fb706f747 More refactoring in attempt to move away from frontlib
unc0rr
parents: 12862
diff changeset
   126
void HWEngine::runQuickGame()
0c6fb706f747 More refactoring in attempt to move away from frontlib
unc0rr
parents: 12862
diff changeset
   127
{
12881
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents: 12868
diff changeset
   128
    m_gameConfig.cmdSeed(m_seed);
b544bbbd0696 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen)
unc0rr
parents: 12868
diff changeset
   129
    m_gameConfig.cmdTheme("Nature");
12868
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   130
    Team team1;
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   131
    team1.name = "team1";
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   132
    Team team2;
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   133
    team2.name = "team2";
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   134
    team2.color = "7654321";
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   135
    m_gameConfig.cmdTeam(team1);
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   136
    m_gameConfig.cmdTeam(team2);
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   137
    m_gameConfig.setPreview(false);
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   138
fe16fa088b69 Make playing a game possible
unc0rr
parents: 12866
diff changeset
   139
    m_runQueue->queue(m_gameConfig);
12863
0c6fb706f747 More refactoring in attempt to move away from frontlib
unc0rr
parents: 12862
diff changeset
   140
}