diff -r 8a6a2d931bae -r d52f5d8e75e6 qmlfrontend/engine_instance.cpp --- a/qmlfrontend/engine_instance.cpp Sat Nov 12 15:40:20 2022 +0100 +++ b/qmlfrontend/engine_instance.cpp Sat Nov 12 21:12:14 2022 +0100 @@ -13,8 +13,8 @@ return currentOpenglContext->getProcAddress(fn); } -EngineInstance::EngineInstance(const QString& libraryPath, QObject* parent) - : QObject(parent) { +EngineInstance::EngineInstance(const QString& libraryPath, const QString&dataPath, QObject* parent) + : QObject(parent), m_instance{nullptr, nullptr} { QLibrary hwlib(libraryPath); if (!hwlib.load()) @@ -62,52 +62,50 @@ qDebug() << "Loaded engine library with protocol version" << hedgewars_engine_protocol_version(); - m_instance = start_engine(); + m_instance = std::unique_ptr(start_engine(dataPath.toUtf8().data()), cleanup); } else { qDebug("Engine library load failed"); } } -EngineInstance::~EngineInstance() { - if (m_isValid) cleanup(m_instance); -} +EngineInstance::~EngineInstance() = default; void EngineInstance::sendConfig(const GameConfig& config) { for (auto b : config.config()) { - send_ipc(m_instance, reinterpret_cast(b.data()), + send_ipc(m_instance.get(), reinterpret_cast(b.data()), static_cast(b.size())); } } void EngineInstance::advance(quint32 ticks) { - advance_simulation(m_instance, ticks); + advance_simulation(m_instance.get(), ticks); } void EngineInstance::moveCamera(const QPoint& delta) { - move_camera(m_instance, delta.x(), delta.y()); + move_camera(m_instance.get(), delta.x(), delta.y()); } void EngineInstance::simpleEvent(Engine::SimpleEventType event_type) { - simple_event(m_instance, event_type); + simple_event(m_instance.get(), event_type); } void EngineInstance::longEvent(Engine::LongEventType event_type, Engine::LongEventState state) { - long_event(m_instance, event_type, state); + long_event(m_instance.get(), event_type, state); } void EngineInstance::positionedEvent(Engine::PositionedEventType event_type, qint32 x, qint32 y) { - positioned_event(m_instance, event_type, x, y); + positioned_event(m_instance.get(), event_type, x, y); } -void EngineInstance::renderFrame() { render_frame(m_instance); } +void EngineInstance::renderFrame() { render_frame(m_instance.get()); } void EngineInstance::setOpenGLContext(QOpenGLContext* context) { currentOpenglContext = context; auto size = context->surface()->size(); - setup_current_gl_context(m_instance, static_cast(size.width()), + setup_current_gl_context(m_instance.get(), static_cast(size.width()), static_cast(size.height()), &getProcAddress); } @@ -115,7 +113,7 @@ QImage EngineInstance::generatePreview() { Engine::PreviewInfo pinfo; - generate_preview(m_instance, &pinfo); + generate_preview(m_instance.get(), &pinfo); QVector colorTable; colorTable.resize(256); @@ -126,7 +124,7 @@ previewImage.setColorTable(colorTable); // Cannot use it here, since QImage refers to original bytes - // dispose_preview(m_instance); + // dispose_preview(m_instance.get()); return previewImage; }