diff -r 90bd2c331703 -r b6824a53d4b1 qmlfrontend/engine_instance.cpp --- a/qmlfrontend/engine_instance.cpp Fri Dec 07 13:35:08 2018 +0100 +++ b/qmlfrontend/engine_instance.cpp Fri Dec 07 13:56:45 2018 +0100 @@ -1,6 +1,7 @@ #include "engine_instance.h" #include +#include #include #include @@ -12,37 +13,78 @@ return currentOpenglContext->getProcAddress(fn); } -EngineInstance::EngineInstance(QObject* parent) - : QObject(parent), m_instance(Engine::start_engine()) {} +EngineInstance::EngineInstance(const QString& libraryPath, QObject* parent) + : QObject(parent) { + QLibrary hwlib(libraryPath); + + if (!hwlib.load()) + qWarning() << "Engine library not found" << hwlib.errorString(); + + hedgewars_engine_protocol_version = + reinterpret_cast( + hwlib.resolve("hedgewars_engine_protocol_version")); + start_engine = + reinterpret_cast(hwlib.resolve("start_engine")); + generate_preview = reinterpret_cast( + hwlib.resolve("generate_preview")); + cleanup = reinterpret_cast(hwlib.resolve("cleanup")); + + send_ipc = reinterpret_cast(hwlib.resolve("send_ipc")); + read_ipc = reinterpret_cast(hwlib.resolve("read_ipc")); -EngineInstance::~EngineInstance() { Engine::cleanup(m_instance); } + setup_current_gl_context = + reinterpret_cast( + hwlib.resolve("setup_current_gl_context")); + render_frame = + reinterpret_cast(hwlib.resolve("render_frame")); + advance_simulation = reinterpret_cast( + hwlib.resolve("advance_simulation")); + + m_isValid = hedgewars_engine_protocol_version && start_engine && + generate_preview && cleanup && send_ipc && read_ipc && + setup_current_gl_context && render_frame && advance_simulation; + emit isValidChanged(m_isValid); + + if (isValid()) { + qDebug() << "Loaded engine library with protocol version" + << hedgewars_engine_protocol_version(); + + m_instance = start_engine(); + } +} + +EngineInstance::~EngineInstance() { + if (m_isValid) cleanup(m_instance); +} void EngineInstance::sendConfig(const GameConfig& config) { for (auto b : config.config()) { - Engine::send_ipc(m_instance, reinterpret_cast(b.data()), - static_cast(b.size())); + send_ipc(m_instance, reinterpret_cast(b.data()), + static_cast(b.size())); } } void EngineInstance::advance(quint32 ticks) { - Engine::advance_simulation(m_instance, ticks); + advance_simulation(m_instance, ticks); } -void EngineInstance::renderFrame() { Engine::render_frame(m_instance); } +void EngineInstance::renderFrame() { render_frame(m_instance); } void EngineInstance::setOpenGLContext(QOpenGLContext* context) { currentOpenglContext = context; auto size = context->surface()->size(); - Engine::setup_current_gl_context( - m_instance, static_cast(size.width()), - static_cast(size.height()), &getProcAddress); + setup_current_gl_context(m_instance, static_cast(size.width()), + static_cast(size.height()), + &getProcAddress); } Engine::PreviewInfo EngineInstance::generatePreview() { Engine::PreviewInfo pinfo; - Engine::generate_preview(m_instance, &pinfo); + generate_preview(m_instance, &pinfo); return pinfo; } + +bool EngineInstance::isValid() const { return m_isValid; }