diff -r 11202097584f -r 745c73e0e644 qmlfrontend/hwengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/hwengine.cpp Tue Nov 06 17:00:35 2018 +0100 @@ -0,0 +1,146 @@ +#include "hwengine.h" + +#include +#include +#include +#include + +#include "gameview.h" +#include "previewimageprovider.h" +#include "runqueue.h" + +extern "C" { +RunEngine_t* flibRunEngine; +GameTick_t* flibGameTick; +ResizeWindow_t* flibResizeWindow; +updateMousePosition_t* flibUpdateMousePosition; +ipcToEngineRaw_t* flibIpcToEngineRaw; +ipcSetEngineBarrier_t* flibIpcSetEngineBarrier; +ipcRemoveBarrierFromEngineQueue_t* flibIpcRemoveBarrierFromEngineQueue; +registerUIMessagesCallback_t* flibRegisterUIMessagesCallback; +flibInit_t* flibInit; +flibFree_t* flibFree; +passFlibEvent_t* flibPassFlibEvent; +} + +HWEngine::HWEngine(QQmlEngine* engine, QObject* parent) + : QObject(parent), + m_engine(engine), + m_previewProvider(new PreviewImageProvider()), + m_runQueue(new RunQueue(this)) { + qRegisterMetaType("MessageType"); + +#ifdef Q_OS_WIN + QLibrary hwlib("./libhwengine.dll"); +#else + QLibrary hwlib("./libhwengine.so"); +#endif + + if (!hwlib.load()) + qWarning() << "Engine library not found" << hwlib.errorString(); + + flibRunEngine = (RunEngine_t*)hwlib.resolve("RunEngine"); + flibGameTick = (GameTick_t*)hwlib.resolve("GameTick"); + flibResizeWindow = (ResizeWindow_t*)hwlib.resolve("ResizeWindow"); + flibUpdateMousePosition = + (updateMousePosition_t*)hwlib.resolve("updateMousePosition"); + flibIpcToEngineRaw = (ipcToEngineRaw_t*)hwlib.resolve("ipcToEngineRaw"); + flibIpcSetEngineBarrier = + (ipcSetEngineBarrier_t*)hwlib.resolve("ipcSetEngineBarrier"); + flibIpcRemoveBarrierFromEngineQueue = + (ipcRemoveBarrierFromEngineQueue_t*)hwlib.resolve( + "ipcRemoveBarrierFromEngineQueue"); + flibRegisterUIMessagesCallback = (registerUIMessagesCallback_t*)hwlib.resolve( + "registerUIMessagesCallback"); + flibInit = (flibInit_t*)hwlib.resolve("flibInit"); + flibFree = (flibFree_t*)hwlib.resolve("flibFree"); + + flibInit("/usr/home/unC0Rr/Sources/Hedgewars/MainRepo/share/hedgewars/Data", + "/usr/home/unC0Rr/.hedgewars"); + flibRegisterUIMessagesCallback(this, &guiMessagesCallback); + + m_engine->addImageProvider(QLatin1String("preview"), m_previewProvider); + + connect(m_runQueue, &RunQueue::previewIsRendering, this, + &HWEngine::previewIsRendering); + connect(this, &HWEngine::gameFinished, m_runQueue, &RunQueue::onGameFinished); +} + +HWEngine::~HWEngine() { flibFree(); } + +static QObject* hwengine_singletontype_provider(QQmlEngine* engine, + QJSEngine* scriptEngine) { + Q_UNUSED(scriptEngine) + + HWEngine* hwengine = new HWEngine(engine); + return hwengine; +} + +void HWEngine::exposeToQML() { + qDebug("HWEngine::exposeToQML"); + qmlRegisterSingletonType("Hedgewars.Engine", 1, 0, "HWEngine", + hwengine_singletontype_provider); + qmlRegisterType("Hedgewars.Engine", 1, 0, "GameView"); +} + +void HWEngine::guiMessagesCallback(void* context, MessageType mt, + const char* msg, uint32_t len) { + HWEngine* obj = reinterpret_cast(context); + QByteArray b = QByteArray(msg, len); + + qDebug() << "FLIPC in" << mt << " size = " << b.size(); + + QMetaObject::invokeMethod(obj, "engineMessageHandler", Qt::QueuedConnection, + Q_ARG(MessageType, mt), Q_ARG(QByteArray, b)); +} + +void HWEngine::engineMessageHandler(MessageType mt, const QByteArray& msg) { + switch (mt) { + case MSG_PREVIEW: { + qDebug("MSG_PREVIEW"); + m_previewProvider->setPixmap(msg); + emit previewImageChanged(); + break; + } + case MSG_PREVIEWHOGCOUNT: { + qDebug("MSG_PREVIEWHOGCOUNT"); + m_previewHedgehogsCount = static_cast(msg.data()[0]); + emit previewHogCountChanged(m_previewHedgehogsCount); + break; + } + case MSG_TONET: { + qDebug("MSG_TONET"); + break; + } + case MSG_GAMEFINISHED: { + qDebug("MSG_GAMEFINISHED"); + emit gameFinished(); + break; + } + } +} + +void HWEngine::getPreview() { + m_seed = QUuid::createUuid().toByteArray(); + m_gameConfig.cmdSeed(m_seed); + m_gameConfig.setPreview(true); + + m_runQueue->queue(m_gameConfig); +} + +void HWEngine::runQuickGame() { + m_gameConfig.cmdSeed(m_seed); + m_gameConfig.cmdTheme("Nature"); + Team team1; + team1.name = "team1"; + Team team2; + team2.name = "team2"; + team2.color = "7654321"; + m_gameConfig.cmdTeam(team1); + m_gameConfig.cmdTeam(team2); + m_gameConfig.setPreview(false); + + m_runQueue->queue(m_gameConfig); +} + +int HWEngine::previewHedgehogsCount() const { return m_previewHedgehogsCount; }