Files
dota_factory/src/balancing/ArenaView.h
2026-06-07 22:06:37 +02:00

89 lines
2.0 KiB
C++

#pragma once
#include <optional>
#include <random>
#include <vector>
#include <QElapsedTimer>
#include <QOpenGLWidget>
#include <QTimer>
#include <QVector2D>
#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<QVector2D> 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<ActiveBeam> m_activeBeams;
bool m_finishedEmitted;
std::optional<entt::entity> m_selectedEntity;
};