# HG changeset patch # User unc0rr # Date 1514933118 -3600 # Node ID b544bbbd0696c336e6ac91da5955964a2c2da958 # Parent fe16fa088b69cf3a52e32adefd20094c7c85a4a6 Break engine completely and make it render in frontend window (no actual rendering yet, just white screen) diff -r fe16fa088b69 -r b544bbbd0696 hedgewars/hwLibrary.pas --- a/hedgewars/hwLibrary.pas Wed Dec 27 00:59:26 2017 +0100 +++ b/hedgewars/hwLibrary.pas Tue Jan 02 23:45:18 2018 +0100 @@ -62,7 +62,8 @@ ipcToEngineRaw, ipcSetEngineBarrier, ipcRemoveBarrierFromEngineQueue, - RunEngine + RunEngine, + GameTick ; begin diff -r fe16fa088b69 -r b544bbbd0696 hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Wed Dec 27 00:59:26 2017 +0100 +++ b/hedgewars/hwengine.pas Tue Jan 02 23:45:18 2018 +0100 @@ -36,6 +36,8 @@ ; function RunEngine(argc: LongInt; argv: PPChar): Longint; cdecl; export; +function GameTick(delta: Longword): boolean; cdecl; export; + procedure preInitEverything(); procedure initEverything(complete:boolean); procedure freeEverything(complete:boolean); @@ -361,7 +363,7 @@ if not allOK then exit; //SDL_StartTextInput(); - SDL_ShowCursor(0); + //SDL_ShowCursor(0); {$IFDEF USE_VIDEO_RECORDING} @@ -439,7 +441,7 @@ end; {$ENDIF} - MainLoop; + //MainLoop; end; procedure Game; @@ -589,6 +591,8 @@ EngineThread:= 0 end; +type TRunState = (rsVoid, rsInit, rsRun); +var runState: TRunState; function RunEngine(argc: LongInt; argv: PPChar): Longint; cdecl; export; var t: PSDL_Thread; @@ -596,6 +600,8 @@ operatingsystem_parameter_argc:= argc; operatingsystem_parameter_argv:= argv; + runState:= rsInit; + {$IFDEF WIN32} ShcoreLibHandle := LoadLibrary('Shcore.dll'); if (ShcoreLibHandle <> 0) then @@ -618,10 +624,34 @@ RunEngine:= HaltUsageError else begin - t:= SDL_CreateThread(@EngineThread, 'engine', nil); - SDL_DetachThread(t); + //t:= SDL_CreateThread(@EngineThread, 'engine', nil); + //SDL_DetachThread(t); RunEngine:= 0 end end; +function GameTick(delta: Longword): boolean; cdecl; export; +begin + GameTick:= true; + case runState of + rsInit: begin + system.writeln('[[]] rsInit'); + initEverything(true); + SendIPC('TG'); + GameRoutine; + runState:= rsRun; + end; + rsRun: begin + system.writeln('[[]] rsRun'); + if DoTimer(delta) then begin + system.writeln('[[]] Cleaning up'); + // clean up all the memory allocated + freeEverything(true); + runState:= rsVoid; + GameTick:= false + end; + end; + end; +end; + end. diff -r fe16fa088b69 -r b544bbbd0696 hedgewars/uDebug.pas --- a/hedgewars/uDebug.pas Wed Dec 27 00:59:26 2017 +0100 +++ b/hedgewars/uDebug.pas Tue Jan 02 23:45:18 2018 +0100 @@ -31,7 +31,7 @@ allOK: boolean; implementation -uses SDLh, uConsole, uCommands, uConsts; +uses SDLh, uConsole, uCommands, uConsts, sysutils; procedure OutError(Msg: shortstring; isFatalError: boolean); begin @@ -52,6 +52,7 @@ OutError(Msg, false); allOK:= allOK and (Assert or (not isFatal)); + if not allOk then raise Exception.create(msg); checkFails:= (not Assert) and isFatal end; @@ -65,6 +66,7 @@ end; allOK:= allOK and (Assert or (not isFatal)); + if not allOk then raise Exception.create(msg); SDLCheck:= (not Assert) and isFatal end; diff -r fe16fa088b69 -r b544bbbd0696 hedgewars/uStore.pas --- a/hedgewars/uStore.pas Wed Dec 27 00:59:26 2017 +0100 +++ b/hedgewars/uStore.pas Tue Jan 02 23:45:18 2018 +0100 @@ -779,10 +779,10 @@ // un-comment below and add proper logic to support opengles2.0 //SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); //SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); - if SDLGLcontext = nil then + {if SDLGLcontext = nil then SDLGLcontext:= SDL_GL_CreateContext(SDLwindow); if SDLCheck(SDLGLcontext <> nil, 'SDLGLcontext', true) then exit; - SDL_GL_SetSwapInterval(1); + SDL_GL_SetSwapInterval(1);} RendererSetup(); @@ -793,8 +793,8 @@ procedure AddProgress; var r: TSDL_Rect; texsurf: PSDL_Surface; -begin - if cOnlyStats then exit; +begin + if cOnlyStats then exit; (* if Step = 0 then begin WriteToConsole(msgLoading + 'progress sprite: '); @@ -832,11 +832,11 @@ SwapBuffers; - inc(Step); + inc(Step); *) end; procedure FinishProgress; -begin +begin (* {$IFNDEF PAS2C} with mobileRecord do if GameLoaded <> nil then @@ -845,7 +845,7 @@ WriteLnToConsole('Freeing progress textures... '); FreeAndNilTexture(ProgrTex); FreeAndNilTexture(LoadingText); - Step:= 0 + Step:= 0 *) end; function RenderHelpWindow(caption, subcaption, description, extra: ansistring; extracolor: LongInt; iconsurf: PSDL_Surface; iconrect: PSDL_Rect): PTexture; @@ -1084,7 +1084,7 @@ cScreenWidth:= cWindowedWidth; cScreenHeight:= cWindowedHeight; end; - +{ AddFileLog('Preparing to change video parameters...'); if SDLwindow = nil then begin @@ -1180,7 +1180,7 @@ SDL_SetWindowIcon(SDLwindow, ico); SDL_FreeSurface(ico); end; - {$ENDIF} + {$ENDIF}} SetupOpenGL(); if reinit then diff -r fe16fa088b69 -r b544bbbd0696 qmlfrontend/CMakeLists.txt --- a/qmlfrontend/CMakeLists.txt Wed Dec 27 00:59:26 2017 +0100 +++ b/qmlfrontend/CMakeLists.txt Tue Jan 02 23:45:18 2018 +0100 @@ -12,6 +12,7 @@ "hwengine.cpp" "hwengine.h" "gameconfig.cpp" "gameconfig.h" "runqueue.cpp" "runqueue.h" + "gameview.cpp" "gameview.h" "team.cpp" "team.h" "previewimageprovider.cpp" "previewimageprovider.h" "flib.h") diff -r fe16fa088b69 -r b544bbbd0696 qmlfrontend/Page1.qml --- a/qmlfrontend/Page1.qml Wed Dec 27 00:59:26 2017 +0100 +++ b/qmlfrontend/Page1.qml Tue Jan 02 23:45:18 2018 +0100 @@ -2,9 +2,12 @@ import Hedgewars.Engine 1.0 Page1Form { + tickButton.onClicked: { + item1.tick(100); +} gameButton.onClicked: { HWEngine.runQuickGame() -} + } button1.onClicked: { HWEngine.getPreview() } @@ -15,11 +18,9 @@ previewImage.source = "image://preview/image" } onPreviewIsRendering: { - console.log("==========") previewImage.source = "qrc:/res/iconTime.png" } onPreviewHogCountChanged: { } } - } diff -r fe16fa088b69 -r b544bbbd0696 qmlfrontend/Page1Form.ui.qml --- a/qmlfrontend/Page1Form.ui.qml Wed Dec 27 00:59:26 2017 +0100 +++ b/qmlfrontend/Page1Form.ui.qml Tue Jan 02 23:45:18 2018 +0100 @@ -2,10 +2,16 @@ import QtQuick.Controls 2.0 import QtQuick.Layouts 1.3 +import Hedgewars.Engine 1.0 + Item { - property alias button1: button1 - property alias previewImage: previewImage - property alias gameButton: gameButton + property alias button1: button1 + property alias previewImage: previewImage + property alias gameButton: gameButton + width: 1024 + height: 800 + property alias tickButton: tickButton + property alias item1: item1 RowLayout { anchors.horizontalCenter: parent.horizontalCenter @@ -13,23 +19,36 @@ anchors.top: parent.top Button { - id: button1 - text: qsTr("Preview") + id: button1 + text: qsTr("Preview") } Button { id: gameButton text: qsTr("Game") } + + Button { + id: tickButton + text: qsTr("Tick") + } } Image { id: previewImage - x: 188 - y: 176 + x: 8 + y: 20 width: 256 height: 128 source: "qrc:/res/iconTime.png" cache: false } + + GameView { + id: item1 + x: 8 + y: 154 + width: 1008 + height: 638 + } } diff -r fe16fa088b69 -r b544bbbd0696 qmlfrontend/flib.h --- a/qmlfrontend/flib.h Wed Dec 27 00:59:26 2017 +0100 +++ b/qmlfrontend/flib.h Tue Jan 02 23:45:18 2018 +0100 @@ -25,6 +25,7 @@ } string255; typedef void RunEngine_t(int argc, const char** argv); +typedef void GameTick_t(uint32_t time_delta); typedef void ipcToEngineRaw_t(const char* msg, uint32_t len); typedef void ipcSetEngineBarrier_t(); typedef void ipcRemoveBarrierFromEngineQueue_t(); diff -r fe16fa088b69 -r b544bbbd0696 qmlfrontend/gameview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/gameview.cpp Tue Jan 02 23:45:18 2018 +0100 @@ -0,0 +1,68 @@ +#include "gameview.h" + +#include +#include +#include + +#include "flib.h" + +extern "C" { +extern GameTick_t* flibGameTick; +} + +GameView::GameView() + : m_delta(0) + , m_renderer(0) +{ + connect(this, &QQuickItem::windowChanged, this, &GameView::handleWindowChanged); +} + +void GameView::tick(quint32 delta) +{ + m_delta = delta; + if (window()) + window()->update(); +} + +void GameView::handleWindowChanged(QQuickWindow* win) +{ + if (win) { + connect(win, &QQuickWindow::beforeSynchronizing, this, &GameView::sync, Qt::DirectConnection); + connect(win, &QQuickWindow::sceneGraphInvalidated, this, &GameView::cleanup, Qt::DirectConnection); + + win->setClearBeforeRendering(false); + } +} + +void GameView::cleanup() +{ + if (m_renderer) { + delete m_renderer; + m_renderer = 0; + } +} + +GameViewRenderer::~GameViewRenderer() +{ +} + +void GameView::sync() +{ + if (!m_renderer) { + m_renderer = new GameViewRenderer(); + connect(window(), &QQuickWindow::beforeRendering, m_renderer, &GameViewRenderer::paint, Qt::DirectConnection); + } + m_renderer->setViewportSize(window()->size() * window()->devicePixelRatio()); + m_renderer->tick(m_delta); + m_renderer->setWindow(window()); +} + +void GameViewRenderer::paint() +{ + if (m_delta == 0) + return; + + flibGameTick(m_delta); + + m_window->resetOpenGLState(); +} diff -r fe16fa088b69 -r b544bbbd0696 qmlfrontend/gameview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmlfrontend/gameview.h Tue Jan 02 23:45:18 2018 +0100 @@ -0,0 +1,54 @@ +#ifndef GAMEVIEW_H +#define GAMEVIEW_H + +#include + +#include +#include + +class GameViewRenderer : public QObject, protected QOpenGLFunctions { + Q_OBJECT +public: + GameViewRenderer() + : m_delta(0) + { + } + ~GameViewRenderer(); + + void tick(quint32 delta) { m_delta = delta; } + void setViewportSize(const QSize& size) { m_viewportSize = size; } + void setWindow(QQuickWindow* window) { m_window = window; } + +public slots: + void paint(); + +private: + QSize m_viewportSize; + quint32 m_delta; + QQuickWindow* m_window; +}; + +class GameView : public QQuickItem { + Q_OBJECT + +public: + GameView(); + + Q_INVOKABLE void tick(quint32 delta); + +signals: + void tChanged(); + +public slots: + void sync(); + void cleanup(); + +private slots: + void handleWindowChanged(QQuickWindow* win); + +private: + quint32 m_delta; + GameViewRenderer* m_renderer; +}; + +#endif // GAMEVIEW_H diff -r fe16fa088b69 -r b544bbbd0696 qmlfrontend/hwengine.cpp --- a/qmlfrontend/hwengine.cpp Wed Dec 27 00:59:26 2017 +0100 +++ b/qmlfrontend/hwengine.cpp Tue Jan 02 23:45:18 2018 +0100 @@ -5,11 +5,13 @@ #include #include +#include "gameview.h" #include "previewimageprovider.h" #include "runqueue.h" extern "C" { RunEngine_t* flibRunEngine; +GameTick_t* flibGameTick; ipcToEngineRaw_t* flibIpcToEngineRaw; ipcSetEngineBarrier_t* flibIpcSetEngineBarrier; ipcRemoveBarrierFromEngineQueue_t* flibIpcRemoveBarrierFromEngineQueue; @@ -37,6 +39,7 @@ qWarning() << "Engine library not found" << hwlib.errorString(); flibRunEngine = (RunEngine_t*)hwlib.resolve("RunEngine"); + flibGameTick = (GameTick_t*)hwlib.resolve("GameTick"); flibIpcToEngineRaw = (ipcToEngineRaw_t*)hwlib.resolve("ipcToEngineRaw"); flibIpcSetEngineBarrier = (ipcSetEngineBarrier_t*)hwlib.resolve("ipcSetEngineBarrier"); flibIpcRemoveBarrierFromEngineQueue = (ipcRemoveBarrierFromEngineQueue_t*)hwlib.resolve("ipcRemoveBarrierFromEngineQueue"); @@ -70,6 +73,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) @@ -110,7 +114,8 @@ void HWEngine::getPreview() { - m_gameConfig.cmdSeed(QUuid::createUuid().toByteArray()); + m_seed = QUuid::createUuid().toByteArray(); + m_gameConfig.cmdSeed(m_seed); m_gameConfig.setPreview(true); m_runQueue->queue(m_gameConfig); @@ -118,7 +123,8 @@ void HWEngine::runQuickGame() { - m_gameConfig.cmdTheme("Bamboo"); + m_gameConfig.cmdSeed(m_seed); + m_gameConfig.cmdTheme("Nature"); Team team1; team1.name = "team1"; Team team2; diff -r fe16fa088b69 -r b544bbbd0696 qmlfrontend/hwengine.h --- a/qmlfrontend/hwengine.h Wed Dec 27 00:59:26 2017 +0100 +++ b/qmlfrontend/hwengine.h Tue Jan 02 23:45:18 2018 +0100 @@ -36,6 +36,7 @@ PreviewImageProvider* m_previewProvider; RunQueue* m_runQueue; GameConfig m_gameConfig; + QByteArray m_seed; static void guiMessagesCallback(void* context, MessageType mt, const char* msg, uint32_t len);