# HG changeset patch # User unC0Rr # Date 1716295110 -7200 # Node ID e8afb1bf2779e0a27f4f38ffd61585e37eb40bfe # Parent 4933920eba89775091402c32f46be0dae727dd53 Implement triggering advancement of simulation in qmlfrontend diff -r 4933920eba89 -r e8afb1bf2779 qmlfrontend/Page1.qml --- a/qmlfrontend/Page1.qml Mon May 20 14:58:30 2024 +0200 +++ b/qmlfrontend/Page1.qml Tue May 21 14:38:30 2024 +0200 @@ -83,7 +83,19 @@ tickButton { onClicked: { tickButton.visible = false; + } + } + + Timer { + id: advancingTimer + + interval: 100 + repeat: true + running: !tickButton.visible + + onTriggered: { gameView.tick(100); + gameView.update(); } } diff -r 4933920eba89 -r e8afb1bf2779 qmlfrontend/game_view.cpp --- a/qmlfrontend/game_view.cpp Mon May 20 14:58:30 2024 +0200 +++ b/qmlfrontend/game_view.cpp Tue May 21 14:38:30 2024 +0200 @@ -64,21 +64,16 @@ m_gameViewSize = currentSize; m_dirty = true; } + + m_gameView->executeActions(); } -GameView::GameView(QQuickItem* parent) - : QQuickFramebufferObject(parent), m_delta(0) { +GameView::GameView(QQuickItem* parent) : QQuickFramebufferObject(parent) { setMirrorVertically(true); } void GameView::tick(quint32 delta) { - m_delta = delta; - - if (window()) { - QTimer* timer = new QTimer(this); - connect(timer, &QTimer::timeout, this, &GameView::update); - timer->start(100); - } + addAction([delta](auto engine) { engine->advance(delta); }); } EngineInstance* GameView::engineInstance() const { return m_engineInstance; } @@ -87,6 +82,18 @@ return new GameViewRenderer{}; } +void GameView::executeActions() { + if (!m_engineInstance) { + return; + } + + for (const auto& action : m_actions) { + action(m_engineInstance); + } + + m_actions.clear(); +} + void GameView::setEngineInstance(EngineInstance* engineInstance) { if (m_engineInstance == engineInstance) { return; @@ -96,3 +103,7 @@ Q_EMIT engineInstanceChanged(m_engineInstance); } + +void GameView::addAction(std::function&& action) { + m_actions.append(std::move(action)); +} diff -r 4933920eba89 -r e8afb1bf2779 qmlfrontend/game_view.h --- a/qmlfrontend/game_view.h Mon May 20 14:58:30 2024 +0200 +++ b/qmlfrontend/game_view.h Tue May 21 14:38:30 2024 +0200 @@ -19,8 +19,8 @@ Q_INVOKABLE void tick(quint32 delta); EngineInstance* engineInstance() const; - Renderer* createRenderer() const override; + void executeActions(); Q_SIGNALS: void engineInstanceChanged(EngineInstance* engineInstance); @@ -29,10 +29,12 @@ void setEngineInstance(EngineInstance* engineInstance); private: - quint32 m_delta; QPointer m_engineInstance; QSize m_viewportSize; QPoint m_centerPoint; + QList> m_actions; + + void addAction(std::function&& action); }; #endif // GAMEVIEW_H diff -r 4933920eba89 -r e8afb1bf2779 rust/lib-hedgewars-engine/Cargo.toml --- a/rust/lib-hedgewars-engine/Cargo.toml Mon May 20 14:58:30 2024 +0200 +++ b/rust/lib-hedgewars-engine/Cargo.toml Tue May 21 14:38:30 2024 +0200 @@ -20,6 +20,7 @@ hwphysics = { path = "../hwphysics" } mapgen = { path = "../mapgen" } vec2d = { path = "../vec2d" } +log = "0.4.21" [dev-dependencies] proptest = "0.9.2" diff -r 4933920eba89 -r e8afb1bf2779 rust/lib-hedgewars-engine/src/instance.rs --- a/rust/lib-hedgewars-engine/src/instance.rs Mon May 20 14:58:30 2024 +0200 +++ b/rust/lib-hedgewars-engine/src/instance.rs Tue May 21 14:38:30 2024 +0200 @@ -35,6 +35,7 @@ } world.init(template()); + world.init_renderer(); Self { world, diff -r 4933920eba89 -r e8afb1bf2779 rust/lib-hedgewars-engine/src/lib.rs --- a/rust/lib-hedgewars-engine/src/lib.rs Mon May 20 14:58:30 2024 +0200 +++ b/rust/lib-hedgewars-engine/src/lib.rs Tue May 21 14:38:30 2024 +0200 @@ -154,6 +154,7 @@ gl::Viewport(0, 0, width as i32, height as i32); } engine_state.world.create_renderer(width, height); + engine_state.world.init_renderer(); } #[no_mangle] diff -r 4933920eba89 -r e8afb1bf2779 rust/lib-hedgewars-engine/src/world.rs --- a/rust/lib-hedgewars-engine/src/world.rs Mon May 20 14:58:30 2024 +0200 +++ b/rust/lib-hedgewars-engine/src/world.rs Tue May 21 14:38:30 2024 +0200 @@ -12,6 +12,7 @@ }; use lfprng::LaggedFibonacciPRNG; use std::path::{Path, PathBuf}; +use log::trace; use crate::render::{camera::Camera, GearEntry, GearRenderer, MapRenderer}; @@ -59,11 +60,15 @@ self.gear_renderer = Some(GearRenderer::new(&self.data_path.as_path())); self.camera = Camera::with_size(Size::new(width as usize, height as usize)); + if let Some(ref state) = self.game_state { + self.camera.position = state.land.play_box().center(); + } + } + + pub fn init_renderer(&mut self) { use mapgen::{theme::Theme, MapGenerator}; if let Some(ref state) = self.game_state { - self.camera.position = state.land.play_box().center(); - let theme = Theme::load(self.data_path.join(Path::new("Themes/Cheese/")).as_path()).unwrap(); let texture = MapGenerator::new().make_texture(&state.land, &theme);