campaign_map_view.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #pragma once
  2. #include <QHash>
  3. #include <QPointF>
  4. #include <QQuickFramebufferObject>
  5. #include <QString>
  6. #include <QVariantList>
  7. #include <QVariantMap>
  8. #include <QVector2D>
  9. #include <QVector4D>
  10. #include <vector>
  11. class CampaignMapView : public QQuickFramebufferObject {
  12. Q_OBJECT
  13. Q_PROPERTY(float orbit_yaw READ orbit_yaw WRITE set_orbit_yaw NOTIFY
  14. orbit_yaw_changed)
  15. Q_PROPERTY(float orbit_pitch READ orbit_pitch WRITE set_orbit_pitch NOTIFY
  16. orbit_pitch_changed)
  17. Q_PROPERTY(float orbit_distance READ orbit_distance WRITE set_orbit_distance
  18. NOTIFY orbit_distance_changed)
  19. Q_PROPERTY(float pan_u READ pan_u WRITE set_pan_u NOTIFY pan_u_changed)
  20. Q_PROPERTY(float pan_v READ pan_v WRITE set_pan_v NOTIFY pan_v_changed)
  21. Q_PROPERTY(QString hover_province_id READ hover_province_id WRITE
  22. set_hover_province_id NOTIFY hover_province_id_changed)
  23. Q_PROPERTY(QVariantList province_labels READ province_labels NOTIFY
  24. province_labels_changed)
  25. Q_PROPERTY(int current_mission READ current_mission WRITE set_current_mission
  26. NOTIFY current_mission_changed)
  27. Q_PROPERTY(float terrain_height_scale READ terrain_height_scale WRITE
  28. set_terrain_height_scale NOTIFY terrain_height_scale_changed)
  29. Q_PROPERTY(bool show_province_fills READ show_province_fills WRITE
  30. set_show_province_fills NOTIFY show_province_fills_changed)
  31. Q_PROPERTY(float min_orbit_distance READ min_orbit_distance CONSTANT)
  32. Q_PROPERTY(float max_orbit_distance READ max_orbit_distance CONSTANT)
  33. public:
  34. static constexpr float k_min_orbit_distance = 0.3F;
  35. static constexpr float k_max_orbit_distance = 5.0F;
  36. struct ProvinceVisual {
  37. QString owner;
  38. QVector4D color;
  39. bool has_color = false;
  40. };
  41. CampaignMapView();
  42. [[nodiscard]] auto createRenderer() const -> Renderer * override;
  43. Q_INVOKABLE QString province_at_screen(float x, float y);
  44. Q_INVOKABLE QVariantMap province_info_at_screen(float x, float y);
  45. Q_INVOKABLE QPointF screen_pos_for_uv(float u, float v);
  46. Q_INVOKABLE QVariantList province_labels();
  47. Q_INVOKABLE void apply_province_state(const QVariantList &states);
  48. Q_INVOKABLE QPointF hannibal_icon_position();
  49. [[nodiscard]] auto province_state_version() const -> int {
  50. return m_province_state_version;
  51. }
  52. [[nodiscard]] auto
  53. province_overrides() const -> const QHash<QString, ProvinceVisual> & {
  54. return m_province_overrides;
  55. }
  56. [[nodiscard]] auto orbit_yaw() const -> float { return m_orbit_yaw; }
  57. void set_orbit_yaw(float yaw);
  58. [[nodiscard]] auto orbit_pitch() const -> float { return m_orbit_pitch; }
  59. void set_orbit_pitch(float pitch);
  60. [[nodiscard]] auto orbit_distance() const -> float {
  61. return m_orbit_distance;
  62. }
  63. void set_orbit_distance(float distance);
  64. [[nodiscard]] auto min_orbit_distance() const -> float {
  65. return k_min_orbit_distance;
  66. }
  67. [[nodiscard]] auto max_orbit_distance() const -> float {
  68. return k_max_orbit_distance;
  69. }
  70. [[nodiscard]] auto pan_u() const -> float { return m_pan_u; }
  71. void set_pan_u(float pan);
  72. [[nodiscard]] auto pan_v() const -> float { return m_pan_v; }
  73. void set_pan_v(float pan);
  74. [[nodiscard]] auto hover_province_id() const -> QString {
  75. return m_hover_province_id;
  76. }
  77. void set_hover_province_id(const QString &province_id);
  78. [[nodiscard]] auto current_mission() const -> int {
  79. return m_current_mission;
  80. }
  81. void set_current_mission(int mission);
  82. [[nodiscard]] auto terrain_height_scale() const -> float {
  83. return m_terrain_height_scale;
  84. }
  85. void set_terrain_height_scale(float scale);
  86. [[nodiscard]] auto show_province_fills() const -> bool {
  87. return m_show_province_fills;
  88. }
  89. void set_show_province_fills(bool show);
  90. signals:
  91. void orbit_yaw_changed();
  92. void orbit_pitch_changed();
  93. void orbit_distance_changed();
  94. void pan_u_changed();
  95. void pan_v_changed();
  96. void hover_province_id_changed();
  97. void province_labels_changed();
  98. void current_mission_changed();
  99. void terrain_height_scale_changed();
  100. void show_province_fills_changed();
  101. private:
  102. float m_orbit_yaw = 185.0F;
  103. float m_orbit_pitch = 52.0F;
  104. float m_orbit_distance = 1.35F;
  105. float m_pan_u = 0.0F;
  106. float m_pan_v = 0.0F;
  107. QString m_hover_province_id;
  108. int m_current_mission = 7;
  109. float m_terrain_height_scale = 0.15F;
  110. bool m_show_province_fills = true;
  111. struct ProvinceHit {
  112. QString id;
  113. QString name;
  114. QString owner;
  115. std::vector<QVector2D> triangles;
  116. };
  117. bool m_provinces_loaded = false;
  118. std::vector<ProvinceHit> m_provinces;
  119. void load_provinces_for_hit_test();
  120. bool m_province_labels_loaded = false;
  121. QVariantList m_province_labels;
  122. void load_province_labels();
  123. bool m_hannibal_paths_loaded = false;
  124. std::vector<std::vector<QVector2D>> m_hannibal_paths;
  125. void load_hannibal_paths();
  126. QHash<QString, ProvinceVisual> m_province_overrides;
  127. int m_province_state_version = 0;
  128. friend class CampaignMapRenderer;
  129. };