diff -r b273b43b16d2 -r 8354b390f1a2 qmlfrontend/hwengine.cpp --- a/qmlfrontend/hwengine.cpp Wed Nov 07 15:55:32 2018 +0100 +++ b/qmlfrontend/hwengine.cpp Wed Nov 07 15:59:51 2018 +0100 @@ -1,72 +1,23 @@ -#include "hwengine.h" - #include #include #include #include -#include "gameview.h" -#include "previewimageprovider.h" -#include "runqueue.h" +#include "engine_instance.h" +#include "engine_interface.h" +#include "game_view.h" +#include "preview_image_provider.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; -} +#include "hwengine.h" 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_previewProvider(new PreviewImageProvider()) { 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(); } +HWEngine::~HWEngine() {} static QObject* hwengine_singletontype_provider(QQmlEngine* engine, QJSEngine* scriptEngine) { @@ -80,44 +31,7 @@ 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; - } - } + // qmlRegisterType("Hedgewars.Engine", 1, 0, "GameView"); } void HWEngine::getPreview() { @@ -125,7 +39,22 @@ m_gameConfig.cmdSeed(m_seed); m_gameConfig.setPreview(true); - m_runQueue->queue(m_gameConfig); + EngineInstance engine; + Engine::PreviewInfo preview = engine.generatePreview(); + + QVector colorTable; + colorTable.resize(256); + for (int i = 0; i < 256; ++i) colorTable[i] = qRgba(255, 255, 0, i); + + QImage previewImage(preview.land, preview.width, preview.height, + QImage::Format_Indexed8); + previewImage.setColorTable(colorTable); + previewImage.detach(); + + m_previewProvider->setImage(previewImage); + + emit previewImageChanged(); + // m_runQueue->queue(m_gameConfig); } void HWEngine::runQuickGame() { @@ -140,7 +69,7 @@ m_gameConfig.cmdTeam(team2); m_gameConfig.setPreview(false); - m_runQueue->queue(m_gameConfig); + // m_runQueue->queue(m_gameConfig); } int HWEngine::previewHedgehogsCount() const { return m_previewHedgehogsCount; }