#pragma once #include #include #include #include #include #include #include #include "FireEvent.h" #include "entt/entity/entity.hpp" #include "EntitySelectedEvent.h" #include "Tick.h" #include "TickDriver.h" #include "VisualsConfig.h" class ArenaSimulation; class QPainter; class ArenaView : public QOpenGLWidget { Q_OBJECT public: ArenaView(ArenaSimulation* sim, const VisualsConfig* visuals, QWidget* parent = nullptr); void setGameSpeed(double multiplier); double gameSpeed() const; void togglePause(); void stopRendering(); signals: void speedChanged(double multiplier); void finished(); protected: void paintGL() override; void mousePressEvent(QMouseEvent* event) override; private slots: void onFrame(); private: void drawTiles(QPainter& painter); void drawBuildings(QPainter& painter); void drawStations(QPainter& painter); void drawScrap(QPainter& painter); void drawShips(QPainter& painter); void drawBeams(QPainter& painter); float tilePx() const; QPointF worldToWidget(QVector2D worldPos) const; QPointF tileToWidget(QPoint tile) const; QRectF tileRect(QPoint tile) const; std::optional entityPosition(entt::entity entity) const; QVector2D widgetToWorld(QPoint widgetPt) const; struct ActiveBeam { FireEvent event; qint64 emittedWallMs; QVector2D targetOffset; }; static constexpr qint64 kBeamLifetimeMs = 300; ArenaSimulation* m_sim; const VisualsConfig* m_visuals; TickDriver m_tickDriver; QElapsedTimer m_frameTimer; qint64 m_wallMs; std::mt19937 m_rng; double m_gameSpeedMultiplier; double m_prevNonZeroSpeed; QTimer* m_renderTimer; std::vector m_activeBeams; bool m_finishedEmitted; std::optional m_selectedEntity; };