# HG changeset patch # User alfadur # Date 1553287608 -10800 # Node ID e519802076e9e084381a53b6ba8dbdb38d5d3e02 # Parent 4df1aac5f090326417a54d0177a2142a95fa951b# Parent cc6ab1e3f7d5b0904d1a60d4ef1e521461c337e1 merge diff -r 4df1aac5f090 -r e519802076e9 qmlfrontend/engine_instance.cpp --- a/qmlfrontend/engine_instance.cpp Fri Mar 22 23:45:59 2019 +0300 +++ b/qmlfrontend/engine_instance.cpp Fri Mar 22 23:46:48 2019 +0300 @@ -41,11 +41,13 @@ reinterpret_cast(hwlib.resolve("render_frame")); advance_simulation = reinterpret_cast( hwlib.resolve("advance_simulation")); + move_camera = + reinterpret_cast(hwlib.resolve("move_camera")); m_isValid = hedgewars_engine_protocol_version && start_engine && generate_preview && dispose_preview && cleanup && send_ipc && read_ipc && setup_current_gl_context && render_frame && - advance_simulation; + advance_simulation && move_camera; emit isValidChanged(m_isValid); if (isValid()) { @@ -53,6 +55,8 @@ << hedgewars_engine_protocol_version(); m_instance = start_engine(); + } else { + qDebug("Engine library load failed"); } } @@ -71,6 +75,10 @@ advance_simulation(m_instance, ticks); } +void EngineInstance::moveCamera(const QPoint& delta) { + move_camera(m_instance, delta.x(), delta.y()); +} + void EngineInstance::renderFrame() { render_frame(m_instance); } void EngineInstance::setOpenGLContext(QOpenGLContext* context) { diff -r 4df1aac5f090 -r e519802076e9 qmlfrontend/engine_instance.h --- a/qmlfrontend/engine_instance.h Fri Mar 22 23:45:59 2019 +0300 +++ b/qmlfrontend/engine_instance.h Fri Mar 22 23:46:48 2019 +0300 @@ -19,6 +19,7 @@ void sendConfig(const GameConfig& config); void advance(quint32 ticks); + void moveCamera(const QPoint& delta); void renderFrame(); void setOpenGLContext(QOpenGLContext* context); QImage generatePreview(); @@ -44,6 +45,7 @@ Engine::setup_current_gl_context_t* setup_current_gl_context; Engine::render_frame_t* render_frame; Engine::advance_simulation_t* advance_simulation; + Engine::move_camera_t* move_camera; bool m_isValid; }; diff -r 4df1aac5f090 -r e519802076e9 qmlfrontend/engine_interface.h --- a/qmlfrontend/engine_interface.h Fri Mar 22 23:45:59 2019 +0300 +++ b/qmlfrontend/engine_interface.h Fri Mar 22 23:46:48 2019 +0300 @@ -37,6 +37,9 @@ typedef bool advance_simulation_t(EngineInstance* engine_state, uint32_t ticks); +typedef void move_camera_t(EngineInstance* engine_state, int32_t delta_x, + int32_t delta_y); + #ifdef __cplusplus } }; diff -r 4df1aac5f090 -r e519802076e9 qmlfrontend/game_view.cpp --- a/qmlfrontend/game_view.cpp Fri Mar 22 23:45:59 2019 +0300 +++ b/qmlfrontend/game_view.cpp Fri Mar 22 23:46:48 2019 +0300 @@ -58,17 +58,21 @@ &GameViewRenderer::paint, Qt::DirectConnection); } - if (m_windowChanged) { - QSize windowSize = window()->size(); - m_renderer->setViewportSize(windowSize * window()->devicePixelRatio()); - m_centerX = windowSize.width() / 2; - m_centerY = windowSize.height() / 2; + if (m_windowChanged || (m_viewportSize != window()->size())) { + m_windowChanged = false; + + if (m_engineInstance) + m_engineInstance->setOpenGLContext(window()->openglContext()); + + m_viewportSize = window()->size(); + m_centerPoint = QPoint(m_viewportSize.width(), m_viewportSize.height()) / 2; } - // QPoint mousePos = mapFromGlobal(QCursor::pos()).toPoint(); - // if (flibUpdateMousePosition(m_centerX, m_centerY, mousePos.x(), - // mousePos.y())) - // QCursor::setPos(mapToGlobal(QPointF(m_centerX, m_centerY)).toPoint()); + if (m_engineInstance) { + QPoint mousePos = mapFromGlobal(QCursor::pos()).toPoint(); + m_engineInstance->moveCamera(mousePos - m_centerPoint); + QCursor::setPos(mapToGlobal(m_centerPoint).toPoint()); + } if (m_renderer) m_renderer->tick(m_delta); } @@ -80,10 +84,6 @@ void GameViewRenderer::tick(quint32 delta) { m_delta = delta; } -void GameViewRenderer::setViewportSize(const QSize& size) { - // flibResizeWindow(size.width(), size.height()); -} - void GameViewRenderer::setEngineInstance(EngineInstance* engineInstance) { m_engineInstance = engineInstance; } @@ -98,3 +98,8 @@ // m_window->resetOpenGLState(); } + +void GameViewRenderer::onViewportSizeChanged(QQuickWindow* window) { + if (m_engineInstance) + m_engineInstance->setOpenGLContext(window->openglContext()); +} diff -r 4df1aac5f090 -r e519802076e9 qmlfrontend/game_view.h --- a/qmlfrontend/game_view.h Fri Mar 22 23:45:59 2019 +0300 +++ b/qmlfrontend/game_view.h Fri Mar 22 23:46:48 2019 +0300 @@ -13,15 +13,15 @@ class GameViewRenderer : public QObject, protected QOpenGLFunctions { Q_OBJECT public: - GameViewRenderer(); - ~GameViewRenderer(); + explicit GameViewRenderer(); + ~GameViewRenderer() override; void tick(quint32 delta); - void setViewportSize(const QSize& size); void setEngineInstance(EngineInstance* engineInstance); public slots: void paint(); + void onViewportSizeChanged(QQuickWindow* window); private: quint32 m_delta; @@ -35,7 +35,7 @@ setEngineInstance NOTIFY engineInstanceChanged) public: - GameView(); + explicit GameView(); Q_INVOKABLE void tick(quint32 delta); @@ -56,9 +56,9 @@ quint32 m_delta; QScopedPointer m_renderer; bool m_windowChanged; - qint32 m_centerX; - qint32 m_centerY; QPointer m_engineInstance; + QSize m_viewportSize; + QPoint m_centerPoint; }; #endif // GAMEVIEW_H diff -r 4df1aac5f090 -r e519802076e9 rust/lib-hedgewars-engine/src/lib.rs --- a/rust/lib-hedgewars-engine/src/lib.rs Fri Mar 22 23:45:59 2019 +0300 +++ b/rust/lib-hedgewars-engine/src/lib.rs Fri Mar 22 23:46:48 2019 +0300 @@ -10,6 +10,8 @@ os::raw::{c_char, c_void}, }; +use integral_geometry::Point; + use self::instance::EngineInstance; #[repr(C)] @@ -101,6 +103,14 @@ engine_state.world.step(); true } + +#[no_mangle] +pub extern "C" fn move_camera(engine_state: &mut EngineInstance, delta_x: i32, delta_y: i32) { + engine_state + .world + .move_camera(Point::new(delta_x, delta_y), 0.0); +} + #[no_mangle] pub extern "C" fn cleanup(engine_state: *mut EngineInstance) { unsafe { diff -r 4df1aac5f090 -r e519802076e9 rust/lib-hedgewars-engine/src/world.rs