# HG changeset patch # User unC0Rr # Date 1543240118 -3600 # Node ID 00b56ec8b7df23a28b6c8899ca43a4cde2811f60 # Parent a6c5ce1475306f303c5e88ed37216f9c228bb4b7 Pass opengl context to engine diff -r a6c5ce147530 -r 00b56ec8b7df qmlfrontend/Page1.qml --- a/qmlfrontend/Page1.qml Mon Nov 26 14:31:36 2018 +0100 +++ b/qmlfrontend/Page1.qml Mon Nov 26 14:48:38 2018 +0100 @@ -6,7 +6,8 @@ gameView.tick(100) } gameButton.onClicked: { - HWEngine.runQuickGame() + var engineInstance = HWEngine.runQuickGame() + gameView.engineInstance = engineInstance } button1.onClicked: { HWEngine.getPreview() diff -r a6c5ce147530 -r 00b56ec8b7df qmlfrontend/Page1Form.ui.qml --- a/qmlfrontend/Page1Form.ui.qml Mon Nov 26 14:31:36 2018 +0100 +++ b/qmlfrontend/Page1Form.ui.qml Mon Nov 26 14:48:38 2018 +0100 @@ -40,8 +40,8 @@ border.width: 5 radius: 5 + Layout.minimumHeight: 256 Layout.fillWidth: true - Layout.fillHeight: true gradient: Gradient { GradientStop { @@ -72,12 +72,12 @@ cache: false } } - } - GameView { - id: gameView - x: 8 - y: 154 - width: 1008 - height: 638 + + GameView { + id: gameView + + Layout.fillWidth: true + Layout.fillHeight: true + } } } diff -r a6c5ce147530 -r 00b56ec8b7df qmlfrontend/engine_instance.cpp --- a/qmlfrontend/engine_instance.cpp Mon Nov 26 14:31:36 2018 +0100 +++ b/qmlfrontend/engine_instance.cpp Mon Nov 26 14:48:38 2018 +0100 @@ -1,6 +1,16 @@ #include "engine_instance.h" -extern "C" void (*getProcAddress())(const char* fn) { return nullptr; } +#include +#include +#include + +static QOpenGLContext* currentOpenglContext = nullptr; +extern "C" void (*getProcAddress(const char* fn))() { + if (!currentOpenglContext) + return nullptr; + else + return currentOpenglContext->getProcAddress(fn); +} EngineInstance::EngineInstance(QObject* parent) : QObject(parent), m_instance(Engine::start_engine()) {} @@ -14,12 +24,19 @@ } } -void EngineInstance::advance(quint32 ticks) {} +void EngineInstance::advance(quint32 ticks) { + Engine::advance_simulation(m_instance, ticks); +} -void EngineInstance::renderFrame() {} +void EngineInstance::renderFrame() { Engine::render_frame(m_instance); } void EngineInstance::setOpenGLContext(QOpenGLContext* context) { - Engine::setup_current_gl_context(m_instance, 0, 0, &getProcAddress); + currentOpenglContext = context; + + auto size = context->surface()->size(); + Engine::setup_current_gl_context( + m_instance, static_cast(size.width()), + static_cast(size.height()), &getProcAddress); } Engine::PreviewInfo EngineInstance::generatePreview() { diff -r a6c5ce147530 -r 00b56ec8b7df qmlfrontend/engine_interface.h --- a/qmlfrontend/engine_interface.h Mon Nov 26 14:31:36 2018 +0100 +++ b/qmlfrontend/engine_interface.h Mon Nov 26 14:48:38 2018 +0100 @@ -31,7 +31,7 @@ typedef void setup_current_gl_context_t(EngineInstance* engine_state, uint16_t width, uint16_t height, - void (*())(const char*)); + void (*(const char*))()); typedef void render_frame_t(EngineInstance* engine_state); typedef bool advance_simulation_t(EngineInstance* engine_state, uint32_t ticks); diff -r a6c5ce147530 -r 00b56ec8b7df qmlfrontend/game_view.cpp --- a/qmlfrontend/game_view.cpp Mon Nov 26 14:31:36 2018 +0100 +++ b/qmlfrontend/game_view.cpp Mon Nov 26 14:48:38 2018 +0100 @@ -45,13 +45,15 @@ cleanup(); m_engineInstance = engineInstance; - engineInstance->setOpenGLContext(window()->openglContext()); + emit engineInstanceChanged(m_engineInstance); } void GameView::sync() { - if (!m_renderer) { + if (!m_renderer && m_engineInstance) { + m_engineInstance->setOpenGLContext(window()->openglContext()); m_renderer.reset(new GameViewRenderer()); + m_renderer->setEngineInstance(m_engineInstance); connect(window(), &QQuickWindow::beforeRendering, m_renderer.data(), &GameViewRenderer::paint, Qt::DirectConnection); } @@ -68,7 +70,7 @@ // mousePos.y())) // QCursor::setPos(mapToGlobal(QPointF(m_centerX, m_centerY)).toPoint()); - m_renderer->tick(m_delta); + if (m_renderer) m_renderer->tick(m_delta); } GameViewRenderer::GameViewRenderer() diff -r a6c5ce147530 -r 00b56ec8b7df qmlfrontend/hwengine.cpp --- a/qmlfrontend/hwengine.cpp Mon Nov 26 14:31:36 2018 +0100 +++ b/qmlfrontend/hwengine.cpp Mon Nov 26 14:48:38 2018 +0100 @@ -32,6 +32,9 @@ qmlRegisterSingletonType("Hedgewars.Engine", 1, 0, "HWEngine", hwengine_singletontype_provider); qmlRegisterType("Hedgewars.Engine", 1, 0, "GameView"); + qmlRegisterUncreatableType("Hedgewars.Engine", 1, 0, + "EngineInstance", + "Create by HWEngine run methods"); } void HWEngine::getPreview() { @@ -61,7 +64,7 @@ // m_runQueue->queue(m_gameConfig); } -void HWEngine::runQuickGame() { +EngineInstance* HWEngine::runQuickGame() { m_gameConfig.cmdTheme("Nature"); Team team1; team1.name = "team1"; @@ -71,6 +74,8 @@ m_gameConfig.cmdTeam(team1); m_gameConfig.cmdTeam(team2); + EngineInstance* engine = new EngineInstance(this); + return engine; // m_runQueue->queue(m_gameConfig); } diff -r a6c5ce147530 -r 00b56ec8b7df qmlfrontend/hwengine.h --- a/qmlfrontend/hwengine.h Mon Nov 26 14:31:36 2018 +0100 +++ b/qmlfrontend/hwengine.h Mon Nov 26 14:48:38 2018 +0100 @@ -9,6 +9,7 @@ class QQmlEngine; class PreviewImageProvider; +class EngineInstance; class HWEngine : public QObject { Q_OBJECT @@ -23,7 +24,7 @@ static void exposeToQML(); Q_INVOKABLE void getPreview(); - Q_INVOKABLE void runQuickGame(); + Q_INVOKABLE EngineInstance* runQuickGame(); int previewHedgehogsCount() const;